From: Evan You Date: Mon, 15 Apr 2024 03:50:57 +0000 (+0800) Subject: fix(compiler-core): fix loc.source for end tags with whitespace before > X-Git-Tag: v3.4.22~21 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=16174da21d6c8ac0aae027dd964fc35e221ded0a;p=thirdparty%2Fvuejs%2Fcore.git fix(compiler-core): fix loc.source for end tags with whitespace before > close #10694 close #10695 --- diff --git a/packages/compiler-core/__tests__/parse.spec.ts b/packages/compiler-core/__tests__/parse.spec.ts index 882133a538..429a796861 100644 --- a/packages/compiler-core/__tests__/parse.spec.ts +++ b/packages/compiler-core/__tests__/parse.spec.ts @@ -2070,6 +2070,16 @@ describe('compiler: parse', () => { baseParse(``, { parseMode: 'sfc', onError() {} }) expect(() => baseParse(`{ foo }`)).not.toThrow() }) + + test('correct loc when the closing > is foarmatted', () => { + const [span] = baseParse(``).children + + expect(span.loc.source).toBe('') + expect(span.loc.start.offset).toBe(0) + expect(span.loc.end.offset).toBe(27) + }) }) describe('decodeEntities option', () => { diff --git a/packages/compiler-core/src/parser.ts b/packages/compiler-core/src/parser.ts index 202fba81b1..da8861b923 100644 --- a/packages/compiler-core/src/parser.ts +++ b/packages/compiler-core/src/parser.ts @@ -613,7 +613,7 @@ function onCloseTag(el: ElementNode, end: number, isImplied = false) { // implied close, end should be backtracked to close setLocEnd(el.loc, backTrack(end, CharCodes.Lt)) } else { - setLocEnd(el.loc, end + 1) + setLocEnd(el.loc, lookAhead(end, CharCodes.Gt) + 1) } if (tokenizer.inSFCRoot) { @@ -736,6 +736,12 @@ function onCloseTag(el: ElementNode, end: number, isImplied = false) { } } +function lookAhead(index: number, c: number) { + let i = index + while (currentInput.charCodeAt(i) !== c && i < currentInput.length - 1) i++ + return i +} + function backTrack(index: number, c: number) { let i = index while (currentInput.charCodeAt(i) !== c && i >= 0) i--