Skip to content

Commit

Permalink
fix(language-core): getProjectVersion param has no effect
Browse files Browse the repository at this point in the history
  • Loading branch information
johnsoncodehk committed Jul 9, 2024
1 parent f6cf306 commit 519e916
Show file tree
Hide file tree
Showing 9 changed files with 53 additions and 60 deletions.
13 changes: 5 additions & 8 deletions packages/component-meta/lib/base.ts
Original file line number Diff line number Diff line change
Expand Up @@ -147,14 +147,11 @@ export function baseCreate(
const vueLanguagePlugin = vue.createVueLanguagePlugin<string>(
ts,
id => id,
() => projectHost.getProjectVersion?.() ?? '',
fileName => {
const fileMap = new vue.FileMap(ts.sys.useCaseSensitiveFileNames);
for (const vueFileName of projectHost.getScriptFileNames()) {
fileMap.set(vueFileName, undefined);
}
return fileMap.has(fileName);
},
vue.createRootFileChecker(
projectHost.getProjectVersion ? () => projectHost.getProjectVersion!() : undefined,
() => projectHost.getScriptFileNames(),
ts.sys.useCaseSensitiveFileNames
),
projectHost.getCompilationSettings(),
vueCompilerOptions
);
Expand Down
27 changes: 20 additions & 7 deletions packages/language-core/lib/languageModule.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/// <reference types="@volar/typescript" />

import { forEachEmbeddedCode, type LanguagePlugin } from '@volar/language-core';
import { FileMap, forEachEmbeddedCode, type LanguagePlugin } from '@volar/language-core';
import * as CompilerDOM from '@vue/compiler-dom';
import type * as ts from 'typescript';
import { getBasePlugins } from './plugins';
Expand Down Expand Up @@ -53,10 +53,28 @@ function getFileRegistryKey(
return JSON.stringify(values);
}

export function createRootFileChecker(
getProjectVersion: (() => string) | undefined,
getRootFileNames: () => string[],
caseSensitive: boolean
) {
const fileNames = new FileMap(caseSensitive);
let projectVersion: string | undefined;
return (fileName: string) => {
if (!getProjectVersion || projectVersion !== getProjectVersion()) {
projectVersion = getProjectVersion?.();
fileNames.clear();
for (const rootFileName of getRootFileNames()) {
fileNames.set(rootFileName, undefined);
}
}
return fileNames.has(fileName);
};
}

export function createVueLanguagePlugin<T>(
ts: typeof import('typescript'),
asFileName: (scriptId: T) => string,
getProjectVersion: () => string,
isRootFile: (fileName: string) => boolean,
compilerOptions: ts.CompilerOptions,
vueCompilerOptions: VueCompilerOptions
Expand All @@ -80,8 +98,6 @@ export function createVueLanguagePlugin<T>(
const vitePressSfcPlugin = useMdFilePlugin(pluginContext);
const petiteVueSfcPlugin = useHtmlFilePlugin(pluginContext);

let canonicalRootFileNamesVersion: string | undefined;

return {
getLanguageId(scriptId) {
if (vueCompilerOptions.extensions.some(ext => asFileName(scriptId).endsWith(ext))) {
Expand All @@ -97,9 +113,6 @@ export function createVueLanguagePlugin<T>(
createVirtualCode(scriptId, languageId, snapshot) {
if (languageId === 'vue' || languageId === 'markdown' || languageId === 'html') {
const fileName = asFileName(scriptId);
if (getProjectVersion() !== canonicalRootFileNamesVersion) {
canonicalRootFileNamesVersion = getProjectVersion();
}
if (!pluginContext.globalTypesHolder && isRootFile(fileName)) {
pluginContext.globalTypesHolder = fileName;
}
Expand Down
15 changes: 6 additions & 9 deletions packages/language-server/lib/initialize.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { LanguageServer } from '@volar/language-server';
import { createTypeScriptProject } from '@volar/language-server/node';
import { createParsedCommandLine, createVueLanguagePlugin, FileMap, resolveVueCompilerOptions, VueCompilerOptions } from '@vue/language-core';
import { createParsedCommandLine, createRootFileChecker, createVueLanguagePlugin, resolveVueCompilerOptions, VueCompilerOptions } from '@vue/language-core';
import { Disposable, getFullLanguageServicePlugins, InitializeParams } from '@vue/language-service';
import type * as ts from 'typescript';

Expand Down Expand Up @@ -42,14 +42,11 @@ export function initialize(
languagePlugins: [createVueLanguagePlugin(
ts,
s => uriConverter.asFileName(s),
() => projectHost.getProjectVersion?.() ?? '',
fileName => {
const fileMap = new FileMap(sys.useCaseSensitiveFileNames ?? false);
for (const vueFileName of projectHost.getScriptFileNames() ?? []) {
fileMap.set(vueFileName, undefined);
}
return fileMap.has(fileName);
},
createRootFileChecker(
projectHost.getProjectVersion ? () => projectHost.getProjectVersion!() : undefined,
() => projectHost.getScriptFileNames(),
sys.useCaseSensitiveFileNames
),
compilerOptions,
vueCompilerOptions
)],
Expand Down
1 change: 0 additions & 1 deletion packages/language-server/node.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ connection.onInitialize(params => {
languagePlugins: [createVueLanguagePlugin(
ts,
asFileName,
() => '',
() => false,
commandLine.options,
commandLine.vueOptions
Expand Down
17 changes: 7 additions & 10 deletions packages/language-service/tests/utils/createTester.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { FileMap, ProjectContext, createLanguage, createLanguageService, createUriMap } from '@volar/language-service';
import { ProjectContext, createLanguage, createLanguageService, createUriMap } from '@volar/language-service';
import { TypeScriptProjectHost, createLanguageServiceHost, resolveFileLanguageId } from '@volar/typescript';
import * as path from 'path';
import * as ts from 'typescript';
import { URI } from 'vscode-uri';
import { createParsedCommandLine, createVueLanguagePlugin, getFullLanguageServicePlugins } from '../..';
import { createParsedCommandLine, createRootFileChecker, createVueLanguagePlugin, getFullLanguageServicePlugins } from '../..';
import { createMockServiceEnv, fileNameToUri, uriToFileName } from './mockEnv';

export const rootUri = URI.file(path.resolve(__dirname, '../../../../test-workspace/language-service'));
Expand All @@ -27,14 +27,11 @@ function createTester(rootUri: URI) {
const vueLanguagePlugin = createVueLanguagePlugin(
ts,
uriToFileName,
() => projectHost.getProjectVersion?.() ?? '',
fileName => {
const fileMap = new FileMap(ts.sys.useCaseSensitiveFileNames);
for (const vueFileName of projectHost.getScriptFileNames()) {
fileMap.set(vueFileName, undefined);
}
return fileMap.has(fileName);
},
createRootFileChecker(
projectHost.getProjectVersion ? () => projectHost.getProjectVersion!() : undefined,
() => projectHost.getScriptFileNames(),
ts.sys.useCaseSensitiveFileNames
),
parsedCommandLine.options,
parsedCommandLine.vueOptions
);
Expand Down
1 change: 0 additions & 1 deletion packages/language-service/tests/utils/format.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ const resolvedVueOptions = resolveVueCompilerOptions({});
const vueLanguagePlugin = createVueLanguagePlugin<URI>(
ts,
() => '',
() => '',
() => false,
{},
resolvedVueOptions
Expand Down
13 changes: 5 additions & 8 deletions packages/tsc/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,14 +32,11 @@ export function run() {
const vueLanguagePlugin = vue.createVueLanguagePlugin<string>(
ts,
id => id,
() => '',
fileName => {
const fileMap = new vue.FileMap(options.host?.useCaseSensitiveFileNames?.() ?? false);
for (const vueFileName of options.rootNames.map(rootName => rootName.replace(windowsPathReg, '/'))) {
fileMap.set(vueFileName, undefined);
}
return fileMap.has(fileName);
},
vue.createRootFileChecker(
undefined,
() => options.rootNames.map(rootName => rootName.replace(windowsPathReg, '/')),
options.host?.useCaseSensitiveFileNames?.() ?? false
),
options.options,
vueOptions
);
Expand Down
13 changes: 5 additions & 8 deletions packages/tsc/tests/dts.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,14 +34,11 @@ describe('vue-tsc-dts', () => {
const vueLanguagePlugin = vue.createVueLanguagePlugin<string>(
ts,
id => id,
() => '',
fileName => {
const fileMap = new vue.FileMap(options.host?.useCaseSensitiveFileNames?.() ?? false);
for (const vueFileName of options.rootNames.map(rootName => rootName.replace(windowsPathReg, '/'))) {
fileMap.set(vueFileName, undefined);
}
return fileMap.has(fileName);
},
vue.createRootFileChecker(
undefined,
() => options.rootNames.map(rootName => rootName.replace(windowsPathReg, '/')),
options.host?.useCaseSensitiveFileNames?.() ?? false
),
options.options,
vueOptions
);
Expand Down
13 changes: 5 additions & 8 deletions packages/typescript-plugin/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,13 @@ const plugin = createLanguageServicePlugin(
const languagePlugin = vue.createVueLanguagePlugin<string>(
ts,
id => id,
() => info.languageServiceHost.getProjectVersion?.() ?? '',
info.project.projectKind === ts.server.ProjectKind.Inferred
? () => true
: fileName => {
const fileMap = new vue.FileMap(info.languageServiceHost.useCaseSensitiveFileNames?.() ?? false);
for (const vueFileName of externalFiles.get(info.project) ?? []) {
fileMap.set(vueFileName, undefined);
}
return fileMap.has(fileName);
},
: vue.createRootFileChecker(
info.languageServiceHost.getProjectVersion ? () => info.languageServiceHost.getProjectVersion!() : undefined,
() => externalFiles.get(info.project) ?? [],
info.languageServiceHost.useCaseSensitiveFileNames?.() ?? false
),
info.languageServiceHost.getCompilationSettings(),
vueOptions
);
Expand Down

0 comments on commit 519e916

Please sign in to comment.