Skip to content

Commit

Permalink
perf(compiler): skip unncessary checks when parsing end tag
Browse files Browse the repository at this point in the history
  • Loading branch information
yyx990803 committed Apr 18, 2021
1 parent 2c31227 commit 048ac29
Showing 1 changed file with 31 additions and 17 deletions.
48 changes: 31 additions & 17 deletions packages/compiler-core/src/parse.ts
Original file line number Diff line number Diff line change
Expand Up @@ -444,11 +444,21 @@ const isSpecialTemplateDirective = /*#__PURE__*/ makeMap(
/**
* Parse a tag (E.g. `<div id=a>`) with that type (start tag or end tag).
*/
function parseTag(
context: ParserContext,
type: TagType.Start,
parent: ElementNode | undefined
): ElementNode
function parseTag(
context: ParserContext,
type: TagType.End,
parent: ElementNode | undefined
): void
function parseTag(
context: ParserContext,
type: TagType,
parent: ElementNode | undefined
): ElementNode {
): ElementNode | undefined {
__TEST__ && assert(/^<\/?[a-z]/i.test(context.source))
__TEST__ &&
assert(
Expand Down Expand Up @@ -478,6 +488,7 @@ function parseTag(

// check v-pre
if (
type === TagType.Start &&
!context.inVPre &&
props.some(p => p.type === NodeTypes.DIRECTIVE && p.name === 'pre')
) {
Expand All @@ -489,6 +500,22 @@ function parseTag(
props = parseAttributes(context, type).filter(p => p.name !== 'v-pre')
}

// Tag close.
let isSelfClosing = false
if (context.source.length === 0) {
emitError(context, ErrorCodes.EOF_IN_TAG)
} else {
isSelfClosing = startsWith(context.source, '/>')
if (type === TagType.End && isSelfClosing) {
emitError(context, ErrorCodes.END_TAG_WITH_TRAILING_SOLIDUS)
}
advanceBy(context, isSelfClosing ? 2 : 1)
}

if (type === TagType.End) {
return
}

// warn v-if/v-for usage on the same element
if (__COMPAT__ && __DEV__ && !__TEST__) {
let hasIf = false
Expand All @@ -512,18 +539,6 @@ function parseTag(
}
}

// Tag close.
let isSelfClosing = false
if (context.source.length === 0) {
emitError(context, ErrorCodes.EOF_IN_TAG)
} else {
isSelfClosing = startsWith(context.source, '/>')
if (type === TagType.End && isSelfClosing) {
emitError(context, ErrorCodes.END_TAG_WITH_TRAILING_SOLIDUS)
}
advanceBy(context, isSelfClosing ? 2 : 1)
}

let tagType = ElementTypes.ELEMENT
const options = context.options
if (!context.inVPre && !options.isCustomElement(tag)) {
Expand Down Expand Up @@ -565,11 +580,10 @@ function parseTag(
tagType = ElementTypes.SLOT
} else if (
tag === 'template' &&
props.some(p => {
return (
props.some(
p =>
p.type === NodeTypes.DIRECTIVE && isSpecialTemplateDirective(p.name)
)
})
)
) {
tagType = ElementTypes.TEMPLATE
}
Expand Down

0 comments on commit 048ac29

Please sign in to comment.