Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
feat: Support for @vue-ignore, @vue-skip, @vue-expected-error d…
…irective comments (#3215)
  • Loading branch information
johnsoncodehk committed May 22, 2023
1 parent 7b101a3 commit 92e5dc8
Show file tree
Hide file tree
Showing 11 changed files with 215 additions and 129 deletions.
2 changes: 1 addition & 1 deletion package.json
Expand Up @@ -22,7 +22,7 @@
},
"devDependencies": {
"@types/node": "latest",
"@volar/language-service": "1.6.8",
"@volar/language-service": "1.6.9",
"typescript": "latest",
"vite": "latest",
"vitest": "latest"
Expand Down
2 changes: 1 addition & 1 deletion packages/vscode-vue/package.json
Expand Up @@ -732,7 +732,7 @@
"devDependencies": {
"@types/semver": "^7.3.13",
"@types/vscode": "1.67.0",
"@volar/vscode": "1.6.8",
"@volar/vscode": "1.6.9",
"@vue/language-server": "1.7.6",
"esbuild": "0.15.18",
"esbuild-plugin-copy": "latest",
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.8",
"@volar/language-core": "1.6.9",
"@vue/language-core": "1.7.6",
"typesafe-path": "^0.2.2",
"vue-component-type-helpers": "1.7.6"
Expand Down
4 changes: 2 additions & 2 deletions packages/vue-language-core/package.json
Expand Up @@ -13,8 +13,8 @@
"directory": "packages/vue-language-core"
},
"dependencies": {
"@volar/language-core": "1.6.8",
"@volar/source-map": "1.6.8",
"@volar/language-core": "1.6.9",
"@volar/source-map": "1.6.9",
"@vue/compiler-dom": "^3.3.0",
"@vue/reactivity": "^3.3.0",
"@vue/shared": "^3.3.0",
Expand Down
130 changes: 107 additions & 23 deletions packages/vue-language-core/src/generators/template.ts
Expand Up @@ -75,14 +75,8 @@ export function generate(
const [codes, codeStacks] = codegenStack ? muggle.track([] as Code[]) : [[], []];
const [formatCodes, formatCodeStacks] = codegenStack ? muggle.track([] as Code[]) : [[], []];
const [cssCodes, cssCodeStacks] = codegenStack ? muggle.track([] as Code[]) : [[], []];
const slots = new Map<string, {
varName: string,
loc: [number, number],
nodeLoc: any,
}>();
const slotExps = new Map<string, {
varName: string,
}>();
const slots = new Map<string, { varName: string; loc: [number, number]; nodeLoc: any; }>();
const slotExps = new Map<string, { varName: string; }>();
const tagNames = collectTagOffsets();
const localVars: Record<string, number> = {};
const tempVars: ReturnType<typeof walkInterpolationFragment>[] = [];
Expand All @@ -92,11 +86,14 @@ export function generate(

let hasSlot = false;
let elementIndex = 0;
let ignoreStart: undefined | number;
let expectedErrorStart: undefined | number;
let expectedErrorNode: CompilerDOM.CommentNode | undefined;

const componentVars = generateComponentVars();

if (sfc.templateAst) {
visitNode(sfc.templateAst, undefined, undefined);
visitNode(sfc.templateAst, undefined, undefined, undefined);
}

generateStyleScopedClasses();
Expand Down Expand Up @@ -309,15 +306,92 @@ export function generate(
return tagOffsetsMap;
}

function resolveComment() {
if (ignoreStart !== undefined) {
for (let i = ignoreStart; i < codes.length; i++) {
const code = codes[i];
if (typeof code === 'string') {
continue;
}
const cap = code[3];
if (cap.diagnostic) {
code[3] = {
...cap,
diagnostic: false,
};
}
}
ignoreStart = undefined;
}
if (expectedErrorStart !== undefined && expectedErrorStart !== codes.length && expectedErrorNode) {
let errors = 0;
const suppressError = () => {
errors++;
return false;
};
for (let i = expectedErrorStart; i < codes.length; i++) {
const code = codes[i];
if (typeof code === 'string') {
continue;
}
const cap = code[3];
if (cap.diagnostic) {
code[3] = {
...cap,
diagnostic: {
shouldReport: suppressError,
},
};
}
}
codes.push(
[
'// @ts-expect-error',
'template',
[expectedErrorNode.loc.start.offset, expectedErrorNode.loc.end.offset],
{
diagnostic: {
shouldReport: () => errors === 0,
},
},
],
'\n{};\n',
);
expectedErrorStart = undefined;
expectedErrorNode = undefined;
}
}

function visitNode(
node: CompilerDOM.RootNode | CompilerDOM.TemplateChildNode,
node: CompilerDOM.RootNode | CompilerDOM.TemplateChildNode | CompilerDOM.InterpolationNode | CompilerDOM.CompoundExpressionNode | CompilerDOM.TextNode | CompilerDOM.SimpleExpressionNode,
parentEl: CompilerDOM.ElementNode | undefined,
prevNode: CompilerDOM.TemplateChildNode | undefined,
componentCtxVar: string | undefined,
): void {

resolveComment();

if (prevNode?.type === CompilerDOM.NodeTypes.COMMENT) {
const commentText = prevNode.content.trim();
if (commentText === '@vue-skip') {
return;
}
else if (commentText === '@vue-ignore') {
ignoreStart = codes.length;
}
else if (commentText === '@vue-expected-error') {
expectedErrorStart = codes.length;
expectedErrorNode = prevNode;
}
}

if (node.type === CompilerDOM.NodeTypes.ROOT) {
let prev: CompilerDOM.TemplateChildNode | undefined;
for (const childNode of node.children) {
visitNode(childNode, parentEl, componentCtxVar);
visitNode(childNode, parentEl, prev, componentCtxVar);
prev = childNode;
}
resolveComment();
}
else if (node.type === CompilerDOM.NodeTypes.ELEMENT) {
const vForNode = getVForNode(node);
Expand All @@ -334,13 +408,13 @@ export function generate(
}
else if (node.type === CompilerDOM.NodeTypes.TEXT_CALL) {
// {{ var }}
visitNode(node.content, parentEl, componentCtxVar);
visitNode(node.content, parentEl, undefined, componentCtxVar);
}
else if (node.type === CompilerDOM.NodeTypes.COMPOUND_EXPRESSION) {
// {{ ... }} {{ ... }}
for (const childNode of node.children) {
if (typeof childNode === 'object') {
visitNode(childNode as CompilerDOM.TemplateChildNode, parentEl, componentCtxVar);
visitNode(childNode, parentEl, undefined, componentCtxVar);
}
}
}
Expand Down Expand Up @@ -394,12 +468,6 @@ export function generate(
else if (node.type === CompilerDOM.NodeTypes.TEXT) {
// not needed progress
}
else if (node.type === CompilerDOM.NodeTypes.COMMENT) {
// not needed progress
}
else {
codes.push(`// Unprocessed node type: ${node.type} json: ${JSON.stringify(node.loc)}\n`);
}
}

function visitVIfNode(node: CompilerDOM.IfNode, parentEl: CompilerDOM.ElementNode | undefined, componentCtxVar: string | undefined) {
Expand Down Expand Up @@ -447,9 +515,14 @@ export function generate(
}

codes.push(` {\n`);

let prev: CompilerDOM.TemplateChildNode | undefined;
for (const childNode of branch.children) {
visitNode(childNode, parentEl, componentCtxVar);
visitNode(childNode, parentEl, prev, componentCtxVar);
prev = childNode;
}
resolveComment();

generateAutoImportCompletionCode();
codes.push('}\n');

Expand Down Expand Up @@ -496,9 +569,12 @@ export function generate(
') {\n',
);

let prev: CompilerDOM.TemplateChildNode | undefined;
for (const childNode of node.children) {
visitNode(childNode, parentEl, componentCtxVar);
visitNode(childNode, parentEl, prev, componentCtxVar);
prev = childNode;
}
resolveComment();

generateAutoImportCompletionCode();
codes.push('}\n');
Expand Down Expand Up @@ -776,9 +852,14 @@ export function generate(
localVars[varName] ??= 0;
localVars[varName]++;
});

let prev: CompilerDOM.TemplateChildNode | undefined;
for (const childNode of node.children) {
visitNode(childNode, parentEl, componentCtxVar);
visitNode(childNode, parentEl, prev, componentCtxVar);
prev = childNode;
}
resolveComment();

slotBlockVars.forEach(varName => {
localVars[varName]--;
});
Expand All @@ -801,9 +882,12 @@ export function generate(
codes.push(`}\n`);
}
else {
let prev: CompilerDOM.TemplateChildNode | undefined;
for (const childNode of node.children) {
visitNode(childNode, parentEl, componentCtxVar);
visitNode(childNode, parentEl, prev, componentCtxVar);
prev = childNode;
}
resolveComment();
}

codes.push(`}\n`);
Expand Down
2 changes: 1 addition & 1 deletion packages/vue-language-plugin-pug/package.json
Expand Up @@ -16,7 +16,7 @@
"@vue/language-core": "1.7.6"
},
"dependencies": {
"@volar/source-map": "1.6.8",
"@volar/source-map": "1.6.9",
"volar-service-pug": "0.0.4"
}
}
4 changes: 2 additions & 2 deletions packages/vue-language-server/package.json
Expand Up @@ -16,8 +16,8 @@
"directory": "packages/vue-language-server"
},
"dependencies": {
"@volar/language-core": "1.6.8",
"@volar/language-server": "1.6.8",
"@volar/language-core": "1.6.9",
"@volar/language-server": "1.6.9",
"@vue/language-core": "1.7.6",
"@vue/language-service": "1.7.6",
"vscode-languageserver-protocol": "^3.17.3",
Expand Down
6 changes: 3 additions & 3 deletions packages/vue-language-service/package.json
Expand Up @@ -17,8 +17,8 @@
"update-html-data": "node ./scripts/update-html-data.js"
},
"dependencies": {
"@volar/language-core": "1.6.8",
"@volar/language-service": "1.6.8",
"@volar/language-core": "1.6.9",
"@volar/language-service": "1.6.9",
"@vue/compiler-dom": "^3.3.0",
"@vue/language-core": "1.7.6",
"@vue/reactivity": "^3.3.0",
Expand All @@ -35,7 +35,7 @@
"vscode-languageserver-textdocument": "^1.0.8"
},
"devDependencies": {
"@volar/kit": "1.6.8",
"@volar/kit": "1.6.9",
"vscode-languageserver-protocol": "^3.17.3",
"vscode-uri": "^3.0.7"
}
Expand Down
6 changes: 4 additions & 2 deletions packages/vue-tsc-eslint-hook/src/index.ts
Expand Up @@ -73,12 +73,14 @@ export = async function (

for (const start of map.toSourceOffsets(msgStart)) {

if (!start[1].data.diagnostic)
const reportStart = typeof start[1].data.diagnostic === 'object' ? typeof start[1].data.diagnostic.shouldReport() : !!start[1].data.diagnostic;
if (!reportStart)
continue;

for (const end of map.toSourceOffsets(msgEnd, true)) {

if (!end[1].data.diagnostic)
const reportEnd = typeof end[1].data.diagnostic === 'object' ? typeof end[1].data.diagnostic.shouldReport() : !!end[1].data.diagnostic;
if (!reportEnd)
continue;

const range = {
Expand Down
2 changes: 1 addition & 1 deletion packages/vue-typescript/package.json
Expand Up @@ -13,7 +13,7 @@
"directory": "packages/vue-typescript"
},
"dependencies": {
"@volar/typescript": "1.6.8",
"@volar/typescript": "1.6.9",
"@vue/language-core": "1.7.6"
}
}

0 comments on commit 92e5dc8

Please sign in to comment.