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 });
}