99import de .peeeq .wurstscript .types .WurstTypeTuple ;
1010
1111import java .util .ArrayList ;
12+ import java .util .Collections ;
13+ import java .util .IdentityHashMap ;
1214import java .util .LinkedHashMap ;
1315import java .util .List ;
1416import java .util .Map ;
17+ import java .util .Set ;
1518
1619/** Metadata for names which are part of the Warcraft III-facing API. */
1720public final class NamePreservation {
@@ -65,7 +68,8 @@ public void visit(GlobalVarDef variable) {
6568 super .visit (variable );
6669 String name = runtimeName (variable );
6770 result .add (name , variable );
68- addTupleComponentNames (result , name , variable .attrTyp (), variable );
71+ addTupleComponentNames (result , name , variable .attrTyp (), variable ,
72+ Collections .newSetFromMap (new IdentityHashMap <>()));
6973 }
7074 });
7175 return result ;
@@ -87,17 +91,20 @@ public void visit(GlobalVarDef variable) {
8791 }
8892
8993 private static void addTupleComponentNames (RuntimeNameIndex index , String name , WurstType type ,
90- GlobalVarDef variable ) {
94+ GlobalVarDef variable , Set < TupleDef > expandedTuples ) {
9195 if (type instanceof WurstTypeArray array ) {
9296 type = array .getBaseType ();
9397 }
9498 if (!(type instanceof WurstTypeTuple tuple )) {
9599 return ;
96100 }
101+ if (!expandedTuples .add (tuple .getTupleDef ())) {
102+ return ;
103+ }
97104 for (WParameter parameter : tuple .getTupleDef ().getParameters ()) {
98105 String componentName = name + "_" + parameter .getName ();
99106 index .add (componentName , variable );
100- addTupleComponentNames (index , componentName , parameter .attrTyp (), variable );
107+ addTupleComponentNames (index , componentName , parameter .attrTyp (), variable , expandedTuples );
101108 }
102109 }
103110
0 commit comments