Skip to content

Commit c1f2b3f

Browse files
Merge pull request #3487 from Kilo-Org/eamon/MoreConsistent
Continue: Don't needlessly use the singleton pattern; and DO support disposal (at least better than previously)
2 parents f53add8 + 2b902d9 commit c1f2b3f

File tree

2 files changed

+23
-24
lines changed

2 files changed

+23
-24
lines changed

src/services/autocomplete/AutocompleteProvider.ts

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import { ContinueCompletionProvider } from "../continuedev/core/vscode-test-harn
1616
import OpenRouter from "../continuedev/core/llm/llms/OpenRouter"
1717

1818
export class AutocompleteProvider {
19-
private static instance: AutocompleteProvider | null = null
19+
private completionProviderDisposable: vscode.Disposable | null = null
2020
private model: AutocompleteModel
2121
private providerSettingsManager: ProviderSettingsManager
2222
private settings: GhostServiceSettings | null = null
@@ -29,7 +29,7 @@ export class AutocompleteProvider {
2929
// VSCode Providers
3030
public inlineCompletionProvider: any
3131

32-
private constructor(
32+
constructor(
3333
private context: vscode.ExtensionContext,
3434
private cline: ClineProvider,
3535
) {
@@ -40,21 +40,7 @@ export class AutocompleteProvider {
4040
void this.load()
4141
}
4242

43-
// Singleton Management
44-
public static initialize(context: vscode.ExtensionContext, cline: ClineProvider): AutocompleteProvider {
45-
if (AutocompleteProvider.instance) {
46-
throw new Error("AutocompleteProvider is already initialized. Use getInstance() instead.")
47-
}
48-
AutocompleteProvider.instance = new AutocompleteProvider(context, cline)
49-
return AutocompleteProvider.instance
50-
}
51-
52-
public static getInstance(): AutocompleteProvider {
53-
if (!AutocompleteProvider.instance) {
54-
throw new Error("AutocompleteProvider is not initialized. Call initialize() first.")
55-
}
56-
return AutocompleteProvider.instance
57-
}
43+
// Instance is created and managed by the registration function
5844

5945
// Settings Management
6046
private loadSettings() {
@@ -77,15 +63,21 @@ export class AutocompleteProvider {
7763

7864
private async loadCodeCompletion() {
7965
try {
66+
// Dispose any existing registration up front to keep logic centralized
67+
this.dispose()
68+
69+
// Decide whether the provider should be registered at all based on settings
70+
if (!this.settings?.enableAutoTrigger) {
71+
return
72+
}
73+
8074
// The model.reload() has already loaded the profile, so we can get the ILLM
8175
const llm = this.model.getILLM()
82-
8376
if (!llm) {
8477
console.warn("[AutocompleteProvider] No valid autocomplete provider found")
8578
return
8679
}
8780

88-
// Register the Continue completion provider with the selected LLM
8981
const minimalConfigProvider = new MinimalConfigProvider({
9082
selectedModelByRole: {
9183
autocomplete: llm,
@@ -94,9 +86,13 @@ export class AutocompleteProvider {
9486
const ide = new VsCodeIde(this.context)
9587
const usingFullFileDiff = false
9688
const continueProvider = new ContinueCompletionProvider(minimalConfigProvider, ide, usingFullFileDiff)
97-
this.context.subscriptions.push(
98-
vscode.languages.registerInlineCompletionItemProvider([{ pattern: "**" }], continueProvider),
89+
90+
// Register provider and hold onto disposable to prevent duplicates
91+
this.completionProviderDisposable = vscode.languages.registerInlineCompletionItemProvider(
92+
[{ pattern: "**" }],
93+
continueProvider,
9994
)
95+
this.context.subscriptions.push(this.completionProviderDisposable)
10096

10197
console.log("[AutocompleteProvider] Successfully registered autocomplete")
10298
} catch (error) {
@@ -150,9 +146,12 @@ export class AutocompleteProvider {
150146
}
151147

152148
/**
153-
* Dispose of all resources used by the GhostProvider
149+
* Dispose of all resources used by the AutocompleteProvider
154150
*/
155151
public dispose(): void {
156-
AutocompleteProvider.instance = null // Reset singleton
152+
if (this.completionProviderDisposable) {
153+
this.completionProviderDisposable.dispose()
154+
this.completionProviderDisposable = null
155+
}
157156
}
158157
}

src/services/autocomplete/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { AutocompleteProvider } from "./AutocompleteProvider"
44
import { ClineProvider } from "../../core/webview/ClineProvider"
55

66
export const registerAutocompleteProvider = (context: vscode.ExtensionContext, cline: ClineProvider) => {
7-
const ghost = AutocompleteProvider.initialize(context, cline)
7+
const ghost = new AutocompleteProvider(context, cline)
88
context.subscriptions.push(ghost)
99

1010
context.subscriptions.push(

0 commit comments

Comments
 (0)