Skip to content

Commit

Permalink
first fix for volarjs/volar.js#91 [skip ci]
Browse files Browse the repository at this point in the history
  • Loading branch information
johnsoncodehk committed Nov 24, 2023
1 parent 22cc868 commit 0e54fed
Show file tree
Hide file tree
Showing 30 changed files with 409 additions and 349 deletions.
51 changes: 28 additions & 23 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 { createLanguageServiceHost, decorateLanguageService } from '@volar/typescript';
import { createProject, decorateLanguageService, ProjectHost } from '@volar/typescript';

import type {
MetaCheckerOptions,
Expand Down Expand Up @@ -71,8 +71,7 @@ function createCheckerWorker(
let projectVersion = 0;

const scriptSnapshots = new Map<string, ts.IScriptSnapshot>();
const _host: vue.TypeScriptProjectHost = {
configFileName,
const _host: ProjectHost = {
getCurrentDirectory: () => rootPath,
getProjectVersion: () => projectVersion.toString(),
getCompilationSettings: () => parsedCommandLine.options,
Expand All @@ -87,10 +86,13 @@ function createCheckerWorker(
}
return scriptSnapshots.get(fileName);
},
getFileId: fileName => fileName,
getFileName: id => id,
getLanguageId: vue.resolveCommonLanguageId,
};

return {
...baseCreate(ts, _host, vue.resolveVueCompilerOptions(parsedCommandLine.vueOptions), checkerOptions, globalComponentName),
...baseCreate(ts, configFileName, _host, vue.resolveVueCompilerOptions(parsedCommandLine.vueOptions), checkerOptions, globalComponentName),
updateFile(fileName: string, text: string) {
fileName = fileName.replace(windowsPathReg, '/');
scriptSnapshots.set(fileName, ts.ScriptSnapshot.fromString(text));
Expand All @@ -115,16 +117,17 @@ function createCheckerWorker(

export function baseCreate(
ts: typeof import('typescript/lib/tsserverlibrary'),
host: vue.TypeScriptProjectHost,
configFileName: string | undefined,
projectHost: ProjectHost,
vueCompilerOptions: vue.VueCompilerOptions,
checkerOptions: MetaCheckerOptions,
globalComponentName: string,
) {
const globalComponentSnapshot = ts.ScriptSnapshot.fromString('<script setup lang="ts"></script>');
const metaSnapshots: Record<string, ts.IScriptSnapshot> = {};
const getScriptFileNames = host.getScriptFileNames;
const getScriptSnapshot = host.getScriptSnapshot;
host.getScriptFileNames = () => {
const getScriptFileNames = projectHost.getScriptFileNames;
const getScriptSnapshot = projectHost.getScriptSnapshot;
projectHost.getScriptFileNames = () => {
const names = getScriptFileNames();
return [
...names,
Expand All @@ -133,7 +136,7 @@ export function baseCreate(
getMetaFileName(globalComponentName),
];
};
host.getScriptSnapshot = (fileName) => {
projectHost.getScriptSnapshot = (fileName) => {
if (isMetaFileName(fileName)) {
if (!metaSnapshots[fileName]) {
metaSnapshots[fileName] = ts.ScriptSnapshot.fromString(getMetaScriptContent(fileName));
Expand All @@ -150,22 +153,24 @@ export function baseCreate(

const vueLanguages = vue.createLanguages(
ts,
host.getCompilationSettings(),
projectHost.getCompilationSettings(),
vueCompilerOptions,
);
const fileNameResolutionHost = {
fileNameToId: (fileName: string) => fileName,
idToFileName: (id: string) => id,
};
const project = vue.createTypeScriptProject(vueLanguages, host, fileNameResolutionHost.fileNameToId, vue.resolveCommonLanguageId);
const tsLsHost = createLanguageServiceHost(project.typescript!.projectHost, project.fileProvider, fileNameResolutionHost, ts, ts.sys);
const tsLs = ts.createLanguageService(tsLsHost);
const project = createProject(
ts,
ts.sys,
vueLanguages,
configFileName,
projectHost,
);
const { languageServiceHost } = project.typescript!;
const tsLs = ts.createLanguageService(languageServiceHost);

decorateLanguageService(project.fileProvider, tsLs, false);

if (checkerOptions.forceUseTs) {
const getScriptKind = tsLsHost.getScriptKind;
tsLsHost.getScriptKind = (fileName) => {
const getScriptKind = languageServiceHost.getScriptKind?.bind(languageServiceHost);
languageServiceHost.getScriptKind = (fileName) => {
if (fileName.endsWith('.vue.js')) {
return ts.ScriptKind.TS;
}
Expand Down Expand Up @@ -299,9 +304,9 @@ ${vueCompilerOptions.target < 3 ? vue2TypeHelpersCode : typeHelpersCode}

// fill defaults
const printer = ts.createPrinter(checkerOptions.printer);
const snapshot = host.getScriptSnapshot(componentPath)!;
const snapshot = projectHost.getScriptSnapshot(componentPath)!;

const vueSourceFile = project.fileProvider.getSourceFile(componentPath)?.root;
const vueSourceFile = project.fileProvider.getSourceFile(componentPath)?.virtualFile?.[0];
const vueDefaults = vueSourceFile && exportName === 'default'
? (vueSourceFile instanceof vue.VueFile ? readVueComponentDefaultProps(vueSourceFile, printer, ts, vueCompilerOptions) : {})
: {};
Expand Down Expand Up @@ -643,8 +648,8 @@ function createSchemaResolvers(
if (virtualFile) {
const maps = core.fileProvider.getMaps(virtualFile);
for (const [source, [_, map]] of maps) {
const start = map.toSourceOffset(declaration.getStart());
const end = map.toSourceOffset(declaration.getEnd());
const start = map.getSourceOffset(declaration.getStart());
const end = map.getSourceOffset(declaration.getEnd());
if (start && end) {
return {
file: source,
Expand Down
72 changes: 35 additions & 37 deletions packages/language-core/src/generators/script.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { FileRangeCapabilities, MirrorBehaviorCapabilities } from '@volar/language-core';
import { LinkedCodeTrigger } from '@volar/language-core';
import * as SourceMaps from '@volar/source-map';
import { Segment, getLength } from '@volar/source-map';
import * as muggle from 'muggle-string';
Expand All @@ -7,7 +7,7 @@ import type * as ts from 'typescript/lib/tsserverlibrary';
import type * as templateGen from '../generators/template';
import type { ScriptRanges } from '../parsers/scriptRanges';
import type { ScriptSetupRanges } from '../parsers/scriptSetupRanges';
import type { TextRange, VueCompilerOptions } from '../types';
import type { TextRange, VueCodeInformation, VueCompilerOptions } from '../types';
import { Sfc } from '../types';
import { getSlotsPropertyName, hyphenateTag } from '../utils/shared';
import { walkInterpolationFragment } from '../utils/transform';
Expand All @@ -27,8 +27,8 @@ export function generate(
codegenStack: boolean,
) {

const [codes, codeStacks] = codegenStack ? muggle.track([] as Segment<FileRangeCapabilities>[]) : [[], []];
const mirrorBehaviorMappings: SourceMaps.Mapping<[MirrorBehaviorCapabilities, MirrorBehaviorCapabilities]>[] = [];
const [codes, codeStacks] = codegenStack ? muggle.track([] as Segment<VueCodeInformation>[]) : [[], []];
const mirrorBehaviorMappings: SourceMaps.Mapping<[LinkedCodeTrigger, LinkedCodeTrigger]>[] = [];

//#region monkey fix: https://github.com/vuejs/language-tools/pull/2113
if (!script && !scriptSetup) {
Expand Down Expand Up @@ -155,10 +155,10 @@ export function generate(
'script',
[script.srcOffset - 1, script.srcOffset + script.src.length + 1],
{
...FileRangeCapabilities.full,
rename: src === script.src ? true : {
normalize: undefined,
apply(newName) {
renameEdits: src === script.src ? true : {
shouldRename: false,
shouldEdit: true,
resolveEditText(newName) {
if (
newName.endsWith('.jsx')
|| newName.endsWith('.js')
Expand Down Expand Up @@ -245,7 +245,7 @@ export function generate(
scriptSetup.content.substring(0, Math.max(scriptSetupRanges.importSectionEndOffset, scriptSetupRanges.leadingCommentEndOffset)) + '\n',
'scriptSetup',
0,
FileRangeCapabilities.full,
{},
]);
}
function generateExportDefaultEndMapping() {
Expand All @@ -257,7 +257,7 @@ export function generate(
'',
'scriptSetup',
scriptSetup.content.length,
{ diagnostic: true },
{ diagnostics: true },
]);
codes.push(`\n`);
}
Expand All @@ -279,7 +279,7 @@ export function generate(
scriptSetup.generic,
scriptSetup.name,
scriptSetup.genericOffset,
FileRangeCapabilities.full,
{},
]);
if (!scriptSetup.generic.endsWith(',')) {
codes.push(`,`);
Expand Down Expand Up @@ -410,14 +410,12 @@ export function generate(
const propName = scriptSetup.content.substring(defineProp.name.start, defineProp.name.end);
const propMirror = definePropMirrors[propName];
if (propMirror) {
mirrorBehaviorMappings.push({
sourceRange: [defineProp.name.start + scriptSetupGeneratedOffset, defineProp.name.end + scriptSetupGeneratedOffset],
generatedRange: propMirror,
data: [
MirrorBehaviorCapabilities.full,
MirrorBehaviorCapabilities.full,
],
});
mirrorBehaviorMappings.push([
undefined,
[defineProp.name.start + scriptSetupGeneratedOffset, defineProp.name.end + scriptSetupGeneratedOffset],
propMirror,
[{}, {}],
]);
}
}
}
Expand Down Expand Up @@ -761,14 +759,12 @@ declare function defineProp<T>(value?: T | (() => T), required?: boolean, rest?:
const scriptEnd = getLength(codes);
codes.push(',\n');

mirrorBehaviorMappings.push({
sourceRange: [scriptStart, scriptEnd],
generatedRange: [templateStart, templateEnd],
data: [
MirrorBehaviorCapabilities.full,
MirrorBehaviorCapabilities.full,
],
});
mirrorBehaviorMappings.push([
undefined,
[scriptStart, scriptEnd],
[templateStart, templateEnd],
[{}, {}],
]);
}
}
codes.push(`};\n`); // return {
Expand All @@ -793,7 +789,7 @@ declare function defineProp<T>(value?: T | (() => T), required?: boolean, rest?:
componentsOption.start,
{
references: true,
rename: true,
renameEdits: true,
},
]);
}
Expand Down Expand Up @@ -907,7 +903,7 @@ declare function defineProp<T>(value?: T | (() => T), required?: boolean, rest?:
classRange.start,
{
references: true,
referencesCodeLens,
__referencesCodeLens: referencesCodeLens,
},
]);
codes.push(`'`);
Expand All @@ -917,9 +913,11 @@ declare function defineProp<T>(value?: T | (() => T), required?: boolean, rest?:
[classRange.start, classRange.end],
{
references: true,
rename: {
normalize: normalizeCssRename,
apply: applyCssRename,
renameEdits: {
shouldRename: true,
shouldEdit: true,
resolveNewName: normalizeCssRename,
resolveEditText: applyCssRename,
},
},
]);
Expand Down Expand Up @@ -954,8 +952,8 @@ declare function defineProp<T>(value?: T | (() => T), required?: boolean, rest?:
style.name,
cssBind.offset + fragOffset,
onlyForErrorMapping
? { diagnostic: true }
: FileRangeCapabilities.full,
? { diagnostics: true }
: {},
]);
}
},
Expand Down Expand Up @@ -999,7 +997,7 @@ declare function defineProp<T>(value?: T | (() => T), required?: boolean, rest?:
(vueTag === 'script' ? script : scriptSetup)!.content.substring(start, end),
vueTag,
start,
FileRangeCapabilities.full, // diagnostic also working for setup() returns unused in template checking
{}, // diagnostic also working for setup() returns unused in template checking
]);
muggle.resetOffsetStack();
}
Expand All @@ -1011,8 +1009,8 @@ declare function defineProp<T>(value?: T | (() => T), required?: boolean, rest?:
start,
{
references: true,
definition: true,
rename: true,
definitions: true,
renameEdits: true,
},
]);
muggle.resetOffsetStack();
Expand Down
Loading

0 comments on commit 0e54fed

Please sign in to comment.