Remove in operator from contrib/terminalContrib

Part of #276071
This commit is contained in:
Daniel Imms
2025-11-07 11:28:35 -08:00
parent 9673198d99
commit 362f432789
16 changed files with 52 additions and 47 deletions

View File

@@ -338,23 +338,8 @@ export default tseslint.config(
'src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts',
'src/vs/workbench/contrib/tasks/browser/taskTerminalStatus.ts',
'src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts',
'src/vs/workbench/contrib/terminalContrib/accessibility/browser/terminal.accessibility.contribution.ts',
'src/vs/workbench/contrib/terminalContrib/accessibility/browser/terminalAccessibleBufferProvider.ts',
'src/vs/workbench/contrib/terminalContrib/chat/browser/terminal.initialHint.contribution.ts',
'src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatActions.ts',
'src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/commandLineAutoApprover.ts',
'src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/taskHelpers.ts',
'src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/toolTerminalCreator.ts',
'src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/monitoring/outputMonitor.ts',
'src/vs/workbench/contrib/terminalContrib/commandGuide/browser/terminal.commandGuide.contribution.ts',
'src/vs/workbench/contrib/terminalContrib/history/browser/terminalRunRecentQuickPick.ts',
'src/vs/workbench/contrib/terminalContrib/links/browser/terminalLinkQuickpick.ts',
'src/vs/workbench/contrib/terminalContrib/links/test/browser/linkTestUtils.ts',
'src/vs/workbench/contrib/terminalContrib/quickFix/browser/quickFixAddon.ts',
'src/vs/workbench/contrib/terminalContrib/sendSequence/browser/terminal.sendSequence.contribution.ts',
'src/vs/workbench/contrib/terminalContrib/sendSignal/browser/terminal.sendSignal.contribution.ts',
'src/vs/workbench/contrib/terminalContrib/stickyScroll/browser/terminalStickyScrollOverlay.ts',
'src/vs/workbench/contrib/terminalContrib/suggest/browser/terminalCompletionService.ts',
'src/vs/workbench/contrib/testing/browser/explorerProjections/listProjection.ts',
'src/vs/workbench/contrib/testing/browser/explorerProjections/treeProjection.ts',
'src/vs/workbench/contrib/testing/browser/testCoverageBars.ts',

View File

@@ -19,7 +19,7 @@ import { ContextKeyExpr, IContextKeyService } from '../../../../../platform/cont
import { IInstantiationService, ServicesAccessor } from '../../../../../platform/instantiation/common/instantiation.js';
import { KeybindingWeight } from '../../../../../platform/keybinding/common/keybindingsRegistry.js';
import { ITerminalCommand, TerminalCapability } from '../../../../../platform/terminal/common/capabilities/capabilities.js';
import { ICurrentPartialCommand } from '../../../../../platform/terminal/common/capabilities/commandDetection/terminalCommand.js';
import { ICurrentPartialCommand, isFullTerminalCommand } from '../../../../../platform/terminal/common/capabilities/commandDetection/terminalCommand.js';
import { TerminalSettingId } from '../../../../../platform/terminal/common/terminal.js';
import { accessibleViewCurrentProviderId, accessibleViewIsShown } from '../../../accessibility/browser/accessibilityConfiguration.js';
import { AccessibilityHelpAction, AccessibleViewAction } from '../../../accessibility/browser/accessibleViewActions.js';
@@ -226,9 +226,9 @@ export class TerminalAccessibleViewContribution extends Disposable implements IT
return;
}
let line: number | undefined;
if ('marker' in command) {
if (isFullTerminalCommand(command)) {
line = command.marker?.line;
} else if ('commandStartMarker' in command) {
} else {
line = command.commandStartMarker?.line;
}
if (line === undefined || line < 0) {

View File

@@ -8,7 +8,7 @@ import { Disposable } from '../../../../../base/common/lifecycle.js';
import { IAccessibleViewContentProvider, AccessibleViewProviderId, IAccessibleViewOptions, AccessibleViewType, IAccessibleViewSymbol } from '../../../../../platform/accessibility/browser/accessibleView.js';
import { IConfigurationService } from '../../../../../platform/configuration/common/configuration.js';
import { TerminalCapability, ITerminalCommand } from '../../../../../platform/terminal/common/capabilities/capabilities.js';
import { ICurrentPartialCommand } from '../../../../../platform/terminal/common/capabilities/commandDetection/terminalCommand.js';
import { ICurrentPartialCommand, isFullTerminalCommand } from '../../../../../platform/terminal/common/capabilities/commandDetection/terminalCommand.js';
import { AccessibilityVerbositySettingId } from '../../../accessibility/browser/accessibilityConfiguration.js';
import { ITerminalInstance, ITerminalService } from '../../../terminal/browser/terminal.js';
import { BufferContentTracker } from './bufferContentTracker.js';
@@ -98,9 +98,9 @@ export class TerminalAccessibleBufferProvider extends Disposable implements IAcc
}
private _getEditorLineForCommand(command: ITerminalCommand | ICurrentPartialCommand): number | undefined {
let line: number | undefined;
if ('marker' in command) {
if (isFullTerminalCommand(command)) {
line = command.marker?.line;
} else if ('commandStartMarker' in command) {
} else {
line = command.commandStartMarker?.line;
}
if (line === undefined || line < 0) {

View File

@@ -30,6 +30,7 @@ import { TerminalInstance } from '../../../terminal/browser/terminalInstance.js'
import { TerminalInitialHintSettingId } from '../common/terminalInitialHintConfiguration.js';
import './media/terminalInitialHint.css';
import { TerminalChatCommandId } from './terminalChat.js';
import { hasKey } from '../../../../../base/common/types.js';
const $ = dom.$;
@@ -107,7 +108,7 @@ export class TerminalInitialHintContribution extends Disposable implements ITerm
xtermOpen(xterm: IXtermTerminal & { raw: RawXtermTerminal }): void {
// Don't show is the terminal was launched by an extension or a feature like debug
if ('shellLaunchConfig' in this._ctx.instance && (this._ctx.instance.shellLaunchConfig.isExtensionOwnedTerminal || this._ctx.instance.shellLaunchConfig.isFeatureTerminal)) {
if (hasKey(this._ctx.instance, { shellLaunchConfig: true }) && (this._ctx.instance.shellLaunchConfig.isExtensionOwnedTerminal || this._ctx.instance.shellLaunchConfig.isFeatureTerminal)) {
return;
}
// Don't show if disabled

View File

@@ -54,19 +54,25 @@ registerActiveXtermAction({
}
const contr = TerminalChatController.activeChatController || TerminalChatController.get(activeInstance);
if (!contr) {
return;
}
if (opts) {
function isValidOptionsObject(obj: unknown): obj is { query: string; isPartialQuery?: boolean } {
return typeof obj === 'object' && obj !== null && 'query' in obj && typeof obj.query === 'string';
}
opts = typeof opts === 'string' ? { query: opts } : opts;
if (typeof opts === 'object' && opts !== null && 'query' in opts && typeof opts.query === 'string') {
contr?.updateInput(opts.query, false);
if (!('isPartialQuery' in opts && opts.isPartialQuery)) {
contr?.terminalChatWidget?.acceptInput();
if (isValidOptionsObject(opts)) {
contr.updateInput(opts.query, false);
if (opts.isPartialQuery) {
contr.terminalChatWidget?.acceptInput();
}
}
}
contr?.terminalChatWidget?.reveal();
contr.terminalChatWidget?.reveal();
}
});

View File

@@ -187,13 +187,13 @@ export class CommandLineAutoApprover extends Disposable {
const defaultValue = configInspectValue?.default?.value;
const isDefaultRule = !!(
isObject(defaultValue) &&
key in defaultValue &&
Object.prototype.hasOwnProperty.call(defaultValue, key) &&
structuralEquals((defaultValue as Record<string, unknown>)[key], value)
);
function checkTarget(inspectValue: Readonly<unknown> | undefined): boolean {
return (
isObject(inspectValue) &&
key in inspectValue &&
Object.prototype.hasOwnProperty.call(inspectValue, key) &&
structuralEquals((inspectValue as Record<string, unknown>)[key], value)
);
}

View File

@@ -10,7 +10,7 @@ import { CancellationError } from '../../../../../base/common/errors.js';
import { Event } from '../../../../../base/common/event.js';
import { DisposableStore, MutableDisposable } from '../../../../../base/common/lifecycle.js';
import { ThemeIcon } from '../../../../../base/common/themables.js';
import { isNumber, isObject } from '../../../../../base/common/types.js';
import { hasKey, isNumber, isObject } from '../../../../../base/common/types.js';
import { IConfigurationService } from '../../../../../platform/configuration/common/configuration.js';
import { TerminalCapability } from '../../../../../platform/terminal/common/capabilities/capabilities.js';
import { PromptInputState } from '../../../../../platform/terminal/common/capabilities/commandDetection/promptInputModel.js';
@@ -63,7 +63,7 @@ export class ToolTerminalCreator {
instance.processReady.then(() => processReadyTimestamp = Date.now()),
Event.toPromise(instance.onExit),
]);
if (!isNumber(initResult) && isObject(initResult) && 'message' in initResult) {
if (!isNumber(initResult) && isObject(initResult) && hasKey(initResult, { message: true })) {
throw new Error(initResult.message);
}

View File

@@ -15,6 +15,7 @@ import { PANEL_BORDER } from '../../../../common/theme.js';
import { IDetachedTerminalInstance, ITerminalContribution, ITerminalInstance, IXtermTerminal } from '../../../terminal/browser/terminal.js';
import { registerTerminalContribution, type IDetachedCompatibleTerminalContributionContext, type ITerminalContributionContext } from '../../../terminal/browser/terminalExtensions.js';
import { terminalCommandGuideConfigSection, TerminalCommandGuideSettingId, type ITerminalCommandGuideConfiguration } from '../common/terminalCommandGuideConfiguration.js';
import { isFullTerminalCommand } from '../../../../../platform/terminal/common/capabilities/commandDetection/terminalCommand.js';
// #region Terminal Contributions
@@ -80,7 +81,7 @@ class TerminalCommandGuideContribution extends Disposable implements ITerminalCo
}
const mouseCursorY = Math.floor((e.clientY - rect.top) / (rect.height / xterm.raw.rows));
const command = this._ctx.instance.capabilities.get(TerminalCapability.CommandDetection)?.getCommandForLine(xterm.raw.buffer.active.viewportY + mouseCursorY);
if (command && 'getOutput' in command) {
if (command && isFullTerminalCommand(command)) {
xterm.markTracker.showCommandGuide(command);
} else {
xterm.markTracker.showCommandGuide(undefined);

View File

@@ -31,6 +31,7 @@ import { getCommandHistory, getDirectoryHistory, getShellFileHistory } from '../
import { ResourceSet } from '../../../../../base/common/map.js';
import { extUri, extUriIgnorePathCase } from '../../../../../base/common/resources.js';
import { IPathService } from '../../../../services/path/common/pathService.js';
import { isObject } from '../../../../../base/common/types.js';
export async function showRunRecentQuickPick(
accessor: ServicesAccessor,
@@ -325,7 +326,10 @@ export async function showRunRecentQuickPick(
if (!item) {
return;
}
if ('command' in item && item.command && item.command.marker) {
function isItem(obj: unknown): obj is Item {
return isObject(obj) && 'rawLabel' in obj;
}
if (isItem(item) && item.command && item.command.marker) {
if (!terminalScrollStateSaved) {
xterm.markTracker.saveScrollState();
terminalScrollStateSaved = true;

View File

@@ -20,6 +20,7 @@ import { ILabelService } from '../../../../../platform/label/common/label.js';
import { basenameOrAuthority, dirname } from '../../../../../base/common/resources.js';
import { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js';
import { AccessibleViewProviderId, IAccessibleViewService } from '../../../../../platform/accessibility/browser/accessibleView.js';
import { hasKey } from '../../../../../base/common/types.js';
export class TerminalLinkQuickpick extends DisposableStore {
@@ -167,7 +168,7 @@ export class TerminalLinkQuickpick extends DisposableStore {
accepted = true;
const event = new TerminalLinkQuickPickEvent(EventType.CLICK);
const activeItem = pick.activeItems?.[0];
if (activeItem && 'link' in activeItem) {
if (activeItem && hasKey(activeItem, { link: true })) {
activeItem.link.activate(event, activeItem.label);
}
disposables.dispose();
@@ -193,7 +194,7 @@ export class TerminalLinkQuickpick extends DisposableStore {
// Add a consistently formatted resolved URI label to the description if applicable
let description: string | undefined;
if ('uri' in link && link.uri) {
if (hasKey(link, { uri: true }) && link.uri) {
// For local files and folders, mimic the presentation of go to file
if (
link.type === TerminalBuiltinLinkType.LocalFile ||
@@ -234,7 +235,7 @@ export class TerminalLinkQuickpick extends DisposableStore {
}
private _previewItem(item: ITerminalLinkQuickPickItem | IQuickPickItem) {
if (!item || !('link' in item) || !item.link) {
if (!item || !hasKey(item, { link: true }) || !item.link) {
return;
}
@@ -242,7 +243,7 @@ export class TerminalLinkQuickpick extends DisposableStore {
const link = item.link;
this._previewItemInTerminal(link);
if (!('uri' in link) || !link.uri) {
if (!hasKey(link, { uri: true }) || !link.uri) {
return;
}

View File

@@ -7,6 +7,7 @@ import { deepStrictEqual } from 'assert';
import { ITerminalLinkDetector, TerminalLinkType } from '../../browser/links.js';
import { URI } from '../../../../../../base/common/uri.js';
import type { IBufferLine } from '@xterm/xterm';
import { hasKey } from '../../../../../../base/common/types.js';
export async function assertLinkHelper(
text: string,
@@ -40,7 +41,7 @@ export async function assertLinkHelper(
const expectedLinks = expected.map(e => {
return {
type: expectedType,
link: 'uri' in e ? e.uri.toString() : e.text,
link: hasKey(e, { uri: true }) ? e.uri.toString() : e.text,
bufferRange: {
start: { x: e.range[0][0], y: e.range[0][1] },
end: { x: e.range[1][0], y: e.range[1][1] },

View File

@@ -33,7 +33,7 @@ import { CodeActionKind } from '../../../../../editor/contrib/codeAction/common/
import { Codicon } from '../../../../../base/common/codicons.js';
import { ThemeIcon } from '../../../../../base/common/themables.js';
import { ICommandService } from '../../../../../platform/commands/common/commands.js';
import type { SingleOrMany } from '../../../../../base/common/types.js';
import { hasKey, type SingleOrMany } from '../../../../../base/common/types.js';
const enum QuickFixDecorationSelector {
QuickFix = 'quick-fix'
@@ -380,7 +380,7 @@ export async function getQuickFixesForCommand(
if (quickFixes) {
for (const quickFix of asArray(quickFixes)) {
let action: ITerminalAction | undefined;
if ('type' in quickFix) {
if (hasKey(quickFix, { type: true })) {
switch (quickFix.type) {
case TerminalQuickFixType.TerminalCommand: {
const fix = quickFix as ITerminalQuickFixTerminalCommandAction;
@@ -536,7 +536,7 @@ function getQuickFixIcon(quickFix: TerminalQuickFixItem): ThemeIcon {
}
switch (quickFix.type) {
case TerminalQuickFixType.Opener:
if ('uri' in quickFix.action && quickFix.action.uri) {
if (quickFix.action.uri) {
const isUrl = (quickFix.action.uri.scheme === Schemas.http || quickFix.action.uri.scheme === Schemas.https);
return isUrl ? Codicon.linkExternal : Codicon.goToFile;
}

View File

@@ -38,7 +38,10 @@ export const terminalSendSequenceCommand = async (accessor: ServicesAccessor, ar
const instance = terminalService.activeInstance;
if (instance) {
let text = isObject(args) && 'text' in args ? toOptionalString(args.text) : undefined;
function isTextArg(obj: unknown): obj is { text: string } {
return isObject(obj) && 'text' in obj;
}
let text = isTextArg(args) ? toOptionalString(args.text) : undefined;
// If no text provided, prompt user for input and process special characters
if (!text) {

View File

@@ -45,7 +45,10 @@ registerTerminalAction({
return;
}
let signal = isObject(args) && 'signal' in args ? toOptionalString(args.signal) : undefined;
function isSignalArg(obj: unknown): obj is { signal: string } {
return isObject(obj) && 'signal' in obj;
}
let signal = isSignalArg(args) ? toOptionalString(args.signal) : undefined;
if (!signal) {
const signalOptions: QuickPickItem[] = [

View File

@@ -20,7 +20,7 @@ import { IContextKeyService } from '../../../../../platform/contextkey/common/co
import { IContextMenuService } from '../../../../../platform/contextview/browser/contextView.js';
import { IKeybindingService } from '../../../../../platform/keybinding/common/keybinding.js';
import { ICommandDetectionCapability, ITerminalCommand } from '../../../../../platform/terminal/common/capabilities/capabilities.js';
import { ICurrentPartialCommand } from '../../../../../platform/terminal/common/capabilities/commandDetection/terminalCommand.js';
import { ICurrentPartialCommand, isFullTerminalCommand } from '../../../../../platform/terminal/common/capabilities/commandDetection/terminalCommand.js';
import { IThemeService } from '../../../../../platform/theme/common/themeService.js';
import { ITerminalConfigurationService, ITerminalInstance, IXtermColorProvider, IXtermTerminal } from '../../../terminal/browser/terminal.js';
import { openContextMenu } from '../../../terminal/browser/terminalContextMenu.js';
@@ -235,7 +235,7 @@ export class TerminalStickyScrollOverlay extends Disposable {
}
// Partial command
if (!('marker' in command)) {
if (!isFullTerminalCommand(command)) {
const partialCommand = this._commandDetection.currentCommand;
if (partialCommand?.commandStartMarker && partialCommand.commandExecutedMarker) {
this._updateContent(partialCommand, partialCommand.commandStartMarker);
@@ -279,7 +279,7 @@ export class TerminalStickyScrollOverlay extends Disposable {
// of the sticky overlay because we do not want to show any content above the bounds of the
// original terminal. This is done because it seems like scrolling flickers more when a
// partial line can be drawn on the top.
const isPartialCommand = !('getOutput' in command);
const isPartialCommand = !isFullTerminalCommand(command);
const rowOffset = !isPartialCommand && command.endMarker ? Math.max(buffer.viewportY - command.endMarker.line + 1, 0) : 0;
const maxLineCount = Math.min(this._rawMaxLineCount, Math.floor(xterm.rows * Constants.StickyScrollPercentageCap));
const stickyScrollLineCount = Math.min(promptRowCount + commandRowCount - 1, maxLineCount) - rowOffset;

View File

@@ -175,7 +175,7 @@ export class TerminalCompletionService extends Disposable implements ITerminalCo
const providerConfig: { [key: string]: boolean } = this._configurationService.getValue(TerminalSuggestSettingId.Providers);
return providers.filter(p => {
const providerId = p.id;
return providerId && (!(providerId in providerConfig) || providerConfig[providerId] !== false);
return providerId && (!Object.prototype.hasOwnProperty.call(providerConfig, providerId) || providerConfig[providerId] !== false);
});
}