diff --git a/eslint.config.js b/eslint.config.js index 03f2ebcab48..3d3e6adce82 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -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', diff --git a/src/vs/workbench/contrib/terminalContrib/accessibility/browser/terminal.accessibility.contribution.ts b/src/vs/workbench/contrib/terminalContrib/accessibility/browser/terminal.accessibility.contribution.ts index eea2f252247..0888d1098d1 100644 --- a/src/vs/workbench/contrib/terminalContrib/accessibility/browser/terminal.accessibility.contribution.ts +++ b/src/vs/workbench/contrib/terminalContrib/accessibility/browser/terminal.accessibility.contribution.ts @@ -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) { diff --git a/src/vs/workbench/contrib/terminalContrib/accessibility/browser/terminalAccessibleBufferProvider.ts b/src/vs/workbench/contrib/terminalContrib/accessibility/browser/terminalAccessibleBufferProvider.ts index 6dcf9cb114b..2796901804d 100644 --- a/src/vs/workbench/contrib/terminalContrib/accessibility/browser/terminalAccessibleBufferProvider.ts +++ b/src/vs/workbench/contrib/terminalContrib/accessibility/browser/terminalAccessibleBufferProvider.ts @@ -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) { diff --git a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminal.initialHint.contribution.ts b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminal.initialHint.contribution.ts index 996b5c18ccb..4b1d9133a6d 100644 --- a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminal.initialHint.contribution.ts +++ b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminal.initialHint.contribution.ts @@ -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 diff --git a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatActions.ts b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatActions.ts index 345b0114c7a..a84ef2dc2e2 100644 --- a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatActions.ts +++ b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatActions.ts @@ -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(); } }); diff --git a/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/commandLineAutoApprover.ts b/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/commandLineAutoApprover.ts index b48404a18d5..fd0be4041a1 100644 --- a/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/commandLineAutoApprover.ts +++ b/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/commandLineAutoApprover.ts @@ -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)[key], value) ); function checkTarget(inspectValue: Readonly | undefined): boolean { return ( isObject(inspectValue) && - key in inspectValue && + Object.prototype.hasOwnProperty.call(inspectValue, key) && structuralEquals((inspectValue as Record)[key], value) ); } diff --git a/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/toolTerminalCreator.ts b/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/toolTerminalCreator.ts index a018f0aeddb..2a7c9e68f3e 100644 --- a/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/toolTerminalCreator.ts +++ b/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/toolTerminalCreator.ts @@ -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); } diff --git a/src/vs/workbench/contrib/terminalContrib/commandGuide/browser/terminal.commandGuide.contribution.ts b/src/vs/workbench/contrib/terminalContrib/commandGuide/browser/terminal.commandGuide.contribution.ts index 7cee08a3e17..b89f7fa5c09 100644 --- a/src/vs/workbench/contrib/terminalContrib/commandGuide/browser/terminal.commandGuide.contribution.ts +++ b/src/vs/workbench/contrib/terminalContrib/commandGuide/browser/terminal.commandGuide.contribution.ts @@ -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); diff --git a/src/vs/workbench/contrib/terminalContrib/history/browser/terminalRunRecentQuickPick.ts b/src/vs/workbench/contrib/terminalContrib/history/browser/terminalRunRecentQuickPick.ts index 51cd32ab0dd..ac08ab943b7 100644 --- a/src/vs/workbench/contrib/terminalContrib/history/browser/terminalRunRecentQuickPick.ts +++ b/src/vs/workbench/contrib/terminalContrib/history/browser/terminalRunRecentQuickPick.ts @@ -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; diff --git a/src/vs/workbench/contrib/terminalContrib/links/browser/terminalLinkQuickpick.ts b/src/vs/workbench/contrib/terminalContrib/links/browser/terminalLinkQuickpick.ts index cc283a47d74..d55f98ce35f 100644 --- a/src/vs/workbench/contrib/terminalContrib/links/browser/terminalLinkQuickpick.ts +++ b/src/vs/workbench/contrib/terminalContrib/links/browser/terminalLinkQuickpick.ts @@ -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; } diff --git a/src/vs/workbench/contrib/terminalContrib/links/test/browser/linkTestUtils.ts b/src/vs/workbench/contrib/terminalContrib/links/test/browser/linkTestUtils.ts index ce8108e722f..159fb694710 100644 --- a/src/vs/workbench/contrib/terminalContrib/links/test/browser/linkTestUtils.ts +++ b/src/vs/workbench/contrib/terminalContrib/links/test/browser/linkTestUtils.ts @@ -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] }, diff --git a/src/vs/workbench/contrib/terminalContrib/quickFix/browser/quickFixAddon.ts b/src/vs/workbench/contrib/terminalContrib/quickFix/browser/quickFixAddon.ts index 80f3997736d..06dd0578137 100644 --- a/src/vs/workbench/contrib/terminalContrib/quickFix/browser/quickFixAddon.ts +++ b/src/vs/workbench/contrib/terminalContrib/quickFix/browser/quickFixAddon.ts @@ -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; } diff --git a/src/vs/workbench/contrib/terminalContrib/sendSequence/browser/terminal.sendSequence.contribution.ts b/src/vs/workbench/contrib/terminalContrib/sendSequence/browser/terminal.sendSequence.contribution.ts index caaea9837e5..69c2db5c833 100644 --- a/src/vs/workbench/contrib/terminalContrib/sendSequence/browser/terminal.sendSequence.contribution.ts +++ b/src/vs/workbench/contrib/terminalContrib/sendSequence/browser/terminal.sendSequence.contribution.ts @@ -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) { diff --git a/src/vs/workbench/contrib/terminalContrib/sendSignal/browser/terminal.sendSignal.contribution.ts b/src/vs/workbench/contrib/terminalContrib/sendSignal/browser/terminal.sendSignal.contribution.ts index 5891e34fdb6..c40cbc911c3 100644 --- a/src/vs/workbench/contrib/terminalContrib/sendSignal/browser/terminal.sendSignal.contribution.ts +++ b/src/vs/workbench/contrib/terminalContrib/sendSignal/browser/terminal.sendSignal.contribution.ts @@ -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[] = [ diff --git a/src/vs/workbench/contrib/terminalContrib/stickyScroll/browser/terminalStickyScrollOverlay.ts b/src/vs/workbench/contrib/terminalContrib/stickyScroll/browser/terminalStickyScrollOverlay.ts index 171a4ddf5b1..8bb60a711b0 100644 --- a/src/vs/workbench/contrib/terminalContrib/stickyScroll/browser/terminalStickyScrollOverlay.ts +++ b/src/vs/workbench/contrib/terminalContrib/stickyScroll/browser/terminalStickyScrollOverlay.ts @@ -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; diff --git a/src/vs/workbench/contrib/terminalContrib/suggest/browser/terminalCompletionService.ts b/src/vs/workbench/contrib/terminalContrib/suggest/browser/terminalCompletionService.ts index 4885f2f1650..d095b8375fd 100644 --- a/src/vs/workbench/contrib/terminalContrib/suggest/browser/terminalCompletionService.ts +++ b/src/vs/workbench/contrib/terminalContrib/suggest/browser/terminalCompletionService.ts @@ -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); }); }