Skip to content

Commit d79658f

Browse files
committed
fixes
1 parent f8f8a08 commit d79658f

6 files changed

Lines changed: 28 additions & 169 deletions

File tree

de.peeeq.wurstscript/src/main/java/de/peeeq/wurstio/intermediateLang/interpreter/CompiletimeNatives.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public ILconstTuple createObjectDefinition(ILconstString fileType, ILconstInt ne
4141
String objIdString = ObjectHelper.objectIdIntToString(newUnitId.getVal());
4242
boolean isMeleeOverride = newUnitId.getVal() == deriveFrom.getVal();
4343

44-
if (!globalState.registerCreatedObjectDefinition(fileType.getVal(), objIdString)) {
44+
if (!isMeleeOverride && !globalState.registerCreatedObjectDefinition(fileType.getVal(), objIdString)) {
4545
globalState.compilationError("Object definition with id " + objIdString + " is defined more than once.");
4646
}
4747
ObjMod.Obj objDef = newDefFromFiletype(dataStore, deriveFrom.getVal(), newUnitId.getVal(), isMeleeOverride);
@@ -59,7 +59,10 @@ private ObjMod.Obj newDefFromFiletype(ObjMod<? extends ObjMod.Obj> dataStore, in
5959
if (isMeleeOverride) {
6060
ObjId id = ObjId.valueOf(ObjectHelper.objectIdIntToString(newId));
6161
// same id => modify melee/original definition table
62-
dataStore.removeObj(id);
62+
ObjMod.Obj existing = dataStore.getObjs().get(id);
63+
if (existing != null) {
64+
return existing;
65+
}
6366
return dataStore.addObj(id, null);
6467
}
6568
ObjId baseIdS = ObjId.valueOf(ObjectHelper.objectIdIntToString(base));
Lines changed: 0 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
package de.peeeq.wurstscript.attributes.names;
22

33

4-
import com.google.common.collect.ImmutableCollection;
54
import com.google.common.collect.ImmutableMultimap;
65
import com.google.common.collect.ImmutableMultimap.Builder;
7-
import com.google.common.collect.ImmutableSet;
86
import com.google.common.collect.Sets;
97
import de.peeeq.wurstscript.ast.WImport;
108
import de.peeeq.wurstscript.ast.WPackage;
@@ -49,49 +47,12 @@ private static void addExportedNameLinks(Builder<String, DefLink> result, WPacka
4947

5048
}
5149

52-
public static ImmutableCollection<DefLink> exportedNameLinks(WPackage p, String name) {
53-
ImmutableSet.Builder<DefLink> result = ImmutableSet.builder();
54-
addExportedNameLinks(result, p, name, Sets.newLinkedHashSet());
55-
return result.build();
56-
}
57-
58-
private static void addExportedNameLinks(ImmutableSet.Builder<DefLink> result, WPackage p, String name, Set<WPackage> alreadyImported) {
59-
if (alreadyImported.contains(p)) {
60-
return;
61-
}
62-
alreadyImported.add(p);
63-
64-
for (DefLink link : NameLinks.get(p.getElements(), name)) {
65-
if (link.getVisibility() == Visibility.LOCAL) {
66-
continue;
67-
}
68-
result.add(link.hidingPrivateAndProtected());
69-
}
70-
71-
for (WImport imp2 : p.getImports()) {
72-
if (imp2.getIsPublic()) {
73-
@Nullable
74-
WPackage imported = imp2.attrImportedPackage();
75-
if (imported != null) {
76-
addExportedNameLinks(result, imported, name, alreadyImported);
77-
}
78-
}
79-
}
80-
}
81-
8250
public static ImmutableMultimap<String, TypeLink> exportedTypeNameLinks(WPackage p) {
8351
Builder<String, TypeLink> result = ImmutableMultimap.builder();
8452
addExportedTypeNameLinks(result, p, Sets.newLinkedHashSet());
8553
return result.build();
8654
}
8755

88-
public static ImmutableCollection<TypeLink> exportedTypeNameLinks(WPackage p, String name) {
89-
ImmutableSet.Builder<TypeLink> result = ImmutableSet.builder();
90-
addExportedTypeNameLinks(result, p, name, Sets.newLinkedHashSet());
91-
return result.build();
92-
}
93-
94-
9556
private static void addExportedTypeNameLinks(Builder<String, TypeLink> result, WPackage p, Set<WPackage> alreadyImported) {
9657
if (alreadyImported.contains(p)) {
9758
return;
@@ -111,27 +72,4 @@ private static void addExportedTypeNameLinks(Builder<String, TypeLink> result, W
11172
}
11273

11374
}
114-
115-
private static void addExportedTypeNameLinks(ImmutableSet.Builder<TypeLink> result, WPackage p, String name, Set<WPackage> alreadyImported) {
116-
if (alreadyImported.contains(p)) {
117-
return;
118-
}
119-
alreadyImported.add(p);
120-
121-
for (TypeLink link : TypeNameLinks.get(p.getElements(), name)) {
122-
if (link.getVisibility() == Visibility.LOCAL) {
123-
continue;
124-
}
125-
result.add(link.hidingPrivateAndProtected());
126-
}
127-
128-
for (WImport imp2 : p.getImports()) {
129-
if (imp2.getIsPublic()) {
130-
WPackage imported = imp2.attrImportedPackage();
131-
if (imported != null) {
132-
addExportedTypeNameLinks(result, imported, name, alreadyImported);
133-
}
134-
}
135-
}
136-
}
13775
}

de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/attributes/names/NameLinks.java

Lines changed: 0 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
11
package de.peeeq.wurstscript.attributes.names;
22

33
import com.google.common.collect.HashMultimap;
4-
import com.google.common.collect.ImmutableCollection;
54
import com.google.common.collect.ImmutableMultimap;
65
import com.google.common.collect.ImmutableMultimap.Builder;
7-
import com.google.common.collect.ImmutableList;
8-
import com.google.common.collect.ImmutableSet;
96
import com.google.common.collect.ImmutableSetMultimap;
107
import com.google.common.collect.Multimap;
118
import de.peeeq.wurstscript.WLogger;
@@ -271,28 +268,6 @@ public static ImmutableMultimap<String, DefLink> calculate(WPackage p) {
271268
return result.build();
272269
}
273270

274-
public static ImmutableCollection<DefLink> get(WPackage p, String name) {
275-
ImmutableSet.Builder<DefLink> result = ImmutableSet.builder();
276-
for (WImport imp : p.getImports()) {
277-
if (imp.getPackagename().equals("NoWurst")) {
278-
continue;
279-
}
280-
WPackage importedPackage = imp.attrImportedPackage();
281-
if (importedPackage == null) {
282-
WLogger.info("could not resolve import: " + Utils.printElementWithSource(Optional.of(imp)));
283-
continue;
284-
}
285-
if (p.getName().equals("WurstREPL")) {
286-
addHidingPrivate(result, importedPackage.getElements().attrNameLinks().get(name));
287-
result.addAll(get(importedPackage, name));
288-
} else {
289-
result.addAll(Exports.exportedNameLinks(importedPackage, name));
290-
}
291-
}
292-
return result.build();
293-
}
294-
295-
296271
public static ImmutableMultimap<String, DefLink> calculate(WEntities wEntities) {
297272
ImmutableMultimap.Builder<String, DefLink> result = ImmutableSetMultimap.builder();
298273
for (WEntity e : wEntities) {
@@ -314,29 +289,6 @@ public static ImmutableMultimap<String, DefLink> calculate(WEntities wEntities)
314289
return result.build();
315290
}
316291

317-
public static ImmutableCollection<DefLink> get(WEntities wEntities, String name) {
318-
ImmutableSet.Builder<DefLink> result = ImmutableSet.builder();
319-
for (WEntity e : wEntities) {
320-
if (e instanceof NameDef) {
321-
NameDef n = (NameDef) e;
322-
if (n.getName().equals(name)) {
323-
addNameDefDefLink(result::add, n, wEntities);
324-
}
325-
}
326-
if (e instanceof WScope && !(e instanceof ModuleDef)) {
327-
WScope scope = (WScope) e;
328-
List<TypeParamDef> typeParams;
329-
if (scope instanceof AstElementWithTypeParameters) {
330-
typeParams = ((AstElementWithTypeParameters) scope).getTypeParameters();
331-
} else {
332-
typeParams = Collections.emptyList();
333-
}
334-
addHidingPrivate(result, scope.attrNameLinks().get(name), typeParams);
335-
}
336-
}
337-
return result.build();
338-
}
339-
340292
public static ImmutableMultimap<String, DefLink> calculate(WurstModel model) {
341293
ImmutableMultimap.Builder<String, DefLink> result = ImmutableSetMultimap.builder();
342294
for (CompilationUnit cu : model) {
@@ -445,24 +397,6 @@ public static void addHidingPrivate(Builder<String, DefLink> result, Multimap<St
445397

446398
}
447399

448-
private static void addHidingPrivate(ImmutableSet.Builder<DefLink> result, Iterable<? extends DefLink> adding) {
449-
for (DefLink defLink : adding) {
450-
if (defLink.getVisibility() == Visibility.LOCAL) {
451-
continue;
452-
}
453-
result.add(defLink.hidingPrivate());
454-
}
455-
}
456-
457-
private static void addHidingPrivate(ImmutableSet.Builder<DefLink> result, Iterable<? extends DefLink> adding, List<TypeParamDef> typeParams) {
458-
for (DefLink defLink : adding) {
459-
if (defLink.getVisibility() == Visibility.LOCAL) {
460-
continue;
461-
}
462-
result.add(defLink.hidingPrivate().withGenericTypeParams(typeParams));
463-
}
464-
}
465-
466400
public static void addHidingPrivate(Multimap<String, DefLink> result, Multimap<String, DefLink> adding) {
467401
for (Entry<String, DefLink> e : adding.entries()) {
468402
if (e.getValue().getVisibility() == Visibility.LOCAL) {

de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/attributes/names/NameResolution.java

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,22 +21,10 @@ private static String memberFuncCacheName(String name, WurstType receiverType) {
2121
}
2222

2323
private static ImmutableCollection<DefLink> scopeNameLinks(WScope scope, String name) {
24-
if (scope instanceof WPackage) {
25-
return NameLinks.get((WPackage) scope, name);
26-
}
27-
if (scope instanceof WEntities) {
28-
return NameLinks.get((WEntities) scope, name);
29-
}
3024
return scope.attrNameLinks().get(name);
3125
}
3226

3327
private static ImmutableCollection<TypeLink> scopeTypeLinks(WScope scope, String name) {
34-
if (scope instanceof WPackage) {
35-
return TypeNameLinks.get((WPackage) scope, name);
36-
}
37-
if (scope instanceof WEntities) {
38-
return TypeNameLinks.get((WEntities) scope, name);
39-
}
4028
return scope.attrTypeNameLinks().get(name);
4129
}
4230

de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/attributes/names/TypeNameLinks.java

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package de.peeeq.wurstscript.attributes.names;
22

3-
import com.google.common.collect.ImmutableCollection;
43
import com.google.common.collect.ImmutableMultimap;
5-
import com.google.common.collect.ImmutableSet;
64
import com.google.common.collect.ImmutableSetMultimap;
75
import de.peeeq.wurstscript.ast.*;
86

@@ -67,18 +65,6 @@ public static ImmutableMultimap<String, TypeLink> calculate(WPackage p) {
6765
return result.build();
6866
}
6967

70-
public static ImmutableCollection<TypeLink> get(WPackage p, String name) {
71-
ImmutableSet.Builder<TypeLink> result = ImmutableSet.builder();
72-
for (WImport imp : p.getImports()) {
73-
WPackage importedPackage = imp.attrImportedPackage();
74-
if (importedPackage == null) {
75-
continue;
76-
}
77-
result.addAll(Exports.exportedTypeNameLinks(importedPackage, name));
78-
}
79-
return result.build();
80-
}
81-
8268
public static ImmutableMultimap<String, TypeLink> calculate(WEntities wEntities) {
8369
ImmutableMultimap.Builder<String, TypeLink> result = ImmutableSetMultimap.builder();
8470
for (WEntity e : wEntities) {
@@ -90,19 +76,6 @@ public static ImmutableMultimap<String, TypeLink> calculate(WEntities wEntities)
9076
return result.build();
9177
}
9278

93-
public static ImmutableCollection<TypeLink> get(WEntities wEntities, String name) {
94-
ImmutableSet.Builder<TypeLink> result = ImmutableSet.builder();
95-
for (WEntity e : wEntities) {
96-
if (e instanceof TypeDef) {
97-
TypeDef n = (TypeDef) e;
98-
if (n.getName().equals(name)) {
99-
result.add(TypeLink.create(n, wEntities));
100-
}
101-
}
102-
}
103-
return result.build();
104-
}
105-
10679
public static ImmutableMultimap<String, TypeLink> calculate(WurstModel model) {
10780
ImmutableMultimap.Builder<String, TypeLink> result = ImmutableSetMultimap.builder();
10881
for (CompilationUnit cu : model) {

de.peeeq.wurstscript/src/test/java/tests/wurstscript/tests/CompiletimeNativesTest.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,29 @@ public void createObjectDefinitionDoesNotReportExistingMapObjectAsError() throws
181181
assertFalse(obj.getMods().stream().anyMatch(m -> m.getId().getVal().equals("unam")));
182182
}
183183

184+
@Test
185+
public void sameIdObjectDefinitionsMergeModsWithoutDuplicateError() throws Exception {
186+
WurstGuiLogger gui = new WurstGuiLogger();
187+
ProgramStateIO state = new ProgramStateIO(Optional.empty(), null, gui, emptyProg(), true);
188+
CompiletimeNatives natives = new CompiletimeNatives(state, null, false);
189+
int hfoo = ObjectHelper.objectIdStringToInt("hfoo");
190+
191+
var first = natives.createObjectDefinition(new ILconstString("w3u"), new ILconstInt(hfoo), new ILconstInt(hfoo));
192+
natives.ObjectDefinition_setString(first, new ILconstString("unam"), new ILconstString("first"));
193+
var second = natives.createObjectDefinition(new ILconstString("w3u"), new ILconstInt(hfoo), new ILconstInt(hfoo));
194+
natives.ObjectDefinition_setString(second, new ILconstString("utip"), new ILconstString("second"));
195+
196+
Method getDataStore = ProgramStateIO.class.getDeclaredMethod("getDataStore", String.class);
197+
getDataStore.setAccessible(true);
198+
W3U w3u = (W3U) getDataStore.invoke(state, "w3u");
199+
200+
assertEquals(gui.getErrorCount(), 0);
201+
assertEquals(w3u.getOrigObjs().size(), 1);
202+
ObjMod.Obj obj = w3u.getOrigObjs().get(0);
203+
assertTrue(obj.getMods().stream().anyMatch(m -> m.getId().getVal().equals("unam")));
204+
assertTrue(obj.getMods().stream().anyMatch(m -> m.getId().getVal().equals("utip")));
205+
}
206+
184207
private ImProg emptyProg() {
185208
Element trace = Ast.NoExpr();
186209
return JassIm.ImProg(trace, JassIm.ImVars(), JassIm.ImFunctions(), JassIm.ImMethods(), JassIm.ImClasses(), JassIm.ImTypeClassFuncs(), new HashMap<>());

0 commit comments

Comments
 (0)