Skip to content

Commit 545d09b

Browse files
committed
refactor(oxc_parser): generic Lexer and Parser
1 parent d77e22d commit 545d09b

30 files changed

+201
-120
lines changed

crates/oxc_parser/src/cursor.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,21 @@ use oxc_diagnostics::OxcDiagnostic;
66
use oxc_span::{GetSpan, Span};
77

88
use crate::{
9-
Context, ParserImpl, diagnostics,
9+
Context, ParserConfig, ParserImpl, diagnostics,
1010
error_handler::FatalError,
1111
lexer::{Kind, LexerCheckpoint, LexerContext, Token},
1212
};
1313

1414
#[derive(Clone)]
15-
pub struct ParserCheckpoint<'a> {
16-
lexer: LexerCheckpoint<'a>,
15+
pub struct ParserCheckpoint<'a, C: ParserConfig> {
16+
lexer: LexerCheckpoint<'a, C>,
1717
cur_token: Token,
1818
prev_span_end: u32,
1919
errors_pos: usize,
2020
fatal_error: Option<FatalError>,
2121
}
2222

23-
impl<'a> ParserImpl<'a> {
23+
impl<'a, C: ParserConfig> ParserImpl<'a, C> {
2424
#[inline]
2525
pub(crate) fn start_span(&self) -> u32 {
2626
self.token.start()
@@ -300,7 +300,7 @@ impl<'a> ParserImpl<'a> {
300300
}
301301
}
302302

303-
pub(crate) fn checkpoint(&mut self) -> ParserCheckpoint<'a> {
303+
pub(crate) fn checkpoint(&mut self) -> ParserCheckpoint<'a, C> {
304304
ParserCheckpoint {
305305
lexer: self.lexer.checkpoint(),
306306
cur_token: self.token,
@@ -310,7 +310,7 @@ impl<'a> ParserImpl<'a> {
310310
}
311311
}
312312

313-
pub(crate) fn checkpoint_with_error_recovery(&mut self) -> ParserCheckpoint<'a> {
313+
pub(crate) fn checkpoint_with_error_recovery(&mut self) -> ParserCheckpoint<'a, C> {
314314
ParserCheckpoint {
315315
lexer: self.lexer.checkpoint_with_error_recovery(),
316316
cur_token: self.token,
@@ -320,7 +320,7 @@ impl<'a> ParserImpl<'a> {
320320
}
321321
}
322322

323-
pub(crate) fn rewind(&mut self, checkpoint: ParserCheckpoint<'a>) {
323+
pub(crate) fn rewind(&mut self, checkpoint: ParserCheckpoint<'a, C>) {
324324
let ParserCheckpoint { lexer, cur_token, prev_span_end, errors_pos, fatal_error } =
325325
checkpoint;
326326

@@ -333,7 +333,7 @@ impl<'a> ParserImpl<'a> {
333333

334334
pub(crate) fn try_parse<T>(
335335
&mut self,
336-
func: impl FnOnce(&mut ParserImpl<'a>) -> T,
336+
func: impl FnOnce(&mut ParserImpl<'a, C>) -> T,
337337
) -> Option<T> {
338338
let checkpoint = self.checkpoint_with_error_recovery();
339339
let ctx = self.ctx;
@@ -347,7 +347,7 @@ impl<'a> ParserImpl<'a> {
347347
}
348348
}
349349

350-
pub(crate) fn lookahead<U>(&mut self, predicate: impl Fn(&mut ParserImpl<'a>) -> U) -> U {
350+
pub(crate) fn lookahead<U>(&mut self, predicate: impl Fn(&mut ParserImpl<'a, C>) -> U) -> U {
351351
let checkpoint = self.checkpoint();
352352
let answer = predicate(self);
353353
self.rewind(checkpoint);

crates/oxc_parser/src/error_handler.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use oxc_allocator::Dummy;
44
use oxc_diagnostics::OxcDiagnostic;
55
use oxc_span::Span;
66

7-
use crate::{ParserImpl, diagnostics, lexer::Kind};
7+
use crate::{ParserConfig, ParserImpl, diagnostics, lexer::Kind};
88

99
/// Fatal parsing error.
1010
#[derive(Debug, Clone)]
@@ -15,7 +15,7 @@ pub struct FatalError {
1515
pub errors_len: usize,
1616
}
1717

18-
impl<'a> ParserImpl<'a> {
18+
impl<'a, C: ParserConfig> ParserImpl<'a, C> {
1919
#[cold]
2020
pub(crate) fn set_unexpected(&mut self) {
2121
// The lexer should have reported a more meaningful diagnostic
@@ -91,7 +91,7 @@ impl<'a> ParserImpl<'a> {
9191
// error, we detect these patterns and provide helpful guidance on how to resolve the conflict.
9292
//
9393
// Inspired by rust-lang/rust#106242
94-
impl ParserImpl<'_> {
94+
impl<C: ParserConfig> ParserImpl<'_, C> {
9595
/// Check if the current position looks like a merge conflict marker.
9696
///
9797
/// Detects the following Git conflict markers:

crates/oxc_parser/src/js/arrow.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use oxc_span::GetSpan;
44
use oxc_syntax::precedence::Precedence;
55

66
use super::{FunctionKind, Tristate};
7-
use crate::{ParserImpl, diagnostics, lexer::Kind};
7+
use crate::{ParserConfig, ParserImpl, diagnostics, lexer::Kind};
88

99
struct ArrowFunctionHead<'a> {
1010
type_parameters: Option<Box<'a, TSTypeParameterDeclaration<'a>>>,
@@ -14,7 +14,7 @@ struct ArrowFunctionHead<'a> {
1414
span: u32,
1515
}
1616

17-
impl<'a> ParserImpl<'a> {
17+
impl<'a, C: ParserConfig> ParserImpl<'a, C> {
1818
pub(super) fn try_parse_parenthesized_arrow_function_expression(
1919
&mut self,
2020
allow_return_type_in_arrow_function: bool,

crates/oxc_parser/src/js/binding.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
use oxc_ast::{NONE, ast::*};
22
use oxc_span::GetSpan;
33

4-
use crate::{Context, ParserImpl, diagnostics, lexer::Kind};
4+
use crate::{Context, ParserConfig, ParserImpl, diagnostics, lexer::Kind};
55

6-
impl<'a> ParserImpl<'a> {
6+
impl<'a, C: ParserConfig> ParserImpl<'a, C> {
77
/// `BindingElement`
88
/// `SingleNameBinding`
99
/// `BindingPattern`[?Yield, ?Await] `Initializer`[+In, ?Yield, ?Await]opt

crates/oxc_parser/src/js/class.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use oxc_ecmascript::PropName;
44
use oxc_span::{GetSpan, Span};
55

66
use crate::{
7-
Context, ParserImpl, StatementContext, diagnostics,
7+
Context, ParserConfig, ParserImpl, StatementContext, diagnostics,
88
lexer::Kind,
99
modifiers::{ModifierFlags, ModifierKind, Modifiers},
1010
};
@@ -15,7 +15,7 @@ type Extends<'a> =
1515
Vec<'a, (Expression<'a>, Option<Box<'a, TSTypeParameterInstantiation<'a>>>, Span)>;
1616

1717
/// Section 15.7 Class Definitions
18-
impl<'a> ParserImpl<'a> {
18+
impl<'a, C: ParserConfig> ParserImpl<'a, C> {
1919
// `start_span` points at the start of all decoractors and `class` keyword.
2020
pub(crate) fn parse_class_statement(
2121
&mut self,

crates/oxc_parser/src/js/declaration.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ use oxc_ast::{NONE, ast::*};
33
use oxc_span::GetSpan;
44

55
use super::VariableDeclarationParent;
6-
use crate::{ParserImpl, StatementContext, diagnostics, lexer::Kind};
6+
use crate::{ParserConfig, ParserImpl, StatementContext, diagnostics, lexer::Kind};
77

8-
impl<'a> ParserImpl<'a> {
8+
impl<'a, C: ParserConfig> ParserImpl<'a, C> {
99
pub(crate) fn parse_let(&mut self, stmt_ctx: StatementContext) -> Statement<'a> {
1010
let span = self.start_span();
1111

crates/oxc_parser/src/js/expression.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@ use super::{
1717
},
1818
};
1919
use crate::{
20-
Context, ParserImpl, diagnostics,
20+
Context, ParserConfig, ParserImpl, diagnostics,
2121
lexer::{Kind, parse_big_int, parse_float, parse_int},
2222
modifiers::Modifiers,
2323
};
2424

25-
impl<'a> ParserImpl<'a> {
25+
impl<'a, C: ParserConfig> ParserImpl<'a, C> {
2626
pub(crate) fn parse_paren_expression(&mut self) -> Expression<'a> {
2727
let opening_span = self.cur_token().span();
2828
self.expect(Kind::LParen);

crates/oxc_parser/src/js/function.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use oxc_span::Span;
44

55
use super::FunctionKind;
66
use crate::{
7-
Context, ParserImpl, StatementContext, diagnostics,
7+
Context, ParserConfig, ParserImpl, StatementContext, diagnostics,
88
lexer::Kind,
99
modifiers::{ModifierFlags, ModifierKind, Modifiers},
1010
};
@@ -19,7 +19,7 @@ impl FunctionKind {
1919
}
2020
}
2121

22-
impl<'a> ParserImpl<'a> {
22+
impl<'a, C: ParserConfig> ParserImpl<'a, C> {
2323
pub(crate) fn at_function_with_async(&mut self) -> bool {
2424
self.at(Kind::Function)
2525
|| self.at(Kind::Async) && {

crates/oxc_parser/src/js/grammar.rs

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@
33
use oxc_ast::ast::*;
44
use oxc_span::GetSpan;
55

6-
use crate::{ParserImpl, diagnostics};
6+
use crate::{ParserConfig, ParserImpl, diagnostics};
77

8-
pub trait CoverGrammar<'a, T>: Sized {
9-
fn cover(value: T, p: &mut ParserImpl<'a>) -> Self;
8+
pub trait CoverGrammar<'a, T, C: ParserConfig>: Sized {
9+
fn cover(value: T, p: &mut ParserImpl<'a, C>) -> Self;
1010
}
1111

12-
impl<'a> CoverGrammar<'a, Expression<'a>> for AssignmentTarget<'a> {
13-
fn cover(expr: Expression<'a>, p: &mut ParserImpl<'a>) -> Self {
12+
impl<'a, C: ParserConfig> CoverGrammar<'a, Expression<'a>, C> for AssignmentTarget<'a> {
13+
fn cover(expr: Expression<'a>, p: &mut ParserImpl<'a, C>) -> Self {
1414
match expr {
1515
Expression::ArrayExpression(array_expr) => {
1616
let pat = ArrayAssignmentTarget::cover(array_expr.unbox(), p);
@@ -25,8 +25,8 @@ impl<'a> CoverGrammar<'a, Expression<'a>> for AssignmentTarget<'a> {
2525
}
2626
}
2727

28-
impl<'a> CoverGrammar<'a, Expression<'a>> for SimpleAssignmentTarget<'a> {
29-
fn cover(expr: Expression<'a>, p: &mut ParserImpl<'a>) -> Self {
28+
impl<'a, C: ParserConfig> CoverGrammar<'a, Expression<'a>, C> for SimpleAssignmentTarget<'a> {
29+
fn cover(expr: Expression<'a>, p: &mut ParserImpl<'a, C>) -> Self {
3030
match expr {
3131
Expression::Identifier(ident) => {
3232
SimpleAssignmentTarget::AssignmentTargetIdentifier(ident)
@@ -90,8 +90,8 @@ impl<'a> CoverGrammar<'a, Expression<'a>> for SimpleAssignmentTarget<'a> {
9090
}
9191
}
9292

93-
impl<'a> CoverGrammar<'a, ArrayExpression<'a>> for ArrayAssignmentTarget<'a> {
94-
fn cover(expr: ArrayExpression<'a>, p: &mut ParserImpl<'a>) -> Self {
93+
impl<'a, C: ParserConfig> CoverGrammar<'a, ArrayExpression<'a>, C> for ArrayAssignmentTarget<'a> {
94+
fn cover(expr: ArrayExpression<'a>, p: &mut ParserImpl<'a, C>) -> Self {
9595
let mut elements = p.ast.vec();
9696
let mut rest = None;
9797

@@ -136,8 +136,8 @@ impl<'a> CoverGrammar<'a, ArrayExpression<'a>> for ArrayAssignmentTarget<'a> {
136136
}
137137
}
138138

139-
impl<'a> CoverGrammar<'a, Expression<'a>> for AssignmentTargetMaybeDefault<'a> {
140-
fn cover(expr: Expression<'a>, p: &mut ParserImpl<'a>) -> Self {
139+
impl<'a, C: ParserConfig> CoverGrammar<'a, Expression<'a>, C> for AssignmentTargetMaybeDefault<'a> {
140+
fn cover(expr: Expression<'a>, p: &mut ParserImpl<'a, C>) -> Self {
141141
match expr {
142142
Expression::AssignmentExpression(assignment_expr) => {
143143
if assignment_expr.operator != AssignmentOperator::Assign {
@@ -156,14 +156,16 @@ impl<'a> CoverGrammar<'a, Expression<'a>> for AssignmentTargetMaybeDefault<'a> {
156156
}
157157
}
158158

159-
impl<'a> CoverGrammar<'a, AssignmentExpression<'a>> for AssignmentTargetWithDefault<'a> {
160-
fn cover(expr: AssignmentExpression<'a>, p: &mut ParserImpl<'a>) -> Self {
159+
impl<'a, C: ParserConfig> CoverGrammar<'a, AssignmentExpression<'a>, C>
160+
for AssignmentTargetWithDefault<'a>
161+
{
162+
fn cover(expr: AssignmentExpression<'a>, p: &mut ParserImpl<'a, C>) -> Self {
161163
p.ast.assignment_target_with_default(expr.span, expr.left, expr.right)
162164
}
163165
}
164166

165-
impl<'a> CoverGrammar<'a, ObjectExpression<'a>> for ObjectAssignmentTarget<'a> {
166-
fn cover(expr: ObjectExpression<'a>, p: &mut ParserImpl<'a>) -> Self {
167+
impl<'a, C: ParserConfig> CoverGrammar<'a, ObjectExpression<'a>, C> for ObjectAssignmentTarget<'a> {
168+
fn cover(expr: ObjectExpression<'a>, p: &mut ParserImpl<'a, C>) -> Self {
167169
let mut properties = p.ast.vec();
168170
let mut rest = None;
169171

@@ -203,8 +205,8 @@ impl<'a> CoverGrammar<'a, ObjectExpression<'a>> for ObjectAssignmentTarget<'a> {
203205
}
204206
}
205207

206-
impl<'a> CoverGrammar<'a, ObjectProperty<'a>> for AssignmentTargetProperty<'a> {
207-
fn cover(property: ObjectProperty<'a>, p: &mut ParserImpl<'a>) -> Self {
208+
impl<'a, C: ParserConfig> CoverGrammar<'a, ObjectProperty<'a>, C> for AssignmentTargetProperty<'a> {
209+
fn cover(property: ObjectProperty<'a>, p: &mut ParserImpl<'a, C>) -> Self {
208210
if property.shorthand {
209211
let binding = match property.key {
210212
PropertyKey::StaticIdentifier(ident) => {

crates/oxc_parser/src/js/module.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use rustc_hash::FxHashMap;
55

66
use super::FunctionKind;
77
use crate::{
8-
ParserImpl, StatementContext, diagnostics,
8+
ParserConfig, ParserImpl, StatementContext, diagnostics,
99
lexer::Kind,
1010
modifiers::{Modifier, ModifierFlags, ModifierKind, Modifiers},
1111
};
@@ -26,7 +26,7 @@ enum ImportOrExportSpecifier<'a> {
2626
Export(ExportSpecifier<'a>),
2727
}
2828

29-
impl<'a> ParserImpl<'a> {
29+
impl<'a, C: ParserConfig> ParserImpl<'a, C> {
3030
/// [Import Call](https://tc39.es/ecma262/#sec-import-calls)
3131
/// `ImportCall` : import ( `AssignmentExpression` )
3232
pub(crate) fn parse_import_expression(

0 commit comments

Comments
 (0)