11use ahash:: HashMap ;
2+ use mago_atom:: Atom ;
23use mago_atom:: atom;
34
45use crate :: identifier:: method:: MethodIdentifier ;
@@ -15,21 +16,24 @@ pub fn inherit_methods_from_parent(
1516 let class_like_name = metadata. name ;
1617 let parent_is_trait = parent_metadata. kind . is_trait ( ) ;
1718
18- // Register where methods appear (can never be in a trait in the final appearing_method_ids)
19+ let reverse_alias_map: Option < HashMap < Atom , Vec < Atom > > > = if parent_is_trait && !metadata. trait_alias_map . is_empty ( )
20+ {
21+ let mut map: HashMap < Atom , Vec < Atom > > = HashMap :: default ( ) ;
22+ for ( original, alias) in metadata. get_trait_alias_map ( ) . iter ( ) {
23+ map. entry ( * original) . or_default ( ) . push ( * alias) ;
24+ }
25+ Some ( map)
26+ } else {
27+ None
28+ } ;
29+
1930 for ( method_name_lc, appearing_method_id) in & parent_metadata. appearing_method_ids {
20- // Build a list of aliased method names
2131 let mut aliased_method_names = vec ! [ * method_name_lc] ;
2232
23- if parent_is_trait && !metadata. trait_alias_map . is_empty ( ) {
24- // Find all aliases for this method
25- // trait_alias_map is: original_method_name -> alias_name
26- aliased_method_names. extend (
27- metadata
28- . get_trait_alias_map ( )
29- . iter ( )
30- . filter ( |( original, _) | * original == method_name_lc)
31- . map ( |( _, alias) | * alias) ,
32- ) ;
33+ if let Some ( ref reverse_map) = reverse_alias_map
34+ && let Some ( aliases) = reverse_map. get ( method_name_lc)
35+ {
36+ aliased_method_names. extend ( aliases. iter ( ) . copied ( ) ) ;
3337 }
3438
3539 for aliased_method_name in aliased_method_names {
@@ -42,31 +46,9 @@ pub fn inherit_methods_from_parent(
4246 let final_appearing_id = if parent_is_trait { implemented_method_id } else { * appearing_method_id } ;
4347
4448 metadata. appearing_method_ids . insert ( aliased_method_name, final_appearing_id) ;
45-
46- let this_method_id_str = format ! ( "{}::{}" , class_like_name, method_name_lc) ;
47-
48- if codebase. function_likes . contains_key ( & ( class_like_name, aliased_method_name) ) {
49- let mut potential_ids = HashMap :: default ( ) ;
50- potential_ids. insert ( this_method_id_str, true ) ;
51- metadata. potential_declaring_method_ids . insert ( aliased_method_name, potential_ids) ;
52- } else {
53- if let Some ( parent_potential_method_ids) =
54- parent_metadata. get_potential_declaring_method_id ( & aliased_method_name)
55- {
56- metadata
57- . potential_declaring_method_ids
58- . insert ( aliased_method_name, parent_potential_method_ids. clone ( ) ) ;
59- }
60-
61- metadata. add_potential_declaring_method ( aliased_method_name, this_method_id_str) ;
62-
63- let parent_method_id_str = format ! ( "{}::{}" , parent_metadata. name, method_name_lc) ;
64- metadata. add_potential_declaring_method ( aliased_method_name, parent_method_id_str) ;
65- }
6649 }
6750 }
6851
69- // Register where methods are declared
7052 for ( method_name_lc, declaring_method_id) in & parent_metadata. inheritable_method_ids {
7153 if !method_name_lc. eq ( & atom ( "__construct" ) ) || parent_metadata. flags . has_consistent_constructor ( ) {
7254 if parent_is_trait {
@@ -93,15 +75,10 @@ pub fn inherit_methods_from_parent(
9375
9476 let mut aliased_method_names = vec ! [ * method_name_lc] ;
9577
96- if parent_is_trait && !metadata. trait_alias_map . is_empty ( ) {
97- // trait_alias_map is: original_method_name -> alias_name
98- aliased_method_names. extend (
99- metadata
100- . get_trait_alias_map ( )
101- . iter ( )
102- . filter ( |( original, _) | * original == method_name_lc)
103- . map ( |( _, alias) | * alias) ,
104- ) ;
78+ if let Some ( ref reverse_map) = reverse_alias_map
79+ && let Some ( aliases) = reverse_map. get ( method_name_lc)
80+ {
81+ aliased_method_names. extend ( aliases. iter ( ) . copied ( ) ) ;
10582 }
10683
10784 for aliased_method_name in aliased_method_names {
0 commit comments