fix(compiler-core): handle slot argument parsing edge case

ref https://github.com/vuejs/language-tools/issues/2710
This commit is contained in:
Evan You 2023-04-27 16:55:37 +08:00
parent a778034a3e
commit b434d12bf6
2 changed files with 34 additions and 2 deletions

View File

@ -11,7 +11,8 @@ import {
Position,
TextNode,
InterpolationNode,
ConstantTypes
ConstantTypes,
DirectiveNode
} from '../src/ast'
describe('compiler: parse', () => {
@ -1164,6 +1165,34 @@ describe('compiler: parse', () => {
})
})
// #3494
test('directive argument edge case', () => {
const ast = baseParse('<div v-slot:slot />')
const directive = (ast.children[0] as ElementNode)
.props[0] as DirectiveNode
expect(directive.arg).toMatchObject({
loc: {
start: { offset: 12, line: 1, column: 13 },
end: { offset: 16, line: 1, column: 17 },
source: 'slot'
}
})
})
// https://github.com/vuejs/language-tools/issues/2710
test('directive argument edge case (2)', () => {
const ast = baseParse('<div #item.item />')
const directive = (ast.children[0] as ElementNode)
.props[0] as DirectiveNode
expect(directive.arg).toMatchObject({
loc: {
start: { offset: 6, line: 1, column: 7 },
end: { offset: 15, line: 1, column: 16 },
source: 'item.item'
}
})
})
test('directive with dynamic argument', () => {
const ast = baseParse('<div v-on:[event]/>')
const directive = (ast.children[0] as ElementNode).props[0]

View File

@ -817,7 +817,10 @@ function parseAttribute(
if (match[2]) {
const isSlot = dirName === 'slot'
const startOffset = name.lastIndexOf(match[2])
const startOffset = name.lastIndexOf(
match[2],
name.length - (match[3]?.length || 0)
)
const loc = getSelection(
context,
getNewPosition(context, start, startOffset),