diff --git a/src/compiler/parser/index.js b/src/compiler/parser/index.js index ec0e302c..2b726e5d 100644 --- a/src/compiler/parser/index.js +++ b/src/compiler/parser/index.js @@ -377,16 +377,20 @@ export function parse ( } }, comment (text: string, start, end) { - const child: ASTText = { - type: 3, - text, - isComment: true + // adding anyting as a sibling to the root node is forbidden + // comments should still be allowed, but ignored + if (currentParent) { + const child: ASTText = { + type: 3, + text, + isComment: true + } + if (process.env.NODE_ENV !== 'production' && options.outputSourceRange) { + child.start = start + child.end = end + } + currentParent.children.push(child) } - if (process.env.NODE_ENV !== 'production' && options.outputSourceRange) { - child.start = start - child.end = end - } - currentParent.children.push(child) } }) return root diff --git a/test/unit/modules/compiler/parser.spec.js b/test/unit/modules/compiler/parser.spec.js index e81f30ca..13f1c0d3 100644 --- a/test/unit/modules/compiler/parser.spec.js +++ b/test/unit/modules/compiler/parser.spec.js @@ -786,6 +786,16 @@ describe('parser', () => { expect(ast.children[1].text).toBe('comment here') }) + // #9407 + it('should parse templates with comments anywhere', () => { + const options = extend({ + comments: true + }, baseOptions) + const ast = parse(`
123
`, options) + expect(ast.tag).toBe('div') + expect(ast.children.length).toBe(1) + }) + // #8103 it('should allow CRLFs in string interpolations', () => { const ast = parse(`

{{\r\nmsg\r\n}}

`, baseOptions) @@ -797,7 +807,7 @@ describe('parser', () => { preserveWhitespace: false }, baseOptions) - const ast = parse('

\n Welcome to Vue.js world \n .\n Have fun!\n

', options) + const ast = parse('

\n Welcome to Vue.js world \n .\n Have fun!\n

', options) expect(ast.tag).toBe('p') expect(ast.children.length).toBe(4) expect(ast.children[0].type).toBe(3)