From b0e058ea9805ea927ed69768b6bb7cb7ddce4d7f Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 9 Nov 2017 11:53:21 +0100 Subject: [PATCH] [html] more strict null preparations (but still disabled, due to dependencies) --- extensions/html/server/src/htmlServerMain.ts | 15 +++++++------- .../html/server/src/modes/embeddedSupport.ts | 8 ++++---- .../html/server/src/modes/formatting.ts | 4 ++-- .../html/server/src/modes/javascriptMode.ts | 16 +++++++-------- .../html/server/src/modes/languageModes.ts | 20 +++++++++---------- .../html/server/src/test/embedded.test.ts | 2 +- .../html/server/src/test/formatting.test.ts | 2 +- .../server/src/test/javascriptMode.test.ts | 2 +- 8 files changed, 35 insertions(+), 34 deletions(-) diff --git a/extensions/html/server/src/htmlServerMain.ts b/extensions/html/server/src/htmlServerMain.ts index ff5df2a8ebd..8081a5ee302 100644 --- a/extensions/html/server/src/htmlServerMain.ts +++ b/extensions/html/server/src/htmlServerMain.ts @@ -39,7 +39,7 @@ let documents: TextDocuments = new TextDocuments(); // for open, change and close text document events documents.listen(connection); -let workspacePath: string; +let workspacePath: string | undefined | null; var languageModes: LanguageModes; let clientSnippetSupport = false; @@ -53,7 +53,7 @@ documents.onDidClose(e => { delete documentSettings[e.document.uri]; }); -function getDocumentSettings(textDocument: TextDocument, needsDocumentSettings: () => boolean): Thenable { +function getDocumentSettings(textDocument: TextDocument, needsDocumentSettings: () => boolean): Thenable { if (scopedSettingsSupport && needsDocumentSettings()) { let promise = documentSettings[textDocument.uri]; if (!promise) { @@ -83,7 +83,7 @@ connection.onInitialize((params: InitializeParams): InitializeResult => { }); function hasClientCapability(...keys: string[]) { - let c = params.capabilities; + let c = params.capabilities; for (let i = 0; c && i < keys.length; i++) { c = c[keys[i]]; } @@ -96,7 +96,7 @@ connection.onInitialize((params: InitializeParams): InitializeResult => { let capabilities: ServerCapabilities & CPServerCapabilities = { // Tell the client that the server works in FULL text document sync mode textDocumentSync: documents.syncKind, - completionProvider: clientSnippetSupport ? { resolveProvider: true, triggerCharacters: ['.', ':', '<', '"', '=', '/', '>'] } : null, + completionProvider: clientSnippetSupport ? { resolveProvider: true, triggerCharacters: ['.', ':', '<', '"', '=', '/', '>'] } : undefined, hoverProvider: true, documentHighlightProvider: true, documentRangeFormattingProvider: false, @@ -111,7 +111,7 @@ connection.onInitialize((params: InitializeParams): InitializeResult => { return { capabilities }; }); -let formatterRegistration: Thenable = null; +let formatterRegistration: Thenable | null = null; // The settings have changed. Is send on server activation as well. connection.onDidChangeConfiguration((change) => { @@ -198,11 +198,12 @@ connection.onCompletion(async textDocumentPosition => { let document = documents.get(textDocumentPosition.textDocument.uri); let mode = languageModes.getModeAtPosition(document, textDocumentPosition.position); if (mode && mode.doComplete) { + let doComplete = mode.doComplete; if (mode.getId() !== 'html') { connection.telemetry.logEvent({ key: 'html.embbedded.complete', value: { languageId: mode.getId() } }); } - let settings = await getDocumentSettings(document, () => mode.doComplete.length > 2); - return mode.doComplete(document, textDocumentPosition.position, settings); + let settings = await getDocumentSettings(document, () => doComplete.length > 2); + return doComplete(document, textDocumentPosition.position, settings); } return { isIncomplete: true, items: [] }; }); diff --git a/extensions/html/server/src/modes/embeddedSupport.ts b/extensions/html/server/src/modes/embeddedSupport.ts index c95e6dc87f7..82b9c9cf4c1 100644 --- a/extensions/html/server/src/modes/embeddedSupport.ts +++ b/extensions/html/server/src/modes/embeddedSupport.ts @@ -28,8 +28,8 @@ interface EmbeddedRegion { languageId: string; start: number; end: number; attri export function getDocumentRegions(languageService: LanguageService, document: TextDocument): HTMLDocumentRegions { let regions: EmbeddedRegion[] = []; let scanner = languageService.createScanner(document.getText()); - let lastTagName: string; - let lastAttributeName: string | null; + let lastTagName: string = ''; + let lastAttributeName: string | null = null; let languageIdFromType: string | undefined = undefined; let importedScripts: string[] = []; @@ -45,7 +45,7 @@ export function getDocumentRegions(languageService: LanguageService, document: T regions.push({ languageId: 'css', start: scanner.getTokenOffset(), end: scanner.getTokenEnd() }); break; case TokenType.Script: - regions.push({ languageId: languageIdFromType, start: scanner.getTokenOffset(), end: scanner.getTokenEnd() }); + regions.push({ languageId: languageIdFromType!, start: scanner.getTokenOffset(), end: scanner.getTokenEnd() }); break; case TokenType.AttributeName: lastAttributeName = scanner.getTokenText(); @@ -64,7 +64,7 @@ export function getDocumentRegions(languageService: LanguageService, document: T languageIdFromType = void 0; } } else { - let attributeLanguageId = getAttributeLanguage(lastAttributeName); + let attributeLanguageId = getAttributeLanguage(lastAttributeName!); if (attributeLanguageId) { let start = scanner.getTokenOffset(); let end = scanner.getTokenEnd(); diff --git a/extensions/html/server/src/modes/formatting.ts b/extensions/html/server/src/modes/formatting.ts index 32798162750..7fc5f222699 100644 --- a/extensions/html/server/src/modes/formatting.ts +++ b/extensions/html/server/src/modes/formatting.ts @@ -53,8 +53,8 @@ export function format(languageModes: LanguageModes, document: TextDocument, for formatRange = Range.create(startPos, formatRange.end); // perform a html format and apply changes to a new document - let htmlMode = languageModes.getMode('html'); - let htmlEdits = htmlMode.format(document, formatRange, formattingOptions, settings); + let htmlMode = languageModes.getMode('html')!; + let htmlEdits = htmlMode.format!(document, formatRange, formattingOptions, settings); let htmlFormattedContent = applyEdits(document, htmlEdits); let newDocument = TextDocument.create(document.uri + '.tmp', document.languageId, document.version, htmlFormattedContent); try { diff --git a/extensions/html/server/src/modes/javascriptMode.ts b/extensions/html/server/src/modes/javascriptMode.ts index 71bfb447611..ae16ed09475 100644 --- a/extensions/html/server/src/modes/javascriptMode.ts +++ b/extensions/html/server/src/modes/javascriptMode.ts @@ -118,7 +118,7 @@ export function getJavascriptMode(documentRegions: LanguageModelCache collectSymbols(item)); return result; } - return null; + return []; }, - findDefinition(document: TextDocument, position: Position): Definition { + findDefinition(document: TextDocument, position: Position): Definition | null { updateCurrentTextDocument(document); let definition = jsLanguageService.getDefinitionAtPosition(FILE_NAME, currentTextDocument.offsetAt(position)); if (definition) { @@ -240,7 +240,7 @@ export function getJavascriptMode(documentRegions: LanguageModelCache void; doValidation?: (document: TextDocument, settings?: Settings) => Diagnostic[]; - doComplete?: (document: TextDocument, position: Position, settings?: Settings) => CompletionList; - doResolve?: (document: TextDocument, item: CompletionItem) => CompletionItem; - doHover?: (document: TextDocument, position: Position) => Hover; - doSignatureHelp?: (document: TextDocument, position: Position) => SignatureHelp; + doComplete?: (document: TextDocument, position: Position, settings?: Settings) => CompletionList | null; + doResolve?: (document: TextDocument, item: CompletionItem) => CompletionItem | null; + doHover?: (document: TextDocument, position: Position) => Hover | null; + doSignatureHelp?: (document: TextDocument, position: Position) => SignatureHelp | null; findDocumentHighlight?: (document: TextDocument, position: Position) => DocumentHighlight[]; findDocumentSymbols?: (document: TextDocument) => SymbolInformation[]; findDocumentLinks?: (document: TextDocument, documentContext: DocumentContext) => DocumentLink[]; - findDefinition?: (document: TextDocument, position: Position) => Definition; + findDefinition?: (document: TextDocument, position: Position) => Definition | null; findReferences?: (document: TextDocument, position: Position) => Location[]; format?: (document: TextDocument, range: Range, options: FormattingOptions, settings: Settings) => TextEdit[]; findDocumentColors?: (document: TextDocument) => ColorInformation[]; getColorPresentations?: (document: TextDocument, color: Color, range: Range) => ColorPresentation[]; - doAutoClose?: (document: TextDocument, position: Position) => string; + doAutoClose?: (document: TextDocument, position: Position) => string | null; onDocumentRemoved(document: TextDocument): void; dispose(): void; } export interface LanguageModes { - getModeAtPosition(document: TextDocument, position: Position): LanguageMode; + getModeAtPosition(document: TextDocument, position: Position): LanguageMode | undefined; getModesInRange(document: TextDocument, range: Range): LanguageModeRange[]; getAllModes(): LanguageMode[]; getAllModesInDocument(document: TextDocument): LanguageMode[]; - getMode(languageId: string): LanguageMode; + getMode(languageId: string): LanguageMode | undefined; onDocumentRemoved(document: TextDocument): void; dispose(): void; } @@ -83,12 +83,12 @@ export function getLanguageModes(supportedLanguages: { [languageId: string]: boo modes['javascript'] = getJavascriptMode(documentRegions); } return { - getModeAtPosition(document: TextDocument, position: Position): LanguageMode { + getModeAtPosition(document: TextDocument, position: Position): LanguageMode | undefined { let languageId = documentRegions.get(document).getLanguageAtPosition(position); if (languageId) { return modes[languageId]; } - return null; + return void 0; }, getModesInRange(document: TextDocument, range: Range): LanguageModeRange[] { return documentRegions.get(document).getLanguageRanges(range).map(r => { diff --git a/extensions/html/server/src/test/embedded.test.ts b/extensions/html/server/src/test/embedded.test.ts index acc3b4be0d8..ae63ed167fc 100644 --- a/extensions/html/server/src/test/embedded.test.ts +++ b/extensions/html/server/src/test/embedded.test.ts @@ -14,7 +14,7 @@ suite('HTML Embedded Support', () => { var htmlLanguageService = getLanguageService(); - function assertLanguageId(value: string, expectedLanguageId: string): void { + function assertLanguageId(value: string, expectedLanguageId: string | undefined): void { let offset = value.indexOf('|'); value = value.substr(0, offset) + value.substr(offset + 1); diff --git a/extensions/html/server/src/test/formatting.test.ts b/extensions/html/server/src/test/formatting.test.ts index ad8918274b6..a750b5aae54 100644 --- a/extensions/html/server/src/test/formatting.test.ts +++ b/extensions/html/server/src/test/formatting.test.ts @@ -19,7 +19,7 @@ suite('HTML Embedded Formatting', () => { function assertFormat(value: string, expected: string, options?: any, formatOptions?: FormattingOptions, message?: string): void { var languageModes = getLanguageModes({ css: true, javascript: true }); if (options) { - languageModes.getAllModes().forEach(m => m.configure(options)); + languageModes.getAllModes().forEach(m => m.configure!(options)); } let rangeStartOffset = value.indexOf('|'); diff --git a/extensions/html/server/src/test/javascriptMode.test.ts b/extensions/html/server/src/test/javascriptMode.test.ts index 6fbdad408ec..f97c8f758e0 100644 --- a/extensions/html/server/src/test/javascriptMode.test.ts +++ b/extensions/html/server/src/test/javascriptMode.test.ts @@ -31,7 +31,7 @@ suite('HTML Javascript Support', () => { let list = mode.doComplete!(document, position); assert.ok(list); - let actualLabels = list.items.map(c => c.label).sort(); + let actualLabels = list!.items.map(c => c.label).sort(); for (let expected of expectedProposals) { assert.ok(actualLabels.indexOf(expected) !== -1, 'Not found:' + expected + ' is ' + actualLabels.join(', ')); }