@@ -4,7 +4,11 @@ import type { Parser, Options } from "acorn"
44import type { Comment } from "../types"
55import type { Node } from "estree"
66import { getAcorn } from "./modules/acorn"
7- import { ParseError , throwUnexpectedCommentError } from "./errors"
7+ import {
8+ ParseError ,
9+ throwUnexpectedCommentError ,
10+ throwUnexpectedTokenError ,
11+ } from "./errors"
812import { TokenConvertor } from "./convert"
913import type { JSONSyntaxContext } from "./syntax-context"
1014
@@ -36,10 +40,20 @@ export function getParser(): typeof Parser {
3640 nodes : Node [ ]
3741 } ,
3842 code : string ,
43+ pos : number ,
3944 ) {
4045 super (
4146 ( ( ) : Options => {
4247 const tokenConvertor = new TokenConvertor ( options . ctx , code )
48+
49+ const onToken : Options [ "onToken" ] =
50+ options . onToken ||
51+ ( ( token ) => {
52+ const t = tokenConvertor . convertToken ( token )
53+ if ( t ) {
54+ this [ PRIVATE ] . tokenStore . add ( t )
55+ }
56+ } )
4357 return {
4458 // do not use spread, because we don't want to pass any unknown options to acorn
4559 ecmaVersion : options . ecmaVersion ,
@@ -49,12 +63,7 @@ export function getParser(): typeof Parser {
4963 allowReserved : true ,
5064
5165 // Collect tokens
52- onToken : ( token ) => {
53- const t = tokenConvertor . convertToken ( token )
54- if ( t ) {
55- this [ PRIVATE ] . tokenStore . add ( t )
56- }
57- } ,
66+ onToken,
5867
5968 // Collect comments
6069 onComment : (
@@ -82,6 +91,7 @@ export function getParser(): typeof Parser {
8291 }
8392 } ) ( ) ,
8493 code ,
94+ pos ,
8595 )
8696 this [ PRIVATE ] = {
8797 code,
@@ -171,3 +181,26 @@ export function getParser(): typeof Parser {
171181
172182 return parserCache
173183}
184+
185+ /** Get extend parser */
186+ export function getAnyTokenErrorParser ( ) : typeof Parser {
187+ const parser = class ExtendParser extends getParser ( ) {
188+ public constructor ( options : Options , code : string , pos : number ) {
189+ super (
190+ {
191+ ...options ,
192+ onToken : ( token ) => {
193+ return throwUnexpectedTokenError (
194+ code . slice ( ...token . range ! ) ,
195+ token ,
196+ )
197+ } ,
198+ } ,
199+ code ,
200+ pos ,
201+ )
202+ }
203+ }
204+
205+ return parser
206+ }
0 commit comments