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
 		output.append(definition.name);
42
 		output.append(definition.name);
43
 		FormattingUtils.formatTypeParameters(output, definition.genericParameters, typeFormatter);
43
 		FormattingUtils.formatTypeParameters(output, definition.genericParameters, typeFormatter);
44
 		output.append(" ");
44
 		output.append(" ");
45
-		if (definition.superType != null) {
45
+		if (definition.getSuperType() != null) {
46
 			output.append("extends ");
46
 			output.append("extends ");
47
-			output.append(definition.superType.accept(typeFormatter));
47
+			output.append(definition.getSuperType().accept(typeFormatter));
48
 			output.append(" ");
48
 			output.append(" ");
49
 		}
49
 		}
50
 		if (settings.classBracketOnSameLine) {
50
 		if (settings.classBracketOnSameLine) {

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

13
 import org.openzen.zenscript.codemodel.type.ArrayTypeID;
13
 import org.openzen.zenscript.codemodel.type.ArrayTypeID;
14
 import org.openzen.zenscript.codemodel.type.AssocTypeID;
14
 import org.openzen.zenscript.codemodel.type.AssocTypeID;
15
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
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
 import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
17
 import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
18
 import org.openzen.zenscript.codemodel.type.FunctionTypeID;
18
 import org.openzen.zenscript.codemodel.type.FunctionTypeID;
19
 import org.openzen.zenscript.codemodel.type.GenericMapTypeID;
19
 import org.openzen.zenscript.codemodel.type.GenericMapTypeID;
21
 import org.openzen.zenscript.codemodel.type.ITypeID;
21
 import org.openzen.zenscript.codemodel.type.ITypeID;
22
 import org.openzen.zenscript.codemodel.type.ITypeVisitor;
22
 import org.openzen.zenscript.codemodel.type.ITypeVisitor;
23
 import org.openzen.zenscript.codemodel.type.IteratorTypeID;
23
 import org.openzen.zenscript.codemodel.type.IteratorTypeID;
24
-import org.openzen.zenscript.codemodel.type.OptionalTypeID;
25
 import org.openzen.zenscript.codemodel.type.RangeTypeID;
24
 import org.openzen.zenscript.codemodel.type.RangeTypeID;
26
 import stdlib.Chars;
25
 import stdlib.Chars;
27
 
26
 
102
 	}
101
 	}
103
 
102
 
104
 	@Override
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
 	@Override
117
 	@Override

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

17
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
17
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
18
 import org.openzen.zenscript.codemodel.type.ITypeID;
18
 import org.openzen.zenscript.codemodel.type.ITypeID;
19
 import org.openzen.zenscript.codemodel.scope.TypeScope;
19
 import org.openzen.zenscript.codemodel.scope.TypeScope;
20
-import org.openzen.zenscript.codemodel.type.GenericTypeID;
21
 import org.openzen.zenscript.codemodel.type.member.LocalMemberCache;
20
 import org.openzen.zenscript.codemodel.type.member.LocalMemberCache;
22
 
21
 
23
 /**
22
 /**
28
 	private static final FunctionParameter[] NO_PARAMETERS = new FunctionParameter[0];
27
 	private static final FunctionParameter[] NO_PARAMETERS = new FunctionParameter[0];
29
 	
28
 	
30
 	public final TypeParameter[] typeParameters;
29
 	public final TypeParameter[] typeParameters;
31
-	public final ITypeID returnType;
30
+	public ITypeID returnType;
32
 	public final FunctionParameter[] parameters;
31
 	public final FunctionParameter[] parameters;
33
 	public final ITypeID thrownType;
32
 	public final ITypeID thrownType;
34
 	
33
 	
64
 		
63
 		
65
 		minParameters = parameterTypes.length;
64
 		minParameters = parameterTypes.length;
66
 		maxParameters = parameterTypes.length;
65
 		maxParameters = parameterTypes.length;
67
-		hasUnknowns = hasUnknowns(parameterTypes);
66
+		hasUnknowns = hasUnknowns(parameterTypes, returnType);
68
 	}
67
 	}
69
 	
68
 	
70
 	public FunctionHeader(ITypeID returnType, FunctionParameter... parameters) {
69
 	public FunctionHeader(ITypeID returnType, FunctionParameter... parameters) {
78
 		
77
 		
79
 		minParameters = getMinParameters(parameters);
78
 		minParameters = getMinParameters(parameters);
80
 		maxParameters = getMaxParameters(parameters);
79
 		maxParameters = getMaxParameters(parameters);
81
-		hasUnknowns = hasUnknowns(parameters);
80
+		hasUnknowns = hasUnknowns(parameters, returnType);
82
 	}
81
 	}
83
 	
82
 	
84
 	public FunctionHeader(TypeParameter[] genericParameters, ITypeID returnType, ITypeID thrownType, FunctionParameter... parameters) {
83
 	public FunctionHeader(TypeParameter[] genericParameters, ITypeID returnType, ITypeID thrownType, FunctionParameter... parameters) {
94
 		
93
 		
95
 		minParameters = getMinParameters(parameters);
94
 		minParameters = getMinParameters(parameters);
96
 		maxParameters = getMaxParameters(parameters);
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
 	public int getNumberOfTypeParameters() {
119
 	public int getNumberOfTypeParameters() {
107
 	
126
 	
108
 	public FunctionHeader inferFromOverride(GlobalTypeRegistry registry, FunctionHeader overridden) {
127
 	public FunctionHeader inferFromOverride(GlobalTypeRegistry registry, FunctionHeader overridden) {
109
 		TypeParameter[] resultTypeParameters = typeParameters;
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
 		ITypeID resultReturnType = this.returnType;
129
 		ITypeID resultReturnType = this.returnType;
122
 		if (resultReturnType == BasicTypeID.UNDETERMINED)
130
 		if (resultReturnType == BasicTypeID.UNDETERMINED)
123
-			resultReturnType = overridden.returnType.instance(mapper);
131
+			resultReturnType = overridden.returnType;
124
 		
132
 		
125
 		ITypeID resultThrownType = this.thrownType;
133
 		ITypeID resultThrownType = this.thrownType;
126
 		if (resultThrownType == null && overridden.thrownType != null)
134
 		if (resultThrownType == null && overridden.thrownType != null)
127
-			resultThrownType = overridden.thrownType.instance(mapper);
135
+			resultThrownType = overridden.thrownType;
128
 		
136
 		
129
 		FunctionParameter[] resultParameters = Arrays.copyOf(parameters, parameters.length);
137
 		FunctionParameter[] resultParameters = Arrays.copyOf(parameters, parameters.length);
130
 		for (int i = 0; i < resultParameters.length; i++) {
138
 		for (int i = 0; i < resultParameters.length; i++) {
131
 			if (resultParameters[i].type == BasicTypeID.UNDETERMINED) {
139
 			if (resultParameters[i].type == BasicTypeID.UNDETERMINED) {
132
 				FunctionParameter parameter = resultParameters[i];
140
 				FunctionParameter parameter = resultParameters[i];
133
 				FunctionParameter original = overridden.parameters[i];
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
 		if (arguments.arguments.length < minParameters || arguments.arguments.length > maxParameters)
150
 		if (arguments.arguments.length < minParameters || arguments.arguments.length > maxParameters)
143
 			return false;
151
 			return false;
144
 		
152
 		
145
-		FunctionHeader header = fillGenericArguments(scope.getTypeRegistry(), arguments.typeArguments);
153
+		FunctionHeader header = fillGenericArguments(scope.getTypeRegistry(), arguments.typeArguments, scope.getLocalTypeParameters());
146
 		for (int i = 0; i < header.parameters.length; i++) {
154
 		for (int i = 0; i < header.parameters.length; i++) {
147
 			if (arguments.arguments[i].type != header.parameters[i].type)
155
 			if (arguments.arguments[i].type != header.parameters[i].type)
148
 				return false;
156
 				return false;
155
 		if (arguments.arguments.length < minParameters || arguments.arguments.length > maxParameters)
163
 		if (arguments.arguments.length < minParameters || arguments.arguments.length > maxParameters)
156
 			return false;
164
 			return false;
157
 		
165
 		
158
-		FunctionHeader header = fillGenericArguments(scope.getTypeRegistry(), arguments.typeArguments);
166
+		FunctionHeader header = fillGenericArguments(scope.getTypeRegistry(), arguments.typeArguments, scope.getLocalTypeParameters());
159
 		for (int i = 0; i < header.parameters.length; i++) {
167
 		for (int i = 0; i < header.parameters.length; i++) {
160
 			if (!scope.getTypeMembers(arguments.arguments[i].type).canCastImplicit(header.parameters[i].type))
168
 			if (!scope.getTypeMembers(arguments.arguments[i].type).canCastImplicit(header.parameters[i].type))
161
 				return false;
169
 				return false;
312
 	}
320
 	}
313
 	
321
 	
314
 	public FunctionHeader withGenericArguments(GenericMapper mapper) {
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
 		ITypeID returnType = this.returnType.instance(mapper);
331
 		ITypeID returnType = this.returnType.instance(mapper);
316
 		FunctionParameter[] parameters = new FunctionParameter[this.parameters.length];
332
 		FunctionParameter[] parameters = new FunctionParameter[this.parameters.length];
317
 		for (int i = 0; i < parameters.length; i++) {
333
 		for (int i = 0; i < parameters.length; i++) {
320
 		return new FunctionHeader(typeParameters, returnType, thrownType == null ? null : thrownType.instance(mapper), parameters);
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
 		if (arguments == null || arguments.length == 0)
340
 		if (arguments == null || arguments.length == 0)
325
 			return this;
341
 			return this;
326
 		
342
 		
327
 		Map<TypeParameter, ITypeID> typeArguments = new HashMap<>();
343
 		Map<TypeParameter, ITypeID> typeArguments = new HashMap<>();
328
 		for (int i = 0; i < typeParameters.length; i++)
344
 		for (int i = 0; i < typeParameters.length; i++)
329
 			typeArguments.put(typeParameters[i], arguments[i]);
345
 			typeArguments.put(typeParameters[i], arguments[i]);
330
-		GenericMapper mapper = new GenericMapper(registry, typeArguments);
346
+		GenericMapper mapper = typeParameterMapping.getInner(typeArguments);
331
 		
347
 		
332
 		ITypeID returnType = this.returnType.instance(mapper);
348
 		ITypeID returnType = this.returnType.instance(mapper);
333
 		FunctionParameter[] parameters = new FunctionParameter[this.parameters.length];
349
 		FunctionParameter[] parameters = new FunctionParameter[this.parameters.length];
411
 		return parameters[parameters.length - 1].variadic ? Integer.MAX_VALUE : parameters.length;
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
 		for (ITypeID type : types)
434
 		for (ITypeID type : types)
416
 			if (type == BasicTypeID.UNDETERMINED)
435
 			if (type == BasicTypeID.UNDETERMINED)
417
 				return true;
436
 				return true;
419
 		return false;
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
 		for (FunctionParameter parameter : parameters)
445
 		for (FunctionParameter parameter : parameters)
424
 			if (parameter.type == BasicTypeID.UNDETERMINED)
446
 			if (parameter.type == BasicTypeID.UNDETERMINED)
425
 				return true;
447
 				return true;

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

9
 import java.util.Objects;
9
 import java.util.Objects;
10
 import org.openzen.zencode.shared.Taggable;
10
 import org.openzen.zencode.shared.Taggable;
11
 import org.openzen.zenscript.codemodel.expression.Expression;
11
 import org.openzen.zenscript.codemodel.expression.Expression;
12
+import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
12
 import org.openzen.zenscript.codemodel.type.ITypeID;
13
 import org.openzen.zenscript.codemodel.type.ITypeID;
13
 
14
 
14
 /**
15
 /**
21
 	public Annotation[] annotations;
22
 	public Annotation[] annotations;
22
 	public final ITypeID type;
23
 	public final ITypeID type;
23
 	public final String name;
24
 	public final String name;
24
-	public final Expression defaultValue;
25
+	public Expression defaultValue;
25
 	public final boolean variadic;
26
 	public final boolean variadic;
26
 	
27
 	
27
 	public FunctionParameter(ITypeID type) {
28
 	public FunctionParameter(ITypeID type) {
48
 		this.variadic = variadic;
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
 	public FunctionParameter withGenericArguments(GenericMapper mapper) {
58
 	public FunctionParameter withGenericArguments(GenericMapper mapper) {
52
 		ITypeID instanced = type.instance(mapper);
59
 		ITypeID instanced = type.instance(mapper);
53
 		if (instanced == type)
60
 		if (instanced == type)

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

5
  */
5
  */
6
 package org.openzen.zenscript.codemodel;
6
 package org.openzen.zenscript.codemodel;
7
 
7
 
8
+import java.util.Collections;
9
+import java.util.HashMap;
8
 import java.util.Map;
10
 import java.util.Map;
9
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
11
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
10
 import org.openzen.zenscript.codemodel.type.GenericTypeID;
12
 import org.openzen.zenscript.codemodel.type.GenericTypeID;
16
  * @author Hoofdgebruiker
18
  * @author Hoofdgebruiker
17
  */
19
  */
18
 public class GenericMapper {
20
 public class GenericMapper {
21
+	public static final GenericMapper EMPTY = new GenericMapper(null, Collections.emptyMap());
22
+	
19
 	public final GlobalTypeRegistry registry;
23
 	public final GlobalTypeRegistry registry;
20
 	private final Map<TypeParameter, ITypeID> mapping;
24
 	private final Map<TypeParameter, ITypeID> mapping;
21
 	
25
 	
43
 	}
47
 	}
44
 	
48
 	
45
 	public ITypeID map(GenericTypeID type) {
49
 	public ITypeID map(GenericTypeID type) {
50
+		if (!mapping.containsKey(type.parameter))
51
+			throw new IllegalStateException("No mapping found for type " + type);
52
+		
46
 		return mapping.containsKey(type.parameter) ? mapping.get(type.parameter) : type;
53
 		return mapping.containsKey(type.parameter) ? mapping.get(type.parameter) : type;
47
 	}
54
 	}
48
 	
55
 	
49
 	public FunctionHeader map(FunctionHeader original) {
56
 	public FunctionHeader map(FunctionHeader original) {
50
 		return mapping.isEmpty() ? original : original.withGenericArguments(this);
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
 import org.openzen.zencode.shared.CodePosition;
10
 import org.openzen.zencode.shared.CodePosition;
11
 import org.openzen.zencode.shared.Taggable;
11
 import org.openzen.zencode.shared.Taggable;
12
 import org.openzen.zenscript.codemodel.annotations.DefinitionAnnotation;
12
 import org.openzen.zenscript.codemodel.annotations.DefinitionAnnotation;
13
+import org.openzen.zenscript.codemodel.definition.AliasDefinition;
13
 import org.openzen.zenscript.codemodel.definition.DefinitionVisitor;
14
 import org.openzen.zenscript.codemodel.definition.DefinitionVisitor;
15
+import org.openzen.zenscript.codemodel.definition.InterfaceDefinition;
14
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
16
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
15
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
17
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
16
 import org.openzen.zenscript.codemodel.member.ConstructorMember;
18
 import org.openzen.zenscript.codemodel.member.ConstructorMember;
19
+import org.openzen.zenscript.codemodel.member.DestructorMember;
17
 import org.openzen.zenscript.codemodel.member.FieldMember;
20
 import org.openzen.zenscript.codemodel.member.FieldMember;
18
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
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
 import org.openzen.zenscript.codemodel.type.ITypeID;
25
 import org.openzen.zenscript.codemodel.type.ITypeID;
20
 
26
 
21
 /**
27
 /**
28
 	public final String name;
34
 	public final String name;
29
 	public final int modifiers;
35
 	public final int modifiers;
30
 	public final List<IDefinitionMember> members = new ArrayList<>();
36
 	public final List<IDefinitionMember> members = new ArrayList<>();
31
-	public TypeParameter[] genericParameters = null;
37
+	public TypeParameter[] genericParameters = TypeParameter.NONE;
32
 	public DefinitionAnnotation[] annotations = DefinitionAnnotation.NONE;
38
 	public DefinitionAnnotation[] annotations = DefinitionAnnotation.NONE;
33
 	
39
 	
34
 	public HighLevelDefinition outerDefinition;
40
 	public HighLevelDefinition outerDefinition;
35
-	public ITypeID superType;
41
+	private ITypeID superType;
42
+	
43
+	private boolean isDestructible = false;
36
 	
44
 	
37
 	public HighLevelDefinition(CodePosition position, ZSPackage pkg, String name, int modifiers, HighLevelDefinition outerDefinition) {
45
 	public HighLevelDefinition(CodePosition position, ZSPackage pkg, String name, int modifiers, HighLevelDefinition outerDefinition) {
38
 		this.position = position;
46
 		this.position = position;
45
 			pkg.register(this);
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
 	public String getFullName() {
63
 	public String getFullName() {
49
 		return pkg.fullName + '.' + name;
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
 	public int getNumberOfGenericParameters() {
77
 	public int getNumberOfGenericParameters() {
53
 		return genericParameters == null ? 0 : genericParameters.length;
78
 		return genericParameters == null ? 0 : genericParameters.length;
54
 	}
79
 	}
61
 		return outerDefinition != null;
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
 	public void addMember(IDefinitionMember member) {
97
 	public void addMember(IDefinitionMember member) {
65
 		if (!members.contains(member))
98
 		if (!members.contains(member))
66
 			members.add(member);
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
 	public void setTypeParameters(TypeParameter[] typeParameters) {
115
 	public void setTypeParameters(TypeParameter[] typeParameters) {
70
 		this.genericParameters = typeParameters;
116
 		this.genericParameters = typeParameters;
71
 	}
117
 	}
94
 		return (modifiers & Modifiers.STATIC) > 0;
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
 	public abstract <T> T accept(DefinitionVisitor<T> visitor);
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
 import org.openzen.zenscript.codemodel.FunctionHeader;
11
 import org.openzen.zenscript.codemodel.FunctionHeader;
12
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
13
 import org.openzen.zenscript.codemodel.ModuleProcessor;
13
 import org.openzen.zenscript.codemodel.ModuleProcessor;
14
-import org.openzen.zenscript.codemodel.PackageDefinitions;
15
 import org.openzen.zenscript.codemodel.ScriptBlock;
14
 import org.openzen.zenscript.codemodel.ScriptBlock;
15
+import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
16
 import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
16
 import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
17
-import org.openzen.zenscript.codemodel.definition.ZSPackage;
18
 import org.openzen.zenscript.codemodel.member.CallerMember;
17
 import org.openzen.zenscript.codemodel.member.CallerMember;
19
 import org.openzen.zenscript.codemodel.member.CasterMember;
18
 import org.openzen.zenscript.codemodel.member.CasterMember;
20
 import org.openzen.zenscript.codemodel.member.ConstMember;
19
 import org.openzen.zenscript.codemodel.member.ConstMember;
33
 import org.openzen.zenscript.codemodel.member.SetterMember;
32
 import org.openzen.zenscript.codemodel.member.SetterMember;
34
 import org.openzen.zenscript.codemodel.member.StaticInitializerMember;
33
 import org.openzen.zenscript.codemodel.member.StaticInitializerMember;
35
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
34
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
36
-import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
37
 import org.openzen.zenscript.codemodel.scope.DefinitionScope;
35
 import org.openzen.zenscript.codemodel.scope.DefinitionScope;
38
 import org.openzen.zenscript.codemodel.scope.FileScope;
36
 import org.openzen.zenscript.codemodel.scope.FileScope;
39
 import org.openzen.zenscript.codemodel.scope.FunctionScope;
37
 import org.openzen.zenscript.codemodel.scope.FunctionScope;
41
 import org.openzen.zenscript.codemodel.scope.StatementScope;
39
 import org.openzen.zenscript.codemodel.scope.StatementScope;
42
 import org.openzen.zenscript.codemodel.statement.Statement;
40
 import org.openzen.zenscript.codemodel.statement.Statement;
43
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
41
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
44
-import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
45
 
42
 
46
 /**
43
 /**
47
  *
44
  *
48
  * @author Hoofdgebruiker
45
  * @author Hoofdgebruiker
49
  */
46
  */
50
 public class AnnotationProcessor implements ModuleProcessor {
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
 	private final List<ExpansionDefinition> expansions;
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
 		this.expansions = expansions;
53
 		this.expansions = expansions;
67
-		this.annotations = annotations;
68
 	}
54
 	}
69
 	
55
 	
70
 	@Override
56
 	@Override
71
 	public ScriptBlock process(ScriptBlock block) {
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
 		StatementScope scope = new GlobalScriptScope(fileScope);
59
 		StatementScope scope = new GlobalScriptScope(fileScope);
74
 		List<Statement> transformed = new ArrayList<>();
60
 		List<Statement> transformed = new ArrayList<>();
75
 		boolean unchanged = true;
61
 		boolean unchanged = true;
83
 	
69
 	
84
 	@Override
70
 	@Override
85
 	public void process(HighLevelDefinition definition) {
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
 		DefinitionScope scope = new DefinitionScope(fileScope, definition);
73
 		DefinitionScope scope = new DefinitionScope(fileScope, definition);
88
 		for (DefinitionAnnotation annotation : definition.annotations) {
74
 		for (DefinitionAnnotation annotation : definition.annotations) {
89
 			annotation.apply(definition, scope);
75
 			annotation.apply(definition, scope);
164
 
150
 
165
 		@Override
151
 		@Override
166
 		public Void visitCustomIterator(CustomIteratorMember member) {
152
 		public Void visitCustomIterator(CustomIteratorMember member) {
167
-			throw new UnsupportedOperationException("Not supported yet!");
153
+			return functional(member);
168
 		}
154
 		}
169
 
155
 
170
 		@Override
156
 		@Override

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

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

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

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

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

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

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
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
9
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
10
+import org.openzen.zenscript.codemodel.Modifiers;
11
+import org.openzen.zenscript.codemodel.scope.TypeScope;
10
 import org.openzen.zenscript.codemodel.type.ITypeID;
12
 import org.openzen.zenscript.codemodel.type.ITypeID;
11
 
13
 
12
 /**
14
 /**
21
 	}
23
 	}
22
 	
24
 	
23
 	public void setType(ITypeID type) {
25
 	public void setType(ITypeID type) {
26
+		if (type == null)
27
+			throw new NullPointerException("type cannot be null!");
28
+		
24
 		this.type = type;
29
 		this.type = type;
25
 	}
30
 	}
31
+	
32
+	@Override
33
+	public boolean isStatic() {
34
+		return true;
35
+	}
26
 
36
 
27
 	@Override
37
 	@Override
28
 	public <T> T accept(DefinitionVisitor<T> visitor) {
38
 	public <T> T accept(DefinitionVisitor<T> visitor) {
29
 		return visitor.visitAlias(this);
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
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
9
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
10
+import org.openzen.zenscript.codemodel.scope.TypeScope;
10
 import org.openzen.zenscript.codemodel.type.ITypeID;
11
 import org.openzen.zenscript.codemodel.type.ITypeID;
11
 
12
 
12
 /**
13
 /**
21
 	public ClassDefinition(CodePosition position, ZSPackage pkg, String name, int modifiers, HighLevelDefinition outerDefinition) {
22
 	public ClassDefinition(CodePosition position, ZSPackage pkg, String name, int modifiers, HighLevelDefinition outerDefinition) {
22
 		super(position, pkg, name, modifiers, outerDefinition);
23
 		super(position, pkg, name, modifiers, outerDefinition);
23
 	}
24
 	}
24
-	
25
-	public void setSuperclass(ITypeID superclass) {
26
-		this.superType = superclass;
27
-	}
28
 
25
 
29
 	@Override
26
 	@Override
30
 	public <T> T accept(DefinitionVisitor<T> visitor) {
27
 	public <T> T accept(DefinitionVisitor<T> visitor) {

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

7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
 import org.openzen.zenscript.codemodel.FunctionHeader;
9
 import org.openzen.zenscript.codemodel.FunctionHeader;
10
+import org.openzen.zenscript.codemodel.GenericMapper;
10
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
11
 import org.openzen.zenscript.codemodel.Modifiers;
12
 import org.openzen.zenscript.codemodel.Modifiers;
12
 import org.openzen.zenscript.codemodel.member.CallerMember;
13
 import org.openzen.zenscript.codemodel.member.CallerMember;
38
 	public void setHeader(FunctionHeader header) {
39
 	public void setHeader(FunctionHeader header) {
39
 		this.header = header;
40
 		this.header = header;
40
 		addMember(caller = new CallerMember(position, this, modifiers | Modifiers.STATIC, header, null));
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
 	public void setCode(Statement statement) {
45
 	public void setCode(Statement statement) {

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

16
  * @author Hoofdgebruiker
16
  * @author Hoofdgebruiker
17
  */
17
  */
18
 public class InterfaceDefinition extends HighLevelDefinition {
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
 	public InterfaceDefinition(CodePosition position, ZSPackage pkg, String name, int modifiers, HighLevelDefinition outerDefinition) {
21
 	public InterfaceDefinition(CodePosition position, ZSPackage pkg, String name, int modifiers, HighLevelDefinition outerDefinition) {
22
 		super(position, pkg, name, modifiers, outerDefinition);
22
 		super(position, pkg, name, modifiers, outerDefinition);
25
 	public void addBaseInterface(ITypeID baseInterface) {
25
 	public void addBaseInterface(ITypeID baseInterface) {
26
 		baseInterfaces.add(baseInterface);
26
 		baseInterfaces.add(baseInterface);
27
 	}
27
 	}
28
+	
29
+	@Override
30
+	public boolean isStatic() {
31
+		return true;
32
+	}
28
 
33
 
29
 	@Override
34
 	@Override
30
 	public <T> T accept(DefinitionVisitor<T> visitor) {
35
 	public <T> T accept(DefinitionVisitor<T> visitor) {

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

12
 import org.openzen.zencode.shared.CompileException;
12
 import org.openzen.zencode.shared.CompileException;
13
 import org.openzen.zencode.shared.CompileExceptionCode;
13
 import org.openzen.zencode.shared.CompileExceptionCode;
14
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
14
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
15
+import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
15
 import org.openzen.zenscript.codemodel.partial.IPartialExpression;
16
 import org.openzen.zenscript.codemodel.partial.IPartialExpression;
16
 import org.openzen.zenscript.codemodel.partial.PartialPackageExpression;
17
 import org.openzen.zenscript.codemodel.partial.PartialPackageExpression;
17
 import org.openzen.zenscript.codemodel.partial.PartialTypeExpression;
18
 import org.openzen.zenscript.codemodel.partial.PartialTypeExpression;
19
+import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
18
 import org.openzen.zenscript.codemodel.type.GenericName;
20
 import org.openzen.zenscript.codemodel.type.GenericName;
19
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
21
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
20
 import org.openzen.zenscript.codemodel.type.ITypeID;
22
 import org.openzen.zenscript.codemodel.type.ITypeID;
21
-import org.openzen.zenscript.codemodel.scope.TypeScope;
22
 
23
 
23
 /**
24
 /**
24
  *
25
  *
80
 		return null;
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
 		if (types.containsKey(name.name)) {
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
 		return null;
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
 		if (depth >= nameParts.size())
97
 		if (depth >= nameParts.size())
97
 			return null;
98
 			return null;
98
 		
99
 		
99
 		GenericName name = nameParts.get(depth);
100
 		GenericName name = nameParts.get(depth);
100
 		if (subPackages.containsKey(name.name) && name.hasNoArguments())
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
 		if (types.containsKey(name.name)) {
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
 		return null;
109
 		return null;

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

6
 package org.openzen.zenscript.codemodel.expression;
6
 package org.openzen.zenscript.codemodel.expression;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10
 
11
 
11
 /**
12
 /**
36
 				? this
37
 				? this
37
 				: new AndAndExpression(position, tLeft, tRight);
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
 package org.openzen.zenscript.codemodel.expression;
6
 package org.openzen.zenscript.codemodel.expression;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.type.ArrayTypeID;
10
 import org.openzen.zenscript.codemodel.type.ArrayTypeID;
10
 
11
 
11
 /**
12
 /**
33
 		Expression[] tExpressions = Expression.transform(expressions, transformer);
34
 		Expression[] tExpressions = Expression.transform(expressions, transformer);
34
 		return tExpressions == expressions ? this : new ArrayExpression(position, tExpressions, (ArrayTypeID)type);
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
 	public final CallArguments arguments;
20
 	public final CallArguments arguments;
21
 	public final FunctionHeader instancedHeader;
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
 		super(position, instancedHeader.returnType, multiThrow(position, arguments.arguments));
24
 		super(position, instancedHeader.returnType, multiThrow(position, arguments.arguments));
25
 		
25
 		
26
 		this.target = target;
26
 		this.target = target;
27
 		this.member = member;
27
 		this.member = member;
28
-		this.arguments = scope == null ? arguments : arguments.normalize(position, scope, instancedHeader);
28
+		this.arguments = arguments;
29
 		this.instancedHeader = instancedHeader;
29
 		this.instancedHeader = instancedHeader;
30
 	}
30
 	}
31
 	
31
 	
44
 		CallArguments tArguments = arguments.transform(transformer);
44
 		CallArguments tArguments = arguments.transform(transformer);
45
 		return tTarget == target && tArguments == arguments
45
 		return tTarget == target && tArguments == arguments
46
 				? this
46
 				? this
47
-				: new CallExpression(position, tTarget, member, instancedHeader, tArguments, null);
47
+				: new CallExpression(position, tTarget, member, instancedHeader, tArguments);
48
 	}
48
 	}
49
 	
49
 	
50
 	@Override
50
 	@Override
59
 				throw new UnsupportedOperationException("Cannot evaluate to a string constant!");
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
 	public final CallArguments arguments;
21
 	public final CallArguments arguments;
22
 	public final FunctionHeader instancedHeader;
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
 		super(position, instancedHeader.returnType, multiThrow(position, arguments.arguments));
25
 		super(position, instancedHeader.returnType, multiThrow(position, arguments.arguments));
26
 		
26
 		
27
 		this.member = member;
27
 		this.member = member;
28
 		this.target = target;
28
 		this.target = target;
29
-		this.arguments = scope == null ? arguments : arguments.normalize(position, scope, instancedHeader);
29
+		this.arguments = arguments;
30
 		this.instancedHeader = instancedHeader;
30
 		this.instancedHeader = instancedHeader;
31
 	}
31
 	}
32
 
32
 
38
 	@Override
38
 	@Override
39
 	public Expression transform(ExpressionTransformer transformer) {
39
 	public Expression transform(ExpressionTransformer transformer) {
40
 		CallArguments tArguments = arguments.transform(transformer);
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
 package org.openzen.zenscript.codemodel.expression;
6
 package org.openzen.zenscript.codemodel.expression;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9
 
10
 
10
 /**
11
 /**
11
  *
12
  *
39
 			return tValue == value ? this : new CapturedClosureExpression(position, (CapturedExpression)tValue, closure);
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
 package org.openzen.zenscript.codemodel.expression;
6
 package org.openzen.zenscript.codemodel.expression;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9
 
10
 
10
 /**
11
 /**
11
  *
12
  *
34
 		Expression tValue = transformer.transform(value);
35
 		Expression tValue = transformer.transform(value);
35
 		return tValue == value ? this : new CapturedDirectExpression(position, closure, tValue);
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
 package org.openzen.zenscript.codemodel.expression;
6
 package org.openzen.zenscript.codemodel.expression;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.type.ITypeID;
10
 import org.openzen.zenscript.codemodel.type.ITypeID;
10
 
11
 
11
 /**
12
 /**
28
 		return result;
29
 		return result;
29
 	}
30
 	}
30
 	
31
 	
32
+	@Override
33
+	public abstract CapturedExpression normalize(TypeScope scope);
34
+	
31
 	public abstract <T> T accept(CapturedExpressionVisitor<T> visitor);
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
 package org.openzen.zenscript.codemodel.expression;
6
 package org.openzen.zenscript.codemodel.expression;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.statement.VarStatement;
10
 import org.openzen.zenscript.codemodel.statement.VarStatement;
10
 
11
 
11
 /**
12
 /**
35
 	public Expression transform(ExpressionTransformer transformer) {
36
 	public Expression transform(ExpressionTransformer transformer) {
36
 		return this;
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
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
 import org.openzen.zenscript.codemodel.FunctionParameter;
9
 import org.openzen.zenscript.codemodel.FunctionParameter;
10
+import org.openzen.zenscript.codemodel.scope.TypeScope;
10
 
11
 
11
 /**
12
 /**
12
  *
13
  *
35
 	public Expression transform(ExpressionTransformer transformer) {
36
 	public Expression transform(ExpressionTransformer transformer) {
36
 		return this;
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
 package org.openzen.zenscript.codemodel.expression;
6
 package org.openzen.zenscript.codemodel.expression;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.type.ITypeID;
10
 import org.openzen.zenscript.codemodel.type.ITypeID;
10
 
11
 
11
 /**
12
 /**
31
 	public Expression transform(ExpressionTransformer transformer) {
32
 	public Expression transform(ExpressionTransformer transformer) {
32
 		return this;
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
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
 import org.openzen.zenscript.codemodel.member.ref.CasterMemberRef;
9
 import org.openzen.zenscript.codemodel.member.ref.CasterMemberRef;
10
+import org.openzen.zenscript.codemodel.scope.TypeScope;
10
 
11
 
11
 /**
12
 /**
12
  *
13
  *
35
 		Expression tTarget = target.transform(transformer);
36
 		Expression tTarget = target.transform(transformer);
36
 		return target == tTarget ? this : new CastExpression(position, tTarget, member, isImplicit);
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
 package org.openzen.zenscript.codemodel.expression;
6
 package org.openzen.zenscript.codemodel.expression;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9
 
10
 
10
 /**
11
 /**
11
  * Converts a value from X? to X. Throws a NullPointerException if the value is null.
12
  * Converts a value from X? to X. Throws a NullPointerException if the value is null.
16
 	public final Expression value;
17
 	public final Expression value;
17
 	
18
 	
18
 	public CheckNullExpression(CodePosition position, Expression value) {
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
 		this.value = value;
22
 		this.value = value;
22
 	}
23
 	}
31
 		Expression tValue = transformer.transform(value);
32
 		Expression tValue = transformer.transform(value);
32
 		return value == tValue ? this : new CheckNullExpression(position, tValue);
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
 package org.openzen.zenscript.codemodel.expression;
6
 package org.openzen.zenscript.codemodel.expression;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9
 
10
 
10
 /**
11
 /**
11
  *
12
  *
33
 		Expression tRight = right.transform(transformer);
34
 		Expression tRight = right.transform(transformer);
34
 		return tLeft == left && tRight == right ? this : new CoalesceExpression(position, tLeft, tRight);
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
 		super(position, BasicTypeID.BOOL, binaryThrow(position, left.thrownType, right.thrownType));
27
 		super(position, BasicTypeID.BOOL, binaryThrow(position, left.thrownType, right.thrownType));
28
 		
28
 		
29
 		this.left = left;
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
 		this.operator = operator;
31
 		this.operator = operator;
32
 		this.comparison = comparison;
32
 		this.comparison = comparison;
33
 	}
33
 	}
43
 		Expression tRight = right.transform(transformer);
43
 		Expression tRight = right.transform(transformer);
44
 		return left == tLeft && right == tRight ? this : new CompareExpression(position, tLeft, tRight, operator, comparison, null);
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
 package org.openzen.zenscript.codemodel.expression;
6
 package org.openzen.zenscript.codemodel.expression;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.type.ITypeID;
10
 import org.openzen.zenscript.codemodel.type.ITypeID;
10
 
11
 
11
 /**
12
 /**
47
 				? this
48
 				? this
48
 				: new ConditionalExpression(position, tCondition, tIfThen, tIfElse, type);
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
 import org.openzen.zenscript.codemodel.member.EnumConstantMember;
9
 import org.openzen.zenscript.codemodel.member.EnumConstantMember;
10
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
10
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
11
 import org.openzen.zenscript.codemodel.member.ref.ConstMemberRef;
11
 import org.openzen.zenscript.codemodel.member.ref.ConstMemberRef;
12
+import org.openzen.zenscript.codemodel.scope.TypeScope;
12
 
13
 
13
 /**
14
 /**
14
  *
15
  *
18
 	public final ConstMemberRef constant;
19
 	public final ConstMemberRef constant;
19
 	
20
 	
20
 	public ConstExpression(CodePosition position, ConstMemberRef constant) {
21
 	public ConstExpression(CodePosition position, ConstMemberRef constant) {
21
-		super(position, constant.type, null);
22
+		super(position, constant.getType(), null);
22
 		
23
 		
23
 		this.constant = constant;
24
 		this.constant = constant;
24
 	}
25
 	}
47
 	public IDefinitionMember getMember() {
48
 	public IDefinitionMember getMember() {
48
 		return constant.member;
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
 package org.openzen.zenscript.codemodel.expression;
6
 package org.openzen.zenscript.codemodel.expression;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10
 
11
 
11
 /**
12
 /**
30
 	public Expression transform(ExpressionTransformer transformer) {
31
 	public Expression transform(ExpressionTransformer transformer) {
31
 		return this;
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
 package org.openzen.zenscript.codemodel.expression;
6
 package org.openzen.zenscript.codemodel.expression;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10
 
11
 
11
 /**
12
 /**
30
 	public Expression transform(ExpressionTransformer transformer) {
31
 	public Expression transform(ExpressionTransformer transformer) {
31
 		return this;
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
 package org.openzen.zenscript.codemodel.expression;
6
 package org.openzen.zenscript.codemodel.expression;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10
 
11
 
11
 /**
12
 /**
30
 	public Expression transform(ExpressionTransformer transformer) {
31
 	public Expression transform(ExpressionTransformer transformer) {
31
 		return this;
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
 package org.openzen.zenscript.codemodel.expression;
6
 package org.openzen.zenscript.codemodel.expression;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10
 
11
 
11
 /**
12
 /**
30
 	public Expression transform(ExpressionTransformer transformer) {
31
 	public Expression transform(ExpressionTransformer transformer) {
31
 		return this;
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
 package org.openzen.zenscript.codemodel.expression;
6
 package org.openzen.zenscript.codemodel.expression;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10
 
11
 
11
 /**
12
 /**
30
 	public Expression transform(ExpressionTransformer transformer) {
31
 	public Expression transform(ExpressionTransformer transformer) {
31
 		return this;
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
 package org.openzen.zenscript.codemodel.expression;
6
 package org.openzen.zenscript.codemodel.expression;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10
 
11
 
11
 /**
12
 /**
30
 	public Expression transform(ExpressionTransformer transformer) {
31
 	public Expression transform(ExpressionTransformer transformer) {
31
 		return this;
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
 package org.openzen.zenscript.codemodel.expression;
6
 package org.openzen.zenscript.codemodel.expression;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10
 
11
 
11
 /**
12
 /**
30
 	public Expression transform(ExpressionTransformer transformer) {
31
 	public Expression transform(ExpressionTransformer transformer) {
31
 		return this;
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
 package org.openzen.zenscript.codemodel.expression;
6
 package org.openzen.zenscript.codemodel.expression;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10
 
11
 
11
 /**
12
 /**
30
 	public Expression transform(ExpressionTransformer transformer) {
31
 	public Expression transform(ExpressionTransformer transformer) {
31
 		return this;
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
 package org.openzen.zenscript.codemodel.expression;
6
 package org.openzen.zenscript.codemodel.expression;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10
 
11
 
11
 /**
12
 /**
30
 	public Expression transform(ExpressionTransformer transformer) {
31
 	public Expression transform(ExpressionTransformer transformer) {
31
 		return this;
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
 package org.openzen.zenscript.codemodel.expression;
6
 package org.openzen.zenscript.codemodel.expression;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10
 
11
 
11
 /**
12
 /**
35
 	public String evaluateStringConstant() {
36
 	public String evaluateStringConstant() {
36
 		return value;
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
 package org.openzen.zenscript.codemodel.expression;
6
 package org.openzen.zenscript.codemodel.expression;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10
 
11
 
11
 /**
12
 /**
30
 	public Expression transform(ExpressionTransformer transformer) {
31
 	public Expression transform(ExpressionTransformer transformer) {
31
 		return this;
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
 package org.openzen.zenscript.codemodel.expression;
6
 package org.openzen.zenscript.codemodel.expression;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10
 
11
 
11
 /**
12
 /**
30
 	public Expression transform(ExpressionTransformer transformer) {
31
 	public Expression transform(ExpressionTransformer transformer) {
31
 		return this;
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
 package org.openzen.zenscript.codemodel.expression;
6
 package org.openzen.zenscript.codemodel.expression;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10
 
11
 
11
 /**
12
 /**
30
 	public Expression transform(ExpressionTransformer transformer) {
31
 	public Expression transform(ExpressionTransformer transformer) {
31
 		return this;
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
 	public final FunctionalMemberRef constructor;
20
 	public final FunctionalMemberRef constructor;
21
 	public final CallArguments arguments;
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
 		this.objectType = type;
26
 		this.objectType = type;
27
 		this.constructor = constructor;
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
 	@Override
31
 	@Override
36
 	@Override
36
 	@Override
37
 	public Expression transform(ExpressionTransformer transformer) {
37
 	public Expression transform(ExpressionTransformer transformer) {
38
 		CallArguments tArguments = arguments.transform(transformer);
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
 	public final FunctionalMemberRef constructor;
20
 	public final FunctionalMemberRef constructor;
21
 	public final CallArguments arguments;
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
 		this.objectType = type;
29
 		this.objectType = type;
27
 		this.constructor = constructor;
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
 	@Override
34
 	@Override
36
 	@Override
39
 	@Override
37
 	public Expression transform(ExpressionTransformer transformer) {
40
 	public Expression transform(ExpressionTransformer transformer) {
38
 		CallArguments tArguments = arguments.transform(transformer);
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
 package org.openzen.zenscript.codemodel.expression;
6
 package org.openzen.zenscript.codemodel.expression;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.type.ITypeID;
10
 import org.openzen.zenscript.codemodel.type.ITypeID;
10
 
11
 
11
 /**
12
 /**
26
 	public Expression transform(ExpressionTransformer transformer) {
27
 	public Expression transform(ExpressionTransformer transformer) {
27
 		throw new UnsupportedOperationException("This is a dummy expression");
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
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
 import org.openzen.zenscript.codemodel.definition.EnumDefinition;
9
 import org.openzen.zenscript.codemodel.definition.EnumDefinition;
10
 import org.openzen.zenscript.codemodel.member.EnumConstantMember;
10
 import org.openzen.zenscript.codemodel.member.EnumConstantMember;
11
+import org.openzen.zenscript.codemodel.scope.TypeScope;
11
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
12
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
12
 import org.openzen.zenscript.codemodel.type.ITypeID;
13
 import org.openzen.zenscript.codemodel.type.ITypeID;
13
 
14
 
44
 	public EnumConstantMember evaluateEnumConstant() {
45
 	public EnumConstantMember evaluateEnumConstant() {
45
 		return value;
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
 		if (type == null)
40
 		if (type == null)
41
 			throw new NullPointerException();
41
 			throw new NullPointerException();
42
 		if (type == BasicTypeID.UNDETERMINED)
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
 		this.position = position;
45
 		this.position = position;
46
-		this.type = type;
46
+		this.type = type.getNormalized();
47
 		this.thrownType = thrownType;
47
 		this.thrownType = thrownType;
48
 	}
48
 	}
49
 	
49
 	
66
 		});
66
 		});
67
 	}
67
 	}
68
 	
68
 	
69
+	public abstract Expression normalize(TypeScope scope);
70
+	
69
 	@Override
71
 	@Override
70
 	public List<ITypeID> getAssignHints() {
72
 	public List<ITypeID> getAssignHints() {
71
 		return Collections.singletonList(type);
73
 		return Collections.singletonList(type);
104
 		return scope.getTypeMembers(type)
106
 		return scope.getTypeMembers(type)
105
 				.getOrCreateGroup(OperatorType.CALL)
107
 				.getOrCreateGroup(OperatorType.CALL)
106
 				.getMethodMembers().stream()
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
 				.collect(Collectors.toList());
111
 				.collect(Collectors.toList());
110
 	}
112
 	}
111
 	
113
 	
117
 	@Override
119
 	@Override
118
 	public IPartialExpression getMember(CodePosition position, TypeScope scope, List<ITypeID> hints, GenericName name) {
120
 	public IPartialExpression getMember(CodePosition position, TypeScope scope, List<ITypeID> hints, GenericName name) {
119
 		TypeMembers members = scope.getTypeMembers(type);
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
 		if (result == null)
123
 		if (result == null)
122
 			System.out.println("No such member: " + name.name);
124
 			System.out.println("No such member: " + name.name);
123
 		return result;
125
 		return result;

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

59
 				type,
59
 				type,
60
 				member,
60
 				member,
61
 				compiledArguments,
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
 	public Expression not(Expression value) {
65
 	public Expression not(Expression value) {

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

12
 import org.openzen.zencode.shared.ConcatMap;
12
 import org.openzen.zencode.shared.ConcatMap;
13
 import org.openzen.zenscript.codemodel.FunctionHeader;
13
 import org.openzen.zenscript.codemodel.FunctionHeader;
14
 import org.openzen.zenscript.codemodel.FunctionParameter;
14
 import org.openzen.zenscript.codemodel.FunctionParameter;
15
+import org.openzen.zenscript.codemodel.scope.TypeScope;
15
 import org.openzen.zenscript.codemodel.statement.ExpressionStatement;
16
 import org.openzen.zenscript.codemodel.statement.ExpressionStatement;
16
 import org.openzen.zenscript.codemodel.statement.LoopStatement;
17
 import org.openzen.zenscript.codemodel.statement.LoopStatement;
17
 import org.openzen.zenscript.codemodel.statement.ReturnStatement;
18
 import org.openzen.zenscript.codemodel.statement.ReturnStatement;
74
 			return null;
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
 	private static class ReturnExpressionTransformer implements ExpressionTransformer {
84
 	private static class ReturnExpressionTransformer implements ExpressionTransformer {
79
 		private final LambdaClosure closure;
85
 		private final LambdaClosure closure;

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

22
 	public final FieldMemberRef field;
22
 	public final FieldMemberRef field;
23
 	
23
 	
24
 	public GetFieldExpression(CodePosition position, Expression target, FieldMemberRef field) {
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
 		this.target = target;
27
 		this.target = target;
28
 		this.field = field;
28
 		this.field = field;
58
 	public IDefinitionMember getMember() {
58
 	public IDefinitionMember getMember() {
59
 		return field.member;
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
 	public Expression transform(ExpressionTransformer transformer) {
43
 	public Expression transform(ExpressionTransformer transformer) {
44
 		return this;
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
 	public Expression transform(ExpressionTransformer transformer) {
43
 	public Expression transform(ExpressionTransformer transformer) {
44
 		return this;
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
 import org.openzen.zencode.shared.CodePosition;
10
 import org.openzen.zencode.shared.CodePosition;
11
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
11
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
12
 import org.openzen.zenscript.codemodel.member.ref.FieldMemberRef;
12
 import org.openzen.zenscript.codemodel.member.ref.FieldMemberRef;
13
+import org.openzen.zenscript.codemodel.scope.TypeScope;
13
 import org.openzen.zenscript.codemodel.type.ITypeID;
14
 import org.openzen.zenscript.codemodel.type.ITypeID;
14
 
15
 
15
 /**
16
 /**
20
 	public final FieldMemberRef field;
21
 	public final FieldMemberRef field;
21
 	
22
 	
22
 	public GetStaticFieldExpression(CodePosition position, FieldMemberRef field) {
23
 	public GetStaticFieldExpression(CodePosition position, FieldMemberRef field) {
23
-		super(position, field.type, null);
24
+		super(position, field.getType(), null);
24
 		
25
 		
25
 		this.field = field;
26
 		this.field = field;
26
 	}
27
 	}
27
 	
28
 	
28
 	@Override
29
 	@Override
29
 	public List<ITypeID> getAssignHints() {
30
 	public List<ITypeID> getAssignHints() {
30
-		return Collections.singletonList(field.type);
31
+		return Collections.singletonList(field.getType());
31
 	}
32
 	}
32
 	
33
 	
33
 	@Override
34
 	@Override
49
 	public IDefinitionMember getMember() {
50
 	public IDefinitionMember getMember() {
50
 		return field.member;
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
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
 import org.openzen.zenscript.codemodel.member.ref.GetterMemberRef;
9
 import org.openzen.zenscript.codemodel.member.ref.GetterMemberRef;
10
+import org.openzen.zenscript.codemodel.scope.TypeScope;
10
 
11
 
11
 /**
12
 /**
12
  *
13
  *
17
 	public final GetterMemberRef getter;
18
 	public final GetterMemberRef getter;
18
 	
19
 	
19
 	public GetterExpression(CodePosition position, Expression target, GetterMemberRef getter) {
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
 		this.target = target;
23
 		this.target = target;
23
 		this.getter = getter;
24
 		this.getter = getter;
33
 		Expression tTarget = target.transform(transformer);
34
 		Expression tTarget = target.transform(transformer);
34
 		return target == tTarget ? this : new GetterExpression(position, tTarget, getter);
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
 package org.openzen.zenscript.codemodel.expression;
6
 package org.openzen.zenscript.codemodel.expression;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9
 
10
 
10
 /**
11
 /**
11
  *
12
  *
35
 		Expression tResolution = resolution.transform(transformer);
36
 		Expression tResolution = resolution.transform(transformer);
36
 		return tArguments == arguments && tResolution == resolution ? this : new GlobalCallExpression(position, name, tArguments, tResolution);
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
 package org.openzen.zenscript.codemodel.expression;
6
 package org.openzen.zenscript.codemodel.expression;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9
 
10
 
10
 /**
11
 /**
11
  *
12
  *
32
 		Expression tResolution = resolution.transform(transformer);
33
 		Expression tResolution = resolution.transform(transformer);
33
 		return resolution == tResolution ? this : new GlobalExpression(position, name, resolution);
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
 package org.openzen.zenscript.codemodel.expression;
6
 package org.openzen.zenscript.codemodel.expression;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.type.ITypeID;
10
 import org.openzen.zenscript.codemodel.type.ITypeID;
10
 
11
 
11
 /**
12
 /**
31
 		Expression tValue = value.transform(transformer);
32
 		Expression tValue = value.transform(transformer);
32
 		return value == tValue ? this : new InterfaceCastExpression(position, tValue, type);
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
 package org.openzen.zenscript.codemodel.expression;
6
 package org.openzen.zenscript.codemodel.expression;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10
 import org.openzen.zenscript.codemodel.type.ITypeID;
11
 import org.openzen.zenscript.codemodel.type.ITypeID;
11
 
12
 
34
 		Expression tValue = value.transform(transformer);
35
 		Expression tValue = value.transform(transformer);
35
 		return tValue == value ? this : new IsExpression(position, tValue, type);
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
 package org.openzen.zenscript.codemodel.expression;
6
 package org.openzen.zenscript.codemodel.expression;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.type.ITypeID;
10
 import org.openzen.zenscript.codemodel.type.ITypeID;
10
 
11
 
11
 /**
12
 /**
31
 		Expression tValue = value.transform(transformer);
32
 		Expression tValue = value.transform(transformer);
32
 		return tValue == value ? this : new MakeConstExpression(position, tValue, type);
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
 package org.openzen.zenscript.codemodel.expression;
6
 package org.openzen.zenscript.codemodel.expression;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.type.ITypeID;
10
 import org.openzen.zenscript.codemodel.type.ITypeID;
10
 
11
 
11
 /**
12
 /**
38
 		Expression[] tValues = Expression.transform(values, transformer);
39
 		Expression[] tValues = Expression.transform(values, transformer);
39
 		return tKeys == keys && tValues == values ? this : new MapExpression(position, tKeys, tValues, type);
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
 import java.util.List;
10
 import java.util.List;
11
 import org.openzen.zencode.shared.CodePosition;
11
 import org.openzen.zencode.shared.CodePosition;
12
 import org.openzen.zenscript.codemodel.expression.switchvalue.SwitchValue;
12
 import org.openzen.zenscript.codemodel.expression.switchvalue.SwitchValue;
13
+import org.openzen.zenscript.codemodel.scope.TypeScope;
13
 import org.openzen.zenscript.codemodel.statement.BreakStatement;
14
 import org.openzen.zenscript.codemodel.statement.BreakStatement;
14
 import org.openzen.zenscript.codemodel.statement.ExpressionStatement;
15
 import org.openzen.zenscript.codemodel.statement.ExpressionStatement;
15
 import org.openzen.zenscript.codemodel.statement.Statement;
16
 import org.openzen.zenscript.codemodel.statement.Statement;
50
 		}
51
 		}
51
 		return unmodified && tValue == value ? this : new MatchExpression(position, tValue, type, tCases);
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
 	public SwitchedMatch convertToSwitch(String tempVariable) {
63
 	public SwitchedMatch convertToSwitch(String tempVariable) {
55
 		VarStatement result = new VarStatement(position, tempVariable, type, null, false);
64
 		VarStatement result = new VarStatement(position, tempVariable, type, null, false);
103
 			Expression tValue = value.transform(transformer);
112
 			Expression tValue = value.transform(transformer);
104
 			return tValue == value ? this : new Case(key, tValue);
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
 	private static ITypeID getThrownType(CodePosition position, Case[] cases) {
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
 			FunctionalMemberRef constructor,
26
 			FunctionalMemberRef constructor,
27
 			CallArguments arguments)
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
 	public NewExpression(
32
 	public NewExpression(
38
 			ITypeID type,
34
 			ITypeID type,
39
 			FunctionalMemberRef constructor,
35
 			FunctionalMemberRef constructor,
40
 			CallArguments arguments,
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
 		this.constructor = constructor;
41
 		this.constructor = constructor;
47
-		this.arguments = scope == null ? arguments : arguments.normalize(position, scope, instancedHeader);
42
+		this.arguments = arguments;
48
 		this.instancedHeader = instancedHeader;
43
 		this.instancedHeader = instancedHeader;
49
 	}
44
 	}
50
 
45
 
56
 	@Override
51
 	@Override
57
 	public Expression transform(ExpressionTransformer transformer) {
52
 	public Expression transform(ExpressionTransformer transformer) {
58
 		CallArguments tArguments = arguments.transform(transformer);
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
 package org.openzen.zenscript.codemodel.expression;
6
 package org.openzen.zenscript.codemodel.expression;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10
 import org.openzen.zenscript.codemodel.type.ITypeID;
11
 import org.openzen.zenscript.codemodel.type.ITypeID;
11
 
12
 
31
 	public Expression transform(ExpressionTransformer transformer) {
32
 	public Expression transform(ExpressionTransformer transformer) {
32
 		return this;
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
 package org.openzen.zenscript.codemodel.expression;
6
 package org.openzen.zenscript.codemodel.expression;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10
 
11
 
11
 /**
12
 /**
34
 		Expression tRight = right.transform(transformer);
35
 		Expression tRight = right.transform(transformer);
35
 		return tLeft == left && tRight == right ? this : new OrOrExpression(position, tLeft, tRight);
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
 package org.openzen.zenscript.codemodel.expression;
6
 package org.openzen.zenscript.codemodel.expression;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.type.ITypeID;
10
 import org.openzen.zenscript.codemodel.type.ITypeID;
10
 
11
 
11
 /**
12
 /**
35
 	public Expression transform(ExpressionTransformer transformer) {
36
 	public Expression transform(ExpressionTransformer transformer) {
36
 		return new PanicExpression(position, type, transformer.transform(value));
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
 import org.openzen.zenscript.codemodel.FunctionHeader;
9
 import org.openzen.zenscript.codemodel.FunctionHeader;
10
 import org.openzen.zenscript.codemodel.OperatorType;
10
 import org.openzen.zenscript.codemodel.OperatorType;
11
 import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
11
 import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
12
+import org.openzen.zenscript.codemodel.scope.TypeScope;
12
 
13
 
13
 /**
14
 /**
14
  * Used for post-increment and post-decrement.
15
  * Used for post-increment and post-decrement.
41
 		Expression tTarget = target.transform(transformer);
42
 		Expression tTarget = target.transform(transformer);
42
 		return target == tTarget ? this : new PostCallExpression(position, tTarget, member, instancedHeader);
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
 package org.openzen.zenscript.codemodel.expression;
6
 package org.openzen.zenscript.codemodel.expression;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
10
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
10
 import org.openzen.zenscript.codemodel.type.ITypeID;
11
 import org.openzen.zenscript.codemodel.type.ITypeID;
11
 
12
 
42
 		Expression tTo = to.transform(transformer);
43
 		Expression tTo = to.transform(transformer);
43
 		return tFrom == from && tTo == to ? this : new RangeExpression(position, type, tFrom, tTo, thrownType);
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
 package org.openzen.zenscript.codemodel.expression;
6
 package org.openzen.zenscript.codemodel.expression;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10
 
11
 
11
 /**
12
 /**
36
 		Expression tRight = right.transform(transformer);
37
 		Expression tRight = right.transform(transformer);
37
 		return tLeft == left && tRight == right ? this : new SameObjectExpression(position, tLeft, tRight, inverted);
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
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
 import org.openzen.zenscript.codemodel.member.ref.FieldMemberRef;
9
 import org.openzen.zenscript.codemodel.member.ref.FieldMemberRef;
10
+import org.openzen.zenscript.codemodel.scope.TypeScope;
10
 
11
 
11
 /**
12
 /**
12
  *
13
  *
18
 	public final Expression value;
19
 	public final Expression value;
19
 	
20
 	
20
 	public SetFieldExpression(CodePosition position, Expression target, FieldMemberRef field, Expression value) {
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
 		this.target = target;
24
 		this.target = target;
24
 		this.field = field;
25
 		this.field = field;
38
 				? this
39
 				? this
39
 				: new SetFieldExpression(position, tTarget, field, tValue);
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
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
 import org.openzen.zenscript.codemodel.FunctionParameter;
9
 import org.openzen.zenscript.codemodel.FunctionParameter;
10
+import org.openzen.zenscript.codemodel.scope.TypeScope;
10
 
11
 
11
 /**
12
 /**
12
  *
13
  *
33
 		Expression tValue = value.transform(transformer);
34
 		Expression tValue = value.transform(transformer);
34
 		return tValue == value ? this : new SetFunctionParameterExpression(position, parameter, tValue);
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
 package org.openzen.zenscript.codemodel.expression;
6
 package org.openzen.zenscript.codemodel.expression;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.statement.VarStatement;
10
 import org.openzen.zenscript.codemodel.statement.VarStatement;
10
 
11
 
11
 /**
12
 /**
33
 		Expression tValue = value.transform(transformer);
34
 		Expression tValue = value.transform(transformer);
34
 		return tValue == value ? this : new SetLocalVariableExpression(position, variable, tValue);
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
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
 import org.openzen.zenscript.codemodel.member.ref.FieldMemberRef;
9
 import org.openzen.zenscript.codemodel.member.ref.FieldMemberRef;
10
+import org.openzen.zenscript.codemodel.scope.TypeScope;
10
 
11
 
11
 /**
12
 /**
12
  *
13
  *
17
 	public final Expression value;
18
 	public final Expression value;
18
 	
19
 	
19
 	public SetStaticFieldExpression(CodePosition position, FieldMemberRef field, Expression value) {
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
 		this.field = field;
23
 		this.field = field;
23
 		this.value = value;
24
 		this.value = value;
33
 		Expression tValue = value.transform(transformer);
34
 		Expression tValue = value.transform(transformer);
34
 		return value == tValue ? this : new SetStaticFieldExpression(position, field, tValue);
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
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
 import org.openzen.zenscript.codemodel.member.ref.SetterMemberRef;
9
 import org.openzen.zenscript.codemodel.member.ref.SetterMemberRef;
10
+import org.openzen.zenscript.codemodel.scope.TypeScope;
10
 
11
 
11
 /**
12
 /**
12
  *
13
  *
18
 	public final Expression value;
19
 	public final Expression value;
19
 	
20
 	
20
 	public SetterExpression(CodePosition position, Expression target, SetterMemberRef setter, Expression value) {
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
 		this.target = target;
24
 		this.target = target;
24
 		this.setter = setter;
25
 		this.setter = setter;
36
 		Expression tValue = value.transform(transformer);
37
 		Expression tValue = value.transform(transformer);
37
 		return tTarget == target && tValue == value ? this : new SetterExpression(position, tTarget, setter, tValue);
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
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
 import org.openzen.zenscript.codemodel.member.ref.GetterMemberRef;
9
 import org.openzen.zenscript.codemodel.member.ref.GetterMemberRef;
10
+import org.openzen.zenscript.codemodel.scope.TypeScope;
10
 
11
 
11
 /**
12
 /**
12
  *
13
  *
16
 	public final GetterMemberRef getter;
17
 	public final GetterMemberRef getter;
17
 	
18
 	
18
 	public StaticGetterExpression(CodePosition position, GetterMemberRef getter) {
19
 	public StaticGetterExpression(CodePosition position, GetterMemberRef getter) {
19
-		super(position, getter.type, null);
20
+		super(position, getter.getType(), null);
20
 		
21
 		
21
 		this.getter = getter;
22
 		this.getter = getter;
22
 	}
23
 	}
30
 	public Expression transform(ExpressionTransformer transformer) {
31
 	public Expression transform(ExpressionTransformer transformer) {
31
 		return this;
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
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
 import org.openzen.zenscript.codemodel.member.ref.SetterMemberRef;
9
 import org.openzen.zenscript.codemodel.member.ref.SetterMemberRef;
10
+import org.openzen.zenscript.codemodel.scope.TypeScope;
10
 
11
 
11
 /**
12
 /**
12
  *
13
  *
17
 	public final Expression value;
18
 	public final Expression value;
18
 	
19
 	
19
 	public StaticSetterExpression(CodePosition position, SetterMemberRef setter, Expression value) {
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
 		this.setter = setter;
23
 		this.setter = setter;
23
 		this.value = value;
24
 		this.value = value;
33
 		Expression tValue = value.transform(transformer);
34
 		Expression tValue = value.transform(transformer);
34
 		return tValue == value ? this : new StaticSetterExpression(position, setter, tValue);
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
 package org.openzen.zenscript.codemodel.expression;
6
 package org.openzen.zenscript.codemodel.expression;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.type.ITypeID;
10
 import org.openzen.zenscript.codemodel.type.ITypeID;
10
 
11
 
11
 /**
12
 /**
32
 		Expression tValue = value.transform(transformer);
33
 		Expression tValue = value.transform(transformer);
33
 		return tValue == value ? this : new SupertypeCastExpression(position, tValue, type);
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
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
 import org.openzen.zenscript.codemodel.partial.IPartialExpression;
9
 import org.openzen.zenscript.codemodel.partial.IPartialExpression;
10
+import org.openzen.zenscript.codemodel.scope.TypeScope;
10
 import org.openzen.zenscript.codemodel.type.ITypeID;
11
 import org.openzen.zenscript.codemodel.type.ITypeID;
11
 
12
 
12
 /**
13
 /**
34
 	public Expression transform(ExpressionTransformer transformer) {
35
 	public Expression transform(ExpressionTransformer transformer) {
35
 		return this;
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
 package org.openzen.zenscript.codemodel.expression;
6
 package org.openzen.zenscript.codemodel.expression;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.type.ITypeID;
10
 import org.openzen.zenscript.codemodel.type.ITypeID;
10
 
11
 
11
 /**
12
 /**
36
 		Expression tValue = transformer.transform(value);
37
 		Expression tValue = transformer.transform(value);
37
 		return tValue == value ? this : new ThrowExpression(position, type, value);
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
 package org.openzen.zenscript.codemodel.expression;
6
 package org.openzen.zenscript.codemodel.expression;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.type.ITypeID;
10
 import org.openzen.zenscript.codemodel.type.ITypeID;
10
 
11
 
11
 /**
12
 /**
31
 		Expression tValue = value.transform(transformer);
32
 		Expression tValue = value.transform(transformer);
32
 		return tValue == value ? this : new TryConvertExpression(position, type, tValue);
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
 package org.openzen.zenscript.codemodel.expression;
6
 package org.openzen.zenscript.codemodel.expression;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.type.ITypeID;
10
 import org.openzen.zenscript.codemodel.type.ITypeID;
10
 
11
 
11
 /**
12
 /**
31
 		Expression tValue = value.transform(transformer);
32
 		Expression tValue = value.transform(transformer);
32
 		return tValue == value ? this : new TryRethrowAsExceptionExpression(position, type, tValue, thrownType);
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
 package org.openzen.zenscript.codemodel.expression;
6
 package org.openzen.zenscript.codemodel.expression;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.type.ITypeID;
10
 import org.openzen.zenscript.codemodel.type.ITypeID;
10
 
11
 
11
 /**
12
 /**
31
 		Expression tValue = value.transform(transformer);
32
 		Expression tValue = value.transform(transformer);
32
 		return tValue == value ? this : new TryRethrowAsResultExpression(position, type, tValue);
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
 		Expression[] tArguments = Expression.transform(arguments, transformer);
52
 		Expression[] tArguments = Expression.transform(arguments, transformer);
53
 		return tArguments == arguments ? this : new VariantValueExpression(position, type, option, tArguments);
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
 package org.openzen.zenscript.codemodel.expression;
6
 package org.openzen.zenscript.codemodel.expression;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.type.ITypeID;
10
 import org.openzen.zenscript.codemodel.type.ITypeID;
10
 
11
 
11
 /**
12
 /**
34
 		Expression tValue = value.transform(transformer);
35
 		Expression tValue = value.transform(transformer);
35
 		return tValue == value ? this : new WrapOptionalExpression(position, tValue, type);
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
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
12
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
13
 import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
13
 import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
14
+import org.openzen.zenscript.codemodel.scope.TypeScope;
14
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
15
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
15
 import org.openzen.zenscript.codemodel.type.member.BuiltinID;
16
 import org.openzen.zenscript.codemodel.type.member.BuiltinID;
16
 import org.openzen.zenscript.codemodel.type.member.TypeMemberPriority;
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
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
 import org.openzen.zenscript.codemodel.Modifiers;
12
 import org.openzen.zenscript.codemodel.Modifiers;
13
 import org.openzen.zenscript.codemodel.member.ref.CasterMemberRef;
13
 import org.openzen.zenscript.codemodel.member.ref.CasterMemberRef;
14
+import org.openzen.zenscript.codemodel.scope.TypeScope;
14
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
15
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
15
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
16
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
16
 import org.openzen.zenscript.codemodel.type.ITypeID;
17
 import org.openzen.zenscript.codemodel.type.ITypeID;
22
  * @author Hoofdgebruiker
23
  * @author Hoofdgebruiker
23
  */
24
  */
24
 public class CasterMember extends FunctionalMember {
25
 public class CasterMember extends FunctionalMember {
25
-	public final ITypeID toType;
26
+	public ITypeID toType;
26
 	public CasterMemberRef overrides;
27
 	public CasterMemberRef overrides;
27
 	
28
 	
28
 	public CasterMember(
29
 	public CasterMember(
49
 
50
 
50
 	@Override
51
 	@Override
51
 	public void registerTo(TypeMembers type, TypeMemberPriority priority, GenericMapper mapper) {
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
 	@Override
56
 	@Override
78
 	public CasterMemberRef getOverrides() {
79
 	public CasterMemberRef getOverrides() {
79
 		return overrides;
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
 import org.openzen.zenscript.codemodel.expression.Expression;
11
 import org.openzen.zenscript.codemodel.expression.Expression;
12
 import org.openzen.zenscript.codemodel.member.ref.ConstMemberRef;
12
 import org.openzen.zenscript.codemodel.member.ref.ConstMemberRef;
13
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
13
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
14
+import org.openzen.zenscript.codemodel.scope.TypeScope;
14
 import org.openzen.zenscript.codemodel.type.ITypeID;
15
 import org.openzen.zenscript.codemodel.type.ITypeID;
15
 import org.openzen.zenscript.codemodel.type.member.BuiltinID;
16
 import org.openzen.zenscript.codemodel.type.member.BuiltinID;
16
 import org.openzen.zenscript.codemodel.type.member.TypeMemberPriority;
17
 import org.openzen.zenscript.codemodel.type.member.TypeMemberPriority;
20
  *
21
  *
21
  * @author Hoofdgebruiker
22
  * @author Hoofdgebruiker
22
  */
23
  */
23
-public class ConstMember extends DefinitionMember {
24
+public class ConstMember extends PropertyMember {
24
 	public final String name;
25
 	public final String name;
25
-	public ITypeID type;
26
 	public Expression value;
26
 	public Expression value;
27
 	public final BuiltinID builtin;
27
 	public final BuiltinID builtin;
28
 	
28
 	
29
 	public ConstMember(CodePosition position, HighLevelDefinition definition, int modifiers, String name, ITypeID type, BuiltinID builtin) {
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
 		this.name = name;
32
 		this.name = name;
33
-		this.type = type;
34
 		this.builtin = builtin;
33
 		this.builtin = builtin;
35
 	}
34
 	}
36
 
35
 
46
 
45
 
47
 	@Override
46
 	@Override
48
 	public void registerTo(TypeMembers members, TypeMemberPriority priority, GenericMapper mapper) {
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
 	@Override
51
 	@Override
58
 	public DefinitionMemberRef getOverrides() {
57
 	public DefinitionMemberRef getOverrides() {
59
 		return null;
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
 package org.openzen.zenscript.codemodel.member;
6
 package org.openzen.zenscript.codemodel.member;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.FunctionHeader;
9
 import org.openzen.zenscript.codemodel.GenericMapper;
10
 import org.openzen.zenscript.codemodel.GenericMapper;
10
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
11
 import org.openzen.zenscript.codemodel.iterator.ForeachIteratorVisitor;
12
 import org.openzen.zenscript.codemodel.iterator.ForeachIteratorVisitor;
12
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
13
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
13
 import org.openzen.zenscript.codemodel.member.ref.IteratorMemberRef;
14
 import org.openzen.zenscript.codemodel.member.ref.IteratorMemberRef;
14
 import org.openzen.zenscript.codemodel.statement.Statement;
15
 import org.openzen.zenscript.codemodel.statement.Statement;
16
+import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
15
 import org.openzen.zenscript.codemodel.type.ITypeID;
17
 import org.openzen.zenscript.codemodel.type.ITypeID;
16
 import org.openzen.zenscript.codemodel.type.member.BuiltinID;
18
 import org.openzen.zenscript.codemodel.type.member.BuiltinID;
17
 import org.openzen.zenscript.codemodel.type.member.TypeMemberPriority;
19
 import org.openzen.zenscript.codemodel.type.member.TypeMemberPriority;
21
  *
23
  *
22
  * @author Hoofdgebruiker
24
  * @author Hoofdgebruiker
23
  */
25
  */
24
-public class CustomIteratorMember extends DefinitionMember implements IIteratorMember {
26
+public class CustomIteratorMember extends FunctionalMember implements IIteratorMember {
25
 	private final ITypeID[] iteratorTypes;
27
 	private final ITypeID[] iteratorTypes;
26
 	public Statement body;
28
 	public Statement body;
27
 	public IteratorMemberRef overrides;
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
 		this.iteratorTypes = iteratorTypes;
34
 		this.iteratorTypes = iteratorTypes;
33
 	}
35
 	}
35
 	public void setContent(Statement body) {
37
 	public void setContent(Statement body) {
36
 		this.body = body;
38
 		this.body = body;
37
 	}
39
 	}
40
+	
41
+	@Override
42
+	public String getCanonicalName() {
43
+		return definition.getFullName() + ":iterator:" + iteratorTypes.length;
44
+	}
38
 
45
 
39
 	@Override
46
 	@Override
40
 	public int getLoopVariableCount() {
47
 	public int getLoopVariableCount() {
79
 	public DefinitionMemberRef getOverrides() {
86
 	public DefinitionMemberRef getOverrides() {
80
 		return overrides;
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
 		return position;
32
 		return position;
33
 	}
33
 	}
34
 	
34
 	
35
+	public MemberAnnotation[] getAnnotations() {
36
+		return annotations;
37
+	}
38
+	
35
 	public boolean isStatic() {
39
 	public boolean isStatic() {
36
 		return Modifiers.isStatic(modifiers);
40
 		return Modifiers.isStatic(modifiers);
37
 	}
41
 	}

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

15
 import org.openzen.zenscript.codemodel.expression.ThisExpression;
15
 import org.openzen.zenscript.codemodel.expression.ThisExpression;
16
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
16
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
17
 import org.openzen.zenscript.codemodel.member.ref.FieldMemberRef;
17
 import org.openzen.zenscript.codemodel.member.ref.FieldMemberRef;
18
+import org.openzen.zenscript.codemodel.scope.TypeScope;
18
 import org.openzen.zenscript.codemodel.statement.ExpressionStatement;
19
 import org.openzen.zenscript.codemodel.statement.ExpressionStatement;
19
 import org.openzen.zenscript.codemodel.statement.ReturnStatement;
20
 import org.openzen.zenscript.codemodel.statement.ReturnStatement;
20
-import org.openzen.zenscript.codemodel.type.GenericTypeID;
21
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
21
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
22
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
22
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
23
 import org.openzen.zenscript.codemodel.type.ITypeID;
23
 import org.openzen.zenscript.codemodel.type.ITypeID;
28
  *
28
  *
29
  * @author Hoofdgebruiker
29
  * @author Hoofdgebruiker
30
  */
30
  */
31
-public class FieldMember extends DefinitionMember {
31
+public class FieldMember extends PropertyMember {
32
 	public final String name;
32
 	public final String name;
33
-	public ITypeID type;
34
 	public Expression initializer;
33
 	public Expression initializer;
35
 	public final int autoGetterAccess;
34
 	public final int autoGetterAccess;
36
 	public final int autoSetterAccess;
35
 	public final int autoSetterAccess;
37
-	public final BuiltinID builtin;
38
 	
36
 	
39
 	public final GetterMember autoGetter;
37
 	public final GetterMember autoGetter;
40
 	public final SetterMember autoSetter;
38
 	public final SetterMember autoSetter;
44
 			HighLevelDefinition definition,
42
 			HighLevelDefinition definition,
45
 			int modifiers,
43
 			int modifiers,
46
 			String name,
44
 			String name,
45
+			ITypeID thisType,
47
 			ITypeID type,
46
 			ITypeID type,
48
 			GlobalTypeRegistry registry,
47
 			GlobalTypeRegistry registry,
49
 			int autoGetterAccess,
48
 			int autoGetterAccess,
50
 			int autoSetterAccess,
49
 			int autoSetterAccess,
51
 			BuiltinID builtin)
50
 			BuiltinID builtin)
52
 	{
51
 	{
53
-		super(position, definition, modifiers);
52
+		super(position, definition, modifiers, type, builtin);
54
 		
53
 		
55
 		this.name = name;
54
 		this.name = name;
56
-		this.type = type;
57
 		this.autoGetterAccess = autoGetterAccess;
55
 		this.autoGetterAccess = autoGetterAccess;
58
 		this.autoSetterAccess = autoSetterAccess;
56
 		this.autoSetterAccess = autoSetterAccess;
59
-		this.builtin = builtin;
60
 		
57
 		
61
 		ITypeID[] parameters = null;
58
 		ITypeID[] parameters = null;
62
 		if (definition.genericParameters != null) {
59
 		if (definition.genericParameters != null) {
63
 			parameters = new ITypeID[definition.genericParameters.length];
60
 			parameters = new ITypeID[definition.genericParameters.length];
64
 			for (int i = 0; i < parameters.length; i++)
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
 		if (autoGetterAccess != 0) {
65
 		if (autoGetterAccess != 0) {
69
-			ITypeID myType = registry.getForDefinition(definition, parameters);
70
 			this.autoGetter = new GetterMember(position, definition, autoGetterAccess, name, type, null);
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
 		} else {
71
 		} else {
73
 			this.autoGetter = null;
72
 			this.autoGetter = null;
74
 		}
73
 		}
75
 		if (autoSetterAccess != 0) {
74
 		if (autoSetterAccess != 0) {
76
-			ITypeID myType = registry.getForDefinition(definition, parameters);
77
 			this.autoSetter = new SetterMember(position, definition, autoSetterAccess, name, type, null);
75
 			this.autoSetter = new SetterMember(position, definition, autoSetterAccess, name, type, null);
78
 			this.autoSetter.setBody(new ExpressionStatement(position, new SetFieldExpression(
76
 			this.autoSetter.setBody(new ExpressionStatement(position, new SetFieldExpression(
79
 					position,
77
 					position,
80
-					new ThisExpression(position, myType),
81
-					new FieldMemberRef(this, myType),
78
+					new ThisExpression(position, thisType),
79
+					new FieldMemberRef(this, null),
82
 					new GetFunctionParameterExpression(position, this.autoSetter.header.parameters[0]))));
80
 					new GetFunctionParameterExpression(position, this.autoSetter.header.parameters[0]))));
83
 		} else {
81
 		} else {
84
 			this.autoSetter = null;
82
 			this.autoSetter = null;
97
 			SetterMember autoSetter,
95
 			SetterMember autoSetter,
98
 			BuiltinID builtin)
96
 			BuiltinID builtin)
99
 	{
97
 	{
100
-		super(position, definition, modifiers);
98
+		super(position, definition, modifiers, type, builtin);
101
 		
99
 		
102
 		this.name = name;
100
 		this.name = name;
103
-		this.type = type;
104
 		this.autoGetterAccess = autoGetterAccess;
101
 		this.autoGetterAccess = autoGetterAccess;
105
 		this.autoSetterAccess = autoSetterAccess;
102
 		this.autoSetterAccess = autoSetterAccess;
106
 		this.autoGetter = autoGetter;
103
 		this.autoGetter = autoGetter;
107
 		this.autoSetter = autoSetter;
104
 		this.autoSetter = autoSetter;
108
-		this.builtin = builtin;
109
 	}
105
 	}
110
 	
106
 	
111
 	public boolean hasAutoGetter() {
107
 	public boolean hasAutoGetter() {
122
 
118
 
123
 	@Override
119
 	@Override
124
 	public void registerTo(TypeMembers members, TypeMemberPriority priority, GenericMapper mapper) {
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
 	@Override
124
 	@Override
144
 	public DefinitionMemberRef getOverrides() {
140
 	public DefinitionMemberRef getOverrides() {
145
 		return null;
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
 	GETTER,
17
 	GETTER,
18
 	SETTER,
18
 	SETTER,
19
 	CALLER,
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
 package org.openzen.zenscript.codemodel.member;
6
 package org.openzen.zenscript.codemodel.member;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zencode.shared.ConcatMap;
9
 import org.openzen.zenscript.codemodel.FunctionHeader;
10
 import org.openzen.zenscript.codemodel.FunctionHeader;
10
 import org.openzen.zenscript.codemodel.GenericMapper;
11
 import org.openzen.zenscript.codemodel.GenericMapper;
11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
 import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
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
 import org.openzen.zenscript.codemodel.statement.Statement;
16
 import org.openzen.zenscript.codemodel.statement.Statement;
14
 import org.openzen.zenscript.codemodel.type.member.BuiltinID;
17
 import org.openzen.zenscript.codemodel.type.member.BuiltinID;
15
 
18
 
43
 	public abstract FunctionalKind getKind();
46
 	public abstract FunctionalKind getKind();
44
 	
47
 	
45
 	public FunctionalMemberRef ref(GenericMapper mapper) {
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
 	@Override
52
 	@Override
50
 	public BuiltinID getBuiltin() {
53
 	public BuiltinID getBuiltin() {
51
 		return builtin;
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
 import org.openzen.zenscript.codemodel.FunctionHeader;
9
 import org.openzen.zenscript.codemodel.FunctionHeader;
10
 import org.openzen.zenscript.codemodel.GenericMapper;
10
 import org.openzen.zenscript.codemodel.GenericMapper;
11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
-import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
13
 import org.openzen.zenscript.codemodel.member.ref.GetterMemberRef;
12
 import org.openzen.zenscript.codemodel.member.ref.GetterMemberRef;
14
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
13
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
15
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
14
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
21
  *
20
  *
22
  * @author Hoofdgebruiker
21
  * @author Hoofdgebruiker
23
  */
22
  */
24
-public class GetterMember extends FunctionalMember {
23
+public class GetterMember extends FunctionalMember implements IPropertyMember {
25
 	public final String name;
24
 	public final String name;
26
 	public ITypeID type;
25
 	public ITypeID type;
27
 	private GetterMemberRef overrides;
26
 	private GetterMemberRef overrides;
39
 		this.type = type;
38
 		this.type = type;
40
 	}
39
 	}
41
 	
40
 	
41
+	@Override
42
+	public ITypeID getType() {
43
+		return type;
44
+	}
45
+	
42
 	@Override
46
 	@Override
43
 	public String getCanonicalName() {
47
 	public String getCanonicalName() {
44
 		return definition.getFullName() + ":getter:" + name;
48
 		return definition.getFullName() + ":getter:" + name;
51
 	
55
 	
52
 	@Override
56
 	@Override
53
 	public void registerTo(TypeMembers members, TypeMemberPriority priority, GenericMapper mapper) {
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
 	@Override
61
 	@Override
73
 		this.overrides = override;
77
 		this.overrides = override;
74
 		
78
 		
75
 		if (type == BasicTypeID.UNDETERMINED)
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
 import org.openzen.zenscript.codemodel.FunctionHeader;
9
 import org.openzen.zenscript.codemodel.FunctionHeader;
10
 import org.openzen.zenscript.codemodel.GenericMapper;
10
 import org.openzen.zenscript.codemodel.GenericMapper;
11
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
11
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
12
+import org.openzen.zenscript.codemodel.scope.TypeScope;
12
 import org.openzen.zenscript.codemodel.type.member.BuiltinID;
13
 import org.openzen.zenscript.codemodel.type.member.BuiltinID;
13
 import org.openzen.zenscript.codemodel.type.member.TypeMemberPriority;
14
 import org.openzen.zenscript.codemodel.type.member.TypeMemberPriority;
14
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
15
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
35
 	<T> boolean hasTag(Class<T> tag);
36
 	<T> boolean hasTag(Class<T> tag);
36
 	
37
 	
37
 	DefinitionMemberRef getOverrides();
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

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