@@ -2029,20 +2029,35 @@ public ClassManagementVars getClassManagementVarsFor(ImClass c) {
20292029 if (res != null ) {
20302030 return res ;
20312031 }
2032- debugClassManagementMiss ("first lookup miss" , c , vars );
2033- // Recover from stale/mutated key situations by rebuilding from current classes.
2034- classManagementVars = null ;
2035- vars = getClassManagementVars ();
2036- res = vars .get (c );
2037- if (res != null ) {
2038- return res ;
2032+ // Try to recover by aliasing to an already existing entry without rebuilding.
2033+ ClassManagementVars alias = findClassManagementAlias (c , vars );
2034+ if (alias != null ) {
2035+ vars .put (c , alias );
2036+ return alias ;
2037+ }
2038+ // Extend mapping for current class graph only; do not clear and rebuild map,
2039+ // as rebuilding creates duplicate globals/initializers.
2040+ Partitions <ImClass > p = buildClassPartitions ();
2041+ p .add (c );
2042+ for (ImClassType sc : c .getSuperClasses ()) {
2043+ p .union (c , sc .getClassDef ());
2044+ }
2045+ ImClass rep = p .getRep (c );
2046+ ClassManagementVars repVars = vars .get (rep );
2047+ if (repVars == null ) {
2048+ repVars = findClassManagementAlias (rep , vars );
2049+ if (repVars == null ) {
2050+ repVars = new ClassManagementVars (rep , this );
2051+ }
2052+ vars .put (rep , repVars );
2053+ }
2054+ for (ImClass cls : imProg .getClasses ()) {
2055+ if (p .getRep (cls ) == rep ) {
2056+ vars .putIfAbsent (cls , repVars );
2057+ }
20392058 }
2040- debugClassManagementMiss ("after rebuild miss" , c , vars );
2041- // Last-resort fallback: ensure compilation does not crash language-server requests.
2042- WLogger .info ("ClassManagementVars missing for class " + c .getName () + ", creating fallback mapping." );
2043- ClassManagementVars fallback = new ClassManagementVars (c , this );
2044- vars .put (c , fallback );
2045- return fallback ;
2059+ vars .put (c , repVars );
2060+ return repVars ;
20462061 }
20472062
20482063
@@ -2054,15 +2069,7 @@ public Map<ImClass, ClassManagementVars> getClassManagementVars() {
20542069 if (classManagementVars != null ) {
20552070 return classManagementVars ;
20562071 }
2057- // create partitions, such that each sub-class and super-class are in
2058- // the same partition
2059- Partitions <ImClass > p = new Partitions <>();
2060- for (ImClass c : imProg .getClasses ()) {
2061- p .add (c );
2062- for (ImClassType sc : c .getSuperClasses ()) {
2063- p .union (c , sc .getClassDef ());
2064- }
2065- }
2072+ Partitions <ImClass > p = buildClassPartitions ();
20662073 // generate typeId variables
20672074 classManagementVars = new IdentityHashMap <>();
20682075 for (ImClass c : imProg .getClasses ()) {
@@ -2073,27 +2080,25 @@ public Map<ImClass, ClassManagementVars> getClassManagementVars() {
20732080 return classManagementVars ;
20742081 }
20752082
2076- private void debugClassManagementMiss ( String stage , ImClass c , Map <ImClass , ClassManagementVars > vars ) {
2077- StringBuilder sb = new StringBuilder ();
2078- sb . append ( "[ClassMgmt] " ). append ( stage )
2079- . append ( " target=" ). append ( c . getName ())
2080- . append ( "#" ). append ( System . identityHashCode ( c ))
2081- . append ( " mapSize=" ). append ( vars . size ());
2082- int sameName = 0 ;
2083- int sameIdentity = 0 ;
2084- for ( ImClass k : vars . keySet ()) {
2085- if ( k == c ) sameIdentity ++;
2086- if ( k . getName (). equals ( c . getName ())) {
2087- sameName ++;
2088- if ( sameName <= 5 ) {
2089- sb . append ( " | sameNameKey=" ). append ( k . getName ())
2090- . append ( "#" ). append ( System . identityHashCode ( k ));
2091- }
2083+ private Partitions <ImClass > buildClassPartitions ( ) {
2084+ Partitions < ImClass > p = new Partitions <> ();
2085+ for ( ImClass c : imProg . getClasses ()) {
2086+ p . add ( c );
2087+ for ( ImClassType sc : c . getSuperClasses ()) {
2088+ p . union ( c , sc . getClassDef ());
2089+ }
2090+ }
2091+ return p ;
2092+ }
2093+
2094+ private @ Nullable ClassManagementVars findClassManagementAlias ( ImClass target , Map < ImClass , ClassManagementVars > vars ) {
2095+ for ( Map . Entry < ImClass , ClassManagementVars > e : vars . entrySet () ) {
2096+ ImClass k = e . getKey ();
2097+ if ( k == target || k . attrTrace () == target . attrTrace ()) {
2098+ return e . getValue ();
20922099 }
20932100 }
2094- sb .append (" | sameNameCount=" ).append (sameName )
2095- .append (" sameIdentityCount=" ).append (sameIdentity );
2096- WLogger .info (sb .toString ());
2101+ return null ;
20972102 }
20982103
20992104
0 commit comments