Skip to content

Commit

Permalink
refactor: sync volar update [skip ci]
Browse files Browse the repository at this point in the history
  • Loading branch information
johnsoncodehk committed May 23, 2023
1 parent 99c5864 commit 24968e1
Show file tree
Hide file tree
Showing 14 changed files with 81 additions and 94 deletions.
2 changes: 0 additions & 2 deletions packages/vscode-vue/src/common.ts
Expand Up @@ -2,7 +2,6 @@ import {
activateAutoInsertion,
activateFindFileReferences,
activateReloadProjects,
activateServerStats,
activateServerSys,
activateTsConfigStatusItem,
activateTsVersionStatusItem,
Expand Down Expand Up @@ -115,7 +114,6 @@ async function doActivate(context: vscode.ExtensionContext, createLc: CreateLang
},
);
activateReloadProjects('volar.action.reloadProject', [semanticClient]);
activateServerStats('volar.action.serverStats', [semanticClient]);
activateTsVersionStatusItem('volar.selectTypeScriptVersion', context, semanticClient,
document => {
return document.languageId === 'vue'
Expand Down
2 changes: 1 addition & 1 deletion packages/vue-component-meta/package.json
Expand Up @@ -13,7 +13,7 @@
"directory": "packages/vue-component-meta"
},
"dependencies": {
"@volar/language-core": "1.6.9",
"@volar/typescript": "1.6.9",
"@vue/language-core": "1.7.8",
"typesafe-path": "^0.2.2",
"vue-component-type-helpers": "1.7.8"
Expand Down
12 changes: 6 additions & 6 deletions packages/vue-component-meta/src/index.ts
@@ -1,8 +1,8 @@
import * as vue from '@vue/language-core';
import { createLanguageContext } from '@volar/language-core';
import type * as ts from 'typescript/lib/tsserverlibrary';
import * as path from 'typesafe-path/posix';
import typeHelpersCode from 'vue-component-type-helpers';
import { createLanguageService } from '@volar/typescript';

import type {
MetaCheckerOptions,
Expand Down Expand Up @@ -156,7 +156,6 @@ export function baseCreate(
vueCompilerOptions,
ts,
) : [];
const core = createLanguageContext({ typescript: ts }, host, vueLanguages);
const proxyApis: Partial<ts.LanguageServiceHost> = checkerOptions.forceUseTs ? {
getScriptKind: (fileName) => {
if (fileName.endsWith('.vue.js')) {
Expand All @@ -165,18 +164,19 @@ export function baseCreate(
if (fileName.endsWith('.vue.jsx')) {
return ts.ScriptKind.TSX;
}
return core.typescript.languageServiceHost.getScriptKind!(fileName);
return host.getScriptKind!(fileName);
},
} : {};
const proxyHost = new Proxy(core.typescript.languageServiceHost, {
const proxyHost = new Proxy(host, {
get(target, propKey: keyof ts.LanguageServiceHost) {
if (propKey in proxyApis) {
return proxyApis[propKey];
}
return target[propKey];
}
});
const tsLs = ts.createLanguageService(proxyHost);
const core = vue.createLanguageContext(proxyHost, vueLanguages);
const tsLs = createLanguageService(core, ts);
let globalPropNames: string[] | undefined;

return {
Expand Down Expand Up @@ -432,7 +432,7 @@ function createSchemaResolvers(
symbolNode: ts.Expression,
{ rawType, schema: options, noDeclarations }: MetaCheckerOptions,
ts: typeof import('typescript/lib/tsserverlibrary'),
core: ReturnType<typeof createLanguageContext>,
core: vue.LanguageContext,
) {
const visited = new Set<ts.Type>();;

Expand Down
21 changes: 10 additions & 11 deletions packages/vue-language-server/src/languageServerPlugin.ts
Expand Up @@ -100,22 +100,22 @@ export function createServerPlugin(connection: Connection) {

connection.onRequest(DetectNameCasingRequest.type, async params => {
const languageService = await getService(params.textDocument.uri);
if (languageService?.context.typescript) {
if (languageService) {
return nameCasing.detect(ts, languageService.context, params.textDocument.uri);
}
});

connection.onRequest(GetConvertTagCasingEditsRequest.type, async params => {
const languageService = await getService(params.textDocument.uri);
if (languageService?.context.typescript) {
if (languageService) {
return nameCasing.convertTagName(ts, languageService.context, params.textDocument.uri, params.casing);
}
});

connection.onRequest(GetConvertAttrCasingEditsRequest.type, async params => {
const languageService = await getService(params.textDocument.uri);
if (languageService?.context.typescript) {
const vueOptions = hostToVueOptions.get(languageService.context.host);
if (languageService) {
const vueOptions = hostToVueOptions.get(languageService.context.core.host);
if (vueOptions) {
return nameCasing.convertAttrName(ts, languageService.context, params.textDocument.uri, params.casing);
}
Expand All @@ -127,20 +127,19 @@ export function createServerPlugin(connection: Connection) {
connection.onRequest(GetComponentMeta.type, async params => {

const languageService = await getService(params.uri);

if (!languageService?.context.typescript)
if (!languageService)
return;

let checker = checkers.get(languageService.context.host);
let checker = checkers.get(languageService.context.core.host);
if (!checker) {
checker = componentMeta.baseCreate(
languageService.context.host,
hostToVueOptions.get(languageService.context.host)!,
languageService.context.core.host,
hostToVueOptions.get(languageService.context.core.host)!,
{},
languageService.context.host.getCurrentDirectory() + '/tsconfig.json.global.vue',
languageService.context.core.host.getCurrentDirectory() + '/tsconfig.json.global.vue',
ts,
);
checkers.set(languageService.context.host, checker);
checkers.set(languageService.context.core.host, checker);
}
return checker.getComponentMeta(env.uriToFileName(params.uri));
});
Expand Down
1 change: 1 addition & 0 deletions packages/vue-language-service/package.json
Expand Up @@ -19,6 +19,7 @@
"dependencies": {
"@volar/language-core": "1.6.9",
"@volar/language-service": "1.6.9",
"@volar/typescript": "1.6.9",
"@vue/compiler-dom": "^3.3.0",
"@vue/language-core": "1.7.8",
"@vue/reactivity": "^3.3.0",
Expand Down
41 changes: 16 additions & 25 deletions packages/vue-language-service/src/ideFeatures/nameCasing.ts
Expand Up @@ -4,17 +4,15 @@ import { checkComponentNames, getTemplateTagsAndAttrs, checkPropsOfTag, checkNat
import * as vue from '@vue/language-core';
import type * as vscode from 'vscode-languageserver-protocol';
import { AttrNameCasing, TagNameCasing } from '../types';
import type { Provide } from 'volar-service-typescript';

export async function convertTagName(
ts: typeof import('typescript/lib/tsserverlibrary'),
context: ServiceContext,
context: ServiceContext<Provide>,
uri: string,
casing: TagNameCasing,
) {

if (!context.typescript)
return;

const rootFile = context.documents.getSourceByUri(uri)?.root;
if (!(rootFile instanceof vue.VueFile))
return;
Expand All @@ -23,11 +21,13 @@ export async function convertTagName(
if (!desc.template)
return;

const languageService = context.inject('typescript/languageService');
const languageServiceHost = context.inject('typescript/languageServiceHost');
const template = desc.template;
const document = context.documents.getDocumentByFileName(rootFile.snapshot, rootFile.fileName);
const edits: vscode.TextEdit[] = [];
const nativeTags = checkNativeTags(ts, context.typescript.languageService, context.typescript.languageServiceHost);
const components = checkComponentNames(ts, context.typescript.languageService, rootFile, nativeTags);
const nativeTags = checkNativeTags(ts, languageService, languageServiceHost);
const components = checkComponentNames(ts, languageService, rootFile, nativeTags);
const tags = getTemplateTagsAndAttrs(rootFile);

for (const [tagName, { offsets }] of tags) {
Expand Down Expand Up @@ -57,9 +57,6 @@ export async function convertAttrName(
casing: AttrNameCasing,
) {

if (!context.typescript)
return;

const rootFile = context.documents.getSourceByUri(uri)?.root;
if (!(rootFile instanceof vue.VueFile))
return;
Expand All @@ -68,17 +65,19 @@ export async function convertAttrName(
if (!desc.template)
return;

const languageService = context.inject('typescript/languageService');
const languageServiceHost = context.inject('typescript/languageServiceHost');
const template = desc.template;
const document = context.documents.getDocumentByFileName(rootFile.snapshot, rootFile.fileName);
const edits: vscode.TextEdit[] = [];
const nativeTags = checkNativeTags(ts, context.typescript.languageService, context.typescript.languageServiceHost);
const components = checkComponentNames(ts, context.typescript.languageService, rootFile, nativeTags);
const nativeTags = checkNativeTags(ts, languageService, languageServiceHost);
const components = checkComponentNames(ts, languageService, rootFile, nativeTags);
const tags = getTemplateTagsAndAttrs(rootFile);

for (const [tagName, { attrs }] of tags) {
const componentName = components.find(component => component === tagName || hyphenate(component) === tagName);
if (componentName) {
const props = checkPropsOfTag(ts, context.typescript.languageService, rootFile, componentName, nativeTags);
const props = checkPropsOfTag(ts, languageService, rootFile, componentName, nativeTags);
for (const [attrName, { offsets }] of attrs) {
const propName = props.find(prop => prop === attrName || hyphenate(prop) === attrName);
if (propName) {
Expand Down Expand Up @@ -130,13 +129,6 @@ export function detect(
attr: AttrNameCasing[],
} {

if (!context.typescript) {
return {
tag: [],
attr: [],
};
}

const rootFile = context.documents.getSourceByUri(uri)?.root;
if (!(rootFile instanceof vue.VueFile)) {
return {
Expand All @@ -145,6 +137,9 @@ export function detect(
};
}

const languageService = context.inject('typescript/languageService');
const languageServiceHost = context.inject('typescript/languageServiceHost');

return {
tag: getTagNameCase(rootFile),
attr: getAttrNameCase(rootFile),
Expand Down Expand Up @@ -176,12 +171,8 @@ export function detect(
}
function getTagNameCase(file: VirtualFile): TagNameCasing[] {

if (!context.typescript) {
return [];
}

const nativeTags = checkNativeTags(ts, context.typescript.languageService, context.typescript.languageServiceHost);
const components = checkComponentNames(ts, context.typescript.languageService, file, nativeTags);
const nativeTags = checkNativeTags(ts, languageService, languageServiceHost);
const components = checkComponentNames(ts, languageService, file, nativeTags);
const tagNames = getTemplateTagsAndAttrs(file);
const result: TagNameCasing[] = [];

Expand Down
1 change: 0 additions & 1 deletion packages/vue-language-service/src/languageService.ts
Expand Up @@ -125,7 +125,6 @@ function resolvePlugins(
const suffix = capitalize(ext.substring('.'.length)); // .vue -> Vue
if (
itemData?.uri
&& _context.typescript
&& item.textEdit?.newText.endsWith(suffix)
&& item.additionalTextEdits?.length === 1 && item.additionalTextEdits[0].newText.indexOf('import ' + item.textEdit.newText + ' from ') >= 0
&& (await _context.env.getConfiguration?.<boolean>('vue.complete.normalizeComponentImportName') ?? true)
Expand Down
@@ -1,19 +1,15 @@
import { AutoInsertionContext, Service } from '@volar/language-service';
import { AutoInsertionContext, Service, ServiceContext } from '@volar/language-service';
import { hyphenate } from '@vue/shared';
import type * as ts from 'typescript/lib/tsserverlibrary';
import type * as vscode from 'vscode-languageserver-protocol';
import type { TextDocument } from 'vscode-languageserver-textdocument';

const plugin: Service = (context, modules) => {
const plugin: Service = (context: ServiceContext<import('volar-service-typescript').Provide> | undefined, modules) => {

if (!modules?.typescript)
return {};

if (!context?.typescript)
return {};

const ts = modules.typescript;
const _ts = context.typescript;

return {

Expand All @@ -25,15 +21,15 @@ const plugin: Service = (context, modules) => {
if (!isCharacterTyping(document, insertContext))
return;

const enabled = await context.env.getConfiguration?.<boolean>('vue.autoInsert.dotValue') ?? true;
const enabled = await context!.env.getConfiguration?.<boolean>('vue.autoInsert.dotValue') ?? true;
if (!enabled)
return;

const program = _ts.languageService.getProgram();
const program = context!.inject('typescript/languageService').getProgram();
if (!program)
return;

const sourceFile = program.getSourceFile(context.env.uriToFileName(document.uri));
const sourceFile = program.getSourceFile(context!.env.uriToFileName(document.uri));
if (!sourceFile)
return;

Expand All @@ -44,9 +40,9 @@ const plugin: Service = (context, modules) => {
if (!node)
return;

const token = _ts.languageServiceHost.getCancellationToken?.();
const token = context!.inject('typescript/languageServiceHost').getCancellationToken?.();
if (token) {
_ts.languageService.getQuickInfoAtPosition(context.env.uriToFileName(document.uri), node.end);
context!.inject('typescript/languageService').getQuickInfoAtPosition(context!.env.uriToFileName(document.uri), node.end);
if (token?.isCancellationRequested()) {
return; // check cancel here because type checker do not use cancel token
}
Expand Down

0 comments on commit 24968e1

Please sign in to comment.