diff --git a/src/common/lspLanguageFeatures.ts b/src/common/lspLanguageFeatures.ts index 00869daa..db9a7425 100644 --- a/src/common/lspLanguageFeatures.ts +++ b/src/common/lspLanguageFeatures.ts @@ -153,7 +153,7 @@ function toDiagnostics(resource: Uri, diag: lsTypes.Diagnostic): editor.IMarkerD //#region CompletionAdapter export interface ILanguageWorkerWithCompletions { - doComplete(uri: string, position: lsTypes.Position): Promise; + doComplete(uri: string, position: lsTypes.Position): Promise; } export class CompletionAdapter @@ -481,7 +481,7 @@ export class DocumentHighlightAdapter { + ): Promise { const resource = model.uri; return this._worker(resource) @@ -501,7 +501,7 @@ export class DocumentHighlightAdapter; + findDefinition(uri: string, position: lsTypes.Position): Promise; } export class DefinitionAdapter @@ -531,7 +531,7 @@ export class DefinitionAdapter model: editor.IReadOnlyModel, position: Position, token: CancellationToken - ): Promise { + ): Promise { const resource = model.uri; return this._worker(resource) @@ -572,7 +572,7 @@ export class ReferenceAdapter position: Position, context: languages.ReferenceContext, token: CancellationToken - ): Promise { + ): Promise { const resource = model.uri; return this._worker(resource) @@ -597,7 +597,7 @@ export interface ILanguageWorkerWithRename { uri: string, position: lsTypes.Position, newName: string - ): Promise; + ): Promise; } export class RenameAdapter @@ -610,7 +610,7 @@ export class RenameAdapter position: Position, newName: string, token: CancellationToken - ): Promise { + ): Promise { const resource = model.uri; return this._worker(resource) @@ -623,7 +623,7 @@ export class RenameAdapter } } -function toWorkspaceEdit(edit: lsTypes.WorkspaceEdit): languages.WorkspaceEdit { +function toWorkspaceEdit(edit: lsTypes.WorkspaceEdit | null): languages.WorkspaceEdit | undefined { if (!edit || !edit.changes) { return void 0; } @@ -743,7 +743,7 @@ export class DocumentLinkAdapter public provideLinks( model: editor.IReadOnlyModel, token: CancellationToken - ): Promise { + ): Promise { const resource = model.uri; return this._worker(resource) diff --git a/src/css/cssMode.ts b/src/css/cssMode.ts index 5d15f9d9..c77ae543 100644 --- a/src/css/cssMode.ts +++ b/src/css/cssMode.ts @@ -121,6 +121,6 @@ function asDisposable(disposables: IDisposable[]): IDisposable { function disposeAll(disposables: IDisposable[]) { while (disposables.length) { - disposables.pop().dispose(); + disposables.pop()!.dispose(); } } diff --git a/src/css/cssWorker.ts b/src/css/cssWorker.ts index cd8c02cc..ac50ba76 100644 --- a/src/css/cssWorker.ts +++ b/src/css/cssWorker.ts @@ -61,26 +61,44 @@ export class CSSWorker { } return Promise.resolve([]); } - async doComplete(uri: string, position: cssService.Position): Promise { + async doComplete( + uri: string, + position: cssService.Position + ): Promise { let document = this._getTextDocument(uri); + if (!document) { + return null; + } let stylesheet = this._languageService.parseStylesheet(document); let completions = this._languageService.doComplete(document, position, stylesheet); return Promise.resolve(completions); } - async doHover(uri: string, position: cssService.Position): Promise { + async doHover(uri: string, position: cssService.Position): Promise { let document = this._getTextDocument(uri); + if (!document) { + return null; + } let stylesheet = this._languageService.parseStylesheet(document); let hover = this._languageService.doHover(document, position, stylesheet); return Promise.resolve(hover); } - async findDefinition(uri: string, position: cssService.Position): Promise { + async findDefinition( + uri: string, + position: cssService.Position + ): Promise { let document = this._getTextDocument(uri); + if (!document) { + return null; + } let stylesheet = this._languageService.parseStylesheet(document); let definition = this._languageService.findDefinition(document, position, stylesheet); return Promise.resolve(definition); } async findReferences(uri: string, position: cssService.Position): Promise { let document = this._getTextDocument(uri); + if (!document) { + return []; + } let stylesheet = this._languageService.parseStylesheet(document); let references = this._languageService.findReferences(document, position, stylesheet); return Promise.resolve(references); @@ -90,12 +108,18 @@ export class CSSWorker { position: cssService.Position ): Promise { let document = this._getTextDocument(uri); + if (!document) { + return []; + } let stylesheet = this._languageService.parseStylesheet(document); let highlights = this._languageService.findDocumentHighlights(document, position, stylesheet); return Promise.resolve(highlights); } async findDocumentSymbols(uri: string): Promise { let document = this._getTextDocument(uri); + if (!document) { + return []; + } let stylesheet = this._languageService.parseStylesheet(document); let symbols = this._languageService.findDocumentSymbols(document, stylesheet); return Promise.resolve(symbols); @@ -106,12 +130,18 @@ export class CSSWorker { context: cssService.CodeActionContext ): Promise { let document = this._getTextDocument(uri); + if (!document) { + return []; + } let stylesheet = this._languageService.parseStylesheet(document); let actions = this._languageService.doCodeActions(document, range, context, stylesheet); return Promise.resolve(actions); } async findDocumentColors(uri: string): Promise { let document = this._getTextDocument(uri); + if (!document) { + return []; + } let stylesheet = this._languageService.parseStylesheet(document); let colorSymbols = this._languageService.findDocumentColors(document, stylesheet); return Promise.resolve(colorSymbols); @@ -122,6 +152,9 @@ export class CSSWorker { range: cssService.Range ): Promise { let document = this._getTextDocument(uri); + if (!document) { + return []; + } let stylesheet = this._languageService.parseStylesheet(document); let colorPresentations = this._languageService.getColorPresentations( document, @@ -136,6 +169,9 @@ export class CSSWorker { context?: { rangeLimit?: number } ): Promise { let document = this._getTextDocument(uri); + if (!document) { + return []; + } let ranges = this._languageService.getFoldingRanges(document, context); return Promise.resolve(ranges); } @@ -144,6 +180,9 @@ export class CSSWorker { positions: cssService.Position[] ): Promise { let document = this._getTextDocument(uri); + if (!document) { + return []; + } let stylesheet = this._languageService.parseStylesheet(document); let ranges = this._languageService.getSelectionRanges(document, positions, stylesheet); return Promise.resolve(ranges); @@ -152,13 +191,16 @@ export class CSSWorker { uri: string, position: cssService.Position, newName: string - ): Promise { + ): Promise { let document = this._getTextDocument(uri); + if (!document) { + return null; + } let stylesheet = this._languageService.parseStylesheet(document); let renames = this._languageService.doRename(document, position, newName, stylesheet); return Promise.resolve(renames); } - private _getTextDocument(uri: string): cssService.TextDocument { + private _getTextDocument(uri: string): cssService.TextDocument | null { let models = this._ctx.getMirrorModels(); for (let model of models) { if (model.uri.toString() === uri) { diff --git a/src/css/monaco.contribution.ts b/src/css/monaco.contribution.ts index 82fb127d..5b01210a 100644 --- a/src/css/monaco.contribution.ts +++ b/src/css/monaco.contribution.ts @@ -113,8 +113,8 @@ export type DiagnosticsOptions = Options; class LanguageServiceDefaultsImpl implements LanguageServiceDefaults { private _onDidChange = new Emitter(); - private _options: Options; - private _modeConfiguration: ModeConfiguration; + private _options!: Options; + private _modeConfiguration!: ModeConfiguration; private _languageId: string; constructor(languageId: string, options: Options, modeConfiguration: ModeConfiguration) { diff --git a/src/css/workerManager.ts b/src/css/workerManager.ts index 4485c638..d00ac2df 100644 --- a/src/css/workerManager.ts +++ b/src/css/workerManager.ts @@ -15,12 +15,13 @@ export class WorkerManager { private _lastUsedTime: number; private _configChangeListener: IDisposable; - private _worker: editor.MonacoWebWorker; - private _client: Promise; + private _worker: editor.MonacoWebWorker | null; + private _client: Promise | null; constructor(defaults: LanguageServiceDefaults) { this._defaults = defaults; this._worker = null; + this._client = null; this._idleCheckInterval = window.setInterval(() => this._checkIfIdle(), 30 * 1000); this._lastUsedTime = 0; this._configChangeListener = this._defaults.onDidChange(() => this._stopWorker()); @@ -80,7 +81,9 @@ export class WorkerManager { _client = client; }) .then((_) => { - return this._worker.withSyncedResources(resources); + if (this._worker) { + return this._worker.withSyncedResources(resources); + } }) .then((_) => _client); } diff --git a/src/html/htmlMode.ts b/src/html/htmlMode.ts index 779c5edf..e974ecc5 100644 --- a/src/html/htmlMode.ts +++ b/src/html/htmlMode.ts @@ -163,6 +163,6 @@ function asDisposable(disposables: IDisposable[]): IDisposable { function disposeAll(disposables: IDisposable[]) { while (disposables.length) { - disposables.pop().dispose(); + disposables.pop()!.dispose(); } } diff --git a/src/html/htmlWorker.ts b/src/html/htmlWorker.ts index 71bc937e..b0930be0 100644 --- a/src/html/htmlWorker.ts +++ b/src/html/htmlWorker.ts @@ -37,8 +37,11 @@ export class HTMLWorker { async doComplete( uri: string, position: htmlService.Position - ): Promise { + ): Promise { let document = this._getTextDocument(uri); + if (!document) { + return null; + } let htmlDocument = this._languageService.parseHTMLDocument(document); return Promise.resolve( this._languageService.doComplete( @@ -55,12 +58,18 @@ export class HTMLWorker { options: htmlService.FormattingOptions ): Promise { let document = this._getTextDocument(uri); + if (!document) { + return []; + } let formattingOptions = { ...this._languageSettings.format, ...options }; let textEdits = this._languageService.format(document, range, formattingOptions); return Promise.resolve(textEdits); } - async doHover(uri: string, position: htmlService.Position): Promise { + async doHover(uri: string, position: htmlService.Position): Promise { let document = this._getTextDocument(uri); + if (!document) { + return null; + } let htmlDocument = this._languageService.parseHTMLDocument(document); let hover = this._languageService.doHover(document, position, htmlDocument); return Promise.resolve(hover); @@ -70,17 +79,26 @@ export class HTMLWorker { position: htmlService.Position ): Promise { let document = this._getTextDocument(uri); + if (!document) { + return []; + } let htmlDocument = this._languageService.parseHTMLDocument(document); let highlights = this._languageService.findDocumentHighlights(document, position, htmlDocument); return Promise.resolve(highlights); } async findDocumentLinks(uri: string): Promise { let document = this._getTextDocument(uri); - let links = this._languageService.findDocumentLinks(document, null); + if (!document) { + return []; + } + let links = this._languageService.findDocumentLinks(document, null! /*TODO@aeschli*/); return Promise.resolve(links); } async findDocumentSymbols(uri: string): Promise { let document = this._getTextDocument(uri); + if (!document) { + return []; + } let htmlDocument = this._languageService.parseHTMLDocument(document); let symbols = this._languageService.findDocumentSymbols(document, htmlDocument); return Promise.resolve(symbols); @@ -90,6 +108,9 @@ export class HTMLWorker { context?: { rangeLimit?: number } ): Promise { let document = this._getTextDocument(uri); + if (!document) { + return []; + } let ranges = this._languageService.getFoldingRanges(document, context); return Promise.resolve(ranges); } @@ -98,6 +119,9 @@ export class HTMLWorker { positions: htmlService.Position[] ): Promise { let document = this._getTextDocument(uri); + if (!document) { + return []; + } let ranges = this._languageService.getSelectionRanges(document, positions); return Promise.resolve(ranges); } @@ -105,13 +129,16 @@ export class HTMLWorker { uri: string, position: htmlService.Position, newName: string - ): Promise { + ): Promise { let document = this._getTextDocument(uri); + if (!document) { + return null; + } let htmlDocument = this._languageService.parseHTMLDocument(document); let renames = this._languageService.doRename(document, position, newName, htmlDocument); return Promise.resolve(renames); } - private _getTextDocument(uri: string): htmlService.TextDocument { + private _getTextDocument(uri: string): htmlService.TextDocument | null { let models = this._ctx.getMirrorModels(); for (let model of models) { if (model.uri.toString() === uri) { diff --git a/src/html/monaco.contribution.ts b/src/html/monaco.contribution.ts index 30a24b2a..57412060 100644 --- a/src/html/monaco.contribution.ts +++ b/src/html/monaco.contribution.ts @@ -14,7 +14,7 @@ export interface HTMLFormatConfiguration { readonly contentUnformatted: string; readonly indentInnerHtml: boolean; readonly preserveNewLines: boolean; - readonly maxPreserveNewLines: number; + readonly maxPreserveNewLines: number | undefined; readonly indentHandlebars: boolean; readonly endWithNewline: boolean; readonly extraLiners: string; @@ -114,8 +114,8 @@ export interface LanguageServiceDefaults { class LanguageServiceDefaultsImpl implements LanguageServiceDefaults { private _onDidChange = new Emitter(); - private _options: Options; - private _modeConfiguration: ModeConfiguration; + private _options!: Options; + private _modeConfiguration!: ModeConfiguration; private _languageId: string; constructor(languageId: string, options: Options, modeConfiguration: ModeConfiguration) { @@ -160,7 +160,7 @@ const formatDefaults: Required = { contentUnformatted: 'pre', indentInnerHtml: false, preserveNewLines: true, - maxPreserveNewLines: null, + maxPreserveNewLines: undefined, indentHandlebars: false, endWithNewline: false, extraLiners: 'head, body, /html', diff --git a/src/html/workerManager.ts b/src/html/workerManager.ts index 74094e78..e3741bf0 100644 --- a/src/html/workerManager.ts +++ b/src/html/workerManager.ts @@ -15,12 +15,13 @@ export class WorkerManager { private _lastUsedTime: number; private _configChangeListener: IDisposable; - private _worker: editor.MonacoWebWorker; - private _client: Promise; + private _worker: editor.MonacoWebWorker | null; + private _client: Promise | null; constructor(defaults: LanguageServiceDefaults) { this._defaults = defaults; this._worker = null; + this._client = null; this._idleCheckInterval = window.setInterval(() => this._checkIfIdle(), 30 * 1000); this._lastUsedTime = 0; this._configChangeListener = this._defaults.onDidChange(() => this._stopWorker()); diff --git a/src/tsconfig.json b/src/tsconfig.json index 707f714d..7d1e23db 100644 --- a/src/tsconfig.json +++ b/src/tsconfig.json @@ -1,10 +1,11 @@ { "compilerOptions": { + "declaration": true, + "lib": ["dom", "es5", "es2015.collection", "es2015.promise", "es2015.iterable"], "module": "amd", "moduleResolution": "node", "outDir": "../out/amd", - "declaration": true, - "target": "es5", - "lib": ["dom", "es5", "es2015.collection", "es2015.promise", "es2015.iterable"] + "strict": true, + "target": "es5" } } diff --git a/website/playground/monaco.d.ts.txt b/website/playground/monaco.d.ts.txt index bfec7b8a..02f42a34 100644 --- a/website/playground/monaco.d.ts.txt +++ b/website/playground/monaco.d.ts.txt @@ -7594,7 +7594,7 @@ declare namespace monaco.languages.html { readonly contentUnformatted: string; readonly indentInnerHtml: boolean; readonly preserveNewLines: boolean; - readonly maxPreserveNewLines: number; + readonly maxPreserveNewLines: number | undefined; readonly indentHandlebars: boolean; readonly endWithNewline: boolean; readonly extraLiners: string; diff --git a/website/typedoc/monaco.d.ts b/website/typedoc/monaco.d.ts index bfec7b8a..02f42a34 100644 --- a/website/typedoc/monaco.d.ts +++ b/website/typedoc/monaco.d.ts @@ -7594,7 +7594,7 @@ declare namespace monaco.languages.html { readonly contentUnformatted: string; readonly indentInnerHtml: boolean; readonly preserveNewLines: boolean; - readonly maxPreserveNewLines: number; + readonly maxPreserveNewLines: number | undefined; readonly indentHandlebars: boolean; readonly endWithNewline: boolean; readonly extraLiners: string;