Skip to content

Commit

Permalink
fix: component auto import unreliable
Browse files Browse the repository at this point in the history
close #1470
  • Loading branch information
johnsoncodehk committed Jun 17, 2022
1 parent 51b8877 commit 635898b
Showing 1 changed file with 18 additions and 5 deletions.
23 changes: 18 additions & 5 deletions packages/vue-language-service/src/plugins/vue-template.ts
Expand Up @@ -323,8 +323,8 @@ export default function useVueTemplateLanguagePlugin<T extends ReturnType<typeof
const componentName = capitalize(camelize(item.label.replace(/\./g, '-')));
const textDoc = vueDocument.getDocument();
const compiledVue = vueDocument.file.getCompiledVue()!;
const insert = await getInsert();
if (insert) {
const insert = await getTypeScriptInsert() ?? getMonkeyInsert();
if (insert.description) {
item.detail = insert.description + '\n\n' + rPath;
}
if (descriptor.scriptSetup) {
Expand All @@ -335,7 +335,7 @@ export default function useVueTemplateLanguagePlugin<T extends ReturnType<typeof
item.additionalTextEdits = [
vscode.TextEdit.insert(
editPosition,
'\n' + insert?.insertText,
'\n' + insert.insertText,
),
];
}
Expand All @@ -348,7 +348,7 @@ export default function useVueTemplateLanguagePlugin<T extends ReturnType<typeof
item.additionalTextEdits = [
vscode.TextEdit.insert(
editPosition,
'\n' + insert?.insertText,
'\n' + insert.insertText,
),
];
const scriptRanges = parseScriptRanges(options.ts, scriptAst, !!descriptor.scriptSetup, true, true);
Expand Down Expand Up @@ -401,7 +401,7 @@ export default function useVueTemplateLanguagePlugin<T extends ReturnType<typeof
}
return item;

async function getInsert() {
async function getTypeScriptInsert() {
const embeddedScriptUri = shared.fsPathToUri(vueDocument.file.getScriptFileName());
const tsImportName = camelize(path.basename(importFile).replace(/\./g, '-'));
const [formatOptions, preferences] = await Promise.all([
Expand All @@ -424,6 +424,19 @@ export default function useVueTemplateLanguagePlugin<T extends ReturnType<typeof
}
}
}
function getMonkeyInsert() {
const anyImport = scriptSetupImport ?? scriptImport;
let withSemicolon = true;
let quote = '"';
if (anyImport) {
withSemicolon = anyImport.text.endsWith(';');
quote = anyImport.text.includes("'") ? "'" : '"';
}
return {
insertText: `import ${componentName} from ${quote}${importPath}${quote}${withSemicolon ? ';' : ''}`,
description: '',
};
}
}

async function provideHtmlData(vueDocument: VueDocument) {
Expand Down

0 comments on commit 635898b

Please sign in to comment.