|
5 | 5 |
|
6 | 6 | import { assertNever } from '../../../../../base/common/assert.js'; |
7 | 7 | import { AsyncIterableProducer } from '../../../../../base/common/async.js'; |
| 8 | +import { CachedFunction } from '../../../../../base/common/cache.js'; |
8 | 9 | import { CancellationToken, CancellationTokenSource } from '../../../../../base/common/cancellation.js'; |
9 | | -import { BugIndicatingError, onUnexpectedExternalError } from '../../../../../base/common/errors.js'; |
| 10 | +import { groupByMap } from '../../../../../base/common/collections.js'; |
| 11 | +import { BugIndicatingError, onUnexpectedError, onUnexpectedExternalError } from '../../../../../base/common/errors.js'; |
10 | 12 | import { Disposable, IDisposable } from '../../../../../base/common/lifecycle.js'; |
| 13 | +import { isDefined } from '../../../../../base/common/types.js'; |
| 14 | +import { URI } from '../../../../../base/common/uri.js'; |
11 | 15 | import { prefixedUuid } from '../../../../../base/common/uuid.js'; |
12 | 16 | import { ICommandService } from '../../../../../platform/commands/common/commands.js'; |
13 | 17 | import { ISingleEditOperation } from '../../../../common/core/editOperation.js'; |
14 | 18 | import { StringReplacement } from '../../../../common/core/edits/stringEdit.js'; |
15 | | -import { OffsetRange } from '../../../../common/core/ranges/offsetRange.js'; |
| 19 | +import { TextReplacement } from '../../../../common/core/edits/textEdit.js'; |
16 | 20 | import { Position } from '../../../../common/core/position.js'; |
17 | 21 | import { Range } from '../../../../common/core/range.js'; |
18 | | -import { TextReplacement } from '../../../../common/core/edits/textEdit.js'; |
19 | | -import { InlineCompletionEndOfLifeReason, InlineCompletionEndOfLifeReasonKind, InlineCompletion, InlineCompletionContext, InlineCompletions, InlineCompletionsProvider, PartialAcceptInfo, InlineCompletionsDisposeReason, LifetimeSummary, ProviderId, IInlineCompletionHint, InlineCompletionTriggerKind } from '../../../../common/languages.js'; |
| 22 | +import { OffsetRange } from '../../../../common/core/ranges/offsetRange.js'; |
| 23 | +import { IInlineCompletionHint, InlineCompletion, InlineCompletionContext, InlineCompletionEndOfLifeReason, InlineCompletionEndOfLifeReasonKind, InlineCompletions, InlineCompletionsDisposeReason, InlineCompletionsProvider, InlineCompletionTriggerKind, LifetimeSummary, PartialAcceptInfo, ProviderId } from '../../../../common/languages.js'; |
20 | 24 | import { ILanguageConfigurationService } from '../../../../common/languages/languageConfigurationRegistry.js'; |
21 | 25 | import { ITextModel } from '../../../../common/model.js'; |
22 | 26 | import { fixBracketsInLine } from '../../../../common/model/bracketPairsTextModelPart/fixBrackets.js'; |
| 27 | +import { EditDeltaInfo } from '../../../../common/textModelEditSource.js'; |
23 | 28 | import { SnippetParser, Text } from '../../../snippet/browser/snippetParser.js'; |
24 | 29 | import { ErrorResult, getReadonlyEmptyArray } from '../utils.js'; |
25 | | -import { groupByMap } from '../../../../../base/common/collections.js'; |
26 | | -import { DirectedGraph } from './graph.js'; |
27 | | -import { CachedFunction } from '../../../../../base/common/cache.js'; |
28 | 30 | import { InlineCompletionViewData, InlineCompletionViewKind } from '../view/inlineEdits/inlineEditsViewInterface.js'; |
29 | | -import { isDefined } from '../../../../../base/common/types.js'; |
30 | | -import { inlineCompletionIsVisible } from './inlineCompletionIsVisible.js'; |
31 | | -import { EditDeltaInfo } from '../../../../common/textModelEditSource.js'; |
32 | | -import { URI } from '../../../../../base/common/uri.js'; |
33 | 31 | import { InlineSuggestionEditKind } from './editKind.js'; |
| 32 | +import { DirectedGraph } from './graph.js'; |
| 33 | +import { inlineCompletionIsVisible } from './inlineCompletionIsVisible.js'; |
34 | 34 | import { InlineSuggestAlternativeAction } from './InlineSuggestAlternativeAction.js'; |
35 | 35 |
|
36 | 36 | export type InlineCompletionContextWithoutUuid = Omit<InlineCompletionContext, 'requestUuid'>; |
@@ -659,6 +659,12 @@ export class InlineSuggestionList { |
659 | 659 | item.reportEndOfLife(); |
660 | 660 | } |
661 | 661 | this.provider.disposeInlineCompletions(this.inlineSuggestions, reason); |
| 662 | + } else if (this.refCount < 0) { |
| 663 | + // Invariant: every addRef must be paired with exactly one removeRef. |
| 664 | + // Going negative means a removeRef without a matching addRef somewhere. |
| 665 | + onUnexpectedError(new BugIndicatingError( |
| 666 | + `InlineSuggestionList (provider=${this.provider.providerId?.toString()}) refCount went negative (${this.refCount}) — more removeRef than addRef calls.` |
| 667 | + )); |
662 | 668 | } |
663 | 669 | } |
664 | 670 | } |
|
0 commit comments