Skip to content
Merged
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
53 changes: 43 additions & 10 deletions crates/oxc_estree_tokens/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,24 +35,43 @@ pub struct EstreeToken<'a> {
pub struct EstreeTokenOptions {
pub exclude_legacy_keyword_identifiers: bool,
pub decode_identifier_escapes: bool,
pub jsx_namespace_jsx_identifiers: bool,
pub member_expr_in_jsx_expression_jsx_identifiers: bool,
}

impl EstreeTokenOptions {
pub const fn test262() -> Self {
Self { exclude_legacy_keyword_identifiers: true, decode_identifier_escapes: true }
Self {
exclude_legacy_keyword_identifiers: true,
decode_identifier_escapes: true,
jsx_namespace_jsx_identifiers: true,
member_expr_in_jsx_expression_jsx_identifiers: false,
}
}

pub const fn typescript() -> Self {
Self { exclude_legacy_keyword_identifiers: false, decode_identifier_escapes: false }
Self {
exclude_legacy_keyword_identifiers: false,
decode_identifier_escapes: false,
jsx_namespace_jsx_identifiers: false,
member_expr_in_jsx_expression_jsx_identifiers: true,
}
}

pub const fn linter() -> Self {
Self { exclude_legacy_keyword_identifiers: true, decode_identifier_escapes: false }
Self {
exclude_legacy_keyword_identifiers: true,
decode_identifier_escapes: false,
jsx_namespace_jsx_identifiers: true,
member_expr_in_jsx_expression_jsx_identifiers: false,
}
}
}

#[derive(Default)]
pub struct EstreeTokenContext {
jsx_namespace_jsx_identifiers: bool,
member_expr_in_jsx_expression_jsx_identifiers: bool,
ast_identifier_spans: FxHashSet<Span>,
force_keyword_spans: FxHashSet<Span>,
jsx_identifier_spans: FxHashSet<Span>,
Expand Down Expand Up @@ -115,7 +134,8 @@ impl<'a> Visit<'a> for EstreeTokenContext {

fn visit_identifier_name(&mut self, identifier: &IdentifierName<'a>) {
self.ast_identifier_spans.insert(identifier.span);
if self.jsx_expression_depth > 0
if self.member_expr_in_jsx_expression_jsx_identifiers
&& self.jsx_expression_depth > 0
&& self.jsx_member_expression_depth > 0
&& self.jsx_computed_member_depth == 0
{
Expand All @@ -125,7 +145,8 @@ impl<'a> Visit<'a> for EstreeTokenContext {

fn visit_identifier_reference(&mut self, identifier: &IdentifierReference<'a>) {
self.ast_identifier_spans.insert(identifier.span);
if self.jsx_expression_depth > 0
if self.member_expr_in_jsx_expression_jsx_identifiers
&& self.jsx_expression_depth > 0
&& self.jsx_member_expression_depth > 0
&& self.jsx_computed_member_depth == 0
{
Expand Down Expand Up @@ -178,9 +199,13 @@ impl<'a> Visit<'a> for EstreeTokenContext {
}

fn visit_jsx_namespaced_name(&mut self, name: &JSXNamespacedName<'a>) {
self.non_jsx_identifier_spans.insert(name.namespace.span);
self.non_jsx_identifier_spans.insert(name.name.span);
walk::walk_jsx_namespaced_name(self, name);
if self.jsx_namespace_jsx_identifiers {
self.jsx_identifier_spans.insert(name.namespace.span);
self.jsx_identifier_spans.insert(name.name.span);
} else {
self.non_jsx_identifier_spans.insert(name.namespace.span);
self.non_jsx_identifier_spans.insert(name.name.span);
}
}

fn visit_jsx_expression_container(&mut self, container: &JSXExpressionContainer<'a>) {
Expand Down Expand Up @@ -225,8 +250,16 @@ impl<'a> Visit<'a> for EstreeTokenContext {
}
}

pub fn collect_token_context(program: &Program<'_>) -> EstreeTokenContext {
let mut context = EstreeTokenContext::default();
pub fn collect_token_context(
program: &Program<'_>,
options: EstreeTokenOptions,
) -> EstreeTokenContext {
let mut context = EstreeTokenContext {
jsx_namespace_jsx_identifiers: options.jsx_namespace_jsx_identifiers,
member_expr_in_jsx_expression_jsx_identifiers: options
.member_expr_in_jsx_expression_jsx_identifiers,
..Default::default()
};
context.visit_program(program);
context
}
Expand Down
12 changes: 1 addition & 11 deletions tasks/coverage/snapshots/estree_acorn_jsx_tokens.snap
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,8 @@ commit: eeda64c2

estree_acorn_jsx_tokens Summary:
AST Parsed : 39/39 (100.00%)
Positive Passed: 32/39 (82.05%)
Token mismatch: tasks/coverage/estree-conformance/tests/acorn-jsx/pass/003.jsx

Token mismatch: tasks/coverage/estree-conformance/tests/acorn-jsx/pass/004.jsx

Token mismatch: tasks/coverage/estree-conformance/tests/acorn-jsx/pass/008.jsx

Token mismatch: tasks/coverage/estree-conformance/tests/acorn-jsx/pass/009.jsx

Positive Passed: 37/39 (94.87%)
Token mismatch: tasks/coverage/estree-conformance/tests/acorn-jsx/pass/020.jsx

Token mismatch: tasks/coverage/estree-conformance/tests/acorn-jsx/pass/027.jsx

Token mismatch: tasks/coverage/estree-conformance/tests/acorn-jsx/pass/046.jsx

25 changes: 13 additions & 12 deletions tasks/coverage/src/tools.rs
Original file line number Diff line number Diff line change
Expand Up @@ -855,20 +855,17 @@ pub fn run_estree_test262_tokens(files: &[Test262File]) -> Vec<CoverageResult> {
let ParserReturn { mut program, tokens, .. } = ret;
let utf8_to_utf16 = Utf8ToUtf16::new(&f.code);
utf8_to_utf16.convert_program_with_ascending_order_checks(&mut program);
let token_context = collect_token_context(&program);

let token_options = EstreeTokenOptions::test262();
let token_context = collect_token_context(&program, token_options);

let token_path = workspace_root()
.join("estree-conformance/tests/test262-tokens")
.join(f.path.strip_prefix("test262/").unwrap_or(&f.path))
.with_extension("json");
let expected_tokens_json = fs::read_to_string(&token_path).unwrap_or_default();
let oxc_tokens_json = to_estree_tokens_json(
&allocator,
&f.code,
&tokens,
&token_context,
EstreeTokenOptions::test262(),
);
let oxc_tokens_json =
to_estree_tokens_json(&allocator, &f.code, &tokens, &token_context, token_options);

let result = if oxc_tokens_json == expected_tokens_json {
TestResult::Passed
Expand Down Expand Up @@ -906,14 +903,16 @@ pub fn run_estree_acorn_jsx_tokens(files: &[AcornJsxFile]) -> Vec<CoverageResult
let mut program = ret.program;
let utf8_to_utf16 = Utf8ToUtf16::new(&f.code);
utf8_to_utf16.convert_program_with_ascending_order_checks(&mut program);
let token_context = collect_token_context(&program);

let token_options = EstreeTokenOptions::test262();
let token_context = collect_token_context(&program, token_options);

let oxc_tokens_json = to_estree_tokens_json(
&allocator,
&f.code,
&ret.tokens,
&token_context,
EstreeTokenOptions::typescript(),
token_options,
);

let result = if oxc_tokens_json == expected_tokens_json {
Expand Down Expand Up @@ -1085,14 +1084,16 @@ pub fn run_estree_typescript_tokens(files: &[TypeScriptFile]) -> Vec<CoverageRes
let mut program = ret.program;
let utf8_to_utf16 = Utf8ToUtf16::new(&unit.content);
utf8_to_utf16.convert_program_with_ascending_order_checks(&mut program);
let token_context = collect_token_context(&program);

let token_options = EstreeTokenOptions::typescript();
let token_context = collect_token_context(&program, token_options);

let oxc_tokens_json = to_estree_tokens_json(
&allocator,
&unit.content,
&ret.tokens,
&token_context,
EstreeTokenOptions::typescript(),
token_options,
);
if oxc_tokens_json != *expected_tokens {
return CoverageResult {
Expand Down
Loading