mirror of https://github.com/vuejs/core.git
fix(compiler-core): handle slot argument parsing edge case
ref https://github.com/vuejs/language-tools/issues/2710
This commit is contained in:
parent
a778034a3e
commit
b434d12bf6
|
@ -11,7 +11,8 @@ import {
|
||||||
Position,
|
Position,
|
||||||
TextNode,
|
TextNode,
|
||||||
InterpolationNode,
|
InterpolationNode,
|
||||||
ConstantTypes
|
ConstantTypes,
|
||||||
|
DirectiveNode
|
||||||
} from '../src/ast'
|
} from '../src/ast'
|
||||||
|
|
||||||
describe('compiler: parse', () => {
|
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', () => {
|
test('directive with dynamic argument', () => {
|
||||||
const ast = baseParse('<div v-on:[event]/>')
|
const ast = baseParse('<div v-on:[event]/>')
|
||||||
const directive = (ast.children[0] as ElementNode).props[0]
|
const directive = (ast.children[0] as ElementNode).props[0]
|
||||||
|
|
|
@ -817,7 +817,10 @@ function parseAttribute(
|
||||||
|
|
||||||
if (match[2]) {
|
if (match[2]) {
|
||||||
const isSlot = dirName === 'slot'
|
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(
|
const loc = getSelection(
|
||||||
context,
|
context,
|
||||||
getNewPosition(context, start, startOffset),
|
getNewPosition(context, start, startOffset),
|
||||||
|
|
Loading…
Reference in New Issue