Skip to content

Commit

Permalink
refactor(parser): remove oxc_ecmascript crate (#7109)
Browse files Browse the repository at this point in the history
  • Loading branch information
Boshen authored Nov 4, 2024
1 parent caa4b1f commit 953b051
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 28 deletions.
1 change: 0 additions & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 0 additions & 1 deletion crates/oxc_parser/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ doctest = false
oxc_allocator = { workspace = true }
oxc_ast = { workspace = true }
oxc_diagnostics = { workspace = true }
oxc_ecmascript = { workspace = true }
oxc_regular_expression = { workspace = true }
oxc_span = { workspace = true }
oxc_syntax = { workspace = true }
Expand Down
64 changes: 38 additions & 26 deletions crates/oxc_parser/src/js/class.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
use oxc_allocator::{Box, Vec};
use oxc_ast::ast::*;
use oxc_diagnostics::Result;
use oxc_ecmascript::PropName;
use oxc_span::{GetSpan, Span};

use crate::{
Expand All @@ -16,6 +15,15 @@ type Extends<'a> =

type Implements<'a> = Vec<'a, TSClassImplements<'a>>;

fn prop_name<'a>(key: &'a PropertyKey<'a>) -> Option<(&'a str, Span)> {
match key {
PropertyKey::StaticIdentifier(ident) => Some((&ident.name, ident.span)),
PropertyKey::Identifier(ident) => Some((&ident.name, ident.span)),
PropertyKey::StringLiteral(lit) => Some((&lit.value, lit.span)),
_ => None,
}
}

/// Section 15.7 Class Definitions
impl<'a> ParserImpl<'a> {
// `start_span` points at the start of all decoractors and `class` keyword.
Expand Down Expand Up @@ -309,6 +317,24 @@ impl<'a> ParserImpl<'a> {
)
.map(Some)
} else if self.at(Kind::LParen) || self.at(Kind::LAngle) || r#async || generator {
if !computed {
if let Some((name, span)) = prop_name(&key) {
if r#static && name == "prototype" && !self.ctx.has_ambient() {
self.error(diagnostics::static_prototype(span));
}
if !r#static && name == "constructor" {
if kind == MethodDefinitionKind::Get || kind == MethodDefinitionKind::Set {
self.error(diagnostics::constructor_getter_setter(span));
}
if r#async {
self.error(diagnostics::constructor_async(span));
}
if generator {
self.error(diagnostics::constructor_generator(span));
}
}
}
}
// LAngle for start of type parameters `foo<T>`
// ^
let definition = self.parse_class_method_definition(
Expand All @@ -324,28 +350,22 @@ impl<'a> ParserImpl<'a> {
accessibility,
optional,
)?;
if let Some((name, span)) = definition.prop_name() {
if r#static && name == "prototype" && !self.ctx.has_ambient() {
self.error(diagnostics::static_prototype(span));
}
if !r#static && name == "constructor" {
if kind == MethodDefinitionKind::Get || kind == MethodDefinitionKind::Set {
self.error(diagnostics::constructor_getter_setter(span));
}
if r#async {
self.error(diagnostics::constructor_async(span));
}
if generator {
self.error(diagnostics::constructor_generator(span));
}
}
}
Ok(Some(definition))
} else {
// getter and setter has no ts type annotation
if !kind.is_method() {
return Err(self.unexpected());
}
if !computed {
if let Some((name, span)) = prop_name(&key) {
if name == "constructor" {
self.error(diagnostics::field_constructor(span));
}
if r#static && name == "prototype" && !self.ctx.has_ambient() {
self.error(diagnostics::static_prototype(span));
}
}
}
let definition = self.parse_class_property_definition(
span,
key,
Expand All @@ -359,14 +379,6 @@ impl<'a> ParserImpl<'a> {
optional,
definite,
)?;
if let Some((name, span)) = definition.prop_name() {
if name == "constructor" {
self.error(diagnostics::field_constructor(span));
}
if r#static && name == "prototype" && !self.ctx.has_ambient() {
self.error(diagnostics::static_prototype(span));
}
}
Ok(Some(definition))
}
}
Expand Down Expand Up @@ -398,7 +410,7 @@ impl<'a> ParserImpl<'a> {
) -> Result<ClassElement<'a>> {
let kind = if !r#static
&& !computed
&& key.prop_name().map_or(false, |(name, _)| name == "constructor")
&& prop_name(&key).map_or(false, |(name, _)| name == "constructor")
{
MethodDefinitionKind::Constructor
} else {
Expand Down

0 comments on commit 953b051

Please sign in to comment.