Skip to content

Commit f4a5179

Browse files
committed
feat: add volar.takeOverMode.extension setting to handle multiple takeOverMode extensions
1 parent 79ee943 commit f4a5179

File tree

8 files changed

+54
-38
lines changed

8 files changed

+54
-38
lines changed

angular-language-tools/vscode-angular/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,11 @@ We have only one stubborn way to setup (that has the best performance) because t
3333

3434
2. Right click and select "Disable (Workspace)"
3535

36-
3. Create / Open `.vscode/settings.json` in workspace and put following setting to avoid "Vue Language Features (Volar)" auto active with takeover mode
36+
3. Create / Open `.vscode/settings.json` in workspace and put following setting.
3737

3838
```json
3939
{
40-
"volar.takeOverMode.enabled": false
40+
"volar.takeOverMode.extension": "johnsoncodehk.vscode-angular"
4141
}
4242
```
4343

angular-language-tools/vscode-angular/package.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,11 @@
6464
"type": "object",
6565
"title": "Volar-Angular",
6666
"properties": {
67+
"volar.takeOverMode.extension": {
68+
"type": "string",
69+
"default": "johnsoncodehk.vscode-angular",
70+
"description": "The extension that take over language support for *.ts."
71+
},
6772
"volar-angular-language-server.trace.server": {
6873
"scope": "window",
6974
"type": "string",

angular-language-tools/vscode-angular/src/client.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
registerShowVirtualFiles,
77
registerTsConfig,
88
registerTsVersion,
9+
takeOverModeActive,
910
} from '@volar/vscode-language-client';
1011
import * as os from 'os';
1112
import * as fs from 'fs';
@@ -14,6 +15,26 @@ let client: lsp.BaseLanguageClient;
1415

1516
export async function activate(context: vscode.ExtensionContext) {
1617

18+
const stopCheck = vscode.window.onDidChangeActiveTextEditor(tryActivate);
19+
tryActivate();
20+
21+
function tryActivate() {
22+
23+
if (!vscode.window.activeTextEditor) {
24+
return;
25+
}
26+
27+
const currentLangId = vscode.window.activeTextEditor.document.languageId;
28+
const takeOverMode = takeOverModeActive(context);
29+
if (takeOverMode && ['javascript', 'typescript', 'javascriptreact', 'typescriptreact', 'html'].includes(currentLangId)) {
30+
doActivate(context);
31+
stopCheck.dispose();
32+
}
33+
}
34+
}
35+
36+
async function doActivate(context: vscode.ExtensionContext) {
37+
1738
const cancellationPipeName = path.join(os.tmpdir() as path.OsPath, `vscode-${context.extension.id}-cancellation-pipe.tmp` as path.PosixPath);
1839
const isSupportDoc = (document: vscode.TextDocument) => documentSelector.some(selector => selector.language === document.languageId);
1940
let cancellationPipeUpdateKey: string | undefined;

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,12 @@
99
"watch:typescript-vue-plugin": "cd ./vue-language-tools/vscode-typescript-vue-plugin && npm run watch",
1010
"prerelease": "npm run build && npm run test",
1111
"version:test": "lerna version --exact --force-publish --yes --sync-workspace-lock --no-push --no-git-tag-version",
12-
"release": "npm run release:base && npm run release:vue && npm run release:pug && npm run release:typescript-vue-plugin",
12+
"release": "npm run release:base && npm run release:vue && npm run release:pug && npm run release:angular && npm run release:typescript-vue-plugin",
1313
"release:base": "lerna publish --exact --force-publish --yes --sync-workspace-lock",
1414
"release:base-next": "lerna publish --exact --force-publish --yes --sync-workspace-lock --dist-tag next",
1515
"release:vue": "cd ./vue-language-tools/vscode-vue && npm run release",
1616
"release:pug": "cd ./pug-language-tools/vscode-pug && npm run release",
17+
"release:angular": "cd ./angular-language-tools/vscode-angular && npm run release",
1718
"release:typescript-vue-plugin": "cd ./vue-language-tools/vscode-typescript-vue-plugin && npm run release",
1819
"test": "vitest run",
1920
"docs:dev": "cd docs && npm run dev",

packages/vscode-language-client/src/index.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import * as vscode from 'vscode';
2+
13
export { register as registerAutoInsertion } from './features/autoInsertion';
24
export { register as registerShowVirtualFiles } from './features/showVirtualFiles';
35
export { register as registerWriteVirtualFiles } from './features/writeVirtualFiles';
@@ -8,3 +10,10 @@ export { register as registerTsConfig } from './features/tsconfig';
810
export { register as registerShowReferences } from './features/showReferences';
911
export { register as registerServerSys } from './features/serverSys';
1012
export { register as registerTsVersion, getTsdk } from './features/tsVersion';
13+
14+
export function takeOverModeActive(context: vscode.ExtensionContext) {
15+
if (vscode.workspace.getConfiguration('volar').get<string>('takeOverMode.extension') === context.extension.id) {
16+
return !vscode.extensions.getExtension('vscode.typescript-language-features');
17+
}
18+
return false;
19+
}

vue-language-tools/vscode-vue/package.json

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -420,7 +420,7 @@
420420
"items": {
421421
"type": "string"
422422
},
423-
"default": [],
423+
"default": [ ],
424424
"description": "List any additional file extensions that should be processed as Vue files (requires restart)."
425425
},
426426
"volar.codeLens.references": {
@@ -526,21 +526,10 @@
526526
}
527527
}
528528
},
529-
"volar.takeOverMode.enabled": {
530-
"type": [
531-
"boolean",
532-
"string"
533-
],
534-
"enum": [
535-
"auto",
536-
false
537-
],
538-
"enumDescriptions": [
539-
"Auto enable take over mode when built-in TS extension disabled.",
540-
"Never enable take over mode."
541-
],
542-
"default": "auto",
543-
"description": "Take over language support for *.ts."
529+
"volar.takeOverMode.extension": {
530+
"type": "string",
531+
"default": "Vue.volar",
532+
"description": "The extension that take over language support for *.ts."
544533
},
545534
"volar.completion.preferredTagNameCase": {
546535
"type": "string",

vue-language-tools/vscode-vue/src/common.ts

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
registerServerSys,
1111
registerTsVersion,
1212
getTsdk,
13+
takeOverModeActive,
1314
} from '@volar/vscode-language-client';
1415
import { DiagnosticModel, ServerMode, VueServerInitializationOptions } from '@volar/vue-language-server';
1516
import * as vscode from 'vscode';
@@ -56,7 +57,7 @@ export async function activate(context: vscode.ExtensionContext, createLc: Creat
5657
stopCheck.dispose();
5758
}
5859

59-
const takeOverMode = takeOverModeEnabled();
60+
const takeOverMode = takeOverModeActive(context);
6061
if (takeOverMode && ['javascript', 'typescript', 'javascriptreact', 'typescriptreact'].includes(currentLangId)) {
6162
doActivate(context, createLc);
6263
stopCheck.dispose();
@@ -71,15 +72,15 @@ async function doActivate(context: vscode.ExtensionContext, createLc: CreateLang
7172
semanticClient = createLc(
7273
'vue-semantic-server',
7374
'Vue Semantic Server',
74-
getDocumentSelector(ServerMode.Semantic),
75+
getDocumentSelector(context, ServerMode.Semantic),
7576
getInitializationOptions(ServerMode.Semantic, context),
7677
getFillInitializeParams([LanguageFeaturesKind.Semantic]),
7778
6009,
7879
);
7980
syntacticClient = createLc(
8081
'vue-syntactic-server',
8182
'Vue Syntactic Server',
82-
getDocumentSelector(ServerMode.Syntactic),
83+
getDocumentSelector(context, ServerMode.Syntactic),
8384
getInitializationOptions(ServerMode.Syntactic, context),
8485
getFillInitializeParams([LanguageFeaturesKind.Syntactic]),
8586
6011,
@@ -113,7 +114,7 @@ async function doActivate(context: vscode.ExtensionContext, createLc: CreateLang
113114
|| (processMd() && document.languageId === 'markdown')
114115
|| (processHtml() && document.languageId === 'html')
115116
|| (
116-
takeOverModeEnabled()
117+
takeOverModeActive(context)
117118
&& ['javascript', 'typescript', 'javascriptreact', 'typescriptreact'].includes(document.languageId)
118119
);
119120
},
@@ -126,14 +127,12 @@ async function doActivate(context: vscode.ExtensionContext, createLc: CreateLang
126127
|| (processMd() && document.languageId === 'markdown')
127128
|| (processHtml() && document.languageId === 'html')
128129
|| (
129-
takeOverModeEnabled()
130+
takeOverModeActive(context)
130131
&& ['javascript', 'typescript', 'javascriptreact', 'typescriptreact'].includes(document.languageId)
131132
);
132133
},
133134
text => {
134-
if (takeOverModeEnabled()) {
135-
text += ' (vue)';
136-
}
135+
text += ' (vue)';
137136
if (noProjectReferences()) {
138137
text += ' (noProjectReferences)';
139138
}
@@ -191,16 +190,8 @@ export function deactivate(): Thenable<any> | undefined {
191190
]);
192191
}
193192

194-
export function takeOverModeEnabled() {
195-
const status = vscode.workspace.getConfiguration('volar').get<false | 'auto'>('takeOverMode.enabled');
196-
if (status /* true | 'auto' */) {
197-
return !vscode.extensions.getExtension('vscode.typescript-language-features');
198-
}
199-
return false;
200-
}
201-
202-
export function getDocumentSelector(serverMode: ServerMode) {
203-
const takeOverMode = takeOverModeEnabled();
193+
export function getDocumentSelector(context: vscode.ExtensionContext, serverMode: ServerMode) {
194+
const takeOverMode = takeOverModeActive(context);
204195
const langs = takeOverMode ? [
205196
'vue',
206197
'javascript',

vue-language-tools/vscode-vue/src/nodeClientMain.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import * as preview from './features/preview';
1111
export function activate(context: vscode.ExtensionContext) {
1212

1313
const cancellationPipeName = path.join(os.tmpdir(), `vscode-${context.extension.id}-cancellation-pipe.tmp`);
14-
const langs = getDocumentSelector(ServerMode.Semantic);
14+
const langs = getDocumentSelector(context, ServerMode.Semantic);
1515
let cancellationPipeUpdateKey: string | undefined;
1616

1717
vscode.workspace.onDidChangeTextDocument((e) => {

0 commit comments

Comments
 (0)