From 5f94ef9c11d313a30511a551b5ec0192353c713e Mon Sep 17 00:00:00 2001 From: KazariEX <1364035137@qq.com> Date: Sun, 23 Feb 2025 01:22:38 +0800 Subject: [PATCH 1/2] feat(compiler-core): add `tagLoc` and `closeTagLoc` to element ast node --- packages/compiler-core/src/ast.ts | 2 ++ packages/compiler-core/src/parser.ts | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/packages/compiler-core/src/ast.ts b/packages/compiler-core/src/ast.ts index 2d6df9d90..0bdb09f6d 100644 --- a/packages/compiler-core/src/ast.ts +++ b/packages/compiler-core/src/ast.ts @@ -130,6 +130,8 @@ export interface BaseElementNode extends Node { type: NodeTypes.ELEMENT ns: Namespace tag: string + tagLoc: SourceLocation + closeTagLoc?: SourceLocation tagType: ElementTypes props: Array children: TemplateChildNode[] diff --git a/packages/compiler-core/src/parser.ts b/packages/compiler-core/src/parser.ts index 95c5e129f..85f373f35 100644 --- a/packages/compiler-core/src/parser.ts +++ b/packages/compiler-core/src/parser.ts @@ -140,6 +140,7 @@ const tokenizer = new Tokenizer(stack, { type: NodeTypes.ELEMENT, tag: name, ns: currentOptions.getNamespace(name, stack[0], currentOptions.ns), + tagLoc: getLoc(start, end), tagType: ElementTypes.ELEMENT, // will be refined on tag close props: [], children: [], @@ -165,6 +166,9 @@ const tokenizer = new Tokenizer(stack, { } for (let j = 0; j <= i; j++) { const el = stack.shift()! + if (j === i) { + el.closeTagLoc = getLoc(start, end) + } onCloseTag(el, end, j < i) } break From e52d626af6f57110ef3fa5bbe63663e9de19206a Mon Sep 17 00:00:00 2001 From: KazariEX <1364035137@qq.com> Date: Sun, 23 Feb 2025 01:47:27 +0800 Subject: [PATCH 2/2] test: update snapshot --- .../__snapshots__/parse.spec.ts.snap | 1560 +++++++++++++++++ .../compiler-core/__tests__/parse.spec.ts | 115 ++ packages/compiler-dom/__tests__/parse.spec.ts | 5 + 3 files changed, 1680 insertions(+) diff --git a/packages/compiler-core/__tests__/__snapshots__/parse.spec.ts.snap b/packages/compiler-core/__tests__/__snapshots__/parse.spec.ts.snap index 942eed4c4..e2263c31a 100644 --- a/packages/compiler-core/__tests__/__snapshots__/parse.spec.ts.snap +++ b/packages/compiler-core/__tests__/__snapshots__/parse.spec.ts.snap @@ -26,10 +26,36 @@ exports[`compiler: parse > Edge Cases > invalid html 1`] = ` "ns": 0, "props": [], "tag": "span", + "tagLoc": { + "end": { + "column": 6, + "line": 2, + "offset": 11, + }, + "source": "span", + "start": { + "column": 2, + "line": 2, + "offset": 7, + }, + }, "tagType": 0, "type": 1, }, ], + "closeTagLoc": { + "end": { + "column": 6, + "line": 3, + "offset": 18, + }, + "source": "div", + "start": { + "column": 3, + "line": 3, + "offset": 15, + }, + }, "codegenNode": undefined, "loc": { "end": { @@ -49,6 +75,19 @@ exports[`compiler: parse > Edge Cases > invalid html 1`] = ` "ns": 0, "props": [], "tag": "div", + "tagLoc": { + "end": { + "column": 5, + "line": 1, + "offset": 4, + }, + "source": "div", + "start": { + "column": 2, + "line": 1, + "offset": 1, + }, + }, "tagType": 0, "type": 1, }, @@ -166,6 +205,19 @@ exports[`compiler: parse > Edge Cases > self closing multiple tag 1`] = ` }, ], "tag": "div", + "tagLoc": { + "end": { + "column": 5, + "line": 1, + "offset": 4, + }, + "source": "div", + "start": { + "column": 2, + "line": 1, + "offset": 1, + }, + }, "tagType": 0, "type": 1, }, @@ -247,6 +299,19 @@ exports[`compiler: parse > Edge Cases > self closing multiple tag 1`] = ` }, ], "tag": "p", + "tagLoc": { + "end": { + "column": 3, + "line": 2, + "offset": 39, + }, + "source": "p", + "start": { + "column": 2, + "line": 2, + "offset": 38, + }, + }, "tagType": 0, "type": 1, }, @@ -362,6 +427,19 @@ exports[`compiler: parse > Edge Cases > valid html 1`] = ` }, ], "tag": "p", + "tagLoc": { + "end": { + "column": 5, + "line": 2, + "offset": 39, + }, + "source": "p", + "start": { + "column": 4, + "line": 2, + "offset": 38, + }, + }, "tagType": 0, "type": 1, }, @@ -383,6 +461,19 @@ exports[`compiler: parse > Edge Cases > valid html 1`] = ` "type": 3, }, ], + "closeTagLoc": { + "end": { + "column": 6, + "line": 4, + "offset": 122, + }, + "source": "div", + "start": { + "column": 3, + "line": 4, + "offset": 119, + }, + }, "codegenNode": undefined, "loc": { "end": { @@ -461,6 +552,19 @@ exports[`compiler: parse > Edge Cases > valid html 1`] = ` }, ], "tag": "div", + "tagLoc": { + "end": { + "column": 5, + "line": 1, + "offset": 4, + }, + "source": "div", + "start": { + "column": 2, + "line": 1, + "offset": 1, + }, + }, "tagType": 0, "type": 1, }, @@ -502,6 +606,19 @@ exports[`compiler: parse > Errors > CDATA_IN_HTML_CONTENT >