diff options
Diffstat (limited to 'src/parser/parse/acorn.ts')
-rw-r--r-- | src/parser/parse/acorn.ts | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/src/parser/parse/acorn.ts b/src/parser/parse/acorn.ts new file mode 100644 index 000000000..7fc0f8f67 --- /dev/null +++ b/src/parser/parse/acorn.ts @@ -0,0 +1,42 @@ +import type { Node } from 'acorn'; +import { parseExpression } from '@babel/parser'; +// import acorn from 'acorn'; +// // @ts-ignore +// import jsx from 'acorn-jsx'; +// const acornJsx = acorn.Parser.extend(jsx()); + +export const parse = (source: string): Node => { + throw new Error('No longer used.'); + // acorn.parse(source, { + // sourceType: 'module', + // ecmaVersion: 2020, + // locations: true, + // }); +}; + +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.message.startsWith('Unexpected token') && source[index + err.pos] === '}') { + return index + err.pos; + } + if (err.pos) { + err.pos = index + err.pos; + } + throw err; + } +}; +// acornJsx.parseExpressionAt(source, index, { +// sourceType: 'module', +// ecmaVersion: 2020, +// locations: true, +// });
\ No newline at end of file |