Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor(tsc): rework based on first-party TS API #3795

Merged
merged 4 commits into from
Dec 12, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion extensions/vscode/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -688,7 +688,7 @@
"devDependencies": {
"@types/semver": "^7.5.3",
"@types/vscode": "^1.82.0",
"@volar/vscode": "2.0.0-alpha.3",
"@volar/vscode": "2.0.0-alpha.4",
"@vue/language-core": "1.8.25",
"@vue/language-server": "1.8.25",
"esbuild": "latest",
Expand Down
10 changes: 1 addition & 9 deletions extensions/vscode/src/common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -70,14 +70,6 @@ async function doActivate(context: vscode.ExtensionContext, createLc: CreateLang
// doctor.register(context, client);
// componentMeta.register(context, client);

const supportedLanguages: Record<string, boolean> = {
vue: true,
markdown: true,
javascript: true,
typescript: true,
javascriptreact: true,
typescriptreact: true,
};
const selectors: vscode.DocumentFilter[] = [{ language: 'vue' }];

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

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

Expand Down
7 changes: 3 additions & 4 deletions extensions/vscode/src/nodeClientMain.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,7 @@ import * as fs from 'fs';

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

const languageClients: lsp.LanguageClient[] = [];

let languageClient: lsp.LanguageClient;
let serverPathStatusItem: vscode.StatusBarItem | undefined;

await commonActivate(context, (
Expand Down Expand Up @@ -110,7 +109,7 @@ export async function activate(context: vscode.ExtensionContext) {
);
client.start();

languageClients.push(client);
languageClient = client;

updateProviders(client);

Expand Down Expand Up @@ -149,7 +148,7 @@ export async function activate(context: vscode.ExtensionContext) {
volarLabs: {
version: supportLabsVersion,
codegenStackSupport: true,
languageClients,
languageClient: languageClient!,
languageServerProtocol: serverLib,
},
} satisfies ExportsInfoForLabs;
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
"devDependencies": {
"@lerna-lite/cli": "latest",
"@lerna-lite/publish": "latest",
"@volar/language-service": "2.0.0-alpha.3",
"@volar/language-service": "2.0.0-alpha.4",
"typescript": "latest",
"vite": "latest",
"vitest": "latest"
Expand Down
2 changes: 1 addition & 1 deletion packages/component-meta/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
"directory": "packages/component-meta"
},
"dependencies": {
"@volar/typescript": "2.0.0-alpha.3",
"@volar/typescript": "2.0.0-alpha.4",
"@vue/language-core": "1.8.25",
"path-browserify": "^1.0.1",
"vue-component-type-helpers": "1.8.25"
Expand Down
4 changes: 1 addition & 3 deletions packages/component-meta/src/base.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import type * as ts from 'typescript/lib/tsserverlibrary';
import * as path from 'path-browserify';
import { code as typeHelpersCode } from 'vue-component-type-helpers';
import { code as vue2TypeHelpersCode } from 'vue-component-type-helpers/vue2';
import { createLanguage, decorateLanguageService } from '@volar/typescript';
import { createLanguage } from '@volar/typescript';

import type {
MetaCheckerOptions,
Expand Down Expand Up @@ -164,8 +164,6 @@ export function baseCreate(
const { languageServiceHost } = language.typescript!;
const tsLs = ts.createLanguageService(languageServiceHost);

decorateLanguageService(language.files, tsLs, false);

if (checkerOptions.forceUseTs) {
const getScriptKind = languageServiceHost.getScriptKind?.bind(languageServiceHost);
languageServiceHost.getScriptKind = (fileName) => {
Expand Down
2 changes: 1 addition & 1 deletion packages/language-core/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
"directory": "packages/language-core"
},
"dependencies": {
"@volar/language-core": "2.0.0-alpha.3",
"@volar/language-core": "2.0.0-alpha.4",
"@vue/compiler-dom": "^3.3.0",
"@vue/shared": "^3.3.0",
"computeds": "^0.0.1",
Expand Down
4 changes: 2 additions & 2 deletions packages/language-core/src/generators/script.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ export function* generate(
generic: undefined,
genericOffset: 0,
attrs: {},
ast: ts.createSourceFile('', '', ts.ScriptTarget.Latest, false, ts.ScriptKind.TS),
ast: ts.createSourceFile('', '', 99 satisfies ts.ScriptTarget.Latest, false, ts.ScriptKind.TS),
};
scriptSetupRanges = {
bindings: [],
Expand Down Expand Up @@ -1013,7 +1013,7 @@ type __VLS_NormalizeEmits<T> = __VLS_Prettify<
for (const [segment, offset, onlyError] of eachInterpolationSegment(
ts,
cssBind.text,
ts.createSourceFile('/a.txt', cssBind.text, ts.ScriptTarget.ESNext),
ts.createSourceFile('/a.txt', cssBind.text, 99 satisfies ts.ScriptTarget.ESNext),
emptyLocalVars,
cssIds,
vueCompilerOptions,
Expand Down
12 changes: 6 additions & 6 deletions packages/language-core/src/generators/template.ts
Original file line number Diff line number Diff line change
Expand Up @@ -575,7 +575,7 @@ export function* generate(
if (leftExpressionRange && leftExpressionText) {

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

for (const varName of forBlockVars)
localVars.set(varName, (localVars.get(varName) ?? 0) + 1);
Expand Down Expand Up @@ -871,7 +871,7 @@ export function* generate(
);

const slotAst = createTsAst(slotDir, `(${slotDir.exp.content}) => {}`);
collectVars(ts, slotAst, slotBlockVars);
collectVars(ts, slotAst, slotAst, slotBlockVars);
hasProps = true;
if (slotDir.exp.content.indexOf(':') === -1) {
yield _ts('const [');
Expand Down Expand Up @@ -1093,10 +1093,10 @@ export function* generate(
const ast = createTsAst(prop.exp, prop.exp.content);
let isCompoundExpression = true;

if (ast.getChildCount() === 2) { // with EOF
ast.forEachChild(child_1 => {
if (ast.statements.length === 1) {
ts.forEachChild(ast, child_1 => {
if (ts.isExpressionStatement(child_1)) {
child_1.forEachChild(child_2 => {
ts.forEachChild(child_1, child_2 => {
if (ts.isArrowFunction(child_2)) {
isCompoundExpression = false;
}
Expand Down Expand Up @@ -1902,7 +1902,7 @@ export function* generate(
function createTsAst(astHolder: any, text: string) {
if (astHolder.__volar_ast_text !== text) {
astHolder.__volar_ast_text = text;
astHolder.__volar_ast = ts.createSourceFile('/a.ts', text, ts.ScriptTarget.ESNext);
astHolder.__volar_ast = ts.createSourceFile('/a.ts', text, 99 satisfies ts.ScriptTarget.ESNext);
}
return astHolder.__volar_ast as ts.SourceFile;
}
Expand Down
20 changes: 13 additions & 7 deletions packages/language-core/src/parsers/scriptRanges.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { TextRange } from '../types';
import type * as ts from 'typescript/lib/tsserverlibrary';
import { getStartEnd, parseBindingRanges } from './scriptSetupRanges';
import { getNodeText, getStartEnd, parseBindingRanges } from './scriptSetupRanges';

export interface ScriptRanges extends ReturnType<typeof parseScriptRanges> { }

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

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

ast.forEachChild(raw => {
ts.forEachChild(ast, raw => {

if (ts.isExportAssignment(raw)) {

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

Expand All @@ -39,12 +39,13 @@ export function parseScriptRanges(ts: typeof import('typescript/lib/tsserverlibr
if (obj) {
let componentsOptionNode: ts.ObjectLiteralExpression | undefined;
let nameOptionNode: ts.Expression | undefined;
obj.forEachChild(node => {
ts.forEachChild(obj, node => {
if (ts.isPropertyAssignment(node) && ts.isIdentifier(node.name)) {
if (node.name.escapedText === 'components' && ts.isObjectLiteralExpression(node.initializer)) {
const name = getNodeText(ts, node.name, ast);
if (name === 'components' && ts.isObjectLiteralExpression(node.initializer)) {
componentsOptionNode = node.initializer;
}
if (node.name.escapedText === 'name') {
if (name === 'name') {
nameOptionNode = node.initializer;
}
}
Expand All @@ -68,6 +69,11 @@ export function parseScriptRanges(ts: typeof import('typescript/lib/tsserverlibr
};

function _getStartEnd(node: ts.Node) {
return getStartEnd(node, ast);
return getStartEnd(ts, node, ast);
}

// isAsExpression is missing in tsc
function isAsExpression(node: ts.Node): node is ts.AsExpression {
return node.kind === ts.SyntaxKind.AsExpression;
}
}
Loading