diff --git a/extensions/typescript/src/utils/logDirectoryProvider.ts b/extensions/typescript/src/utils/logDirectoryProvider.ts index 30633031ec8..fba55ea03e1 100644 --- a/extensions/typescript/src/utils/logDirectoryProvider.ts +++ b/extensions/typescript/src/utils/logDirectoryProvider.ts @@ -6,6 +6,7 @@ import * as fs from 'fs'; import * as path from 'path'; import * as vscode from 'vscode'; +import { memoize } from './memoize'; export default class LogDirectoryProvider { public constructor( @@ -13,10 +14,26 @@ export default class LogDirectoryProvider { ) { } public async getNewLogDirectory(): Promise { - const root = await this.context.logger.logDirectory; + const root = this.logDirectory(); + if (root) { + try { + return fs.mkdtempSync(path.join(root, `tsserver-log-`)); + } catch (e) { + return undefined; + } + } + return undefined; + } + + @memoize + private logDirectory(): string | undefined { try { - return fs.mkdtempSync(path.join(root, `tsserver-log-`)); - } catch (e) { + const path = this.context.logDirectory; + if (!fs.existsSync(path)) { + fs.mkdirSync(path); + } + return this.context.logDirectory; + } catch { return undefined; } } diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 2078ed985d2..52bda5f91bc 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -408,7 +408,6 @@ declare module 'vscode' { export interface Logger { readonly onDidChangeLogLevel: Event; readonly currentLevel: LogLevel; - readonly logDirectory: Thenable; trace(message: string, ...args: any[]): void; debug(message: string, ...args: any[]): void; @@ -423,6 +422,13 @@ declare module 'vscode' { * This extension's logger */ logger: Logger; + + /** + * Path where an extension can write log files. + * + * Extensions must create this directory before writing to it. The parent directory will always exist. + */ + readonly logDirectory: string; } //#endregion diff --git a/src/vs/workbench/api/node/extHostExtensionActivator.ts b/src/vs/workbench/api/node/extHostExtensionActivator.ts index f29e5e81400..e1979889222 100644 --- a/src/vs/workbench/api/node/extHostExtensionActivator.ts +++ b/src/vs/workbench/api/node/extHostExtensionActivator.ts @@ -28,6 +28,7 @@ export interface IExtensionContext { storagePath: string; asAbsolutePath(relativePath: string): string; logger: ExtHostLogger; + readonly logDirectory: string; } /** diff --git a/src/vs/workbench/api/node/extHostExtensionService.ts b/src/vs/workbench/api/node/extHostExtensionService.ts index 403da7c59a0..f1645816414 100644 --- a/src/vs/workbench/api/node/extHostExtensionService.ts +++ b/src/vs/workbench/api/node/extHostExtensionService.ts @@ -356,6 +356,10 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { get logger() { checkProposedApiEnabled(extensionDescription); return that._extHostLogService.getExtLogger(extensionDescription.id); + }, + get logDirectory() { + checkProposedApiEnabled(extensionDescription); + return that._extHostLogService.getLogDirectory(extensionDescription.id); } }); }); diff --git a/src/vs/workbench/api/node/extHostLogService.ts b/src/vs/workbench/api/node/extHostLogService.ts index 0873a3bc0cf..00d9832ba86 100644 --- a/src/vs/workbench/api/node/extHostLogService.ts +++ b/src/vs/workbench/api/node/extHostLogService.ts @@ -5,15 +5,12 @@ 'use strict'; import * as vscode from 'vscode'; -import { TPromise } from 'vs/base/common/winjs.base'; import { join } from 'vs/base/common/paths'; -import { mkdirp, dirExists } from 'vs/base/node/pfs'; import { Event } from 'vs/base/common/event'; import { LogLevel } from 'vs/workbench/api/node/extHostTypes'; import { ILogService, DelegatedLogService } from 'vs/platform/log/common/log'; import { createSpdLogService } from 'vs/platform/log/node/spdlogService'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { memoize } from 'vs/base/common/decorators'; import { ExtHostLogServiceShape } from 'vs/workbench/api/node/extHost.protocol'; @@ -42,21 +39,23 @@ export class ExtHostLogService extends DelegatedLogService implements ILogServic return logger; } + getLogDirectory(extensionID: string): string { + return join(this._environmentService.logsPath, `${extensionID}_${this._windowId}`); + } + private createLogger(extensionID: string): ExtHostLogger { - const logsDirPath = join(this._environmentService.logsPath, `${extensionID}_${this._windowId}`); + const logsDirPath = this.getLogDirectory(extensionID); const logService = createSpdLogService(extensionID, this.getLevel(), logsDirPath); this._register(this.onDidChangeLogLevel(level => logService.setLevel(level))); - return new ExtHostLogger(logService, logsDirPath); + return new ExtHostLogger(logService); } } export class ExtHostLogger implements vscode.Logger { constructor( - private readonly _logService: ILogService, - private readonly _logDirectory: string - ) { - } + private readonly _logService: ILogService + ) { } get onDidChangeLogLevel(): Event { return this._logService.onDidChangeLogLevel; @@ -64,19 +63,6 @@ export class ExtHostLogger implements vscode.Logger { get currentLevel(): LogLevel { return this._logService.getLevel(); } - @memoize - get logDirectory(): TPromise { - return dirExists(this._logDirectory).then(exists => { - if (exists) { - return TPromise.wrap(null); - } else { - return mkdirp(this._logDirectory); - } - }).then(() => { - return this._logDirectory; - }); - } - trace(message: string, ...args: any[]): void { return this._logService.trace(message, ...args); }