Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 9 additions & 9 deletions crates/oxc_parser/src/cursor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,21 +6,21 @@ use oxc_diagnostics::OxcDiagnostic;
use oxc_span::{GetSpan, Span};

use crate::{
Context, ParserImpl, diagnostics,
Context, ParserConfig, ParserImpl, diagnostics,
error_handler::FatalError,
lexer::{Kind, LexerCheckpoint, LexerContext, Token},
};

#[derive(Clone)]
pub struct ParserCheckpoint<'a> {
lexer: LexerCheckpoint<'a>,
pub struct ParserCheckpoint<'a, C: ParserConfig> {
lexer: LexerCheckpoint<'a, C>,
cur_token: Token,
prev_span_end: u32,
errors_pos: usize,
fatal_error: Option<FatalError>,
}

impl<'a> ParserImpl<'a> {
impl<'a, C: ParserConfig> ParserImpl<'a, C> {
#[inline]
pub(crate) fn start_span(&self) -> u32 {
self.token.start()
Expand Down Expand Up @@ -300,7 +300,7 @@ impl<'a> ParserImpl<'a> {
}
}

pub(crate) fn checkpoint(&mut self) -> ParserCheckpoint<'a> {
pub(crate) fn checkpoint(&mut self) -> ParserCheckpoint<'a, C> {
ParserCheckpoint {
lexer: self.lexer.checkpoint(),
cur_token: self.token,
Expand All @@ -310,7 +310,7 @@ impl<'a> ParserImpl<'a> {
}
}

pub(crate) fn checkpoint_with_error_recovery(&mut self) -> ParserCheckpoint<'a> {
pub(crate) fn checkpoint_with_error_recovery(&mut self) -> ParserCheckpoint<'a, C> {
ParserCheckpoint {
lexer: self.lexer.checkpoint_with_error_recovery(),
cur_token: self.token,
Expand All @@ -320,7 +320,7 @@ impl<'a> ParserImpl<'a> {
}
}

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

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

pub(crate) fn try_parse<T>(
&mut self,
func: impl FnOnce(&mut ParserImpl<'a>) -> T,
func: impl FnOnce(&mut ParserImpl<'a, C>) -> T,
) -> Option<T> {
let checkpoint = self.checkpoint_with_error_recovery();
let ctx = self.ctx;
Expand All @@ -347,7 +347,7 @@ impl<'a> ParserImpl<'a> {
}
}

pub(crate) fn lookahead<U>(&mut self, predicate: impl Fn(&mut ParserImpl<'a>) -> U) -> U {
pub(crate) fn lookahead<U>(&mut self, predicate: impl Fn(&mut ParserImpl<'a, C>) -> U) -> U {
let checkpoint = self.checkpoint();
let answer = predicate(self);
self.rewind(checkpoint);
Expand Down
6 changes: 3 additions & 3 deletions crates/oxc_parser/src/error_handler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use oxc_allocator::Dummy;
use oxc_diagnostics::OxcDiagnostic;
use oxc_span::Span;

use crate::{ParserImpl, diagnostics, lexer::Kind};
use crate::{ParserConfig, ParserImpl, diagnostics, lexer::Kind};

/// Fatal parsing error.
#[derive(Debug, Clone)]
Expand All @@ -15,7 +15,7 @@ pub struct FatalError {
pub errors_len: usize,
}

impl<'a> ParserImpl<'a> {
impl<'a, C: ParserConfig> ParserImpl<'a, C> {
#[cold]
pub(crate) fn set_unexpected(&mut self) {
// The lexer should have reported a more meaningful diagnostic
Expand Down Expand Up @@ -91,7 +91,7 @@ impl<'a> ParserImpl<'a> {
// error, we detect these patterns and provide helpful guidance on how to resolve the conflict.
//
// Inspired by rust-lang/rust#106242
impl ParserImpl<'_> {
impl<C: ParserConfig> ParserImpl<'_, C> {
/// Check if the current position looks like a merge conflict marker.
///
/// Detects the following Git conflict markers:
Expand Down
4 changes: 2 additions & 2 deletions crates/oxc_parser/src/js/arrow.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use oxc_span::GetSpan;
use oxc_syntax::precedence::Precedence;

use super::{FunctionKind, Tristate};
use crate::{ParserImpl, diagnostics, lexer::Kind};
use crate::{ParserConfig, ParserImpl, diagnostics, lexer::Kind};

struct ArrowFunctionHead<'a> {
type_parameters: Option<Box<'a, TSTypeParameterDeclaration<'a>>>,
Expand All @@ -14,7 +14,7 @@ struct ArrowFunctionHead<'a> {
span: u32,
}

impl<'a> ParserImpl<'a> {
impl<'a, C: ParserConfig> ParserImpl<'a, C> {
pub(super) fn try_parse_parenthesized_arrow_function_expression(
&mut self,
allow_return_type_in_arrow_function: bool,
Expand Down
4 changes: 2 additions & 2 deletions crates/oxc_parser/src/js/binding.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
use oxc_ast::{NONE, ast::*};
use oxc_span::GetSpan;

use crate::{Context, ParserImpl, diagnostics, lexer::Kind};
use crate::{Context, ParserConfig, ParserImpl, diagnostics, lexer::Kind};

impl<'a> ParserImpl<'a> {
impl<'a, C: ParserConfig> ParserImpl<'a, C> {
/// `BindingElement`
/// `SingleNameBinding`
/// `BindingPattern`[?Yield, ?Await] `Initializer`[+In, ?Yield, ?Await]opt
Expand Down
4 changes: 2 additions & 2 deletions crates/oxc_parser/src/js/class.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use oxc_ecmascript::PropName;
use oxc_span::{GetSpan, Span};

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

/// Section 15.7 Class Definitions
impl<'a> ParserImpl<'a> {
impl<'a, C: ParserConfig> ParserImpl<'a, C> {
// `start_span` points at the start of all decoractors and `class` keyword.
pub(crate) fn parse_class_statement(
&mut self,
Expand Down
4 changes: 2 additions & 2 deletions crates/oxc_parser/src/js/declaration.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ use oxc_ast::{NONE, ast::*};
use oxc_span::GetSpan;

use super::VariableDeclarationParent;
use crate::{ParserImpl, StatementContext, diagnostics, lexer::Kind};
use crate::{ParserConfig, ParserImpl, StatementContext, diagnostics, lexer::Kind};

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

Expand Down
4 changes: 2 additions & 2 deletions crates/oxc_parser/src/js/expression.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,12 @@ use super::{
},
};
use crate::{
Context, ParserImpl, diagnostics,
Context, ParserConfig, ParserImpl, diagnostics,
lexer::{Kind, parse_big_int, parse_float, parse_int},
modifiers::Modifiers,
};

impl<'a> ParserImpl<'a> {
impl<'a, C: ParserConfig> ParserImpl<'a, C> {
pub(crate) fn parse_paren_expression(&mut self) -> Expression<'a> {
let opening_span = self.cur_token().span();
self.expect(Kind::LParen);
Expand Down
4 changes: 2 additions & 2 deletions crates/oxc_parser/src/js/function.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use oxc_span::Span;

use super::FunctionKind;
use crate::{
Context, ParserImpl, StatementContext, diagnostics,
Context, ParserConfig, ParserImpl, StatementContext, diagnostics,
lexer::Kind,
modifiers::{ModifierFlags, ModifierKind, Modifiers},
};
Expand All @@ -19,7 +19,7 @@ impl FunctionKind {
}
}

impl<'a> ParserImpl<'a> {
impl<'a, C: ParserConfig> ParserImpl<'a, C> {
pub(crate) fn at_function_with_async(&mut self) -> bool {
self.at(Kind::Function)
|| self.at(Kind::Async) && {
Expand Down
36 changes: 19 additions & 17 deletions crates/oxc_parser/src/js/grammar.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@
use oxc_ast::ast::*;
use oxc_span::GetSpan;

use crate::{ParserImpl, diagnostics};
use crate::{ParserConfig, ParserImpl, diagnostics};

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

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

impl<'a> CoverGrammar<'a, Expression<'a>> for SimpleAssignmentTarget<'a> {
fn cover(expr: Expression<'a>, p: &mut ParserImpl<'a>) -> Self {
impl<'a, C: ParserConfig> CoverGrammar<'a, Expression<'a>, C> for SimpleAssignmentTarget<'a> {
fn cover(expr: Expression<'a>, p: &mut ParserImpl<'a, C>) -> Self {
match expr {
Expression::Identifier(ident) => {
SimpleAssignmentTarget::AssignmentTargetIdentifier(ident)
Expand Down Expand Up @@ -90,8 +90,8 @@ impl<'a> CoverGrammar<'a, Expression<'a>> for SimpleAssignmentTarget<'a> {
}
}

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

Expand Down Expand Up @@ -136,8 +136,8 @@ impl<'a> CoverGrammar<'a, ArrayExpression<'a>> for ArrayAssignmentTarget<'a> {
}
}

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

impl<'a> CoverGrammar<'a, AssignmentExpression<'a>> for AssignmentTargetWithDefault<'a> {
fn cover(expr: AssignmentExpression<'a>, p: &mut ParserImpl<'a>) -> Self {
impl<'a, C: ParserConfig> CoverGrammar<'a, AssignmentExpression<'a>, C>
for AssignmentTargetWithDefault<'a>
{
fn cover(expr: AssignmentExpression<'a>, p: &mut ParserImpl<'a, C>) -> Self {
p.ast.assignment_target_with_default(expr.span, expr.left, expr.right)
}
}

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

Expand Down Expand Up @@ -203,8 +205,8 @@ impl<'a> CoverGrammar<'a, ObjectExpression<'a>> for ObjectAssignmentTarget<'a> {
}
}

impl<'a> CoverGrammar<'a, ObjectProperty<'a>> for AssignmentTargetProperty<'a> {
fn cover(property: ObjectProperty<'a>, p: &mut ParserImpl<'a>) -> Self {
impl<'a, C: ParserConfig> CoverGrammar<'a, ObjectProperty<'a>, C> for AssignmentTargetProperty<'a> {
fn cover(property: ObjectProperty<'a>, p: &mut ParserImpl<'a, C>) -> Self {
if property.shorthand {
let binding = match property.key {
PropertyKey::StaticIdentifier(ident) => {
Expand Down
4 changes: 2 additions & 2 deletions crates/oxc_parser/src/js/module.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use rustc_hash::FxHashMap;

use super::FunctionKind;
use crate::{
ParserImpl, StatementContext, diagnostics,
ParserConfig, ParserImpl, StatementContext, diagnostics,
lexer::Kind,
modifiers::{Modifier, ModifierFlags, ModifierKind, Modifiers},
};
Expand All @@ -26,7 +26,7 @@ enum ImportOrExportSpecifier<'a> {
Export(ExportSpecifier<'a>),
}

impl<'a> ParserImpl<'a> {
impl<'a, C: ParserConfig> ParserImpl<'a, C> {
/// [Import Call](https://tc39.es/ecma262/#sec-import-calls)
/// `ImportCall` : import ( `AssignmentExpression` )
pub(crate) fn parse_import_expression(
Expand Down
4 changes: 2 additions & 2 deletions crates/oxc_parser/src/js/object.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@ use oxc_ast::ast::*;
use oxc_syntax::operator::AssignmentOperator;

use crate::{
Context, ParserImpl, diagnostics,
Context, ParserConfig, ParserImpl, diagnostics,
lexer::Kind,
modifiers::{ModifierFlags, Modifiers},
};

use super::FunctionKind;

impl<'a> ParserImpl<'a> {
impl<'a, C: ParserConfig> ParserImpl<'a, C> {
/// [Object Expression](https://tc39.es/ecma262/#sec-object-initializer)
/// `ObjectLiteral`[Yield, Await] :
/// { }
Expand Down
4 changes: 2 additions & 2 deletions crates/oxc_parser/src/js/statement.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@ use oxc_span::{Atom, GetSpan, Span};

use super::{VariableDeclarationParent, grammar::CoverGrammar};
use crate::{
Context, ParserImpl, StatementContext, diagnostics,
Context, ParserConfig, ParserImpl, StatementContext, diagnostics,
lexer::Kind,
modifiers::{Modifier, ModifierFlags, ModifierKind, Modifiers},
};

impl<'a> ParserImpl<'a> {
impl<'a, C: ParserConfig> ParserImpl<'a, C> {
// Section 12
// The InputElementHashbangOrRegExp goal is used at the start of a Script
// or Module.
Expand Down
4 changes: 2 additions & 2 deletions crates/oxc_parser/src/jsx/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ use oxc_allocator::{Box, Dummy, Vec};
use oxc_ast::ast::*;
use oxc_span::{Atom, GetSpan, Span};

use crate::{ParserImpl, diagnostics, lexer::Kind};
use crate::{ParserConfig, ParserImpl, diagnostics, lexer::Kind};

impl<'a> ParserImpl<'a> {
impl<'a, C: ParserConfig> ParserImpl<'a, C> {
pub(crate) fn parse_jsx_expression(&mut self) -> Expression<'a> {
let span = self.start_span();
self.bump_any(); // bump `<`
Expand Down
Loading
Loading