Browse Source

Merge remote-tracking branch 'Stan/development' into development

kindlich 6 years ago
parent
commit
c9fa89cd2c
No known key found for this signature in database
100 changed files with 1148 additions and 159 deletions
  1. 2
    2
      CodeFormatter/src/main/java/org/openzen/zenscript/formatter/DefinitionFormatter.java
  2. 12
    9
      CodeFormatter/src/main/java/org/openzen/zenscript/formatter/TypeFormatter.java
  3. 47
    25
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/FunctionHeader.java
  4. 8
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/FunctionParameter.java
  5. 40
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/GenericMapper.java
  6. 66
    2
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/HighLevelDefinition.java
  7. 7
    21
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/AnnotationProcessor.java
  8. 83
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/CompilingPackage.java
  9. 34
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/CompilingType.java
  10. 61
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/FileResolutionContext.java
  11. 65
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/LocalTypeResolutionContext.java
  12. 75
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/ModuleTypeResolutionContext.java
  13. 27
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/TypeResolutionContext.java
  14. 15
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/definition/AliasDefinition.java
  15. 1
    4
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/definition/ClassDefinition.java
  16. 2
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/definition/FunctionDefinition.java
  17. 6
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/definition/InterfaceDefinition.java
  18. 10
    17
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/definition/ZSPackage.java
  19. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/AndAndExpression.java
  20. 9
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ArrayExpression.java
  21. 13
    3
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CallExpression.java
  22. 13
    3
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CallStaticExpression.java
  23. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CapturedClosureExpression.java
  24. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CapturedDirectExpression.java
  25. 4
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CapturedExpression.java
  26. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CapturedLocalVariableExpression.java
  27. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CapturedParameterExpression.java
  28. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CapturedThisExpression.java
  29. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CastExpression.java
  30. 7
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CheckNullExpression.java
  31. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CoalesceExpression.java
  32. 6
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CompareExpression.java
  33. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConditionalExpression.java
  34. 7
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstExpression.java
  35. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantBoolExpression.java
  36. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantByteExpression.java
  37. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantCharExpression.java
  38. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantDoubleExpression.java
  39. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantFloatExpression.java
  40. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantIntExpression.java
  41. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantLongExpression.java
  42. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantSByteExpression.java
  43. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantShortExpression.java
  44. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantStringExpression.java
  45. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantUIntExpression.java
  46. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantULongExpression.java
  47. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantUShortExpression.java
  48. 9
    4
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstructorSuperCallExpression.java
  49. 12
    4
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstructorThisCallExpression.java
  50. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/DummyExpression.java
  51. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/EnumConstantExpression.java
  52. 7
    5
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/Expression.java
  53. 1
    2
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ExpressionBuilder.java
  54. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/FunctionExpression.java
  55. 6
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/GetFieldExpression.java
  56. 5
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/GetFunctionParameterExpression.java
  57. 5
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/GetLocalVariableExpression.java
  58. 8
    2
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/GetStaticFieldExpression.java
  59. 7
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/GetterExpression.java
  60. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/GlobalCallExpression.java
  61. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/GlobalExpression.java
  62. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/InterfaceCastExpression.java
  63. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/IsExpression.java
  64. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/MakeConstExpression.java
  65. 14
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/MapExpression.java
  66. 13
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/MatchExpression.java
  67. 10
    10
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/NewExpression.java
  68. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/NullExpression.java
  69. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/OrOrExpression.java
  70. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/PanicExpression.java
  71. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/PostCallExpression.java
  72. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/RangeExpression.java
  73. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/SameObjectExpression.java
  74. 7
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/SetFieldExpression.java
  75. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/SetFunctionParameterExpression.java
  76. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/SetLocalVariableExpression.java
  77. 7
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/SetStaticFieldExpression.java
  78. 7
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/SetterExpression.java
  79. 7
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/StaticGetterExpression.java
  80. 7
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/StaticSetterExpression.java
  81. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/SupertypeCastExpression.java
  82. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ThisExpression.java
  83. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ThrowExpression.java
  84. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/TryConvertExpression.java
  85. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/TryRethrowAsExceptionExpression.java
  86. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/TryRethrowAsResultExpression.java
  87. 8
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/VariantValueExpression.java
  88. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/WrapOptionalExpression.java
  89. 1
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/CallerMember.java
  90. 9
    2
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/CasterMember.java
  91. 10
    5
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ConstMember.java
  92. 19
    3
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/CustomIteratorMember.java
  93. 4
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/DefinitionMember.java
  94. 20
    17
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/FieldMember.java
  95. 2
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/FunctionalKind.java
  96. 11
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/FunctionalMember.java
  97. 8
    4
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/GetterMember.java
  98. 3
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/IDefinitionMember.java
  99. 31
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/IPropertyMember.java
  100. 0
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ImplementationMember.java

+ 2
- 2
CodeFormatter/src/main/java/org/openzen/zenscript/formatter/DefinitionFormatter.java View File

@@ -42,9 +42,9 @@ public class DefinitionFormatter implements DefinitionVisitor<Void> {
42 42
 		output.append(definition.name);
43 43
 		FormattingUtils.formatTypeParameters(output, definition.genericParameters, typeFormatter);
44 44
 		output.append(" ");
45
-		if (definition.superType != null) {
45
+		if (definition.getSuperType() != null) {
46 46
 			output.append("extends ");
47
-			output.append(definition.superType.accept(typeFormatter));
47
+			output.append(definition.getSuperType().accept(typeFormatter));
48 48
 			output.append(" ");
49 49
 		}
50 50
 		if (settings.classBracketOnSameLine) {

+ 12
- 9
CodeFormatter/src/main/java/org/openzen/zenscript/formatter/TypeFormatter.java View File

@@ -13,7 +13,7 @@ import org.openzen.zenscript.codemodel.generic.TypeParameter;
13 13
 import org.openzen.zenscript.codemodel.type.ArrayTypeID;
14 14
 import org.openzen.zenscript.codemodel.type.AssocTypeID;
15 15
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
16
-import org.openzen.zenscript.codemodel.type.ConstTypeID;
16
+import org.openzen.zenscript.codemodel.type.ModifiedTypeID;
17 17
 import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
18 18
 import org.openzen.zenscript.codemodel.type.FunctionTypeID;
19 19
 import org.openzen.zenscript.codemodel.type.GenericMapTypeID;
@@ -21,7 +21,6 @@ import org.openzen.zenscript.codemodel.type.GenericTypeID;
21 21
 import org.openzen.zenscript.codemodel.type.ITypeID;
22 22
 import org.openzen.zenscript.codemodel.type.ITypeVisitor;
23 23
 import org.openzen.zenscript.codemodel.type.IteratorTypeID;
24
-import org.openzen.zenscript.codemodel.type.OptionalTypeID;
25 24
 import org.openzen.zenscript.codemodel.type.RangeTypeID;
26 25
 import stdlib.Chars;
27 26
 
@@ -102,13 +101,17 @@ public class TypeFormatter implements ITypeVisitor<String>, GenericParameterBoun
102 101
 	}
103 102
 
104 103
 	@Override
105
-	public String visitConst(ConstTypeID type) {
106
-		return "const " + type.accept(this);
107
-	}
108
-
109
-	@Override
110
-	public String visitOptional(OptionalTypeID optional) {
111
-		return optional.baseType.accept(this) + "?";
104
+	public String visitModified(ModifiedTypeID type) {
105
+		StringBuilder result = new StringBuilder();
106
+		if (type.isConst())
107
+			result.append("const ");
108
+		if (type.isImmutable())
109
+			result.append("immutable ");
110
+		result.append(type.accept(this));
111
+		if (type.isOptional())
112
+			result.append("?");
113
+		
114
+		return result.toString();
112 115
 	}
113 116
 
114 117
 	@Override

+ 47
- 25
CodeModel/src/main/java/org/openzen/zenscript/codemodel/FunctionHeader.java View File

@@ -17,7 +17,6 @@ import org.openzen.zenscript.codemodel.type.BasicTypeID;
17 17
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
18 18
 import org.openzen.zenscript.codemodel.type.ITypeID;
19 19
 import org.openzen.zenscript.codemodel.scope.TypeScope;
20
-import org.openzen.zenscript.codemodel.type.GenericTypeID;
21 20
 import org.openzen.zenscript.codemodel.type.member.LocalMemberCache;
22 21
 
23 22
 /**
@@ -28,7 +27,7 @@ public class FunctionHeader {
28 27
 	private static final FunctionParameter[] NO_PARAMETERS = new FunctionParameter[0];
29 28
 	
30 29
 	public final TypeParameter[] typeParameters;
31
-	public final ITypeID returnType;
30
+	public ITypeID returnType;
32 31
 	public final FunctionParameter[] parameters;
33 32
 	public final ITypeID thrownType;
34 33
 	
@@ -64,7 +63,7 @@ public class FunctionHeader {
64 63
 		
65 64
 		minParameters = parameterTypes.length;
66 65
 		maxParameters = parameterTypes.length;
67
-		hasUnknowns = hasUnknowns(parameterTypes);
66
+		hasUnknowns = hasUnknowns(parameterTypes, returnType);
68 67
 	}
69 68
 	
70 69
 	public FunctionHeader(ITypeID returnType, FunctionParameter... parameters) {
@@ -78,7 +77,7 @@ public class FunctionHeader {
78 77
 		
79 78
 		minParameters = getMinParameters(parameters);
80 79
 		maxParameters = getMaxParameters(parameters);
81
-		hasUnknowns = hasUnknowns(parameters);
80
+		hasUnknowns = hasUnknowns(parameters, returnType);
82 81
 	}
83 82
 	
84 83
 	public FunctionHeader(TypeParameter[] genericParameters, ITypeID returnType, ITypeID thrownType, FunctionParameter... parameters) {
@@ -94,7 +93,27 @@ public class FunctionHeader {
94 93
 		
95 94
 		minParameters = getMinParameters(parameters);
96 95
 		maxParameters = getMaxParameters(parameters);
97
-		hasUnknowns = hasUnknowns(parameters);
96
+		hasUnknowns = hasUnknowns(parameters, returnType);
97
+	}
98
+	
99
+	public boolean isDenormalized() {
100
+		if (returnType.getNormalized() != returnType)
101
+			return true;
102
+		for (FunctionParameter parameter : parameters)
103
+			if (parameter.type.getNormalized() != parameter.type)
104
+				return true;
105
+		
106
+		return false;
107
+	}
108
+	
109
+	public FunctionHeader normalize(GlobalTypeRegistry registry) {
110
+		if (!isDenormalized())
111
+			return this;
112
+		
113
+		FunctionParameter[] normalizedParameters = new FunctionParameter[parameters.length];
114
+		for (int i = 0; i < normalizedParameters.length; i++)
115
+			normalizedParameters[i] = parameters[i].normalized(registry);
116
+		return new FunctionHeader(typeParameters, returnType.getNormalized(), thrownType == null ? null : thrownType.getNormalized(), normalizedParameters);
98 117
 	}
99 118
 	
100 119
 	public int getNumberOfTypeParameters() {
@@ -107,31 +126,20 @@ public class FunctionHeader {
107 126
 	
108 127
 	public FunctionHeader inferFromOverride(GlobalTypeRegistry registry, FunctionHeader overridden) {
109 128
 		TypeParameter[] resultTypeParameters = typeParameters;
110
-		GenericMapper mapper;
111
-		if (resultTypeParameters == TypeParameter.NONE) {
112
-			resultTypeParameters = overridden.typeParameters;
113
-			mapper = new GenericMapper(registry, Collections.emptyMap());
114
-		} else {
115
-			Map<TypeParameter, ITypeID> mapping = new HashMap<>();
116
-			for (int i = 0; i < overridden.typeParameters.length; i++)
117
-				mapping.put(overridden.typeParameters[i], new GenericTypeID(typeParameters[i]));
118
-			mapper = new GenericMapper(registry, mapping);
119
-		}
120
-		
121 129
 		ITypeID resultReturnType = this.returnType;
122 130
 		if (resultReturnType == BasicTypeID.UNDETERMINED)
123
-			resultReturnType = overridden.returnType.instance(mapper);
131
+			resultReturnType = overridden.returnType;
124 132
 		
125 133
 		ITypeID resultThrownType = this.thrownType;
126 134
 		if (resultThrownType == null && overridden.thrownType != null)
127
-			resultThrownType = overridden.thrownType.instance(mapper);
135
+			resultThrownType = overridden.thrownType;
128 136
 		
129 137
 		FunctionParameter[] resultParameters = Arrays.copyOf(parameters, parameters.length);
130 138
 		for (int i = 0; i < resultParameters.length; i++) {
131 139
 			if (resultParameters[i].type == BasicTypeID.UNDETERMINED) {
132 140
 				FunctionParameter parameter = resultParameters[i];
133 141
 				FunctionParameter original = overridden.parameters[i];
134
-				resultParameters[i] = new FunctionParameter(original.type.instance(mapper), parameter.name, parameter.defaultValue, original.variadic);
142
+				resultParameters[i] = new FunctionParameter(original.type, parameter.name, parameter.defaultValue, original.variadic);
135 143
 			}
136 144
 		}
137 145
 		
@@ -142,7 +150,7 @@ public class FunctionHeader {
142 150
 		if (arguments.arguments.length < minParameters || arguments.arguments.length > maxParameters)
143 151
 			return false;
144 152
 		
145
-		FunctionHeader header = fillGenericArguments(scope.getTypeRegistry(), arguments.typeArguments);
153
+		FunctionHeader header = fillGenericArguments(scope.getTypeRegistry(), arguments.typeArguments, scope.getLocalTypeParameters());
146 154
 		for (int i = 0; i < header.parameters.length; i++) {
147 155
 			if (arguments.arguments[i].type != header.parameters[i].type)
148 156
 				return false;
@@ -155,7 +163,7 @@ public class FunctionHeader {
155 163
 		if (arguments.arguments.length < minParameters || arguments.arguments.length > maxParameters)
156 164
 			return false;
157 165
 		
158
-		FunctionHeader header = fillGenericArguments(scope.getTypeRegistry(), arguments.typeArguments);
166
+		FunctionHeader header = fillGenericArguments(scope.getTypeRegistry(), arguments.typeArguments, scope.getLocalTypeParameters());
159 167
 		for (int i = 0; i < header.parameters.length; i++) {
160 168
 			if (!scope.getTypeMembers(arguments.arguments[i].type).canCastImplicit(header.parameters[i].type))
161 169
 				return false;
@@ -312,6 +320,14 @@ public class FunctionHeader {
312 320
 	}
313 321
 	
314 322
 	public FunctionHeader withGenericArguments(GenericMapper mapper) {
323
+		if (typeParameters.length > 0) {
324
+			Map<TypeParameter, ITypeID> innerMap = new HashMap<>();
325
+			for (TypeParameter parameter : typeParameters)
326
+				innerMap.put(parameter, mapper.registry.getGeneric(parameter));
327
+			
328
+			mapper = mapper.getInner(innerMap);
329
+		}
330
+		
315 331
 		ITypeID returnType = this.returnType.instance(mapper);
316 332
 		FunctionParameter[] parameters = new FunctionParameter[this.parameters.length];
317 333
 		for (int i = 0; i < parameters.length; i++) {
@@ -320,14 +336,14 @@ public class FunctionHeader {
320 336
 		return new FunctionHeader(typeParameters, returnType, thrownType == null ? null : thrownType.instance(mapper), parameters);
321 337
 	}
322 338
 	
323
-	public FunctionHeader fillGenericArguments(GlobalTypeRegistry registry, ITypeID[] arguments) {
339
+	public FunctionHeader fillGenericArguments(GlobalTypeRegistry registry, ITypeID[] arguments, GenericMapper typeParameterMapping) {
324 340
 		if (arguments == null || arguments.length == 0)
325 341
 			return this;
326 342
 		
327 343
 		Map<TypeParameter, ITypeID> typeArguments = new HashMap<>();
328 344
 		for (int i = 0; i < typeParameters.length; i++)
329 345
 			typeArguments.put(typeParameters[i], arguments[i]);
330
-		GenericMapper mapper = new GenericMapper(registry, typeArguments);
346
+		GenericMapper mapper = typeParameterMapping.getInner(typeArguments);
331 347
 		
332 348
 		ITypeID returnType = this.returnType.instance(mapper);
333 349
 		FunctionParameter[] parameters = new FunctionParameter[this.parameters.length];
@@ -411,7 +427,10 @@ public class FunctionHeader {
411 427
 		return parameters[parameters.length - 1].variadic ? Integer.MAX_VALUE : parameters.length;
412 428
 	}
413 429
 	
414
-	private static boolean hasUnknowns(ITypeID[] types) {
430
+	private static boolean hasUnknowns(ITypeID[] types, ITypeID returnType) {
431
+		if (returnType == BasicTypeID.UNDETERMINED)
432
+			return true;
433
+		
415 434
 		for (ITypeID type : types)
416 435
 			if (type == BasicTypeID.UNDETERMINED)
417 436
 				return true;
@@ -419,7 +438,10 @@ public class FunctionHeader {
419 438
 		return false;
420 439
 	}
421 440
 	
422
-	private static boolean hasUnknowns(FunctionParameter[] parameters) {
441
+	private static boolean hasUnknowns(FunctionParameter[] parameters, ITypeID returnType) {
442
+		if (returnType == BasicTypeID.UNDETERMINED)
443
+			return true;
444
+		
423 445
 		for (FunctionParameter parameter : parameters)
424 446
 			if (parameter.type == BasicTypeID.UNDETERMINED)
425 447
 				return true;

+ 8
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/FunctionParameter.java View File

@@ -9,6 +9,7 @@ import org.openzen.zenscript.codemodel.annotations.Annotation;
9 9
 import java.util.Objects;
10 10
 import org.openzen.zencode.shared.Taggable;
11 11
 import org.openzen.zenscript.codemodel.expression.Expression;
12
+import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
12 13
 import org.openzen.zenscript.codemodel.type.ITypeID;
13 14
 
14 15
 /**
@@ -21,7 +22,7 @@ public class FunctionParameter extends Taggable {
21 22
 	public Annotation[] annotations;
22 23
 	public final ITypeID type;
23 24
 	public final String name;
24
-	public final Expression defaultValue;
25
+	public Expression defaultValue;
25 26
 	public final boolean variadic;
26 27
 	
27 28
 	public FunctionParameter(ITypeID type) {
@@ -48,6 +49,12 @@ public class FunctionParameter extends Taggable {
48 49
 		this.variadic = variadic;
49 50
 	}
50 51
 	
52
+	public FunctionParameter normalized(GlobalTypeRegistry registry) {
53
+		FunctionParameter result = new FunctionParameter(type.getNormalized(), name, defaultValue, variadic);
54
+		result.annotations = this.annotations;
55
+		return result;
56
+	}
57
+	
51 58
 	public FunctionParameter withGenericArguments(GenericMapper mapper) {
52 59
 		ITypeID instanced = type.instance(mapper);
53 60
 		if (instanced == type)

+ 40
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/GenericMapper.java View File

@@ -5,6 +5,8 @@
5 5
  */
6 6
 package org.openzen.zenscript.codemodel;
7 7
 
8
+import java.util.Collections;
9
+import java.util.HashMap;
8 10
 import java.util.Map;
9 11
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
10 12
 import org.openzen.zenscript.codemodel.type.GenericTypeID;
@@ -16,6 +18,8 @@ import org.openzen.zenscript.codemodel.type.ITypeID;
16 18
  * @author Hoofdgebruiker
17 19
  */
18 20
 public class GenericMapper {
21
+	public static final GenericMapper EMPTY = new GenericMapper(null, Collections.emptyMap());
22
+	
19 23
 	public final GlobalTypeRegistry registry;
20 24
 	private final Map<TypeParameter, ITypeID> mapping;
21 25
 	
@@ -43,10 +47,46 @@ public class GenericMapper {
43 47
 	}
44 48
 	
45 49
 	public ITypeID map(GenericTypeID type) {
50
+		if (!mapping.containsKey(type.parameter))
51
+			throw new IllegalStateException("No mapping found for type " + type);
52
+		
46 53
 		return mapping.containsKey(type.parameter) ? mapping.get(type.parameter) : type;
47 54
 	}
48 55
 	
49 56
 	public FunctionHeader map(FunctionHeader original) {
50 57
 		return mapping.isEmpty() ? original : original.withGenericArguments(this);
51 58
 	}
59
+	
60
+	public GenericMapper getInner(Map<TypeParameter, ITypeID> mapping) {
61
+		Map<TypeParameter, ITypeID> resultMap = new HashMap<>(this.mapping);
62
+		resultMap.putAll(mapping);
63
+		return new GenericMapper(registry, resultMap);
64
+	}
65
+	
66
+	public GenericMapper getInner(GlobalTypeRegistry registry, TypeParameter[] parameters) {
67
+		Map<TypeParameter, ITypeID> resultMap = new HashMap<>(this.mapping);
68
+		for (TypeParameter parameter : parameters)
69
+			resultMap.put(parameter, registry.getGeneric(parameter));
70
+		return new GenericMapper(registry, resultMap);
71
+	}
72
+	
73
+	@Override
74
+	public String toString() {
75
+		if (mapping.isEmpty())
76
+			return "{}";
77
+		
78
+		StringBuilder result = new StringBuilder();
79
+		result.append('{');
80
+		boolean first = true;
81
+		for (Map.Entry<TypeParameter, ITypeID> entry : mapping.entrySet()) {
82
+			if (first) {
83
+				first = false;
84
+			} else {
85
+				result.append(", ");
86
+			}
87
+			result.append(entry.getKey().toString()).append(": ").append(entry.getValue());
88
+		}
89
+		result.append('}');
90
+		return result.toString();
91
+	}
52 92
 }

+ 66
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/HighLevelDefinition.java View File

@@ -10,12 +10,18 @@ import java.util.List;
10 10
 import org.openzen.zencode.shared.CodePosition;
11 11
 import org.openzen.zencode.shared.Taggable;
12 12
 import org.openzen.zenscript.codemodel.annotations.DefinitionAnnotation;
13
+import org.openzen.zenscript.codemodel.definition.AliasDefinition;
13 14
 import org.openzen.zenscript.codemodel.definition.DefinitionVisitor;
15
+import org.openzen.zenscript.codemodel.definition.InterfaceDefinition;
14 16
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
15 17
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
16 18
 import org.openzen.zenscript.codemodel.member.ConstructorMember;
19
+import org.openzen.zenscript.codemodel.member.DestructorMember;
17 20
 import org.openzen.zenscript.codemodel.member.FieldMember;
18 21
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
22
+import org.openzen.zenscript.codemodel.member.ImplementationMember;
23
+import org.openzen.zenscript.codemodel.member.InnerDefinitionMember;
24
+import org.openzen.zenscript.codemodel.scope.TypeScope;
19 25
 import org.openzen.zenscript.codemodel.type.ITypeID;
20 26
 
21 27
 /**
@@ -28,11 +34,13 @@ public abstract class HighLevelDefinition extends Taggable {
28 34
 	public final String name;
29 35
 	public final int modifiers;
30 36
 	public final List<IDefinitionMember> members = new ArrayList<>();
31
-	public TypeParameter[] genericParameters = null;
37
+	public TypeParameter[] genericParameters = TypeParameter.NONE;
32 38
 	public DefinitionAnnotation[] annotations = DefinitionAnnotation.NONE;
33 39
 	
34 40
 	public HighLevelDefinition outerDefinition;
35
-	public ITypeID superType;
41
+	private ITypeID superType;
42
+	
43
+	private boolean isDestructible = false;
36 44
 	
37 45
 	public HighLevelDefinition(CodePosition position, ZSPackage pkg, String name, int modifiers, HighLevelDefinition outerDefinition) {
38 46
 		this.position = position;
@@ -45,10 +53,27 @@ public abstract class HighLevelDefinition extends Taggable {
45 53
 			pkg.register(this);
46 54
 	}
47 55
 	
56
+	public HighLevelDefinition getOutermost() {
57
+		HighLevelDefinition result = this;
58
+		while (result.outerDefinition != null)
59
+			result = result.outerDefinition;
60
+		return result;
61
+	}
62
+	
48 63
 	public String getFullName() {
49 64
 		return pkg.fullName + '.' + name;
50 65
 	}
51 66
 	
67
+	public ITypeID getSuperType() {
68
+		return superType;
69
+	}
70
+	
71
+	public void setSuperType(ITypeID superType) {
72
+		this.superType = superType;
73
+		if (outerDefinition != null)
74
+			isDestructible |= outerDefinition.isDestructible;
75
+	}
76
+	
52 77
 	public int getNumberOfGenericParameters() {
53 78
 		return genericParameters == null ? 0 : genericParameters.length;
54 79
 	}
@@ -61,11 +86,32 @@ public abstract class HighLevelDefinition extends Taggable {
61 86
 		return outerDefinition != null;
62 87
 	}
63 88
 	
89
+	public boolean isInterface() {
90
+		return this instanceof InterfaceDefinition;
91
+	}
92
+	
93
+	public boolean isAlias() {
94
+		return this instanceof AliasDefinition;
95
+	}
96
+	
64 97
 	public void addMember(IDefinitionMember member) {
65 98
 		if (!members.contains(member))
66 99
 			members.add(member);
67 100
 	}
68 101
 	
102
+	public boolean isDestructible() {
103
+		boolean isDestructible = false;
104
+		for (IDefinitionMember member : members) {
105
+			if (member instanceof DestructorMember)
106
+				isDestructible = true;
107
+			if ((member instanceof FieldMember) && ((FieldMember)member).type.isDestructible())
108
+				isDestructible = true;
109
+			if ((member instanceof ImplementationMember) && ((ImplementationMember)member).type.isDestructible())
110
+				isDestructible = true;
111
+		}
112
+		return isDestructible;
113
+	}
114
+	
69 115
 	public void setTypeParameters(TypeParameter[] typeParameters) {
70 116
 		this.genericParameters = typeParameters;
71 117
 	}
@@ -94,5 +140,23 @@ public abstract class HighLevelDefinition extends Taggable {
94 140
 		return (modifiers & Modifiers.STATIC) > 0;
95 141
 	}
96 142
 	
143
+	public void normalize(TypeScope scope) {
144
+		for (IDefinitionMember member : members) {
145
+			member.normalize(scope);
146
+		}
147
+	}
148
+	
97 149
 	public abstract <T> T accept(DefinitionVisitor<T> visitor);
150
+
151
+	public HighLevelDefinition getInnerType(String name) {
152
+		for (IDefinitionMember member : members) {
153
+			if (member instanceof InnerDefinitionMember) {
154
+				InnerDefinitionMember inner = (InnerDefinitionMember)member;
155
+				if (inner.innerDefinition.name.equals(name))
156
+					return inner.innerDefinition;
157
+			}
158
+		}
159
+		
160
+		return null;
161
+	}
98 162
 }

+ 7
- 21
CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/AnnotationProcessor.java View File

@@ -11,10 +11,9 @@ import java.util.List;
11 11
 import org.openzen.zenscript.codemodel.FunctionHeader;
12 12
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
13 13
 import org.openzen.zenscript.codemodel.ModuleProcessor;
14
-import org.openzen.zenscript.codemodel.PackageDefinitions;
15 14
 import org.openzen.zenscript.codemodel.ScriptBlock;
15
+import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
16 16
 import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
17
-import org.openzen.zenscript.codemodel.definition.ZSPackage;
18 17
 import org.openzen.zenscript.codemodel.member.CallerMember;
19 18
 import org.openzen.zenscript.codemodel.member.CasterMember;
20 19
 import org.openzen.zenscript.codemodel.member.ConstMember;
@@ -33,7 +32,6 @@ import org.openzen.zenscript.codemodel.member.OperatorMember;
33 32
 import org.openzen.zenscript.codemodel.member.SetterMember;
34 33
 import org.openzen.zenscript.codemodel.member.StaticInitializerMember;
35 34
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
36
-import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
37 35
 import org.openzen.zenscript.codemodel.scope.DefinitionScope;
38 36
 import org.openzen.zenscript.codemodel.scope.FileScope;
39 37
 import org.openzen.zenscript.codemodel.scope.FunctionScope;
@@ -41,35 +39,23 @@ import org.openzen.zenscript.codemodel.scope.GlobalScriptScope;
41 39
 import org.openzen.zenscript.codemodel.scope.StatementScope;
42 40
 import org.openzen.zenscript.codemodel.statement.Statement;
43 41
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
44
-import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
45 42
 
46 43
 /**
47 44
  *
48 45
  * @author Hoofdgebruiker
49 46
  */
50 47
 public class AnnotationProcessor implements ModuleProcessor {
51
-	private final ZSPackage rootPackage;
52
-	private final PackageDefinitions packageDefinitions;
53
-	private final GlobalTypeRegistry globalRegistry;
48
+	private final TypeResolutionContext context;
54 49
 	private final List<ExpansionDefinition> expansions;
55
-	private final List<AnnotationDefinition> annotations;
56 50
 	
57
-	public AnnotationProcessor(
58
-			ZSPackage rootPackage,
59
-			PackageDefinitions packageDefinitions,
60
-			GlobalTypeRegistry globalRegistry,
61
-			List<ExpansionDefinition> expansions,
62
-			List<AnnotationDefinition> annotations) {
63
-		this.rootPackage = rootPackage;
64
-		this.packageDefinitions = packageDefinitions;
65
-		this.globalRegistry = globalRegistry;
51
+	public AnnotationProcessor(TypeResolutionContext context, List<ExpansionDefinition> expansions) {
52
+		this.context = context;
66 53
 		this.expansions = expansions;
67
-		this.annotations = annotations;
68 54
 	}
69 55
 	
70 56
 	@Override
71 57
 	public ScriptBlock process(ScriptBlock block) {
72
-		FileScope fileScope = new FileScope(rootPackage, packageDefinitions, globalRegistry, expansions, new HashMap<>(), annotations);
58
+		FileScope fileScope = new FileScope(context, expansions, new HashMap<>(), member -> {});
73 59
 		StatementScope scope = new GlobalScriptScope(fileScope);
74 60
 		List<Statement> transformed = new ArrayList<>();
75 61
 		boolean unchanged = true;
@@ -83,7 +69,7 @@ public class AnnotationProcessor implements ModuleProcessor {
83 69
 	
84 70
 	@Override
85 71
 	public void process(HighLevelDefinition definition) {
86
-		FileScope fileScope = new FileScope(rootPackage, packageDefinitions, globalRegistry, expansions, new HashMap<>(), annotations);
72
+		FileScope fileScope = new FileScope(context, expansions, new HashMap<>(), member -> {});
87 73
 		DefinitionScope scope = new DefinitionScope(fileScope, definition);
88 74
 		for (DefinitionAnnotation annotation : definition.annotations) {
89 75
 			annotation.apply(definition, scope);
@@ -164,7 +150,7 @@ public class AnnotationProcessor implements ModuleProcessor {
164 150
 
165 151
 		@Override
166 152
 		public Void visitCustomIterator(CustomIteratorMember member) {
167
-			throw new UnsupportedOperationException("Not supported yet!");
153
+			return functional(member);
168 154
 		}
169 155
 
170 156
 		@Override

+ 83
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/CompilingPackage.java View File

@@ -0,0 +1,83 @@
1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.codemodel.context;
7
+
8
+import java.util.HashMap;
9
+import java.util.List;
10
+import java.util.Map;
11
+import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
+import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
13
+import org.openzen.zenscript.codemodel.type.GenericName;
14
+import org.openzen.zenscript.codemodel.type.ITypeID;
15
+
16
+/**
17
+ *
18
+ * @author Hoofdgebruiker
19
+ */
20
+public class CompilingPackage {
21
+	private final Map<String, CompilingPackage> packages = new HashMap<>();
22
+	private final Map<String, CompilingType> types = new HashMap<>();
23
+	
24
+	public void addPackage(String name, CompilingPackage package_) {
25
+		packages.put(name, package_);
26
+	}
27
+	
28
+	public void addType(String name, CompilingType type) {
29
+		types.put(name, type);
30
+	}
31
+	
32
+	public HighLevelDefinition getImport(TypeResolutionContext context, List<String> name) {
33
+		return getImport(context, name, 0);
34
+	}
35
+	
36
+	private HighLevelDefinition getImport(TypeResolutionContext context, List<String> name, int index) {
37
+		if (packages.containsKey(name.get(index)))
38
+			return packages.get(name.get(index)).getImport(context, name, index + 1);
39
+		if (types.containsKey(name.get(index)))
40
+			return getImportType(context, types.get(name.get(index)), name, index + 1);
41
+		
42
+		return null;
43
+	}
44
+	
45
+	private HighLevelDefinition getImportType(TypeResolutionContext context, CompilingType type, List<String> name, int index) {
46
+		if (index == name.size())
47
+			return type.load(context);
48
+		
49
+		return getImportType(context, type.getInner(name.get(index)), name, index + 1);
50
+	}
51
+	
52
+	public ITypeID getType(TypeResolutionContext context, List<GenericName> name) {
53
+		return getType(context, name, 0);
54
+	}
55
+	
56
+	private ITypeID getType(TypeResolutionContext context, List<GenericName> name, int index) {
57
+		if (index == name.size())
58
+			return null;
59
+		
60
+		if (packages.containsKey(name.get(index).name))
61
+			return packages.get(name.get(index)).getType(context, name, index + 1);
62
+		
63
+		if (types.containsKey(name.get(index).name)) {
64
+			CompilingType type = types.get(name.get(index).name);
65
+			DefinitionTypeID result = context.getTypeRegistry().getForDefinition(type.load(context), name.get(index).arguments);
66
+			return getInner(context, name, index + 1, type, result);
67
+		}
68
+		
69
+		return null;
70
+	}
71
+	
72
+	private ITypeID getInner(TypeResolutionContext context, List<GenericName> name, int index, CompilingType type, DefinitionTypeID result) {
73
+		if (index == name.size())
74
+			return result;
75
+		
76
+		CompilingType innerType = type.getInner(name.get(index).name);
77
+		if (innerType == null)
78
+			return null;
79
+		
80
+		DefinitionTypeID innerResult = context.getTypeRegistry().getForDefinition(innerType.load(context), name.get(index).arguments, result);
81
+		return getInner(context, name, index + 1, innerType, innerResult);
82
+	}
83
+}

+ 34
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/CompilingType.java View File

@@ -0,0 +1,34 @@
1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.codemodel.context;
7
+
8
+import java.util.List;
9
+import org.openzen.zenscript.codemodel.HighLevelDefinition;
10
+import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
11
+import org.openzen.zenscript.codemodel.type.GenericName;
12
+
13
+/**
14
+ *
15
+ * @author Hoofdgebruiker
16
+ */
17
+public interface CompilingType {
18
+	CompilingType getInner(String name);
19
+	
20
+	HighLevelDefinition load(TypeResolutionContext context);
21
+	
22
+	default DefinitionTypeID getInnerType(TypeResolutionContext context, List<GenericName> name, int index, DefinitionTypeID outer) {
23
+		DefinitionTypeID type = context.getTypeRegistry().getForDefinition(load(context), name.get(index).arguments, outer);
24
+		index++;
25
+		if (index == name.size())
26
+			return type;
27
+		
28
+		CompilingType innerType = getInner(name.get(index).name);
29
+		if (innerType == null)
30
+			return null;
31
+		
32
+		return innerType.getInnerType(context, name, index, type);
33
+	}
34
+}

+ 61
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/FileResolutionContext.java View File

@@ -0,0 +1,61 @@
1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.codemodel.context;
7
+
8
+import java.util.HashMap;
9
+import java.util.List;
10
+import java.util.Map;
11
+import org.openzen.zencode.shared.CodePosition;
12
+import org.openzen.zenscript.codemodel.HighLevelDefinition;
13
+import org.openzen.zenscript.codemodel.annotations.AnnotationDefinition;
14
+import org.openzen.zenscript.codemodel.type.GenericName;
15
+import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
16
+import org.openzen.zenscript.codemodel.type.ITypeID;
17
+
18
+/**
19
+ *
20
+ * @author Hoofdgebruiker
21
+ */
22
+public class FileResolutionContext implements TypeResolutionContext {
23
+	private final ModuleTypeResolutionContext module;
24
+	private final Map<String, HighLevelDefinition> imports = new HashMap<>();
25
+	
26
+	public FileResolutionContext(ModuleTypeResolutionContext module) {
27
+		this.module = module;
28
+	}
29
+	
30
+	public void addImport(String name, HighLevelDefinition definition) {
31
+		imports.put(name, definition);
32
+	}
33
+
34
+	@Override
35
+	public GlobalTypeRegistry getTypeRegistry() {
36
+		return module.getTypeRegistry();
37
+	}
38
+
39
+	@Override
40
+	public AnnotationDefinition getAnnotation(String name) {
41
+		return module.getAnnotation(name);
42
+	}
43
+
44
+	@Override
45
+	public ITypeID getType(CodePosition position, List<GenericName> name) {
46
+		if (imports.containsKey(name.get(0).name)) {
47
+			return GenericName.getInnerType(
48
+					getTypeRegistry(),
49
+					getTypeRegistry().getForDefinition(imports.get(name.get(0).name), name.get(0).arguments),
50
+					name,
51
+					1);
52
+		}
53
+		
54
+		return module.getType(position, name);
55
+	}
56
+
57
+	@Override
58
+	public ITypeID getThisType() {
59
+		return null;
60
+	}
61
+}

+ 65
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/LocalTypeResolutionContext.java View File

@@ -0,0 +1,65 @@
1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.codemodel.context;
7
+
8
+import java.util.List;
9
+import org.openzen.zencode.shared.CodePosition;
10
+import org.openzen.zenscript.codemodel.annotations.AnnotationDefinition;
11
+import org.openzen.zenscript.codemodel.generic.TypeParameter;
12
+import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
13
+import org.openzen.zenscript.codemodel.type.GenericName;
14
+import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
15
+import org.openzen.zenscript.codemodel.type.ITypeID;
16
+
17
+/**
18
+ *
19
+ * @author Hoofdgebruiker
20
+ */
21
+public class LocalTypeResolutionContext implements TypeResolutionContext {
22
+	private final TypeResolutionContext outer;
23
+	private final CompilingType type;
24
+	private final TypeParameter[] parameters;
25
+	
26
+	public LocalTypeResolutionContext(TypeResolutionContext outer, CompilingType type, TypeParameter[] parameters) {
27
+		this.outer = outer;
28
+		this.type = type;
29
+		this.parameters = parameters;
30
+	}
31
+
32
+	@Override
33
+	public GlobalTypeRegistry getTypeRegistry() {
34
+		return outer.getTypeRegistry();
35
+	}
36
+
37
+	@Override
38
+	public AnnotationDefinition getAnnotation(String name) {
39
+		return outer.getAnnotation(name);
40
+	}
41
+
42
+	@Override
43
+	public ITypeID getType(CodePosition position, List<GenericName> name) {
44
+		if (type != null) {
45
+			CompilingType compiling = type.getInner(name.get(0).name);
46
+			if (compiling != null) {
47
+				DefinitionTypeID outer = getTypeRegistry().getForMyDefinition(type.load(this));
48
+				return compiling.getInnerType(this, name, 0, outer);
49
+			}
50
+		}
51
+		
52
+		if (name.size() == 1 && name.get(0).hasNoArguments()) {
53
+			for (TypeParameter parameter : parameters)
54
+				if (parameter.name.equals(name.get(0).name))
55
+					return getTypeRegistry().getGeneric(parameter);
56
+		}
57
+		
58
+		return outer.getType(position, name);
59
+	}
60
+	
61
+	@Override
62
+	public ITypeID getThisType() {
63
+		return type == null ? null : getTypeRegistry().getForMyDefinition(type.load(this));
64
+	}
65
+}

+ 75
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/ModuleTypeResolutionContext.java View File

@@ -0,0 +1,75 @@
1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.codemodel.context;
7
+
8
+import java.util.HashMap;
9
+import java.util.List;
10
+import java.util.Map;
11
+import org.openzen.zencode.shared.CodePosition;
12
+import org.openzen.zenscript.codemodel.annotations.AnnotationDefinition;
13
+import org.openzen.zenscript.codemodel.definition.ZSPackage;
14
+import org.openzen.zenscript.codemodel.type.GenericName;
15
+import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
16
+import org.openzen.zenscript.codemodel.type.ISymbol;
17
+import org.openzen.zenscript.codemodel.type.ITypeID;
18
+
19
+/**
20
+ *
21
+ * @author Hoofdgebruiker
22
+ */
23
+public class ModuleTypeResolutionContext implements TypeResolutionContext {
24
+	private final GlobalTypeRegistry registry;
25
+	private final Map<String, AnnotationDefinition> annotations = new HashMap<>();
26
+	private final Map<String, ISymbol> globals;
27
+	private final ZSPackage rootPackage;
28
+	
29
+	private final CompilingPackage rootCompiling;
30
+	
31
+	public ModuleTypeResolutionContext(
32
+			GlobalTypeRegistry registry,
33
+			AnnotationDefinition[] annotations,
34
+			ZSPackage rootPackage,
35
+			CompilingPackage rootCompiling,
36
+			Map<String, ISymbol> globals)
37
+	{
38
+		this.registry = registry;
39
+		this.rootPackage = rootPackage;
40
+		this.rootCompiling = rootCompiling;
41
+		this.globals = globals;
42
+		
43
+		for (AnnotationDefinition annotation : annotations)
44
+			this.annotations.put(annotation.getAnnotationName(), annotation);
45
+	}
46
+	
47
+	@Override
48
+	public GlobalTypeRegistry getTypeRegistry() {
49
+		return registry;
50
+	}
51
+	
52
+	@Override
53
+	public AnnotationDefinition getAnnotation(String name) {
54
+		return annotations.get(name);
55
+	}
56
+
57
+	@Override
58
+	public ITypeID getType(CodePosition position, List<GenericName> name) {
59
+		if (rootCompiling != null) {
60
+			ITypeID compiling = rootCompiling.getType(this, name);
61
+			if (compiling != null)
62
+				return compiling;
63
+		}
64
+		
65
+		if (name.size() == 1 && globals.containsKey(name.get(0).name))
66
+			return globals.get(name.get(0).name).getType(position, this, name.get(0).arguments);
67
+		
68
+		return rootPackage.getType(position, this, name);
69
+	}
70
+	
71
+	@Override
72
+	public ITypeID getThisType() {
73
+		return null;
74
+	}
75
+}

+ 27
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/TypeResolutionContext.java View File

@@ -0,0 +1,27 @@
1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.codemodel.context;
7
+
8
+import java.util.List;
9
+import org.openzen.zencode.shared.CodePosition;
10
+import org.openzen.zenscript.codemodel.annotations.AnnotationDefinition;
11
+import org.openzen.zenscript.codemodel.type.GenericName;
12
+import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
13
+import org.openzen.zenscript.codemodel.type.ITypeID;
14
+
15
+/**
16
+ *
17
+ * @author Hoofdgebruiker
18
+ */
19
+public interface TypeResolutionContext {
20
+	GlobalTypeRegistry getTypeRegistry();
21
+	
22
+	AnnotationDefinition getAnnotation(String name);
23
+	
24
+	ITypeID getType(CodePosition position, List<GenericName> name);
25
+	
26
+	ITypeID getThisType();
27
+}

+ 15
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/definition/AliasDefinition.java View File

@@ -7,6 +7,8 @@ package org.openzen.zenscript.codemodel.definition;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
10
+import org.openzen.zenscript.codemodel.Modifiers;
11
+import org.openzen.zenscript.codemodel.scope.TypeScope;
10 12
 import org.openzen.zenscript.codemodel.type.ITypeID;
11 13
 
12 14
 /**
@@ -21,11 +23,24 @@ public class AliasDefinition extends HighLevelDefinition {
21 23
 	}
22 24
 	
23 25
 	public void setType(ITypeID type) {
26
+		if (type == null)
27
+			throw new NullPointerException("type cannot be null!");
28
+		
24 29
 		this.type = type;
25 30
 	}
31
+	
32
+	@Override
33
+	public boolean isStatic() {
34
+		return true;
35
+	}
26 36
 
27 37
 	@Override
28 38
 	public <T> T accept(DefinitionVisitor<T> visitor) {
29 39
 		return visitor.visitAlias(this);
30 40
 	}
41
+
42
+	@Override
43
+	public void normalize(TypeScope scope) {
44
+		// nothing to do
45
+	}
31 46
 }

+ 1
- 4
CodeModel/src/main/java/org/openzen/zenscript/codemodel/definition/ClassDefinition.java View File

@@ -7,6 +7,7 @@ package org.openzen.zenscript.codemodel.definition;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
10
+import org.openzen.zenscript.codemodel.scope.TypeScope;
10 11
 import org.openzen.zenscript.codemodel.type.ITypeID;
11 12
 
12 13
 /**
@@ -21,10 +22,6 @@ public class ClassDefinition extends HighLevelDefinition {
21 22
 	public ClassDefinition(CodePosition position, ZSPackage pkg, String name, int modifiers, HighLevelDefinition outerDefinition) {
22 23
 		super(position, pkg, name, modifiers, outerDefinition);
23 24
 	}
24
-	
25
-	public void setSuperclass(ITypeID superclass) {
26
-		this.superType = superclass;
27
-	}
28 25
 
29 26
 	@Override
30 27
 	public <T> T accept(DefinitionVisitor<T> visitor) {

+ 2
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/definition/FunctionDefinition.java View File

@@ -7,6 +7,7 @@ package org.openzen.zenscript.codemodel.definition;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.FunctionHeader;
10
+import org.openzen.zenscript.codemodel.GenericMapper;
10 11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
11 12
 import org.openzen.zenscript.codemodel.Modifiers;
12 13
 import org.openzen.zenscript.codemodel.member.CallerMember;
@@ -38,7 +39,7 @@ public class FunctionDefinition extends HighLevelDefinition {
38 39
 	public void setHeader(FunctionHeader header) {
39 40
 		this.header = header;
40 41
 		addMember(caller = new CallerMember(position, this, modifiers | Modifiers.STATIC, header, null));
41
-		callerGroup.addMethod(new FunctionalMemberRef(caller, caller.header), TypeMemberPriority.SPECIFIED);
42
+		callerGroup.addMethod(new FunctionalMemberRef(caller, GenericMapper.EMPTY), TypeMemberPriority.SPECIFIED);
42 43
 	}
43 44
 	
44 45
 	public void setCode(Statement statement) {

+ 6
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/definition/InterfaceDefinition.java View File

@@ -16,7 +16,7 @@ import org.openzen.zenscript.codemodel.type.ITypeID;
16 16
  * @author Hoofdgebruiker
17 17
  */
18 18
 public class InterfaceDefinition extends HighLevelDefinition {
19
-	private final List<ITypeID> baseInterfaces = new ArrayList<>();
19
+	public final List<ITypeID> baseInterfaces = new ArrayList<>();
20 20
 	
21 21
 	public InterfaceDefinition(CodePosition position, ZSPackage pkg, String name, int modifiers, HighLevelDefinition outerDefinition) {
22 22
 		super(position, pkg, name, modifiers, outerDefinition);
@@ -25,6 +25,11 @@ public class InterfaceDefinition extends HighLevelDefinition {
25 25
 	public void addBaseInterface(ITypeID baseInterface) {
26 26
 		baseInterfaces.add(baseInterface);
27 27
 	}
28
+	
29
+	@Override
30
+	public boolean isStatic() {
31
+		return true;
32
+	}
28 33
 
29 34
 	@Override
30 35
 	public <T> T accept(DefinitionVisitor<T> visitor) {

+ 10
- 17
CodeModel/src/main/java/org/openzen/zenscript/codemodel/definition/ZSPackage.java View File

@@ -12,13 +12,14 @@ import org.openzen.zencode.shared.CodePosition;
12 12
 import org.openzen.zencode.shared.CompileException;
13 13
 import org.openzen.zencode.shared.CompileExceptionCode;
14 14
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
15
+import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
15 16
 import org.openzen.zenscript.codemodel.partial.IPartialExpression;
16 17
 import org.openzen.zenscript.codemodel.partial.PartialPackageExpression;
17 18
 import org.openzen.zenscript.codemodel.partial.PartialTypeExpression;
19
+import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
18 20
 import org.openzen.zenscript.codemodel.type.GenericName;
19 21
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
20 22
 import org.openzen.zenscript.codemodel.type.ITypeID;
21
-import org.openzen.zenscript.codemodel.scope.TypeScope;
22 23
 
23 24
 /**
24 25
  *
@@ -80,37 +81,29 @@ public class ZSPackage {
80 81
 		return null;
81 82
 	}
82 83
 	
83
-	public ITypeID getType(CodePosition position, TypeScope scope, List<GenericName> nameParts) {
84
-		return getType(position, scope, nameParts, 0);
84
+	public ITypeID getType(CodePosition position, TypeResolutionContext context, List<GenericName> nameParts) {
85
+		return getType(position, context, nameParts, 0);
85 86
 	}
86 87
 	
87
-	public ITypeID getType(CodePosition position, TypeScope scope, GenericName name) {
88
+	public ITypeID getType(CodePosition position, TypeResolutionContext context, GenericName name) {
88 89
 		if (types.containsKey(name.name)) {
89
-			return scope.getTypeRegistry().getForDefinition(types.get(name.name), name.arguments);
90
+			return context.getTypeRegistry().getForDefinition(types.get(name.name), name.arguments);
90 91
 		}
91 92
 		
92 93
 		return null;
93 94
 	}
94 95
 	
95
-	private ITypeID getType(CodePosition position, TypeScope scope, List<GenericName> nameParts, int depth) {
96
+	private ITypeID getType(CodePosition position, TypeResolutionContext context, List<GenericName> nameParts, int depth) {
96 97
 		if (depth >= nameParts.size())
97 98
 			return null;
98 99
 		
99 100
 		GenericName name = nameParts.get(depth);
100 101
 		if (subPackages.containsKey(name.name) && name.hasNoArguments())
101
-			return subPackages.get(name.name).getType(position, scope, nameParts, depth + 1);
102
+			return subPackages.get(name.name).getType(position, context, nameParts, depth + 1);
102 103
 		
103 104
 		if (types.containsKey(name.name)) {
104
-			ITypeID type = scope.getTypeRegistry().getForDefinition(types.get(name.name), name.arguments);
105
-			depth++;
106
-			while (depth < nameParts.size()) {
107
-				GenericName innerName = nameParts.get(depth++);
108
-				type = scope.getTypeMembers(type).getInnerType(position, innerName);
109
-				if (type == null)
110
-					return null;
111
-			}
112
-			
113
-			return type;
105
+			DefinitionTypeID type = context.getTypeRegistry().getForDefinition(types.get(name.name), name.arguments);
106
+			return GenericName.getInnerType(context.getTypeRegistry(), type, nameParts, depth + 1);
114 107
 		}
115 108
 		
116 109
 		return null;

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/AndAndExpression.java View File

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9 10
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10 11
 
11 12
 /**
@@ -36,4 +37,9 @@ public class AndAndExpression extends Expression {
36 37
 				? this
37 38
 				: new AndAndExpression(position, tLeft, tRight);
38 39
 	}
40
+
41
+	@Override
42
+	public Expression normalize(TypeScope scope) {
43
+		return new AndAndExpression(position, left.normalize(scope), right.normalize(scope));
44
+	}
39 45
 }

+ 9
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ArrayExpression.java View File

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9 10
 import org.openzen.zenscript.codemodel.type.ArrayTypeID;
10 11
 
11 12
 /**
@@ -33,4 +34,12 @@ public class ArrayExpression extends Expression {
33 34
 		Expression[] tExpressions = Expression.transform(expressions, transformer);
34 35
 		return tExpressions == expressions ? this : new ArrayExpression(position, tExpressions, (ArrayTypeID)type);
35 36
 	}
37
+
38
+	@Override
39
+	public Expression normalize(TypeScope scope) {
40
+		Expression[] normalized = new Expression[expressions.length];
41
+		for (int i = 0; i < normalized.length; i++)
42
+			normalized[i] = expressions[i].normalize(scope);
43
+		return new ArrayExpression(position, normalized, arrayType.getNormalized());
44
+	}
36 45
 }

+ 13
- 3
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CallExpression.java View File

@@ -20,12 +20,12 @@ public class CallExpression extends Expression {
20 20
 	public final CallArguments arguments;
21 21
 	public final FunctionHeader instancedHeader;
22 22
 	
23
-	public CallExpression(CodePosition position, Expression target, FunctionalMemberRef member, FunctionHeader instancedHeader, CallArguments arguments, TypeScope scope) {
23
+	public CallExpression(CodePosition position, Expression target, FunctionalMemberRef member, FunctionHeader instancedHeader, CallArguments arguments) {
24 24
 		super(position, instancedHeader.returnType, multiThrow(position, arguments.arguments));
25 25
 		
26 26
 		this.target = target;
27 27
 		this.member = member;
28
-		this.arguments = scope == null ? arguments : arguments.normalize(position, scope, instancedHeader);
28
+		this.arguments = arguments;
29 29
 		this.instancedHeader = instancedHeader;
30 30
 	}
31 31
 	
@@ -44,7 +44,7 @@ public class CallExpression extends Expression {
44 44
 		CallArguments tArguments = arguments.transform(transformer);
45 45
 		return tTarget == target && tArguments == arguments
46 46
 				? this
47
-				: new CallExpression(position, tTarget, member, instancedHeader, tArguments, null);
47
+				: new CallExpression(position, tTarget, member, instancedHeader, tArguments);
48 48
 	}
49 49
 	
50 50
 	@Override
@@ -59,4 +59,14 @@ public class CallExpression extends Expression {
59 59
 				throw new UnsupportedOperationException("Cannot evaluate to a string constant!");
60 60
 		}
61 61
 	}
62
+
63
+	@Override
64
+	public Expression normalize(TypeScope scope) {
65
+		return new CallExpression(
66
+				position,
67
+				target.normalize(scope),
68
+				member,
69
+				instancedHeader.normalize(scope.getTypeRegistry()),
70
+				arguments.normalize(position, scope, instancedHeader));
71
+	}
62 72
 }

+ 13
- 3
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CallStaticExpression.java View File

@@ -21,12 +21,12 @@ public class CallStaticExpression extends Expression {
21 21
 	public final CallArguments arguments;
22 22
 	public final FunctionHeader instancedHeader;
23 23
 	
24
-	public CallStaticExpression(CodePosition position, ITypeID target, FunctionalMemberRef member, FunctionHeader instancedHeader, CallArguments arguments, TypeScope scope) {
24
+	public CallStaticExpression(CodePosition position, ITypeID target, FunctionalMemberRef member, FunctionHeader instancedHeader, CallArguments arguments) {
25 25
 		super(position, instancedHeader.returnType, multiThrow(position, arguments.arguments));
26 26
 		
27 27
 		this.member = member;
28 28
 		this.target = target;
29
-		this.arguments = scope == null ? arguments : arguments.normalize(position, scope, instancedHeader);
29
+		this.arguments = arguments;
30 30
 		this.instancedHeader = instancedHeader;
31 31
 	}
32 32
 
@@ -38,6 +38,16 @@ public class CallStaticExpression extends Expression {
38 38
 	@Override
39 39
 	public Expression transform(ExpressionTransformer transformer) {
40 40
 		CallArguments tArguments = arguments.transform(transformer);
41
-		return arguments == tArguments ? this : new CallStaticExpression(position, target, member, instancedHeader, tArguments, null);
41
+		return arguments == tArguments ? this : new CallStaticExpression(position, target, member, instancedHeader, tArguments);
42
+	}
43
+
44
+	@Override
45
+	public Expression normalize(TypeScope scope) {
46
+		return new CallStaticExpression(
47
+				position,
48
+				target.getNormalized(),
49
+				member,
50
+				instancedHeader.normalize(scope.getTypeRegistry()),
51
+				arguments.normalize(position, scope, instancedHeader));
42 52
 	}
43 53
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CapturedClosureExpression.java View File

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9 10
 
10 11
 /**
11 12
  *
@@ -39,4 +40,9 @@ public class CapturedClosureExpression extends CapturedExpression {
39 40
 			return tValue == value ? this : new CapturedClosureExpression(position, (CapturedExpression)tValue, closure);
40 41
 		}
41 42
 	}
43
+
44
+	@Override
45
+	public CapturedExpression normalize(TypeScope scope) {
46
+		return new CapturedClosureExpression(position, value.normalize(scope), closure);
47
+	}
42 48
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CapturedDirectExpression.java View File

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9 10
 
10 11
 /**
11 12
  *
@@ -34,4 +35,9 @@ public class CapturedDirectExpression extends CapturedExpression {
34 35
 		Expression tValue = transformer.transform(value);
35 36
 		return tValue == value ? this : new CapturedDirectExpression(position, closure, tValue);
36 37
 	}
38
+
39
+	@Override
40
+	public CapturedExpression normalize(TypeScope scope) {
41
+		return new CapturedDirectExpression(position, closure, value.normalize(scope));
42
+	}
37 43
 }

+ 4
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CapturedExpression.java View File

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9 10
 import org.openzen.zenscript.codemodel.type.ITypeID;
10 11
 
11 12
 /**
@@ -28,5 +29,8 @@ public abstract class CapturedExpression extends Expression {
28 29
 		return result;
29 30
 	}
30 31
 	
32
+	@Override
33
+	public abstract CapturedExpression normalize(TypeScope scope);
34
+	
31 35
 	public abstract <T> T accept(CapturedExpressionVisitor<T> visitor);
32 36
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CapturedLocalVariableExpression.java View File

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9 10
 import org.openzen.zenscript.codemodel.statement.VarStatement;
10 11
 
11 12
 /**
@@ -35,4 +36,9 @@ public class CapturedLocalVariableExpression extends CapturedExpression {
35 36
 	public Expression transform(ExpressionTransformer transformer) {
36 37
 		return this;
37 38
 	}
39
+
40
+	@Override
41
+	public CapturedExpression normalize(TypeScope scope) {
42
+		return this;
43
+	}
38 44
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CapturedParameterExpression.java View File

@@ -7,6 +7,7 @@ package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.FunctionParameter;
10
+import org.openzen.zenscript.codemodel.scope.TypeScope;
10 11
 
11 12
 /**
12 13
  *
@@ -35,4 +36,9 @@ public class CapturedParameterExpression extends CapturedExpression {
35 36
 	public Expression transform(ExpressionTransformer transformer) {
36 37
 		return this;
37 38
 	}
39
+
40
+	@Override
41
+	public CapturedExpression normalize(TypeScope scope) {
42
+		return this;
43
+	}
38 44
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CapturedThisExpression.java View File

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9 10
 import org.openzen.zenscript.codemodel.type.ITypeID;
10 11
 
11 12
 /**
@@ -31,4 +32,9 @@ public class CapturedThisExpression extends CapturedExpression {
31 32
 	public Expression transform(ExpressionTransformer transformer) {
32 33
 		return this;
33 34
 	}
35
+
36
+	@Override
37
+	public CapturedExpression normalize(TypeScope scope) {
38
+		return this;
39
+	}
34 40
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CastExpression.java View File

@@ -7,6 +7,7 @@ package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.member.ref.CasterMemberRef;
10
+import org.openzen.zenscript.codemodel.scope.TypeScope;
10 11
 
11 12
 /**
12 13
  *
@@ -35,4 +36,9 @@ public class CastExpression extends Expression {
35 36
 		Expression tTarget = target.transform(transformer);
36 37
 		return target == tTarget ? this : new CastExpression(position, tTarget, member, isImplicit);
37 38
 	}
39
+
40
+	@Override
41
+	public Expression normalize(TypeScope scope) {
42
+		return new CastExpression(position, target.normalize(scope), member, isImplicit);
43
+	}
38 44
 }

+ 7
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CheckNullExpression.java View File

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9 10
 
10 11
 /**
11 12
  * Converts a value from X? to X. Throws a NullPointerException if the value is null.
@@ -16,7 +17,7 @@ public class CheckNullExpression extends Expression {
16 17
 	public final Expression value;
17 18
 	
18 19
 	public CheckNullExpression(CodePosition position, Expression value) {
19
-		super(position, value.type.unwrap(), value.thrownType);
20
+		super(position, value.type.withoutOptional(), value.thrownType);
20 21
 		
21 22
 		this.value = value;
22 23
 	}
@@ -31,4 +32,9 @@ public class CheckNullExpression extends Expression {
31 32
 		Expression tValue = transformer.transform(value);
32 33
 		return value == tValue ? this : new CheckNullExpression(position, tValue);
33 34
 	}
35
+
36
+	@Override
37
+	public Expression normalize(TypeScope scope) {
38
+		return new CheckNullExpression(position, value.normalize(scope));
39
+	}
34 40
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CoalesceExpression.java View File

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9 10
 
10 11
 /**
11 12
  *
@@ -33,4 +34,9 @@ public class CoalesceExpression extends Expression {
33 34
 		Expression tRight = right.transform(transformer);
34 35
 		return tLeft == left && tRight == right ? this : new CoalesceExpression(position, tLeft, tRight);
35 36
 	}
37
+
38
+	@Override
39
+	public Expression normalize(TypeScope scope) {
40
+		return new CoalesceExpression(position, left.normalize(scope), right.normalize(scope));
41
+	}
36 42
 }

+ 6
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CompareExpression.java View File

@@ -27,7 +27,7 @@ public class CompareExpression extends Expression {
27 27
 		super(position, BasicTypeID.BOOL, binaryThrow(position, left.thrownType, right.thrownType));
28 28
 		
29 29
 		this.left = left;
30
-		this.right = scope == null ? right : right.castImplicit(position, scope, operator.header.parameters[0].type);
30
+		this.right = scope == null ? right : right.castImplicit(position, scope, operator.getHeader().parameters[0].type);
31 31
 		this.operator = operator;
32 32
 		this.comparison = comparison;
33 33
 	}
@@ -43,4 +43,9 @@ public class CompareExpression extends Expression {
43 43
 		Expression tRight = right.transform(transformer);
44 44
 		return left == tLeft && right == tRight ? this : new CompareExpression(position, tLeft, tRight, operator, comparison, null);
45 45
 	}
46
+
47
+	@Override
48
+	public Expression normalize(TypeScope scope) {
49
+		return new CompareExpression(position, left.normalize(scope), right.normalize(scope), operator, comparison, scope);
50
+	}
46 51
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConditionalExpression.java View File

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9 10
 import org.openzen.zenscript.codemodel.type.ITypeID;
10 11
 
11 12
 /**
@@ -47,4 +48,9 @@ public class ConditionalExpression extends Expression {
47 48
 				? this
48 49
 				: new ConditionalExpression(position, tCondition, tIfThen, tIfElse, type);
49 50
 	}
51
+
52
+	@Override
53
+	public Expression normalize(TypeScope scope) {
54
+		return new ConditionalExpression(position, condition.normalize(scope), ifThen.normalize(scope), ifElse.normalize(scope), type.getNormalized());
55
+	}
50 56
 }

+ 7
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstExpression.java View File

@@ -9,6 +9,7 @@ import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.member.EnumConstantMember;
10 10
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
11 11
 import org.openzen.zenscript.codemodel.member.ref.ConstMemberRef;
12
+import org.openzen.zenscript.codemodel.scope.TypeScope;
12 13
 
13 14
 /**
14 15
  *
@@ -18,7 +19,7 @@ public class ConstExpression extends Expression {
18 19
 	public final ConstMemberRef constant;
19 20
 	
20 21
 	public ConstExpression(CodePosition position, ConstMemberRef constant) {
21
-		super(position, constant.type, null);
22
+		super(position, constant.getType(), null);
22 23
 		
23 24
 		this.constant = constant;
24 25
 	}
@@ -47,4 +48,9 @@ public class ConstExpression extends Expression {
47 48
 	public IDefinitionMember getMember() {
48 49
 		return constant.member;
49 50
 	}
51
+
52
+	@Override
53
+	public Expression normalize(TypeScope scope) {
54
+		return this;
55
+	}
50 56
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantBoolExpression.java View File

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9 10
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10 11
 
11 12
 /**
@@ -30,4 +31,9 @@ public class ConstantBoolExpression extends Expression {
30 31
 	public Expression transform(ExpressionTransformer transformer) {
31 32
 		return this;
32 33
 	}
34
+
35
+	@Override
36
+	public Expression normalize(TypeScope scope) {
37
+		return this;
38
+	}
33 39
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantByteExpression.java View File

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9 10
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10 11
 
11 12
 /**
@@ -30,4 +31,9 @@ public class ConstantByteExpression extends Expression {
30 31
 	public Expression transform(ExpressionTransformer transformer) {
31 32
 		return this;
32 33
 	}
34
+
35
+	@Override
36
+	public Expression normalize(TypeScope scope) {
37
+		return this;
38
+	}
33 39
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantCharExpression.java View File

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9 10
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10 11
 
11 12
 /**
@@ -30,4 +31,9 @@ public class ConstantCharExpression extends Expression {
30 31
 	public Expression transform(ExpressionTransformer transformer) {
31 32
 		return this;
32 33
 	}
34
+
35
+	@Override
36
+	public Expression normalize(TypeScope scope) {
37
+		return this;
38
+	}
33 39
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantDoubleExpression.java View File

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9 10
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10 11
 
11 12
 /**
@@ -30,4 +31,9 @@ public class ConstantDoubleExpression extends Expression {
30 31
 	public Expression transform(ExpressionTransformer transformer) {
31 32
 		return this;
32 33
 	}
34
+
35
+	@Override
36
+	public Expression normalize(TypeScope scope) {
37
+		return this;
38
+	}
33 39
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantFloatExpression.java View File

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9 10
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10 11
 
11 12
 /**
@@ -30,4 +31,9 @@ public class ConstantFloatExpression extends Expression {
30 31
 	public Expression transform(ExpressionTransformer transformer) {
31 32
 		return this;
32 33
 	}
34
+
35
+	@Override
36
+	public Expression normalize(TypeScope scope) {
37
+		return this;
38
+	}
33 39
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantIntExpression.java View File

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9 10
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10 11
 
11 12
 /**
@@ -30,4 +31,9 @@ public class ConstantIntExpression extends Expression {
30 31
 	public Expression transform(ExpressionTransformer transformer) {
31 32
 		return this;
32 33
 	}
34
+
35
+	@Override
36
+	public Expression normalize(TypeScope scope) {
37
+		return this;
38
+	}
33 39
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantLongExpression.java View File

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9 10
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10 11
 
11 12
 /**
@@ -30,4 +31,9 @@ public class ConstantLongExpression extends Expression {
30 31
 	public Expression transform(ExpressionTransformer transformer) {
31 32
 		return this;
32 33
 	}
34
+
35
+	@Override
36
+	public Expression normalize(TypeScope scope) {
37
+		return this;
38
+	}
33 39
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantSByteExpression.java View File

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9 10
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10 11
 
11 12
 /**
@@ -30,4 +31,9 @@ public class ConstantSByteExpression extends Expression {
30 31
 	public Expression transform(ExpressionTransformer transformer) {
31 32
 		return this;
32 33
 	}
34
+
35
+	@Override
36
+	public Expression normalize(TypeScope scope) {
37
+		return this;
38
+	}
33 39
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantShortExpression.java View File

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9 10
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10 11
 
11 12
 /**
@@ -30,4 +31,9 @@ public class ConstantShortExpression extends Expression {
30 31
 	public Expression transform(ExpressionTransformer transformer) {
31 32
 		return this;
32 33
 	}
34
+
35
+	@Override
36
+	public Expression normalize(TypeScope scope) {
37
+		return this;
38
+	}
33 39
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantStringExpression.java View File

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9 10
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10 11
 
11 12
 /**
@@ -35,4 +36,9 @@ public class ConstantStringExpression extends Expression {
35 36
 	public String evaluateStringConstant() {
36 37
 		return value;
37 38
 	}
39
+
40
+	@Override
41
+	public Expression normalize(TypeScope scope) {
42
+		return this;
43
+	}
38 44
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantUIntExpression.java View File

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9 10
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10 11
 
11 12
 /**
@@ -30,4 +31,9 @@ public class ConstantUIntExpression extends Expression {
30 31
 	public Expression transform(ExpressionTransformer transformer) {
31 32
 		return this;
32 33
 	}
34
+
35
+	@Override
36
+	public Expression normalize(TypeScope scope) {
37
+		return this;
38
+	}
33 39
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantULongExpression.java View File

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9 10
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10 11
 
11 12
 /**
@@ -30,4 +31,9 @@ public class ConstantULongExpression extends Expression {
30 31
 	public Expression transform(ExpressionTransformer transformer) {
31 32
 		return this;
32 33
 	}
34
+
35
+	@Override
36
+	public Expression normalize(TypeScope scope) {
37
+		return this;
38
+	}
33 39
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantUShortExpression.java View File

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9 10
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10 11
 
11 12
 /**
@@ -30,4 +31,9 @@ public class ConstantUShortExpression extends Expression {
30 31
 	public Expression transform(ExpressionTransformer transformer) {
31 32
 		return this;
32 33
 	}
34
+
35
+	@Override
36
+	public Expression normalize(TypeScope scope) {
37
+		return this;
38
+	}
33 39
 }

+ 9
- 4
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstructorSuperCallExpression.java View File

@@ -20,12 +20,12 @@ public class ConstructorSuperCallExpression extends Expression {
20 20
 	public final FunctionalMemberRef constructor;
21 21
 	public final CallArguments arguments;
22 22
 	
23
-	public ConstructorSuperCallExpression(CodePosition position, ITypeID type, FunctionalMemberRef constructor, CallArguments arguments, TypeScope scope) {
24
-		super(position, BasicTypeID.VOID, binaryThrow(position, constructor.header.thrownType, multiThrow(position, arguments.arguments)));
23
+	public ConstructorSuperCallExpression(CodePosition position, ITypeID type, FunctionalMemberRef constructor, CallArguments arguments) {
24
+		super(position, BasicTypeID.VOID, binaryThrow(position, constructor.getHeader().thrownType, multiThrow(position, arguments.arguments)));
25 25
 		
26 26
 		this.objectType = type;
27 27
 		this.constructor = constructor;
28
-		this.arguments = scope == null ? arguments : arguments.normalize(position, scope, constructor.header);
28
+		this.arguments = arguments;
29 29
 	}
30 30
 
31 31
 	@Override
@@ -36,6 +36,11 @@ public class ConstructorSuperCallExpression extends Expression {
36 36
 	@Override
37 37
 	public Expression transform(ExpressionTransformer transformer) {
38 38
 		CallArguments tArguments = arguments.transform(transformer);
39
-		return tArguments == arguments ? this : new ConstructorSuperCallExpression(position, type, constructor, tArguments, null);
39
+		return tArguments == arguments ? this : new ConstructorSuperCallExpression(position, type, constructor, tArguments);
40
+	}
41
+
42
+	@Override
43
+	public Expression normalize(TypeScope scope) {
44
+		return new ConstructorSuperCallExpression(position, type.getNormalized(), constructor, arguments.normalize(position, scope, constructor.getHeader()));
40 45
 	}
41 46
 }

+ 12
- 4
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstructorThisCallExpression.java View File

@@ -20,12 +20,15 @@ public class ConstructorThisCallExpression extends Expression {
20 20
 	public final FunctionalMemberRef constructor;
21 21
 	public final CallArguments arguments;
22 22
 	
23
-	public ConstructorThisCallExpression(CodePosition position, ITypeID type, FunctionalMemberRef constructor, CallArguments arguments, TypeScope scope) {
24
-		super(position, BasicTypeID.VOID, binaryThrow(position, constructor.header.thrownType, multiThrow(position, arguments.arguments)));
23
+	public ConstructorThisCallExpression(CodePosition position, ITypeID type, FunctionalMemberRef constructor, CallArguments arguments) {
24
+		super(position, BasicTypeID.VOID, binaryThrow(position, constructor.getHeader().thrownType, multiThrow(position, arguments.arguments)));
25
+		
26
+		if (type instanceof BasicTypeID)
27
+			throw new IllegalArgumentException("Type cannot be basic type");
25 28
 		
26 29
 		this.objectType = type;
27 30
 		this.constructor = constructor;
28
-		this.arguments = scope == null ? arguments : arguments.normalize(position, scope, constructor.header);
31
+		this.arguments = arguments;
29 32
 	}
30 33
 
31 34
 	@Override
@@ -36,6 +39,11 @@ public class ConstructorThisCallExpression extends Expression {
36 39
 	@Override
37 40
 	public Expression transform(ExpressionTransformer transformer) {
38 41
 		CallArguments tArguments = arguments.transform(transformer);
39
-		return tArguments == arguments ? this : new ConstructorThisCallExpression(position, type, constructor, tArguments, null);
42
+		return tArguments == arguments ? this : new ConstructorThisCallExpression(position, objectType, constructor, tArguments);
43
+	}
44
+
45
+	@Override
46
+	public Expression normalize(TypeScope scope) {
47
+		return new ConstructorThisCallExpression(position, objectType, constructor, arguments.normalize(position, scope, constructor.getHeader()));
40 48
 	}
41 49
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/DummyExpression.java View File

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9 10
 import org.openzen.zenscript.codemodel.type.ITypeID;
10 11
 
11 12
 /**
@@ -26,4 +27,9 @@ public class DummyExpression extends Expression {
26 27
 	public Expression transform(ExpressionTransformer transformer) {
27 28
 		throw new UnsupportedOperationException("This is a dummy expression");
28 29
 	}
30
+
31
+	@Override
32
+	public Expression normalize(TypeScope scope) {
33
+		return this;
34
+	}
29 35
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/EnumConstantExpression.java View File

@@ -8,6 +8,7 @@ package org.openzen.zenscript.codemodel.expression;
8 8
 import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.definition.EnumDefinition;
10 10
 import org.openzen.zenscript.codemodel.member.EnumConstantMember;
11
+import org.openzen.zenscript.codemodel.scope.TypeScope;
11 12
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
12 13
 import org.openzen.zenscript.codemodel.type.ITypeID;
13 14
 
@@ -44,4 +45,9 @@ public class EnumConstantExpression extends Expression {
44 45
 	public EnumConstantMember evaluateEnumConstant() {
45 46
 		return value;
46 47
 	}
48
+
49
+	@Override
50
+	public Expression normalize(TypeScope scope) {
51
+		return this;
52
+	}
47 53
 }

+ 7
- 5
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/Expression.java View File

@@ -40,10 +40,10 @@ public abstract class Expression implements IPartialExpression {
40 40
 		if (type == null)
41 41
 			throw new NullPointerException();
42 42
 		if (type == BasicTypeID.UNDETERMINED)
43
-			throw new IllegalArgumentException("Cannot use undetermined type as expression type");
43
+			throw new IllegalArgumentException(position + ": Cannot use undetermined type as expression type");
44 44
 		
45 45
 		this.position = position;
46
-		this.type = type;
46
+		this.type = type.getNormalized();
47 47
 		this.thrownType = thrownType;
48 48
 	}
49 49
 	
@@ -66,6 +66,8 @@ public abstract class Expression implements IPartialExpression {
66 66
 		});
67 67
 	}
68 68
 	
69
+	public abstract Expression normalize(TypeScope scope);
70
+	
69 71
 	@Override
70 72
 	public List<ITypeID> getAssignHints() {
71 73
 		return Collections.singletonList(type);
@@ -104,8 +106,8 @@ public abstract class Expression implements IPartialExpression {
104 106
 		return scope.getTypeMembers(type)
105 107
 				.getOrCreateGroup(OperatorType.CALL)
106 108
 				.getMethodMembers().stream()
107
-				.filter(method -> method.member.header.parameters.length == arguments && !method.member.isStatic())
108
-				.map(method -> method.member.header)
109
+				.filter(method -> method.member.getHeader().parameters.length == arguments && !method.member.isStatic())
110
+				.map(method -> method.member.getHeader())
109 111
 				.collect(Collectors.toList());
110 112
 	}
111 113
 	
@@ -117,7 +119,7 @@ public abstract class Expression implements IPartialExpression {
117 119
 	@Override
118 120
 	public IPartialExpression getMember(CodePosition position, TypeScope scope, List<ITypeID> hints, GenericName name) {
119 121
 		TypeMembers members = scope.getTypeMembers(type);
120
-		IPartialExpression result = members.getMemberExpression(position, this, name, false);
122
+		IPartialExpression result = members.getMemberExpression(position, scope, this, name, false);
121 123
 		if (result == null)
122 124
 			System.out.println("No such member: " + name.name);
123 125
 		return result;

+ 1
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ExpressionBuilder.java View File

@@ -59,8 +59,7 @@ public class ExpressionBuilder {
59 59
 				type,
60 60
 				member,
61 61
 				compiledArguments,
62
-				compiledArguments.getNumberOfTypeArguments() == 0 ? member.header : member.header.fillGenericArguments(scope.getTypeRegistry(), compiledArguments.typeArguments),
63
-				scope);
62
+				compiledArguments.getNumberOfTypeArguments() == 0 ? member.getHeader() : member.getHeader().fillGenericArguments(scope.getTypeRegistry(), compiledArguments.typeArguments, scope.getLocalTypeParameters()));
64 63
 	}
65 64
 	
66 65
 	public Expression not(Expression value) {

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/FunctionExpression.java View File

@@ -12,6 +12,7 @@ import org.openzen.zencode.shared.CodePosition;
12 12
 import org.openzen.zencode.shared.ConcatMap;
13 13
 import org.openzen.zenscript.codemodel.FunctionHeader;
14 14
 import org.openzen.zenscript.codemodel.FunctionParameter;
15
+import org.openzen.zenscript.codemodel.scope.TypeScope;
15 16
 import org.openzen.zenscript.codemodel.statement.ExpressionStatement;
16 17
 import org.openzen.zenscript.codemodel.statement.LoopStatement;
17 18
 import org.openzen.zenscript.codemodel.statement.ReturnStatement;
@@ -74,6 +75,11 @@ public class FunctionExpression extends Expression {
74 75
 			return null;
75 76
 		}
76 77
 	}
78
+
79
+	@Override
80
+	public Expression normalize(TypeScope scope) {
81
+		return new FunctionExpression(position, (FunctionTypeID)type, closure, header, body.normalize(scope, ConcatMap.empty(LoopStatement.class, LoopStatement.class)));
82
+	}
77 83
 	
78 84
 	private static class ReturnExpressionTransformer implements ExpressionTransformer {
79 85
 		private final LambdaClosure closure;

+ 6
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/GetFieldExpression.java View File

@@ -22,7 +22,7 @@ public class GetFieldExpression extends Expression {
22 22
 	public final FieldMemberRef field;
23 23
 	
24 24
 	public GetFieldExpression(CodePosition position, Expression target, FieldMemberRef field) {
25
-		super(position, field.type, target.thrownType);
25
+		super(position, field.getType(), target.thrownType);
26 26
 		
27 27
 		this.target = target;
28 28
 		this.field = field;
@@ -58,4 +58,9 @@ public class GetFieldExpression extends Expression {
58 58
 	public IDefinitionMember getMember() {
59 59
 		return field.member;
60 60
 	}
61
+
62
+	@Override
63
+	public Expression normalize(TypeScope scope) {
64
+		return new GetFieldExpression(position, target.normalize(scope), field);
65
+	}
61 66
 }

+ 5
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/GetFunctionParameterExpression.java View File

@@ -43,4 +43,9 @@ public class GetFunctionParameterExpression extends Expression {
43 43
 	public Expression transform(ExpressionTransformer transformer) {
44 44
 		return this;
45 45
 	}
46
+
47
+	@Override
48
+	public Expression normalize(TypeScope scope) {
49
+		return this;
50
+	}
46 51
 }

+ 5
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/GetLocalVariableExpression.java View File

@@ -43,4 +43,9 @@ public class GetLocalVariableExpression extends Expression {
43 43
 	public Expression transform(ExpressionTransformer transformer) {
44 44
 		return this;
45 45
 	}
46
+
47
+	@Override
48
+	public Expression normalize(TypeScope scope) {
49
+		return this;
50
+	}
46 51
 }

+ 8
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/GetStaticFieldExpression.java View File

@@ -10,6 +10,7 @@ import java.util.List;
10 10
 import org.openzen.zencode.shared.CodePosition;
11 11
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
12 12
 import org.openzen.zenscript.codemodel.member.ref.FieldMemberRef;
13
+import org.openzen.zenscript.codemodel.scope.TypeScope;
13 14
 import org.openzen.zenscript.codemodel.type.ITypeID;
14 15
 
15 16
 /**
@@ -20,14 +21,14 @@ public class GetStaticFieldExpression extends Expression {
20 21
 	public final FieldMemberRef field;
21 22
 	
22 23
 	public GetStaticFieldExpression(CodePosition position, FieldMemberRef field) {
23
-		super(position, field.type, null);
24
+		super(position, field.getType(), null);
24 25
 		
25 26
 		this.field = field;
26 27
 	}
27 28
 	
28 29
 	@Override
29 30
 	public List<ITypeID> getAssignHints() {
30
-		return Collections.singletonList(field.type);
31
+		return Collections.singletonList(field.getType());
31 32
 	}
32 33
 	
33 34
 	@Override
@@ -49,4 +50,9 @@ public class GetStaticFieldExpression extends Expression {
49 50
 	public IDefinitionMember getMember() {
50 51
 		return field.member;
51 52
 	}
53
+
54
+	@Override
55
+	public Expression normalize(TypeScope scope) {
56
+		return this;
57
+	}
52 58
 }

+ 7
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/GetterExpression.java View File

@@ -7,6 +7,7 @@ package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.member.ref.GetterMemberRef;
10
+import org.openzen.zenscript.codemodel.scope.TypeScope;
10 11
 
11 12
 /**
12 13
  *
@@ -17,7 +18,7 @@ public class GetterExpression extends Expression {
17 18
 	public final GetterMemberRef getter;
18 19
 	
19 20
 	public GetterExpression(CodePosition position, Expression target, GetterMemberRef getter) {
20
-		super(position, getter.type, target.thrownType);
21
+		super(position, getter.getType(), target.thrownType);
21 22
 		
22 23
 		this.target = target;
23 24
 		this.getter = getter;
@@ -33,4 +34,9 @@ public class GetterExpression extends Expression {
33 34
 		Expression tTarget = target.transform(transformer);
34 35
 		return target == tTarget ? this : new GetterExpression(position, tTarget, getter);
35 36
 	}
37
+
38
+	@Override
39
+	public Expression normalize(TypeScope scope) {
40
+		return new GetterExpression(position, target.normalize(scope), getter);
41
+	}
36 42
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/GlobalCallExpression.java View File

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9 10
 
10 11
 /**
11 12
  *
@@ -35,4 +36,9 @@ public class GlobalCallExpression extends Expression {
35 36
 		Expression tResolution = resolution.transform(transformer);
36 37
 		return tArguments == arguments && tResolution == resolution ? this : new GlobalCallExpression(position, name, tArguments, tResolution);
37 38
 	}
39
+
40
+	@Override
41
+	public Expression normalize(TypeScope scope) {
42
+		return new GlobalCallExpression(position, name, arguments, resolution.normalize(scope));
43
+	}
38 44
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/GlobalExpression.java View File

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9 10
 
10 11
 /**
11 12
  *
@@ -32,4 +33,9 @@ public class GlobalExpression extends Expression {
32 33
 		Expression tResolution = resolution.transform(transformer);
33 34
 		return resolution == tResolution ? this : new GlobalExpression(position, name, resolution);
34 35
 	}
36
+
37
+	@Override
38
+	public Expression normalize(TypeScope scope) {
39
+		return new GlobalExpression(position, name, resolution.normalize(scope));
40
+	}
35 41
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/InterfaceCastExpression.java View File

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9 10
 import org.openzen.zenscript.codemodel.type.ITypeID;
10 11
 
11 12
 /**
@@ -31,4 +32,9 @@ public class InterfaceCastExpression extends Expression {
31 32
 		Expression tValue = value.transform(transformer);
32 33
 		return value == tValue ? this : new InterfaceCastExpression(position, tValue, type);
33 34
 	}
35
+
36
+	@Override
37
+	public Expression normalize(TypeScope scope) {
38
+		return new InterfaceCastExpression(position, value.normalize(scope), type.getNormalized());
39
+	}
34 40
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/IsExpression.java View File

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9 10
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10 11
 import org.openzen.zenscript.codemodel.type.ITypeID;
11 12
 
@@ -34,4 +35,9 @@ public class IsExpression extends Expression {
34 35
 		Expression tValue = value.transform(transformer);
35 36
 		return tValue == value ? this : new IsExpression(position, tValue, type);
36 37
 	}
38
+
39
+	@Override
40
+	public Expression normalize(TypeScope scope) {
41
+		return new IsExpression(position, value.normalize(scope), type.getNormalized());
42
+	}
37 43
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/MakeConstExpression.java View File

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9 10
 import org.openzen.zenscript.codemodel.type.ITypeID;
10 11
 
11 12
 /**
@@ -31,4 +32,9 @@ public class MakeConstExpression extends Expression {
31 32
 		Expression tValue = value.transform(transformer);
32 33
 		return tValue == value ? this : new MakeConstExpression(position, tValue, type);
33 34
 	}
35
+
36
+	@Override
37
+	public Expression normalize(TypeScope scope) {
38
+		return new MakeConstExpression(position, value.normalize(scope), type.getNormalized());
39
+	}
34 40
 }

+ 14
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/MapExpression.java View File

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9 10
 import org.openzen.zenscript.codemodel.type.ITypeID;
10 11
 
11 12
 /**
@@ -38,4 +39,17 @@ public class MapExpression extends Expression {
38 39
 		Expression[] tValues = Expression.transform(values, transformer);
39 40
 		return tKeys == keys && tValues == values ? this : new MapExpression(position, tKeys, tValues, type);
40 41
 	}
42
+
43
+	@Override
44
+	public Expression normalize(TypeScope scope) {
45
+		Expression[] normalizedKeys = new Expression[keys.length];
46
+		for (int i = 0; i < normalizedKeys.length; i++)
47
+			normalizedKeys[i] = keys[i].normalize(scope);
48
+		
49
+		Expression[] normalizedValues = new Expression[values.length];
50
+		for (int i = 0; i < normalizedValues.length; i++)
51
+			normalizedValues[i] = values[i].normalize(scope);
52
+		
53
+		return new MapExpression(position, normalizedKeys, normalizedValues, type.getNormalized());
54
+	}
41 55
 }

+ 13
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/MatchExpression.java View File

@@ -10,6 +10,7 @@ import java.util.Collections;
10 10
 import java.util.List;
11 11
 import org.openzen.zencode.shared.CodePosition;
12 12
 import org.openzen.zenscript.codemodel.expression.switchvalue.SwitchValue;
13
+import org.openzen.zenscript.codemodel.scope.TypeScope;
13 14
 import org.openzen.zenscript.codemodel.statement.BreakStatement;
14 15
 import org.openzen.zenscript.codemodel.statement.ExpressionStatement;
15 16
 import org.openzen.zenscript.codemodel.statement.Statement;
@@ -50,6 +51,14 @@ public class MatchExpression extends Expression {
50 51
 		}
51 52
 		return unmodified && tValue == value ? this : new MatchExpression(position, tValue, type, tCases);
52 53
 	}
54
+
55
+	@Override
56
+	public Expression normalize(TypeScope scope) {
57
+		Case[] normalizedCases = new Case[cases.length];
58
+		for (int i = 0; i < cases.length; i++)
59
+			normalizedCases[i] = cases[i].normalize(scope);
60
+		return new MatchExpression(position, value.normalize(scope), type, normalizedCases);
61
+	}
53 62
 	
54 63
 	public SwitchedMatch convertToSwitch(String tempVariable) {
55 64
 		VarStatement result = new VarStatement(position, tempVariable, type, null, false);
@@ -103,6 +112,10 @@ public class MatchExpression extends Expression {
103 112
 			Expression tValue = value.transform(transformer);
104 113
 			return tValue == value ? this : new Case(key, tValue);
105 114
 		}
115
+		
116
+		public Case normalize(TypeScope scope) {
117
+			return new Case(key, value.normalize(scope));
118
+		}
106 119
 	}
107 120
 	
108 121
 	private static ITypeID getThrownType(CodePosition position, Case[] cases) {

+ 10
- 10
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/NewExpression.java View File

@@ -26,11 +26,7 @@ public class NewExpression extends Expression {
26 26
 			FunctionalMemberRef constructor,
27 27
 			CallArguments arguments)
28 28
 	{
29
-		super(position, type, binaryThrow(position, constructor.header.thrownType, multiThrow(position, arguments.arguments)));
30
-		
31
-		this.constructor = constructor;
32
-		this.arguments = arguments;
33
-		this.instancedHeader = constructor.header;
29
+		this(position, type, constructor, arguments, constructor.getHeader());
34 30
 	}
35 31
 	
36 32
 	public NewExpression(
@@ -38,13 +34,12 @@ public class NewExpression extends Expression {
38 34
 			ITypeID type,
39 35
 			FunctionalMemberRef constructor,
40 36
 			CallArguments arguments,
41
-			FunctionHeader instancedHeader,
42
-			TypeScope scope)
37
+			FunctionHeader instancedHeader)
43 38
 	{
44
-		super(position, type, binaryThrow(position, constructor.header.thrownType, multiThrow(position, arguments.arguments)));
39
+		super(position, type, binaryThrow(position, constructor.getHeader().thrownType, multiThrow(position, arguments.arguments)));
45 40
 		
46 41
 		this.constructor = constructor;
47
-		this.arguments = scope == null ? arguments : arguments.normalize(position, scope, instancedHeader);
42
+		this.arguments = arguments;
48 43
 		this.instancedHeader = instancedHeader;
49 44
 	}
50 45
 
@@ -56,6 +51,11 @@ public class NewExpression extends Expression {
56 51
 	@Override
57 52
 	public Expression transform(ExpressionTransformer transformer) {
58 53
 		CallArguments tArguments = arguments.transform(transformer);
59
-		return tArguments == arguments ? this : new NewExpression(position, type, constructor, tArguments, instancedHeader, null);
54
+		return tArguments == arguments ? this : new NewExpression(position, type, constructor, tArguments, instancedHeader);
55
+	}
56
+
57
+	@Override
58
+	public Expression normalize(TypeScope scope) {
59
+		return new NewExpression(position, type.getNormalized(), constructor, arguments.normalize(position, scope, instancedHeader), instancedHeader);
60 60
 	}
61 61
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/NullExpression.java View File

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9 10
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10 11
 import org.openzen.zenscript.codemodel.type.ITypeID;
11 12
 
@@ -31,4 +32,9 @@ public class NullExpression extends Expression {
31 32
 	public Expression transform(ExpressionTransformer transformer) {
32 33
 		return this;
33 34
 	}
35
+
36
+	@Override
37
+	public Expression normalize(TypeScope scope) {
38
+		return this;
39
+	}
34 40
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/OrOrExpression.java View File

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9 10
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10 11
 
11 12
 /**
@@ -34,4 +35,9 @@ public class OrOrExpression extends Expression {
34 35
 		Expression tRight = right.transform(transformer);
35 36
 		return tLeft == left && tRight == right ? this : new OrOrExpression(position, tLeft, tRight);
36 37
 	}
38
+
39
+	@Override
40
+	public Expression normalize(TypeScope scope) {
41
+		return new OrOrExpression(position, left.normalize(scope), right.normalize(scope));
42
+	}
37 43
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/PanicExpression.java View File

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9 10
 import org.openzen.zenscript.codemodel.type.ITypeID;
10 11
 
11 12
 /**
@@ -35,4 +36,9 @@ public class PanicExpression extends Expression {
35 36
 	public Expression transform(ExpressionTransformer transformer) {
36 37
 		return new PanicExpression(position, type, transformer.transform(value));
37 38
 	}
39
+
40
+	@Override
41
+	public Expression normalize(TypeScope scope) {
42
+		return new PanicExpression(position, type, value.normalize(scope));
43
+	}
38 44
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/PostCallExpression.java View File

@@ -9,6 +9,7 @@ import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.FunctionHeader;
10 10
 import org.openzen.zenscript.codemodel.OperatorType;
11 11
 import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
12
+import org.openzen.zenscript.codemodel.scope.TypeScope;
12 13
 
13 14
 /**
14 15
  * Used for post-increment and post-decrement.
@@ -41,4 +42,9 @@ public class PostCallExpression extends Expression {
41 42
 		Expression tTarget = target.transform(transformer);
42 43
 		return target == tTarget ? this : new PostCallExpression(position, tTarget, member, instancedHeader);
43 44
 	}
45
+
46
+	@Override
47
+	public Expression normalize(TypeScope scope) {
48
+		return new PostCallExpression(position, target.normalize(scope), member, instancedHeader.normalize(scope.getTypeRegistry()));
49
+	}
44 50
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/RangeExpression.java View File

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9 10
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
10 11
 import org.openzen.zenscript.codemodel.type.ITypeID;
11 12
 
@@ -42,4 +43,9 @@ public class RangeExpression extends Expression {
42 43
 		Expression tTo = to.transform(transformer);
43 44
 		return tFrom == from && tTo == to ? this : new RangeExpression(position, type, tFrom, tTo, thrownType);
44 45
 	}
46
+
47
+	@Override
48
+	public Expression normalize(TypeScope scope) {
49
+		return new RangeExpression(position, scope.getTypeRegistry(), from.normalize(scope), to.normalize(scope));
50
+	}
45 51
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/SameObjectExpression.java View File

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9 10
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10 11
 
11 12
 /**
@@ -36,4 +37,9 @@ public class SameObjectExpression extends Expression {
36 37
 		Expression tRight = right.transform(transformer);
37 38
 		return tLeft == left && tRight == right ? this : new SameObjectExpression(position, tLeft, tRight, inverted);
38 39
 	}
40
+
41
+	@Override
42
+	public Expression normalize(TypeScope scope) {
43
+		return new SameObjectExpression(position, left.normalize(scope), right.normalize(scope), inverted);
44
+	}
39 45
 }

+ 7
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/SetFieldExpression.java View File

@@ -7,6 +7,7 @@ package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.member.ref.FieldMemberRef;
10
+import org.openzen.zenscript.codemodel.scope.TypeScope;
10 11
 
11 12
 /**
12 13
  *
@@ -18,7 +19,7 @@ public class SetFieldExpression extends Expression {
18 19
 	public final Expression value;
19 20
 	
20 21
 	public SetFieldExpression(CodePosition position, Expression target, FieldMemberRef field, Expression value) {
21
-		super(position, field.type, binaryThrow(position, target.thrownType, value.thrownType));
22
+		super(position, field.getType(), binaryThrow(position, target.thrownType, value.thrownType));
22 23
 		
23 24
 		this.target = target;
24 25
 		this.field = field;
@@ -38,4 +39,9 @@ public class SetFieldExpression extends Expression {
38 39
 				? this
39 40
 				: new SetFieldExpression(position, tTarget, field, tValue);
40 41
 	}
42
+
43
+	@Override
44
+	public Expression normalize(TypeScope scope) {
45
+		return new SetFieldExpression(position, target, field, value.normalize(scope));
46
+	}
41 47
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/SetFunctionParameterExpression.java View File

@@ -7,6 +7,7 @@ package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.FunctionParameter;
10
+import org.openzen.zenscript.codemodel.scope.TypeScope;
10 11
 
11 12
 /**
12 13
  *
@@ -33,4 +34,9 @@ public class SetFunctionParameterExpression extends Expression {
33 34
 		Expression tValue = value.transform(transformer);
34 35
 		return tValue == value ? this : new SetFunctionParameterExpression(position, parameter, tValue);
35 36
 	}
37
+
38
+	@Override
39
+	public Expression normalize(TypeScope scope) {
40
+		return new SetFunctionParameterExpression(position, parameter, value.normalize(scope));
41
+	}
36 42
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/SetLocalVariableExpression.java View File

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9 10
 import org.openzen.zenscript.codemodel.statement.VarStatement;
10 11
 
11 12
 /**
@@ -33,4 +34,9 @@ public class SetLocalVariableExpression extends Expression {
33 34
 		Expression tValue = value.transform(transformer);
34 35
 		return tValue == value ? this : new SetLocalVariableExpression(position, variable, tValue);
35 36
 	}
37
+
38
+	@Override
39
+	public Expression normalize(TypeScope scope) {
40
+		return new SetLocalVariableExpression(position, variable, value.normalize(scope));
41
+	}
36 42
 }

+ 7
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/SetStaticFieldExpression.java View File

@@ -7,6 +7,7 @@ package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.member.ref.FieldMemberRef;
10
+import org.openzen.zenscript.codemodel.scope.TypeScope;
10 11
 
11 12
 /**
12 13
  *
@@ -17,7 +18,7 @@ public class SetStaticFieldExpression extends Expression {
17 18
 	public final Expression value;
18 19
 	
19 20
 	public SetStaticFieldExpression(CodePosition position, FieldMemberRef field, Expression value) {
20
-		super(position, field.type, value.thrownType);
21
+		super(position, field.getType(), value.thrownType);
21 22
 		
22 23
 		this.field = field;
23 24
 		this.value = value;
@@ -33,4 +34,9 @@ public class SetStaticFieldExpression extends Expression {
33 34
 		Expression tValue = value.transform(transformer);
34 35
 		return value == tValue ? this : new SetStaticFieldExpression(position, field, tValue);
35 36
 	}
37
+
38
+	@Override
39
+	public Expression normalize(TypeScope scope) {
40
+		return new SetStaticFieldExpression(position, field, value.normalize(scope));
41
+	}
36 42
 }

+ 7
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/SetterExpression.java View File

@@ -7,6 +7,7 @@ package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.member.ref.SetterMemberRef;
10
+import org.openzen.zenscript.codemodel.scope.TypeScope;
10 11
 
11 12
 /**
12 13
  *
@@ -18,7 +19,7 @@ public class SetterExpression extends Expression {
18 19
 	public final Expression value;
19 20
 	
20 21
 	public SetterExpression(CodePosition position, Expression target, SetterMemberRef setter, Expression value) {
21
-		super(position, setter.type, value.thrownType);
22
+		super(position, setter.getType(), value.thrownType);
22 23
 		
23 24
 		this.target = target;
24 25
 		this.setter = setter;
@@ -36,4 +37,9 @@ public class SetterExpression extends Expression {
36 37
 		Expression tValue = value.transform(transformer);
37 38
 		return tTarget == target && tValue == value ? this : new SetterExpression(position, tTarget, setter, tValue);
38 39
 	}
40
+
41
+	@Override
42
+	public Expression normalize(TypeScope scope) {
43
+		return new SetterExpression(position, target.normalize(scope), setter, value.normalize(scope));
44
+	}
39 45
 }

+ 7
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/StaticGetterExpression.java View File

@@ -7,6 +7,7 @@ package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.member.ref.GetterMemberRef;
10
+import org.openzen.zenscript.codemodel.scope.TypeScope;
10 11
 
11 12
 /**
12 13
  *
@@ -16,7 +17,7 @@ public class StaticGetterExpression extends Expression {
16 17
 	public final GetterMemberRef getter;
17 18
 	
18 19
 	public StaticGetterExpression(CodePosition position, GetterMemberRef getter) {
19
-		super(position, getter.type, null);
20
+		super(position, getter.getType(), null);
20 21
 		
21 22
 		this.getter = getter;
22 23
 	}
@@ -30,4 +31,9 @@ public class StaticGetterExpression extends Expression {
30 31
 	public Expression transform(ExpressionTransformer transformer) {
31 32
 		return this;
32 33
 	}
34
+
35
+	@Override
36
+	public Expression normalize(TypeScope scope) {
37
+		return this;
38
+	}
33 39
 }

+ 7
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/StaticSetterExpression.java View File

@@ -7,6 +7,7 @@ package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.member.ref.SetterMemberRef;
10
+import org.openzen.zenscript.codemodel.scope.TypeScope;
10 11
 
11 12
 /**
12 13
  *
@@ -17,7 +18,7 @@ public class StaticSetterExpression extends Expression {
17 18
 	public final Expression value;
18 19
 	
19 20
 	public StaticSetterExpression(CodePosition position, SetterMemberRef setter, Expression value) {
20
-		super(position, setter.type, value.thrownType);
21
+		super(position, setter.getType(), value.thrownType);
21 22
 		
22 23
 		this.setter = setter;
23 24
 		this.value = value;
@@ -33,4 +34,9 @@ public class StaticSetterExpression extends Expression {
33 34
 		Expression tValue = value.transform(transformer);
34 35
 		return tValue == value ? this : new StaticSetterExpression(position, setter, tValue);
35 36
 	}
37
+
38
+	@Override
39
+	public Expression normalize(TypeScope scope) {
40
+		return new StaticSetterExpression(position, setter, value.normalize(scope));
41
+	}
36 42
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/SupertypeCastExpression.java View File

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9 10
 import org.openzen.zenscript.codemodel.type.ITypeID;
10 11
 
11 12
 /**
@@ -32,4 +33,9 @@ public class SupertypeCastExpression extends Expression {
32 33
 		Expression tValue = value.transform(transformer);
33 34
 		return tValue == value ? this : new SupertypeCastExpression(position, tValue, type);
34 35
 	}
36
+
37
+	@Override
38
+	public Expression normalize(TypeScope scope) {
39
+		return new SupertypeCastExpression(position, value.normalize(scope), type.getNormalized());
40
+	}
35 41
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ThisExpression.java View File

@@ -7,6 +7,7 @@ package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.partial.IPartialExpression;
10
+import org.openzen.zenscript.codemodel.scope.TypeScope;
10 11
 import org.openzen.zenscript.codemodel.type.ITypeID;
11 12
 
12 13
 /**
@@ -34,4 +35,9 @@ public class ThisExpression extends Expression {
34 35
 	public Expression transform(ExpressionTransformer transformer) {
35 36
 		return this;
36 37
 	}
38
+
39
+	@Override
40
+	public Expression normalize(TypeScope scope) {
41
+		return this;
42
+	}
37 43
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ThrowExpression.java View File

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9 10
 import org.openzen.zenscript.codemodel.type.ITypeID;
10 11
 
11 12
 /**
@@ -36,4 +37,9 @@ public class ThrowExpression extends Expression {
36 37
 		Expression tValue = transformer.transform(value);
37 38
 		return tValue == value ? this : new ThrowExpression(position, type, value);
38 39
 	}
40
+
41
+	@Override
42
+	public Expression normalize(TypeScope scope) {
43
+		return new ThrowExpression(position, type, value.normalize(scope));
44
+	}
39 45
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/TryConvertExpression.java View File

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9 10
 import org.openzen.zenscript.codemodel.type.ITypeID;
10 11
 
11 12
 /**
@@ -31,4 +32,9 @@ public class TryConvertExpression extends Expression {
31 32
 		Expression tValue = value.transform(transformer);
32 33
 		return tValue == value ? this : new TryConvertExpression(position, type, tValue);
33 34
 	}
35
+
36
+	@Override
37
+	public Expression normalize(TypeScope scope) {
38
+		return new TryConvertExpression(position, type, value.normalize(scope));
39
+	}
34 40
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/TryRethrowAsExceptionExpression.java View File

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9 10
 import org.openzen.zenscript.codemodel.type.ITypeID;
10 11
 
11 12
 /**
@@ -31,4 +32,9 @@ public class TryRethrowAsExceptionExpression extends Expression {
31 32
 		Expression tValue = value.transform(transformer);
32 33
 		return tValue == value ? this : new TryRethrowAsExceptionExpression(position, type, tValue, thrownType);
33 34
 	}
35
+
36
+	@Override
37
+	public Expression normalize(TypeScope scope) {
38
+		return new TryRethrowAsExceptionExpression(position, type, value.normalize(scope), thrownType.getNormalized());
39
+	}
34 40
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/TryRethrowAsResultExpression.java View File

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9 10
 import org.openzen.zenscript.codemodel.type.ITypeID;
10 11
 
11 12
 /**
@@ -31,4 +32,9 @@ public class TryRethrowAsResultExpression extends Expression {
31 32
 		Expression tValue = value.transform(transformer);
32 33
 		return tValue == value ? this : new TryRethrowAsResultExpression(position, type, tValue);
33 34
 	}
35
+
36
+	@Override
37
+	public Expression normalize(TypeScope scope) {
38
+		return new TryRethrowAsResultExpression(position, type, value.normalize(scope));
39
+	}
34 40
 }

+ 8
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/VariantValueExpression.java View File

@@ -52,4 +52,12 @@ public class VariantValueExpression extends Expression {
52 52
 		Expression[] tArguments = Expression.transform(arguments, transformer);
53 53
 		return tArguments == arguments ? this : new VariantValueExpression(position, type, option, tArguments);
54 54
 	}
55
+
56
+	@Override
57
+	public Expression normalize(TypeScope scope) {
58
+		Expression[] normalized = new Expression[arguments.length];
59
+		for (int i = 0; i < normalized.length; i++)
60
+			normalized[i] = arguments[i].normalize(scope);
61
+		return new VariantValueExpression(position, type, option, normalized);
62
+	}
55 63
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/WrapOptionalExpression.java View File

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9 10
 import org.openzen.zenscript.codemodel.type.ITypeID;
10 11
 
11 12
 /**
@@ -34,4 +35,9 @@ public class WrapOptionalExpression extends Expression {
34 35
 		Expression tValue = value.transform(transformer);
35 36
 		return tValue == value ? this : new WrapOptionalExpression(position, tValue, type);
36 37
 	}
38
+
39
+	@Override
40
+	public Expression normalize(TypeScope scope) {
41
+		return new WrapOptionalExpression(position, value.normalize(scope), type);
42
+	}
37 43
 }

+ 1
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/CallerMember.java View File

@@ -11,6 +11,7 @@ import org.openzen.zenscript.codemodel.GenericMapper;
11 11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12 12
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
13 13
 import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
14
+import org.openzen.zenscript.codemodel.scope.TypeScope;
14 15
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
15 16
 import org.openzen.zenscript.codemodel.type.member.BuiltinID;
16 17
 import org.openzen.zenscript.codemodel.type.member.TypeMemberPriority;

+ 9
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/CasterMember.java View File

@@ -11,6 +11,7 @@ import org.openzen.zenscript.codemodel.GenericMapper;
11 11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12 12
 import org.openzen.zenscript.codemodel.Modifiers;
13 13
 import org.openzen.zenscript.codemodel.member.ref.CasterMemberRef;
14
+import org.openzen.zenscript.codemodel.scope.TypeScope;
14 15
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
15 16
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
16 17
 import org.openzen.zenscript.codemodel.type.ITypeID;
@@ -22,7 +23,7 @@ import org.openzen.zenscript.codemodel.type.member.TypeMemberPriority;
22 23
  * @author Hoofdgebruiker
23 24
  */
24 25
 public class CasterMember extends FunctionalMember {
25
-	public final ITypeID toType;
26
+	public ITypeID toType;
26 27
 	public CasterMemberRef overrides;
27 28
 	
28 29
 	public CasterMember(
@@ -49,7 +50,7 @@ public class CasterMember extends FunctionalMember {
49 50
 
50 51
 	@Override
51 52
 	public void registerTo(TypeMembers type, TypeMemberPriority priority, GenericMapper mapper) {
52
-		type.addCaster(new CasterMemberRef(this, mapper.map(toType)), priority);
53
+		type.addCaster(new CasterMemberRef(this, mapper == null ? toType : mapper.map(toType)), priority);
53 54
 	}
54 55
 
55 56
 	@Override
@@ -78,4 +79,10 @@ public class CasterMember extends FunctionalMember {
78 79
 	public CasterMemberRef getOverrides() {
79 80
 		return overrides;
80 81
 	}
82
+	
83
+	@Override
84
+	public void normalize(TypeScope scope) {
85
+		super.normalize(scope);
86
+		toType = toType.getNormalized();
87
+	}
81 88
 }

+ 10
- 5
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ConstMember.java View File

@@ -11,6 +11,7 @@ import org.openzen.zenscript.codemodel.HighLevelDefinition;
11 11
 import org.openzen.zenscript.codemodel.expression.Expression;
12 12
 import org.openzen.zenscript.codemodel.member.ref.ConstMemberRef;
13 13
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
14
+import org.openzen.zenscript.codemodel.scope.TypeScope;
14 15
 import org.openzen.zenscript.codemodel.type.ITypeID;
15 16
 import org.openzen.zenscript.codemodel.type.member.BuiltinID;
16 17
 import org.openzen.zenscript.codemodel.type.member.TypeMemberPriority;
@@ -20,17 +21,15 @@ import org.openzen.zenscript.codemodel.type.member.TypeMembers;
20 21
  *
21 22
  * @author Hoofdgebruiker
22 23
  */
23
-public class ConstMember extends DefinitionMember {
24
+public class ConstMember extends PropertyMember {
24 25
 	public final String name;
25
-	public ITypeID type;
26 26
 	public Expression value;
27 27
 	public final BuiltinID builtin;
28 28
 	
29 29
 	public ConstMember(CodePosition position, HighLevelDefinition definition, int modifiers, String name, ITypeID type, BuiltinID builtin) {
30
-		super(position, definition, modifiers);
30
+		super(position, definition, modifiers, type, null);
31 31
 		
32 32
 		this.name = name;
33
-		this.type = type;
34 33
 		this.builtin = builtin;
35 34
 	}
36 35
 
@@ -46,7 +45,7 @@ public class ConstMember extends DefinitionMember {
46 45
 
47 46
 	@Override
48 47
 	public void registerTo(TypeMembers members, TypeMemberPriority priority, GenericMapper mapper) {
49
-		members.addConst(new ConstMemberRef(this, mapper.map(type)));
48
+		members.addConst(new ConstMemberRef(this, mapper));
50 49
 	}
51 50
 
52 51
 	@Override
@@ -58,4 +57,10 @@ public class ConstMember extends DefinitionMember {
58 57
 	public DefinitionMemberRef getOverrides() {
59 58
 		return null;
60 59
 	}
60
+
61
+	@Override
62
+	public void normalize(TypeScope scope) {
63
+		type = type.getNormalized();
64
+		value = value.normalize(scope);
65
+	}
61 66
 }

+ 19
- 3
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/CustomIteratorMember.java View File

@@ -6,12 +6,14 @@
6 6
 package org.openzen.zenscript.codemodel.member;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.FunctionHeader;
9 10
 import org.openzen.zenscript.codemodel.GenericMapper;
10 11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
11 12
 import org.openzen.zenscript.codemodel.iterator.ForeachIteratorVisitor;
12 13
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
13 14
 import org.openzen.zenscript.codemodel.member.ref.IteratorMemberRef;
14 15
 import org.openzen.zenscript.codemodel.statement.Statement;
16
+import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
15 17
 import org.openzen.zenscript.codemodel.type.ITypeID;
16 18
 import org.openzen.zenscript.codemodel.type.member.BuiltinID;
17 19
 import org.openzen.zenscript.codemodel.type.member.TypeMemberPriority;
@@ -21,13 +23,13 @@ import org.openzen.zenscript.codemodel.type.member.TypeMembers;
21 23
  *
22 24
  * @author Hoofdgebruiker
23 25
  */
24
-public class CustomIteratorMember extends DefinitionMember implements IIteratorMember {
26
+public class CustomIteratorMember extends FunctionalMember implements IIteratorMember {
25 27
 	private final ITypeID[] iteratorTypes;
26 28
 	public Statement body;
27 29
 	public IteratorMemberRef overrides;
28 30
 	
29
-	public CustomIteratorMember(CodePosition position, HighLevelDefinition definition, int modifiers, ITypeID[] iteratorTypes) {
30
-		super(position, definition, modifiers);
31
+	public CustomIteratorMember(CodePosition position, HighLevelDefinition definition, int modifiers, ITypeID[] iteratorTypes, GlobalTypeRegistry registry, BuiltinID builtin) {
32
+		super(position, definition, modifiers, createIteratorHeader(registry, iteratorTypes), builtin);
31 33
 		
32 34
 		this.iteratorTypes = iteratorTypes;
33 35
 	}
@@ -35,6 +37,11 @@ public class CustomIteratorMember extends DefinitionMember implements IIteratorM
35 37
 	public void setContent(Statement body) {
36 38
 		this.body = body;
37 39
 	}
40
+	
41
+	@Override
42
+	public String getCanonicalName() {
43
+		return definition.getFullName() + ":iterator:" + iteratorTypes.length;
44
+	}
38 45
 
39 46
 	@Override
40 47
 	public int getLoopVariableCount() {
@@ -79,4 +86,13 @@ public class CustomIteratorMember extends DefinitionMember implements IIteratorM
79 86
 	public DefinitionMemberRef getOverrides() {
80 87
 		return overrides;
81 88
 	}
89
+	
90
+	@Override
91
+	public FunctionalKind getKind() {
92
+		return FunctionalKind.ITERATOR;
93
+	}
94
+	
95
+	private static FunctionHeader createIteratorHeader(GlobalTypeRegistry registry, ITypeID[] iteratorTypes) {
96
+		return new FunctionHeader(registry.getIterator(iteratorTypes));
97
+	}
82 98
 }

+ 4
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/DefinitionMember.java View File

@@ -32,6 +32,10 @@ public abstract class DefinitionMember extends Taggable implements IDefinitionMe
32 32
 		return position;
33 33
 	}
34 34
 	
35
+	public MemberAnnotation[] getAnnotations() {
36
+		return annotations;
37
+	}
38
+	
35 39
 	public boolean isStatic() {
36 40
 		return Modifiers.isStatic(modifiers);
37 41
 	}

+ 20
- 17
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/FieldMember.java View File

@@ -15,9 +15,9 @@ import org.openzen.zenscript.codemodel.expression.SetFieldExpression;
15 15
 import org.openzen.zenscript.codemodel.expression.ThisExpression;
16 16
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
17 17
 import org.openzen.zenscript.codemodel.member.ref.FieldMemberRef;
18
+import org.openzen.zenscript.codemodel.scope.TypeScope;
18 19
 import org.openzen.zenscript.codemodel.statement.ExpressionStatement;
19 20
 import org.openzen.zenscript.codemodel.statement.ReturnStatement;
20
-import org.openzen.zenscript.codemodel.type.GenericTypeID;
21 21
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
22 22
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
23 23
 import org.openzen.zenscript.codemodel.type.ITypeID;
@@ -28,13 +28,11 @@ import org.openzen.zenscript.codemodel.type.member.TypeMemberPriority;
28 28
  *
29 29
  * @author Hoofdgebruiker
30 30
  */
31
-public class FieldMember extends DefinitionMember {
31
+public class FieldMember extends PropertyMember {
32 32
 	public final String name;
33
-	public ITypeID type;
34 33
 	public Expression initializer;
35 34
 	public final int autoGetterAccess;
36 35
 	public final int autoSetterAccess;
37
-	public final BuiltinID builtin;
38 36
 	
39 37
 	public final GetterMember autoGetter;
40 38
 	public final SetterMember autoSetter;
@@ -44,41 +42,41 @@ public class FieldMember extends DefinitionMember {
44 42
 			HighLevelDefinition definition,
45 43
 			int modifiers,
46 44
 			String name,
45
+			ITypeID thisType,
47 46
 			ITypeID type,
48 47
 			GlobalTypeRegistry registry,
49 48
 			int autoGetterAccess,
50 49
 			int autoSetterAccess,
51 50
 			BuiltinID builtin)
52 51
 	{
53
-		super(position, definition, modifiers);
52
+		super(position, definition, modifiers, type, builtin);
54 53
 		
55 54
 		this.name = name;
56
-		this.type = type;
57 55
 		this.autoGetterAccess = autoGetterAccess;
58 56
 		this.autoSetterAccess = autoSetterAccess;
59
-		this.builtin = builtin;
60 57
 		
61 58
 		ITypeID[] parameters = null;
62 59
 		if (definition.genericParameters != null) {
63 60
 			parameters = new ITypeID[definition.genericParameters.length];
64 61
 			for (int i = 0; i < parameters.length; i++)
65
-				parameters[i] = new GenericTypeID(definition.genericParameters[i]);
62
+				parameters[i] = registry.getGeneric(definition.genericParameters[i]);
66 63
 		}
67 64
 		
68 65
 		if (autoGetterAccess != 0) {
69
-			ITypeID myType = registry.getForDefinition(definition, parameters);
70 66
 			this.autoGetter = new GetterMember(position, definition, autoGetterAccess, name, type, null);
71
-			this.autoGetter.setBody(new ReturnStatement(position, new GetFieldExpression(position, new ThisExpression(position, myType), new FieldMemberRef(this, myType))));
67
+			this.autoGetter.setBody(new ReturnStatement(position, new GetFieldExpression(
68
+					position,
69
+					new ThisExpression(position, thisType),
70
+					new FieldMemberRef(this, null))));
72 71
 		} else {
73 72
 			this.autoGetter = null;
74 73
 		}
75 74
 		if (autoSetterAccess != 0) {
76
-			ITypeID myType = registry.getForDefinition(definition, parameters);
77 75
 			this.autoSetter = new SetterMember(position, definition, autoSetterAccess, name, type, null);
78 76
 			this.autoSetter.setBody(new ExpressionStatement(position, new SetFieldExpression(
79 77
 					position,
80
-					new ThisExpression(position, myType),
81
-					new FieldMemberRef(this, myType),
78
+					new ThisExpression(position, thisType),
79
+					new FieldMemberRef(this, null),
82 80
 					new GetFunctionParameterExpression(position, this.autoSetter.header.parameters[0]))));
83 81
 		} else {
84 82
 			this.autoSetter = null;
@@ -97,15 +95,13 @@ public class FieldMember extends DefinitionMember {
97 95
 			SetterMember autoSetter,
98 96
 			BuiltinID builtin)
99 97
 	{
100
-		super(position, definition, modifiers);
98
+		super(position, definition, modifiers, type, builtin);
101 99
 		
102 100
 		this.name = name;
103
-		this.type = type;
104 101
 		this.autoGetterAccess = autoGetterAccess;
105 102
 		this.autoSetterAccess = autoSetterAccess;
106 103
 		this.autoGetter = autoGetter;
107 104
 		this.autoSetter = autoSetter;
108
-		this.builtin = builtin;
109 105
 	}
110 106
 	
111 107
 	public boolean hasAutoGetter() {
@@ -122,7 +118,7 @@ public class FieldMember extends DefinitionMember {
122 118
 
123 119
 	@Override
124 120
 	public void registerTo(TypeMembers members, TypeMemberPriority priority, GenericMapper mapper) {
125
-		members.addField(new FieldMemberRef(this, mapper.map(type)), priority);
121
+		members.addField(new FieldMemberRef(this, mapper), priority);
126 122
 	}
127 123
 	
128 124
 	@Override
@@ -144,4 +140,11 @@ public class FieldMember extends DefinitionMember {
144 140
 	public DefinitionMemberRef getOverrides() {
145 141
 		return null;
146 142
 	}
143
+
144
+	@Override
145
+	public void normalize(TypeScope scope) {
146
+		type = type.getNormalized();
147
+		if (initializer != null)
148
+			initializer = initializer.normalize(scope);
149
+	}
147 150
 }

+ 2
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/FunctionalKind.java View File

@@ -17,5 +17,6 @@ public enum FunctionalKind {
17 17
 	GETTER,
18 18
 	SETTER,
19 19
 	CALLER,
20
-	CASTER
20
+	CASTER,
21
+	ITERATOR
21 22
 }

+ 11
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/FunctionalMember.java View File

@@ -6,10 +6,13 @@
6 6
 package org.openzen.zenscript.codemodel.member;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zencode.shared.ConcatMap;
9 10
 import org.openzen.zenscript.codemodel.FunctionHeader;
10 11
 import org.openzen.zenscript.codemodel.GenericMapper;
11 12
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12 13
 import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
14
+import org.openzen.zenscript.codemodel.scope.TypeScope;
15
+import org.openzen.zenscript.codemodel.statement.LoopStatement;
13 16
 import org.openzen.zenscript.codemodel.statement.Statement;
14 17
 import org.openzen.zenscript.codemodel.type.member.BuiltinID;
15 18
 
@@ -43,11 +46,18 @@ public abstract class FunctionalMember extends DefinitionMember {
43 46
 	public abstract FunctionalKind getKind();
44 47
 	
45 48
 	public FunctionalMemberRef ref(GenericMapper mapper) {
46
-		return new FunctionalMemberRef(this, mapper.map(header));
49
+		return new FunctionalMemberRef(this, mapper);
47 50
 	}
48 51
 	
49 52
 	@Override
50 53
 	public BuiltinID getBuiltin() {
51 54
 		return builtin;
52 55
 	}
56
+
57
+	@Override
58
+	public void normalize(TypeScope scope) {
59
+		header = header.normalize(scope.getTypeRegistry());
60
+		if (body != null)
61
+			body = body.normalize(scope, ConcatMap.empty(LoopStatement.class, LoopStatement.class));
62
+	}
53 63
 }

+ 8
- 4
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/GetterMember.java View File

@@ -9,7 +9,6 @@ import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.FunctionHeader;
10 10
 import org.openzen.zenscript.codemodel.GenericMapper;
11 11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
-import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
13 12
 import org.openzen.zenscript.codemodel.member.ref.GetterMemberRef;
14 13
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
15 14
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
@@ -21,7 +20,7 @@ import org.openzen.zenscript.codemodel.type.member.TypeMemberPriority;
21 20
  *
22 21
  * @author Hoofdgebruiker
23 22
  */
24
-public class GetterMember extends FunctionalMember {
23
+public class GetterMember extends FunctionalMember implements IPropertyMember {
25 24
 	public final String name;
26 25
 	public ITypeID type;
27 26
 	private GetterMemberRef overrides;
@@ -39,6 +38,11 @@ public class GetterMember extends FunctionalMember {
39 38
 		this.type = type;
40 39
 	}
41 40
 	
41
+	@Override
42
+	public ITypeID getType() {
43
+		return type;
44
+	}
45
+	
42 46
 	@Override
43 47
 	public String getCanonicalName() {
44 48
 		return definition.getFullName() + ":getter:" + name;
@@ -51,7 +55,7 @@ public class GetterMember extends FunctionalMember {
51 55
 	
52 56
 	@Override
53 57
 	public void registerTo(TypeMembers members, TypeMemberPriority priority, GenericMapper mapper) {
54
-		members.addGetter(new GetterMemberRef(this, mapper.map(type)), priority);
58
+		members.addGetter(new GetterMemberRef(this, mapper), priority);
55 59
 	}
56 60
 
57 61
 	@Override
@@ -73,6 +77,6 @@ public class GetterMember extends FunctionalMember {
73 77
 		this.overrides = override;
74 78
 		
75 79
 		if (type == BasicTypeID.UNDETERMINED)
76
-			type = override.type;
80
+			type = override.getType();
77 81
 	}
78 82
 }

+ 3
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/IDefinitionMember.java View File

@@ -9,6 +9,7 @@ import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.FunctionHeader;
10 10
 import org.openzen.zenscript.codemodel.GenericMapper;
11 11
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
12
+import org.openzen.zenscript.codemodel.scope.TypeScope;
12 13
 import org.openzen.zenscript.codemodel.type.member.BuiltinID;
13 14
 import org.openzen.zenscript.codemodel.type.member.TypeMemberPriority;
14 15
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
@@ -35,4 +36,6 @@ public interface IDefinitionMember {
35 36
 	<T> boolean hasTag(Class<T> tag);
36 37
 	
37 38
 	DefinitionMemberRef getOverrides();
39
+
40
+	public void normalize(TypeScope scope);
38 41
 }

+ 31
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/IPropertyMember.java View File

@@ -0,0 +1,31 @@
1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.codemodel.member;
7
+
8
+import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.FunctionHeader;
10
+import org.openzen.zenscript.codemodel.annotations.MemberAnnotation;
11
+import org.openzen.zenscript.codemodel.type.ITypeID;
12
+
13
+/**
14
+ *
15
+ * @author Hoofdgebruiker
16
+ */
17
+public interface IPropertyMember {
18
+	ITypeID getType();
19
+	
20
+	CodePosition getPosition();
21
+	
22
+	String describe();
23
+
24
+	<T> T getTag(Class<T> type);
25
+	
26
+	boolean isStatic();
27
+	
28
+	boolean isFinal();
29
+	
30
+	MemberAnnotation[] getAnnotations();
31
+}

+ 0
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ImplementationMember.java View File


Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save