mirror of
https://github.com/danbulant/oxc
synced 2026-05-19 12:19:15 +00:00
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:
parent
943454fa5e
commit
af5713e411
6 changed files with 9345 additions and 910 deletions
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
|
@ -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
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Reference in a new issue