refactor(semantic): transform checker continue checks if missing IDs (#5259)

Transform checker don't bail out if some IDs missing from AST. Continue to check for other problems.

Also simplify iterating over pairs of IDs.
This commit is contained in:
overlookmotel 2024-08-27 11:58:20 +00:00
parent 943454fa5e
commit af5713e411
6 changed files with 9345 additions and 910 deletions

View file

@ -88,9 +88,12 @@
use std::{
cell::Cell,
fmt::{Debug, Display},
hash::Hash,
hash::{BuildHasherDefault, Hash},
};
use indexmap::IndexMap;
use rustc_hash::FxHasher;
use oxc_allocator::{Allocator, CloneIn};
#[allow(clippy::wildcard_imports)]
use oxc_ast::{ast::*, ast_kind::AstKind, visit::walk, Visit};
@ -101,27 +104,24 @@ use oxc_syntax::{
scope::{ScopeFlags, ScopeId},
symbol::SymbolId,
};
use rustc_hash::FxHashMap;
use crate::{ScopeTree, SemanticBuilder, SymbolTable};
type FxIndexMap<K, V> = IndexMap<K, V, BuildHasherDefault<FxHasher>>;
/// Check `ScopeTree` and `SymbolTable` are correct after transform
pub fn check_semantic_after_transform(
symbols_after_transform: &SymbolTable,
scopes_after_transform: &ScopeTree,
program: &Program<'_>,
) -> Option<Vec<OxcDiagnostic>> {
let mut errors = Errors::default();
// Collect `ScopeId`s, `SymbolId`s and `ReferenceId`s from AST after transformer
let mut ids_after_transform = SemanticIds::default();
if let Some(mut errors) = ids_after_transform.check(program) {
errors.insert(0, OxcDiagnostic::error("Semantic Collector failed after transform"));
return Some(errors);
}
let data_after_transform = SemanticData {
symbols: symbols_after_transform,
scopes: scopes_after_transform,
ids: ids_after_transform,
};
let data_after_transform =
SemanticData { symbols: symbols_after_transform, scopes: scopes_after_transform };
let (scope_ids_after_transform, symbol_ids_after_transform, reference_ids_after_transform) =
SemanticIdsCollector::new(&mut errors).collect(program);
// Clone the post-transform AST, re-run semantic analysis on it, and collect `ScopeId`s,
// `SymbolId`s and `ReferenceId`s from AST.
@ -133,25 +133,25 @@ pub fn check_semantic_after_transform(
.build(&program)
.semantic
.into_symbol_table_and_scope_tree();
let data_rebuilt = SemanticData { symbols: &symbols_rebuilt, scopes: &scopes_rebuilt };
let mut ids_rebuilt = SemanticIds::default();
if let Some(mut errors) = ids_rebuilt.check(&program) {
errors.insert(0, OxcDiagnostic::error("Semantic Collector failed after rebuild"));
return Some(errors);
}
let data_rebuilt =
SemanticData { symbols: &symbols_rebuilt, scopes: &scopes_rebuilt, ids: ids_rebuilt };
let (scope_ids_rebuilt, symbol_ids_rebuilt, reference_ids_rebuilt) =
SemanticIdsCollector::new(&mut errors).collect(&program);
// Create mappings from after transform IDs to rebuilt IDs
let scope_ids_map = IdMapping::new(scope_ids_after_transform, scope_ids_rebuilt);
let symbol_ids_map = IdMapping::new(symbol_ids_after_transform, symbol_ids_rebuilt);
let reference_ids_map = IdMapping::new(reference_ids_after_transform, reference_ids_rebuilt);
// Compare post-transform semantic data to semantic data from fresh semantic analysis
let mut checker = PostTransformChecker {
after_transform: data_after_transform,
rebuilt: data_rebuilt,
scope_ids_map: IdMapping::default(),
symbol_ids_map: IdMapping::default(),
reference_ids_map: IdMapping::default(),
errors: Errors::default(),
scope_ids_map,
symbol_ids_map,
reference_ids_map,
errors,
};
checker.create_mappings();
checker.check_scopes();
checker.check_symbols();
checker.check_references();
@ -160,6 +160,13 @@ pub fn check_semantic_after_transform(
checker.errors.get()
}
/// Check all AST nodes have scope, symbol and reference IDs
pub fn check_semantic_ids(program: &Program<'_>) -> Option<Vec<OxcDiagnostic>> {
let mut errors = Errors::default();
SemanticIdsCollector::new(&mut errors).collect(program);
errors.get()
}
struct PostTransformChecker<'s> {
after_transform: SemanticData<'s>,
rebuilt: SemanticData<'s>,
@ -173,25 +180,35 @@ struct PostTransformChecker<'s> {
struct SemanticData<'s> {
symbols: &'s SymbolTable,
scopes: &'s ScopeTree,
ids: SemanticIds,
}
/// Mapping from "after transform" ID to "rebuilt" ID
struct IdMapping<Id>(FxHashMap<Id, Id>);
struct IdMapping<Id>(FxIndexMap<Id, Id>);
impl<Id: Copy + Eq + Hash> IdMapping<Id> {
fn insert(&mut self, after_transform_id: Id, rebuilt_id: Id) {
self.0.insert(after_transform_id, rebuilt_id);
fn new(after_transform: Vec<Option<Id>>, rebuilt: Vec<Option<Id>>) -> Self {
let map = after_transform
.into_iter()
.zip(rebuilt)
.filter_map(|ids| match ids {
(Some(after_transform_id), Some(rebuilt_id)) => {
Some((after_transform_id, rebuilt_id))
}
_ => None,
})
.collect();
Self(map)
}
fn get(&self, after_transform_id: Id) -> Option<Id> {
self.0.get(&after_transform_id).copied()
}
}
impl<Id> Default for IdMapping<Id> {
fn default() -> Self {
Self(FxHashMap::default())
/// Iterate over pairs of after transform ID and rebuilt ID
fn pairs(&self) -> impl Iterator<Item = Pair<Id>> + '_ {
self.0
.iter()
.map(|(&after_transform_id, &rebuilt_id)| Pair::new(after_transform_id, rebuilt_id))
}
}
@ -206,10 +223,6 @@ impl<T> Pair<T> {
Self { after_transform, rebuilt }
}
fn from_tuple(values: (T, T)) -> Self {
Self::new(values.0, values.1)
}
fn parts(&self) -> (&T, &T) {
(&self.after_transform, &self.rebuilt)
}
@ -258,6 +271,10 @@ impl Errors {
self.0.push(OxcDiagnostic::error(message.as_ref().trim().to_string()));
}
fn push_with_label<S: Into<String>>(&mut self, message: S, span: Span) {
self.0.push(OxcDiagnostic::error(message.into()).with_label(span));
}
/// Add an error for a mismatch between a pair of values, with IDs
fn push_mismatch<Id, Ids, Value, Values>(&mut self, title: &str, ids: Ids, values: Values)
where
@ -309,44 +326,8 @@ rebuilt : {value_rebuilt}
}
impl<'s> PostTransformChecker<'s> {
fn create_mappings(&mut self) {
// Scope IDs
for (&scope_id_after_transform, &scope_id_rebuilt) in
self.after_transform.ids.scope_ids.iter().zip(self.rebuilt.ids.scope_ids.iter())
{
self.scope_ids_map.insert(scope_id_after_transform, scope_id_rebuilt);
}
// Symbol IDs
for (&symbol_id_after_transform, &symbol_id_rebuilt) in
self.after_transform.ids.symbol_ids.iter().zip(self.rebuilt.ids.symbol_ids.iter())
{
self.symbol_ids_map.insert(symbol_id_after_transform, symbol_id_rebuilt);
}
// Reference IDs
for (&reference_id_after_transform, &reference_id_rebuilt) in
self.after_transform.ids.reference_ids.iter().zip(self.rebuilt.ids.reference_ids.iter())
{
self.reference_ids_map.insert(reference_id_after_transform, reference_id_rebuilt);
}
}
fn check_scopes(&mut self) {
if self.get_static_pair(|data| data.ids.scope_ids.len()).is_mismatch() {
self.errors.push("Scopes mismatch after transform");
return;
}
for scope_ids in self
.after_transform
.ids
.scope_ids
.iter()
.copied()
.zip(self.rebuilt.ids.scope_ids.iter().copied())
.map(Pair::from_tuple)
{
for scope_ids in self.scope_ids_map.pairs() {
// Check bindings are the same
fn get_sorted_binding_names(data: &SemanticData, scope_id: ScopeId) -> Vec<CompactStr> {
let mut binding_names =
@ -393,20 +374,7 @@ impl<'s> PostTransformChecker<'s> {
}
fn check_symbols(&mut self) {
if self.get_static_pair(|data| data.ids.symbol_ids.len()).is_mismatch() {
self.errors.push("Symbols mismatch after transform");
return;
}
for symbol_ids in self
.after_transform
.ids
.symbol_ids
.iter()
.copied()
.zip(self.rebuilt.ids.symbol_ids.iter().copied())
.map(Pair::from_tuple)
{
for symbol_ids in self.symbol_ids_map.pairs() {
// Check names match
let names =
self.get_pair(symbol_ids, |data, symbol_id| data.symbols.names[symbol_id].clone());
@ -464,20 +432,7 @@ impl<'s> PostTransformChecker<'s> {
}
fn check_references(&mut self) {
if self.get_static_pair(|data| data.ids.reference_ids.len()).is_mismatch() {
self.errors.push("References mismatch after transform");
return;
}
for reference_ids in self
.after_transform
.ids
.reference_ids
.iter()
.copied()
.zip(self.rebuilt.ids.reference_ids.iter().copied())
.map(Pair::from_tuple)
{
for reference_ids in self.reference_ids_map.pairs() {
// Check symbol IDs match
let symbol_ids = self.get_pair(reference_ids, |data, reference_id| {
data.symbols.references[reference_id].symbol_id()
@ -598,44 +553,36 @@ impl<'s> PostTransformChecker<'s> {
}
}
/// Collection of `ScopeId`s, `SymbolId`s and `ReferenceId`s from an AST.
/// Collector of `ScopeId`s, `SymbolId`s and `ReferenceId`s from an AST.
///
/// `scope_ids`, `symbol_ids` and `reference_ids` lists are filled in visitation order.
#[derive(Default)]
pub struct SemanticIds {
scope_ids: Vec<ScopeId>,
symbol_ids: Vec<SymbolId>,
reference_ids: Vec<ReferenceId>,
}
impl SemanticIds {
/// Collect IDs and check for errors
pub fn check(&mut self, program: &Program<'_>) -> Option<Vec<OxcDiagnostic>> {
if program.source_type.is_typescript_definition() {
return None;
}
let mut collector = SemanticIdsCollector::new(self);
collector.visit_program(program);
let errors = collector.errors;
(!errors.is_empty()).then_some(errors)
}
}
struct SemanticIdsCollector<'a, 'c> {
ids: &'c mut SemanticIds,
errors: Vec<OxcDiagnostic>,
struct SemanticIdsCollector<'a, 'e> {
scope_ids: Vec<Option<ScopeId>>,
symbol_ids: Vec<Option<SymbolId>>,
reference_ids: Vec<Option<ReferenceId>>,
kinds: Vec<AstKind<'a>>,
errors: &'e mut Errors,
}
impl<'a, 'c> SemanticIdsCollector<'a, 'c> {
fn new(ids: &'c mut SemanticIds) -> Self {
Self { ids, errors: vec![], kinds: vec![] }
impl<'a, 'e> SemanticIdsCollector<'a, 'e> {
fn new(errors: &'e mut Errors) -> Self {
Self { scope_ids: vec![], symbol_ids: vec![], reference_ids: vec![], kinds: vec![], errors }
}
/// Collect IDs and check for errors
#[allow(clippy::type_complexity)]
fn collect(
mut self,
program: &Program<'a>,
) -> (Vec<Option<ScopeId>>, Vec<Option<SymbolId>>, Vec<Option<ReferenceId>>) {
if !program.source_type.is_typescript_definition() {
self.visit_program(program);
}
(self.scope_ids, self.symbol_ids, self.reference_ids)
}
}
impl<'a, 'c> Visit<'a> for SemanticIdsCollector<'a, 'c> {
impl<'a, 'e> Visit<'a> for SemanticIdsCollector<'a, 'e> {
fn enter_node(&mut self, kind: AstKind<'a>) {
self.kinds.push(kind);
}
@ -645,30 +592,26 @@ impl<'a, 'c> Visit<'a> for SemanticIdsCollector<'a, 'c> {
}
fn enter_scope(&mut self, _flags: ScopeFlags, scope_id: &Cell<Option<ScopeId>>) {
if let Some(scope_id) = scope_id.get() {
self.ids.scope_ids.push(scope_id);
} else {
let message = "Missing ScopeId".to_string();
self.errors
.push(OxcDiagnostic::error(message).with_label(self.kinds.last().unwrap().span()));
let scope_id = scope_id.get();
self.scope_ids.push(scope_id);
if scope_id.is_none() {
self.errors.push_with_label("Missing ScopeId", self.kinds.last().unwrap().span());
}
}
fn visit_identifier_reference(&mut self, ident: &IdentifierReference<'a>) {
if let Some(reference_id) = ident.reference_id.get() {
self.ids.reference_ids.push(reference_id);
} else {
let message = format!("Missing ReferenceId: {}", ident.name);
self.errors.push(OxcDiagnostic::error(message).with_label(ident.span));
let reference_id = ident.reference_id.get();
self.reference_ids.push(reference_id);
if reference_id.is_none() {
self.errors.push_with_label(format!("Missing ReferenceId: {}", ident.name), ident.span);
}
}
fn visit_binding_identifier(&mut self, ident: &BindingIdentifier<'a>) {
if let Some(symbol_id) = ident.symbol_id.get() {
self.ids.symbol_ids.push(symbol_id);
} else {
let message = format!("Missing SymbolId: {}", ident.name);
self.errors.push(OxcDiagnostic::error(message).with_label(ident.span));
let symbol_id = ident.symbol_id.get();
self.symbol_ids.push(symbol_id);
if symbol_id.is_none() {
self.errors.push_with_label(format!("Missing SymbolId: {}", ident.name), ident.span);
}
}

View file

@ -649,12 +649,20 @@ after transform: SymbolId(3): SymbolFlags(Export | RegularEnum)
rebuilt : SymbolId(3): SymbolFlags(BlockScopedVariable | Export)
tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/export/nested-same-name/input.ts
semantic error: Semantic Collector failed after transform
Missing SymbolId: N
semantic error: Missing SymbolId: N
Missing SymbolId: _N
Missing ReferenceId: _N
Missing ReferenceId: N
Missing ReferenceId: N
Binding symbols mismatch:
after transform: ScopeId(0): [SymbolId(0), SymbolId(1)]
rebuilt : ScopeId(0): [SymbolId(0), SymbolId(1)]
Binding symbols mismatch:
after transform: ScopeId(1): [SymbolId(2), SymbolId(3)]
rebuilt : ScopeId(1): [SymbolId(2), SymbolId(3)]
Symbol flags mismatch:
after transform: SymbolId(2): SymbolFlags(BlockScopedVariable | ConstVariable | Export)
rebuilt : SymbolId(3): SymbolFlags(BlockScopedVariable | ConstVariable)
tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/function/annotated/input.ts
semantic error: Bindings mismatch:
@ -696,12 +704,16 @@ tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/function/dec
semantic error: A required parameter cannot follow an optional parameter.
tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/import/equals/input.ts
semantic error: Semantic Collector failed after transform
Missing SymbolId: A
semantic error: Missing SymbolId: A
Binding symbols mismatch:
after transform: ScopeId(0): [SymbolId(0)]
rebuilt : ScopeId(0): [SymbolId(0)]
tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/import/equals-in-unambiguous/input.ts
semantic error: Semantic Collector failed after transform
Missing SymbolId: A
semantic error: Missing SymbolId: A
Binding symbols mismatch:
after transform: ScopeId(0): [SymbolId(0)]
rebuilt : ScopeId(0): [SymbolId(0)]
tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/import/equals-require/input.ts
semantic error: `import lib = require(...);` is only supported when compiling modules to CommonJS.
@ -712,8 +724,10 @@ semantic error: `import lib = require(...);` is only supported when compiling mo
Please consider using `import lib from '...';` alongside Typescript's --allowSyntheticDefaultImports option, or add @babel/plugin-transform-modules-commonjs to your Babel config.
tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/import/export-import/input.ts
semantic error: Semantic Collector failed after transform
Missing SymbolId: A
semantic error: Missing SymbolId: A
Binding symbols mismatch:
after transform: ScopeId(0): [SymbolId(0)]
rebuilt : ScopeId(0): [SymbolId(0)]
tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/import/export-import-require/input.ts
semantic error: `import lib = require(...);` is only supported when compiling modules to CommonJS.
@ -977,11 +991,16 @@ after transform: ScopeId(0): ["Comma", "Newline", "Semi"]
rebuilt : ScopeId(0): []
tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/module-namespace/body/input.ts
semantic error: Semantic Collector failed after transform
Missing SymbolId: N
semantic error: Missing SymbolId: N
Missing SymbolId: _N
Missing ReferenceId: N
Missing ReferenceId: N
Binding symbols mismatch:
after transform: ScopeId(0): [SymbolId(0)]
rebuilt : ScopeId(0): [SymbolId(0)]
Binding symbols mismatch:
after transform: ScopeId(1): [SymbolId(1), SymbolId(2)]
rebuilt : ScopeId(1): [SymbolId(1), SymbolId(2)]
tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/module-namespace/body-declare/input.ts
semantic error: Bindings mismatch:
@ -1262,8 +1281,16 @@ after transform: ScopeId(0): ["Something"]
rebuilt : ScopeId(0): []
tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/scope/redeclaration-import-equals-var/input.ts
semantic error: Semantic Collector failed after transform
Missing SymbolId: a
semantic error: Missing SymbolId: a
Bindings mismatch:
after transform: ScopeId(0): ["M", "a"]
rebuilt : ScopeId(0): ["a"]
Symbol flags mismatch:
after transform: SymbolId(1): SymbolFlags(FunctionScopedVariable | Import)
rebuilt : SymbolId(0): SymbolFlags(FunctionScopedVariable)
Symbol span mismatch:
after transform: SymbolId(1): Span { start: 20, end: 21 }
rebuilt : SymbolId(0): Span { start: 0, end: 0 }
tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/scope/redeclaration-import-let/input.ts
semantic error: Symbol flags mismatch:

File diff suppressed because it is too large Load diff

View file

@ -9,7 +9,7 @@ use oxc::diagnostics::OxcDiagnostic;
use oxc::minifier::CompressOptions;
use oxc::parser::{ParseOptions, ParserReturn};
use oxc::semantic::{
post_transform_checker::{check_semantic_after_transform, SemanticIds},
post_transform_checker::{check_semantic_after_transform, check_semantic_ids},
SemanticBuilderReturn,
};
use oxc::span::{SourceType, Span};
@ -77,8 +77,7 @@ impl CompilerInterface for Driver {
_semantic_return: &mut SemanticBuilderReturn,
) -> ControlFlow<()> {
if self.check_semantic {
let mut ids = SemanticIds::default();
if let Some(errors) = ids.check(program) {
if let Some(errors) = check_semantic_ids(program) {
self.errors.extend(errors);
return ControlFlow::Break(());
}

File diff suppressed because it is too large Load diff

View file

@ -9,8 +9,6 @@ Passed: 10/36
# babel-plugin-transform-typescript (2/7)
* computed-constant-value/input.ts
x Semantic Collector failed after transform
x Missing ReferenceId: Infinity
,-[tasks/transform_conformance/tests/babel-plugin-transform-typescript/test/fixtures/computed-constant-value/input.ts:1:1]
1 | enum A {
@ -39,6 +37,64 @@ Passed: 10/36
2 | a = Infinity,
`----
x Bindings mismatch:
| after transform: ScopeId(1): ["A", "a", "b", "c", "d", "e"]
| rebuilt : ScopeId(1): ["A"]
x Scope flags mismatch:
| after transform: ScopeId(1): ScopeFlags(StrictMode)
| rebuilt : ScopeId(1): ScopeFlags(StrictMode | Function)
x Bindings mismatch:
| after transform: ScopeId(2): ["B", "a", "b", "c", "d", "e"]
| rebuilt : ScopeId(2): ["B"]
x Scope flags mismatch:
| after transform: ScopeId(2): ScopeFlags(StrictMode)
| rebuilt : ScopeId(2): ScopeFlags(StrictMode | Function)
x Bindings mismatch:
| after transform: ScopeId(3): ["C", "a", "b", "c"]
| rebuilt : ScopeId(3): ["C"]
x Scope flags mismatch:
| after transform: ScopeId(3): ScopeFlags(StrictMode)
| rebuilt : ScopeId(3): ScopeFlags(StrictMode | Function)
x Bindings mismatch:
| after transform: ScopeId(4): ["D", "a", "b", "c"]
| rebuilt : ScopeId(4): ["D"]
x Scope flags mismatch:
| after transform: ScopeId(4): ScopeFlags(StrictMode)
| rebuilt : ScopeId(4): ScopeFlags(StrictMode | Function)
x Symbol flags mismatch:
| after transform: SymbolId(0): SymbolFlags(RegularEnum)
| rebuilt : SymbolId(0): SymbolFlags(FunctionScopedVariable)
x Symbol flags mismatch:
| after transform: SymbolId(6): SymbolFlags(RegularEnum)
| rebuilt : SymbolId(2): SymbolFlags(FunctionScopedVariable)
x Symbol flags mismatch:
| after transform: SymbolId(12): SymbolFlags(RegularEnum)
| rebuilt : SymbolId(4): SymbolFlags(FunctionScopedVariable)
x Symbol flags mismatch:
| after transform: SymbolId(16): SymbolFlags(RegularEnum)
| rebuilt : SymbolId(6): SymbolFlags(FunctionScopedVariable)
x Unresolved references mismatch:
| after transform: ["Infinity", "NaN"]
| rebuilt : ["Infinity"]
x Unresolved reference IDs mismatch for "Infinity":
| after transform: [ReferenceId(0), ReferenceId(1), ReferenceId(2),
| ReferenceId(3)]
| rebuilt : [ReferenceId(2), ReferenceId(5), ReferenceId(8),
| ReferenceId(12)]
* elimination-declare/input.ts
x Bindings mismatch:
@ -47,8 +103,6 @@ Passed: 10/36
* enum-member-reference/input.ts
x Semantic Collector failed after transform
x Missing ReferenceId: Foo
,-[tasks/transform_conformance/tests/babel-plugin-transform-typescript/test/fixtures/enum-member-reference/input.ts:1:1]
1 | var x = 10;
@ -56,10 +110,28 @@ Passed: 10/36
2 |
`----
x Bindings mismatch:
| after transform: ScopeId(1): ["Foo", "a", "b", "c"]
| rebuilt : ScopeId(1): ["Foo"]
x Scope flags mismatch:
| after transform: ScopeId(1): ScopeFlags(StrictMode)
| rebuilt : ScopeId(1): ScopeFlags(StrictMode | Function)
x Symbol flags mismatch:
| after transform: SymbolId(1): SymbolFlags(RegularEnum)
| rebuilt : SymbolId(1): SymbolFlags(FunctionScopedVariable)
x Symbol reference IDs mismatch:
| after transform: SymbolId(5): [ReferenceId(3), ReferenceId(4),
| ReferenceId(5), ReferenceId(6), ReferenceId(7), ReferenceId(8),
| ReferenceId(9)]
| rebuilt : SymbolId(2): [ReferenceId(0), ReferenceId(1),
| ReferenceId(2), ReferenceId(3), ReferenceId(4), ReferenceId(5),
| ReferenceId(6), ReferenceId(8)]
* export-elimination/input.ts
x Semantic Collector failed after transform
x Missing SymbolId: Name
,-[tasks/transform_conformance/tests/babel-plugin-transform-typescript/test/fixtures/export-elimination/input.ts:1:1]
1 | import Im, {Ok} from 'a';
@ -95,6 +167,44 @@ Passed: 10/36
2 | class Foo {}
`----
x Bindings mismatch:
| after transform: ScopeId(0): ["Baq", "Bar", "Baz", "Foo", "Func", "Im",
| "Name", "Ok", "T"]
| rebuilt : ScopeId(0): ["Bar", "Foo", "Func", "Im", "Name", "Ok",
| "T"]
x Binding symbols mismatch:
| after transform: ScopeId(5): [SymbolId(8), SymbolId(10)]
| rebuilt : ScopeId(3): [SymbolId(6), SymbolId(7)]
x Symbol flags mismatch:
| after transform: SymbolId(8): SymbolFlags(BlockScopedVariable |
| ConstVariable | Export)
| rebuilt : SymbolId(7): SymbolFlags(BlockScopedVariable |
| ConstVariable)
x Symbol flags mismatch:
| after transform: SymbolId(9): SymbolFlags(BlockScopedVariable | Export |
| Function | TypeAlias)
| rebuilt : SymbolId(8): SymbolFlags(BlockScopedVariable | Export
| | Function)
x Symbol span mismatch:
| after transform: SymbolId(9): Span { start: 205, end: 206 }
| rebuilt : SymbolId(8): Span { start: 226, end: 227 }
x Symbol reference IDs mismatch:
| after transform: SymbolId(9): [ReferenceId(8), ReferenceId(9)]
| rebuilt : SymbolId(8): [ReferenceId(9)]
x Symbol redeclarations mismatch:
| after transform: SymbolId(9): [Span { start: 226, end: 227 }]
| rebuilt : SymbolId(8): []
x Reference symbol mismatch:
| after transform: ReferenceId(7): Some("Name")
| rebuilt : ReferenceId(8): Some("Name")
* redeclarations/input.ts
x Symbol flags mismatch:
@ -446,8 +556,6 @@ Passed: 10/36
* refresh/generates-valid-signature-for-exotic-ways-to-call-hooks/input.jsx
x Semantic Collector failed after transform
x Missing ScopeId
,-[tasks/transform_conformance/tests/babel-plugin-transform-react-jsx/test/fixtures/refresh/generates-valid-signature-for-exotic-ways-to-call-hooks/input.jsx:1:1]
1 | import FancyHook from 'fancy';
@ -455,10 +563,40 @@ Passed: 10/36
2 |
`----
x Symbol reference IDs mismatch:
| after transform: SymbolId(10): [ReferenceId(17), ReferenceId(18),
| ReferenceId(20)]
| rebuilt : SymbolId(0): [ReferenceId(1), ReferenceId(16)]
x Symbol reference IDs mismatch:
| after transform: SymbolId(9): [ReferenceId(12), ReferenceId(13),
| ReferenceId(15)]
| rebuilt : SymbolId(4): [ReferenceId(3), ReferenceId(7)]
x Symbol reference IDs mismatch:
| after transform: SymbolId(7): [ReferenceId(9), ReferenceId(21),
| ReferenceId(22)]
| rebuilt : SymbolId(10): [ReferenceId(19), ReferenceId(22)]
x Reference symbol mismatch:
| after transform: ReferenceId(17): Some("_s2")
| rebuilt : ReferenceId(0): None
x Reference symbol mismatch:
| after transform: ReferenceId(12): Some("_s")
| rebuilt : ReferenceId(2): None
x Reference symbol mismatch:
| after transform: ReferenceId(21): Some("_c")
| rebuilt : ReferenceId(21): None
x Unresolved references mismatch:
| after transform: ["React", "useFancyEffect", "useThePlatform"]
| rebuilt : ["$RefreshReg$", "$RefreshSig$", "React",
| "useFancyEffect", "useThePlatform"]
* refresh/includes-custom-hooks-into-the-signatures/input.jsx
x Semantic Collector failed after transform
x Missing ScopeId
,-[tasks/transform_conformance/tests/babel-plugin-transform-react-jsx/test/fixtures/refresh/includes-custom-hooks-into-the-signatures/input.jsx:1:1]
1 | function useFancyState() {
@ -473,6 +611,46 @@ Passed: 10/36
2 | const [foo, setFoo] = React.useState(0);
`----
x Symbol reference IDs mismatch:
| after transform: SymbolId(8): [ReferenceId(10), ReferenceId(11),
| ReferenceId(13)]
| rebuilt : SymbolId(1): [ReferenceId(3), ReferenceId(7)]
x Symbol reference IDs mismatch:
| after transform: SymbolId(9): [ReferenceId(14), ReferenceId(15),
| ReferenceId(17)]
| rebuilt : SymbolId(2): [ReferenceId(10), ReferenceId(12)]
x Symbol reference IDs mismatch:
| after transform: SymbolId(10): [ReferenceId(19), ReferenceId(20),
| ReferenceId(22)]
| rebuilt : SymbolId(3): [ReferenceId(14), ReferenceId(18)]
x Symbol reference IDs mismatch:
| after transform: SymbolId(6): [ReferenceId(6), ReferenceId(23),
| ReferenceId(24)]
| rebuilt : SymbolId(10): [ReferenceId(21), ReferenceId(24)]
x Reference symbol mismatch:
| after transform: ReferenceId(10): Some("_s")
| rebuilt : ReferenceId(0): None
x Reference symbol mismatch:
| after transform: ReferenceId(14): Some("_s2")
| rebuilt : ReferenceId(1): None
x Reference symbol mismatch:
| after transform: ReferenceId(19): Some("_s3")
| rebuilt : ReferenceId(2): None
x Reference symbol mismatch:
| after transform: ReferenceId(23): Some("_c")
| rebuilt : ReferenceId(23): None
x Unresolved references mismatch:
| after transform: ["React"]
| rebuilt : ["$RefreshReg$", "$RefreshSig$", "React"]
* refresh/registers-capitalized-identifiers-in-hoc-calls/input.jsx
x Symbol reference IDs mismatch:
@ -1043,8 +1221,6 @@ Passed: 10/36
* refresh/supports-typescript-namespace-syntax/input.tsx
x Output mismatch
x Semantic Collector failed after transform
x Missing SymbolId: Foo
,-[tasks/transform_conformance/tests/babel-plugin-transform-react-jsx/test/fixtures/refresh/supports-typescript-namespace-syntax/input.tsx:1:1]
1 | namespace Foo {
@ -1185,6 +1361,63 @@ Passed: 10/36
2 | export namespace Bar {
`----
x Binding symbols mismatch:
| after transform: ScopeId(0): [SymbolId(0)]
| rebuilt : ScopeId(0): [SymbolId(0)]
x Binding symbols mismatch:
| after transform: ScopeId(1): [SymbolId(1), SymbolId(5), SymbolId(6),
| SymbolId(7), SymbolId(9)]
| rebuilt : ScopeId(1): [SymbolId(1), SymbolId(2), SymbolId(7),
| SymbolId(8), SymbolId(9)]
x Binding symbols mismatch:
| after transform: ScopeId(2): [SymbolId(2), SymbolId(3), SymbolId(4),
| SymbolId(10)]
| rebuilt : ScopeId(2): [SymbolId(3), SymbolId(4), SymbolId(5),
| SymbolId(6)]
x Binding symbols mismatch:
| after transform: ScopeId(7): [SymbolId(8), SymbolId(11)]
| rebuilt : ScopeId(7): [SymbolId(10), SymbolId(11)]
x Symbol flags mismatch:
| after transform: SymbolId(2): SymbolFlags(BlockScopedVariable |
| ConstVariable | Export | ArrowFunction)
| rebuilt : SymbolId(4): SymbolFlags(BlockScopedVariable |
| ConstVariable)
x Symbol flags mismatch:
| after transform: SymbolId(3): SymbolFlags(BlockScopedVariable | Function)
| rebuilt : SymbolId(5): SymbolFlags(FunctionScopedVariable)
x Symbol flags mismatch:
| after transform: SymbolId(4): SymbolFlags(BlockScopedVariable |
| ConstVariable | Export)
| rebuilt : SymbolId(6): SymbolFlags(BlockScopedVariable |
| ConstVariable)
x Symbol flags mismatch:
| after transform: SymbolId(5): SymbolFlags(BlockScopedVariable |
| ConstVariable | Export | ArrowFunction)
| rebuilt : SymbolId(7): SymbolFlags(BlockScopedVariable |
| ConstVariable)
x Symbol flags mismatch:
| after transform: SymbolId(6): SymbolFlags(BlockScopedVariable | Export
| | Function)
| rebuilt : SymbolId(8): SymbolFlags(FunctionScopedVariable)
x Symbol reference IDs mismatch:
| after transform: SymbolId(6): []
| rebuilt : SymbolId(8): [ReferenceId(9)]
x Symbol flags mismatch:
| after transform: SymbolId(8): SymbolFlags(BlockScopedVariable |
| ConstVariable | Export | ArrowFunction)
| rebuilt : SymbolId(11): SymbolFlags(BlockScopedVariable |
| ConstVariable)
* refresh/uses-custom-identifiers-for-refresh-reg-and-refresh-sig/input.jsx
x Symbol reference IDs mismatch: