From a00bf18b9fae2e8724365bf76eae6cbe96777075 Mon Sep 17 00:00:00 2001 From: overlookmotel <557937+overlookmotel@users.noreply.github.com> Date: Thu, 22 Aug 2024 15:08:49 +0000 Subject: [PATCH] refactor(semantic): add `IdMapping` to transform checker (#5079) `IdMapping` wraps `FxHashMap` for ease in dealing with ID types which are `Copy`. --- .../src/post_transform_checker.rs | 42 +++++++++++++------ 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/crates/oxc_semantic/src/post_transform_checker.rs b/crates/oxc_semantic/src/post_transform_checker.rs index 90c5514722f08..c3ec793106e61 100644 --- a/crates/oxc_semantic/src/post_transform_checker.rs +++ b/crates/oxc_semantic/src/post_transform_checker.rs @@ -85,7 +85,7 @@ //! //! See also: -use std::{cell::Cell, fmt::Debug}; +use std::{cell::Cell, fmt::Debug, hash::Hash}; use oxc_allocator::{Allocator, CloneIn}; #[allow(clippy::wildcard_imports)] @@ -142,9 +142,9 @@ pub fn check_semantic_after_transform( let mut checker = PostTransformChecker { after_transform: data_after_transform, rebuilt: data_rebuilt, - scope_ids_map: FxHashMap::default(), - symbol_ids_map: FxHashMap::default(), - reference_ids_map: FxHashMap::default(), + scope_ids_map: IdMapping::default(), + symbol_ids_map: IdMapping::default(), + reference_ids_map: IdMapping::default(), errors: Errors::default(), }; checker.create_mappings(); @@ -159,9 +159,9 @@ struct PostTransformChecker<'s> { after_transform: SemanticData<'s>, rebuilt: SemanticData<'s>, // Mappings from after transform ID to rebuilt ID - scope_ids_map: FxHashMap, - symbol_ids_map: FxHashMap, - reference_ids_map: FxHashMap, + scope_ids_map: IdMapping, + symbol_ids_map: IdMapping, + reference_ids_map: IdMapping, errors: Errors, } @@ -171,6 +171,25 @@ struct SemanticData<'s> { ids: SemanticIds, } +/// Mapping from "after transform" ID to "rebuilt" ID +struct IdMapping(FxHashMap); + +impl IdMapping { + fn insert(&mut self, after_transform_id: Id, rebuilt_id: Id) { + self.0.insert(after_transform_id, rebuilt_id); + } + + fn get(&self, after_transform_id: Id) -> Option { + self.0.get(&after_transform_id).copied() + } +} + +impl Default for IdMapping { + fn default() -> Self { + Self(FxHashMap::default()) + } +} + /// Pair of values from after transform and rebuilt struct Pair { after_transform: T, @@ -339,7 +358,7 @@ impl<'s> PostTransformChecker<'s> { let mut symbol_ids_after_transform = symbol_ids .after_transform .iter() - .map(|symbol_id| self.symbol_ids_map.get(symbol_id).copied()) + .map(|&symbol_id| self.symbol_ids_map.get(symbol_id)) .collect::>(); symbol_ids_after_transform.sort_unstable(); let mut symbol_ids_rebuilt = symbol_ids @@ -406,7 +425,7 @@ impl<'s> PostTransformChecker<'s> { let mut child_ids_after_transform = child_ids .after_transform .iter() - .map(|child_id| self.scope_ids_map.get(child_id).copied()) + .map(|&child_id| self.scope_ids_map.get(child_id)) .collect::>(); child_ids_after_transform.sort_unstable(); let mut child_ids_rebuilt = @@ -521,10 +540,7 @@ impl<'s> PostTransformChecker<'s> { /// Map `after_transform` scope ID to `rebuilt` scope ID fn remap_scope_ids(&self, scope_ids: Pair) -> Pair> { - Pair::new( - self.scope_ids_map.get(&scope_ids.after_transform).copied(), - Some(scope_ids.rebuilt), - ) + Pair::new(self.scope_ids_map.get(scope_ids.after_transform), Some(scope_ids.rebuilt)) } }