From cbf26536f9fc10f541984f787132cd5fd3200024 Mon Sep 17 00:00:00 2001 From: Rafal Chlodnicki Date: Thu, 18 Aug 2022 22:32:51 +0200 Subject: [PATCH] refactor: enable strict mode for typescript --- src/document-symbol.ts | 4 ++-- src/logger.ts | 2 +- src/lsp-server.spec.ts | 18 +++--------------- src/lsp-server.ts | 40 ++++++++++++++++++++-------------------- src/test-utils.ts | 2 +- src/tsp-client.ts | 4 ++-- src/utils.ts | 4 ++-- tsconfig.json | 10 +++------- 8 files changed, 34 insertions(+), 50 deletions(-) diff --git a/src/document-symbol.ts b/src/document-symbol.ts index fa78de0d..a40d20a5 100644 --- a/src/document-symbol.ts +++ b/src/document-symbol.ts @@ -23,7 +23,7 @@ function collectDocumentSymbolsInRange(parent: tsp.NavigationTree, symbols: lsp. continue; } - const children = []; + const children: lsp.DocumentSymbol[] = []; if (parent.childItems) { for (const child of parent.childItems) { if (child.spans.some(childSpan => !!Range.intersection(spanRange, asRange(childSpan)))) { @@ -60,7 +60,7 @@ export function collectSymbolInformation(uri: string, current: tsp.NavigationTre const name = current.text; for (const span of current.spans) { const range = asRange(span); - const children = []; + const children: lsp.SymbolInformation[] = []; if (current.childItems) { for (const child of current.childItems) { if (child.spans.some(span => !!Range.intersection(range, asRange(span)))) { diff --git a/src/logger.ts b/src/logger.ts index 40a10f59..e7726af1 100644 --- a/src/logger.ts +++ b/src/logger.ts @@ -86,7 +86,7 @@ export class ConsoleLogger implements Logger { } } - private toStrings(...arg): string[] { + private toStrings(...arg: any[]): string[] { return arg.map(a => JSON.stringify(a, null, 2)); } diff --git a/src/lsp-server.spec.ts b/src/lsp-server.spec.ts index d387d317..4a99177a 100644 --- a/src/lsp-server.spec.ts +++ b/src/lsp-server.spec.ts @@ -551,11 +551,7 @@ describe('document symbol', () => { server.didOpenTextDocument({ textDocument: doc }); - const symbols = await server.documentSymbol({ - textDocument: doc, - position: lsp.Position.create(1, 1) - }); - + const symbols = await server.documentSymbol({ textDocument: doc }); assert.equal(` Foo foo @@ -581,11 +577,7 @@ interface Box { server.didOpenTextDocument({ textDocument: doc }); - const symbols = await server.documentSymbol({ - textDocument: doc, - position: lsp.Position.create(1, 1) - }); - + const symbols = await server.documentSymbol({ textDocument: doc }); assert.equal(` Box height @@ -616,11 +608,7 @@ Box server.didOpenTextDocument({ textDocument: doc }); - const symbols = await server.documentSymbol({ - textDocument: doc, - position: lsp.Position.create(1, 1) - }) as lsp.DocumentSymbol[]; - + const symbols = await server.documentSymbol({ textDocument: doc }) as lsp.DocumentSymbol[]; const expectation = ` Foo foo diff --git a/src/lsp-server.ts b/src/lsp-server.ts index 3de08ad8..7f3572a1 100644 --- a/src/lsp-server.ts +++ b/src/lsp-server.ts @@ -111,15 +111,14 @@ class ServerInitializingIndicator { } export class LspServer { - private _tspClient: TspClient | null; - private _loadingIndicator: ServerInitializingIndicator | null; - private initializeParams: TypeScriptInitializeParams; - private initializeResult: TypeScriptInitializeResult; + private _tspClient: TspClient | null = null; + private _loadingIndicator: ServerInitializingIndicator | null = null; + private initializeParams: TypeScriptInitializeParams | null = null; private diagnosticQueue?: DiagnosticEventQueue; private logger: Logger; private workspaceConfiguration: TypeScriptWorkspaceSettings; private workspaceRoot: string | undefined; - private typeScriptAutoFixProvider: TypeScriptAutoFixProvider; + private typeScriptAutoFixProvider: TypeScriptAutoFixProvider | null = null; private features: SupportedFeatures = {}; private readonly documents = new LspDocuments(); @@ -304,7 +303,7 @@ export class LspServer { ]); const logFileUri = logFile && pathToUri(logFile, undefined); - this.initializeResult = { + const initializeResult: TypeScriptInitializeResult = { capabilities: { textDocumentSync: lsp.TextDocumentSyncKind.Incremental, completionProvider: { @@ -378,9 +377,9 @@ export class LspServer { }, logFileUri }; - (this.initializeResult.capabilities as lspcalls.CallsServerCapabilities).callsProvider = true; - this.logger.log('onInitialize result', this.initializeResult); - return this.initializeResult; + (initializeResult.capabilities as lspcalls.CallsServerCapabilities).callsProvider = true; + this.logger.log('onInitialize result', initializeResult); + return initializeResult; } protected getLogFile(logVerbosity: string | undefined): string | undefined { if (logVerbosity === undefined || logVerbosity === 'off') { @@ -567,7 +566,7 @@ export class LspServer { this.requestDiagnostics(); } - didSaveTextDocument(_params: lsp.DidChangeTextDocumentParams): void { + didSaveTextDocument(_params: lsp.DidSaveTextDocumentParams): void { // do nothing } @@ -611,7 +610,7 @@ export class LspServer { return result.body ? result.body.map(fileSpan => toLocation(fileSpan, this.documents)) : []; } - async documentSymbol(params: lsp.TextDocumentPositionParams): Promise { + async documentSymbol(params: lsp.DocumentSymbolParams): Promise { const file = uriToPath(params.textDocument.uri); this.logger.log('symbol', params, file); if (!file) { @@ -639,7 +638,7 @@ export class LspServer { return symbols; } protected get supportHierarchicalDocumentSymbol(): boolean { - const textDocument = this.initializeParams.capabilities.textDocument; + const textDocument = this.initializeParams?.capabilities.textDocument; const documentSymbol = textDocument && textDocument.documentSymbol; return !!documentSymbol && !!documentSymbol.hierarchicalDocumentSymbolSupport; } @@ -682,7 +681,7 @@ export class LspServer { } return lsp.CompletionList.create(completions, body?.isIncomplete); } catch (error) { - if (error.message === 'No content available.') { + if ((error as Error).message === 'No content available.') { this.logger.info('No content was available for completion request'); return null; } else { @@ -756,13 +755,14 @@ export class LspServer { if (!result.body || !result.body.info.canRename || result.body.locs.length === 0) { return undefined; } - const workspaceEdit = { - changes: {} - }; + const workspaceEdit: lsp.WorkspaceEdit = {}; result.body.locs .forEach((spanGroup) => { - const uri = pathToUri(spanGroup.file, this.documents), - textEdits = workspaceEdit.changes[uri] || (workspaceEdit.changes[uri] = []); + const uri = pathToUri(spanGroup.file, this.documents); + if (!workspaceEdit.changes) { + workspaceEdit.changes = {}; + } + const textEdits = workspaceEdit.changes[uri] || (workspaceEdit.changes[uri] = []); spanGroup.locs.forEach((textSpan) => { textEdits.push({ @@ -948,7 +948,7 @@ export class LspServer { if (kinds && !this.pendingDebouncedRequest) { const diagnostics = this.diagnosticQueue?.getDiagnosticsForFile(file) || []; if (diagnostics.length) { - actions.push(...await this.typeScriptAutoFixProvider.provideCodeActions(kinds, file, diagnostics, this.documents)); + actions.push(...await this.typeScriptAutoFixProvider!.provideCodeActions(kinds, file, diagnostics, this.documents)); } } @@ -1300,7 +1300,7 @@ export class LspServer { private getInlayHintsOptions(file: string): lspinlayHints.InlayHintsOptions & tsp.UserPreferences { const workspacePreference = this.getWorkspacePreferencesForDocument(file); - const userPreferences = this.initializeParams.initializationOptions?.preferences || {}; + const userPreferences = this.initializeParams?.initializationOptions?.preferences || {}; return { ...userPreferences, ...workspacePreference.inlayHints ?? {} diff --git a/src/test-utils.ts b/src/test-utils.ts index 9ca2ec56..cc1cec95 100644 --- a/src/test-utils.ts +++ b/src/test-utils.ts @@ -106,7 +106,7 @@ export function toPlatformEOL(text: string): string { } class TestLspClient implements LspClient { - private workspaceEditsListener: (args: lsp.ApplyWorkspaceEditParams) => void | undefined; + private workspaceEditsListener: ((args: lsp.ApplyWorkspaceEditParams) => void) | null = null; constructor(protected options: TestLspServerOptions, protected logger: ConsoleLogger) {} diff --git a/src/tsp-client.ts b/src/tsp-client.ts index 5dcb2c23..aa426a2a 100644 --- a/src/tsp-client.ts +++ b/src/tsp-client.ts @@ -71,8 +71,8 @@ interface TypeScriptRequestTypes { export class TspClient { public apiVersion: API; - private tsserverProc: cp.ChildProcess | null; - private readlineInterface: readline.ReadLine; + private tsserverProc: cp.ChildProcess | null = null; + private readlineInterface: readline.ReadLine | null = null; private seq = 0; private readonly deferreds: { [seq: number]: Deferred; } = {}; private logger: Logger; diff --git a/src/utils.ts b/src/utils.ts index 1f484ab7..b4542813 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -6,8 +6,8 @@ */ export class Deferred { - resolve: (value: T) => void; - reject: (err?: unknown) => void; + resolve: (value: T) => void = (_) => {}; + reject: (err?: unknown) => void = (_?) => {}; promise = new Promise((resolve, reject) => { this.resolve = resolve; diff --git a/tsconfig.json b/tsconfig.json index be119af9..4a36d734 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,21 +5,17 @@ "compilerOptions": { "outDir": "lib", "rootDir": "src", + "strict": true, "composite": true, "declaration": true, "declarationMap": true, "sourceMap": true, - "target": "es6", + "target": "es2020", "module": "Node16", "moduleResolution": "Node16", "resolveJsonModule": true, "esModuleInterop": true, - "lib": [ - "es6" - ], - "alwaysStrict": true, - "strictBindCallApply": true, - "strictNullChecks": true, + "lib": ["es2020"], "skipLibCheck": true, } }