Skip to content

Commit

Permalink
fix(vue-code-gen): import comment
Browse files Browse the repository at this point in the history
  • Loading branch information
yoyo930021 committed Jul 12, 2022
1 parent c8cfd16 commit e628041
Show file tree
Hide file tree
Showing 2 changed files with 75 additions and 117 deletions.
190 changes: 74 additions & 116 deletions packages/vue-code-gen/src/generators/script.ts
Expand Up @@ -5,6 +5,7 @@ import { posix as path } from 'path';
import type * as templateGen from '../generators/template';
import type { ScriptRanges } from '../parsers/scriptRanges';
import type { ScriptSetupRanges } from '../parsers/scriptSetupRanges';
import type { ScriptImportRanges } from '../parsers/scriptImportRanges';
import type { TeleportMappingData, EmbeddedFileMappingData } from '../types';

export function getSlotsPropertyName(vueVersion: number) {
Expand Down Expand Up @@ -53,7 +54,7 @@ export function generate(
writeScriptSrc();
writeScriptSetupImports();
writeScriptImports();
writeScriptBeforeExportDefault();
writeScriptBeforeExportDefaultAfterImports();
writeScriptSetup();
writeScriptSetupTypes();
writeScriptAfterExportDefault();
Expand Down Expand Up @@ -196,29 +197,22 @@ export function generate(
codeGen.addText(`;\n`);
codeGen.addText(`export { default } from '${src}';\n`);
}
function writeScriptBeforeExportDefault() {
function writeScriptBeforeExportDefaultAfterImports() {
if (!script)
return;

function writeScriptRemoveImportRanges (end: number) {
function writeScriptAfterImportRanges (end: number) {
if (scriptRanges?.imports.length) {
const removeTextRanges = scriptRanges?.imports?.map((r) => r.code).sort((a, b) => a.start - b.start);

removeTextRanges.forEach((range, index) => {
const prevRangeEnd = (index !== 0) ? removeTextRanges[index - 1].end : 0;
if (prevRangeEnd >= range.start) return
addVirtualCode('script', prevRangeEnd, range.start);
})
const lastRemoteTextRange = removeTextRanges[removeTextRanges.length - 1]
if (!lastRemoteTextRange || lastRemoteTextRange.end >= end) return
addVirtualCode('script', lastRemoteTextRange.end, end);
const lastRemoteTextRange = scriptRanges?.imports[scriptRanges?.imports.length - 1];
if (!lastRemoteTextRange || lastRemoteTextRange.code.end >= end) return;
addVirtualCode('script', lastRemoteTextRange.code.end, end);
} else {
addVirtualCode('script', 0, end);
}
}

if (!!scriptSetup && scriptRanges?.exportDefault) {
writeScriptRemoveImportRanges(scriptRanges.exportDefault.expression.start);
writeScriptAfterImportRanges(scriptRanges.exportDefault.expression.start);
exportdefaultStart = codeGen.getText().length - (scriptRanges.exportDefault.expression.start - scriptRanges.exportDefault.start);
}
else {
Expand All @@ -227,14 +221,14 @@ export function generate(
isExportRawObject = script.content.substring(scriptRanges.exportDefault.expression.start, scriptRanges.exportDefault.expression.end).startsWith('{');
}
if (isExportRawObject && shimComponentOptions && scriptRanges?.exportDefault) {
writeScriptRemoveImportRanges(scriptRanges.exportDefault.expression.start);
writeScriptAfterImportRanges(scriptRanges.exportDefault.expression.start);
codeGen.addText(`(await import('${vueLibName}')).defineComponent(`);
addVirtualCode('script', scriptRanges.exportDefault.expression.start, scriptRanges.exportDefault.expression.end);
codeGen.addText(`)`);
addVirtualCode('script', scriptRanges.exportDefault.expression.end, script.content.length);
}
else {
writeScriptRemoveImportRanges(script.content.length);
writeScriptAfterImportRanges(script.content.length);
}
}
}
Expand Down Expand Up @@ -280,6 +274,58 @@ export function generate(
},
);
}
function writeNewImport (vueTag: 'script' | 'scriptSetup', importRange: ScriptImportRanges[number]) {
const content = vueTag === 'script' ? script?.content : scriptSetup?.content;
if (!content) return;
const moduleName = content.substring(importRange.moduleSpecifier.start, importRange.moduleSpecifier.end);
if (moduleName.endsWith('.vue\'') || moduleName.endsWith('.vue\"')) {
codeGen.addCode(
content.substring(importRange.code.start, importRange.moduleSpecifier.start),
{
start: importRange.code.start,
end: importRange.moduleSpecifier.start,
},
SourceMaps.Mode.Offset,
{
vueTag,
capabilities: {
basic: lsType === 'script',
references: true,
definitions: lsType === 'script',
diagnostic: lsType === 'script',
rename: true,
completion: lsType === 'script',
semanticTokens: lsType === 'script',
},
},
);
const newModuleName = moduleName.replace(/\.vue(['"])$/, '.vue.js$1');
codeGen.addCode(
newModuleName,
{
start: importRange.moduleSpecifier.start,
end: importRange.moduleSpecifier.end,
},
SourceMaps.Mode.Expand,
{
vueTag,
capabilities: {
basic: lsType === 'script',
references: true,
definitions: lsType === 'script',
diagnostic: lsType === 'script',
rename: true,
completion: lsType === 'script',
semanticTokens: lsType === 'script',
},
},
);
addVirtualCode(vueTag, importRange.moduleSpecifier.end, importRange.code.end);
} else {
addVirtualCode(vueTag, importRange.code.start, importRange.code.end);
}
codeGen.addText(`\n`);
}
function writeScriptSetupImports() {

if (!scriptSetup)
Expand All @@ -288,56 +334,12 @@ export function generate(
if (!scriptSetupRanges?.imports.length)
return;

for (const importRange of scriptSetupRanges.imports) {
const moduleName = scriptSetup.content.substring(importRange.moduleSpecifier.start, importRange.moduleSpecifier.end)
if (moduleName.endsWith('.vue\'') || moduleName.endsWith('.vue\"')) {
codeGen.addCode(
scriptSetup.content.substring(importRange.code.start, importRange.moduleSpecifier.start),
{
start: importRange.code.start,
end: importRange.moduleSpecifier.start,
},
SourceMaps.Mode.Offset,
{
vueTag: 'scriptSetup',
capabilities: {
basic: lsType === 'script',
references: true,
definitions: lsType === 'script',
diagnostic: lsType === 'script',
rename: true,
completion: lsType === 'script',
semanticTokens: lsType === 'script',
},
},
)
const newModuleName = moduleName.replace(/\.vue(['"])$/, '.vue.js$1')
codeGen.addCode(
newModuleName,
{
start: importRange.moduleSpecifier.start,
end: importRange.moduleSpecifier.end,
},
SourceMaps.Mode.Expand,
{
vueTag: 'scriptSetup',
capabilities: {
basic: lsType === 'script',
references: true,
definitions: lsType === 'script',
diagnostic: lsType === 'script',
rename: true,
completion: lsType === 'script',
semanticTokens: lsType === 'script',
},
},
)
addVirtualCode('scriptSetup', importRange.moduleSpecifier.end, importRange.code.end)
} else {
addVirtualCode('scriptSetup', importRange.code.start, importRange.code.end)
}
codeGen.addText(`\n`);
}
scriptSetupRanges.imports.forEach((importRange, index) => {
const prevRangeEnd = (index !== 0) ? scriptSetupRanges.imports[index - 1].code.end : 0;
if (prevRangeEnd >= importRange.code.start) return;
addVirtualCode('scriptSetup', prevRangeEnd, importRange.code.start);
writeNewImport('scriptSetup', importRange);
})
}
function writeScriptImports() {

Expand All @@ -347,56 +349,12 @@ export function generate(
if (!scriptRanges?.imports.length)
return;

for (const importRange of scriptRanges.imports) {
const moduleName = script.content.substring(importRange.moduleSpecifier.start, importRange.moduleSpecifier.end)
if (moduleName.endsWith('.vue\'') || moduleName.endsWith('.vue\"')) {
codeGen.addCode(
script.content.substring(importRange.code.start, importRange.moduleSpecifier.start),
{
start: importRange.code.start,
end: importRange.moduleSpecifier.start,
},
SourceMaps.Mode.Offset,
{
vueTag: 'script',
capabilities: {
basic: lsType === 'script',
references: true,
definitions: lsType === 'script',
diagnostic: lsType === 'script',
rename: true,
completion: lsType === 'script',
semanticTokens: lsType === 'script',
},
},
)
const newModuleName = moduleName.replace(/.vue(['"])$/, '.vue.js$1')
codeGen.addCode(
newModuleName,
{
start: importRange.moduleSpecifier.start,
end: importRange.moduleSpecifier.end,
},
SourceMaps.Mode.Expand,
{
vueTag: 'script',
capabilities: {
basic: lsType === 'script',
references: true,
definitions: lsType === 'script',
diagnostic: lsType === 'script',
rename: true,
completion: lsType === 'script',
semanticTokens: lsType === 'script',
},
},
)
addVirtualCode('script', importRange.moduleSpecifier.end, importRange.code.end)
} else {
addVirtualCode('script', importRange.code.start, importRange.code.end)
}
codeGen.addText(`\n`);
}
scriptRanges.imports.forEach((importRange, index) => {
const prevRangeEnd = (index !== 0) ? scriptRanges.imports[index - 1].code.end : 0;
if (prevRangeEnd >= importRange.code.start) return;
addVirtualCode('script', prevRangeEnd, importRange.code.start);
writeNewImport('script', importRange);
})
}
function writeScriptSetup() {

Expand Down
2 changes: 1 addition & 1 deletion packages/vue-code-gen/src/parsers/scriptImportRanges.ts
Expand Up @@ -17,7 +17,7 @@ export function parseScriptImportRanges(ts: typeof import('typescript/lib/tsserv
visitNode(node);
});

return calls;
return calls.sort((a, b) => a.code.start - b.code.start);

function visitNode(node: ts.Node) {
if (ts.isImportDeclaration(node)) {
Expand Down

0 comments on commit e628041

Please sign in to comment.