From a333d4bf12f881a187ec33db63a5c734c0756a35 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Mon, 5 Feb 2024 16:00:28 -0500 Subject: [PATCH] Tidy up parser (#10407) * tidy up parser a bit * better --------- Co-authored-by: Rich Harris --- .../compiler/phases/1-parse/read/context.js | 4 +- .../compiler/phases/1-parse/state/element.js | 1 + .../src/compiler/phases/1-parse/state/tag.js | 257 +++++++++--------- .../src/compiler/phases/1-parse/state/text.js | 17 +- .../svelte/src/compiler/phases/types.d.ts | 1 - .../svelte/src/compiler/types/template.d.ts | 2 + 6 files changed, 137 insertions(+), 145 deletions(-) diff --git a/packages/svelte/src/compiler/phases/1-parse/read/context.js b/packages/svelte/src/compiler/phases/1-parse/read/context.js index fabbcd0a73..e284af3380 100644 --- a/packages/svelte/src/compiler/phases/1-parse/read/context.js +++ b/packages/svelte/src/compiler/phases/1-parse/read/context.js @@ -13,9 +13,9 @@ import { error } from '../../../errors.js'; /** * @param {import('../index.js').Parser} parser - * @returns {any} + * @returns {import('estree').Pattern} */ -export default function read_context(parser) { +export default function read_pattern(parser) { const start = parser.index; let i = parser.index; diff --git a/packages/svelte/src/compiler/phases/1-parse/state/element.js b/packages/svelte/src/compiler/phases/1-parse/state/element.js index da177f596a..d2c9e4ee29 100644 --- a/packages/svelte/src/compiler/phases/1-parse/state/element.js +++ b/packages/svelte/src/compiler/phases/1-parse/state/element.js @@ -65,6 +65,7 @@ export default function tag(parser) { const data = parser.read_until(regex_closing_comment); parser.eat('-->', true); + /** @type {ReturnType>} */ parser.append({ type: 'Comment', start, diff --git a/packages/svelte/src/compiler/phases/1-parse/state/tag.js b/packages/svelte/src/compiler/phases/1-parse/state/tag.js index 08f47f5717..27c3b7e9af 100644 --- a/packages/svelte/src/compiler/phases/1-parse/state/tag.js +++ b/packages/svelte/src/compiler/phases/1-parse/state/tag.js @@ -1,9 +1,8 @@ -import read_context from '../read/context.js'; +import read_pattern from '../read/context.js'; import read_expression from '../read/expression.js'; import { error } from '../../../errors.js'; import { create_fragment } from '../utils/create.js'; import { walk } from 'zimmerframe'; -import { parse } from '../acorn.js'; const regex_whitespace_with_closing_curly_brace = /^\s*}/; @@ -24,18 +23,17 @@ export default function mustache(parser) { parser.allow_whitespace(); parser.eat('}', true); - parser.append( - /** @type {import('#compiler').ExpressionTag} */ ({ - type: 'ExpressionTag', - start, - end: parser.index, - expression, - metadata: { - contains_call_expression: false, - dynamic: false - } - }) - ); + /** @type {ReturnType>} */ + parser.append({ + type: 'ExpressionTag', + start, + end: parser.index, + expression, + metadata: { + contains_call_expression: false, + dynamic: false + } + }); } /** @param {import('../index.js').Parser} parser */ @@ -45,17 +43,16 @@ function open(parser) { if (parser.eat('if')) { parser.require_whitespace(); - const block = parser.append( - /** @type {import('#compiler').IfBlock} */ ({ - type: 'IfBlock', - elseif: false, - start, - end: -1, - test: read_expression(parser), - consequent: create_fragment(), - alternate: null - }) - ); + /** @type {ReturnType>} */ + const block = parser.append({ + type: 'IfBlock', + elseif: false, + start, + end: -1, + test: read_expression(parser), + consequent: create_fragment(), + alternate: null + }); parser.allow_whitespace(); parser.eat('}', true); @@ -139,7 +136,7 @@ function open(parser) { parser.eat('as', true); parser.require_whitespace(); - const context = read_context(parser); + const context = read_pattern(parser); parser.allow_whitespace(); @@ -167,19 +164,18 @@ function open(parser) { parser.eat('}', true); - const block = parser.append( - /** @type {Omit} */ ({ - type: 'EachBlock', - start, - end: -1, - expression, - body: create_fragment(), - context, - index, - key, - metadata: /** @type {any} */ (null) // filled in later - }) - ); + /** @type {ReturnType>} */ + const block = parser.append({ + type: 'EachBlock', + start, + end: -1, + expression, + body: create_fragment(), + context, + index, + key, + metadata: /** @type {any} */ (null) // filled in later + }); parser.stack.push(block); parser.fragments.push(block.body); @@ -192,26 +188,25 @@ function open(parser) { const expression = read_expression(parser); parser.allow_whitespace(); - const block = parser.append( - /** @type {import('#compiler').AwaitBlock} */ ({ - type: 'AwaitBlock', - start, - end: -1, - expression, - value: null, - error: null, - pending: null, - then: null, - catch: null - }) - ); + /** @type {ReturnType>} */ + const block = parser.append({ + type: 'AwaitBlock', + start, + end: -1, + expression, + value: null, + error: null, + pending: null, + then: null, + catch: null + }); if (parser.eat('then')) { if (parser.match_regex(regex_whitespace_with_closing_curly_brace)) { parser.allow_whitespace(); } else { parser.require_whitespace(); - block.value = read_context(parser); + block.value = read_pattern(parser); parser.allow_whitespace(); } @@ -222,7 +217,7 @@ function open(parser) { parser.allow_whitespace(); } else { parser.require_whitespace(); - block.error = read_context(parser); + block.error = read_pattern(parser); parser.allow_whitespace(); } @@ -247,15 +242,14 @@ function open(parser) { parser.eat('}', true); - const block = parser.append( - /** @type {import('#compiler').KeyBlock} */ ({ - type: 'KeyBlock', - start, - end: -1, - expression, - fragment: create_fragment() - }) - ); + /** @type {ReturnType>} */ + const block = parser.append({ + type: 'KeyBlock', + start, + end: -1, + expression, + fragment: create_fragment() + }); parser.stack.push(block); parser.fragments.push(block.fragment); @@ -270,6 +264,10 @@ function open(parser) { const name = parser.read_identifier(); const name_end = parser.index; + if (name === null) { + error(parser.index, 'expected-identifier'); + } + parser.eat('(', true); parser.allow_whitespace(); @@ -278,7 +276,7 @@ function open(parser) { const parameters = []; while (!parser.match(')')) { - let pattern = read_context(parser); + let pattern = read_pattern(parser); parser.allow_whitespace(); if (parser.eat('=')) { @@ -301,22 +299,20 @@ function open(parser) { parser.allow_whitespace(); parser.eat('}', true); - const block = parser.append( - /** @type {Omit} */ - ({ - type: 'SnippetBlock', - start, - end: -1, - expression: { - type: 'Identifier', - start: name_start, - end: name_end, - name - }, - parameters, - body: create_fragment() - }) - ); + /** @type {ReturnType>} */ + const block = parser.append({ + type: 'SnippetBlock', + start, + end: -1, + expression: { + type: 'Identifier', + start: name_start, + end: name_end, + name + }, + parameters, + body: create_fragment() + }); parser.stack.push(block); parser.fragments.push(block.body); @@ -353,17 +349,16 @@ function next(parser) { parser.allow_whitespace(); parser.eat('}', true); - const child = parser.append( - /** @type {import('#compiler').IfBlock} */ ({ - start: parser.index, - end: -1, - type: 'IfBlock', - elseif: true, - test: expression, - consequent: create_fragment(), - alternate: null - }) - ); + /** @type {ReturnType>} */ + const child = parser.append({ + start: parser.index, + end: -1, + type: 'IfBlock', + elseif: true, + test: expression, + consequent: create_fragment(), + alternate: null + }); parser.stack.push(child); parser.fragments.pop(); @@ -399,7 +394,7 @@ function next(parser) { if (!parser.eat('}')) { parser.require_whitespace(); - block.value = read_context(parser); + block.value = read_pattern(parser); parser.allow_whitespace(); parser.eat('}', true); } @@ -418,7 +413,7 @@ function next(parser) { if (!parser.eat('}')) { parser.require_whitespace(); - block.error = read_context(parser); + block.error = read_pattern(parser); parser.allow_whitespace(); parser.eat('}', true); } @@ -498,14 +493,13 @@ function special(parser) { parser.allow_whitespace(); parser.eat('}', true); - parser.append( - /** @type {import('#compiler').HtmlTag} */ ({ - type: 'HtmlTag', - start, - end: parser.index, - expression - }) - ); + /** @type {ReturnType>} */ + parser.append({ + type: 'HtmlTag', + start, + end: parser.index, + expression + }); return; } @@ -537,14 +531,13 @@ function special(parser) { parser.eat('}', true); } - parser.append( - /** @type {import('#compiler').DebugTag} */ ({ - type: 'DebugTag', - start, - end: parser.index, - identifiers - }) - ); + /** @type {ReturnType>} */ + parser.append({ + type: 'DebugTag', + start, + end: parser.index, + identifiers + }); return; } @@ -552,7 +545,7 @@ function special(parser) { if (parser.eat('const')) { parser.allow_whitespace(); - const id = read_context(parser); + const id = read_pattern(parser); parser.allow_whitespace(); parser.eat('=', true); @@ -563,20 +556,19 @@ function special(parser) { parser.eat('}', true); - parser.append( - /** @type {import('#compiler').ConstTag} */ ({ - type: 'ConstTag', - start, - end: parser.index, - declaration: { - type: 'VariableDeclaration', - kind: 'const', - declarations: [{ type: 'VariableDeclarator', id, init }], - start: start + 1, - end: parser.index - 1 - } - }) - ); + /** @type {ReturnType>} */ + parser.append({ + type: 'ConstTag', + start, + end: parser.index, + declaration: { + type: 'VariableDeclaration', + kind: 'const', + declarations: [{ type: 'VariableDeclarator', id, init }], + start: start + 1, + end: parser.index - 1 + } + }); } if (parser.eat('render')) { @@ -592,14 +584,13 @@ function special(parser) { parser.allow_whitespace(); parser.eat('}', true); - parser.append( - /** @type {import('#compiler').RenderTag} */ ({ - type: 'RenderTag', - start, - end: parser.index, - expression: expression.callee, - arguments: expression.arguments - }) - ); + /** @type {ReturnType>} */ + parser.append({ + type: 'RenderTag', + start, + end: parser.index, + expression: expression.callee, + arguments: expression.arguments + }); } } diff --git a/packages/svelte/src/compiler/phases/1-parse/state/text.js b/packages/svelte/src/compiler/phases/1-parse/state/text.js index 6943de1779..5ba29885c4 100644 --- a/packages/svelte/src/compiler/phases/1-parse/state/text.js +++ b/packages/svelte/src/compiler/phases/1-parse/state/text.js @@ -10,13 +10,12 @@ export default function text(parser) { data += parser.template[parser.index++]; } - parser.append( - /** @type {import('#compiler').Text} */ ({ - type: 'Text', - start, - end: parser.index, - raw: data, - data: decode_character_references(data, false) - }) - ); + /** @type {ReturnType>} */ + parser.append({ + type: 'Text', + start, + end: parser.index, + raw: data, + data: decode_character_references(data, false) + }); } diff --git a/packages/svelte/src/compiler/phases/types.d.ts b/packages/svelte/src/compiler/phases/types.d.ts index ba1c147889..54151e23e9 100644 --- a/packages/svelte/src/compiler/phases/types.d.ts +++ b/packages/svelte/src/compiler/phases/types.d.ts @@ -1,5 +1,4 @@ import type { - BindDirective, Binding, Fragment, RegularElement, diff --git a/packages/svelte/src/compiler/types/template.d.ts b/packages/svelte/src/compiler/types/template.d.ts index bed42415aa..26b6ee7ca2 100644 --- a/packages/svelte/src/compiler/types/template.d.ts +++ b/packages/svelte/src/compiler/types/template.d.ts @@ -485,5 +485,7 @@ declare module 'estree' { start?: number; /** Added by the Svelte parser */ end?: number; + /** Added by acorn-typescript */ + typeAnnotation?: any; } }