refactor(semantic): UnresolvedReferencesStack contain only ReferenceId (#4960)

Remove `ReferenceFlag` from `UnresolvedReferencesStack` to align with `root_unresolved_references`.
This commit is contained in:
overlookmotel 2024-08-19 01:32:04 +00:00
parent 59d15c7086
commit a7ef30dcf9
2 changed files with 8 additions and 12 deletions

View file

@ -256,7 +256,7 @@ impl<'a> SemanticBuilder<'a> {
.unresolved_references
.into_root()
.into_iter()
.map(|(k, v)| (k.into(), v.into_iter().map(|(reference_id, _)| reference_id).collect()))
.map(|(k, v)| (k.into(), v))
.collect();
let jsdoc = if self.build_jsdoc { self.jsdoc.build() } else { JSDocFinder::default() };
@ -425,14 +425,9 @@ impl<'a> SemanticBuilder<'a> {
name: Atom<'a>,
reference: Reference,
) -> ReferenceId {
let reference_flag = *reference.flag();
let reference_id = self.symbols.create_reference(reference);
self.unresolved_references
.current_mut()
.entry(name)
.or_default()
.push((reference_id, reference_flag));
self.unresolved_references.current_mut().entry(name).or_default().push(reference_id);
reference_id
}
@ -476,12 +471,13 @@ impl<'a> SemanticBuilder<'a> {
// Reserve space for all references to avoid reallocations.
resolved_references.reserve(references.len());
references.retain(|(id, flag)| {
references.retain(|&reference_id| {
let reference = &mut self.symbols.references[reference_id];
let flag = *reference.flag();
if flag.is_type() && symbol_flag.can_be_referenced_by_type()
|| flag.is_value() && symbol_flag.can_be_referenced_by_value()
|| flag.is_ts_type_query() && symbol_flag.is_import()
{
let reference = &mut self.symbols.references[*id];
// The non type-only ExportSpecifier can reference a type/value symbol,
// If the symbol is a value symbol and reference flag is not type-only, remove the type flag.
if symbol_flag.is_value() && !flag.is_type_only() {
@ -500,7 +496,7 @@ impl<'a> SemanticBuilder<'a> {
}
reference.set_symbol_id(symbol_id);
resolved_references.push(*id);
resolved_references.push(reference_id);
false
} else {
true

View file

@ -2,10 +2,10 @@ use assert_unchecked::assert_unchecked;
use oxc_span::Atom;
use rustc_hash::FxHashMap;
use oxc_syntax::reference::{ReferenceFlag, ReferenceId};
use oxc_syntax::reference::ReferenceId;
/// The difference with Scope's `UnresolvedReferences` is that this type uses Atom as the key. its clone is very cheap!
type TempUnresolvedReferences<'a> = FxHashMap<Atom<'a>, Vec<(ReferenceId, ReferenceFlag)>>;
type TempUnresolvedReferences<'a> = FxHashMap<Atom<'a>, Vec<ReferenceId>>;
// Stack used to accumulate unresolved refs while traversing scopes.
// Indexed by scope depth. We recycle `UnresolvedReferences` instances during traversal