diff --git a/package-lock.json b/package-lock.json index 08ce22f..694d8ec 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "source-doc", - "version": "0.2.1", + "version": "0.3.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "source-doc", - "version": "0.2.1", + "version": "0.3.0", "license": "MIT", "devDependencies": { "@types/glob": "^8.1.0", diff --git a/src/explanationProvider.ts b/src/explanationProvider.ts index f089275..8b8e142 100644 --- a/src/explanationProvider.ts +++ b/src/explanationProvider.ts @@ -78,13 +78,13 @@ export class ExplanationProvider implements vscode.Disposable { if (err instanceof vscode.LanguageModelError) { switch (err.code) { case 'NoPermissions': - throw new Error('Copilot access denied. Please check your GitHub Copilot subscription.'); + throw new Error(`Copilot error (${err.code}): access denied. Please check your GitHub Copilot subscription.`); case 'Blocked': - throw new Error('Copilot request was blocked. Please check your GitHub Copilot settings.'); + throw new Error(`Copilot error (${err.code}): request was blocked. Please check your GitHub Copilot settings.`); case 'NotFound': - throw new Error('Copilot model not found. Please check your GitHub Copilot extension.'); + throw new Error(`Copilot error (${err.code}): model not found. Please check your GitHub Copilot extension.`); case 'RequestFailed': - throw new Error('Copilot request failed. Please try again.'); + throw new Error(`Copilot error (${err.code}): request failed. Please try again.`); default: throw new Error(`Copilot error (${err.code}): ${err.message}. Please check your GitHub Copilot extension.`); } @@ -93,6 +93,9 @@ export class ExplanationProvider implements vscode.Disposable { } result = result.trim(); + if (token.isCancellationRequested) { + throw new vscode.CancellationError(); + } if (!result) { throw new Error('Copilot returned an empty explanation. Please try again.'); } diff --git a/src/extension.ts b/src/extension.ts index ae5141d..0b42d67 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -30,7 +30,13 @@ export function activate(context: vscode.ExtensionContext): void { ); // ── Register CodeLens provider for each configured language ────────────── - registerCodeLensProviders(context, codeLensProvider); + // Track ALL registrations in languageRegistrations (not context.subscriptions) + // so the full set can be disposed when sourceDoc.languages changes. + let languageRegistrations: vscode.Disposable[] = []; + registerCodeLensProviders(codeLensProvider, languageRegistrations); + + // Dispose the language registrations when the extension is deactivated. + context.subscriptions.push({ dispose: () => languageRegistrations.forEach(d => d.dispose()) }); // Refresh lenses when the user switches to a different editor tab context.subscriptions.push( @@ -43,14 +49,12 @@ export function activate(context: vscode.ExtensionContext): void { ); // Re-register providers when sourceDoc.languages changes - let languageRegistrations: vscode.Disposable[] = []; context.subscriptions.push( vscode.workspace.onDidChangeConfiguration(e => { if (e.affectsConfiguration('sourceDoc.languages')) { languageRegistrations.forEach(d => d.dispose()); languageRegistrations = []; - registerCodeLensProviders(context, codeLensProvider, languageRegistrations); - languageRegistrations.forEach(d => context.subscriptions.push(d)); + registerCodeLensProviders(codeLensProvider, languageRegistrations); } }), ); @@ -206,9 +210,8 @@ export function deactivate(): void { // ── Helpers ─────────────────────────────────────────────────────────────────── function registerCodeLensProviders( - context: vscode.ExtensionContext, provider: SourceDocCodeLensProvider, - into: vscode.Disposable[] = context.subscriptions as unknown as vscode.Disposable[], + into: vscode.Disposable[], ): void { const config = vscode.workspace.getConfiguration('sourceDoc'); const languages = config.get('languages') ?? [