diff options
author | 2021-03-22 00:40:29 -0700 | |
---|---|---|
committer | 2021-03-22 00:40:29 -0700 | |
commit | 9de1e8feabf6be007550e2dc8932a9200bd8755c (patch) | |
tree | c9abb89b6dfc4807c8f1c074d81a0acfdf94f81a /src/compiler/parse/acorn.ts | |
parent | d125d57b3a314d994149f84c18747c85bdf1f0b1 (diff) | |
download | astro-9de1e8feabf6be007550e2dc8932a9200bd8755c.tar.gz astro-9de1e8feabf6be007550e2dc8932a9200bd8755c.tar.zst astro-9de1e8feabf6be007550e2dc8932a9200bd8755c.zip |
cleanup new parser handling
Diffstat (limited to 'src/compiler/parse/acorn.ts')
-rw-r--r-- | src/compiler/parse/acorn.ts | 25 |
1 files changed, 9 insertions, 16 deletions
diff --git a/src/compiler/parse/acorn.ts b/src/compiler/parse/acorn.ts index b88454151..c70756d79 100644 --- a/src/compiler/parse/acorn.ts +++ b/src/compiler/parse/acorn.ts @@ -14,32 +14,25 @@ export const parse = (source: string): Node => { // }); }; -export const parse_expression_at = (source: string, index: number) => { +export const parse_expression_at = (source: string, index: number): number => { // TODO: Clean up after acorn -> @babel/parser move try { + // First, try to parse the expression. Unlike acorn, @babel/parser isn't relaxed + // enough to just stop after the first expression, so we almost always expect a + // parser error here instead. This is expected, so handle it. parseExpression(source.slice(index), { sourceType: 'module', plugins: ['jsx', 'typescript'], }); throw new Error('Parse error.'); // Expected to fail. } catch (err) { - if (!err.pos) { - throw err; + if (err.message.startsWith('Unexpected token') && source[index + err.pos] === '}') { + return index + err.pos; } - try { - const result = parseExpression(source.slice(index, index + err.pos), { - sourceType: 'module', - plugins: ['jsx', 'typescript'], - }); - result.start = index; - result.end = index + err.pos; - return result; - } catch (err2) { - if (err2.pos) { - err2.pos = index + err2.pos; - } - throw err2; + if (err.pos) { + err.pos = index + err.pos; } + throw err; } }; // acornJsx.parseExpressionAt(source, index, { |