From 680dad65dafdb4300d3f86ea2be6bb322ecd7de9 Mon Sep 17 00:00:00 2001 From: Dylan Piercey Date: Thu, 30 Jul 2020 15:09:51 -0700 Subject: [PATCH] feat: improve index position to line, column perf --- packages/babel-utils/src/assert.js | 18 ++++--- packages/compiler/src/babel-plugin/file.js | 53 ++++++++++++------- packages/compiler/src/babel-plugin/parser.js | 21 +++++--- .../compiler/src/babel-plugin/util/get-loc.js | 28 ---------- .../src/babel-plugin/util/pos-to-loc.js | 53 +++++++++++++++++++ .../src/taglib/core/transform-await.js | 10 ++-- .../generated-error-expected.txt | 5 +- .../html-error-expected.txt | 5 +- .../vdom-error-expected.txt | 5 +- .../generated-error-expected.txt | 5 +- .../html-error-expected.txt | 5 +- .../vdom-error-expected.txt | 5 +- .../generated-error-expected.txt | 5 +- .../html-error-expected.txt | 5 +- .../vdom-error-expected.txt | 5 +- .../generated-error-expected.txt | 2 +- .../html-error-expected.txt | 2 +- .../vdom-error-expected.txt | 2 +- .../generated-error-expected.txt | 5 +- .../html-error-expected.txt | 5 +- .../vdom-error-expected.txt | 5 +- .../generated-error-expected.txt | 5 +- .../html-error-expected.txt | 5 +- .../vdom-error-expected.txt | 5 +- 24 files changed, 151 insertions(+), 113 deletions(-) delete mode 100644 packages/compiler/src/babel-plugin/util/get-loc.js create mode 100644 packages/compiler/src/babel-plugin/util/pos-to-loc.js diff --git a/packages/babel-utils/src/assert.js b/packages/babel-utils/src/assert.js index 62e27d67e..617dcf3cf 100644 --- a/packages/babel-utils/src/assert.js +++ b/packages/babel-utils/src/assert.js @@ -19,9 +19,12 @@ export function assertNoParams(path) { const { hub } = path; const params = path.get("params"); if (params.length) { - const start = params[0].node.start; - const end = params[params.length - 1].node.end; - throw hub.buildError({ start, end }, "Tag does not support parameters."); + const start = params[0].node.loc.start; + const end = params[params.length - 1].node.loc.end; + throw hub.buildError( + { loc: { start, end } }, + "Tag does not support parameters." + ); } } @@ -38,8 +41,11 @@ export function assertNoArgs(path) { const { hub } = path; const args = path.get("arguments"); if (args.length) { - const start = args[0].node.start; - const end = args[args.length - 1].node.end; - throw hub.buildError({ start, end }, "Tag does not support arguments."); + const start = args[0].node.loc.start; + const end = args[args.length - 1].node.loc.end; + throw hub.buildError( + { loc: { start, end } }, + "Tag does not support arguments." + ); } } diff --git a/packages/compiler/src/babel-plugin/file.js b/packages/compiler/src/babel-plugin/file.js index 73a9bed96..bd0c20d9e 100644 --- a/packages/compiler/src/babel-plugin/file.js +++ b/packages/compiler/src/babel-plugin/file.js @@ -5,15 +5,12 @@ import { parse, parseExpression } from "@babel/parser"; import { codeFrameColumns } from "@babel/code-frame"; import { getClientPath } from "lasso-modules-client/transport"; import { buildLookup } from "../taglib"; -import { getLoc, getLocRange } from "./util/get-loc"; +import posToLoc from "./util/pos-to-loc"; import checksum from "./util/checksum"; const CWD = process.cwd(); export class MarkoFile extends File { constructor(filename, code, jsParseOptions, markoOptions) { - const start = { line: 0, column: 0 }; - const end = getLoc(code, code.length); - const loc = { start, end, loc: { start, end } }; super( { filename, @@ -23,11 +20,9 @@ export class MarkoFile extends File { code, ast: { type: "File", - ...loc, program: { type: "Program", sourceType: "module", - ...loc, body: [], directives: [] } @@ -35,6 +30,13 @@ export class MarkoFile extends File { } ); + this.ast.start = this.ast.program.start = 0; + this.ast.end = this.ast.program.end = code.length - 1; + this.ast.loc = this.ast.program.loc = posToLoc( + this, + this.ast.start, + this.ast.end + ); this._jsParseOptions = jsParseOptions; this._markoOptions = markoOptions; this._lookup = buildLookup(path.dirname(filename), markoOptions.translator); @@ -52,16 +54,26 @@ export class MarkoFile extends File { } buildCodeFrameError(node, msg, Error = SyntaxError) { - const start = getLoc(this.code, node.start); - const end = node.end != null && getLoc(this.code, node.end); + const { loc } = node; const frame = codeFrameColumns( this.code, - { start, end }, + loc && { + start: { + line: loc.start.line, + column: loc.start.column + 1 + }, + end: + loc.end && loc.start.line === loc.end.line + ? { + line: loc.end.line, + column: loc.end.column + 1 + } + : undefined + }, { highlightCode: true } ); - const position = start.column - ? `(${start.line},${start.column})` - : `:${start.line || 0}`; + + const position = loc ? `(${loc.start.line},${loc.start.column + 1})` : ""; return new Error( `${path.relative(CWD, this.opts.filename)}${position}: ${msg}\n${frame}` ); @@ -71,7 +83,7 @@ export class MarkoFile extends File { getWhitespaceBefore(pos) { return ( this._codeAsWhitespace || - (this._codeAsWhitespace = this.code.replace(/[^\n\r ]/g, " ")) + (this._codeAsWhitespace = this.code.replace(/[^\s]/g, " ")) ).slice(0, pos); } @@ -156,10 +168,11 @@ export class MarkoFile extends File { } createNode(type, start, end, ...args) { - return { - ...t[type](...args), - ...getLocRange(this.code, start, end) - }; + const node = t[type](...args); + node.loc = posToLoc(this, start, end); + node.start = start; + node.end = end; + return node; } parse(str, start) { @@ -179,10 +192,10 @@ export class MarkoFile extends File { ? parseExpression(str, opts) : parse(str, opts).program; } catch (err) { - let { pos, message } = err; - if (pos) { + let { loc, message } = err; + if (loc) { throw this.buildCodeFrameError( - { start: pos }, + { loc: { start: loc } }, message.replace(/ *\(\d+:\d+\)$/, "") ); } else { diff --git a/packages/compiler/src/babel-plugin/parser.js b/packages/compiler/src/babel-plugin/parser.js index a94c97abd..4b6b8969b 100644 --- a/packages/compiler/src/babel-plugin/parser.js +++ b/packages/compiler/src/babel-plugin/parser.js @@ -4,9 +4,9 @@ import parseArguments from "./util/parse-arguments"; import parseParams from "./util/parse-params"; import parseIDShorthand from "./util/parse-id-shorthand"; import parseClassnameShorthand from "./util/parse-classname-shorthand"; -import { getLocRange } from "./util/get-loc"; import markoModules from "../../modules"; import { types as t } from "@marko/babel-types"; +import posToLoc from "./util/pos-to-loc"; const EMPTY_OBJECT = {}; const EMPTY_ARRAY = []; @@ -56,9 +56,10 @@ export function parse(file) { onNext = onNext && onNext(node); }, - onText({ value }, { pos }) { + onText({ value }, parser) { const shouldTrim = !preservingWhitespaceUntil; const { body } = getTagBody().node; + let pos = parser.pos - value.length; if (shouldTrim) { if (htmlTrim(value) === "") { @@ -134,7 +135,7 @@ export function parse(file) { onScriptlet({ value, line, block, pos, endPos }) { if (!line && !block) { throw file.buildCodeFrameError( - { start: pos, end: endPos }, + { loc: posToLoc(file, pos, endPos) }, "<% scriptlets %> are no longer supported." ); } @@ -163,7 +164,7 @@ export function parse(file) { if (tagNameExpression === "") { throw file.buildCodeFrameError( - { start: tagNameStartPos + 1, end: tagNameStartPos + 3 }, + { loc: posToLoc(file, tagNameStartPos + 1, tagNameStartPos + 3) }, "Missing expression for <${dynamic}> tag." ); } @@ -196,7 +197,7 @@ export function parse(file) { if (parseOptions.rootOnly && !currentTag.isProgram()) { throw file.buildCodeFrameError( - { start: pos, end: endPos }, + { loc: posToLoc(file, pos, endPos) }, `"${tagName}" tags must be at the root of your Marko template.` ); } @@ -282,7 +283,8 @@ export function parse(file) { } } - Object.assign(node, getLocRange(code, node.start, endPos)); + node.end = endPos; + node.loc = posToLoc(file, node.start, endPos); if ( !isConcise && @@ -291,7 +293,7 @@ export function parse(file) { !currentTag.get("name").isStringLiteral() ) { throw file.buildCodeFrameError( - { start: pos, end: endPos }, + { loc: posToLoc(file, pos, endPos) }, `Invalid ending for dynamic tag, expected "".` ); } @@ -311,7 +313,10 @@ export function parse(file) { onError({ message, pos, endPos }) { if (message.includes("EOF")) endPos = pos; - throw file.buildCodeFrameError({ start: pos, end: endPos }, message); + throw file.buildCodeFrameError( + { loc: posToLoc(file, pos, endPos) }, + message + ); } }; diff --git a/packages/compiler/src/babel-plugin/util/get-loc.js b/packages/compiler/src/babel-plugin/util/get-loc.js deleted file mode 100644 index 9072e95e1..000000000 --- a/packages/compiler/src/babel-plugin/util/get-loc.js +++ /dev/null @@ -1,28 +0,0 @@ -const NEW_LINE = /\r?\n/g; - -export function getLoc(code, pos) { - const src = code.slice(0, pos); - let lastIndex = 0; - let line = 1; - - while (NEW_LINE.exec(src)) { - line++; - lastIndex = NEW_LINE.lastIndex; - } - - return { - line, - column: pos - lastIndex + 1 - }; -} - -export function getLocRange(code, start, end) { - return { - start, - end, - loc: { - start: getLoc(code, start), - end: getLoc(code, end) - } - }; -} diff --git a/packages/compiler/src/babel-plugin/util/pos-to-loc.js b/packages/compiler/src/babel-plugin/util/pos-to-loc.js new file mode 100644 index 000000000..9c5caa26d --- /dev/null +++ b/packages/compiler/src/babel-plugin/util/pos-to-loc.js @@ -0,0 +1,53 @@ +const LINE_POS_CACHE = new WeakMap(); + +export default (file, start, end) => { + let linePositions = LINE_POS_CACHE.get(file); + + if (!linePositions) { + linePositions = [0]; + for (let i = 0; i < file.code.length; i++) { + if (file.code[i] === "\n") { + linePositions.push(i); + } + } + + LINE_POS_CACHE.set(file, linePositions); + } + + const startLoc = getLoc(linePositions, 0, start); + + if (startLoc) { + const endLoc = + start === end ? startLoc : getLoc(linePositions, startLoc.line - 1, end); + + return { + start: startLoc, + end: endLoc + }; + } +}; + +function getLoc(linePositions, startLine, pos) { + const endLine = linePositions.length - 1; + let max = endLine; + let line = startLine; + + while (line < max) { + const mid = (line + max) >>> 1; + if (linePositions[mid] < pos) { + line = mid + 1; + } else { + max = mid; + } + } + + let linePos = linePositions[line]; + if (linePos > pos) { + linePos = linePositions[--line]; + } + + return { + line: line + 1, + column: pos - linePos - (line === 0 ? 0 : 1) + }; +} diff --git a/packages/translator-default/src/taglib/core/transform-await.js b/packages/translator-default/src/taglib/core/transform-await.js index 48577f025..6be826d42 100644 --- a/packages/translator-default/src/taglib/core/transform-await.js +++ b/packages/translator-default/src/taglib/core/transform-await.js @@ -10,10 +10,14 @@ export function exit(path) { 'You must provide a promise argument to the "" tag, eg: "".' ); } else if (args.length > 1) { - const { start } = args[1].node; - const { end } = args[args.length - 1].node; + const { + loc: { start } + } = args[1].node; + const { + loc: { end } + } = args[args.length - 1].node; throw path.hub.file.buildCodeFrameError( - { start, end }, + { loc: { start, end } }, 'You can only pass one argument to the "" tag.' ); } diff --git a/packages/translator-default/test/fixtures/error-class-tag-nested-content/generated-error-expected.txt b/packages/translator-default/test/fixtures/error-class-tag-nested-content/generated-error-expected.txt index 558c335af..ac4c59333 100644 --- a/packages/translator-default/test/fixtures/error-class-tag-nested-content/generated-error-expected.txt +++ b/packages/translator-default/test/fixtures/error-class-tag-nested-content/generated-error-expected.txt @@ -1,6 +1,5 @@ packages/translator-default/test/fixtures/error-class-tag-nested-content/template.marko(2,2): The "class" tag does not allow nested body content 1 | class {} > 2 |
- | ^^^^^^ -> 3 | - | ^ \ No newline at end of file + | ^ + 3 | \ No newline at end of file diff --git a/packages/translator-default/test/fixtures/error-class-tag-nested-content/html-error-expected.txt b/packages/translator-default/test/fixtures/error-class-tag-nested-content/html-error-expected.txt index 558c335af..ac4c59333 100644 --- a/packages/translator-default/test/fixtures/error-class-tag-nested-content/html-error-expected.txt +++ b/packages/translator-default/test/fixtures/error-class-tag-nested-content/html-error-expected.txt @@ -1,6 +1,5 @@ packages/translator-default/test/fixtures/error-class-tag-nested-content/template.marko(2,2): The "class" tag does not allow nested body content 1 | class {} > 2 |
- | ^^^^^^ -> 3 | - | ^ \ No newline at end of file + | ^ + 3 | \ No newline at end of file diff --git a/packages/translator-default/test/fixtures/error-class-tag-nested-content/vdom-error-expected.txt b/packages/translator-default/test/fixtures/error-class-tag-nested-content/vdom-error-expected.txt index 558c335af..ac4c59333 100644 --- a/packages/translator-default/test/fixtures/error-class-tag-nested-content/vdom-error-expected.txt +++ b/packages/translator-default/test/fixtures/error-class-tag-nested-content/vdom-error-expected.txt @@ -1,6 +1,5 @@ packages/translator-default/test/fixtures/error-class-tag-nested-content/template.marko(2,2): The "class" tag does not allow nested body content 1 | class {} > 2 |
- | ^^^^^^ -> 3 | - | ^ \ No newline at end of file + | ^ + 3 | \ No newline at end of file diff --git a/packages/translator-default/test/fixtures/error-export-tag-nested-content/generated-error-expected.txt b/packages/translator-default/test/fixtures/error-export-tag-nested-content/generated-error-expected.txt index b2c2a36e6..1ea5ceaee 100644 --- a/packages/translator-default/test/fixtures/error-export-tag-nested-content/generated-error-expected.txt +++ b/packages/translator-default/test/fixtures/error-export-tag-nested-content/generated-error-expected.txt @@ -1,6 +1,5 @@ packages/translator-default/test/fixtures/error-export-tag-nested-content/template.marko(2,2): The "export" tag does not allow nested body content 1 | export a from "b"; > 2 |
- | ^^^^^^ -> 3 | - | ^ \ No newline at end of file + | ^ + 3 | \ No newline at end of file diff --git a/packages/translator-default/test/fixtures/error-export-tag-nested-content/html-error-expected.txt b/packages/translator-default/test/fixtures/error-export-tag-nested-content/html-error-expected.txt index b2c2a36e6..1ea5ceaee 100644 --- a/packages/translator-default/test/fixtures/error-export-tag-nested-content/html-error-expected.txt +++ b/packages/translator-default/test/fixtures/error-export-tag-nested-content/html-error-expected.txt @@ -1,6 +1,5 @@ packages/translator-default/test/fixtures/error-export-tag-nested-content/template.marko(2,2): The "export" tag does not allow nested body content 1 | export a from "b"; > 2 |
- | ^^^^^^ -> 3 | - | ^ \ No newline at end of file + | ^ + 3 | \ No newline at end of file diff --git a/packages/translator-default/test/fixtures/error-export-tag-nested-content/vdom-error-expected.txt b/packages/translator-default/test/fixtures/error-export-tag-nested-content/vdom-error-expected.txt index b2c2a36e6..1ea5ceaee 100644 --- a/packages/translator-default/test/fixtures/error-export-tag-nested-content/vdom-error-expected.txt +++ b/packages/translator-default/test/fixtures/error-export-tag-nested-content/vdom-error-expected.txt @@ -1,6 +1,5 @@ packages/translator-default/test/fixtures/error-export-tag-nested-content/template.marko(2,2): The "export" tag does not allow nested body content 1 | export a from "b"; > 2 |
- | ^^^^^^ -> 3 | - | ^ \ No newline at end of file + | ^ + 3 | \ No newline at end of file diff --git a/packages/translator-default/test/fixtures/error-import-tag-nested-content/generated-error-expected.txt b/packages/translator-default/test/fixtures/error-import-tag-nested-content/generated-error-expected.txt index d629a4e22..8614e2774 100644 --- a/packages/translator-default/test/fixtures/error-import-tag-nested-content/generated-error-expected.txt +++ b/packages/translator-default/test/fixtures/error-import-tag-nested-content/generated-error-expected.txt @@ -1,6 +1,5 @@ packages/translator-default/test/fixtures/error-import-tag-nested-content/template.marko(2,2): The "import" tag does not allow nested body content 1 | import a from "b"; > 2 |
- | ^^^^^^ -> 3 | - | ^ \ No newline at end of file + | ^ + 3 | \ No newline at end of file diff --git a/packages/translator-default/test/fixtures/error-import-tag-nested-content/html-error-expected.txt b/packages/translator-default/test/fixtures/error-import-tag-nested-content/html-error-expected.txt index d629a4e22..8614e2774 100644 --- a/packages/translator-default/test/fixtures/error-import-tag-nested-content/html-error-expected.txt +++ b/packages/translator-default/test/fixtures/error-import-tag-nested-content/html-error-expected.txt @@ -1,6 +1,5 @@ packages/translator-default/test/fixtures/error-import-tag-nested-content/template.marko(2,2): The "import" tag does not allow nested body content 1 | import a from "b"; > 2 |
- | ^^^^^^ -> 3 | - | ^ \ No newline at end of file + | ^ + 3 | \ No newline at end of file diff --git a/packages/translator-default/test/fixtures/error-import-tag-nested-content/vdom-error-expected.txt b/packages/translator-default/test/fixtures/error-import-tag-nested-content/vdom-error-expected.txt index d629a4e22..8614e2774 100644 --- a/packages/translator-default/test/fixtures/error-import-tag-nested-content/vdom-error-expected.txt +++ b/packages/translator-default/test/fixtures/error-import-tag-nested-content/vdom-error-expected.txt @@ -1,6 +1,5 @@ packages/translator-default/test/fixtures/error-import-tag-nested-content/template.marko(2,2): The "import" tag does not allow nested body content 1 | import a from "b"; > 2 |
- | ^^^^^^ -> 3 | - | ^ \ No newline at end of file + | ^ + 3 | \ No newline at end of file diff --git a/packages/translator-default/test/fixtures/error-scriptlets-not-supported/generated-error-expected.txt b/packages/translator-default/test/fixtures/error-scriptlets-not-supported/generated-error-expected.txt index 311f124f1..30c1756b8 100644 --- a/packages/translator-default/test/fixtures/error-scriptlets-not-supported/generated-error-expected.txt +++ b/packages/translator-default/test/fixtures/error-scriptlets-not-supported/generated-error-expected.txt @@ -1,4 +1,4 @@ packages/translator-default/test/fixtures/error-scriptlets-not-supported/template.marko(1,1): <% scriptlets %> are no longer supported. > 1 | <% console.log(x) %> - | ^^^^^^^^^^^^^^^^^^^^ + | ^ 2 |
\ No newline at end of file diff --git a/packages/translator-default/test/fixtures/error-scriptlets-not-supported/html-error-expected.txt b/packages/translator-default/test/fixtures/error-scriptlets-not-supported/html-error-expected.txt index 311f124f1..30c1756b8 100644 --- a/packages/translator-default/test/fixtures/error-scriptlets-not-supported/html-error-expected.txt +++ b/packages/translator-default/test/fixtures/error-scriptlets-not-supported/html-error-expected.txt @@ -1,4 +1,4 @@ packages/translator-default/test/fixtures/error-scriptlets-not-supported/template.marko(1,1): <% scriptlets %> are no longer supported. > 1 | <% console.log(x) %> - | ^^^^^^^^^^^^^^^^^^^^ + | ^ 2 |
\ No newline at end of file diff --git a/packages/translator-default/test/fixtures/error-scriptlets-not-supported/vdom-error-expected.txt b/packages/translator-default/test/fixtures/error-scriptlets-not-supported/vdom-error-expected.txt index 311f124f1..30c1756b8 100644 --- a/packages/translator-default/test/fixtures/error-scriptlets-not-supported/vdom-error-expected.txt +++ b/packages/translator-default/test/fixtures/error-scriptlets-not-supported/vdom-error-expected.txt @@ -1,4 +1,4 @@ packages/translator-default/test/fixtures/error-scriptlets-not-supported/template.marko(1,1): <% scriptlets %> are no longer supported. > 1 | <% console.log(x) %> - | ^^^^^^^^^^^^^^^^^^^^ + | ^ 2 |
\ No newline at end of file diff --git a/packages/translator-default/test/fixtures/error-static-tag-nested-content/generated-error-expected.txt b/packages/translator-default/test/fixtures/error-static-tag-nested-content/generated-error-expected.txt index c8a837286..8cc285101 100644 --- a/packages/translator-default/test/fixtures/error-static-tag-nested-content/generated-error-expected.txt +++ b/packages/translator-default/test/fixtures/error-static-tag-nested-content/generated-error-expected.txt @@ -1,6 +1,5 @@ packages/translator-default/test/fixtures/error-static-tag-nested-content/template.marko(2,2): The "static" tag does not allow nested body content 1 | static { console.log(x); } > 2 |
- | ^^^^^^ -> 3 | - | ^ \ No newline at end of file + | ^ + 3 | \ No newline at end of file diff --git a/packages/translator-default/test/fixtures/error-static-tag-nested-content/html-error-expected.txt b/packages/translator-default/test/fixtures/error-static-tag-nested-content/html-error-expected.txt index c8a837286..8cc285101 100644 --- a/packages/translator-default/test/fixtures/error-static-tag-nested-content/html-error-expected.txt +++ b/packages/translator-default/test/fixtures/error-static-tag-nested-content/html-error-expected.txt @@ -1,6 +1,5 @@ packages/translator-default/test/fixtures/error-static-tag-nested-content/template.marko(2,2): The "static" tag does not allow nested body content 1 | static { console.log(x); } > 2 |
- | ^^^^^^ -> 3 | - | ^ \ No newline at end of file + | ^ + 3 | \ No newline at end of file diff --git a/packages/translator-default/test/fixtures/error-static-tag-nested-content/vdom-error-expected.txt b/packages/translator-default/test/fixtures/error-static-tag-nested-content/vdom-error-expected.txt index c8a837286..8cc285101 100644 --- a/packages/translator-default/test/fixtures/error-static-tag-nested-content/vdom-error-expected.txt +++ b/packages/translator-default/test/fixtures/error-static-tag-nested-content/vdom-error-expected.txt @@ -1,6 +1,5 @@ packages/translator-default/test/fixtures/error-static-tag-nested-content/template.marko(2,2): The "static" tag does not allow nested body content 1 | static { console.log(x); } > 2 |
- | ^^^^^^ -> 3 | - | ^ \ No newline at end of file + | ^ + 3 | \ No newline at end of file diff --git a/packages/translator-default/test/fixtures/error-unclosed-tag/generated-error-expected.txt b/packages/translator-default/test/fixtures/error-unclosed-tag/generated-error-expected.txt index a1103941a..172a746c2 100644 --- a/packages/translator-default/test/fixtures/error-unclosed-tag/generated-error-expected.txt +++ b/packages/translator-default/test/fixtures/error-unclosed-tag/generated-error-expected.txt @@ -1,5 +1,4 @@ packages/translator-default/test/fixtures/error-unclosed-tag/template.marko(1,1): Missing ending "div" tag > 1 |
- | ^^^^^ -> 2 | - | ^^^^^^^^^^ \ No newline at end of file + | ^ + 2 | \ No newline at end of file diff --git a/packages/translator-default/test/fixtures/error-unclosed-tag/html-error-expected.txt b/packages/translator-default/test/fixtures/error-unclosed-tag/html-error-expected.txt index a1103941a..172a746c2 100644 --- a/packages/translator-default/test/fixtures/error-unclosed-tag/html-error-expected.txt +++ b/packages/translator-default/test/fixtures/error-unclosed-tag/html-error-expected.txt @@ -1,5 +1,4 @@ packages/translator-default/test/fixtures/error-unclosed-tag/template.marko(1,1): Missing ending "div" tag > 1 |
- | ^^^^^ -> 2 | - | ^^^^^^^^^^ \ No newline at end of file + | ^ + 2 | \ No newline at end of file diff --git a/packages/translator-default/test/fixtures/error-unclosed-tag/vdom-error-expected.txt b/packages/translator-default/test/fixtures/error-unclosed-tag/vdom-error-expected.txt index a1103941a..172a746c2 100644 --- a/packages/translator-default/test/fixtures/error-unclosed-tag/vdom-error-expected.txt +++ b/packages/translator-default/test/fixtures/error-unclosed-tag/vdom-error-expected.txt @@ -1,5 +1,4 @@ packages/translator-default/test/fixtures/error-unclosed-tag/template.marko(1,1): Missing ending "div" tag > 1 |
- | ^^^^^ -> 2 | - | ^^^^^^^^^^ \ No newline at end of file + | ^ + 2 | \ No newline at end of file