From d4bb523d43261a3ec2c4c9ca01052faeb0a874e7 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 23 Jul 2024 12:19:43 -0700 Subject: [PATCH] Fix a few more type assertions (#223138) For #211878 --- src/vs/base/common/types.ts | 10 +++++++ .../electron-main/utilityProcess.ts | 11 +++---- .../workbench/api/common/extHost.api.impl.ts | 8 ++--- .../api/common/extHostTypeConverters.ts | 30 +++++++++---------- .../test/browser/workbenchTestServices.ts | 9 ++---- 5 files changed, 37 insertions(+), 31 deletions(-) diff --git a/src/vs/base/common/types.ts b/src/vs/base/common/types.ts index 1acab57b758..6025a90c711 100644 --- a/src/vs/base/common/types.ts +++ b/src/vs/base/common/types.ts @@ -190,6 +190,16 @@ export function validateConstraint(arg: unknown, constraint: TypeConstraint | un } } +/** + * Helper type assertion that safely upcasts a type to a supertype. + * + * This can be used to make sure the argument correctly conforms to the subtype while still being able to pass it + * to contexts that expects the supertype. + */ +export function upcast(x: Sub): Base { + return x; +} + type AddFirstParameterToFunction = T extends (...args: any[]) => TargetFunctionsReturnType ? // Function: add param to function (firstArg: FirstParameter, ...args: Parameters) => ReturnType : diff --git a/src/vs/platform/utilityProcess/electron-main/utilityProcess.ts b/src/vs/platform/utilityProcess/electron-main/utilityProcess.ts index 3b817404c49..3b1cee5f90c 100644 --- a/src/vs/platform/utilityProcess/electron-main/utilityProcess.ts +++ b/src/vs/platform/utilityProcess/electron-main/utilityProcess.ts @@ -18,6 +18,7 @@ import { removeDangerousEnvVariables } from 'vs/base/common/processes'; import { deepClone } from 'vs/base/common/objects'; import { isWindows } from 'vs/base/common/platform'; import { isUNCAccessRestrictionsDisabled, getUNCHostAllowlist } from 'vs/base/node/unc'; +import { upcast } from 'vs/base/common/types'; export interface IUtilityProcessConfiguration { @@ -249,7 +250,10 @@ export class UtilityProcess extends Disposable { this.log('creating new...', Severity.Info); // Fork utility process - this.process = utilityProcess.fork(modulePath, args, { + this.process = utilityProcess.fork(modulePath, args, upcast({ serviceName, env, execArgv, @@ -257,10 +261,7 @@ export class UtilityProcess extends Disposable { forceAllocationsToV8Sandbox, respondToAuthRequestsFromMainProcess, stdio - } as ForkOptions & { - forceAllocationsToV8Sandbox?: Boolean; - respondToAuthRequestsFromMainProcess?: boolean; - }); + })); // Register to events this.registerListeners(this.process, this.configuration, serviceName); diff --git a/src/vs/workbench/api/common/extHost.api.impl.ts b/src/vs/workbench/api/common/extHost.api.impl.ts index 910f5251ab7..60c35821086 100644 --- a/src/vs/workbench/api/common/extHost.api.impl.ts +++ b/src/vs/workbench/api/common/extHost.api.impl.ts @@ -7,7 +7,7 @@ import { AsyncIterableObject } from 'vs/base/common/async'; import { CancellationTokenSource } from 'vs/base/common/cancellation'; import * as errors from 'vs/base/common/errors'; import { Emitter, Event } from 'vs/base/common/event'; -import { combinedDisposable, IDisposable } from 'vs/base/common/lifecycle'; +import { combinedDisposable } from 'vs/base/common/lifecycle'; import { Schemas, matchesScheme } from 'vs/base/common/network'; import Severity from 'vs/base/common/severity'; import { URI } from 'vs/base/common/uri'; @@ -1206,17 +1206,17 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I }, registerFileSearchProviderNew: (scheme: string, provider: vscode.FileSearchProviderNew) => { checkProposedApiEnabled(extension, 'fileSearchProviderNew'); - return { dispose: () => { } }; + return { dispose: () => { } }; }, registerTextSearchProviderNew: (scheme: string, provider: vscode.TextSearchProviderNew) => { checkProposedApiEnabled(extension, 'textSearchProviderNew'); - return { dispose: () => { } }; + return { dispose: () => { } }; }, registerAITextSearchProviderNew: (scheme: string, provider: vscode.AITextSearchProviderNew) => { // there are some dependencies on textSearchProvider, so we need to check for both checkProposedApiEnabled(extension, 'aiTextSearchProviderNew'); checkProposedApiEnabled(extension, 'textSearchProviderNew'); - return { dispose: () => { } }; + return { dispose: () => { } }; }, registerRemoteAuthorityResolver: (authorityPrefix: string, resolver: vscode.RemoteAuthorityResolver) => { checkProposedApiEnabled(extension, 'resolvers'); diff --git a/src/vs/workbench/api/common/extHostTypeConverters.ts b/src/vs/workbench/api/common/extHostTypeConverters.ts index 92989936141..6a81c0db675 100644 --- a/src/vs/workbench/api/common/extHostTypeConverters.ts +++ b/src/vs/workbench/api/common/extHostTypeConverters.ts @@ -787,7 +787,7 @@ export namespace SymbolTag { export namespace WorkspaceSymbol { export function from(info: vscode.SymbolInformation): search.IWorkspaceSymbol { - return { + return { name: info.name, kind: SymbolKind.from(info.kind), tags: info.tags && info.tags.map(SymbolTag.from), @@ -966,7 +966,7 @@ export namespace Hover { export namespace EvaluatableExpression { export function from(expression: vscode.EvaluatableExpression): languages.EvaluatableExpression { - return { + return { range: Range.from(expression.range), expression: expression.expression }; @@ -980,24 +980,24 @@ export namespace EvaluatableExpression { export namespace InlineValue { export function from(inlineValue: vscode.InlineValue): languages.InlineValue { if (inlineValue instanceof types.InlineValueText) { - return { + return { type: 'text', range: Range.from(inlineValue.range), text: inlineValue.text - }; + } satisfies languages.InlineValueText; } else if (inlineValue instanceof types.InlineValueVariableLookup) { - return { + return { type: 'variable', range: Range.from(inlineValue.range), variableName: inlineValue.variableName, caseSensitiveLookup: inlineValue.caseSensitiveLookup - }; + } satisfies languages.InlineValueVariableLookup; } else if (inlineValue instanceof types.InlineValueEvaluatableExpression) { - return { + return { type: 'expression', range: Range.from(inlineValue.range), expression: inlineValue.expression - }; + } satisfies languages.InlineValueExpression; } else { throw new Error(`Unknown 'InlineValue' type`); } @@ -1006,28 +1006,28 @@ export namespace InlineValue { export function to(inlineValue: languages.InlineValue): vscode.InlineValue { switch (inlineValue.type) { case 'text': - return { + return { range: Range.to(inlineValue.range), text: inlineValue.text - }; + } satisfies vscode.InlineValueText; case 'variable': - return { + return { range: Range.to(inlineValue.range), variableName: inlineValue.variableName, caseSensitiveLookup: inlineValue.caseSensitiveLookup - }; + } satisfies vscode.InlineValueVariableLookup; case 'expression': - return { + return { range: Range.to(inlineValue.range), expression: inlineValue.expression - }; + } satisfies vscode.InlineValueEvaluatableExpression; } } } export namespace InlineValueContext { export function from(inlineValueContext: vscode.InlineValueContext): extHostProtocol.IInlineValueContextDto { - return { + return { frameId: inlineValueContext.frameId, stoppedLocation: Range.from(inlineValueContext.stoppedLocation) }; diff --git a/src/vs/workbench/test/browser/workbenchTestServices.ts b/src/vs/workbench/test/browser/workbenchTestServices.ts index 65d93898567..32bb3da3a3c 100644 --- a/src/vs/workbench/test/browser/workbenchTestServices.ts +++ b/src/vs/workbench/test/browser/workbenchTestServices.ts @@ -123,7 +123,7 @@ import { IEnterWorkspaceResult, IRecent, IRecentlyOpened, IWorkspaceFolderCreati import { IWorkspaceTrustManagementService, IWorkspaceTrustRequestService } from 'vs/platform/workspace/common/workspaceTrust'; import { IExtensionTerminalProfile, IShellLaunchConfig, ITerminalBackend, ITerminalLogService, ITerminalProfile, TerminalIcon, TerminalLocation, TerminalShellType } from 'vs/platform/terminal/common/terminal'; import { ICreateTerminalOptions, IDeserializedTerminalEditorInput, ITerminalConfigurationService, ITerminalEditorService, ITerminalGroup, ITerminalGroupService, ITerminalInstance, ITerminalInstanceService, TerminalEditorLocation } from 'vs/workbench/contrib/terminal/browser/terminal'; -import { assertIsDefined } from 'vs/base/common/types'; +import { assertIsDefined, upcast } from 'vs/base/common/types'; import { IRegisterContributedProfileArgs, IShellLaunchConfigResolveOptions, ITerminalProfileProvider, ITerminalProfileResolverService, ITerminalProfileService } from 'vs/workbench/contrib/terminal/common/terminal'; import { EditorResolverService } from 'vs/workbench/services/editor/browser/editorResolverService'; import { FILE_EDITOR_INPUT_ID } from 'vs/workbench/contrib/files/common/files'; @@ -211,12 +211,7 @@ export class TestTextFileEditor extends TextFileEditor { } setSelection(selection: Selection | undefined, reason: EditorPaneSelectionChangeReason): void { - if (selection) { - const options: ITextEditorOptions = { selection }; - this._options = options; - } else { - this._options = undefined; - } + this._options = selection ? upcast({ selection }) : undefined; this._onDidChangeSelection.fire({ reason }); }