Browse Source

Merge branch 'development' of git.openzen.org:ZenScript/ZenScript into development

kindlich 6 years ago
parent
commit
01bf2ac5d4
No known key found for this signature in database
100 changed files with 1101 additions and 438 deletions
  1. 1
    1
      CodeFormatter/src/main/java/org/openzen/zenscript/formatter/DefinitionFormatter.java
  2. 17
    11
      CodeFormatter/src/main/java/org/openzen/zenscript/formatter/ExpressionFormatter.java
  3. 9
    9
      CodeFormatter/src/main/java/org/openzen/zenscript/formatter/FormattingUtils.java
  4. 16
    16
      CodeFormatter/src/main/java/org/openzen/zenscript/formatter/MemberFormatter.java
  5. 2
    2
      CodeFormatter/src/main/java/org/openzen/zenscript/formatter/StatementFormatter.java
  6. 30
    22
      CodeFormatter/src/main/java/org/openzen/zenscript/formatter/TypeFormatter.java
  7. 56
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/AccessScope.java
  8. 86
    72
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/FunctionHeader.java
  9. 19
    20
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/FunctionParameter.java
  10. 18
    18
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/GenericMapper.java
  11. 9
    5
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/GenericName.java
  12. 47
    6
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/HighLevelDefinition.java
  13. 7
    3
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/Modifiers.java
  14. 6
    3
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/Module.java
  15. 18
    2
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/ScriptBlock.java
  16. 2
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/WhitespaceInfo.java
  17. 2
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/WhitespacePostComment.java
  18. 2
    2
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/AnnotationDefinition.java
  19. 102
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/InvalidAnnotationDefinition.java
  20. 56
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/InvalidDefinitionAnnotation.java
  21. 70
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/InvalidMemberAnnotation.java
  22. 42
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/InvalidParameterAnnotation.java
  23. 44
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/InvalidStatementAnnotation.java
  24. 4
    3
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/NativeAnnotationDefinition.java
  25. 3
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/NativeTag.java
  26. 2
    2
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/ParameterAnnotation.java
  27. 9
    7
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/PreconditionAnnotationDefinition.java
  28. 19
    12
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/PreconditionForMethod.java
  29. 5
    5
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/CompilingPackage.java
  30. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/CompilingType.java
  31. 19
    6
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/FileResolutionContext.java
  32. 18
    5
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/LocalTypeResolutionContext.java
  33. 22
    5
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/ModuleTypeResolutionContext.java
  34. 3
    3
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/StatementContext.java
  35. 7
    10
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/TypeContext.java
  36. 8
    4
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/TypeResolutionContext.java
  37. 3
    3
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/definition/AliasDefinition.java
  38. 2
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/definition/EnumDefinition.java
  39. 2
    2
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/definition/ExpansionDefinition.java
  40. 6
    7
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/definition/FunctionDefinition.java
  41. 4
    4
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/definition/InterfaceDefinition.java
  42. 6
    4
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/definition/VariantDefinition.java
  43. 6
    6
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/definition/ZSPackage.java
  44. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/AndAndExpression.java
  45. 5
    4
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ArrayExpression.java
  46. 11
    11
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CallArguments.java
  47. 3
    3
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CallStaticExpression.java
  48. 2
    2
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CapturedExpression.java
  49. 2
    2
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CapturedThisExpression.java
  50. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CompareExpression.java
  51. 4
    4
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConditionalExpression.java
  52. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantBoolExpression.java
  53. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantByteExpression.java
  54. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantCharExpression.java
  55. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantDoubleExpression.java
  56. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantFloatExpression.java
  57. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantIntExpression.java
  58. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantLongExpression.java
  59. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantSByteExpression.java
  60. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantShortExpression.java
  61. 2
    2
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantStringExpression.java
  62. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantUIntExpression.java
  63. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantULongExpression.java
  64. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantUShortExpression.java
  65. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantUSizeExpression.java
  66. 4
    4
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstructorSuperCallExpression.java
  67. 5
    5
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstructorThisCallExpression.java
  68. 2
    2
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/DummyExpression.java
  69. 5
    4
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/EnumConstantExpression.java
  70. 23
    21
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/Expression.java
  71. 13
    11
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ExpressionBuilder.java
  72. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ExpressionVisitor.java
  73. 4
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ExpressionVisitorWithContext.java
  74. 4
    3
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/FunctionExpression.java
  75. 2
    2
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/GetFieldExpression.java
  76. 2
    2
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/GetStaticFieldExpression.java
  77. 9
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/GetterExpression.java
  78. 7
    5
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/InterfaceCastExpression.java
  79. 52
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/InvalidExpression.java
  80. 6
    6
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/IsExpression.java
  81. 2
    2
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/MakeConstExpression.java
  82. 2
    2
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/MapExpression.java
  83. 7
    6
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/MatchExpression.java
  84. 4
    3
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/NewExpression.java
  85. 3
    3
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/NullExpression.java
  86. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/OrOrExpression.java
  87. 2
    2
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/PanicExpression.java
  88. 7
    7
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/RangeExpression.java
  89. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/SameObjectExpression.java
  90. 8
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/StaticGetterExpression.java
  91. 46
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/StorageCastExpression.java
  92. 2
    2
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/SupertypeCastExpression.java
  93. 2
    2
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ThisExpression.java
  94. 2
    2
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ThrowExpression.java
  95. 2
    2
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/TryConvertExpression.java
  96. 2
    2
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/TryRethrowAsExceptionExpression.java
  97. 2
    2
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/TryRethrowAsResultExpression.java
  98. 6
    5
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/VariantValueExpression.java
  99. 2
    2
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/WrapOptionalExpression.java
  100. 0
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/generic/ParameterSuperBound.java

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

195
 				for (int i = 0; i < option.types.length; i++) {
195
 				for (int i = 0; i < option.types.length; i++) {
196
 					if (i > 0)
196
 					if (i > 0)
197
 						output.append(", ");
197
 						output.append(", ");
198
-					output.append(option.types[i].accept(typeFormatter));
198
+					output.append(typeFormatter.format(option.types[i]));
199
 				}
199
 				}
200
 			}
200
 			}
201
 		}
201
 		}

+ 17
- 11
CodeFormatter/src/main/java/org/openzen/zenscript/formatter/ExpressionFormatter.java View File

70
 import org.openzen.zenscript.codemodel.expression.SetterExpression;
70
 import org.openzen.zenscript.codemodel.expression.SetterExpression;
71
 import org.openzen.zenscript.codemodel.expression.StaticGetterExpression;
71
 import org.openzen.zenscript.codemodel.expression.StaticGetterExpression;
72
 import org.openzen.zenscript.codemodel.expression.StaticSetterExpression;
72
 import org.openzen.zenscript.codemodel.expression.StaticSetterExpression;
73
+import org.openzen.zenscript.codemodel.expression.StorageCastExpression;
73
 import org.openzen.zenscript.codemodel.expression.SupertypeCastExpression;
74
 import org.openzen.zenscript.codemodel.expression.SupertypeCastExpression;
74
 import org.openzen.zenscript.codemodel.expression.ThisExpression;
75
 import org.openzen.zenscript.codemodel.expression.ThisExpression;
75
 import org.openzen.zenscript.codemodel.expression.ThrowExpression;
76
 import org.openzen.zenscript.codemodel.expression.ThrowExpression;
237
 				case CAST: {
238
 				case CAST: {
238
 					StringBuilder result = new StringBuilder();
239
 					StringBuilder result = new StringBuilder();
239
 					result.append(" as ");
240
 					result.append(" as ");
240
-					result.append(expression.arguments.typeArguments[0].accept(typeFormatter));
241
+					result.append(typeFormatter.format(expression.arguments.typeArguments[0]));
241
 					return new ExpressionString(result.toString(), ZenScriptOperator.CAST);
242
 					return new ExpressionString(result.toString(), ZenScriptOperator.CAST);
242
 				}
243
 				}
243
 				default:
244
 				default:
311
 		result.append(expression.target.accept(this).value);
312
 		result.append(expression.target.accept(this).value);
312
 		if (!expression.isImplicit) {
313
 		if (!expression.isImplicit) {
313
 			result.append(" as ");
314
 			result.append(" as ");
314
-			result.append(expression.member.toType.accept(typeFormatter));
315
+			result.append(typeFormatter.format(expression.member.toType));
315
 		}
316
 		}
316
 		return new ExpressionString(result.toString(), ZenScriptOperator.PRIMARY);
317
 		return new ExpressionString(result.toString(), ZenScriptOperator.PRIMARY);
317
 	}
318
 	}
340
 	@Override
341
 	@Override
341
 	public ExpressionString visitConst(ConstExpression expression) {
342
 	public ExpressionString visitConst(ConstExpression expression) {
342
 		StringBuilder result = new StringBuilder();
343
 		StringBuilder result = new StringBuilder();
343
-		result.append(expression.type.accept(typeFormatter));
344
+		result.append(typeFormatter.format(expression.type));
344
 		result.append('.');
345
 		result.append('.');
345
 		result.append(expression.constant.member.name);
346
 		result.append(expression.constant.member.name);
346
 		return new ExpressionString(result.toString(), ZenScriptOperator.MEMBER);
347
 		return new ExpressionString(result.toString(), ZenScriptOperator.MEMBER);
439
 
440
 
440
 	@Override
441
 	@Override
441
 	public ExpressionString visitEnumConstant(EnumConstantExpression expression) {
442
 	public ExpressionString visitEnumConstant(EnumConstantExpression expression) {
442
-		return new ExpressionString(expression.type.accept(typeFormatter) + "." + expression.value.name, ZenScriptOperator.MEMBER);
443
+		return new ExpressionString(typeFormatter.format(expression.type) + "." + expression.value.name, ZenScriptOperator.MEMBER);
443
 	}
444
 	}
444
 
445
 
445
 	@Override
446
 	@Override
496
 	@Override
497
 	@Override
497
 	public ExpressionString visitGetStaticField(GetStaticFieldExpression expression) {
498
 	public ExpressionString visitGetStaticField(GetStaticFieldExpression expression) {
498
 		StringBuilder result = new StringBuilder();
499
 		StringBuilder result = new StringBuilder();
499
-		result.append(expression.type.accept(typeFormatter));
500
+		result.append(typeFormatter.format(expression.type));
500
 		result.append('.');
501
 		result.append('.');
501
 		result.append(expression.field.member.name);
502
 		result.append(expression.field.member.name);
502
 		return new ExpressionString(result.toString(), ZenScriptOperator.MEMBER);
503
 		return new ExpressionString(result.toString(), ZenScriptOperator.MEMBER);
529
 		StringBuilder result = new StringBuilder();
530
 		StringBuilder result = new StringBuilder();
530
 		result.append(expression.value.accept(this).value);
531
 		result.append(expression.value.accept(this).value);
531
 		result.append(" as ");
532
 		result.append(" as ");
532
-		result.append(expression.type.accept(typeFormatter));
533
+		result.append(typeFormatter.format(expression.type));
533
 		return new ExpressionString(result.toString(), ZenScriptOperator.CAST);
534
 		return new ExpressionString(result.toString(), ZenScriptOperator.CAST);
534
 	}
535
 	}
535
 
536
 
538
 		StringBuilder result = new StringBuilder();
539
 		StringBuilder result = new StringBuilder();
539
 		result.append(expression.value.accept(this).value);
540
 		result.append(expression.value.accept(this).value);
540
 		result.append(" is ");
541
 		result.append(" is ");
541
-		result.append(expression.type.accept(typeFormatter));
542
+		result.append(typeFormatter.format(expression.type));
542
 		return new ExpressionString(result.toString(), ZenScriptOperator.IS);
543
 		return new ExpressionString(result.toString(), ZenScriptOperator.IS);
543
 	}
544
 	}
544
 
545
 
576
 	public ExpressionString visitNew(NewExpression expression) {
577
 	public ExpressionString visitNew(NewExpression expression) {
577
 		StringBuilder result = new StringBuilder();
578
 		StringBuilder result = new StringBuilder();
578
 		result.append("new ");
579
 		result.append("new ");
579
-		result.append(expression.type.accept(typeFormatter));
580
+		result.append(typeFormatter.format(expression.type));
580
 		FormattingUtils.formatCall(result, typeFormatter, this, expression.arguments);
581
 		FormattingUtils.formatCall(result, typeFormatter, this, expression.arguments);
581
 		return new ExpressionString(result.toString(), ZenScriptOperator.PRIMARY);
582
 		return new ExpressionString(result.toString(), ZenScriptOperator.PRIMARY);
582
 	}
583
 	}
635
 	@Override
636
 	@Override
636
 	public ExpressionString visitSetStaticField(SetStaticFieldExpression expression) {
637
 	public ExpressionString visitSetStaticField(SetStaticFieldExpression expression) {
637
 		return new ExpressionString(
638
 		return new ExpressionString(
638
-				expression.type.accept(typeFormatter) + "." + expression.field.member.name + " = " + expression.value.accept(this).value,
639
+				typeFormatter.format(expression.type) + "." + expression.field.member.name + " = " + expression.value.accept(this).value,
639
 				ZenScriptOperator.ASSIGN);
640
 				ZenScriptOperator.ASSIGN);
640
 	}
641
 	}
641
 
642
 
649
 	@Override
650
 	@Override
650
 	public ExpressionString visitStaticGetter(StaticGetterExpression expression) {
651
 	public ExpressionString visitStaticGetter(StaticGetterExpression expression) {
651
 		return new ExpressionString(
652
 		return new ExpressionString(
652
-				expression.type.accept(typeFormatter) + "." + expression.getter.member.name, 
653
+				typeFormatter.format(expression.type) + "." + expression.getter.member.name, 
653
 				ZenScriptOperator.MEMBER);
654
 				ZenScriptOperator.MEMBER);
654
 	}
655
 	}
655
 
656
 
656
 	@Override
657
 	@Override
657
 	public ExpressionString visitStaticSetter(StaticSetterExpression expression) {
658
 	public ExpressionString visitStaticSetter(StaticSetterExpression expression) {
658
 		return new ExpressionString(
659
 		return new ExpressionString(
659
-				expression.type.accept(typeFormatter) + "." + expression.setter.member.name + " = " + expression.setter.member.name,
660
+				typeFormatter.format(expression.type) + "." + expression.setter.member.name + " = " + expression.setter.member.name,
660
 				ZenScriptOperator.ASSIGN);
661
 				ZenScriptOperator.ASSIGN);
661
 	}
662
 	}
662
 	
663
 	
664
+	@Override
665
+	public ExpressionString visitStorageCast(StorageCastExpression expression) {
666
+		return expression.value.accept(this);
667
+	}
668
+	
663
 	@Override
669
 	@Override
664
 	public ExpressionString visitSupertypeCast(SupertypeCastExpression expression) {
670
 	public ExpressionString visitSupertypeCast(SupertypeCastExpression expression) {
665
 		return expression.value.accept(this);
671
 		return expression.value.accept(this);

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

30
 import org.openzen.zenscript.codemodel.statement.VarStatement;
30
 import org.openzen.zenscript.codemodel.statement.VarStatement;
31
 import org.openzen.zenscript.codemodel.statement.WhileStatement;
31
 import org.openzen.zenscript.codemodel.statement.WhileStatement;
32
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
32
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
33
-import org.openzen.zenscript.codemodel.type.ITypeID;
33
+import org.openzen.zenscript.codemodel.type.StoredType;
34
 
34
 
35
 /**
35
 /**
36
  *
36
  *
46
 			output.append("protected ");
46
 			output.append("protected ");
47
 		if (Modifiers.isPublic(modifiers))
47
 		if (Modifiers.isPublic(modifiers))
48
 			output.append("public ");
48
 			output.append("public ");
49
-		if (Modifiers.isExport(modifiers))
50
-			output.append("export ");
49
+		if (Modifiers.isInternal(modifiers))
50
+			output.append("internal ");
51
 		if (Modifiers.isStatic(modifiers))
51
 		if (Modifiers.isStatic(modifiers))
52
 			output.append("static ");
52
 			output.append("static ");
53
 		if (Modifiers.isAbstract(modifiers))
53
 		if (Modifiers.isAbstract(modifiers))
78
 			if (parameter.variadic)
78
 			if (parameter.variadic)
79
 				result.append("...");
79
 				result.append("...");
80
 			
80
 			
81
-			if (!settings.showAnyInFunctionHeaders || parameter.type != BasicTypeID.UNDETERMINED) {
81
+			if (!settings.showAnyInFunctionHeaders || !parameter.type.isBasic(BasicTypeID.UNDETERMINED)) {
82
 				result.append(" as ");
82
 				result.append(" as ");
83
-				result.append(header.getReturnType().accept(typeFormatter));
83
+				result.append(typeFormatter.format(header.getReturnType()));
84
 			}
84
 			}
85
 			
85
 			
86
 			parameterIndex++;
86
 			parameterIndex++;
87
 		}
87
 		}
88
 		result.append(")");
88
 		result.append(")");
89
-		if (!settings.showAnyInFunctionHeaders || header.getReturnType() != BasicTypeID.UNDETERMINED) {
89
+		if (!settings.showAnyInFunctionHeaders || !header.getReturnType().isBasic(BasicTypeID.UNDETERMINED)) {
90
 			result.append(" as ");
90
 			result.append(" as ");
91
-			result.append(header.getReturnType().accept(typeFormatter));
91
+			result.append(typeFormatter.format(header.getReturnType()));
92
 		}
92
 		}
93
 	}
93
 	}
94
 	
94
 	
128
 			result.append("<");
128
 			result.append("<");
129
 			
129
 			
130
 			int index = 0;
130
 			int index = 0;
131
-			for (ITypeID typeArgument : arguments.typeArguments) {
131
+			for (StoredType typeArgument : arguments.typeArguments) {
132
 				if (index > 0)
132
 				if (index > 0)
133
 					result.append(", ");
133
 					result.append(", ");
134
-				result.append(typeArgument.accept(typeFormatter));
134
+				result.append(typeFormatter.format(typeArgument));
135
 				index++;
135
 				index++;
136
 			}
136
 			}
137
 			result.append(">");
137
 			result.append(">");

+ 16
- 16
CodeFormatter/src/main/java/org/openzen/zenscript/formatter/MemberFormatter.java View File

58
 	@Override
58
 	@Override
59
 	public Void visitConst(ConstMember member) {
59
 	public Void visitConst(ConstMember member) {
60
 		visit(true);
60
 		visit(true);
61
-		FormattingUtils.formatModifiers(output, member.modifiers & ~Modifiers.FINAL);
61
+		FormattingUtils.formatModifiers(output, member.getSpecifiedModifiers());
62
 		output.append("const")
62
 		output.append("const")
63
 				.append(member.name)
63
 				.append(member.name)
64
 				.append(" as ")
64
 				.append(" as ")
65
-				.append(member.type.accept(typeFormatter))
65
+				.append(typeFormatter.format(member.type))
66
 				.append(" = ")
66
 				.append(" = ")
67
 				.append(member.value.accept(new ExpressionFormatter(settings, typeFormatter, indent)))
67
 				.append(member.value.accept(new ExpressionFormatter(settings, typeFormatter, indent)))
68
 				.append(";\n");
68
 				.append(";\n");
72
 	@Override
72
 	@Override
73
 	public Void visitField(FieldMember member) {
73
 	public Void visitField(FieldMember member) {
74
 		visit(true);
74
 		visit(true);
75
-		FormattingUtils.formatModifiers(output, member.modifiers & ~Modifiers.FINAL);
75
+		FormattingUtils.formatModifiers(output, member.getSpecifiedModifiers());
76
 		output.append(member.isFinal() ? "val " : "var ")
76
 		output.append(member.isFinal() ? "val " : "var ")
77
 				.append(member.name)
77
 				.append(member.name)
78
 				.append(" as ")
78
 				.append(" as ")
79
-				.append(member.type.accept(typeFormatter));
79
+				.append(typeFormatter.format(member.type));
80
 		
80
 		
81
 		if (member.initializer != null) {
81
 		if (member.initializer != null) {
82
 			output.append(" = ")
82
 			output.append(" = ")
89
 	@Override
89
 	@Override
90
 	public Void visitConstructor(ConstructorMember member) {
90
 	public Void visitConstructor(ConstructorMember member) {
91
 		visit(false);
91
 		visit(false);
92
-		FormattingUtils.formatModifiers(output, member.modifiers & ~Modifiers.FINAL);
92
+		FormattingUtils.formatModifiers(output, member.getSpecifiedModifiers());
93
 		output.append("this");
93
 		output.append("this");
94
 		FormattingUtils.formatHeader(output, settings, member.header, typeFormatter);
94
 		FormattingUtils.formatHeader(output, settings, member.header, typeFormatter);
95
 		formatBody(member.body);
95
 		formatBody(member.body);
99
 	@Override
99
 	@Override
100
 	public Void visitDestructor(DestructorMember member) {
100
 	public Void visitDestructor(DestructorMember member) {
101
 		visit(false);
101
 		visit(false);
102
-		FormattingUtils.formatModifiers(output, member.modifiers & ~Modifiers.FINAL);
102
+		FormattingUtils.formatModifiers(output, member.getSpecifiedModifiers());
103
 		output.append("this");
103
 		output.append("this");
104
 		formatBody(member.body);
104
 		formatBody(member.body);
105
 		return null;
105
 		return null;
108
 	@Override
108
 	@Override
109
 	public Void visitMethod(MethodMember member) {
109
 	public Void visitMethod(MethodMember member) {
110
 		visit(false);
110
 		visit(false);
111
-		FormattingUtils.formatModifiers(output, member.modifiers & ~Modifiers.FINAL);
111
+		FormattingUtils.formatModifiers(output, member.getSpecifiedModifiers());
112
 		output.append(member.name);
112
 		output.append(member.name);
113
 		FormattingUtils.formatHeader(output, settings, member.header, typeFormatter);
113
 		FormattingUtils.formatHeader(output, settings, member.header, typeFormatter);
114
 		formatBody(member.body);
114
 		formatBody(member.body);
118
 	@Override
118
 	@Override
119
 	public Void visitGetter(GetterMember member) {
119
 	public Void visitGetter(GetterMember member) {
120
 		visit(false);
120
 		visit(false);
121
-		FormattingUtils.formatModifiers(output, member.modifiers & ~Modifiers.FINAL);
121
+		FormattingUtils.formatModifiers(output, member.getSpecifiedModifiers());
122
 		output.append("get ");
122
 		output.append("get ");
123
 		output.append(member.name);
123
 		output.append(member.name);
124
 		output.append(" as ");
124
 		output.append(" as ");
125
-		output.append(member.type.accept(typeFormatter));
125
+		output.append(typeFormatter.format(member.type));
126
 		formatBody(member.body);
126
 		formatBody(member.body);
127
 		return null;
127
 		return null;
128
 	}
128
 	}
130
 	@Override
130
 	@Override
131
 	public Void visitSetter(SetterMember member) {
131
 	public Void visitSetter(SetterMember member) {
132
 		visit(false);
132
 		visit(false);
133
-		FormattingUtils.formatModifiers(output, member.modifiers & ~Modifiers.FINAL);
133
+		FormattingUtils.formatModifiers(output, member.getSpecifiedModifiers());
134
 		output.append("set ");
134
 		output.append("set ");
135
 		output.append(member.name);
135
 		output.append(member.name);
136
 		output.append(" as ");
136
 		output.append(" as ");
137
-		output.append(member.type.accept(typeFormatter));
137
+		output.append(typeFormatter.format(member.type));
138
 		formatBody(member.body);
138
 		formatBody(member.body);
139
 		return null;
139
 		return null;
140
 	}
140
 	}
142
 	@Override
142
 	@Override
143
 	public Void visitOperator(OperatorMember member) {
143
 	public Void visitOperator(OperatorMember member) {
144
 		visit(false);
144
 		visit(false);
145
-		FormattingUtils.formatModifiers(output, member.modifiers & ~Modifiers.FINAL);
145
+		FormattingUtils.formatModifiers(output, member.getSpecifiedModifiers());
146
 		switch (member.operator) {
146
 		switch (member.operator) {
147
 			case ADD: output.append("+"); break;
147
 			case ADD: output.append("+"); break;
148
 			case SUB: output.append("-"); break;
148
 			case SUB: output.append("-"); break;
184
 	@Override
184
 	@Override
185
 	public Void visitCaster(CasterMember member) {
185
 	public Void visitCaster(CasterMember member) {
186
 		visit(false);
186
 		visit(false);
187
-		FormattingUtils.formatModifiers(output, member.modifiers & ~Modifiers.FINAL);
187
+		FormattingUtils.formatModifiers(output, member.getSpecifiedModifiers());
188
 		output.append(" as ");
188
 		output.append(" as ");
189
-		output.append(member.toType.accept(typeFormatter));
189
+		output.append(typeFormatter.format(member.toType));
190
 		formatBody(member.body);
190
 		formatBody(member.body);
191
 		return null;
191
 		return null;
192
 	}
192
 	}
200
 	@Override
200
 	@Override
201
 	public Void visitCaller(CallerMember member) {
201
 	public Void visitCaller(CallerMember member) {
202
 		visit(false);
202
 		visit(false);
203
-		FormattingUtils.formatModifiers(output, member.modifiers & ~Modifiers.FINAL);
203
+		FormattingUtils.formatModifiers(output, member.getSpecifiedModifiers());
204
 		FormattingUtils.formatHeader(output, settings, member.header, typeFormatter);
204
 		FormattingUtils.formatHeader(output, settings, member.header, typeFormatter);
205
 		formatBody(member.body);
205
 		formatBody(member.body);
206
 		return null;
206
 		return null;
209
 	@Override
209
 	@Override
210
 	public Void visitImplementation(ImplementationMember implementation) {
210
 	public Void visitImplementation(ImplementationMember implementation) {
211
 		visit(false);
211
 		visit(false);
212
-		FormattingUtils.formatModifiers(output, implementation.modifiers & ~Modifiers.FINAL);
212
+		FormattingUtils.formatModifiers(output, implementation.getSpecifiedModifiers());
213
 		output.append("implements ");
213
 		output.append("implements ");
214
 		output.append(implementation.type.accept(typeFormatter));
214
 		output.append(implementation.type.accept(typeFormatter));
215
 		if (settings.classBracketOnSameLine) {
215
 		if (settings.classBracketOnSameLine) {

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

252
 		for (CatchClause catchClause : statement.catchClauses) {
252
 		for (CatchClause catchClause : statement.catchClauses) {
253
 			output.append(indent).append("catch ");
253
 			output.append(indent).append("catch ");
254
 			if (catchClause.exceptionVariable != null)
254
 			if (catchClause.exceptionVariable != null)
255
-				output.append(catchClause.exceptionVariable.name).append(" as ").append(catchClause.exceptionVariable.type.accept(expressionFormatter.typeFormatter));
255
+				output.append(catchClause.exceptionVariable.name).append(" as ").append(expressionFormatter.typeFormatter.format(catchClause.exceptionVariable.type));
256
 			
256
 			
257
 			format(ParentStatementType.CATCH, catchClause.content);
257
 			format(ParentStatementType.CATCH, catchClause.content);
258
 		}
258
 		}
274
 		
274
 		
275
 		if (statement.initializer == null || statement.initializer.type != statement.type) {
275
 		if (statement.initializer == null || statement.initializer.type != statement.type) {
276
 			output.append(" as ");
276
 			output.append(" as ");
277
-			output.append(statement.type.accept(expressionFormatter.typeFormatter));
277
+			output.append(expressionFormatter.typeFormatter.format(statement.type));
278
 		}
278
 		}
279
 		if (statement.initializer != null) {
279
 		if (statement.initializer != null) {
280
 			output.append(" = ");
280
 			output.append(" = ");

+ 30
- 22
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.ModifiedTypeID;
16
+import org.openzen.zenscript.codemodel.type.OptionalTypeID;
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;
20
 import org.openzen.zenscript.codemodel.type.GenericTypeID;
20
 import org.openzen.zenscript.codemodel.type.GenericTypeID;
21
-import org.openzen.zenscript.codemodel.type.ITypeID;
22
 import org.openzen.zenscript.codemodel.type.IteratorTypeID;
21
 import org.openzen.zenscript.codemodel.type.IteratorTypeID;
23
 import org.openzen.zenscript.codemodel.type.RangeTypeID;
22
 import org.openzen.zenscript.codemodel.type.RangeTypeID;
23
+import org.openzen.zenscript.codemodel.type.StoredType;
24
+import org.openzen.zenscript.codemodel.type.StringTypeID;
25
+import org.openzen.zenscript.codemodel.type.TypeID;
24
 import stdlib.Chars;
26
 import stdlib.Chars;
25
 import org.openzen.zenscript.codemodel.type.TypeVisitor;
27
 import org.openzen.zenscript.codemodel.type.TypeVisitor;
26
 
28
 
36
 		this.settings = settings;
38
 		this.settings = settings;
37
 		this.importer = importer;
39
 		this.importer = importer;
38
 	}
40
 	}
41
+	
42
+	public String format(TypeID type) {
43
+		return type.accept(this);
44
+	}
45
+	
46
+	public String format(StoredType type) {
47
+		return type.type.accept(this) + (type.getSpecifiedStorage() == null ? "" : "`" + type.getSpecifiedStorage().toString());
48
+	}
39
 
49
 
40
 	@Override
50
 	@Override
41
 	public String visitBasic(BasicTypeID basic) {
51
 	public String visitBasic(BasicTypeID basic) {
42
 		return basic.name;
52
 		return basic.name;
43
 	}
53
 	}
54
+	
55
+	@Override
56
+	public String visitString(StringTypeID string) {
57
+		return "string";
58
+	}
44
 
59
 
45
 	@Override
60
 	@Override
46
 	public String visitArray(ArrayTypeID array) {
61
 	public String visitArray(ArrayTypeID array) {
47
-		String element = array.elementType.accept(this);
62
+		String element = format(array.elementType);
63
+		String result;
48
 		if (array.dimension == 1) {
64
 		if (array.dimension == 1) {
49
-			return element + "[]";
65
+			result = element + "[]";
50
 		} else {
66
 		} else {
51
-			return element + "[" + Chars.times(',', array.dimension - 1) + "]";
67
+			result = element + "[" + Chars.times(',', array.dimension - 1) + "]";
52
 		}
68
 		}
69
+		return result;
53
 	}
70
 	}
54
 
71
 
55
 	@Override
72
 	@Override
56
 	public String visitAssoc(AssocTypeID assoc) {
73
 	public String visitAssoc(AssocTypeID assoc) {
57
-		return assoc.valueType.accept(this) + "[" + assoc.keyType.accept(this) + "]";
74
+		return format(assoc.valueType) + "[" + format(assoc.keyType) + "]";
58
 	}
75
 	}
59
 
76
 
60
 	@Override
77
 	@Override
73
 	@Override
90
 	@Override
74
 	public String visitDefinition(DefinitionTypeID definition) {
91
 	public String visitDefinition(DefinitionTypeID definition) {
75
 		String importedName = importer.importDefinition(definition.definition);
92
 		String importedName = importer.importDefinition(definition.definition);
76
-		if (definition.typeParameters == null)
93
+		if (definition.typeArguments == null)
77
 			return importedName;
94
 			return importedName;
78
 		
95
 		
79
 		StringBuilder result = new StringBuilder();
96
 		StringBuilder result = new StringBuilder();
80
 		result.append(importedName);
97
 		result.append(importedName);
81
 		result.append("<");
98
 		result.append("<");
82
 		int index = 0;
99
 		int index = 0;
83
-		for (ITypeID typeParameter : definition.typeParameters) {
100
+		for (StoredType typeParameter : definition.typeArguments) {
84
 			if (index > 0)
101
 			if (index > 0)
85
 				result.append(", ");
102
 				result.append(", ");
86
 			
103
 			
87
-			result.append(typeParameter.accept(this));
104
+			result.append(format(typeParameter));
88
 		}
105
 		}
89
 		result.append(">");
106
 		result.append(">");
90
 		return result.toString();
107
 		return result.toString();
97
 
114
 
98
 	@Override
115
 	@Override
99
 	public String visitRange(RangeTypeID range) {
116
 	public String visitRange(RangeTypeID range) {
100
-		return range.baseType.accept(this) + " .. " + range.baseType.accept(this);
117
+		return format(range.baseType) + " .. " + format(range.baseType);
101
 	}
118
 	}
102
 
119
 
103
 	@Override
120
 	@Override
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();
121
+	public String visitOptional(OptionalTypeID type) {
122
+		return type.accept(this) + "?";
115
 	}
123
 	}
116
 
124
 
117
 	@Override
125
 	@Override
127
 	@Override
135
 	@Override
128
 	public String visitGenericMap(GenericMapTypeID map) {
136
 	public String visitGenericMap(GenericMapTypeID map) {
129
 		StringBuilder result = new StringBuilder();
137
 		StringBuilder result = new StringBuilder();
130
-		result.append(map.value.accept(this));
138
+		result.append(format(map.value));
131
 		result.append("[<");
139
 		result.append("[<");
132
 		FormattingUtils.formatTypeParameters(result, new TypeParameter[] { map.key }, this);
140
 		FormattingUtils.formatTypeParameters(result, new TypeParameter[] { map.key }, this);
133
 		result.append("]>");
141
 		result.append("]>");

+ 56
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/AccessScope.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;
7
+
8
+import java.util.Objects;
9
+
10
+/**
11
+ *
12
+ * @author Hoofdgebruiker
13
+ */
14
+public final class AccessScope {
15
+	public final Module module;
16
+	public final HighLevelDefinition definition;
17
+	
18
+	public AccessScope(Module module, HighLevelDefinition definition) {
19
+		this.module = module;
20
+		this.definition = definition;
21
+	}
22
+	
23
+	public boolean hasAccessTo(AccessScope other, int access) {
24
+		if (Modifiers.isPublic(access))
25
+			return true;
26
+		if (definition == other.definition || definition.isOuterOf(other.definition) || other.definition.isOuterOf(definition))
27
+			return true;
28
+		if (Modifiers.isPrivate(access))
29
+			return false;
30
+		if (Modifiers.isInternal(access))
31
+			return module == other.module;
32
+		if (Modifiers.isProtected(access))
33
+			return definition.isSubclassOf(other.definition);
34
+		
35
+		return false;
36
+	}
37
+
38
+	@Override
39
+	public int hashCode() {
40
+		int hash = 7;
41
+		hash = 79 * hash + Objects.hashCode(this.module);
42
+		hash = 79 * hash + Objects.hashCode(this.definition);
43
+		return hash;
44
+	}
45
+
46
+	@Override
47
+	public boolean equals(Object obj) {
48
+		if (this == obj)
49
+			return true;
50
+		if (obj == null || getClass() != obj.getClass())
51
+			return false;
52
+		
53
+		final AccessScope other = (AccessScope) obj;
54
+		return module == other.module && definition == other.definition;
55
+	}
56
+}

+ 86
- 72
CodeModel/src/main/java/org/openzen/zenscript/codemodel/FunctionHeader.java View File

14
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
14
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
15
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
15
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
16
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
16
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
17
-import org.openzen.zenscript.codemodel.type.ITypeID;
18
 import org.openzen.zenscript.codemodel.scope.TypeScope;
17
 import org.openzen.zenscript.codemodel.scope.TypeScope;
18
+import org.openzen.zenscript.codemodel.type.StoredType;
19
 import org.openzen.zenscript.codemodel.type.member.LocalMemberCache;
19
 import org.openzen.zenscript.codemodel.type.member.LocalMemberCache;
20
+import org.openzen.zenscript.codemodel.type.storage.StorageTag;
20
 
21
 
21
 /**
22
 /**
22
  *
23
  *
23
  * @author Hoofdgebruiker
24
  * @author Hoofdgebruiker
24
  */
25
  */
25
 public class FunctionHeader {
26
 public class FunctionHeader {
26
-	private static final FunctionParameter[] NO_PARAMETERS = new FunctionParameter[0];
27
-	
28
 	public final TypeParameter[] typeParameters;
27
 	public final TypeParameter[] typeParameters;
29
-	private ITypeID returnType;
28
+	private StoredType returnType;
30
 	public final FunctionParameter[] parameters;
29
 	public final FunctionParameter[] parameters;
31
-	public final ITypeID thrownType;
30
+	public final StoredType thrownType;
31
+	public final StorageTag storage;
32
 	
32
 	
33
 	public final int minParameters;
33
 	public final int minParameters;
34
 	public final int maxParameters;
34
 	public final int maxParameters;
35
 	public final boolean hasUnknowns;
35
 	public final boolean hasUnknowns;
36
 	
36
 	
37
-	public FunctionHeader(ITypeID returnType) {
37
+	public FunctionHeader(StoredType returnType) {
38
 		if (returnType == null)
38
 		if (returnType == null)
39
 			throw new NullPointerException();
39
 			throw new NullPointerException();
40
 		
40
 		
41
 		this.typeParameters = TypeParameter.NONE;
41
 		this.typeParameters = TypeParameter.NONE;
42
 		this.returnType = returnType;
42
 		this.returnType = returnType;
43
-		this.parameters = NO_PARAMETERS;
43
+		this.parameters = FunctionParameter.NONE;
44
 		this.thrownType = null;
44
 		this.thrownType = null;
45
+		this.storage = null;
45
 		
46
 		
46
 		minParameters = 0;
47
 		minParameters = 0;
47
 		maxParameters = 0;
48
 		maxParameters = 0;
48
-		hasUnknowns = returnType == BasicTypeID.UNDETERMINED;
49
+		hasUnknowns = returnType.type == BasicTypeID.UNDETERMINED;
50
+	}
51
+	
52
+	public FunctionHeader(BasicTypeID returnType) {
53
+		this(returnType.stored);
49
 	}
54
 	}
50
 	
55
 	
51
-	public FunctionHeader(ITypeID returnType, ITypeID... parameterTypes) {
56
+	public FunctionHeader(StoredType returnType, StoredType... parameterTypes) {
52
 		if (returnType == null)
57
 		if (returnType == null)
53
 			throw new NullPointerException();
58
 			throw new NullPointerException();
54
 		
59
 		
56
 		this.returnType = returnType;
61
 		this.returnType = returnType;
57
 		this.parameters = new FunctionParameter[parameterTypes.length];
62
 		this.parameters = new FunctionParameter[parameterTypes.length];
58
 		this.thrownType = null;
63
 		this.thrownType = null;
64
+		this.storage = null;
59
 		
65
 		
60
 		for (int i = 0; i < parameterTypes.length; i++)
66
 		for (int i = 0; i < parameterTypes.length; i++)
61
 			parameters[i] = new FunctionParameter(parameterTypes[i], null);
67
 			parameters[i] = new FunctionParameter(parameterTypes[i], null);
65
 		hasUnknowns = hasUnknowns(parameterTypes, returnType);
71
 		hasUnknowns = hasUnknowns(parameterTypes, returnType);
66
 	}
72
 	}
67
 	
73
 	
68
-	public FunctionHeader(ITypeID returnType, FunctionParameter... parameters) {
74
+	public FunctionHeader(BasicTypeID returnType, StoredType... parameterTypes) {
75
+		this(returnType.stored, parameterTypes);
76
+	}
77
+	
78
+	public FunctionHeader(StoredType returnType, FunctionParameter... parameters) {
69
 		if (returnType == null)
79
 		if (returnType == null)
70
 			throw new NullPointerException();
80
 			throw new NullPointerException();
71
 		
81
 		
73
 		this.returnType = returnType;
83
 		this.returnType = returnType;
74
 		this.parameters = parameters;
84
 		this.parameters = parameters;
75
 		this.thrownType = null;
85
 		this.thrownType = null;
86
+		this.storage = null;
76
 		
87
 		
77
 		minParameters = getMinParameters(parameters);
88
 		minParameters = getMinParameters(parameters);
78
 		maxParameters = getMaxParameters(parameters);
89
 		maxParameters = getMaxParameters(parameters);
79
 		hasUnknowns = hasUnknowns(parameters, returnType);
90
 		hasUnknowns = hasUnknowns(parameters, returnType);
80
 	}
91
 	}
81
 	
92
 	
82
-	public FunctionHeader(TypeParameter[] typeParameters, ITypeID returnType, ITypeID thrownType, FunctionParameter... parameters) {
93
+	public FunctionHeader(BasicTypeID returnType, FunctionParameter... parameters) {
94
+		this(returnType.stored, parameters);
95
+	}
96
+	
97
+	public FunctionHeader(TypeParameter[] typeParameters, StoredType returnType, StoredType thrownType, StorageTag storage, FunctionParameter... parameters) {
83
 		if (returnType == null)
98
 		if (returnType == null)
84
 			throw new NullPointerException();
99
 			throw new NullPointerException();
85
 		if (typeParameters == null)
100
 		if (typeParameters == null)
89
 		this.returnType = returnType;
104
 		this.returnType = returnType;
90
 		this.parameters = parameters;
105
 		this.parameters = parameters;
91
 		this.thrownType = thrownType;
106
 		this.thrownType = thrownType;
107
+		this.storage = storage;
92
 		
108
 		
93
 		minParameters = getMinParameters(parameters);
109
 		minParameters = getMinParameters(parameters);
94
 		maxParameters = getMaxParameters(parameters);
110
 		maxParameters = getMaxParameters(parameters);
95
 		hasUnknowns = hasUnknowns(parameters, returnType);
111
 		hasUnknowns = hasUnknowns(parameters, returnType);
96
 	}
112
 	}
97
 	
113
 	
98
-	public ITypeID getReturnType() {
114
+	public StoredType getReturnType() {
99
 		return returnType;
115
 		return returnType;
100
 	}
116
 	}
101
 	
117
 	
102
-	public void setReturnType(ITypeID returnType) {
118
+	public void setReturnType(StoredType returnType) {
103
 		if (returnType == null)
119
 		if (returnType == null)
104
 			throw new NullPointerException();
120
 			throw new NullPointerException();
105
 		
121
 		
107
 	}
123
 	}
108
 	
124
 	
109
 	public boolean isDenormalized() {
125
 	public boolean isDenormalized() {
110
-		if (returnType.getNormalized() != returnType)
126
+		if (!returnType.getNormalized().equals(returnType))
111
 			return true;
127
 			return true;
112
 		for (FunctionParameter parameter : parameters)
128
 		for (FunctionParameter parameter : parameters)
113
 			if (parameter.type.getNormalized() != parameter.type)
129
 			if (parameter.type.getNormalized() != parameter.type)
122
 		
138
 		
123
 		FunctionParameter[] normalizedParameters = new FunctionParameter[parameters.length];
139
 		FunctionParameter[] normalizedParameters = new FunctionParameter[parameters.length];
124
 		for (int i = 0; i < normalizedParameters.length; i++)
140
 		for (int i = 0; i < normalizedParameters.length; i++)
125
-			normalizedParameters[i] = parameters[i].normalized(registry);
126
-		return new FunctionHeader(typeParameters, returnType.getNormalized(), thrownType == null ? null : thrownType.getNormalized(), normalizedParameters);
141
+			normalizedParameters[i] = parameters[i].normalize(registry);
142
+		return new FunctionHeader(typeParameters, returnType.getNormalized(), thrownType == null ? null : thrownType.getNormalized(), storage, normalizedParameters);
127
 	}
143
 	}
128
 	
144
 	
129
 	public int getNumberOfTypeParameters() {
145
 	public int getNumberOfTypeParameters() {
138
 		return false;
154
 		return false;
139
 	}
155
 	}
140
 	
156
 	
141
-	public FunctionHeader withReturnType(ITypeID returnType) {
142
-		return new FunctionHeader(typeParameters, returnType, thrownType, parameters);
143
-	}
144
-	
145
 	public FunctionHeader inferFromOverride(GlobalTypeRegistry registry, FunctionHeader overridden) {
157
 	public FunctionHeader inferFromOverride(GlobalTypeRegistry registry, FunctionHeader overridden) {
146
 		TypeParameter[] resultTypeParameters = typeParameters;
158
 		TypeParameter[] resultTypeParameters = typeParameters;
147
-		ITypeID resultReturnType = this.returnType;
148
-		if (resultReturnType == BasicTypeID.UNDETERMINED)
159
+		StoredType resultReturnType = this.returnType;
160
+		if (resultReturnType.type == BasicTypeID.UNDETERMINED)
149
 			resultReturnType = overridden.returnType;
161
 			resultReturnType = overridden.returnType;
150
 		
162
 		
151
-		ITypeID resultThrownType = this.thrownType;
163
+		StoredType resultThrownType = this.thrownType;
152
 		if (resultThrownType == null && overridden.thrownType != null)
164
 		if (resultThrownType == null && overridden.thrownType != null)
153
 			resultThrownType = overridden.thrownType;
165
 			resultThrownType = overridden.thrownType;
154
 		
166
 		
155
 		FunctionParameter[] resultParameters = Arrays.copyOf(parameters, parameters.length);
167
 		FunctionParameter[] resultParameters = Arrays.copyOf(parameters, parameters.length);
156
 		for (int i = 0; i < resultParameters.length; i++) {
168
 		for (int i = 0; i < resultParameters.length; i++) {
157
-			if (resultParameters[i].type == BasicTypeID.UNDETERMINED) {
169
+			if (resultParameters[i].type.type == BasicTypeID.UNDETERMINED) {
158
 				FunctionParameter parameter = resultParameters[i];
170
 				FunctionParameter parameter = resultParameters[i];
159
 				FunctionParameter original = overridden.parameters[i];
171
 				FunctionParameter original = overridden.parameters[i];
160
 				resultParameters[i] = new FunctionParameter(original.type, parameter.name, parameter.defaultValue, original.variadic);
172
 				resultParameters[i] = new FunctionParameter(original.type, parameter.name, parameter.defaultValue, original.variadic);
161
 			}
173
 			}
162
 		}
174
 		}
163
 		
175
 		
164
-		return new FunctionHeader(resultTypeParameters, resultReturnType, resultThrownType, resultParameters);
176
+		StorageTag resultStorage = this.storage;
177
+		if (resultStorage == null)
178
+			resultStorage = overridden.storage;
179
+		
180
+		return new FunctionHeader(resultTypeParameters, resultReturnType, resultThrownType, resultStorage, resultParameters);
165
 	}
181
 	}
166
 	
182
 	
167
 	public boolean matchesExactly(CallArguments arguments, TypeScope scope) {
183
 	public boolean matchesExactly(CallArguments arguments, TypeScope scope) {
168
 		if (arguments.arguments.length < minParameters || arguments.arguments.length > maxParameters)
184
 		if (arguments.arguments.length < minParameters || arguments.arguments.length > maxParameters)
169
 			return false;
185
 			return false;
170
 		
186
 		
171
-		FunctionHeader header = fillGenericArguments(scope.getTypeRegistry(), arguments.typeArguments, scope.getLocalTypeParameters());
187
+		FunctionHeader header = fillGenericArguments(scope, arguments.typeArguments);
172
 		for (int i = 0; i < header.parameters.length; i++) {
188
 		for (int i = 0; i < header.parameters.length; i++) {
173
-			if (arguments.arguments[i].type != header.parameters[i].type)
189
+			if (!arguments.arguments[i].type.equals(header.parameters[i].type))
174
 				return false;
190
 				return false;
175
 		}
191
 		}
176
 		
192
 		
181
 		if (arguments.arguments.length < minParameters || arguments.arguments.length > maxParameters)
197
 		if (arguments.arguments.length < minParameters || arguments.arguments.length > maxParameters)
182
 			return false;
198
 			return false;
183
 		
199
 		
184
-		FunctionHeader header = fillGenericArguments(scope.getTypeRegistry(), arguments.typeArguments, scope.getLocalTypeParameters());
200
+		FunctionHeader header = fillGenericArguments(scope, arguments.typeArguments);
185
 		for (int i = 0; i < header.parameters.length; i++) {
201
 		for (int i = 0; i < header.parameters.length; i++) {
186
 			if (!scope.getTypeMembers(arguments.arguments[i].type).canCastImplicit(header.parameters[i].type))
202
 			if (!scope.getTypeMembers(arguments.arguments[i].type).canCastImplicit(header.parameters[i].type))
187
 				return false;
203
 				return false;
201
 			}
217
 			}
202
 			result.append('>');
218
 			result.append('>');
203
 		}
219
 		}
220
+		if (storage != null)
221
+			result.append(storage);
204
 		result.append('(');
222
 		result.append('(');
205
 		for (int i = 0; i < parameters.length; i++) {
223
 		for (int i = 0; i < parameters.length; i++) {
206
 			if (i > 0)
224
 			if (i > 0)
211
 		return result.toString();
229
 		return result.toString();
212
 	}
230
 	}
213
 	
231
 	
214
-	public ITypeID[] inferTypes(LocalMemberCache cache, CallArguments arguments, List<ITypeID> resultHint) {
232
+	public StoredType[] inferTypes(LocalMemberCache cache, CallArguments arguments, List<StoredType> resultHint) {
215
 		if (arguments.arguments.length != this.parameters.length)
233
 		if (arguments.arguments.length != this.parameters.length)
216
 			return null;
234
 			return null;
217
 		
235
 		
218
-		Map<TypeParameter, ITypeID> mapping = new HashMap<>();
236
+		Map<TypeParameter, StoredType> mapping = new HashMap<>();
219
 		if (!resultHint.isEmpty()) {
237
 		if (!resultHint.isEmpty()) {
220
-			Map<TypeParameter, ITypeID> temp = new HashMap<>();
221
-			for (ITypeID hint : resultHint) {
222
-				if (returnType.inferTypeParameters(cache, hint, temp)) {
238
+			for (StoredType hint : resultHint) {
239
+				Map<TypeParameter, StoredType> temp = returnType.inferTypeParameters(cache, hint);
240
+				if (temp != null) {
223
 					mapping = temp;
241
 					mapping = temp;
224
 					break;
242
 					break;
225
 				}
243
 				}
227
 		}
245
 		}
228
 		
246
 		
229
 		// TODO: lambda header inference
247
 		// TODO: lambda header inference
230
-		for (int i = 0; i < parameters.length; i++)
231
-			if (!parameters[i].type.inferTypeParameters(cache, arguments.arguments[i].type, mapping))
248
+		for (int i = 0; i < parameters.length; i++) {
249
+			Map<TypeParameter, StoredType> forParameter = parameters[i].type.inferTypeParameters(cache, arguments.arguments[i].type);
250
+			if (forParameter == null)
232
 				return null;
251
 				return null;
252
+			
253
+			mapping.putAll(forParameter);
254
+		}
233
 		
255
 		
234
 		if (mapping.size() > typeParameters.length)
256
 		if (mapping.size() > typeParameters.length)
235
 			return null;
257
 			return null;
236
 		
258
 		
237
-		ITypeID[] result = new ITypeID[typeParameters.length];
259
+		StoredType[] result = new StoredType[typeParameters.length];
238
 		for (int i = 0; i < typeParameters.length; i++) {
260
 		for (int i = 0; i < typeParameters.length; i++) {
239
 			TypeParameter typeParameter = typeParameters[i];
261
 			TypeParameter typeParameter = typeParameters[i];
240
 			if (!mapping.containsKey(typeParameter)) {
262
 			if (!mapping.containsKey(typeParameter)) {
272
 			throw new NullPointerException();
294
 			throw new NullPointerException();
273
 		if (parameters.length != other.parameters.length)
295
 		if (parameters.length != other.parameters.length)
274
 			return false;
296
 			return false;
275
-		if (returnType != BasicTypeID.UNDETERMINED && !scope.getTypeMembers(returnType).canCastImplicit(other.returnType))
297
+		if (returnType.type != BasicTypeID.UNDETERMINED && !scope.getTypeMembers(returnType).canCastImplicit(other.returnType))
276
 			return false;
298
 			return false;
277
 		
299
 		
278
 		for (int i = 0; i < parameters.length; i++) {
300
 		for (int i = 0; i < parameters.length; i++) {
279
-			if (parameters[i].type == BasicTypeID.UNDETERMINED)
301
+			if (parameters[i].type.type == BasicTypeID.UNDETERMINED)
280
 				continue;
302
 				continue;
281
 			
303
 			
282
 			if (parameters[i].variadic != other.parameters[i].variadic)
304
 			if (parameters[i].variadic != other.parameters[i].variadic)
300
 			return false;
322
 			return false;
301
 		
323
 		
302
 		for (int i = 0; i < parameters.length; i++) {
324
 		for (int i = 0; i < parameters.length; i++) {
303
-			if (parameters[i].type != other.parameters[i].type)
325
+			if (!parameters[i].type.equals(other.parameters[i].type))
304
 				return false;
326
 				return false;
305
 		}
327
 		}
306
 		
328
 		
341
 	
363
 	
342
 	public FunctionHeader instanceForCall(GlobalTypeRegistry registry, CallArguments arguments) {
364
 	public FunctionHeader instanceForCall(GlobalTypeRegistry registry, CallArguments arguments) {
343
 		if (arguments.getNumberOfTypeArguments() > 0) {
365
 		if (arguments.getNumberOfTypeArguments() > 0) {
344
-			Map<TypeParameter, ITypeID> typeParameters = new HashMap<>();
345
-			for (int i = 0; i < this.typeParameters.length; i++) {
346
-				typeParameters.put(this.typeParameters[i], arguments.typeArguments[i]);
347
-			}
348
-			return withGenericArguments(
349
-					registry,
350
-					new GenericMapper(registry, typeParameters));
366
+			Map<TypeParameter, StoredType> typeParameters = StoredType.getMapping(this.typeParameters, arguments.typeArguments);
367
+			return instance(new GenericMapper(registry, typeParameters));
351
 		} else {
368
 		} else {
352
 			return this;
369
 			return this;
353
 		}
370
 		}
354
 	}
371
 	}
355
 	
372
 	
356
-	public FunctionHeader withGenericArguments(GlobalTypeRegistry registry, GenericMapper mapper) {
357
-		if (typeParameters.length > 0) {
358
-			Map<TypeParameter, ITypeID> innerMap = new HashMap<>();
359
-			for (TypeParameter parameter : typeParameters)
360
-				innerMap.put(parameter, mapper.registry.getGeneric(parameter));
361
-			
362
-			mapper = mapper.getInner(registry, innerMap);
363
-		}
373
+	public FunctionHeader withGenericArguments(GenericMapper mapper) {
374
+		if (typeParameters.length > 0)
375
+			mapper = mapper.getInner(mapper.registry, StoredType.getSelfMapping(mapper.registry, typeParameters));
364
 		
376
 		
365
-		ITypeID returnType = this.returnType.instance(mapper);
377
+		return instance(mapper);
378
+	}
379
+	
380
+	private FunctionHeader instance(GenericMapper mapper) {
381
+		StoredType returnType = this.returnType.instance(mapper);
366
 		FunctionParameter[] parameters = new FunctionParameter[this.parameters.length];
382
 		FunctionParameter[] parameters = new FunctionParameter[this.parameters.length];
367
 		for (int i = 0; i < parameters.length; i++) {
383
 		for (int i = 0; i < parameters.length; i++) {
368
 			parameters[i] = this.parameters[i].withGenericArguments(mapper);
384
 			parameters[i] = this.parameters[i].withGenericArguments(mapper);
369
 		}
385
 		}
370
-		return new FunctionHeader(typeParameters, returnType, thrownType == null ? null : thrownType.instance(mapper), parameters);
386
+		return new FunctionHeader(typeParameters, returnType, thrownType == null ? null : thrownType.instance(mapper), storage, parameters);
371
 	}
387
 	}
372
 	
388
 	
373
-	public FunctionHeader fillGenericArguments(GlobalTypeRegistry registry, ITypeID[] arguments, GenericMapper typeParameterMapping) {
389
+	public FunctionHeader fillGenericArguments(TypeScope scope, StoredType[] arguments) {
374
 		if (arguments == null || arguments.length == 0)
390
 		if (arguments == null || arguments.length == 0)
375
 			return this;
391
 			return this;
376
 		
392
 		
377
-		Map<TypeParameter, ITypeID> typeArguments = new HashMap<>();
378
-		for (int i = 0; i < typeParameters.length; i++)
379
-			typeArguments.put(typeParameters[i], arguments[i]);
380
-		GenericMapper mapper = typeParameterMapping.getInner(registry, typeArguments);
393
+		Map<TypeParameter, StoredType> typeArguments = StoredType.getMapping(typeParameters, arguments);
394
+		GenericMapper mapper = scope.getLocalTypeParameters().getInner(scope.getTypeRegistry(), typeArguments);
381
 		
395
 		
382
-		ITypeID returnType = this.returnType.instance(mapper);
396
+		StoredType returnType = this.returnType.instance(mapper);
383
 		FunctionParameter[] parameters = new FunctionParameter[this.parameters.length];
397
 		FunctionParameter[] parameters = new FunctionParameter[this.parameters.length];
384
 		for (int i = 0; i < parameters.length; i++) {
398
 		for (int i = 0; i < parameters.length; i++) {
385
 			parameters[i] = this.parameters[i].withGenericArguments(mapper);
399
 			parameters[i] = this.parameters[i].withGenericArguments(mapper);
386
 		}
400
 		}
387
-		return new FunctionHeader(TypeParameter.NONE, returnType, thrownType == null ? null : thrownType.instance(mapper), parameters);
401
+		return new FunctionHeader(TypeParameter.NONE, returnType, thrownType == null ? null : thrownType.instance(mapper), storage, parameters);
388
 	}
402
 	}
389
 	
403
 	
390
 	public FunctionHeader forTypeParameterInference() {
404
 	public FunctionHeader forTypeParameterInference() {
391
-		return new FunctionHeader(BasicTypeID.UNDETERMINED, parameters);
405
+		return new FunctionHeader(BasicTypeID.UNDETERMINED.stored, parameters);
392
 	}
406
 	}
393
 	
407
 	
394
 	public FunctionHeader forLambda(FunctionHeader lambdaHeader) {
408
 	public FunctionHeader forLambda(FunctionHeader lambdaHeader) {
396
 		for (int i = 0; i < lambdaHeader.parameters.length; i++)
410
 		for (int i = 0; i < lambdaHeader.parameters.length; i++)
397
 			parameters[i] = new FunctionParameter(this.parameters[i].type, lambdaHeader.parameters[i].name);
411
 			parameters[i] = new FunctionParameter(this.parameters[i].type, lambdaHeader.parameters[i].name);
398
 		
412
 		
399
-		return new FunctionHeader(typeParameters, returnType, thrownType, parameters);
413
+		return new FunctionHeader(typeParameters, returnType, thrownType, storage, parameters);
400
 	}
414
 	}
401
 	
415
 	
402
 	public FunctionParameter getVariadicParameter() {
416
 	public FunctionParameter getVariadicParameter() {
462
 		return parameters[parameters.length - 1].variadic ? Integer.MAX_VALUE : parameters.length;
476
 		return parameters[parameters.length - 1].variadic ? Integer.MAX_VALUE : parameters.length;
463
 	}
477
 	}
464
 	
478
 	
465
-	private static boolean hasUnknowns(ITypeID[] types, ITypeID returnType) {
466
-		if (returnType == BasicTypeID.UNDETERMINED)
479
+	private static boolean hasUnknowns(StoredType[] types, StoredType returnType) {
480
+		if (returnType.type == BasicTypeID.UNDETERMINED)
467
 			return true;
481
 			return true;
468
 		
482
 		
469
-		for (ITypeID type : types)
470
-			if (type == BasicTypeID.UNDETERMINED)
483
+		for (StoredType type : types)
484
+			if (type.type == BasicTypeID.UNDETERMINED)
471
 				return true;
485
 				return true;
472
 		
486
 		
473
 		return false;
487
 		return false;
474
 	}
488
 	}
475
 	
489
 	
476
-	private static boolean hasUnknowns(FunctionParameter[] parameters, ITypeID returnType) {
477
-		if (returnType == BasicTypeID.UNDETERMINED)
490
+	private static boolean hasUnknowns(FunctionParameter[] parameters, StoredType returnType) {
491
+		if (returnType.type == BasicTypeID.UNDETERMINED)
478
 			return true;
492
 			return true;
479
 		
493
 		
480
 		for (FunctionParameter parameter : parameters)
494
 		for (FunctionParameter parameter : parameters)
481
-			if (parameter.type == BasicTypeID.UNDETERMINED)
495
+			if (parameter.type.type == BasicTypeID.UNDETERMINED)
482
 				return true;
496
 				return true;
483
 		
497
 		
484
 		return false;
498
 		return false;

+ 19
- 20
CodeModel/src/main/java/org/openzen/zenscript/codemodel/FunctionParameter.java View File

5
  */
5
  */
6
 package org.openzen.zenscript.codemodel;
6
 package org.openzen.zenscript.codemodel;
7
 
7
 
8
-import org.openzen.zenscript.codemodel.annotations.Annotation;
9
 import java.util.Objects;
8
 import java.util.Objects;
10
 import org.openzen.zencode.shared.Taggable;
9
 import org.openzen.zencode.shared.Taggable;
11
 import org.openzen.zenscript.codemodel.expression.Expression;
10
 import org.openzen.zenscript.codemodel.expression.Expression;
11
+import org.openzen.zenscript.codemodel.type.BasicTypeID;
12
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
12
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
13
-import org.openzen.zenscript.codemodel.type.ITypeID;
13
+import org.openzen.zenscript.codemodel.type.StoredType;
14
+import org.openzen.zenscript.codemodel.annotations.ParameterAnnotation;
14
 
15
 
15
 /**
16
 /**
16
  *
17
  *
19
 public class FunctionParameter extends Taggable {
20
 public class FunctionParameter extends Taggable {
20
 	public static final FunctionParameter[] NONE = new FunctionParameter[0];
21
 	public static final FunctionParameter[] NONE = new FunctionParameter[0];
21
 	
22
 	
22
-	public Annotation[] annotations;
23
-	public final ITypeID type;
23
+	public ParameterAnnotation[] annotations;
24
+	public final StoredType type;
24
 	public final String name;
25
 	public final String name;
25
 	public Expression defaultValue;
26
 	public Expression defaultValue;
26
 	public final boolean variadic;
27
 	public final boolean variadic;
27
 	
28
 	
28
-	public FunctionParameter(ITypeID type) {
29
-		this.annotations = Annotation.NONE;
29
+	public FunctionParameter(StoredType type) {
30
+		this.annotations = ParameterAnnotation.NONE;
30
 		this.type = type;
31
 		this.type = type;
31
 		this.name = "";
32
 		this.name = "";
32
 		this.defaultValue = null;
33
 		this.defaultValue = null;
33
 		this.variadic = false;
34
 		this.variadic = false;
34
 	}
35
 	}
35
 	
36
 	
36
-	public FunctionParameter(ITypeID type, String name) {
37
-		this.annotations = Annotation.NONE;
37
+	public FunctionParameter(BasicTypeID type) {
38
+		this(type.stored);
39
+	}
40
+	
41
+	public FunctionParameter(StoredType type, String name) {
42
+		this.annotations = ParameterAnnotation.NONE;
38
 		this.type = type;
43
 		this.type = type;
39
 		this.name = name;
44
 		this.name = name;
40
 		this.defaultValue = null;
45
 		this.defaultValue = null;
41
 		this.variadic = false;
46
 		this.variadic = false;
42
 	}
47
 	}
43
 	
48
 	
44
-	public FunctionParameter(ITypeID type, String name, Expression defaultValue, boolean variadic) {
45
-		this.annotations = Annotation.NONE;
49
+	public FunctionParameter(StoredType type, String name, Expression defaultValue, boolean variadic) {
50
+		this.annotations = ParameterAnnotation.NONE;
46
 		this.type = type;
51
 		this.type = type;
47
 		this.name = name;
52
 		this.name = name;
48
 		this.defaultValue = defaultValue;
53
 		this.defaultValue = defaultValue;
49
 		this.variadic = variadic;
54
 		this.variadic = variadic;
50
 	}
55
 	}
51
 	
56
 	
52
-	public FunctionParameter normalized(GlobalTypeRegistry registry) {
57
+	public FunctionParameter normalize(GlobalTypeRegistry registry) {
53
 		FunctionParameter result = new FunctionParameter(type.getNormalized(), name, defaultValue, variadic);
58
 		FunctionParameter result = new FunctionParameter(type.getNormalized(), name, defaultValue, variadic);
54
 		result.annotations = this.annotations;
59
 		result.annotations = this.annotations;
55
 		return result;
60
 		return result;
56
 	}
61
 	}
57
 	
62
 	
58
 	public FunctionParameter withGenericArguments(GenericMapper mapper) {
63
 	public FunctionParameter withGenericArguments(GenericMapper mapper) {
59
-		ITypeID instanced = type.instance(mapper);
60
-		if (instanced == type)
64
+		StoredType instanced = type.instance(mapper);
65
+		if (instanced.equals(type))
61
 			return this;
66
 			return this;
62
 		
67
 		
63
 		FunctionParameter result = new FunctionParameter(instanced, name, defaultValue, variadic);
68
 		FunctionParameter result = new FunctionParameter(instanced, name, defaultValue, variadic);
91
 			return false;
96
 			return false;
92
 		}
97
 		}
93
 		final FunctionParameter other = (FunctionParameter) obj;
98
 		final FunctionParameter other = (FunctionParameter) obj;
94
-		if (this.variadic != other.variadic) {
95
-			return false;
96
-		}
97
-		if (!Objects.equals(this.type, other.type)) {
98
-			return false;
99
-		}
100
-		return true;
99
+		return this.variadic == other.variadic && this.type.equals(other.type);
101
 	}
100
 	}
102
 }
101
 }

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

11
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
11
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
12
 import org.openzen.zenscript.codemodel.type.GenericTypeID;
12
 import org.openzen.zenscript.codemodel.type.GenericTypeID;
13
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
13
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
14
-import org.openzen.zenscript.codemodel.type.ITypeID;
14
+import org.openzen.zenscript.codemodel.type.StoredType;
15
 
15
 
16
 /**
16
 /**
17
  *
17
  *
21
 	public static final GenericMapper EMPTY = new GenericMapper(null, Collections.emptyMap());
21
 	public static final GenericMapper EMPTY = new GenericMapper(null, Collections.emptyMap());
22
 	
22
 	
23
 	public final GlobalTypeRegistry registry;
23
 	public final GlobalTypeRegistry registry;
24
-	private final Map<TypeParameter, ITypeID> mapping;
24
+	private final Map<TypeParameter, StoredType> mapping;
25
 	
25
 	
26
-	public GenericMapper(GlobalTypeRegistry registry, Map<TypeParameter, ITypeID> mapping) {
26
+	public GenericMapper(GlobalTypeRegistry registry, Map<TypeParameter, StoredType> mapping) {
27
 		this.registry = registry;
27
 		this.registry = registry;
28
 		this.mapping = mapping;
28
 		this.mapping = mapping;
29
 	}
29
 	}
30
 	
30
 	
31
-	public Map<TypeParameter, ITypeID> getMapping() {
31
+	public Map<TypeParameter, StoredType> getMapping() {
32
 		return mapping;
32
 		return mapping;
33
 	}
33
 	}
34
 	
34
 	
35
-	public ITypeID map(ITypeID original) {
35
+	public StoredType map(StoredType original) {
36
 		return mapping.isEmpty() ? original : original.instance(this);
36
 		return mapping.isEmpty() ? original : original.instance(this);
37
 	}
37
 	}
38
 	
38
 	
39
-	public ITypeID[] map(ITypeID[] original) {
40
-		if (mapping.isEmpty())
39
+	public StoredType[] map(StoredType[] original) {
40
+		if (mapping.isEmpty() || original.length == 0)
41
 			return original;
41
 			return original;
42
 		
42
 		
43
-		ITypeID[] mapped = new ITypeID[original.length];
43
+		StoredType[] mapped = new StoredType[original.length];
44
 		for (int i = 0; i < original.length; i++)
44
 		for (int i = 0; i < original.length; i++)
45
 			mapped[i] = original[i].instance(this);
45
 			mapped[i] = original[i].instance(this);
46
 		return mapped;
46
 		return mapped;
47
 	}
47
 	}
48
 	
48
 	
49
-	public ITypeID map(GenericTypeID type) {
50
-		if (!mapping.containsKey(type.parameter))
51
-			throw new IllegalStateException("No mapping found for type " + type);
49
+	public StoredType map(GenericTypeID type) {
50
+		//if (!mapping.containsKey(type.parameter))
51
+		//	throw new IllegalStateException("No mapping found for type " + type);
52
 		
52
 		
53
-		return mapping.containsKey(type.parameter) ? mapping.get(type.parameter) : type;
53
+		return mapping.containsKey(type.parameter) ? mapping.get(type.parameter) : type.stored();
54
 	}
54
 	}
55
 	
55
 	
56
 	public FunctionHeader map(FunctionHeader original) {
56
 	public FunctionHeader map(FunctionHeader original) {
57
-		return mapping.isEmpty() ? original : original.withGenericArguments(registry, this);
57
+		return mapping.isEmpty() ? original : original.withGenericArguments(this);
58
 	}
58
 	}
59
 	
59
 	
60
-	public GenericMapper getInner(GlobalTypeRegistry registry, Map<TypeParameter, ITypeID> mapping) {
61
-		Map<TypeParameter, ITypeID> resultMap = new HashMap<>(this.mapping);
60
+	public GenericMapper getInner(GlobalTypeRegistry registry, Map<TypeParameter, StoredType> mapping) {
61
+		Map<TypeParameter, StoredType> resultMap = new HashMap<>(this.mapping);
62
 		resultMap.putAll(mapping);
62
 		resultMap.putAll(mapping);
63
 		return new GenericMapper(registry, resultMap);
63
 		return new GenericMapper(registry, resultMap);
64
 	}
64
 	}
65
 	
65
 	
66
 	public GenericMapper getInner(GlobalTypeRegistry registry, TypeParameter[] parameters) {
66
 	public GenericMapper getInner(GlobalTypeRegistry registry, TypeParameter[] parameters) {
67
-		Map<TypeParameter, ITypeID> resultMap = new HashMap<>(this.mapping);
67
+		Map<TypeParameter, StoredType> resultMap = new HashMap<>(this.mapping);
68
 		for (TypeParameter parameter : parameters)
68
 		for (TypeParameter parameter : parameters)
69
-			resultMap.put(parameter, registry.getGeneric(parameter));
69
+			resultMap.put(parameter, new StoredType(registry.getGeneric(parameter), null));
70
 		return new GenericMapper(registry, resultMap);
70
 		return new GenericMapper(registry, resultMap);
71
 	}
71
 	}
72
 	
72
 	
78
 		StringBuilder result = new StringBuilder();
78
 		StringBuilder result = new StringBuilder();
79
 		result.append('{');
79
 		result.append('{');
80
 		boolean first = true;
80
 		boolean first = true;
81
-		for (Map.Entry<TypeParameter, ITypeID> entry : mapping.entrySet()) {
81
+		for (Map.Entry<TypeParameter, StoredType> entry : mapping.entrySet()) {
82
 			if (first) {
82
 			if (first) {
83
 				first = false;
83
 				first = false;
84
 			} else {
84
 			} else {

CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/GenericName.java → CodeModel/src/main/java/org/openzen/zenscript/codemodel/GenericName.java View File

3
  * To change this template file, choose Tools | Templates
3
  * To change this template file, choose Tools | Templates
4
  * and open the template in the editor.
4
  * and open the template in the editor.
5
  */
5
  */
6
-package org.openzen.zenscript.codemodel.type;
6
+package org.openzen.zenscript.codemodel;
7
 
7
 
8
 import java.util.List;
8
 import java.util.List;
9
+import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
10
+import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
11
+import org.openzen.zenscript.codemodel.type.StoredType;
12
+import org.openzen.zenscript.codemodel.type.TypeID;
9
 
13
 
10
 /**
14
 /**
11
  *
15
  *
13
  */
17
  */
14
 public class GenericName {
18
 public class GenericName {
15
 	public final String name;
19
 	public final String name;
16
-	public final ITypeID[] arguments;
20
+	public final StoredType[] arguments;
17
 	
21
 	
18
 	public GenericName(String name) {
22
 	public GenericName(String name) {
19
-		this(name, ITypeID.NONE);
23
+		this(name, StoredType.NONE);
20
 	}
24
 	}
21
 	
25
 	
22
-	public GenericName(String name, ITypeID[] arguments) {
26
+	public GenericName(String name, StoredType[] arguments) {
23
 		if (arguments == null)
27
 		if (arguments == null)
24
 			throw new NullPointerException("Arguments cannot be null");
28
 			throw new NullPointerException("Arguments cannot be null");
25
 		
29
 		
39
 		return arguments.length == 0;
43
 		return arguments.length == 0;
40
 	}
44
 	}
41
 	
45
 	
42
-	public static ITypeID getInnerType(GlobalTypeRegistry registry, DefinitionTypeID type, List<GenericName> name, int index) {
46
+	public static TypeID getInnerType(GlobalTypeRegistry registry, DefinitionTypeID type, List<GenericName> name, int index) {
43
 		while (index < name.size()) {
47
 		while (index < name.size()) {
44
 			GenericName innerName = name.get(index++);
48
 			GenericName innerName = name.get(index++);
45
 			type = type.getInnerType(innerName, registry);
49
 			type = type.getInnerType(innerName, registry);

+ 47
- 6
CodeModel/src/main/java/org/openzen/zenscript/codemodel/HighLevelDefinition.java View File

6
 package org.openzen.zenscript.codemodel;
6
 package org.openzen.zenscript.codemodel;
7
 
7
 
8
 import java.util.ArrayList;
8
 import java.util.ArrayList;
9
+import java.util.HashSet;
9
 import java.util.List;
10
 import java.util.List;
11
+import java.util.Set;
10
 import org.openzen.zencode.shared.CodePosition;
12
 import org.openzen.zencode.shared.CodePosition;
11
 import org.openzen.zencode.shared.Taggable;
13
 import org.openzen.zencode.shared.Taggable;
12
 import org.openzen.zenscript.codemodel.annotations.DefinitionAnnotation;
14
 import org.openzen.zenscript.codemodel.annotations.DefinitionAnnotation;
25
 import org.openzen.zenscript.codemodel.member.ImplementationMember;
27
 import org.openzen.zenscript.codemodel.member.ImplementationMember;
26
 import org.openzen.zenscript.codemodel.member.InnerDefinitionMember;
28
 import org.openzen.zenscript.codemodel.member.InnerDefinitionMember;
27
 import org.openzen.zenscript.codemodel.scope.TypeScope;
29
 import org.openzen.zenscript.codemodel.scope.TypeScope;
28
-import org.openzen.zenscript.codemodel.type.ITypeID;
30
+import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
31
+import org.openzen.zenscript.codemodel.type.TypeID;
29
 
32
 
30
 /**
33
 /**
31
  *
34
  *
42
 	public DefinitionAnnotation[] annotations = DefinitionAnnotation.NONE;
45
 	public DefinitionAnnotation[] annotations = DefinitionAnnotation.NONE;
43
 	
46
 	
44
 	public HighLevelDefinition outerDefinition;
47
 	public HighLevelDefinition outerDefinition;
45
-	private ITypeID superType;
48
+	private TypeID superType;
46
 	
49
 	
47
 	private boolean isDestructible = false;
50
 	private boolean isDestructible = false;
48
 	
51
 	
72
 		return pkg.fullName + '.' + name;
75
 		return pkg.fullName + '.' + name;
73
 	}
76
 	}
74
 	
77
 	
75
-	public ITypeID getSuperType() {
78
+	public TypeID getSuperType() {
76
 		return superType;
79
 		return superType;
77
 	}
80
 	}
78
 	
81
 	
79
-	public void setSuperType(ITypeID superType) {
82
+	public void setSuperType(TypeID superType) {
80
 		this.superType = superType;
83
 		this.superType = superType;
81
 		if (outerDefinition != null)
84
 		if (outerDefinition != null)
82
 			isDestructible |= outerDefinition.isDestructible;
85
 			isDestructible |= outerDefinition.isDestructible;
83
 	}
86
 	}
84
 	
87
 	
88
+	public boolean isSubclassOf(HighLevelDefinition other) {
89
+		if (superType.isDefinition(other))
90
+			return true;
91
+		if (superType == null || !(superType instanceof DefinitionTypeID))
92
+			return false;
93
+		
94
+		DefinitionTypeID superDefinition = (DefinitionTypeID)superType;
95
+		return superDefinition.definition.isSubclassOf(other);
96
+	}
97
+	
85
 	public int getNumberOfGenericParameters() {
98
 	public int getNumberOfGenericParameters() {
86
 		return typeParameters == null ? 0 : typeParameters.length;
99
 		return typeParameters == null ? 0 : typeParameters.length;
87
 	}
100
 	}
113
 	}
126
 	}
114
 	
127
 	
115
 	public boolean isDestructible() {
128
 	public boolean isDestructible() {
129
+		Set<HighLevelDefinition> scanning = new HashSet<>();
130
+		return isDestructible(scanning);
131
+	}
132
+	
133
+	public boolean isDestructible(Set<HighLevelDefinition> scanning) {
134
+		if (scanning.contains(this))
135
+			return false;
136
+		
137
+		scanning.add(this);
138
+		
116
 		boolean isDestructible = false;
139
 		boolean isDestructible = false;
117
 		for (IDefinitionMember member : members) {
140
 		for (IDefinitionMember member : members) {
118
 			if (member instanceof DestructorMember)
141
 			if (member instanceof DestructorMember)
119
 				isDestructible = true;
142
 				isDestructible = true;
120
-			if ((member instanceof FieldMember) && ((FieldMember)member).type.isDestructible())
121
-				isDestructible = true;
143
+			if (member instanceof FieldMember) {
144
+				FieldMember field = (FieldMember)member;
145
+				if (field.type.isDestructible(scanning))
146
+					isDestructible = true;
147
+			}
122
 			if ((member instanceof ImplementationMember) && ((ImplementationMember)member).type.isDestructible())
148
 			if ((member instanceof ImplementationMember) && ((ImplementationMember)member).type.isDestructible())
123
 				isDestructible = true;
149
 				isDestructible = true;
124
 		}
150
 		}
151
+		
152
+		scanning.remove(this);
125
 		return isDestructible;
153
 		return isDestructible;
126
 	}
154
 	}
127
 	
155
 	
129
 		this.typeParameters = typeParameters;
157
 		this.typeParameters = typeParameters;
130
 	}
158
 	}
131
 	
159
 	
160
+	public AccessScope getAccessScope() {
161
+		return new AccessScope(module, this);
162
+	}
163
+	
132
 	public List<FieldMember> getFields() {
164
 	public List<FieldMember> getFields() {
133
 		List<FieldMember> fields = new ArrayList<>();
165
 		List<FieldMember> fields = new ArrayList<>();
134
 		for (IDefinitionMember member : members)
166
 		for (IDefinitionMember member : members)
195
 		
227
 		
196
 		return null;
228
 		return null;
197
 	}
229
 	}
230
+
231
+	public boolean isOuterOf(HighLevelDefinition definition) {
232
+		if (definition.outerDefinition == this)
233
+			return true;
234
+		if (definition.outerDefinition == null)
235
+			return false;
236
+		
237
+		return isOuterOf(definition.outerDefinition);
238
+	}
198
 }
239
 }

+ 7
- 3
CodeModel/src/main/java/org/openzen/zenscript/codemodel/Modifiers.java View File

13
 	private Modifiers() {}
13
 	private Modifiers() {}
14
 	
14
 	
15
 	public static final int PUBLIC = 1;
15
 	public static final int PUBLIC = 1;
16
-	public static final int EXPORT = 2;
16
+	public static final int INTERNAL = 2;
17
 	public static final int PRIVATE = 4;
17
 	public static final int PRIVATE = 4;
18
 	public static final int ABSTRACT = 8;
18
 	public static final int ABSTRACT = 8;
19
 	public static final int FINAL = 16;
19
 	public static final int FINAL = 16;
30
 		return (modifiers & PUBLIC) > 0;
30
 		return (modifiers & PUBLIC) > 0;
31
 	}
31
 	}
32
 	
32
 	
33
-	public static boolean isExport(int modifiers) {
34
-		return (modifiers & EXPORT) > 0;
33
+	public static boolean isInternal(int modifiers) {
34
+		return (modifiers & INTERNAL) > 0;
35
 	}
35
 	}
36
 	
36
 	
37
 	public static boolean isProtected(int modifiers) {
37
 	public static boolean isProtected(int modifiers) {
77
 	public static boolean isOverride(int modifiers) {
77
 	public static boolean isOverride(int modifiers) {
78
 		return (modifiers & OVERRIDE) > 0;
78
 		return (modifiers & OVERRIDE) > 0;
79
 	}
79
 	}
80
+	
81
+	public static boolean hasAccess(int modifiers) {
82
+		return (modifiers & (PRIVATE | PUBLIC | PROTECTED | INTERNAL)) > 0;
83
+	}
80
 }
84
 }

+ 6
- 3
CodeModel/src/main/java/org/openzen/zenscript/codemodel/Module.java View File

5
  */
5
  */
6
 package org.openzen.zenscript.codemodel;
6
 package org.openzen.zenscript.codemodel;
7
 
7
 
8
-import org.openzen.zencode.shared.Taggable;
9
-
10
 /**
8
 /**
11
  *
9
  *
12
  * @author Hoofdgebruiker
10
  * @author Hoofdgebruiker
13
  */
11
  */
14
-public class Module extends Taggable {
12
+public class Module {
15
 	public static final Module BUILTIN = new Module("builtin");
13
 	public static final Module BUILTIN = new Module("builtin");
16
 	
14
 	
17
 	public final String name;
15
 	public final String name;
19
 	public Module(String name) {
17
 	public Module(String name) {
20
 		this.name = name;
18
 		this.name = name;
21
 	}
19
 	}
20
+	
21
+	@Override
22
+	public String toString() {
23
+		return name;
24
+	}
22
 }
25
 }

+ 18
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/ScriptBlock.java View File

5
  */
5
  */
6
 package org.openzen.zenscript.codemodel;
6
 package org.openzen.zenscript.codemodel;
7
 
7
 
8
+import java.util.ArrayList;
8
 import java.util.List;
9
 import java.util.List;
10
+import org.openzen.zencode.shared.ConcatMap;
9
 import org.openzen.zencode.shared.Taggable;
11
 import org.openzen.zencode.shared.Taggable;
10
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
12
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
13
+import org.openzen.zenscript.codemodel.scope.TypeScope;
14
+import org.openzen.zenscript.codemodel.statement.LoopStatement;
11
 import org.openzen.zenscript.codemodel.statement.Statement;
15
 import org.openzen.zenscript.codemodel.statement.Statement;
12
 
16
 
13
 /**
17
 /**
15
  * @author Hoofdgebruiker
19
  * @author Hoofdgebruiker
16
  */
20
  */
17
 public class ScriptBlock extends Taggable {
21
 public class ScriptBlock extends Taggable {
22
+	public final Module module;
18
 	public final ZSPackage pkg;
23
 	public final ZSPackage pkg;
19
 	public final List<Statement> statements;
24
 	public final List<Statement> statements;
20
 	
25
 	
21
-	public ScriptBlock(ZSPackage pkg, List<Statement> statements) {
26
+	public ScriptBlock(Module module, ZSPackage pkg, List<Statement> statements) {
27
+		this.module = module;
22
 		this.pkg = pkg;
28
 		this.pkg = pkg;
23
 		this.statements = statements;
29
 		this.statements = statements;
24
 	}
30
 	}
25
 	
31
 	
26
 	public ScriptBlock withStatements(List<Statement> newStatements) {
32
 	public ScriptBlock withStatements(List<Statement> newStatements) {
27
-		ScriptBlock result = new ScriptBlock(pkg, newStatements);
33
+		ScriptBlock result = new ScriptBlock(module, pkg, newStatements);
34
+		result.addAllTagsFrom(this);
35
+		return result;
36
+	}
37
+	
38
+	public ScriptBlock normalize(TypeScope scope) {
39
+		List<Statement> normalized = new ArrayList<>();
40
+		for (Statement statement : statements) {
41
+			normalized.add(statement.normalize(scope, ConcatMap.empty(LoopStatement.class, LoopStatement.class)));
42
+		}
43
+		ScriptBlock result = new ScriptBlock(module, pkg, normalized);
28
 		result.addAllTagsFrom(this);
44
 		result.addAllTagsFrom(this);
29
 		return result;
45
 		return result;
30
 	}
46
 	}

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

7
 
7
 
8
 import java.util.ArrayList;
8
 import java.util.ArrayList;
9
 import java.util.List;
9
 import java.util.List;
10
+import org.openzen.zencode.shared.Tag;
10
 import stdlib.Strings;
11
 import stdlib.Strings;
11
 
12
 
12
 /**
13
 /**
13
  *
14
  *
14
  * @author Hoofdgebruiker
15
  * @author Hoofdgebruiker
15
  */
16
  */
16
-public class WhitespaceInfo {
17
+public class WhitespaceInfo implements Tag {
17
 	public static WhitespaceInfo from(String whitespaceBefore, String lineAfter, boolean skipLineBefore) {
18
 	public static WhitespaceInfo from(String whitespaceBefore, String lineAfter, boolean skipLineBefore) {
18
 		int numNewLines = 0;
19
 		int numNewLines = 0;
19
 		for (char c : whitespaceBefore.toCharArray())
20
 		for (char c : whitespaceBefore.toCharArray())

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

7
 
7
 
8
 import java.util.ArrayList;
8
 import java.util.ArrayList;
9
 import java.util.List;
9
 import java.util.List;
10
+import org.openzen.zencode.shared.Tag;
10
 import stdlib.Strings;
11
 import stdlib.Strings;
11
 
12
 
12
 /**
13
 /**
13
  *
14
  *
14
  * @author Hoofdgebruiker
15
  * @author Hoofdgebruiker
15
  */
16
  */
16
-public class WhitespacePostComment {
17
+public class WhitespacePostComment implements Tag {
17
 	public static WhitespacePostComment fromWhitespace(String whitespace) {
18
 	public static WhitespacePostComment fromWhitespace(String whitespace) {
18
 		List<String> comments = new ArrayList<>();
19
 		List<String> comments = new ArrayList<>();
19
 		for (String line : Strings.split(whitespace, '\n')) {
20
 		for (String line : Strings.split(whitespace, '\n')) {

+ 2
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/AnnotationDefinition.java View File

43
 	
43
 	
44
 	public StatementAnnotation createForStatement(CodePosition position, CallArguments arguments);
44
 	public StatementAnnotation createForStatement(CodePosition position, CallArguments arguments);
45
 	
45
 	
46
-	public Annotation createForParameter(CodePosition position, CallArguments arguments);
46
+	public ParameterAnnotation createForParameter(CodePosition position, CallArguments arguments);
47
 	
47
 	
48
 	public MemberAnnotation deserializeForMember(CodeSerializationInput input, TypeContext context, IDefinitionMember member);
48
 	public MemberAnnotation deserializeForMember(CodeSerializationInput input, TypeContext context, IDefinitionMember member);
49
 	
49
 	
51
 	
51
 	
52
 	public StatementAnnotation deserializeForStatement(CodeSerializationInput input, StatementContext context);
52
 	public StatementAnnotation deserializeForStatement(CodeSerializationInput input, StatementContext context);
53
 	
53
 	
54
-	public Annotation deserializeForParameter(CodeSerializationInput input, TypeContext context);
54
+	public ParameterAnnotation deserializeForParameter(CodeSerializationInput input, TypeContext context);
55
 }
55
 }

+ 102
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/InvalidAnnotationDefinition.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.annotations;
7
+
8
+import java.util.Collections;
9
+import java.util.List;
10
+import org.openzen.zencode.shared.CodePosition;
11
+import org.openzen.zenscript.codemodel.FunctionHeader;
12
+import org.openzen.zenscript.codemodel.FunctionParameter;
13
+import org.openzen.zenscript.codemodel.HighLevelDefinition;
14
+import org.openzen.zenscript.codemodel.context.StatementContext;
15
+import org.openzen.zenscript.codemodel.context.TypeContext;
16
+import org.openzen.zenscript.codemodel.expression.CallArguments;
17
+import org.openzen.zenscript.codemodel.member.IDefinitionMember;
18
+import org.openzen.zenscript.codemodel.scope.BaseScope;
19
+import org.openzen.zenscript.codemodel.scope.ExpressionScope;
20
+import org.openzen.zenscript.codemodel.scope.StatementScope;
21
+import org.openzen.zenscript.codemodel.serialization.CodeSerializationInput;
22
+import org.openzen.zenscript.codemodel.statement.Statement;
23
+
24
+/**
25
+ *
26
+ * @author Hoofdgebruiker
27
+ */
28
+public class InvalidAnnotationDefinition implements AnnotationDefinition {
29
+	public static final InvalidAnnotationDefinition INSTANCE = new InvalidAnnotationDefinition();
30
+	
31
+	private InvalidAnnotationDefinition() {}
32
+
33
+	@Override
34
+	public String getAnnotationName() {
35
+		return "Invalid";
36
+	}
37
+
38
+	@Override
39
+	public List<FunctionHeader> getInitializers(BaseScope scope) {
40
+		return Collections.emptyList();
41
+	}
42
+
43
+	@Override
44
+	public ExpressionScope getScopeForMember(IDefinitionMember member, BaseScope scope) {
45
+		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
46
+	}
47
+
48
+	@Override
49
+	public ExpressionScope getScopeForType(HighLevelDefinition definition, BaseScope scope) {
50
+		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
51
+	}
52
+
53
+	@Override
54
+	public ExpressionScope getScopeForStatement(Statement statement, StatementScope scope) {
55
+		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
56
+	}
57
+
58
+	@Override
59
+	public ExpressionScope getScopeForParameter(FunctionHeader header, FunctionParameter parameter, BaseScope scope) {
60
+		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
61
+	}
62
+
63
+	@Override
64
+	public MemberAnnotation createForMember(CodePosition position, CallArguments arguments) {
65
+		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
66
+	}
67
+
68
+	@Override
69
+	public DefinitionAnnotation createForDefinition(CodePosition position, CallArguments arguments) {
70
+		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
71
+	}
72
+
73
+	@Override
74
+	public StatementAnnotation createForStatement(CodePosition position, CallArguments arguments) {
75
+		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
76
+	}
77
+
78
+	@Override
79
+	public ParameterAnnotation createForParameter(CodePosition position, CallArguments arguments) {
80
+		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
81
+	}
82
+
83
+	@Override
84
+	public MemberAnnotation deserializeForMember(CodeSerializationInput input, TypeContext context, IDefinitionMember member) {
85
+		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
86
+	}
87
+
88
+	@Override
89
+	public DefinitionAnnotation deserializeForDefinition(CodeSerializationInput input, TypeContext context) {
90
+		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
91
+	}
92
+
93
+	@Override
94
+	public StatementAnnotation deserializeForStatement(CodeSerializationInput input, StatementContext context) {
95
+		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
96
+	}
97
+
98
+	@Override
99
+	public ParameterAnnotation deserializeForParameter(CodeSerializationInput input, TypeContext context) {
100
+		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
101
+	}
102
+}

+ 56
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/InvalidDefinitionAnnotation.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.annotations;
7
+
8
+import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zencode.shared.CompileException;
10
+import org.openzen.zencode.shared.CompileExceptionCode;
11
+import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
+import org.openzen.zenscript.codemodel.context.TypeContext;
13
+import org.openzen.zenscript.codemodel.scope.BaseScope;
14
+import org.openzen.zenscript.codemodel.serialization.CodeSerializationOutput;
15
+
16
+/**
17
+ *
18
+ * @author Hoofdgebruiker
19
+ */
20
+public class InvalidDefinitionAnnotation implements DefinitionAnnotation {
21
+	public final CodePosition position;
22
+	public final CompileExceptionCode code;
23
+	public final String message;
24
+	
25
+	public InvalidDefinitionAnnotation(CodePosition position, CompileExceptionCode code, String message) {
26
+		this.position = position;
27
+		this.code = code;
28
+		this.message = message;
29
+	}
30
+	
31
+	public InvalidDefinitionAnnotation(CompileException ex) {
32
+		this.position = ex.position;
33
+		this.code = ex.code;
34
+		this.message = ex.getMessage();
35
+	}
36
+
37
+	@Override
38
+	public AnnotationDefinition getDefinition() {
39
+		return InvalidAnnotationDefinition.INSTANCE;
40
+	}
41
+
42
+	@Override
43
+	public void apply(HighLevelDefinition definition, BaseScope scope) {
44
+		
45
+	}
46
+
47
+	@Override
48
+	public void applyOnSubtype(HighLevelDefinition definition, BaseScope scope) {
49
+		
50
+	}
51
+
52
+	@Override
53
+	public void serialize(CodeSerializationOutput output, HighLevelDefinition definition, TypeContext context) {
54
+		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
55
+	}
56
+}

+ 70
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/InvalidMemberAnnotation.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.annotations;
7
+
8
+import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zencode.shared.CompileException;
10
+import org.openzen.zencode.shared.CompileExceptionCode;
11
+import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
+import org.openzen.zenscript.codemodel.context.TypeContext;
13
+import org.openzen.zenscript.codemodel.member.FunctionalMember;
14
+import org.openzen.zenscript.codemodel.member.GetterMember;
15
+import org.openzen.zenscript.codemodel.member.IDefinitionMember;
16
+import org.openzen.zenscript.codemodel.member.SetterMember;
17
+import org.openzen.zenscript.codemodel.scope.BaseScope;
18
+import org.openzen.zenscript.codemodel.serialization.CodeSerializationOutput;
19
+
20
+/**
21
+ *
22
+ * @author Hoofdgebruiker
23
+ */
24
+public class InvalidMemberAnnotation implements MemberAnnotation {
25
+	public final CodePosition position;
26
+	public final CompileExceptionCode code;
27
+	public final String message;
28
+	
29
+	public InvalidMemberAnnotation(CodePosition position, CompileExceptionCode code, String message) {
30
+		this.position = position;
31
+		this.code = code;
32
+		this.message = message;
33
+	}
34
+	
35
+	public InvalidMemberAnnotation(CompileException ex) {
36
+		this.position = ex.position;
37
+		this.code = ex.code;
38
+		this.message = ex.getMessage();
39
+	}
40
+
41
+	@Override
42
+	public AnnotationDefinition getDefinition() {
43
+		return InvalidAnnotationDefinition.INSTANCE;
44
+	}
45
+
46
+	@Override
47
+	public void apply(IDefinitionMember member, BaseScope scope) {
48
+		
49
+	}
50
+
51
+	@Override
52
+	public void applyOnOverridingMethod(FunctionalMember member, BaseScope scope) {
53
+		
54
+	}
55
+
56
+	@Override
57
+	public void applyOnOverridingGetter(GetterMember member, BaseScope scope) {
58
+		
59
+	}
60
+
61
+	@Override
62
+	public void applyOnOverridingSetter(SetterMember member, BaseScope scope) {
63
+		
64
+	}
65
+
66
+	@Override
67
+	public void serialize(CodeSerializationOutput output, IDefinitionMember member, TypeContext context) {
68
+		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
69
+	}
70
+}

+ 42
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/InvalidParameterAnnotation.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.annotations;
7
+
8
+import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zencode.shared.CompileException;
10
+import org.openzen.zencode.shared.CompileExceptionCode;
11
+
12
+/**
13
+ *
14
+ * @author Hoofdgebruiker
15
+ */
16
+public class InvalidParameterAnnotation implements ParameterAnnotation {
17
+	public final CodePosition position;
18
+	public final CompileExceptionCode code;
19
+	public final String message;
20
+	
21
+	public InvalidParameterAnnotation(CodePosition position, CompileExceptionCode code, String message) {
22
+		this.position = position;
23
+		this.code = code;
24
+		this.message = message;
25
+	}
26
+	
27
+	public InvalidParameterAnnotation(CompileException ex) {
28
+		this.position = ex.position;
29
+		this.code = ex.code;
30
+		this.message = ex.getMessage();
31
+	}
32
+
33
+	@Override
34
+	public AnnotationDefinition getDefinition() {
35
+		return InvalidAnnotationDefinition.INSTANCE;
36
+	}
37
+
38
+	@Override
39
+	public void apply() {
40
+		
41
+	}
42
+}

+ 44
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/InvalidStatementAnnotation.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.annotations;
7
+
8
+import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zencode.shared.CompileException;
10
+import org.openzen.zencode.shared.CompileExceptionCode;
11
+import org.openzen.zenscript.codemodel.scope.StatementScope;
12
+import org.openzen.zenscript.codemodel.statement.Statement;
13
+
14
+/**
15
+ *
16
+ * @author Hoofdgebruiker
17
+ */
18
+public class InvalidStatementAnnotation implements StatementAnnotation {
19
+	public final CodePosition position;
20
+	public final CompileExceptionCode code;
21
+	public final String message;
22
+	
23
+	public InvalidStatementAnnotation(CodePosition position, CompileExceptionCode code, String message) {
24
+		this.position = position;
25
+		this.code = code;
26
+		this.message = message;
27
+	}
28
+	
29
+	public InvalidStatementAnnotation(CompileException ex) {
30
+		this.position = ex.position;
31
+		this.code = ex.code;
32
+		this.message = ex.getMessage();
33
+	}
34
+
35
+	@Override
36
+	public AnnotationDefinition getDefinition() {
37
+		return InvalidAnnotationDefinition.INSTANCE;
38
+	}
39
+
40
+	@Override
41
+	public Statement apply(Statement statement, StatementScope scope) {
42
+		return statement;
43
+	}
44
+}

+ 4
- 3
CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/NativeAnnotationDefinition.java View File

22
 import org.openzen.zenscript.codemodel.serialization.CodeSerializationInput;
22
 import org.openzen.zenscript.codemodel.serialization.CodeSerializationInput;
23
 import org.openzen.zenscript.codemodel.statement.Statement;
23
 import org.openzen.zenscript.codemodel.statement.Statement;
24
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
24
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
25
+import org.openzen.zenscript.codemodel.type.StringTypeID;
25
 
26
 
26
 /**
27
 /**
27
  *
28
  *
31
 	public static final NativeAnnotationDefinition INSTANCE = new NativeAnnotationDefinition();
32
 	public static final NativeAnnotationDefinition INSTANCE = new NativeAnnotationDefinition();
32
 	
33
 	
33
 	private static final List<FunctionHeader> INITIALIZERS = Collections.singletonList(
34
 	private static final List<FunctionHeader> INITIALIZERS = Collections.singletonList(
34
-			new FunctionHeader(BasicTypeID.VOID, BasicTypeID.STRING));
35
+			new FunctionHeader(BasicTypeID.VOID, StringTypeID.UNIQUE));
35
 	
36
 	
36
 	private NativeAnnotationDefinition() {}
37
 	private NativeAnnotationDefinition() {}
37
 
38
 
85
 	}
86
 	}
86
 
87
 
87
 	@Override
88
 	@Override
88
-	public Annotation createForParameter(CodePosition position, CallArguments arguments) {
89
+	public ParameterAnnotation createForParameter(CodePosition position, CallArguments arguments) {
89
 		throw new UnsupportedOperationException("Not supported");
90
 		throw new UnsupportedOperationException("Not supported");
90
 	}
91
 	}
91
 
92
 
107
 	}
108
 	}
108
 
109
 
109
 	@Override
110
 	@Override
110
-	public Annotation deserializeForParameter(CodeSerializationInput input, TypeContext context) {
111
+	public ParameterAnnotation deserializeForParameter(CodeSerializationInput input, TypeContext context) {
111
 		throw new UnsupportedOperationException("Not supported");
112
 		throw new UnsupportedOperationException("Not supported");
112
 	}
113
 	}
113
 }
114
 }

+ 3
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/NativeTag.java View File

5
  */
5
  */
6
 package org.openzen.zenscript.codemodel.annotations;
6
 package org.openzen.zenscript.codemodel.annotations;
7
 
7
 
8
+import org.openzen.zencode.shared.Tag;
9
+
8
 /**
10
 /**
9
  *
11
  *
10
  * @author Hoofdgebruiker
12
  * @author Hoofdgebruiker
11
  */
13
  */
12
-public class NativeTag {
14
+public class NativeTag implements Tag {
13
 	public final String value;
15
 	public final String value;
14
 	
16
 	
15
 	public NativeTag(String value) {
17
 	public NativeTag(String value) {

CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/Annotation.java → CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/ParameterAnnotation.java View File

9
  *
9
  *
10
  * @author Hoofdgebruiker
10
  * @author Hoofdgebruiker
11
  */
11
  */
12
-public interface Annotation {
13
-	public static final Annotation[] NONE = new Annotation[0];
12
+public interface ParameterAnnotation {
13
+	public static final ParameterAnnotation[] NONE = new ParameterAnnotation[0];
14
 	
14
 	
15
 	public AnnotationDefinition getDefinition();
15
 	public AnnotationDefinition getDefinition();
16
 	
16
 	

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

26
 import org.openzen.zenscript.codemodel.serialization.CodeSerializationInput;
26
 import org.openzen.zenscript.codemodel.serialization.CodeSerializationInput;
27
 import org.openzen.zenscript.codemodel.statement.Statement;
27
 import org.openzen.zenscript.codemodel.statement.Statement;
28
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
28
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
29
-import org.openzen.zenscript.codemodel.type.GenericName;
29
+import org.openzen.zenscript.codemodel.GenericName;
30
+import org.openzen.zenscript.codemodel.type.StringTypeID;
31
+import org.openzen.zenscript.codemodel.type.storage.ValueStorageTag;
30
 
32
 
31
 /**
33
 /**
32
  *
34
  *
49
 	@Override
51
 	@Override
50
 	public List<FunctionHeader> getInitializers(BaseScope scope) {
52
 	public List<FunctionHeader> getInitializers(BaseScope scope) {
51
 		return Collections.singletonList(new FunctionHeader(
53
 		return Collections.singletonList(new FunctionHeader(
52
-				BasicTypeID.VOID,
53
-				scope.getType(CodePosition.BUILTIN, enforcementLevelName),
54
-				BasicTypeID.BOOL,
55
-				BasicTypeID.STRING));
54
+				BasicTypeID.VOID.stored,
55
+				scope.getType(CodePosition.BUILTIN, enforcementLevelName).stored(),
56
+				BasicTypeID.BOOL.stored,
57
+				StringTypeID.UNIQUE));
56
 	}
58
 	}
57
 
59
 
58
 	@Override
60
 	@Override
104
 	}
106
 	}
105
 
107
 
106
 	@Override
108
 	@Override
107
-	public Annotation createForParameter(CodePosition position, CallArguments arguments) {
109
+	public ParameterAnnotation createForParameter(CodePosition position, CallArguments arguments) {
108
 		throw new UnsupportedOperationException("Not supported");
110
 		throw new UnsupportedOperationException("Not supported");
109
 	}
111
 	}
110
 
112
 
129
 	}
131
 	}
130
 
132
 
131
 	@Override
133
 	@Override
132
-	public Annotation deserializeForParameter(CodeSerializationInput input, TypeContext context) {
134
+	public ParameterAnnotation deserializeForParameter(CodeSerializationInput input, TypeContext context) {
133
 		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
135
 		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
134
 	}
136
 	}
135
 }
137
 }

+ 19
- 12
CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/PreconditionForMethod.java View File

9
 import java.util.Arrays;
9
 import java.util.Arrays;
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.zencode.shared.CompileException;
12
 import org.openzen.zenscript.codemodel.context.StatementContext;
13
 import org.openzen.zenscript.codemodel.context.StatementContext;
13
 import org.openzen.zenscript.codemodel.context.TypeContext;
14
 import org.openzen.zenscript.codemodel.context.TypeContext;
14
 import org.openzen.zenscript.codemodel.expression.Expression;
15
 import org.openzen.zenscript.codemodel.expression.Expression;
83
 		if (body == null)
84
 		if (body == null)
84
 			return body;
85
 			return body;
85
 		
86
 		
86
-		ExpressionScope expressionScope = new ExpressionScope(scope, BasicTypeID.BOOL);
87
-		List<Statement> statements = new ArrayList<>();
88
-		ExpressionBuilder expressionBuilder = new ExpressionBuilder(position, expressionScope);
89
-		Expression inverseCondition = expressionBuilder.not(condition);
90
-		Statement throwStatement = new ExpressionStatement(position, new PanicExpression(position, BasicTypeID.VOID, message));
91
-		statements.add(new IfStatement(position, inverseCondition, throwStatement, null));
92
-		
93
-		if (body instanceof BlockStatement) {
94
-			statements.addAll(Arrays.asList(((BlockStatement)body).statements));
95
-		} else {
96
-			statements.add(body);
87
+		try {
88
+			ExpressionScope expressionScope = new ExpressionScope(scope, BasicTypeID.BOOL.stored);
89
+			List<Statement> statements = new ArrayList<>();
90
+			ExpressionBuilder expressionBuilder = new ExpressionBuilder(position, expressionScope);
91
+			Expression inverseCondition = expressionBuilder.not(condition);
92
+			Statement throwStatement = new ExpressionStatement(position, new PanicExpression(position, BasicTypeID.VOID.stored, message));
93
+			statements.add(new IfStatement(position, inverseCondition, throwStatement, null));
94
+
95
+			if (body instanceof BlockStatement) {
96
+				statements.addAll(Arrays.asList(((BlockStatement)body).statements));
97
+			} else {
98
+				statements.add(body);
99
+			}
100
+			return new BlockStatement(position, statements.toArray(new Statement[statements.size()]));
101
+		} catch (CompileException ex) {
102
+			// TODO
103
+			ex.printStackTrace();
104
+			return body;
97
 		}
105
 		}
98
-		return new BlockStatement(position, statements.toArray(new Statement[statements.size()]));
99
 	}
106
 	}
100
 
107
 
101
 	@Override
108
 	@Override

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

12
 import org.openzen.zenscript.codemodel.Module;
12
 import org.openzen.zenscript.codemodel.Module;
13
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
13
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
14
 import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
14
 import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
15
-import org.openzen.zenscript.codemodel.type.GenericName;
16
-import org.openzen.zenscript.codemodel.type.ITypeID;
15
+import org.openzen.zenscript.codemodel.GenericName;
16
+import org.openzen.zenscript.codemodel.type.TypeID;
17
 
17
 
18
 /**
18
 /**
19
  *
19
  *
71
 		return getImportType(context, type.getInner(name.get(index)), name, index + 1);
71
 		return getImportType(context, type.getInner(name.get(index)), name, index + 1);
72
 	}
72
 	}
73
 	
73
 	
74
-	public ITypeID getType(TypeResolutionContext context, List<GenericName> name) {
74
+	public TypeID getType(TypeResolutionContext context, List<GenericName> name) {
75
 		return getType(context, name, 0);
75
 		return getType(context, name, 0);
76
 	}
76
 	}
77
 	
77
 	
78
-	private ITypeID getType(TypeResolutionContext context, List<GenericName> name, int index) {
78
+	private TypeID getType(TypeResolutionContext context, List<GenericName> name, int index) {
79
 		if (index == name.size())
79
 		if (index == name.size())
80
 			return null;
80
 			return null;
81
 		
81
 		
91
 		return null;
91
 		return null;
92
 	}
92
 	}
93
 	
93
 	
94
-	private ITypeID getInner(TypeResolutionContext context, List<GenericName> name, int index, CompilingType type, DefinitionTypeID result) {
94
+	private TypeID getInner(TypeResolutionContext context, List<GenericName> name, int index, CompilingType type, DefinitionTypeID result) {
95
 		if (index == name.size())
95
 		if (index == name.size())
96
 			return result;
96
 			return result;
97
 		
97
 		

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

8
 import java.util.List;
8
 import java.util.List;
9
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
9
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
10
 import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
10
 import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
11
-import org.openzen.zenscript.codemodel.type.GenericName;
11
+import org.openzen.zenscript.codemodel.GenericName;
12
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
12
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
13
 
13
 
14
 /**
14
 /**

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

9
 import java.util.List;
9
 import java.util.List;
10
 import java.util.Map;
10
 import java.util.Map;
11
 import org.openzen.zencode.shared.CodePosition;
11
 import org.openzen.zencode.shared.CodePosition;
12
+import org.openzen.zencode.shared.CompileExceptionCode;
12
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
13
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
13
 import org.openzen.zenscript.codemodel.annotations.AnnotationDefinition;
14
 import org.openzen.zenscript.codemodel.annotations.AnnotationDefinition;
14
-import org.openzen.zenscript.codemodel.type.GenericName;
15
+import org.openzen.zenscript.codemodel.GenericName;
15
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
16
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
16
-import org.openzen.zenscript.codemodel.type.ITypeID;
17
+import org.openzen.zenscript.codemodel.type.InvalidTypeID;
18
+import org.openzen.zenscript.codemodel.type.StoredType;
19
+import org.openzen.zenscript.codemodel.type.TypeID;
20
+import org.openzen.zenscript.codemodel.type.storage.StorageTag;
17
 
21
 
18
 /**
22
 /**
19
  *
23
  *
44
 	}
48
 	}
45
 
49
 
46
 	@Override
50
 	@Override
47
-	public ITypeID getType(CodePosition position, List<GenericName> name) {
51
+	public TypeID getType(CodePosition position, List<GenericName> name) {
48
 		if (imports.containsKey(name.get(0).name)) {
52
 		if (imports.containsKey(name.get(0).name)) {
53
+			HighLevelDefinition definition = imports.get(name.get(0).name);
54
+			if (definition.getNumberOfGenericParameters() != name.get(0).arguments.length)
55
+				return new InvalidTypeID(position, CompileExceptionCode.INVALID_TYPE_ARGUMENTS, "Invalid number of type arguments");
56
+			
49
 			return GenericName.getInnerType(
57
 			return GenericName.getInnerType(
50
 					getTypeRegistry(),
58
 					getTypeRegistry(),
51
-					getTypeRegistry().getForDefinition(imports.get(name.get(0).name), name.get(0).arguments),
59
+					getTypeRegistry().getForDefinition(definition, name.get(0).arguments),
52
 					name,
60
 					name,
53
 					1);
61
 					1);
54
 		}
62
 		}
55
 		
63
 		
56
-		ITypeID moduleType = modulePackage.getType(this, name);
64
+		TypeID moduleType = modulePackage.getType(this, name);
57
 		if (moduleType != null)
65
 		if (moduleType != null)
58
 			return moduleType;
66
 			return moduleType;
59
 		
67
 		
60
 		return module.getType(position, name);
68
 		return module.getType(position, name);
61
 	}
69
 	}
70
+	
71
+	@Override
72
+	public StorageTag getStorageTag(CodePosition position, String name, String[] arguments) {
73
+		return module.getStorageTag(position, name, arguments);
74
+	}
62
 
75
 
63
 	@Override
76
 	@Override
64
-	public ITypeID getThisType() {
77
+	public StoredType getThisType() {
65
 		return null;
78
 		return null;
66
 	}
79
 	}
67
 }
80
 }

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

10
 import org.openzen.zenscript.codemodel.annotations.AnnotationDefinition;
10
 import org.openzen.zenscript.codemodel.annotations.AnnotationDefinition;
11
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
11
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
12
 import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
12
 import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
13
-import org.openzen.zenscript.codemodel.type.GenericName;
13
+import org.openzen.zenscript.codemodel.GenericName;
14
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
14
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
15
-import org.openzen.zenscript.codemodel.type.ITypeID;
15
+import org.openzen.zenscript.codemodel.type.StoredType;
16
+import org.openzen.zenscript.codemodel.type.TypeID;
17
+import org.openzen.zenscript.codemodel.type.storage.BorrowStorageTag;
18
+import org.openzen.zenscript.codemodel.type.storage.StorageTag;
19
+import org.openzen.zenscript.codemodel.type.storage.ValueStorageTag;
16
 
20
 
17
 /**
21
 /**
18
  *
22
  *
40
 	}
44
 	}
41
 
45
 
42
 	@Override
46
 	@Override
43
-	public ITypeID getType(CodePosition position, List<GenericName> name) {
47
+	public TypeID getType(CodePosition position, List<GenericName> name) {
44
 		if (type != null) {
48
 		if (type != null) {
45
 			CompilingType compiling = type.getInner(name.get(0).name);
49
 			CompilingType compiling = type.getInner(name.get(0).name);
46
 			if (compiling != null) {
50
 			if (compiling != null) {
57
 		
61
 		
58
 		return outer.getType(position, name);
62
 		return outer.getType(position, name);
59
 	}
63
 	}
64
+
65
+	@Override
66
+	public StorageTag getStorageTag(CodePosition position, String name, String[] parameters) {
67
+		return outer.getStorageTag(position, name, parameters);
68
+	}
60
 	
69
 	
61
 	@Override
70
 	@Override
62
-	public ITypeID getThisType() {
63
-		return type == null ? null : getTypeRegistry().getForMyDefinition(type.load());
71
+	public StoredType getThisType() {
72
+		if (type == null)
73
+			return null;
74
+		
75
+		TypeID self = getTypeRegistry().getForMyDefinition(type.load());
76
+		return self.stored(BorrowStorageTag.THIS);
64
 	}
77
 	}
65
 }
78
 }

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

9
 import java.util.List;
9
 import java.util.List;
10
 import java.util.Map;
10
 import java.util.Map;
11
 import org.openzen.zencode.shared.CodePosition;
11
 import org.openzen.zencode.shared.CodePosition;
12
+import org.openzen.zencode.shared.CompileExceptionCode;
12
 import org.openzen.zenscript.codemodel.annotations.AnnotationDefinition;
13
 import org.openzen.zenscript.codemodel.annotations.AnnotationDefinition;
13
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
14
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
14
-import org.openzen.zenscript.codemodel.type.GenericName;
15
+import org.openzen.zenscript.codemodel.GenericName;
15
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
16
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
16
 import org.openzen.zenscript.codemodel.type.ISymbol;
17
 import org.openzen.zenscript.codemodel.type.ISymbol;
17
-import org.openzen.zenscript.codemodel.type.ITypeID;
18
+import org.openzen.zenscript.codemodel.type.StoredType;
19
+import org.openzen.zenscript.codemodel.type.TypeID;
20
+import org.openzen.zenscript.codemodel.type.storage.InvalidStorageTag;
21
+import org.openzen.zenscript.codemodel.type.storage.StorageTag;
22
+import org.openzen.zenscript.codemodel.type.storage.StorageType;
18
 
23
 
19
 /**
24
 /**
20
  *
25
  *
23
 public class ModuleTypeResolutionContext implements TypeResolutionContext {
28
 public class ModuleTypeResolutionContext implements TypeResolutionContext {
24
 	private final GlobalTypeRegistry registry;
29
 	private final GlobalTypeRegistry registry;
25
 	private final Map<String, AnnotationDefinition> annotations = new HashMap<>();
30
 	private final Map<String, AnnotationDefinition> annotations = new HashMap<>();
31
+	private final Map<String, StorageType> storageTypes = new HashMap<>();
26
 	private final Map<String, ISymbol> globals;
32
 	private final Map<String, ISymbol> globals;
27
 	private final ZSPackage rootPackage;
33
 	private final ZSPackage rootPackage;
28
 	
34
 	
31
 	public ModuleTypeResolutionContext(
37
 	public ModuleTypeResolutionContext(
32
 			GlobalTypeRegistry registry,
38
 			GlobalTypeRegistry registry,
33
 			AnnotationDefinition[] annotations,
39
 			AnnotationDefinition[] annotations,
40
+			StorageType[] storageTypes,
34
 			ZSPackage rootPackage,
41
 			ZSPackage rootPackage,
35
 			CompilingPackage rootCompiling,
42
 			CompilingPackage rootCompiling,
36
 			Map<String, ISymbol> globals)
43
 			Map<String, ISymbol> globals)
42
 		
49
 		
43
 		for (AnnotationDefinition annotation : annotations)
50
 		for (AnnotationDefinition annotation : annotations)
44
 			this.annotations.put(annotation.getAnnotationName(), annotation);
51
 			this.annotations.put(annotation.getAnnotationName(), annotation);
52
+		for (StorageType storageType : storageTypes)
53
+			this.storageTypes.put(storageType.getName(), storageType);
45
 	}
54
 	}
46
 	
55
 	
47
 	@Override
56
 	@Override
55
 	}
64
 	}
56
 
65
 
57
 	@Override
66
 	@Override
58
-	public ITypeID getType(CodePosition position, List<GenericName> name) {
67
+	public TypeID getType(CodePosition position, List<GenericName> name) {
59
 		if (rootCompiling != null) {
68
 		if (rootCompiling != null) {
60
-			ITypeID compiling = rootCompiling.getType(this, name);
69
+			TypeID compiling = rootCompiling.getType(this, name);
61
 			if (compiling != null)
70
 			if (compiling != null)
62
 				return compiling;
71
 				return compiling;
63
 		}
72
 		}
69
 	}
78
 	}
70
 	
79
 	
71
 	@Override
80
 	@Override
72
-	public ITypeID getThisType() {
81
+	public StorageTag getStorageTag(CodePosition position, String name, String[] arguments) {
82
+		if (!storageTypes.containsKey(name))
83
+			return new InvalidStorageTag(position, CompileExceptionCode.NO_SUCH_STORAGE_TYPE, "No such storage type: " + name);
84
+		
85
+		return storageTypes.get(name).instance(position, arguments);
86
+	}
87
+	
88
+	@Override
89
+	public StoredType getThisType() {
73
 		return null;
90
 		return null;
74
 	}
91
 	}
75
 }
92
 }

+ 3
- 3
CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/StatementContext.java View File

15
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
15
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
16
 import org.openzen.zenscript.codemodel.statement.LoopStatement;
16
 import org.openzen.zenscript.codemodel.statement.LoopStatement;
17
 import org.openzen.zenscript.codemodel.statement.VarStatement;
17
 import org.openzen.zenscript.codemodel.statement.VarStatement;
18
-import org.openzen.zenscript.codemodel.type.ITypeID;
18
+import org.openzen.zenscript.codemodel.type.StoredType;
19
 
19
 
20
 /**
20
 /**
21
  *
21
  *
30
 	
30
 	
31
 	public VariantOptionSwitchValue variantOptionSwitchValue;
31
 	public VariantOptionSwitchValue variantOptionSwitchValue;
32
 	
32
 	
33
-	public StatementContext(ModuleContext module, ITypeID thisType) {
33
+	public StatementContext(ModuleContext module, StoredType thisType) {
34
 		super(module, TypeParameter.NONE, thisType);
34
 		super(module, TypeParameter.NONE, thisType);
35
 		
35
 		
36
 		loops = LoopStatement.NONE;
36
 		loops = LoopStatement.NONE;
39
 		lambdaOuter = null;
39
 		lambdaOuter = null;
40
 	}
40
 	}
41
 	
41
 	
42
-	public StatementContext(ModuleContext module, ITypeID thisType, FunctionHeader header) {
42
+	public StatementContext(ModuleContext module, StoredType thisType, FunctionHeader header) {
43
 		super(module, header.typeParameters, thisType);
43
 		super(module, header.typeParameters, thisType);
44
 		
44
 		
45
 		loops = LoopStatement.NONE;
45
 		loops = LoopStatement.NONE;

+ 7
- 10
CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/TypeContext.java View File

6
 package org.openzen.zenscript.codemodel.context;
6
 package org.openzen.zenscript.codemodel.context;
7
 
7
 
8
 import java.util.Arrays;
8
 import java.util.Arrays;
9
-import java.util.HashMap;
10
 import java.util.List;
9
 import java.util.List;
11
 import java.util.Map;
10
 import java.util.Map;
12
 import org.openzen.zenscript.codemodel.GenericMapper;
11
 import org.openzen.zenscript.codemodel.GenericMapper;
13
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
12
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
14
-import org.openzen.zenscript.codemodel.type.ITypeID;
13
+import org.openzen.zenscript.codemodel.type.StoredType;
15
 import org.openzen.zenscript.codemodel.type.member.LocalMemberCache;
14
 import org.openzen.zenscript.codemodel.type.member.LocalMemberCache;
16
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
15
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
17
 
16
 
21
  */
20
  */
22
 public class TypeContext {
21
 public class TypeContext {
23
 	protected final TypeParameter[] typeParameters;
22
 	protected final TypeParameter[] typeParameters;
24
-	public final ITypeID thisType;
23
+	public final StoredType thisType;
25
 	private final LocalMemberCache memberCache;
24
 	private final LocalMemberCache memberCache;
26
 	public final ModuleContext moduleContext;
25
 	public final ModuleContext moduleContext;
27
 	
26
 	
28
-	public TypeContext(ModuleContext context, TypeParameter[] parameters, ITypeID thisType) {
27
+	public TypeContext(ModuleContext context, TypeParameter[] parameters, StoredType thisType) {
29
 		this.typeParameters = parameters;
28
 		this.typeParameters = parameters;
30
 		this.thisType = thisType;
29
 		this.thisType = thisType;
31
 		memberCache = new LocalMemberCache(context.registry, context.expansions);
30
 		memberCache = new LocalMemberCache(context.registry, context.expansions);
32
 		moduleContext = context;
31
 		moduleContext = context;
33
 	}
32
 	}
34
 	
33
 	
35
-	public TypeContext(TypeContext outer, ITypeID thisType, TypeParameter... inner) {
34
+	public TypeContext(TypeContext outer, StoredType thisType, TypeParameter... inner) {
36
 		typeParameters = concat(outer.typeParameters, inner);
35
 		typeParameters = concat(outer.typeParameters, inner);
37
 		this.thisType = thisType;
36
 		this.thisType = thisType;
38
 		moduleContext = outer.moduleContext;
37
 		moduleContext = outer.moduleContext;
39
 		memberCache = new LocalMemberCache(moduleContext.registry, moduleContext.expansions);
38
 		memberCache = new LocalMemberCache(moduleContext.registry, moduleContext.expansions);
40
 	}
39
 	}
41
 	
40
 	
42
-	public TypeContext(TypeContext outer, ITypeID thisType, List<TypeParameter> inner) {
41
+	public TypeContext(TypeContext outer, StoredType thisType, List<TypeParameter> inner) {
43
 		this(outer, thisType, inner.toArray(new TypeParameter[inner.size()]));
42
 		this(outer, thisType, inner.toArray(new TypeParameter[inner.size()]));
44
 	}
43
 	}
45
 	
44
 	
55
 		return typeParameters[index];
54
 		return typeParameters[index];
56
 	}
55
 	}
57
 	
56
 	
58
-	public TypeMembers getTypeMembers(ITypeID type) {
57
+	public TypeMembers getTypeMembers(StoredType type) {
59
 		return memberCache.get(type);
58
 		return memberCache.get(type);
60
 	}
59
 	}
61
 	
60
 	
62
 	public GenericMapper getMapper() {
61
 	public GenericMapper getMapper() {
63
-		Map<TypeParameter, ITypeID> mapper = new HashMap<>();
64
-		for (TypeParameter parameter : typeParameters)
65
-			mapper.put(parameter, moduleContext.registry.getGeneric(parameter));
62
+		Map<TypeParameter, StoredType> mapper = StoredType.getSelfMapping(moduleContext.registry, typeParameters);
66
 		return new GenericMapper(moduleContext.registry, mapper);
63
 		return new GenericMapper(moduleContext.registry, mapper);
67
 	}
64
 	}
68
 	
65
 	

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

8
 import java.util.List;
8
 import java.util.List;
9
 import org.openzen.zencode.shared.CodePosition;
9
 import org.openzen.zencode.shared.CodePosition;
10
 import org.openzen.zenscript.codemodel.annotations.AnnotationDefinition;
10
 import org.openzen.zenscript.codemodel.annotations.AnnotationDefinition;
11
-import org.openzen.zenscript.codemodel.type.GenericName;
11
+import org.openzen.zenscript.codemodel.GenericName;
12
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
12
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
13
-import org.openzen.zenscript.codemodel.type.ITypeID;
13
+import org.openzen.zenscript.codemodel.type.StoredType;
14
+import org.openzen.zenscript.codemodel.type.TypeID;
15
+import org.openzen.zenscript.codemodel.type.storage.StorageTag;
14
 
16
 
15
 /**
17
 /**
16
  *
18
  *
21
 	
23
 	
22
 	AnnotationDefinition getAnnotation(String name);
24
 	AnnotationDefinition getAnnotation(String name);
23
 	
25
 	
24
-	ITypeID getType(CodePosition position, List<GenericName> name);
26
+	TypeID getType(CodePosition position, List<GenericName> name);
25
 	
27
 	
26
-	ITypeID getThisType();
28
+	StorageTag getStorageTag(CodePosition position, String name, String[] parameters);
29
+	
30
+	StoredType getThisType();
27
 }
31
 }

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

9
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
9
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
10
 import org.openzen.zenscript.codemodel.Module;
10
 import org.openzen.zenscript.codemodel.Module;
11
 import org.openzen.zenscript.codemodel.scope.TypeScope;
11
 import org.openzen.zenscript.codemodel.scope.TypeScope;
12
-import org.openzen.zenscript.codemodel.type.ITypeID;
12
+import org.openzen.zenscript.codemodel.type.TypeID;
13
 
13
 
14
 /**
14
 /**
15
  *
15
  *
16
  * @author Hoofdgebruiker
16
  * @author Hoofdgebruiker
17
  */
17
  */
18
 public class AliasDefinition extends HighLevelDefinition {
18
 public class AliasDefinition extends HighLevelDefinition {
19
-	public ITypeID type;
19
+	public TypeID type;
20
 	
20
 	
21
 	public AliasDefinition(CodePosition position, Module module, ZSPackage pkg, String name, int modifiers, HighLevelDefinition outerDefinition) {
21
 	public AliasDefinition(CodePosition position, Module module, ZSPackage pkg, String name, int modifiers, HighLevelDefinition outerDefinition) {
22
 		super(position, module, pkg, name, modifiers, outerDefinition);
22
 		super(position, module, pkg, name, modifiers, outerDefinition);
23
 	}
23
 	}
24
 	
24
 	
25
-	public void setType(ITypeID type) {
25
+	public void setType(TypeID type) {
26
 		if (type == null)
26
 		if (type == null)
27
 			throw new NullPointerException("type cannot be null!");
27
 			throw new NullPointerException("type cannot be null!");
28
 		
28
 		

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

11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
 import org.openzen.zenscript.codemodel.Module;
12
 import org.openzen.zenscript.codemodel.Module;
13
 import org.openzen.zenscript.codemodel.member.EnumConstantMember;
13
 import org.openzen.zenscript.codemodel.member.EnumConstantMember;
14
+import org.openzen.zenscript.codemodel.type.TypeID;
14
 
15
 
15
 /**
16
 /**
16
  *
17
  *
17
  * @author Hoofdgebruiker
18
  * @author Hoofdgebruiker
18
  */
19
  */
19
 public class EnumDefinition extends HighLevelDefinition {
20
 public class EnumDefinition extends HighLevelDefinition {
21
+	public TypeID asType;
20
 	public List<EnumConstantMember> enumConstants = new ArrayList<>();
22
 	public List<EnumConstantMember> enumConstants = new ArrayList<>();
21
 	
23
 	
22
 	public EnumDefinition(CodePosition position, Module module, ZSPackage pkg, String name, int modifiers, HighLevelDefinition outerDefinition) {
24
 	public EnumDefinition(CodePosition position, Module module, ZSPackage pkg, String name, int modifiers, HighLevelDefinition outerDefinition) {

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

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.Module;
10
 import org.openzen.zenscript.codemodel.Module;
11
-import org.openzen.zenscript.codemodel.type.ITypeID;
11
+import org.openzen.zenscript.codemodel.type.StoredType;
12
 
12
 
13
 /**
13
 /**
14
  *
14
  *
15
  * @author Hoofdgebruiker
15
  * @author Hoofdgebruiker
16
  */
16
  */
17
 public class ExpansionDefinition extends HighLevelDefinition {
17
 public class ExpansionDefinition extends HighLevelDefinition {
18
-	public ITypeID target;
18
+	public StoredType target;
19
 	
19
 	
20
 	public ExpansionDefinition(CodePosition position, Module module, ZSPackage pkg, int modifiers, HighLevelDefinition outerDefinition) {
20
 	public ExpansionDefinition(CodePosition position, Module module, ZSPackage pkg, int modifiers, HighLevelDefinition outerDefinition) {
21
 		super(position, module, pkg, null, modifiers, outerDefinition);
21
 		super(position, module, pkg, null, modifiers, outerDefinition);

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

15
 import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
15
 import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
16
 import org.openzen.zenscript.codemodel.statement.Statement;
16
 import org.openzen.zenscript.codemodel.statement.Statement;
17
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
17
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
18
-import org.openzen.zenscript.codemodel.type.member.DefinitionMemberGroup;
18
+import org.openzen.zenscript.codemodel.type.member.TypeMemberGroup;
19
 import org.openzen.zenscript.codemodel.type.member.TypeMemberPriority;
19
 import org.openzen.zenscript.codemodel.type.member.TypeMemberPriority;
20
+import org.openzen.zenscript.codemodel.type.storage.StaticStorageTag;
20
 
21
 
21
 /**
22
 /**
22
  *
23
  *
24
  */
25
  */
25
 public class FunctionDefinition extends HighLevelDefinition {
26
 public class FunctionDefinition extends HighLevelDefinition {
26
 	public FunctionHeader header;
27
 	public FunctionHeader header;
27
-	public Statement statement;
28
 	public CallerMember caller;
28
 	public CallerMember caller;
29
-	public final DefinitionMemberGroup callerGroup;
29
+	public final TypeMemberGroup callerGroup;
30
 	
30
 	
31
 	public FunctionDefinition(CodePosition position, Module module, ZSPackage pkg, String name, int modifiers, HighLevelDefinition outerDefinition) {
31
 	public FunctionDefinition(CodePosition position, Module module, ZSPackage pkg, String name, int modifiers, HighLevelDefinition outerDefinition) {
32
 		super(position, module, pkg, name, modifiers, outerDefinition);
32
 		super(position, module, pkg, name, modifiers, outerDefinition);
33
-		callerGroup = new DefinitionMemberGroup(true, name);
33
+		callerGroup = new TypeMemberGroup(true, name);
34
 	}
34
 	}
35
 	
35
 	
36
 	public FunctionDefinition(CodePosition position, Module module, ZSPackage pkg, String name, int modifiers, FunctionHeader header, GlobalTypeRegistry registry) {
36
 	public FunctionDefinition(CodePosition position, Module module, ZSPackage pkg, String name, int modifiers, FunctionHeader header, GlobalTypeRegistry registry) {
40
 	
40
 	
41
 	public void setHeader(GlobalTypeRegistry registry, FunctionHeader header) {
41
 	public void setHeader(GlobalTypeRegistry registry, FunctionHeader header) {
42
 		this.header = header;
42
 		this.header = header;
43
-		addMember(caller = new CallerMember(position, this, modifiers | Modifiers.STATIC, header, null));
44
-		callerGroup.addMethod(new FunctionalMemberRef(caller, registry.getFunction(header), GenericMapper.EMPTY), TypeMemberPriority.SPECIFIED);
43
+		addMember(caller = new CallerMember(position, this, Modifiers.PUBLIC | Modifiers.STATIC, header, null));
44
+		callerGroup.addMethod(new FunctionalMemberRef(caller, registry.getFunction(header).stored(StaticStorageTag.INSTANCE), GenericMapper.EMPTY), TypeMemberPriority.SPECIFIED);
45
 	}
45
 	}
46
 	
46
 	
47
 	public void setCode(Statement statement) {
47
 	public void setCode(Statement statement) {
48
-		this.statement = statement;
49
 		caller.setBody(statement);
48
 		caller.setBody(statement);
50
 	}
49
 	}
51
 
50
 

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

10
 import org.openzen.zencode.shared.CodePosition;
10
 import org.openzen.zencode.shared.CodePosition;
11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
 import org.openzen.zenscript.codemodel.Module;
12
 import org.openzen.zenscript.codemodel.Module;
13
-import org.openzen.zenscript.codemodel.type.ITypeID;
13
+import org.openzen.zenscript.codemodel.type.TypeID;
14
 
14
 
15
 /**
15
 /**
16
  *
16
  *
17
  * @author Hoofdgebruiker
17
  * @author Hoofdgebruiker
18
  */
18
  */
19
 public class InterfaceDefinition extends HighLevelDefinition {
19
 public class InterfaceDefinition extends HighLevelDefinition {
20
-	public final List<ITypeID> baseInterfaces = new ArrayList<>();
20
+	public final List<TypeID> baseInterfaces = new ArrayList<>();
21
 	
21
 	
22
 	public InterfaceDefinition(CodePosition position, Module module, ZSPackage pkg, String name, int modifiers, HighLevelDefinition outerDefinition) {
22
 	public InterfaceDefinition(CodePosition position, Module module, ZSPackage pkg, String name, int modifiers, HighLevelDefinition outerDefinition) {
23
 		super(position, module, pkg, name, modifiers, outerDefinition);
23
 		super(position, module, pkg, name, modifiers, outerDefinition);
24
 	}
24
 	}
25
 	
25
 	
26
-	public void addBaseInterface(ITypeID baseInterface) {
26
+	public void addBaseInterface(TypeID baseInterface) {
27
 		baseInterfaces.add(baseInterface);
27
 		baseInterfaces.add(baseInterface);
28
 	}
28
 	}
29
 	
29
 	
30
 	@Override
30
 	@Override
31
 	public boolean isDestructible() {
31
 	public boolean isDestructible() {
32
-		for (ITypeID baseInterface : baseInterfaces)
32
+		for (TypeID baseInterface : baseInterfaces)
33
 			if (baseInterface.isDestructible())
33
 			if (baseInterface.isDestructible())
34
 				return true;
34
 				return true;
35
 		
35
 		

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

13
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
13
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
14
 import org.openzen.zenscript.codemodel.Module;
14
 import org.openzen.zenscript.codemodel.Module;
15
 import org.openzen.zenscript.codemodel.member.ref.VariantOptionRef;
15
 import org.openzen.zenscript.codemodel.member.ref.VariantOptionRef;
16
-import org.openzen.zenscript.codemodel.type.ITypeID;
16
+import org.openzen.zenscript.codemodel.type.StoredType;
17
 
17
 
18
 /**
18
 /**
19
  *
19
  *
45
 	}
45
 	}
46
 	
46
 	
47
 	public static class Option extends Taggable {
47
 	public static class Option extends Taggable {
48
+		public final CodePosition position;
48
 		public final VariantDefinition variant;
49
 		public final VariantDefinition variant;
49
 		public final String name;
50
 		public final String name;
50
 		public final int ordinal;
51
 		public final int ordinal;
51
-		public final ITypeID[] types;
52
+		public final StoredType[] types;
52
 		
53
 		
53
-		public Option(VariantDefinition variant, String name, int ordinal, ITypeID[] types) {
54
+		public Option(CodePosition position, VariantDefinition variant, String name, int ordinal, StoredType[] types) {
55
+			this.position = position;
54
 			this.variant = variant;
56
 			this.variant = variant;
55
 			this.name = name;
57
 			this.name = name;
56
 			this.ordinal = ordinal;
58
 			this.ordinal = ordinal;
57
 			this.types = types;
59
 			this.types = types;
58
 		}
60
 		}
59
 		
61
 		
60
-		public VariantOptionRef instance(ITypeID variantType, GenericMapper mapper) {
62
+		public VariantOptionRef instance(StoredType variantType, GenericMapper mapper) {
61
 			return new VariantOptionRef(this, variantType, mapper.map(types));
63
 			return new VariantOptionRef(this, variantType, mapper.map(types));
62
 		}
64
 		}
63
 	}
65
 	}

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

17
 import org.openzen.zenscript.codemodel.partial.PartialPackageExpression;
17
 import org.openzen.zenscript.codemodel.partial.PartialPackageExpression;
18
 import org.openzen.zenscript.codemodel.partial.PartialTypeExpression;
18
 import org.openzen.zenscript.codemodel.partial.PartialTypeExpression;
19
 import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
19
 import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
20
-import org.openzen.zenscript.codemodel.type.GenericName;
20
+import org.openzen.zenscript.codemodel.GenericName;
21
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
21
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
22
-import org.openzen.zenscript.codemodel.type.ITypeID;
22
+import org.openzen.zenscript.codemodel.type.TypeID;
23
 
23
 
24
 /**
24
 /**
25
  *
25
  *
50
 		subPackages.put(name, subPackage);
50
 		subPackages.put(name, subPackage);
51
 	}
51
 	}
52
 	
52
 	
53
-	public IPartialExpression getMember(CodePosition position, GlobalTypeRegistry registry, GenericName name) {
53
+	public IPartialExpression getMember(CodePosition position, GlobalTypeRegistry registry, GenericName name) throws CompileException {
54
 		if (subPackages.containsKey(name.name) && name.hasNoArguments())
54
 		if (subPackages.containsKey(name.name) && name.hasNoArguments())
55
 			return new PartialPackageExpression(position, subPackages.get(name.name));
55
 			return new PartialPackageExpression(position, subPackages.get(name.name));
56
 		
56
 		
85
 		return null;
85
 		return null;
86
 	}
86
 	}
87
 	
87
 	
88
-	public ITypeID getType(CodePosition position, TypeResolutionContext context, List<GenericName> nameParts) {
88
+	public TypeID getType(CodePosition position, TypeResolutionContext context, List<GenericName> nameParts) {
89
 		return getType(position, context, nameParts, 0);
89
 		return getType(position, context, nameParts, 0);
90
 	}
90
 	}
91
 	
91
 	
92
-	public ITypeID getType(CodePosition position, TypeResolutionContext context, GenericName name) {
92
+	public TypeID getType(CodePosition position, TypeResolutionContext context, GenericName name) {
93
 		if (types.containsKey(name.name)) {
93
 		if (types.containsKey(name.name)) {
94
 			return context.getTypeRegistry().getForDefinition(types.get(name.name), name.arguments);
94
 			return context.getTypeRegistry().getForDefinition(types.get(name.name), name.arguments);
95
 		}
95
 		}
97
 		return null;
97
 		return null;
98
 	}
98
 	}
99
 	
99
 	
100
-	private ITypeID getType(CodePosition position, TypeResolutionContext context, List<GenericName> nameParts, int depth) {
100
+	private TypeID getType(CodePosition position, TypeResolutionContext context, List<GenericName> nameParts, int depth) {
101
 		if (depth >= nameParts.size())
101
 		if (depth >= nameParts.size())
102
 			return null;
102
 			return null;
103
 		
103
 		

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

18
 	public final Expression right;
18
 	public final Expression right;
19
 	
19
 	
20
 	public AndAndExpression(CodePosition position, Expression left, Expression right) {
20
 	public AndAndExpression(CodePosition position, Expression left, Expression right) {
21
-		super(position, BasicTypeID.BOOL, binaryThrow(position, left.thrownType, right.thrownType));
21
+		super(position, BasicTypeID.BOOL.stored, binaryThrow(position, left.thrownType, right.thrownType));
22
 		
22
 		
23
 		this.left = left;
23
 		this.left = left;
24
 		this.right = right;
24
 		this.right = right;

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

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.scope.TypeScope;
10
 import org.openzen.zenscript.codemodel.type.ArrayTypeID;
10
 import org.openzen.zenscript.codemodel.type.ArrayTypeID;
11
+import org.openzen.zenscript.codemodel.type.StoredType;
11
 
12
 
12
 /**
13
 /**
13
  *
14
  *
17
 	public final Expression[] expressions;
18
 	public final Expression[] expressions;
18
 	public final ArrayTypeID arrayType;
19
 	public final ArrayTypeID arrayType;
19
 	
20
 	
20
-	public ArrayExpression(CodePosition position, Expression[] expressions, ArrayTypeID type) {
21
+	public ArrayExpression(CodePosition position, Expression[] expressions, StoredType type) {
21
 		super(position, type, multiThrow(position, expressions));
22
 		super(position, type, multiThrow(position, expressions));
22
 		
23
 		
23
 		this.expressions = expressions;
24
 		this.expressions = expressions;
24
-		this.arrayType = type;
25
+		this.arrayType = (ArrayTypeID)type.type;
25
 	}
26
 	}
26
 
27
 
27
 	@Override
28
 	@Override
37
 	@Override
38
 	@Override
38
 	public Expression transform(ExpressionTransformer transformer) {
39
 	public Expression transform(ExpressionTransformer transformer) {
39
 		Expression[] tExpressions = Expression.transform(expressions, transformer);
40
 		Expression[] tExpressions = Expression.transform(expressions, transformer);
40
-		return tExpressions == expressions ? this : new ArrayExpression(position, tExpressions, (ArrayTypeID)type);
41
+		return tExpressions == expressions ? this : new ArrayExpression(position, tExpressions, type);
41
 	}
42
 	}
42
 
43
 
43
 	@Override
44
 	@Override
45
 		Expression[] normalized = new Expression[expressions.length];
46
 		Expression[] normalized = new Expression[expressions.length];
46
 		for (int i = 0; i < normalized.length; i++)
47
 		for (int i = 0; i < normalized.length; i++)
47
 			normalized[i] = expressions[i].normalize(scope);
48
 			normalized[i] = expressions[i].normalize(scope);
48
-		return new ArrayExpression(position, normalized, arrayType.getNormalized());
49
+		return new ArrayExpression(position, normalized, type.getNormalized());
49
 	}
50
 	}
50
 }
51
 }

+ 11
- 11
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CallArguments.java View File

7
 
7
 
8
 import java.util.Arrays;
8
 import java.util.Arrays;
9
 import org.openzen.zencode.shared.CodePosition;
9
 import org.openzen.zencode.shared.CodePosition;
10
-import org.openzen.zencode.shared.CompileException;
11
 import org.openzen.zencode.shared.CompileExceptionCode;
10
 import org.openzen.zencode.shared.CompileExceptionCode;
12
 import org.openzen.zenscript.codemodel.FunctionHeader;
11
 import org.openzen.zenscript.codemodel.FunctionHeader;
13
 import org.openzen.zenscript.codemodel.scope.TypeScope;
12
 import org.openzen.zenscript.codemodel.scope.TypeScope;
14
-import org.openzen.zenscript.codemodel.type.ITypeID;
13
+import org.openzen.zenscript.codemodel.type.StoredType;
15
 
14
 
16
 /**
15
 /**
17
  *
16
  *
20
 public class CallArguments {
19
 public class CallArguments {
21
 	public static final CallArguments EMPTY = new CallArguments(new Expression[0]);
20
 	public static final CallArguments EMPTY = new CallArguments(new Expression[0]);
22
 	
21
 	
23
-	public final ITypeID[] typeArguments;
22
+	public final StoredType[] typeArguments;
24
 	public final Expression[] arguments;
23
 	public final Expression[] arguments;
25
 	
24
 	
26
 	public CallArguments(Expression... arguments) {
25
 	public CallArguments(Expression... arguments) {
27
-		this.typeArguments = ITypeID.NONE;
26
+		this.typeArguments = StoredType.NONE;
28
 		this.arguments = arguments;
27
 		this.arguments = arguments;
29
 	}
28
 	}
30
 	
29
 	
31
-	public CallArguments(ITypeID[] typeArguments, Expression[] arguments) {
30
+	public CallArguments(StoredType[] typeArguments, Expression[] arguments) {
32
 		if (typeArguments == null)
31
 		if (typeArguments == null)
33
-			typeArguments = ITypeID.NONE;
32
+			typeArguments = StoredType.NONE;
34
 		if (arguments == null)
33
 		if (arguments == null)
35
 			throw new IllegalArgumentException("Arguments cannot be null!");
34
 			throw new IllegalArgumentException("Arguments cannot be null!");
36
 		
35
 		
38
 		this.arguments = arguments;
37
 		this.arguments = arguments;
39
 	}
38
 	}
40
 	
39
 	
41
-	public CallArguments(ITypeID... dummy) {
42
-		this.typeArguments = ITypeID.NONE;
40
+	public CallArguments(StoredType... dummy) {
41
+		this.typeArguments = StoredType.NONE;
43
 		this.arguments = new Expression[dummy.length];
42
 		this.arguments = new Expression[dummy.length];
44
 		for (int i = 0; i < dummy.length; i++)
43
 		for (int i = 0; i < dummy.length; i++)
45
 			arguments[i] = new DummyExpression(dummy[i]);
44
 			arguments[i] = new DummyExpression(dummy[i]);
58
 		CallArguments result = this;
57
 		CallArguments result = this;
59
 		
58
 		
60
 		for (int i = 0; i < arguments.length; i++) {
59
 		for (int i = 0; i < arguments.length; i++) {
61
-			arguments[i] = arguments[i].castImplicit(position, scope, header.parameters[i].type);
60
+			arguments[i] = arguments[i].normalize(scope).castImplicit(position, scope, header.parameters[i].type);
62
 		}
61
 		}
63
 		
62
 		
64
 		if (arguments.length < header.parameters.length) {
63
 		if (arguments.length < header.parameters.length) {
65
 			Expression[] newArguments = Arrays.copyOf(arguments, header.parameters.length);
64
 			Expression[] newArguments = Arrays.copyOf(arguments, header.parameters.length);
66
 			for (int i = arguments.length; i < header.parameters.length; i++) {
65
 			for (int i = arguments.length; i < header.parameters.length; i++) {
67
 				if (header.parameters[i].defaultValue == null)
66
 				if (header.parameters[i].defaultValue == null)
68
-					throw new CompileException(position, CompileExceptionCode.MISSING_PARAMETER, "Parameter missing and no default value specified");
69
-				newArguments[i] = header.parameters[i].defaultValue;
67
+					newArguments[i] = new InvalidExpression(position, header.parameters[i].type, CompileExceptionCode.MISSING_PARAMETER, "Parameter missing and no default value specified");
68
+				else
69
+					newArguments[i] = header.parameters[i].defaultValue;
70
 			}
70
 			}
71
 			result = new CallArguments(typeArguments, newArguments);
71
 			result = new CallArguments(typeArguments, newArguments);
72
 		}
72
 		}

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

9
 import org.openzen.zenscript.codemodel.FunctionHeader;
9
 import org.openzen.zenscript.codemodel.FunctionHeader;
10
 import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
10
 import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
11
 import org.openzen.zenscript.codemodel.scope.TypeScope;
11
 import org.openzen.zenscript.codemodel.scope.TypeScope;
12
-import org.openzen.zenscript.codemodel.type.ITypeID;
12
+import org.openzen.zenscript.codemodel.type.TypeID;
13
 
13
 
14
 /**
14
 /**
15
  *
15
  *
17
  */
17
  */
18
 public class CallStaticExpression extends Expression {
18
 public class CallStaticExpression extends Expression {
19
 	public final FunctionalMemberRef member;
19
 	public final FunctionalMemberRef member;
20
-	public final ITypeID target;
20
+	public final TypeID target;
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) {
24
+	public CallStaticExpression(CodePosition position, TypeID target, FunctionalMemberRef member, FunctionHeader instancedHeader, CallArguments arguments) {
25
 		super(position, instancedHeader.getReturnType(), multiThrow(position, arguments.arguments));
25
 		super(position, instancedHeader.getReturnType(), multiThrow(position, arguments.arguments));
26
 		
26
 		
27
 		this.member = member;
27
 		this.member = member;

+ 2
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CapturedExpression.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.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.scope.TypeScope;
10
-import org.openzen.zenscript.codemodel.type.ITypeID;
10
+import org.openzen.zenscript.codemodel.type.StoredType;
11
 
11
 
12
 /**
12
 /**
13
  *
13
  *
16
 public abstract class CapturedExpression extends Expression {
16
 public abstract class CapturedExpression extends Expression {
17
 	public final LambdaClosure closure;
17
 	public final LambdaClosure closure;
18
 	
18
 	
19
-	public CapturedExpression(CodePosition position, ITypeID type, LambdaClosure closure) {
19
+	public CapturedExpression(CodePosition position, StoredType type, LambdaClosure closure) {
20
 		super(position, type, null);
20
 		super(position, type, null);
21
 		
21
 		
22
 		this.closure = closure;
22
 		this.closure = closure;

+ 2
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CapturedThisExpression.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.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.scope.TypeScope;
10
-import org.openzen.zenscript.codemodel.type.ITypeID;
10
+import org.openzen.zenscript.codemodel.type.StoredType;
11
 
11
 
12
 /**
12
 /**
13
  *
13
  *
14
  * @author Hoofdgebruiker
14
  * @author Hoofdgebruiker
15
  */
15
  */
16
 public class CapturedThisExpression extends CapturedExpression {
16
 public class CapturedThisExpression extends CapturedExpression {
17
-	public CapturedThisExpression(CodePosition position, ITypeID type, LambdaClosure closure) {
17
+	public CapturedThisExpression(CodePosition position, StoredType type, LambdaClosure closure) {
18
 		super(position, type, closure);
18
 		super(position, type, closure);
19
 	}
19
 	}
20
 
20
 

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

24
 	public final CompareType comparison;
24
 	public final CompareType comparison;
25
 	
25
 	
26
 	public CompareExpression(CodePosition position, Expression left, Expression right, FunctionalMemberRef operator, CompareType comparison) {
26
 	public CompareExpression(CodePosition position, Expression left, Expression right, FunctionalMemberRef operator, CompareType comparison) {
27
-		super(position, BasicTypeID.BOOL, binaryThrow(position, left.thrownType, right.thrownType));
27
+		super(position, BasicTypeID.BOOL.stored, binaryThrow(position, left.thrownType, right.thrownType));
28
 		
28
 		
29
 		this.left = left;
29
 		this.left = left;
30
 		this.right = right;
30
 		this.right = right;

+ 4
- 4
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConditionalExpression.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.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.scope.TypeScope;
10
-import org.openzen.zenscript.codemodel.type.ITypeID;
10
+import org.openzen.zenscript.codemodel.type.StoredType;
11
 
11
 
12
 /**
12
 /**
13
  *
13
  *
23
 			Expression condition,
23
 			Expression condition,
24
 			Expression ifThen,
24
 			Expression ifThen,
25
 			Expression ifElse,
25
 			Expression ifElse,
26
-			ITypeID type) {
27
-		super(position, ifThen.type, binaryThrow(position, condition.thrownType, binaryThrow(position, ifThen.thrownType, ifElse.thrownType)));
26
+			StoredType type) {
27
+		super(position, type, binaryThrow(position, condition.thrownType, binaryThrow(position, ifThen.thrownType, ifElse.thrownType)));
28
 		
28
 		
29
-		if (ifThen.type != ifElse.type)
29
+		if (!ifThen.type.equals(ifElse.type))
30
 			throw new AssertionError();
30
 			throw new AssertionError();
31
 		
31
 		
32
 		this.condition = condition;
32
 		this.condition = condition;

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

17
 	public final boolean value;
17
 	public final boolean value;
18
 	
18
 	
19
 	public ConstantBoolExpression(CodePosition position, boolean value) {
19
 	public ConstantBoolExpression(CodePosition position, boolean value) {
20
-		super(position, BasicTypeID.BOOL, null);
20
+		super(position, BasicTypeID.BOOL.stored, null);
21
 		
21
 		
22
 		this.value = value;
22
 		this.value = value;
23
 	}
23
 	}

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

17
 	public final int value;
17
 	public final int value;
18
 	
18
 	
19
 	public ConstantByteExpression(CodePosition position, int value) {
19
 	public ConstantByteExpression(CodePosition position, int value) {
20
-		super(position, BasicTypeID.BYTE, null);
20
+		super(position, BasicTypeID.BYTE.stored, null);
21
 		
21
 		
22
 		this.value = value;
22
 		this.value = value;
23
 	}
23
 	}

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

17
 	public final char value;
17
 	public final char value;
18
 	
18
 	
19
 	public ConstantCharExpression(CodePosition position, char value) {
19
 	public ConstantCharExpression(CodePosition position, char value) {
20
-		super(position, BasicTypeID.CHAR, null);
20
+		super(position, BasicTypeID.CHAR.stored, null);
21
 		
21
 		
22
 		this.value = value;
22
 		this.value = value;
23
 	}
23
 	}

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

17
 	public final double value;
17
 	public final double value;
18
 	
18
 	
19
 	public ConstantDoubleExpression(CodePosition position, double value) {
19
 	public ConstantDoubleExpression(CodePosition position, double value) {
20
-		super(position, BasicTypeID.DOUBLE, null);
20
+		super(position, BasicTypeID.DOUBLE.stored, null);
21
 		
21
 		
22
 		this.value = value;
22
 		this.value = value;
23
 	}
23
 	}

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

17
 	public final float value;
17
 	public final float value;
18
 	
18
 	
19
 	public ConstantFloatExpression(CodePosition position, float value) {
19
 	public ConstantFloatExpression(CodePosition position, float value) {
20
-		super(position, BasicTypeID.FLOAT, null);
20
+		super(position, BasicTypeID.FLOAT.stored, null);
21
 		
21
 		
22
 		this.value = value;
22
 		this.value = value;
23
 	}
23
 	}

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

17
 	public final int value;
17
 	public final int value;
18
 	
18
 	
19
 	public ConstantIntExpression(CodePosition position, int value) {
19
 	public ConstantIntExpression(CodePosition position, int value) {
20
-		super(position, BasicTypeID.INT, null);
20
+		super(position, BasicTypeID.INT.stored, null);
21
 		
21
 		
22
 		this.value = value;
22
 		this.value = value;
23
 	}
23
 	}

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

18
 	public final long value;
18
 	public final long value;
19
 	
19
 	
20
 	public ConstantLongExpression(CodePosition position, long value) {
20
 	public ConstantLongExpression(CodePosition position, long value) {
21
-		super(position, BasicTypeID.LONG, null);
21
+		super(position, BasicTypeID.LONG.stored, null);
22
 		
22
 		
23
 		this.value = value;
23
 		this.value = value;
24
 	}
24
 	}

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

17
 	public final byte value;
17
 	public final byte value;
18
 	
18
 	
19
 	public ConstantSByteExpression(CodePosition position, byte value) {
19
 	public ConstantSByteExpression(CodePosition position, byte value) {
20
-		super(position, BasicTypeID.SBYTE, null);
20
+		super(position, BasicTypeID.SBYTE.stored, null);
21
 		
21
 		
22
 		this.value = value;
22
 		this.value = value;
23
 	}
23
 	}

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

17
 	public final short value;
17
 	public final short value;
18
 	
18
 	
19
 	public ConstantShortExpression(CodePosition position, short value) {
19
 	public ConstantShortExpression(CodePosition position, short value) {
20
-		super(position, BasicTypeID.SHORT, null);
20
+		super(position, BasicTypeID.SHORT.stored, null);
21
 		
21
 		
22
 		this.value = value;
22
 		this.value = value;
23
 	}
23
 	}

+ 2
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantStringExpression.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.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.scope.TypeScope;
10
-import org.openzen.zenscript.codemodel.type.BasicTypeID;
10
+import org.openzen.zenscript.codemodel.type.StringTypeID;
11
 
11
 
12
 /**
12
 /**
13
  *
13
  *
17
 	public final String value;
17
 	public final String value;
18
 	
18
 	
19
 	public ConstantStringExpression(CodePosition position, String value) {
19
 	public ConstantStringExpression(CodePosition position, String value) {
20
-		super(position, BasicTypeID.STRING, null);
20
+		super(position, StringTypeID.STATIC, null);
21
 		
21
 		
22
 		this.value = value;
22
 		this.value = value;
23
 	}
23
 	}

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

17
 	public final int value;
17
 	public final int value;
18
 	
18
 	
19
 	public ConstantUIntExpression(CodePosition position, int value) {
19
 	public ConstantUIntExpression(CodePosition position, int value) {
20
-		super(position, BasicTypeID.UINT, null);
20
+		super(position, BasicTypeID.UINT.stored, null);
21
 		
21
 		
22
 		this.value = value;
22
 		this.value = value;
23
 	}
23
 	}

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

17
 	public final long value;
17
 	public final long value;
18
 	
18
 	
19
 	public ConstantULongExpression(CodePosition position, long value) {
19
 	public ConstantULongExpression(CodePosition position, long value) {
20
-		super(position, BasicTypeID.ULONG, null);
20
+		super(position, BasicTypeID.ULONG.stored, null);
21
 		
21
 		
22
 		this.value = value;
22
 		this.value = value;
23
 	}
23
 	}

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

17
 	public final int value;
17
 	public final int value;
18
 	
18
 	
19
 	public ConstantUShortExpression(CodePosition position, int value) {
19
 	public ConstantUShortExpression(CodePosition position, int value) {
20
-		super(position, BasicTypeID.USHORT, null);
20
+		super(position, BasicTypeID.USHORT.stored, null);
21
 		
21
 		
22
 		this.value = value;
22
 		this.value = value;
23
 	}
23
 	}

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

17
 	public final long value;
17
 	public final long value;
18
 	
18
 	
19
 	public ConstantUSizeExpression(CodePosition position, long value) {
19
 	public ConstantUSizeExpression(CodePosition position, long value) {
20
-		super(position, BasicTypeID.USIZE, null);
20
+		super(position, BasicTypeID.USIZE.stored, null);
21
 		
21
 		
22
 		this.value = value;
22
 		this.value = value;
23
 	}
23
 	}

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

9
 import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
9
 import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
10
 import org.openzen.zenscript.codemodel.scope.TypeScope;
10
 import org.openzen.zenscript.codemodel.scope.TypeScope;
11
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
11
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
12
-import org.openzen.zenscript.codemodel.type.ITypeID;
12
+import org.openzen.zenscript.codemodel.type.StoredType;
13
 
13
 
14
 /**
14
 /**
15
  *
15
  *
16
  * @author Hoofdgebruiker
16
  * @author Hoofdgebruiker
17
  */
17
  */
18
 public class ConstructorSuperCallExpression extends Expression {
18
 public class ConstructorSuperCallExpression extends Expression {
19
-	public final ITypeID objectType;
19
+	public final StoredType objectType;
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) {
24
-		super(position, BasicTypeID.VOID, binaryThrow(position, constructor.getHeader().thrownType, multiThrow(position, arguments.arguments)));
23
+	public ConstructorSuperCallExpression(CodePosition position, StoredType type, FunctionalMemberRef constructor, CallArguments arguments) {
24
+		super(position, BasicTypeID.VOID.stored, 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;

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

9
 import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
9
 import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
10
 import org.openzen.zenscript.codemodel.scope.TypeScope;
10
 import org.openzen.zenscript.codemodel.scope.TypeScope;
11
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
11
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
12
-import org.openzen.zenscript.codemodel.type.ITypeID;
12
+import org.openzen.zenscript.codemodel.type.StoredType;
13
 
13
 
14
 /**
14
 /**
15
  *
15
  *
16
  * @author Hoofdgebruiker
16
  * @author Hoofdgebruiker
17
  */
17
  */
18
 public class ConstructorThisCallExpression extends Expression {
18
 public class ConstructorThisCallExpression extends Expression {
19
-	public final ITypeID objectType;
19
+	public final StoredType objectType;
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) {
24
-		super(position, BasicTypeID.VOID, binaryThrow(position, constructor.getHeader().thrownType, multiThrow(position, arguments.arguments)));
23
+	public ConstructorThisCallExpression(CodePosition position, StoredType type, FunctionalMemberRef constructor, CallArguments arguments) {
24
+		super(position, BasicTypeID.VOID.stored, binaryThrow(position, constructor.getHeader().thrownType, multiThrow(position, arguments.arguments)));
25
 		
25
 		
26
-		if (type instanceof BasicTypeID)
26
+		if (type.type instanceof BasicTypeID)
27
 			throw new IllegalArgumentException("Type cannot be basic type");
27
 			throw new IllegalArgumentException("Type cannot be basic type");
28
 		
28
 		
29
 		this.objectType = type;
29
 		this.objectType = type;

+ 2
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/DummyExpression.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.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.scope.TypeScope;
10
-import org.openzen.zenscript.codemodel.type.ITypeID;
10
+import org.openzen.zenscript.codemodel.type.StoredType;
11
 
11
 
12
 /**
12
 /**
13
  *
13
  *
14
  * @author Hoofdgebruiker
14
  * @author Hoofdgebruiker
15
  */
15
  */
16
 public class DummyExpression extends Expression {
16
 public class DummyExpression extends Expression {
17
-	public DummyExpression(ITypeID type) {
17
+	public DummyExpression(StoredType type) {
18
 		super(CodePosition.BUILTIN, type, null);
18
 		super(CodePosition.BUILTIN, type, null);
19
 	}
19
 	}
20
 
20
 

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

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.scope.TypeScope;
12
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
12
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
13
-import org.openzen.zenscript.codemodel.type.ITypeID;
13
+import org.openzen.zenscript.codemodel.type.TypeID;
14
+import org.openzen.zenscript.codemodel.type.storage.ValueStorageTag;
14
 
15
 
15
 /**
16
 /**
16
  *
17
  *
19
 public class EnumConstantExpression extends Expression {
20
 public class EnumConstantExpression extends Expression {
20
 	public final EnumConstantMember value;
21
 	public final EnumConstantMember value;
21
 	
22
 	
22
-	public EnumConstantExpression(CodePosition position, ITypeID type, EnumConstantMember value) {
23
-		super(position, type, null);
23
+	public EnumConstantExpression(CodePosition position, TypeID type, EnumConstantMember value) {
24
+		super(position, type.stored(), null);
24
 		
25
 		
25
 		this.value = value;
26
 		this.value = value;
26
 	}
27
 	}
27
 	
28
 	
28
 	public EnumConstantExpression(CodePosition position, GlobalTypeRegistry registry, EnumDefinition type, EnumConstantMember value) {
29
 	public EnumConstantExpression(CodePosition position, GlobalTypeRegistry registry, EnumDefinition type, EnumConstantMember value) {
29
-		super(position, registry.getForDefinition(type), null);
30
+		super(position, registry.getForDefinition(type).stored(), null);
30
 		
31
 		
31
 		this.value = value;
32
 		this.value = value;
32
 	}
33
 	}

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

7
 
7
 
8
 import java.util.Collections;
8
 import java.util.Collections;
9
 import java.util.List;
9
 import java.util.List;
10
+import java.util.Objects;
10
 import java.util.function.Consumer;
11
 import java.util.function.Consumer;
11
 import java.util.stream.Collectors;
12
 import java.util.stream.Collectors;
12
 import org.openzen.zencode.shared.CodePosition;
13
 import org.openzen.zencode.shared.CodePosition;
16
 import org.openzen.zenscript.codemodel.OperatorType;
17
 import org.openzen.zenscript.codemodel.OperatorType;
17
 import org.openzen.zenscript.codemodel.member.EnumConstantMember;
18
 import org.openzen.zenscript.codemodel.member.EnumConstantMember;
18
 import org.openzen.zenscript.codemodel.partial.IPartialExpression;
19
 import org.openzen.zenscript.codemodel.partial.IPartialExpression;
19
-import org.openzen.zenscript.codemodel.type.GenericName;
20
-import org.openzen.zenscript.codemodel.type.ITypeID;
20
+import org.openzen.zenscript.codemodel.GenericName;
21
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
21
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
22
 import org.openzen.zenscript.codemodel.scope.TypeScope;
22
 import org.openzen.zenscript.codemodel.scope.TypeScope;
23
 import org.openzen.zenscript.codemodel.statement.Statement;
23
 import org.openzen.zenscript.codemodel.statement.Statement;
24
 import org.openzen.zenscript.codemodel.statement.StatementTransformer;
24
 import org.openzen.zenscript.codemodel.statement.StatementTransformer;
25
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
25
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
26
-import org.openzen.zenscript.codemodel.type.FunctionTypeID;
26
+import org.openzen.zenscript.codemodel.type.InvalidTypeID;
27
+import org.openzen.zenscript.codemodel.type.StoredType;
28
+import org.openzen.zenscript.codemodel.type.storage.UniqueStorageTag;
27
 
29
 
28
 /**
30
 /**
29
  *
31
  *
33
 	public static final Expression[] NONE = new Expression[0];
35
 	public static final Expression[] NONE = new Expression[0];
34
 	
36
 	
35
 	public final CodePosition position;
37
 	public final CodePosition position;
36
-	public final ITypeID type;
37
-	public final ITypeID thrownType;
38
+	public final StoredType type;
39
+	public final StoredType thrownType;
38
 	
40
 	
39
-	public Expression(CodePosition position, ITypeID type, ITypeID thrownType) {
41
+	public Expression(CodePosition position, StoredType type, StoredType thrownType) {
40
 		if (type == null)
42
 		if (type == null)
41
 			throw new NullPointerException();
43
 			throw new NullPointerException();
42
-		if (type == BasicTypeID.UNDETERMINED)
44
+		if (type.type == BasicTypeID.UNDETERMINED)
43
 			throw new IllegalArgumentException(position + ": Cannot use undetermined type as expression type");
45
 			throw new IllegalArgumentException(position + ": Cannot use undetermined type as expression type");
44
 		
46
 		
45
 		this.position = position;
47
 		this.position = position;
61
 				if (body == function.body)
63
 				if (body == function.body)
62
 					return function;
64
 					return function;
63
 				
65
 				
64
-				return new FunctionExpression(function.position, (FunctionTypeID)function.type, function.closure, function.header, body);
66
+				return new FunctionExpression(function.position, function.type, function.closure, function.header, body);
65
 			} else {
67
 			} else {
66
 				return expression;
68
 				return expression;
67
 			}
69
 			}
71
 	public abstract Expression normalize(TypeScope scope);
73
 	public abstract Expression normalize(TypeScope scope);
72
 	
74
 	
73
 	@Override
75
 	@Override
74
-	public List<ITypeID> getAssignHints() {
76
+	public List<StoredType> getAssignHints() {
75
 		return Collections.singletonList(type);
77
 		return Collections.singletonList(type);
76
 	}
78
 	}
77
 	
79
 	
80
 		return this;
82
 		return this;
81
 	}
83
 	}
82
 	
84
 	
83
-	public Expression castExplicit(CodePosition position, TypeScope scope, ITypeID asType, boolean optional) {
85
+	public Expression castExplicit(CodePosition position, TypeScope scope, StoredType asType, boolean optional) {
84
 		return scope.getTypeMembers(type).castExplicit(position, this, asType, optional);
86
 		return scope.getTypeMembers(type).castExplicit(position, this, asType, optional);
85
 	}
87
 	}
86
 	
88
 	
87
-	public Expression castImplicit(CodePosition position, TypeScope scope, ITypeID asType) {
89
+	public Expression castImplicit(CodePosition position, TypeScope scope, StoredType asType) {
88
 		return scope.getTypeMembers(type).castImplicit(position, this, asType, true);
90
 		return scope.getTypeMembers(type).castImplicit(position, this, asType, true);
89
 	}
91
 	}
90
 	
92
 	
99
 	}
101
 	}
100
 	
102
 	
101
 	@Override
103
 	@Override
102
-	public List<ITypeID>[] predictCallTypes(TypeScope scope, List<ITypeID> hints, int arguments) {
104
+	public List<StoredType>[] predictCallTypes(TypeScope scope, List<StoredType> hints, int arguments) {
103
 		return scope.getTypeMembers(type).getOrCreateGroup(OperatorType.CALL).predictCallTypes(scope, hints, arguments);
105
 		return scope.getTypeMembers(type).getOrCreateGroup(OperatorType.CALL).predictCallTypes(scope, hints, arguments);
104
 	}
106
 	}
105
 	
107
 	
106
 	@Override
108
 	@Override
107
-	public List<FunctionHeader> getPossibleFunctionHeaders(TypeScope scope, List<ITypeID> hints, int arguments) {
109
+	public List<FunctionHeader> getPossibleFunctionHeaders(TypeScope scope, List<StoredType> hints, int arguments) {
108
 		return scope.getTypeMembers(type)
110
 		return scope.getTypeMembers(type)
109
 				.getOrCreateGroup(OperatorType.CALL)
111
 				.getOrCreateGroup(OperatorType.CALL)
110
 				.getMethodMembers().stream()
112
 				.getMethodMembers().stream()
114
 	}
116
 	}
115
 	
117
 	
116
 	@Override
118
 	@Override
117
-	public Expression call(CodePosition position, TypeScope scope, List<ITypeID> hints, CallArguments arguments) {
119
+	public Expression call(CodePosition position, TypeScope scope, List<StoredType> hints, CallArguments arguments) throws CompileException {
118
 		return scope.getTypeMembers(type).getOrCreateGroup(OperatorType.CALL).call(position, scope, this, arguments, false);
120
 		return scope.getTypeMembers(type).getOrCreateGroup(OperatorType.CALL).call(position, scope, this, arguments, false);
119
 	}
121
 	}
120
 	
122
 	
121
 	@Override
123
 	@Override
122
-	public IPartialExpression getMember(CodePosition position, TypeScope scope, List<ITypeID> hints, GenericName name) {
124
+	public IPartialExpression getMember(CodePosition position, TypeScope scope, List<StoredType> hints, GenericName name) {
123
 		TypeMembers members = scope.getTypeMembers(type);
125
 		TypeMembers members = scope.getTypeMembers(type);
124
 		IPartialExpression result = members.getMemberExpression(position, scope, this, name, false);
126
 		IPartialExpression result = members.getMemberExpression(position, scope, this, name, false);
125
 		if (result == null)
127
 		if (result == null)
128
 	}
130
 	}
129
 	
131
 	
130
 	@Override
132
 	@Override
131
-	public ITypeID[] getGenericCallTypes() {
133
+	public StoredType[] getTypeArguments() {
132
 		return null;
134
 		return null;
133
 	}
135
 	}
134
 	
136
 	
144
 		throw new UnsupportedOperationException("Cannot evaluate this value to an enum constant!");
146
 		throw new UnsupportedOperationException("Cannot evaluate this value to an enum constant!");
145
 	}
147
 	}
146
 	
148
 	
147
-	public static ITypeID binaryThrow(CodePosition position, ITypeID left, ITypeID right) {
148
-		if (left == right)
149
+	public static StoredType binaryThrow(CodePosition position, StoredType left, StoredType right) {
150
+		if (Objects.equals(left, right))
149
 			return left;
151
 			return left;
150
 		else if (left == null)
152
 		else if (left == null)
151
 			return right;
153
 			return right;
152
 		else if (right == null)
154
 		else if (right == null)
153
 			return left;
155
 			return left;
154
 		else
156
 		else
155
-			throw new CompileException(position, CompileExceptionCode.DIFFERENT_EXCEPTIONS, "two different exceptions in same operation: " + left.toString() + " and " + right.toString());
157
+			return new InvalidTypeID(position, CompileExceptionCode.DIFFERENT_EXCEPTIONS, "two different exceptions in same operation: " + left.toString() + " and " + right.toString()).stored(UniqueStorageTag.INSTANCE);
156
 	}
158
 	}
157
 	
159
 	
158
-	public static ITypeID multiThrow(CodePosition position, Expression[] expressions) {
159
-		ITypeID result = null;
160
+	public static StoredType multiThrow(CodePosition position, Expression[] expressions) {
161
+		StoredType result = null;
160
 		for (Expression expression : expressions)
162
 		for (Expression expression : expressions)
161
 			result = binaryThrow(position, result, expression.thrownType);
163
 			result = binaryThrow(position, result, expression.thrownType);
162
 		return result;
164
 		return result;

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

13
 import org.openzen.zenscript.codemodel.OperatorType;
13
 import org.openzen.zenscript.codemodel.OperatorType;
14
 import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
14
 import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
15
 import org.openzen.zenscript.codemodel.scope.ExpressionScope;
15
 import org.openzen.zenscript.codemodel.scope.ExpressionScope;
16
-import org.openzen.zenscript.codemodel.type.GenericName;
17
-import org.openzen.zenscript.codemodel.type.ITypeID;
18
-import org.openzen.zenscript.codemodel.type.member.DefinitionMemberGroup;
16
+import org.openzen.zenscript.codemodel.GenericName;
17
+import org.openzen.zenscript.codemodel.type.StoredType;
18
+import org.openzen.zenscript.codemodel.type.TypeID;
19
+import org.openzen.zenscript.codemodel.type.member.TypeMemberGroup;
19
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
20
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
21
+import org.openzen.zenscript.codemodel.type.storage.UniqueStorageTag;
20
 import stdlib.Strings;
22
 import stdlib.Strings;
21
 
23
 
22
 /**
24
 /**
32
 		this.scope = scope;
34
 		this.scope = scope;
33
 	}
35
 	}
34
 	
36
 	
35
-	public Expression constructNew(String typename, Expression... arguments) {
37
+	public Expression constructNew(String typename, Expression... arguments) throws CompileException {
36
 		String[] nameParts = Strings.split(typename, '.');
38
 		String[] nameParts = Strings.split(typename, '.');
37
 		List<GenericName> name = new ArrayList<>();
39
 		List<GenericName> name = new ArrayList<>();
38
 		for (String namePart : nameParts)
40
 		for (String namePart : nameParts)
39
 			name.add(new GenericName(namePart));
41
 			name.add(new GenericName(namePart));
40
-		ITypeID type = scope.getType(position, name);
42
+		TypeID type = scope.getType(position, name);
41
 		if (type == null)
43
 		if (type == null)
42
 			throw new CompileException(position, CompileExceptionCode.NO_SUCH_TYPE, "No such type: " + typename);
44
 			throw new CompileException(position, CompileExceptionCode.NO_SUCH_TYPE, "No such type: " + typename);
43
 		
45
 		
44
-		return constructNew(type, arguments);
46
+		return constructNew(type.stored(UniqueStorageTag.INSTANCE), arguments);
45
 	}
47
 	}
46
 	
48
 	
47
-	public Expression constructNew(ITypeID type, Expression... arguments) {
48
-		DefinitionMemberGroup constructors = scope.getTypeMembers(type).getOrCreateGroup(OperatorType.CONSTRUCTOR);
49
-		List<ITypeID>[] predictedTypes = constructors.predictCallTypes(scope, scope.hints, arguments.length);
49
+	public Expression constructNew(StoredType type, Expression... arguments) throws CompileException {
50
+		TypeMemberGroup constructors = scope.getTypeMembers(type).getOrCreateGroup(OperatorType.CONSTRUCTOR);
51
+		List<StoredType>[] predictedTypes = constructors.predictCallTypes(scope, scope.hints, arguments.length);
50
 		CallArguments compiledArguments = new CallArguments(arguments);
52
 		CallArguments compiledArguments = new CallArguments(arguments);
51
 		FunctionalMemberRef member = constructors.selectMethod(position, scope, compiledArguments, true, true);
53
 		FunctionalMemberRef member = constructors.selectMethod(position, scope, compiledArguments, true, true);
52
 		if (member == null)
54
 		if (member == null)
59
 				type,
61
 				type,
60
 				member,
62
 				member,
61
 				compiledArguments,
63
 				compiledArguments,
62
-				compiledArguments.getNumberOfTypeArguments() == 0 ? member.getHeader() : member.getHeader().fillGenericArguments(scope.getTypeRegistry(), compiledArguments.typeArguments, scope.getLocalTypeParameters()));
64
+				compiledArguments.getNumberOfTypeArguments() == 0 ? member.getHeader() : member.getHeader().fillGenericArguments(scope, compiledArguments.typeArguments));
63
 	}
65
 	}
64
 	
66
 	
65
-	public Expression not(Expression value) {
67
+	public Expression not(Expression value) throws CompileException {
66
 		TypeMembers members = scope.getTypeMembers(value.type);
68
 		TypeMembers members = scope.getTypeMembers(value.type);
67
 		return members.getOrCreateGroup(OperatorType.NOT)
69
 		return members.getOrCreateGroup(OperatorType.NOT)
68
 				.call(position, scope, value, CallArguments.EMPTY, false);
70
 				.call(position, scope, value, CallArguments.EMPTY, false);

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

94
 	
94
 	
95
 	public T visitInterfaceCast(InterfaceCastExpression expression);
95
 	public T visitInterfaceCast(InterfaceCastExpression expression);
96
 	
96
 	
97
+	public default T visitInvalid(InvalidExpression expression) {
98
+		throw new RuntimeException("Invalid expression");
99
+	}
100
+	
97
 	public T visitIs(IsExpression expression);
101
 	public T visitIs(IsExpression expression);
98
 	
102
 	
99
 	public T visitMakeConst(MakeConstExpression expression);
103
 	public T visitMakeConst(MakeConstExpression expression);
130
 	
134
 	
131
 	public T visitStaticSetter(StaticSetterExpression expression);
135
 	public T visitStaticSetter(StaticSetterExpression expression);
132
 	
136
 	
137
+	public T visitStorageCast(StorageCastExpression expression);
138
+	
133
 	public T visitSupertypeCast(SupertypeCastExpression expression);
139
 	public T visitSupertypeCast(SupertypeCastExpression expression);
134
 	
140
 	
135
 	public T visitThis(ThisExpression expression);
141
 	public T visitThis(ThisExpression expression);

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

94
 	
94
 	
95
 	public R visitInterfaceCast(C context, InterfaceCastExpression expression);
95
 	public R visitInterfaceCast(C context, InterfaceCastExpression expression);
96
 	
96
 	
97
+	public R visitInvalid(C context, InvalidExpression expression);
98
+	
97
 	public R visitIs(C context, IsExpression expression);
99
 	public R visitIs(C context, IsExpression expression);
98
 	
100
 	
99
 	public R visitMakeConst(C context, MakeConstExpression expression);
101
 	public R visitMakeConst(C context, MakeConstExpression expression);
130
 	
132
 	
131
 	public R visitStaticSetter(C context, StaticSetterExpression expression);
133
 	public R visitStaticSetter(C context, StaticSetterExpression expression);
132
 	
134
 	
135
+	public R visitStorageCast(C context, StorageCastExpression expression);
136
+	
133
 	public R visitSupertypeCast(C context, SupertypeCastExpression expression);
137
 	public R visitSupertypeCast(C context, SupertypeCastExpression expression);
134
 	
138
 	
135
 	public R visitThis(C context, ThisExpression expression);
139
 	public R visitThis(C context, ThisExpression expression);

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

18
 import org.openzen.zenscript.codemodel.statement.ReturnStatement;
18
 import org.openzen.zenscript.codemodel.statement.ReturnStatement;
19
 import org.openzen.zenscript.codemodel.statement.Statement;
19
 import org.openzen.zenscript.codemodel.statement.Statement;
20
 import org.openzen.zenscript.codemodel.type.FunctionTypeID;
20
 import org.openzen.zenscript.codemodel.type.FunctionTypeID;
21
+import org.openzen.zenscript.codemodel.type.StoredType;
21
 
22
 
22
 /**
23
 /**
23
  *
24
  *
30
 	
31
 	
31
 	public FunctionExpression(
32
 	public FunctionExpression(
32
 			CodePosition position,
33
 			CodePosition position,
33
-			FunctionTypeID type,
34
+			StoredType type,
34
 			LambdaClosure closure,
35
 			LambdaClosure closure,
35
 			FunctionHeader header,
36
 			FunctionHeader header,
36
 			Statement body) {
37
 			Statement body) {
54
 	@Override
55
 	@Override
55
 	public FunctionExpression transform(ExpressionTransformer transformer) {
56
 	public FunctionExpression transform(ExpressionTransformer transformer) {
56
 		Statement tBody = body.transform(transformer, ConcatMap.empty(LoopStatement.class, LoopStatement.class));
57
 		Statement tBody = body.transform(transformer, ConcatMap.empty(LoopStatement.class, LoopStatement.class));
57
-		return tBody == body ? this : new FunctionExpression(position, (FunctionTypeID)type, closure, header, tBody);
58
+		return tBody == body ? this : new FunctionExpression(position, type, closure, header, tBody);
58
 	}
59
 	}
59
 	
60
 	
60
 	@Override
61
 	@Override
83
 
84
 
84
 	@Override
85
 	@Override
85
 	public Expression normalize(TypeScope scope) {
86
 	public Expression normalize(TypeScope scope) {
86
-		return new FunctionExpression(position, (FunctionTypeID)type, closure, header, body.normalize(scope, ConcatMap.empty(LoopStatement.class, LoopStatement.class)));
87
+		return new FunctionExpression(position, type, closure, header, body.normalize(scope, ConcatMap.empty(LoopStatement.class, LoopStatement.class)));
87
 	}
88
 	}
88
 	
89
 	
89
 	private static class ReturnExpressionTransformer implements ExpressionTransformer {
90
 	private static class ReturnExpressionTransformer implements ExpressionTransformer {

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

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.scope.TypeScope;
14
-import org.openzen.zenscript.codemodel.type.ITypeID;
14
+import org.openzen.zenscript.codemodel.type.StoredType;
15
 
15
 
16
 /**
16
 /**
17
  *
17
  *
29
 	}
29
 	}
30
 	
30
 	
31
 	@Override
31
 	@Override
32
-	public List<ITypeID> getAssignHints() {
32
+	public List<StoredType> getAssignHints() {
33
 		return Collections.singletonList(type);
33
 		return Collections.singletonList(type);
34
 	}
34
 	}
35
 	
35
 	

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

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.scope.TypeScope;
14
-import org.openzen.zenscript.codemodel.type.ITypeID;
14
+import org.openzen.zenscript.codemodel.type.StoredType;
15
 
15
 
16
 /**
16
 /**
17
  *
17
  *
27
 	}
27
 	}
28
 	
28
 	
29
 	@Override
29
 	@Override
30
-	public List<ITypeID> getAssignHints() {
30
+	public List<StoredType> getAssignHints() {
31
 		return Collections.singletonList(field.getType());
31
 		return Collections.singletonList(field.getType());
32
 	}
32
 	}
33
 	
33
 	

+ 9
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/GetterExpression.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.zencode.shared.CompileException;
9
 import org.openzen.zenscript.codemodel.member.ref.GetterMemberRef;
10
 import org.openzen.zenscript.codemodel.member.ref.GetterMemberRef;
10
 import org.openzen.zenscript.codemodel.scope.TypeScope;
11
 import org.openzen.zenscript.codemodel.scope.TypeScope;
12
+import org.openzen.zenscript.codemodel.type.member.TypeMembers;
11
 
13
 
12
 /**
14
 /**
13
  *
15
  *
44
 	public Expression normalize(TypeScope scope) {
46
 	public Expression normalize(TypeScope scope) {
45
 		return new GetterExpression(position, target.normalize(scope), getter);
47
 		return new GetterExpression(position, target.normalize(scope), getter);
46
 	}
48
 	}
49
+	
50
+	@Override
51
+	public Expression assign(CodePosition position, TypeScope scope, Expression value) throws CompileException {
52
+		return scope.getTypeMembers(getter.getOwnerType())
53
+				.getOrCreateGroup(getter.member.name, false)
54
+				.setter(position, scope, target, value, false);
55
+	}
47
 }
56
 }

+ 7
- 5
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.member.ref.ImplementationMemberRef;
9
 import org.openzen.zenscript.codemodel.scope.TypeScope;
10
 import org.openzen.zenscript.codemodel.scope.TypeScope;
10
-import org.openzen.zenscript.codemodel.type.ITypeID;
11
 
11
 
12
 /**
12
 /**
13
  *
13
  *
15
  */
15
  */
16
 public class InterfaceCastExpression extends Expression {
16
 public class InterfaceCastExpression extends Expression {
17
 	public final Expression value;
17
 	public final Expression value;
18
+	public final ImplementationMemberRef implementation;
18
 	
19
 	
19
-	public InterfaceCastExpression(CodePosition position, Expression value, ITypeID toType) {
20
-		super(position, toType, value.thrownType);
20
+	public InterfaceCastExpression(CodePosition position, Expression value, ImplementationMemberRef implementation) {
21
+		super(position, implementation.implementsType, value.thrownType);
21
 		
22
 		
22
 		this.value = value;
23
 		this.value = value;
24
+		this.implementation = implementation;
23
 	}
25
 	}
24
 
26
 
25
 	@Override
27
 	@Override
35
 	@Override
37
 	@Override
36
 	public Expression transform(ExpressionTransformer transformer) {
38
 	public Expression transform(ExpressionTransformer transformer) {
37
 		Expression tValue = value.transform(transformer);
39
 		Expression tValue = value.transform(transformer);
38
-		return value == tValue ? this : new InterfaceCastExpression(position, tValue, type);
40
+		return value == tValue ? this : new InterfaceCastExpression(position, tValue, implementation);
39
 	}
41
 	}
40
 
42
 
41
 	@Override
43
 	@Override
42
 	public Expression normalize(TypeScope scope) {
44
 	public Expression normalize(TypeScope scope) {
43
-		return new InterfaceCastExpression(position, value.normalize(scope), type.getNormalized());
45
+		return new InterfaceCastExpression(position, value.normalize(scope), implementation);
44
 	}
46
 	}
45
 }
47
 }

+ 52
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/InvalidExpression.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.expression;
7
+
8
+import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zencode.shared.CompileException;
10
+import org.openzen.zencode.shared.CompileExceptionCode;
11
+import org.openzen.zenscript.codemodel.scope.TypeScope;
12
+import org.openzen.zenscript.codemodel.type.StoredType;
13
+
14
+/**
15
+ *
16
+ * @author Hoofdgebruiker
17
+ */
18
+public class InvalidExpression extends Expression {
19
+	public final CompileExceptionCode code;
20
+	public final String message;
21
+	
22
+	public InvalidExpression(CodePosition position, StoredType type, CompileExceptionCode code, String message) {
23
+		super(position, type, null);
24
+		
25
+		this.code = code;
26
+		this.message = message;
27
+	}
28
+	
29
+	public InvalidExpression(StoredType type, CompileException cause) {
30
+		this(cause.position, type, cause.code, cause.getMessage());
31
+	}
32
+
33
+	@Override
34
+	public <T> T accept(ExpressionVisitor<T> visitor) {
35
+		return visitor.visitInvalid(this);
36
+	}
37
+
38
+	@Override
39
+	public <C, R> R accept(C context, ExpressionVisitorWithContext<C, R> visitor) {
40
+		return visitor.visitInvalid(context, this);
41
+	}
42
+
43
+	@Override
44
+	public Expression transform(ExpressionTransformer transformer) {
45
+		return this;
46
+	}
47
+
48
+	@Override
49
+	public Expression normalize(TypeScope scope) {
50
+		return this;
51
+	}
52
+}

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

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.scope.TypeScope;
10
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
11
-import org.openzen.zenscript.codemodel.type.ITypeID;
11
+import org.openzen.zenscript.codemodel.type.TypeID;
12
 
12
 
13
 /**
13
 /**
14
  *
14
  *
16
  */
16
  */
17
 public class IsExpression extends Expression {
17
 public class IsExpression extends Expression {
18
 	public final Expression value;
18
 	public final Expression value;
19
-	public final ITypeID isType;
19
+	public final TypeID isType;
20
 	
20
 	
21
-	public IsExpression(CodePosition position, Expression value, ITypeID type) {
22
-		super(position, BasicTypeID.BOOL, value.thrownType);
21
+	public IsExpression(CodePosition position, Expression value, TypeID type) {
22
+		super(position, BasicTypeID.BOOL.stored, value.thrownType);
23
 		
23
 		
24
 		this.value = value;
24
 		this.value = value;
25
 		this.isType = type;
25
 		this.isType = type;
38
 	@Override
38
 	@Override
39
 	public Expression transform(ExpressionTransformer transformer) {
39
 	public Expression transform(ExpressionTransformer transformer) {
40
 		Expression tValue = value.transform(transformer);
40
 		Expression tValue = value.transform(transformer);
41
-		return tValue == value ? this : new IsExpression(position, tValue, type);
41
+		return tValue == value ? this : new IsExpression(position, tValue, isType);
42
 	}
42
 	}
43
 
43
 
44
 	@Override
44
 	@Override
45
 	public Expression normalize(TypeScope scope) {
45
 	public Expression normalize(TypeScope scope) {
46
-		return new IsExpression(position, value.normalize(scope), type.getNormalized());
46
+		return new IsExpression(position, value.normalize(scope), isType.getNormalized());
47
 	}
47
 	}
48
 }
48
 }

+ 2
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/MakeConstExpression.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.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.scope.TypeScope;
10
-import org.openzen.zenscript.codemodel.type.ITypeID;
10
+import org.openzen.zenscript.codemodel.type.StoredType;
11
 
11
 
12
 /**
12
 /**
13
  *
13
  *
16
 public class MakeConstExpression extends Expression {
16
 public class MakeConstExpression extends Expression {
17
 	public final Expression value;
17
 	public final Expression value;
18
 	
18
 	
19
-	public MakeConstExpression(CodePosition position, Expression value, ITypeID constType) {
19
+	public MakeConstExpression(CodePosition position, Expression value, StoredType constType) {
20
 		super(position, constType, value.thrownType);
20
 		super(position, constType, value.thrownType);
21
 		
21
 		
22
 		this.value = value;
22
 		this.value = value;

+ 2
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/MapExpression.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.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.scope.TypeScope;
10
-import org.openzen.zenscript.codemodel.type.ITypeID;
10
+import org.openzen.zenscript.codemodel.type.StoredType;
11
 
11
 
12
 /**
12
 /**
13
  *
13
  *
21
 			CodePosition position,
21
 			CodePosition position,
22
 			Expression[] keys,
22
 			Expression[] keys,
23
 			Expression[] values,
23
 			Expression[] values,
24
-			ITypeID type) {
24
+			StoredType type) {
25
 		super(position, type, binaryThrow(position, multiThrow(position, keys), multiThrow(position, values)));
25
 		super(position, type, binaryThrow(position, multiThrow(position, keys), multiThrow(position, values)));
26
 		
26
 		
27
 		this.keys = keys;
27
 		this.keys = keys;

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

16
 import org.openzen.zenscript.codemodel.statement.SwitchCase;
16
 import org.openzen.zenscript.codemodel.statement.SwitchCase;
17
 import org.openzen.zenscript.codemodel.statement.SwitchStatement;
17
 import org.openzen.zenscript.codemodel.statement.SwitchStatement;
18
 import org.openzen.zenscript.codemodel.statement.VarStatement;
18
 import org.openzen.zenscript.codemodel.statement.VarStatement;
19
+import org.openzen.zenscript.codemodel.statement.VariableID;
19
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
20
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
20
-import org.openzen.zenscript.codemodel.type.ITypeID;
21
+import org.openzen.zenscript.codemodel.type.StoredType;
21
 
22
 
22
 /**
23
 /**
23
  *
24
  *
27
 	public final Expression value;
28
 	public final Expression value;
28
 	public final Case[] cases;
29
 	public final Case[] cases;
29
 	
30
 	
30
-	public MatchExpression(CodePosition position, Expression value, ITypeID type, Case[] cases) {
31
+	public MatchExpression(CodePosition position, Expression value, StoredType type, Case[] cases) {
31
 		super(position, type, binaryThrow(position, value.thrownType, getThrownType(position, cases)));
32
 		super(position, type, binaryThrow(position, value.thrownType, getThrownType(position, cases)));
32
 		
33
 		
33
 		this.value = value;
34
 		this.value = value;
65
 	}
66
 	}
66
 	
67
 	
67
 	public SwitchedMatch convertToSwitch(String tempVariable) {
68
 	public SwitchedMatch convertToSwitch(String tempVariable) {
68
-		VarStatement result = new VarStatement(position, tempVariable, type, null, false);
69
+		VarStatement result = new VarStatement(position, new VariableID(), tempVariable, type, null, false);
69
 		SwitchStatement switchStatement = new SwitchStatement(position, null, value);
70
 		SwitchStatement switchStatement = new SwitchStatement(position, null, value);
70
 		boolean hasDefault = false;
71
 		boolean hasDefault = false;
71
 		for (MatchExpression.Case matchCase : cases) {
72
 		for (MatchExpression.Case matchCase : cases) {
88
 				hasDefault = true;
89
 				hasDefault = true;
89
 		}
90
 		}
90
 		if (!hasDefault) {
91
 		if (!hasDefault) {
91
-			Statement defaultCase = new ExpressionStatement(position, new PanicExpression(position, BasicTypeID.VOID, new ConstantStringExpression(position, "Missing case")));
92
+			Statement defaultCase = new ExpressionStatement(position, new PanicExpression(position, BasicTypeID.VOID.stored, new ConstantStringExpression(position, "Missing case")));
92
 			switchStatement.cases.add(new SwitchCase(null, new Statement[] { defaultCase }));
93
 			switchStatement.cases.add(new SwitchCase(null, new Statement[] { defaultCase }));
93
 		}
94
 		}
94
 		return new SwitchedMatch(result, switchStatement);
95
 		return new SwitchedMatch(result, switchStatement);
123
 		}
124
 		}
124
 	}
125
 	}
125
 	
126
 	
126
-	private static ITypeID getThrownType(CodePosition position, Case[] cases) {
127
+	private static StoredType getThrownType(CodePosition position, Case[] cases) {
127
 		if (cases.length == 0)
128
 		if (cases.length == 0)
128
 			return null;
129
 			return null;
129
 		
130
 		
130
-		ITypeID result = cases[0].value.thrownType;
131
+		StoredType result = cases[0].value.thrownType;
131
 		for (int i = 1; i < cases.length; i++)
132
 		for (int i = 1; i < cases.length; i++)
132
 			result = binaryThrow(position, result, cases[i].value.thrownType);
133
 			result = binaryThrow(position, result, cases[i].value.thrownType);
133
 		
134
 		

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

9
 import org.openzen.zenscript.codemodel.FunctionHeader;
9
 import org.openzen.zenscript.codemodel.FunctionHeader;
10
 import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
10
 import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
11
 import org.openzen.zenscript.codemodel.scope.TypeScope;
11
 import org.openzen.zenscript.codemodel.scope.TypeScope;
12
-import org.openzen.zenscript.codemodel.type.ITypeID;
12
+import org.openzen.zenscript.codemodel.type.StoredType;
13
+import org.openzen.zenscript.codemodel.type.member.BuiltinID;
13
 
14
 
14
 /**
15
 /**
15
  *
16
  *
22
 	
23
 	
23
 	public NewExpression(
24
 	public NewExpression(
24
 			CodePosition position,
25
 			CodePosition position,
25
-			ITypeID type,
26
+			StoredType type,
26
 			FunctionalMemberRef constructor,
27
 			FunctionalMemberRef constructor,
27
 			CallArguments arguments)
28
 			CallArguments arguments)
28
 	{
29
 	{
31
 	
32
 	
32
 	public NewExpression(
33
 	public NewExpression(
33
 			CodePosition position,
34
 			CodePosition position,
34
-			ITypeID type,
35
+			StoredType type,
35
 			FunctionalMemberRef constructor,
36
 			FunctionalMemberRef constructor,
36
 			CallArguments arguments,
37
 			CallArguments arguments,
37
 			FunctionHeader instancedHeader)
38
 			FunctionHeader instancedHeader)

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

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.scope.TypeScope;
10
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
11
-import org.openzen.zenscript.codemodel.type.ITypeID;
11
+import org.openzen.zenscript.codemodel.type.StoredType;
12
 
12
 
13
 /**
13
 /**
14
  *
14
  *
16
  */
16
  */
17
 public class NullExpression extends Expression {
17
 public class NullExpression extends Expression {
18
 	public NullExpression(CodePosition position) {
18
 	public NullExpression(CodePosition position) {
19
-		super(position, BasicTypeID.NULL, null);
19
+		super(position, BasicTypeID.NULL.stored, null);
20
 	}
20
 	}
21
 	
21
 	
22
-	public NullExpression(CodePosition position, ITypeID optionalType) {
22
+	public NullExpression(CodePosition position, StoredType optionalType) {
23
 		super(position, optionalType, null);
23
 		super(position, optionalType, null);
24
 	}
24
 	}
25
 
25
 

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

18
 	public final Expression right;
18
 	public final Expression right;
19
 	
19
 	
20
 	public OrOrExpression(CodePosition position, Expression left, Expression right) {
20
 	public OrOrExpression(CodePosition position, Expression left, Expression right) {
21
-		super(position, BasicTypeID.BOOL, binaryThrow(position, left.thrownType, right.thrownType));
21
+		super(position, BasicTypeID.BOOL.stored, binaryThrow(position, left.thrownType, right.thrownType));
22
 		
22
 		
23
 		this.left = left;
23
 		this.left = left;
24
 		this.right = right;
24
 		this.right = right;

+ 2
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/PanicExpression.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.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.scope.TypeScope;
10
-import org.openzen.zenscript.codemodel.type.ITypeID;
10
+import org.openzen.zenscript.codemodel.type.StoredType;
11
 
11
 
12
 /**
12
 /**
13
  *
13
  *
16
 public class PanicExpression extends Expression {
16
 public class PanicExpression extends Expression {
17
 	public final Expression value;
17
 	public final Expression value;
18
 	
18
 	
19
-	public PanicExpression(CodePosition position, ITypeID type, Expression value) {
19
+	public PanicExpression(CodePosition position, StoredType type, Expression value) {
20
 		super(position, type, null);
20
 		super(position, type, null);
21
 		
21
 		
22
 		this.value = value;
22
 		this.value = value;

+ 7
- 7
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/RangeExpression.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.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.scope.TypeScope;
10
-import org.openzen.zenscript.codemodel.type.ITypeID;
11
 import org.openzen.zenscript.codemodel.type.RangeTypeID;
10
 import org.openzen.zenscript.codemodel.type.RangeTypeID;
11
+import org.openzen.zenscript.codemodel.type.StoredType;
12
 
12
 
13
 /**
13
 /**
14
  *
14
  *
18
 	public final Expression from;
18
 	public final Expression from;
19
 	public final Expression to;
19
 	public final Expression to;
20
 	
20
 	
21
-	public RangeExpression(CodePosition position, RangeTypeID type, Expression from, Expression to) {
21
+	public RangeExpression(CodePosition position, StoredType type, Expression from, Expression to) {
22
 		super(position, type, binaryThrow(position, from.thrownType, to.thrownType));
22
 		super(position, type, binaryThrow(position, from.thrownType, to.thrownType));
23
 	
23
 	
24
 		this.from = from;
24
 		this.from = from;
25
 		this.to = to;
25
 		this.to = to;
26
 	}
26
 	}
27
 	
27
 	
28
-	private RangeExpression(CodePosition position, ITypeID type, Expression from, Expression to, ITypeID thrownType) {
28
+	private RangeExpression(CodePosition position, StoredType type, Expression from, Expression to, StoredType thrownType) {
29
 		super(position, type, thrownType);
29
 		super(position, type, thrownType);
30
 		
30
 		
31
 		this.from = from;
31
 		this.from = from;
51
 
51
 
52
 	@Override
52
 	@Override
53
 	public Expression normalize(TypeScope scope) {
53
 	public Expression normalize(TypeScope scope) {
54
-		RangeTypeID rangeType = (RangeTypeID)type;
54
+		StoredType baseType = ((RangeTypeID)type.type).baseType;
55
 		return new RangeExpression(
55
 		return new RangeExpression(
56
 				position,
56
 				position,
57
-				rangeType,
58
-				from.normalize(scope).castImplicit(position, scope, rangeType.baseType),
59
-				to.normalize(scope).castImplicit(position, scope, rangeType.baseType));
57
+				type.getNormalized(),
58
+				from.normalize(scope).castImplicit(position, scope, baseType),
59
+				to.normalize(scope).castImplicit(position, scope, baseType));
60
 	}
60
 	}
61
 }
61
 }

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

19
 	public final boolean inverted;
19
 	public final boolean inverted;
20
 	
20
 	
21
 	public SameObjectExpression(CodePosition position, Expression left, Expression right, boolean inverted) {
21
 	public SameObjectExpression(CodePosition position, Expression left, Expression right, boolean inverted) {
22
-		super(position, BasicTypeID.BOOL, binaryThrow(position, left.thrownType, right.thrownType));
22
+		super(position, BasicTypeID.BOOL.stored, binaryThrow(position, left.thrownType, right.thrownType));
23
 		
23
 		
24
 		this.left = left;
24
 		this.left = left;
25
 		this.right = right;
25
 		this.right = right;

+ 8
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/StaticGetterExpression.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.zencode.shared.CompileException;
9
 import org.openzen.zenscript.codemodel.member.ref.GetterMemberRef;
10
 import org.openzen.zenscript.codemodel.member.ref.GetterMemberRef;
10
 import org.openzen.zenscript.codemodel.scope.TypeScope;
11
 import org.openzen.zenscript.codemodel.scope.TypeScope;
11
 
12
 
41
 	public Expression normalize(TypeScope scope) {
42
 	public Expression normalize(TypeScope scope) {
42
 		return this;
43
 		return this;
43
 	}
44
 	}
45
+	
46
+	@Override
47
+	public Expression assign(CodePosition position, TypeScope scope, Expression value) throws CompileException {
48
+		return scope.getTypeMembers(getter.getOwnerType())
49
+				.getOrCreateGroup(getter.member.name, false)
50
+				.staticSetter(position, scope, value);
51
+	}
44
 }
52
 }

+ 46
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/StorageCastExpression.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.expression;
7
+
8
+import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.scope.TypeScope;
10
+import org.openzen.zenscript.codemodel.type.StoredType;
11
+
12
+/**
13
+ *
14
+ * @author Hoofdgebruiker
15
+ */
16
+public class StorageCastExpression extends Expression {
17
+	public final Expression value;
18
+	
19
+	public StorageCastExpression(CodePosition position, Expression value, StoredType toType) {
20
+		super(position, toType, value.thrownType);
21
+		
22
+		this.value = value;
23
+	}
24
+
25
+	@Override
26
+	public <T> T accept(ExpressionVisitor<T> visitor) {
27
+		return visitor.visitStorageCast(this);
28
+	}
29
+
30
+	@Override
31
+	public <C, R> R accept(C context, ExpressionVisitorWithContext<C, R> visitor) {
32
+		return visitor.visitStorageCast(context, this);
33
+	}
34
+
35
+	@Override
36
+	public Expression transform(ExpressionTransformer transformer) {
37
+		Expression transformed = transformer.transform(value);
38
+		return transformed == this ? this : new StorageCastExpression(position, transformed, type);
39
+	}
40
+
41
+	@Override
42
+	public Expression normalize(TypeScope scope) {
43
+		Expression normalized = value.normalize(scope);
44
+		return normalized == value ? this : new StorageCastExpression(position, normalized, type);
45
+	}
46
+}

+ 2
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/SupertypeCastExpression.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.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.scope.TypeScope;
10
-import org.openzen.zenscript.codemodel.type.ITypeID;
10
+import org.openzen.zenscript.codemodel.type.StoredType;
11
 
11
 
12
 /**
12
 /**
13
  * Using to cast a class type to a base type.
13
  * Using to cast a class type to a base type.
17
 public class SupertypeCastExpression extends Expression {
17
 public class SupertypeCastExpression extends Expression {
18
 	public final Expression value;
18
 	public final Expression value;
19
 	
19
 	
20
-	public SupertypeCastExpression(CodePosition position, Expression value, ITypeID type) {
20
+	public SupertypeCastExpression(CodePosition position, Expression value, StoredType type) {
21
 		super(position, type, value.thrownType);
21
 		super(position, type, value.thrownType);
22
 		
22
 		
23
 		this.value = value;
23
 		this.value = value;

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

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.scope.TypeScope;
11
-import org.openzen.zenscript.codemodel.type.ITypeID;
11
+import org.openzen.zenscript.codemodel.type.StoredType;
12
 
12
 
13
 /**
13
 /**
14
  *
14
  *
15
  * @author Hoofdgebruiker
15
  * @author Hoofdgebruiker
16
  */
16
  */
17
 public class ThisExpression extends Expression {
17
 public class ThisExpression extends Expression {
18
-	public ThisExpression(CodePosition position, ITypeID type) {
18
+	public ThisExpression(CodePosition position, StoredType type) {
19
 		super(position, type, null);
19
 		super(position, type, null);
20
 	}
20
 	}
21
 	
21
 	

+ 2
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ThrowExpression.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.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.scope.TypeScope;
10
-import org.openzen.zenscript.codemodel.type.ITypeID;
10
+import org.openzen.zenscript.codemodel.type.StoredType;
11
 
11
 
12
 /**
12
 /**
13
  *
13
  *
16
 public class ThrowExpression extends Expression {
16
 public class ThrowExpression extends Expression {
17
 	public final Expression value;
17
 	public final Expression value;
18
 	
18
 	
19
-	public ThrowExpression(CodePosition position, ITypeID type, Expression value) {
19
+	public ThrowExpression(CodePosition position, StoredType type, Expression value) {
20
 		super(position, type, value.type);
20
 		super(position, type, value.type);
21
 		
21
 		
22
 		this.value = value;
22
 		this.value = value;

+ 2
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/TryConvertExpression.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.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.scope.TypeScope;
10
-import org.openzen.zenscript.codemodel.type.ITypeID;
10
+import org.openzen.zenscript.codemodel.type.StoredType;
11
 
11
 
12
 /**
12
 /**
13
  *
13
  *
16
 public class TryConvertExpression extends Expression {
16
 public class TryConvertExpression extends Expression {
17
 	public final Expression value;
17
 	public final Expression value;
18
 	
18
 	
19
-	public TryConvertExpression(CodePosition position, ITypeID type, Expression value) {
19
+	public TryConvertExpression(CodePosition position, StoredType type, Expression value) {
20
 		super(position, type, null);
20
 		super(position, type, null);
21
 		
21
 		
22
 		this.value = value;
22
 		this.value = value;

+ 2
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/TryRethrowAsExceptionExpression.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.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.scope.TypeScope;
10
-import org.openzen.zenscript.codemodel.type.ITypeID;
10
+import org.openzen.zenscript.codemodel.type.StoredType;
11
 
11
 
12
 /**
12
 /**
13
  *
13
  *
16
 public class TryRethrowAsExceptionExpression extends Expression {
16
 public class TryRethrowAsExceptionExpression extends Expression {
17
 	public final Expression value;
17
 	public final Expression value;
18
 	
18
 	
19
-	public TryRethrowAsExceptionExpression(CodePosition position, ITypeID type, Expression value, ITypeID thrownType) {
19
+	public TryRethrowAsExceptionExpression(CodePosition position, StoredType type, Expression value, StoredType thrownType) {
20
 		super(position, type, thrownType);
20
 		super(position, type, thrownType);
21
 		
21
 		
22
 		this.value = value;
22
 		this.value = value;

+ 2
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/TryRethrowAsResultExpression.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.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.scope.TypeScope;
10
-import org.openzen.zenscript.codemodel.type.ITypeID;
10
+import org.openzen.zenscript.codemodel.type.StoredType;
11
 
11
 
12
 /**
12
 /**
13
  *
13
  *
16
 public class TryRethrowAsResultExpression extends Expression {
16
 public class TryRethrowAsResultExpression extends Expression {
17
 	public final Expression value;
17
 	public final Expression value;
18
 	
18
 	
19
-	public TryRethrowAsResultExpression(CodePosition position, ITypeID type, Expression value) {
19
+	public TryRethrowAsResultExpression(CodePosition position, StoredType type, Expression value) {
20
 		super(position, type, null);
20
 		super(position, type, null);
21
 		
21
 		
22
 		this.value = value;
22
 		this.value = value;

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

7
 
7
 
8
 import java.util.List;
8
 import java.util.List;
9
 import org.openzen.zencode.shared.CodePosition;
9
 import org.openzen.zencode.shared.CodePosition;
10
+import org.openzen.zencode.shared.CompileException;
10
 import org.openzen.zenscript.codemodel.member.ref.VariantOptionRef;
11
 import org.openzen.zenscript.codemodel.member.ref.VariantOptionRef;
11
 import org.openzen.zenscript.codemodel.scope.TypeScope;
12
 import org.openzen.zenscript.codemodel.scope.TypeScope;
12
-import org.openzen.zenscript.codemodel.type.ITypeID;
13
+import org.openzen.zenscript.codemodel.type.StoredType;
13
 
14
 
14
 /**
15
 /**
15
  *
16
  *
19
 	public final VariantOptionRef option;
20
 	public final VariantOptionRef option;
20
 	public final Expression[] arguments;
21
 	public final Expression[] arguments;
21
 	
22
 	
22
-	public VariantValueExpression(CodePosition position, ITypeID variantType, VariantOptionRef option) {
23
+	public VariantValueExpression(CodePosition position, StoredType variantType, VariantOptionRef option) {
23
 		this(position, variantType, option, Expression.NONE);
24
 		this(position, variantType, option, Expression.NONE);
24
 	}
25
 	}
25
 	
26
 	
26
-	public VariantValueExpression(CodePosition position, ITypeID variantType, VariantOptionRef option, Expression[] arguments) {
27
+	public VariantValueExpression(CodePosition position, StoredType variantType, VariantOptionRef option, Expression[] arguments) {
27
 		super(position, variantType, multiThrow(position, arguments));
28
 		super(position, variantType, multiThrow(position, arguments));
28
 		
29
 		
29
 		this.option = option;
30
 		this.option = option;
35
 	}
36
 	}
36
 	
37
 	
37
 	@Override
38
 	@Override
38
-	public Expression call(CodePosition position, TypeScope scope, List<ITypeID> hints, CallArguments arguments) {
39
+	public Expression call(CodePosition position, TypeScope scope, List<StoredType> hints, CallArguments arguments) throws CompileException {
39
 		if (arguments != null)
40
 		if (arguments != null)
40
 			return super.call(position, scope, hints, arguments);
41
 			return super.call(position, scope, hints, arguments);
41
 		
42
 		
62
 	public Expression normalize(TypeScope scope) {
63
 	public Expression normalize(TypeScope scope) {
63
 		Expression[] normalized = new Expression[arguments.length];
64
 		Expression[] normalized = new Expression[arguments.length];
64
 		for (int i = 0; i < normalized.length; i++)
65
 		for (int i = 0; i < normalized.length; i++)
65
-			normalized[i] = arguments[i].normalize(scope);
66
+			normalized[i] = arguments[i].normalize(scope).castImplicit(position, scope, option.types[i]);
66
 		return new VariantValueExpression(position, type, option, normalized);
67
 		return new VariantValueExpression(position, type, option, normalized);
67
 	}
68
 	}
68
 }
69
 }

+ 2
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/WrapOptionalExpression.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.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.scope.TypeScope;
10
-import org.openzen.zenscript.codemodel.type.ITypeID;
10
+import org.openzen.zenscript.codemodel.type.StoredType;
11
 
11
 
12
 /**
12
 /**
13
  *
13
  *
16
 public class WrapOptionalExpression extends Expression {
16
 public class WrapOptionalExpression extends Expression {
17
 	public final Expression value;
17
 	public final Expression value;
18
 	
18
 	
19
-	public WrapOptionalExpression(CodePosition position, Expression value, ITypeID optionalType) {
19
+	public WrapOptionalExpression(CodePosition position, Expression value, StoredType optionalType) {
20
 		super(position, optionalType, value.thrownType);
20
 		super(position, optionalType, value.thrownType);
21
 		
21
 		
22
 		if (value.type.isOptional())
22
 		if (value.type.isOptional())

+ 0
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/generic/ParameterSuperBound.java View File


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

Loading…
Cancel
Save