Skip to content

Commit fbabb96

Browse files
refactor(tsc): rework based on first-party TS API (#3795)
1 parent 7b47792 commit fbabb96

File tree

29 files changed

+294
-549
lines changed

29 files changed

+294
-549
lines changed

extensions/vscode/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -688,7 +688,7 @@
688688
"devDependencies": {
689689
"@types/semver": "^7.5.3",
690690
"@types/vscode": "^1.82.0",
691-
"@volar/vscode": "2.0.0-alpha.3",
691+
"@volar/vscode": "2.0.0-alpha.4",
692692
"@vue/language-core": "1.8.25",
693693
"@vue/language-server": "1.8.25",
694694
"esbuild": "latest",

extensions/vscode/src/common.ts

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -70,14 +70,6 @@ async function doActivate(context: vscode.ExtensionContext, createLc: CreateLang
7070
// doctor.register(context, client);
7171
// componentMeta.register(context, client);
7272

73-
const supportedLanguages: Record<string, boolean> = {
74-
vue: true,
75-
markdown: true,
76-
javascript: true,
77-
typescript: true,
78-
javascriptreact: true,
79-
typescriptreact: true,
80-
};
8173
const selectors: vscode.DocumentFilter[] = [{ language: 'vue' }];
8274

8375
if (config.server.petiteVue.supportHtmlFile) {
@@ -87,7 +79,7 @@ async function doActivate(context: vscode.ExtensionContext, createLc: CreateLang
8779
selectors.push({ language: 'markdown' });
8880
}
8981

90-
activateAutoInsertion([client], document => supportedLanguages[document.languageId]); // TODO: implement auto insert .value
82+
activateAutoInsertion(selectors, client); // TODO: implement auto insert .value
9183
activateDocumentDropEdit(selectors, client);
9284
activateWriteVirtualFiles('volar.action.writeVirtualFiles', client);
9385

extensions/vscode/src/nodeClientMain.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@ import * as fs from 'fs';
99

1010
export async function activate(context: vscode.ExtensionContext) {
1111

12-
const languageClients: lsp.LanguageClient[] = [];
13-
12+
let languageClient: lsp.LanguageClient;
1413
let serverPathStatusItem: vscode.StatusBarItem | undefined;
1514

1615
await commonActivate(context, (
@@ -110,7 +109,7 @@ export async function activate(context: vscode.ExtensionContext) {
110109
);
111110
client.start();
112111

113-
languageClients.push(client);
112+
languageClient = client;
114113

115114
updateProviders(client);
116115

@@ -149,7 +148,7 @@ export async function activate(context: vscode.ExtensionContext) {
149148
volarLabs: {
150149
version: supportLabsVersion,
151150
codegenStackSupport: true,
152-
languageClients,
151+
languageClient: languageClient!,
153152
languageServerProtocol: serverLib,
154153
},
155154
} satisfies ExportsInfoForLabs;

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
"devDependencies": {
2020
"@lerna-lite/cli": "latest",
2121
"@lerna-lite/publish": "latest",
22-
"@volar/language-service": "2.0.0-alpha.3",
22+
"@volar/language-service": "2.0.0-alpha.4",
2323
"typescript": "latest",
2424
"vite": "latest",
2525
"vitest": "latest"

packages/component-meta/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"directory": "packages/component-meta"
1414
},
1515
"dependencies": {
16-
"@volar/typescript": "2.0.0-alpha.3",
16+
"@volar/typescript": "2.0.0-alpha.4",
1717
"@vue/language-core": "1.8.25",
1818
"path-browserify": "^1.0.1",
1919
"vue-component-type-helpers": "1.8.25"

packages/component-meta/src/base.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import type * as ts from 'typescript/lib/tsserverlibrary';
33
import * as path from 'path-browserify';
44
import { code as typeHelpersCode } from 'vue-component-type-helpers';
55
import { code as vue2TypeHelpersCode } from 'vue-component-type-helpers/vue2';
6-
import { createLanguage, decorateLanguageService } from '@volar/typescript';
6+
import { createLanguage } from '@volar/typescript';
77

88
import type {
99
MetaCheckerOptions,
@@ -164,8 +164,6 @@ export function baseCreate(
164164
const { languageServiceHost } = language.typescript!;
165165
const tsLs = ts.createLanguageService(languageServiceHost);
166166

167-
decorateLanguageService(language.files, tsLs, false);
168-
169167
if (checkerOptions.forceUseTs) {
170168
const getScriptKind = languageServiceHost.getScriptKind?.bind(languageServiceHost);
171169
languageServiceHost.getScriptKind = (fileName) => {

packages/language-core/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"directory": "packages/language-core"
1414
},
1515
"dependencies": {
16-
"@volar/language-core": "2.0.0-alpha.3",
16+
"@volar/language-core": "2.0.0-alpha.4",
1717
"@vue/compiler-dom": "^3.3.0",
1818
"@vue/shared": "^3.3.0",
1919
"computeds": "^0.0.1",

packages/language-core/src/generators/script.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ export function* generate(
4545
generic: undefined,
4646
genericOffset: 0,
4747
attrs: {},
48-
ast: ts.createSourceFile('', '', ts.ScriptTarget.Latest, false, ts.ScriptKind.TS),
48+
ast: ts.createSourceFile('', '', 99 satisfies ts.ScriptTarget.Latest, false, ts.ScriptKind.TS),
4949
};
5050
scriptSetupRanges = {
5151
bindings: [],
@@ -1013,7 +1013,7 @@ type __VLS_NormalizeEmits<T> = __VLS_Prettify<
10131013
for (const [segment, offset, onlyError] of eachInterpolationSegment(
10141014
ts,
10151015
cssBind.text,
1016-
ts.createSourceFile('/a.txt', cssBind.text, ts.ScriptTarget.ESNext),
1016+
ts.createSourceFile('/a.txt', cssBind.text, 99 satisfies ts.ScriptTarget.ESNext),
10171017
emptyLocalVars,
10181018
cssIds,
10191019
vueCompilerOptions,

packages/language-core/src/generators/template.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -575,7 +575,7 @@ export function* generate(
575575
if (leftExpressionRange && leftExpressionText) {
576576

577577
const collectAst = createTsAst(node.parseResult, `const [${leftExpressionText}]`);
578-
collectVars(ts, collectAst, forBlockVars);
578+
collectVars(ts, collectAst, collectAst, forBlockVars);
579579

580580
for (const varName of forBlockVars)
581581
localVars.set(varName, (localVars.get(varName) ?? 0) + 1);
@@ -871,7 +871,7 @@ export function* generate(
871871
);
872872

873873
const slotAst = createTsAst(slotDir, `(${slotDir.exp.content}) => {}`);
874-
collectVars(ts, slotAst, slotBlockVars);
874+
collectVars(ts, slotAst, slotAst, slotBlockVars);
875875
hasProps = true;
876876
if (slotDir.exp.content.indexOf(':') === -1) {
877877
yield _ts('const [');
@@ -1093,10 +1093,10 @@ export function* generate(
10931093
const ast = createTsAst(prop.exp, prop.exp.content);
10941094
let isCompoundExpression = true;
10951095

1096-
if (ast.getChildCount() === 2) { // with EOF
1097-
ast.forEachChild(child_1 => {
1096+
if (ast.statements.length === 1) {
1097+
ts.forEachChild(ast, child_1 => {
10981098
if (ts.isExpressionStatement(child_1)) {
1099-
child_1.forEachChild(child_2 => {
1099+
ts.forEachChild(child_1, child_2 => {
11001100
if (ts.isArrowFunction(child_2)) {
11011101
isCompoundExpression = false;
11021102
}
@@ -1902,7 +1902,7 @@ export function* generate(
19021902
function createTsAst(astHolder: any, text: string) {
19031903
if (astHolder.__volar_ast_text !== text) {
19041904
astHolder.__volar_ast_text = text;
1905-
astHolder.__volar_ast = ts.createSourceFile('/a.ts', text, ts.ScriptTarget.ESNext);
1905+
astHolder.__volar_ast = ts.createSourceFile('/a.ts', text, 99 satisfies ts.ScriptTarget.ESNext);
19061906
}
19071907
return astHolder.__volar_ast as ts.SourceFile;
19081908
}

packages/language-core/src/parsers/scriptRanges.ts

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import type { TextRange } from '../types';
22
import type * as ts from 'typescript/lib/tsserverlibrary';
3-
import { getStartEnd, parseBindingRanges } from './scriptSetupRanges';
3+
import { getNodeText, getStartEnd, parseBindingRanges } from './scriptSetupRanges';
44

55
export interface ScriptRanges extends ReturnType<typeof parseScriptRanges> { }
66

@@ -17,12 +17,12 @@ export function parseScriptRanges(ts: typeof import('typescript/lib/tsserverlibr
1717

1818
const bindings = hasScriptSetup ? parseBindingRanges(ts, ast) : [];
1919

20-
ast.forEachChild(raw => {
20+
ts.forEachChild(ast, raw => {
2121

2222
if (ts.isExportAssignment(raw)) {
2323

2424
let node: ts.AsExpression | ts.ExportAssignment | ts.ParenthesizedExpression = raw;
25-
while (ts.isAsExpression(node.expression) || ts.isParenthesizedExpression(node.expression)) { // fix https://github.com/vuejs/language-tools/issues/1882
25+
while (isAsExpression(node.expression) || ts.isParenthesizedExpression(node.expression)) { // fix https://github.com/vuejs/language-tools/issues/1882
2626
node = node.expression;
2727
}
2828

@@ -39,12 +39,13 @@ export function parseScriptRanges(ts: typeof import('typescript/lib/tsserverlibr
3939
if (obj) {
4040
let componentsOptionNode: ts.ObjectLiteralExpression | undefined;
4141
let nameOptionNode: ts.Expression | undefined;
42-
obj.forEachChild(node => {
42+
ts.forEachChild(obj, node => {
4343
if (ts.isPropertyAssignment(node) && ts.isIdentifier(node.name)) {
44-
if (node.name.escapedText === 'components' && ts.isObjectLiteralExpression(node.initializer)) {
44+
const name = getNodeText(ts, node.name, ast);
45+
if (name === 'components' && ts.isObjectLiteralExpression(node.initializer)) {
4546
componentsOptionNode = node.initializer;
4647
}
47-
if (node.name.escapedText === 'name') {
48+
if (name === 'name') {
4849
nameOptionNode = node.initializer;
4950
}
5051
}
@@ -68,6 +69,11 @@ export function parseScriptRanges(ts: typeof import('typescript/lib/tsserverlibr
6869
};
6970

7071
function _getStartEnd(node: ts.Node) {
71-
return getStartEnd(node, ast);
72+
return getStartEnd(ts, node, ast);
73+
}
74+
75+
// isAsExpression is missing in tsc
76+
function isAsExpression(node: ts.Node): node is ts.AsExpression {
77+
return node.kind === ts.SyntaxKind.AsExpression;
7278
}
7379
}

0 commit comments

Comments
 (0)