diff --git a/packages/compiler-core/__tests__/parse.spec.ts b/packages/compiler-core/__tests__/parse.spec.ts index 8879c454..2cbe7187 100644 --- a/packages/compiler-core/__tests__/parse.spec.ts +++ b/packages/compiler-core/__tests__/parse.spec.ts @@ -11,7 +11,7 @@ import { Position, TextNode } from '../src/ast' -import { ParserErrorTypes } from '../src/errorTypes' +import { ParserErrorTypes } from '../src/parserErrorTypes' import { parserOptionsMinimal as parserOptions } from '../src/parserOptionsMinimal' describe('parser/parse', () => { diff --git a/packages/compiler-core/src/assert.ts b/packages/compiler-core/src/assert.ts index 2f349812..e69de29b 100644 --- a/packages/compiler-core/src/assert.ts +++ b/packages/compiler-core/src/assert.ts @@ -1,5 +0,0 @@ -export function assert(condition: boolean, msg?: string) { - if (!condition) { - throw new Error(msg || `unexpected parser condition`) - } -} diff --git a/packages/compiler-core/src/index.ts b/packages/compiler-core/src/index.ts index 2e25f608..7dcb2fff 100644 --- a/packages/compiler-core/src/index.ts +++ b/packages/compiler-core/src/index.ts @@ -1,3 +1,3 @@ export { parse } from './parser' export * from './ast' -export * from './errorTypes' +export * from './parserErrorTypes' diff --git a/packages/compiler-core/src/parser.ts b/packages/compiler-core/src/parser.ts index fd9dd434..4d1fb84f 100644 --- a/packages/compiler-core/src/parser.ts +++ b/packages/compiler-core/src/parser.ts @@ -1,5 +1,4 @@ -import { assert } from './assert' -import { ParserErrorTypes } from './errorTypes' +import { ParserErrorTypes } from './parserErrorTypes' import { Node, AttributeNode, @@ -60,93 +59,6 @@ export function parse(content: string, options: ParserOptions): RootNode { } } -function last(xs: T[]): T | undefined { - return xs[xs.length - 1] -} - -function startsWith(source: string, searchString: string): boolean { - return source.startsWith(searchString) -} - -function advanceBy(context: ParserContext, numberOfCharacters: number): void { - __DEV__ && assert(numberOfCharacters <= context.source.length) - - const { column, source } = context - const str = source.slice(0, numberOfCharacters) - const lines = str.split(/\r?\n/) - - context.source = source.slice(numberOfCharacters) - context.offset += numberOfCharacters - context.line += lines.length - 1 - context.column = - lines.length === 1 - ? column + numberOfCharacters - : Math.max(1, lines.pop()!.length) -} - -function advanceSpaces(context: ParserContext): void { - const match = /^[\t\r\n\f ]+/.exec(context.source) - if (match) { - advanceBy(context, match[0].length) - } -} - -function getCursor(context: ParserContext): Position { - const { column, line, offset } = context - return { column, line, offset } -} - -function getNewPosition( - context: ParserContext, - start: Position, - numberOfCharacters: number -): Position { - const { originalSource } = context - const str = originalSource.slice(start.offset, numberOfCharacters) - const lines = str.split(/\r?\n/) - - const newPosition = { - column: start.column, - line: start.line, - offset: start.offset - } - - newPosition.offset += numberOfCharacters - newPosition.line += lines.length - 1 - newPosition.column = - lines.length === 1 - ? start.column + numberOfCharacters - : Math.max(1, lines.pop()!.length) - - return newPosition -} - -function getSelection( - context: ParserContext, - start: Position, - end?: Position -): SourceLocation { - end = end || getCursor(context) - return { - start, - end, - source: context.originalSource.slice(start.offset, end.offset) - } -} - -function emitError( - context: ParserContext, - type: ParserErrorTypes, - offset?: number -): void { - const loc = getCursor(context) - if (offset) { - loc.offset += offset - loc.column += offset - } - context.onError(type, loc) -} - function createParserContext( content: string, options: ParserOptions @@ -165,6 +77,11 @@ function createParserContext( } } +function getCursor(context: ParserContext): Position { + const { column, line, offset } = context + return { column, line, offset } +} + function parseChildren( context: ParserContext, mode: TextModes, @@ -255,6 +172,88 @@ function parseChildren( return nodes } +function getSelection( + context: ParserContext, + start: Position, + end?: Position +): SourceLocation { + end = end || getCursor(context) + return { + start, + end, + source: context.originalSource.slice(start.offset, end.offset) + } +} + +function last(xs: T[]): T | undefined { + return xs[xs.length - 1] +} + +function startsWith(source: string, searchString: string): boolean { + return source.startsWith(searchString) +} + +function advanceBy(context: ParserContext, numberOfCharacters: number): void { + __DEV__ && assert(numberOfCharacters <= context.source.length) + + const { column, source } = context + const str = source.slice(0, numberOfCharacters) + const lines = str.split(/\r?\n/) + + context.source = source.slice(numberOfCharacters) + context.offset += numberOfCharacters + context.line += lines.length - 1 + context.column = + lines.length === 1 + ? column + numberOfCharacters + : Math.max(1, lines.pop()!.length) +} + +function advanceSpaces(context: ParserContext): void { + const match = /^[\t\r\n\f ]+/.exec(context.source) + if (match) { + advanceBy(context, match[0].length) + } +} + +function getNewPosition( + context: ParserContext, + start: Position, + numberOfCharacters: number +): Position { + const { originalSource } = context + const str = originalSource.slice(start.offset, numberOfCharacters) + const lines = str.split(/\r?\n/) + + const newPosition = { + column: start.column, + line: start.line, + offset: start.offset + } + + newPosition.offset += numberOfCharacters + newPosition.line += lines.length - 1 + newPosition.column = + lines.length === 1 + ? start.column + numberOfCharacters + : Math.max(1, lines.pop()!.length) + + return newPosition +} + +function emitError( + context: ParserContext, + type: ParserErrorTypes, + offset?: number +): void { + const loc = getCursor(context) + if (offset) { + loc.offset += offset + loc.column += offset + } + context.onError(type, loc) +} + function isEnd( context: ParserContext, mode: TextModes, @@ -918,3 +917,9 @@ const CCR_REPLACEMENTS: { [key: number]: number | undefined } = { 0x9e: 0x017e, 0x9f: 0x0178 } + +function assert(condition: boolean, msg?: string) { + if (!condition) { + throw new Error(msg || `unexpected parser condition`) + } +} diff --git a/packages/compiler-core/src/errorTypes.ts b/packages/compiler-core/src/parserErrorTypes.ts similarity index 100% rename from packages/compiler-core/src/errorTypes.ts rename to packages/compiler-core/src/parserErrorTypes.ts diff --git a/packages/compiler-core/src/parserOptionsMinimal.ts b/packages/compiler-core/src/parserOptionsMinimal.ts index e6f0576a..792d36c7 100644 --- a/packages/compiler-core/src/parserOptionsMinimal.ts +++ b/packages/compiler-core/src/parserOptionsMinimal.ts @@ -1,6 +1,6 @@ import { TextModes, ParserOptions } from './parser' import { ElementNode, Namespaces, Position, Node } from './ast' -import { ParserErrorTypes } from './errorTypes' +import { ParserErrorTypes } from './parserErrorTypes' export const parserOptionsMinimal: ParserOptions = { delimiters: [`{{`, `}}`],