Skip to content

Commit d84c9a8

Browse files
committed
Fix expansions on expanded types
1 parent b8546f9 commit d84c9a8

File tree

20 files changed

+96
-31
lines changed

20 files changed

+96
-31
lines changed

CodeModel/src/main/java/org/openzen/zenscript/codemodel/compilation/CompileContext.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,11 @@ public void addExpansion(ExpansionDefinition expansion) {
7272
expansions.add(expansion);
7373
}
7474

75+
@Override
76+
public List<ExpansionSymbol> getAvailableExpansions() {
77+
return expansions;
78+
}
79+
7580
public Optional<IGlobal> findGlobal(String name) {
7681
return Optional.ofNullable(globals.get(name));
7782
}

CodeModel/src/main/java/org/openzen/zenscript/codemodel/compilation/ExpressionCompiler.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import org.openzen.zenscript.codemodel.GenericName;
77
import org.openzen.zenscript.codemodel.compilation.impl.capture.LocalExpression;
88
import org.openzen.zenscript.codemodel.expression.LambdaClosure;
9+
import org.openzen.zenscript.codemodel.identifiers.ExpansionSymbol;
910
import org.openzen.zenscript.codemodel.type.TypeID;
1011

1112
import java.util.List;
@@ -41,4 +42,6 @@ public interface ExpressionCompiler extends TypeResolver {
4142
ExpressionCompiler withDollar(CompilingExpression value);
4243

4344
StatementCompiler forLambda(LambdaClosure closure, FunctionHeader header);
45+
46+
List<ExpansionSymbol> getAvailableExpansions();
4447
}

CodeModel/src/main/java/org/openzen/zenscript/codemodel/compilation/MatchedCallArguments.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import org.openzen.zenscript.codemodel.expression.CallArguments;
1010
import org.openzen.zenscript.codemodel.expression.Expression;
1111
import org.openzen.zenscript.codemodel.generic.TypeParameter;
12+
import org.openzen.zenscript.codemodel.identifiers.ExpansionSymbol;
1213
import org.openzen.zenscript.codemodel.identifiers.instances.MethodInstance;
1314
import org.openzen.zenscript.codemodel.type.BasicTypeID;
1415
import org.openzen.zenscript.codemodel.type.TypeID;
@@ -143,7 +144,7 @@ private static <T extends AnyMethod> MatchedCallArguments<T> match(
143144
}
144145

145146
// Type inference
146-
Optional<TypeID[]> inferred = inferTypeArguments(expansionTypeArguments, method, result, typeArguments, arguments);
147+
Optional<TypeID[]> inferred = inferTypeArguments(expansionTypeArguments, method, result, typeArguments, compiler.getAvailableExpansions(), arguments);
147148
if (!inferred.isPresent()) {
148149
return new MatchedCallArguments<>(
149150
method,
@@ -320,6 +321,7 @@ private static <T extends AnyMethod> Optional<TypeID[]> inferTypeArguments(
320321
T method,
321322
TypeID result,
322323
TypeID[] typeArguments,
324+
List<ExpansionSymbol> expansions,
323325
CompilingExpression... arguments
324326
) {
325327
int providedTypeArguments = typeArguments == null ? 0 : typeArguments.length;
@@ -335,7 +337,7 @@ private static <T extends AnyMethod> Optional<TypeID[]> inferTypeArguments(
335337
// attempt to infer type arguments from the return type
336338
final Map<TypeParameter, TypeID> typeArgumentMap = new HashMap<>();
337339
if (result != null) {
338-
typeArgumentMap.putAll(method.getHeader().getReturnType().inferTypeParameters(result));
340+
typeArgumentMap.putAll(method.getHeader().getReturnType().inferTypeParameters(result, expansions));
339341
}
340342

341343
// create a mapping with everything found so far
@@ -348,7 +350,7 @@ private static <T extends AnyMethod> Optional<TypeID[]> inferTypeArguments(
348350
Expression evaluated = argument.eval();
349351
if (evaluated.type != BasicTypeID.UNDETERMINED) {
350352
TypeID parameterType = mapper.map(method.getHeader().parameters[i].type);
351-
Map<TypeParameter, TypeID> mapping = parameterType.inferTypeParameters(evaluated.type);
353+
Map<TypeParameter, TypeID> mapping = parameterType.inferTypeParameters(evaluated.type, expansions);
352354
if (mapping != null)
353355
typeArgumentMap.putAll(mapping);
354356
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
package org.openzen.zenscript.codemodel.compilation;
22

3+
import org.openzen.zenscript.codemodel.identifiers.ExpansionSymbol;
34
import org.openzen.zenscript.codemodel.type.TypeID;
45

6+
import java.util.List;
7+
58
public interface TypeResolver {
9+
List<ExpansionSymbol> getAvailableExpansions();
10+
611
ResolvedType resolve(TypeID type);
712
}

CodeModel/src/main/java/org/openzen/zenscript/codemodel/compilation/impl/compiler/ExpressionCompilerImpl.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import org.openzen.zenscript.codemodel.definition.ZSPackage;
1111
import org.openzen.zenscript.codemodel.expression.*;
1212
import org.openzen.zenscript.codemodel.expression.modifiable.ModifiableExpression;
13+
import org.openzen.zenscript.codemodel.identifiers.ExpansionSymbol;
1314
import org.openzen.zenscript.codemodel.identifiers.instances.FieldInstance;
1415
import org.openzen.zenscript.codemodel.identifiers.instances.MethodInstance;
1516
import org.openzen.zenscript.codemodel.member.ref.ImplementationMemberInstance;
@@ -189,6 +190,11 @@ public StatementCompiler forLambda(LambdaClosure closure, FunctionHeader header)
189190
return new StatementCompilerImpl(context, localType, types, header, newLocals, null);
190191
}
191192

193+
@Override
194+
public List<ExpansionSymbol> getAvailableExpansions() {
195+
return context.getAvailableExpansions();
196+
}
197+
192198
@Override
193199
public ResolvedType resolve(TypeID type) {
194200
return context.resolve(type);

CodeModel/src/main/java/org/openzen/zenscript/codemodel/compilation/impl/compiler/MemberCompilerImpl.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@
22

33
import org.openzen.zenscript.codemodel.FunctionHeader;
44
import org.openzen.zenscript.codemodel.compilation.*;
5+
import org.openzen.zenscript.codemodel.identifiers.ExpansionSymbol;
56
import org.openzen.zenscript.codemodel.type.TypeID;
67

8+
import java.util.List;
9+
710
public class MemberCompilerImpl implements MemberCompiler {
811
private final CompileContext context;
912
private final LocalType localType;
@@ -42,6 +45,11 @@ public DefinitionCompiler forInner() {
4245
return definitionCompiler;
4346
}
4447

48+
@Override
49+
public List<ExpansionSymbol> getAvailableExpansions() {
50+
return context.getAvailableExpansions();
51+
}
52+
4553
@Override
4654
public ResolvedType resolve(TypeID type) {
4755
return definitionCompiler.resolve(type);

CodeModel/src/main/java/org/openzen/zenscript/codemodel/definition/ExpansionDefinition.java

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,21 @@
55
import org.openzen.zenscript.codemodel.HighLevelDefinition;
66
import org.openzen.zenscript.codemodel.Modifiers;
77
import org.openzen.zenscript.codemodel.compilation.ResolvedType;
8+
import org.openzen.zenscript.codemodel.compilation.ResolvingType;
89
import org.openzen.zenscript.codemodel.generic.TypeParameter;
910
import org.openzen.zenscript.codemodel.identifiers.ExpansionSymbol;
1011
import org.openzen.zenscript.codemodel.identifiers.ModuleSymbol;
1112
import org.openzen.zenscript.codemodel.member.IDefinitionMember;
1213
import org.openzen.zenscript.codemodel.type.TypeID;
1314
import org.openzen.zenscript.codemodel.type.TypeMatcher;
15+
import org.openzen.zenscript.codemodel.type.member.InterfaceResolvingType;
1416
import org.openzen.zenscript.codemodel.type.member.MemberSet;
1517

18+
import java.util.Collections;
19+
import java.util.List;
1620
import java.util.Map;
1721
import java.util.Optional;
22+
import java.util.stream.Collectors;
1823
import java.util.stream.Stream;
1924

2025
public class ExpansionDefinition extends HighLevelDefinition implements ExpansionSymbol {
@@ -40,11 +45,11 @@ public String getName() {
4045
}
4146

4247
@Override
43-
public Optional<ResolvedType> resolve(TypeID expandingType) {
48+
public Optional<ResolvedType> resolve(TypeID expandingType, List<ExpansionSymbol> expansions) {
4449
if (target == null)
4550
throw new RuntimeException(position.toString() + ": Missing expansion target");
4651

47-
Map<TypeParameter, TypeID> mapping = TypeMatcher.match(expandingType, target);
52+
Map<TypeParameter, TypeID> mapping = TypeMatcher.match(expandingType, target, expansions);
4853
if (mapping == null)
4954
return Optional.empty();
5055

@@ -54,6 +59,15 @@ public Optional<ResolvedType> resolve(TypeID expandingType) {
5459
for (IDefinitionMember member : members)
5560
member.registerTo(expandingType, resolution, mapper);
5661

57-
return Optional.of(resolution.buildWithoutExpansions());
62+
List<TypeID> interfaces = this.members.stream()
63+
.map(IDefinitionMember::asImplementation)
64+
.filter(Optional::isPresent)
65+
.map(Optional::get)
66+
.map(mapper::map)
67+
.collect(Collectors.toList());
68+
69+
ResolvingType resolved = resolution.build();
70+
ResolvingType withInterfaces = InterfaceResolvingType.of(resolved, interfaces);
71+
return Optional.of(withInterfaces.withExpansions(Collections.emptyList()));
5872
}
5973
}

CodeModel/src/main/java/org/openzen/zenscript/codemodel/generic/ParameterSuperBound.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22

33
import org.openzen.zenscript.codemodel.GenericMapper;
44
import org.openzen.zenscript.codemodel.compilation.ResolvingType;
5+
import org.openzen.zenscript.codemodel.identifiers.ExpansionSymbol;
56
import org.openzen.zenscript.codemodel.type.TypeID;
67

8+
import java.util.List;
79
import java.util.Optional;
810

911
public final class ParameterSuperBound implements TypeParameterBound {
@@ -24,8 +26,8 @@ public Optional<ResolvingType> resolveMembers() {
2426
}
2527

2628
@Override
27-
public boolean matches(TypeID type) {
28-
return type.extendsOrImplements(type);
29+
public boolean matches(TypeID type, List<ExpansionSymbol> expansions) {
30+
return type.extendsOrImplements(type, expansions);
2931
}
3032

3133
@Override

CodeModel/src/main/java/org/openzen/zenscript/codemodel/generic/ParameterTypeBound.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33
import org.openzen.zencode.shared.CodePosition;
44
import org.openzen.zenscript.codemodel.GenericMapper;
55
import org.openzen.zenscript.codemodel.compilation.ResolvingType;
6+
import org.openzen.zenscript.codemodel.identifiers.ExpansionSymbol;
67
import org.openzen.zenscript.codemodel.type.TypeID;
78

9+
import java.util.List;
810
import java.util.Optional;
911

1012
public final class ParameterTypeBound implements TypeParameterBound {
@@ -27,8 +29,8 @@ public Optional<ResolvingType> resolveMembers() {
2729
}
2830

2931
@Override
30-
public boolean matches(TypeID type) {
31-
return type.extendsOrImplements(this.type);
32+
public boolean matches(TypeID type, List<ExpansionSymbol> expansions) {
33+
return type.extendsOrImplements(this.type, expansions);
3234
}
3335

3436
@Override

CodeModel/src/main/java/org/openzen/zenscript/codemodel/generic/TypeParameter.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import org.openzen.zencode.shared.CodePosition;
44
import org.openzen.zencode.shared.Taggable;
55
import org.openzen.zenscript.codemodel.GenericMapper;
6+
import org.openzen.zenscript.codemodel.identifiers.ExpansionSymbol;
67
import org.openzen.zenscript.codemodel.type.TypeID;
78

89
import java.util.ArrayList;
@@ -32,10 +33,10 @@ public boolean isObjectType() {
3233
return false;
3334
}
3435

35-
public boolean matches(TypeID type, GenericMapper mapper) {
36+
public boolean matches(TypeID type, GenericMapper mapper, List<ExpansionSymbol> expansions) {
3637
for (TypeParameterBound bound : bounds) {
3738
TypeParameterBound instanced = bound.instance(mapper);
38-
if (!instanced.matches(type))
39+
if (!instanced.matches(type, expansions))
3940
return false;
4041
}
4142

0 commit comments

Comments
 (0)