Fix language features when using nested Vue `<template>` (#532)

master
Brad Cornes 2022-04-19 15:02:27 +01:00 committed by GitHub
parent ef111a9bc7
commit cd1678bd8d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 24 additions and 11 deletions

View File

@ -81,6 +81,17 @@ let vueStates = {
},
html: {
htmlBlockEnd: { match: '</template>', pop: 1 },
nestedBlockStart: { match: '<template', push: 'nestedBlock' },
...text,
},
nestedBlock: {
nestedStart: { match: '>', next: 'nested' },
nestedBlockEnd: { match: '/>', pop: 1 },
...text,
},
nested: {
nestedBlockEnd: { match: '</template>', pop: 1 },
nestedBlockStart: { match: '<template', push: 'nestedBlock' },
...text,
},
}
@ -124,19 +135,21 @@ export function getLanguageBoundaries(
try {
for (let token of lexer) {
if (token.type.endsWith('BlockStart')) {
let position = indexToPosition(text, offset)
if (!boundaries[boundaries.length - 1].range.end) {
if (!token.type.startsWith('nested')) {
if (token.type.endsWith('BlockStart')) {
let position = indexToPosition(text, offset)
if (!boundaries[boundaries.length - 1].range.end) {
boundaries[boundaries.length - 1].range.end = position
}
type = token.type.replace(/BlockStart$/, '')
boundaries.push({ type, range: { start: position, end: undefined } })
} else if (token.type.endsWith('BlockEnd')) {
let position = indexToPosition(text, offset)
boundaries[boundaries.length - 1].range.end = position
boundaries.push({ type: defaultType, range: { start: position, end: undefined } })
} else if (token.type === 'lang') {
boundaries[boundaries.length - 1].type = token.text
}
type = token.type.replace(/BlockStart$/, '')
boundaries.push({ type, range: { start: position, end: undefined } })
} else if (token.type.endsWith('BlockEnd')) {
let position = indexToPosition(text, offset)
boundaries[boundaries.length - 1].range.end = position
boundaries.push({ type: defaultType, range: { start: position, end: undefined } })
} else if (token.type === 'lang') {
boundaries[boundaries.length - 1].type = token.text
}
offset += token.text.length
}