diff --git a/extensions/php/src/features/completionItemProvider.ts b/extensions/php/src/features/completionItemProvider.ts index a430aa3f154..3d918dc4cf5 100644 --- a/extensions/php/src/features/completionItemProvider.ts +++ b/extensions/php/src/features/completionItemProvider.ts @@ -27,7 +27,7 @@ export default class PHPCompletionItemProvider implements CompletionItemProvider } var added: any = {}; - var createNewProposal = function (kind: CompletionItemKind, name: string, entry: phpGlobals.IEntry): CompletionItem { + var createNewProposal = function (kind: CompletionItemKind, name: string, entry: phpGlobals.IEntry | null): CompletionItem { var proposal: CompletionItem = new CompletionItem(name); proposal.kind = kind; if (entry) { @@ -85,7 +85,7 @@ export default class PHPCompletionItemProvider implements CompletionItemProvider var text = document.getText(); if (prefix[0] === '$') { var variableMatch = /\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)/g; - var match: RegExpExecArray = null; + var match: RegExpExecArray | null = null; while (match = variableMatch.exec(text)) { var word = match[0]; if (!added[word]) { @@ -95,7 +95,7 @@ export default class PHPCompletionItemProvider implements CompletionItemProvider } } var functionMatch = /function\s+([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\s*\(/g; - var match: RegExpExecArray = null; + var match: RegExpExecArray | null = null; while (match = functionMatch.exec(text)) { var word = match[1]; if (!added[word]) { diff --git a/extensions/php/src/features/hoverProvider.ts b/extensions/php/src/features/hoverProvider.ts index 1e300e2fccd..2e0a137ec0a 100644 --- a/extensions/php/src/features/hoverProvider.ts +++ b/extensions/php/src/features/hoverProvider.ts @@ -11,10 +11,10 @@ import { textToMarkedString } from './utils/markedTextUtil'; export default class PHPHoverProvider implements HoverProvider { - public provideHover(document: TextDocument, position: Position, token: CancellationToken): Hover { + public provideHover(document: TextDocument, position: Position, token: CancellationToken): Hover | undefined { let enable = workspace.getConfiguration('php').get('suggest.basic', true); if (!enable) { - return null; + return; } let wordRange = document.getWordRangeAtPosition(position); diff --git a/extensions/php/src/features/signatureHelpProvider.ts b/extensions/php/src/features/signatureHelpProvider.ts index b52392cfca4..42c14b8066a 100644 --- a/extensions/php/src/features/signatureHelpProvider.ts +++ b/extensions/php/src/features/signatureHelpProvider.ts @@ -69,7 +69,7 @@ class BackwardIterator { export default class PHPSignatureHelpProvider implements SignatureHelpProvider { - public provideSignatureHelp(document: TextDocument, position: Position, token: CancellationToken): Promise { + public provideSignatureHelp(document: TextDocument, position: Position, token: CancellationToken): Promise | null { let enable = workspace.getConfiguration('php').get('suggest.basic', true); if (!enable) { return null; @@ -95,7 +95,7 @@ export default class PHPSignatureHelpProvider implements SignatureHelpProvider { let signatureInfo = new SignatureInformation(ident + paramsString, entry.description); var re = /\w*\s+\&?\$[\w_\.]+|void/g; - var match: RegExpExecArray = null; + var match: RegExpExecArray | null = null; while ((match = re.exec(paramsString)) !== null) { signatureInfo.parameters.push({ label: match[0], documentation: '' }); } diff --git a/extensions/php/src/features/utils/async.ts b/extensions/php/src/features/utils/async.ts index f9c86930453..5093f7c3eba 100644 --- a/extensions/php/src/features/utils/async.ts +++ b/extensions/php/src/features/utils/async.ts @@ -29,9 +29,9 @@ export interface ITask { */ export class Throttler { - private activePromise: Promise; - private queuedPromise: Promise; - private queuedPromiseFactory: ITask>; + private activePromise: Promise | null; + private queuedPromise: Promise | null; + private queuedPromiseFactory: ITask> | null; constructor() { this.activePromise = null; @@ -47,26 +47,26 @@ export class Throttler { var onComplete = () => { this.queuedPromise = null; - var result = this.queue(this.queuedPromiseFactory); + var result = this.queue(this.queuedPromiseFactory!); this.queuedPromiseFactory = null; return result; }; this.queuedPromise = new Promise((resolve, reject) => { - this.activePromise.then(onComplete, onComplete).then(resolve); + this.activePromise!.then(onComplete, onComplete).then(resolve); }); } return new Promise((resolve, reject) => { - this.queuedPromise.then(resolve, reject); + this.queuedPromise!.then(resolve, reject); }); } this.activePromise = promiseFactory(); return new Promise((resolve, reject) => { - this.activePromise.then((result: T) => { + this.activePromise!.then((result: T) => { this.activePromise = null; resolve(result); }, (err: any) => { @@ -103,10 +103,10 @@ export class Throttler { export class Delayer { public defaultDelay: number; - private timeout: NodeJS.Timer; - private completionPromise: Promise; - private onResolve: (value: T | Thenable) => void; - private task: ITask; + private timeout: NodeJS.Timer | null; + private completionPromise: Promise | null; + private onResolve: ((value: T | Thenable | undefined) => void) | null; + private task: ITask | null; constructor(defaultDelay: number) { this.defaultDelay = defaultDelay; @@ -127,7 +127,7 @@ export class Delayer { this.completionPromise = null; this.onResolve = null; - var result = this.task(); + var result = this.task!(); this.task = null; return result; @@ -136,7 +136,7 @@ export class Delayer { this.timeout = setTimeout(() => { this.timeout = null; - this.onResolve(null); + this.onResolve!(undefined); }, delay); return this.completionPromise; diff --git a/extensions/php/src/features/validationProvider.ts b/extensions/php/src/features/validationProvider.ts index 712164af0f9..0a26bbd5a9b 100644 --- a/extensions/php/src/features/validationProvider.ts +++ b/extensions/php/src/features/validationProvider.ts @@ -16,7 +16,7 @@ let localize = nls.loadMessageBundle(); export class LineDecoder { private stringDecoder: NodeStringDecoder; - private remaining: string; + private remaining: string | null; constructor(encoding: string = 'utf8') { this.stringDecoder = new StringDecoder(encoding); @@ -55,7 +55,7 @@ export class LineDecoder { return result; } - public end(): string { + public end(): string | null { return this.remaining; } } @@ -88,17 +88,17 @@ export default class PHPValidationProvider { private static FileArgs: string[] = ['-l', '-n', '-d', 'display_errors=On', '-d', 'log_errors=Off', '-f']; private validationEnabled: boolean; - private executableIsUserDefined: boolean; - private executable: string; + private executableIsUserDefined: boolean | undefined; + private executable: string | undefined; private trigger: RunTrigger; private pauseValidation: boolean; - private documentListener: vscode.Disposable; + private documentListener: vscode.Disposable | null; private diagnosticCollection: vscode.DiagnosticCollection; private delayers: { [key: string]: ThrottledDelayer }; constructor(private workspaceStore: vscode.Memento) { - this.executable = null; + this.executable = undefined; this.validationEnabled = true; this.trigger = RunTrigger.onSave; this.pauseValidation = false; @@ -145,7 +145,7 @@ export default class PHPValidationProvider { } this.trigger = RunTrigger.from(section.get('validate.run', RunTrigger.strings.onSave)); } - if (this.executableIsUserDefined !== true && this.workspaceStore.get(CheckedExecutablePath, undefined) !== void 0) { + if (this.executableIsUserDefined !== true && this.workspaceStore.get(CheckedExecutablePath, undefined) !== void 0) { vscode.commands.executeCommand('setContext', 'php.untrustValidationExecutableContext', true); } this.delayers = Object.create(null); @@ -195,7 +195,7 @@ export default class PHPValidationProvider { }; if (this.executableIsUserDefined !== void 0 && !this.executableIsUserDefined) { - let checkedExecutablePath = this.workspaceStore.get(CheckedExecutablePath, undefined); + let checkedExecutablePath = this.workspaceStore.get(CheckedExecutablePath, undefined); if (!checkedExecutablePath || checkedExecutablePath !== this.executable) { vscode.window.showInformationMessage( localize('php.useExecutablePath', 'Do you allow {0} (defined as a workspace setting) to be executed to lint PHP files?', this.executable), @@ -286,7 +286,7 @@ export default class PHPValidationProvider { } private showError(error: any, executable: string): void { - let message: string = null; + let message: string | null = null; if (error.code === 'ENOENT') { if (this.executable) { message = localize('wrongExecutable', 'Cannot validate since {0} is not a valid php executable. Use the setting \'php.validate.executablePath\' to configure the PHP executable.', executable); @@ -296,6 +296,8 @@ export default class PHPValidationProvider { } else { message = error.message ? error.message : localize('unknownReason', 'Failed to run php using path: {0}. Reason is unknown.', executable); } - vscode.window.showInformationMessage(message); + if (message) { + vscode.window.showInformationMessage(message); + } } } diff --git a/extensions/php/tsconfig.json b/extensions/php/tsconfig.json index a2b5bcdfddf..b16347a7524 100644 --- a/extensions/php/tsconfig.json +++ b/extensions/php/tsconfig.json @@ -5,7 +5,8 @@ "es2015" ], "module": "commonjs", - "outDir": "./out" + "outDir": "./out", + "strict": true }, "include": [ "src/**/*"