Skip to content

Commit c19a338

Browse files
committed
WIP on wildcard types
1 parent 196c7fb commit c19a338

File tree

13 files changed

+207
-19
lines changed

13 files changed

+207
-19
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ public interface TypeBuilder {
2727

2828
FunctionTypeID functionOf(FunctionHeader header);
2929

30+
WildcardInTypeID wildcardIn(TypeID type);
31+
32+
WildcardOutTypeID wildcardOut(TypeID type);
33+
3034
TypeID resultOf(TypeID type, TypeID thrownType);
3135

3236
GenericMapTypeBuilder withGeneric(TypeParameter... parameters);

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,16 @@ public TypeID resultOf(TypeID type, TypeID thrownType) {
6060
return DefinitionTypeID.create(ResultTypeSymbol.INSTANCE, type, thrownType);
6161
}
6262

63+
@Override
64+
public WildcardInTypeID wildcardIn(TypeID type) {
65+
return new WildcardInTypeID(type);
66+
}
67+
68+
@Override
69+
public WildcardOutTypeID wildcardOut(TypeID type) {
70+
return new WildcardOutTypeID(type);
71+
}
72+
6373
@Override
6474
public GenericMapTypeBuilder withGeneric(TypeParameter... parameters) {
6575
return new Generic() {

CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/InferenceBlockingTypeParameterVisitor.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,16 @@ public Boolean visitOptional(OptionalTypeID type) {
250250
return blocking;
251251
}
252252

253+
@Override
254+
public Boolean visitWildcardIn(WildcardInTypeID type) {
255+
return true;
256+
}
257+
258+
@Override
259+
public Boolean visitWildcardOut(WildcardOutTypeID type) {
260+
return true; // TODO: or should we allow it to infer to be the lower bound?
261+
}
262+
253263
@Override
254264
public Boolean visitInvalid(InvalidTypeID type) {
255265
Optional<Boolean> knownResult = getKnownResult(type);

CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/TypeMatcher.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,26 @@ public Boolean visitOptional(Matching context, OptionalTypeID type) {
143143
}
144144
}
145145

146+
@Override
147+
public Boolean visitWildcardIn(Matching context, WildcardInTypeID type) throws RuntimeException {
148+
if (context.type instanceof WildcardInTypeID) {
149+
WildcardInTypeID wildcardIn = (WildcardInTypeID) context.type;
150+
return match(context, wildcardIn.upperBound, type.upperBound);
151+
} else {
152+
return false;
153+
}
154+
}
155+
156+
@Override
157+
public Boolean visitWildcardOut(Matching context, WildcardOutTypeID type) throws RuntimeException {
158+
if (context.type instanceof WildcardOutTypeID) {
159+
WildcardOutTypeID wildcardOut = (WildcardOutTypeID) context.type;
160+
return match(context, wildcardOut.lowerBound, type.lowerBound);
161+
} else {
162+
return false;
163+
}
164+
}
165+
146166
private boolean match(Matching context, TypeID type, TypeID pattern) {
147167
return pattern.accept(context.withType(type), this);
148168
}

CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/TypeVisitor.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ public interface TypeVisitor<T> {
2121

2222
T visitOptional(OptionalTypeID type);
2323

24+
T visitWildcardIn(WildcardInTypeID type);
25+
26+
T visitWildcardOut(WildcardOutTypeID type);
27+
2428
default T visitInvalid(InvalidTypeID type) {
2529
throw new UnsupportedOperationException("Invalid type @ " + type.position + ": " + type.error.description);
2630
}

CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/TypeVisitorWithContext.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ public interface TypeVisitorWithContext<C, R, E extends Exception> {
2121

2222
R visitOptional(C context, OptionalTypeID type) throws E;
2323

24+
R visitWildcardIn(C context, WildcardInTypeID type) throws E;
25+
26+
R visitWildcardOut(C context, WildcardOutTypeID type) throws E;
27+
2428
default R visitInvalid(C context, InvalidTypeID type) throws E {
2529
throw new RuntimeException("Invalid type: " + type.error.description);
2630
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package org.openzen.zenscript.codemodel.type;
2+
3+
import org.openzen.zenscript.codemodel.GenericMapper;
4+
import org.openzen.zenscript.codemodel.compilation.ResolvingType;
5+
import org.openzen.zenscript.codemodel.generic.TypeParameter;
6+
import org.openzen.zenscript.codemodel.type.member.MemberSet;
7+
8+
import java.util.List;
9+
10+
public class WildcardInTypeID implements TypeID {
11+
public final TypeID upperBound;
12+
13+
public WildcardInTypeID(TypeID upperBound) {
14+
this.upperBound = upperBound;
15+
}
16+
17+
@Override
18+
public TypeID instance(GenericMapper mapper) {
19+
TypeID mappedUpperBound = upperBound.instance(mapper);
20+
return mappedUpperBound == upperBound ? this : new WildcardInTypeID(mappedUpperBound);
21+
}
22+
23+
@Override
24+
public boolean hasDefaultValue() {
25+
return false;
26+
}
27+
28+
@Override
29+
public void extractTypeParameters(List<TypeParameter> typeParameters) {
30+
upperBound.extractTypeParameters(typeParameters);
31+
}
32+
33+
@Override
34+
public <R> R accept(TypeVisitor<R> visitor) {
35+
return visitor.visitWildcardIn(this);
36+
}
37+
38+
@Override
39+
public <C, R, E extends Exception> R accept(C context, TypeVisitorWithContext<C, R, E> visitor) throws E {
40+
return visitor.visitWildcardIn(context, this);
41+
}
42+
43+
@Override
44+
public boolean isValueType() {
45+
return false;
46+
}
47+
48+
@Override
49+
public ResolvingType resolve() {
50+
// No members to inherit, since there is no lower bound...
51+
return MemberSet.create(this).build();
52+
}
53+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package org.openzen.zenscript.codemodel.type;
2+
3+
import org.openzen.zenscript.codemodel.GenericMapper;
4+
import org.openzen.zenscript.codemodel.compilation.ResolvingType;
5+
import org.openzen.zenscript.codemodel.generic.TypeParameter;
6+
import org.openzen.zenscript.codemodel.type.member.MemberSet;
7+
8+
import java.util.List;
9+
10+
public class WildcardOutTypeID implements TypeID {
11+
public final TypeID lowerBound;
12+
13+
public WildcardOutTypeID(TypeID lowerBound) {
14+
this.lowerBound = lowerBound;
15+
}
16+
17+
@Override
18+
public TypeID instance(GenericMapper mapper) {
19+
TypeID mappedLowerBound = lowerBound.instance(mapper);
20+
return mappedLowerBound == lowerBound ? this : new WildcardOutTypeID(mappedLowerBound);
21+
}
22+
23+
@Override
24+
public boolean hasDefaultValue() {
25+
return false;
26+
}
27+
28+
@Override
29+
public void extractTypeParameters(List<TypeParameter> typeParameters) {
30+
lowerBound.extractTypeParameters(typeParameters);
31+
}
32+
33+
@Override
34+
public <R> R accept(TypeVisitor<R> visitor) {
35+
return visitor.visitWildcardOut(this);
36+
}
37+
38+
@Override
39+
public <C, R, E extends Exception> R accept(C context, TypeVisitorWithContext<C, R, E> visitor) throws E {
40+
return visitor.visitWildcardOut(context, this);
41+
}
42+
43+
@Override
44+
public boolean isValueType() {
45+
return false;
46+
}
47+
48+
@Override
49+
public ResolvingType resolve() {
50+
// No members to inherit, since there is no lower bound...
51+
return MemberSet.create(this).build();
52+
}
53+
}

JavaIntegration/src/main/java/org/openzen/zencode/java/module/JavaNativeTypeMembers.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,6 @@ public Optional<StaticCallable> findSuffixConstructor(String suffix) {
6666
@Override
6767
public Optional<InstanceCallableMethod> findCaster(TypeID toType) {
6868
return template.getMethod(MethodID.caster(toType)).stream().findFirst().map(c -> mapper.map(type, c));
69-
7069
}
7170

7271
@Override

Parser/src/main/java/org/openzen/zenscript/lexer/ZSTokenType.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ public enum ZSTokenType implements TokenType {
140140
K_DEFAULT(true, "default"),
141141

142142
K_IN(true, "in"),
143+
K_OUT(true, "out"),
143144
K_IS(true, "is"),
144145
K_AS(true, "as"),
145146
K_MATCH(true, "match"),

0 commit comments

Comments
 (0)