瀏覽代碼

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

kindlich 6 年之前
父節點
當前提交
01bf2ac5d4
沒有發現已知的金鑰在資料庫的簽署中
共有 100 個檔案被更改,包括 1101 行新增438 行删除
  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 查看文件

@@ -195,7 +195,7 @@ public class DefinitionFormatter implements DefinitionVisitor<Void> {
195 195
 				for (int i = 0; i < option.types.length; i++) {
196 196
 					if (i > 0)
197 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 查看文件

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

+ 9
- 9
CodeFormatter/src/main/java/org/openzen/zenscript/formatter/FormattingUtils.java 查看文件

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

+ 16
- 16
CodeFormatter/src/main/java/org/openzen/zenscript/formatter/MemberFormatter.java 查看文件

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

+ 2
- 2
CodeFormatter/src/main/java/org/openzen/zenscript/formatter/StatementFormatter.java 查看文件

@@ -252,7 +252,7 @@ public class StatementFormatter implements StatementVisitor<Void> {
252 252
 		for (CatchClause catchClause : statement.catchClauses) {
253 253
 			output.append(indent).append("catch ");
254 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 257
 			format(ParentStatementType.CATCH, catchClause.content);
258 258
 		}
@@ -274,7 +274,7 @@ public class StatementFormatter implements StatementVisitor<Void> {
274 274
 		
275 275
 		if (statement.initializer == null || statement.initializer.type != statement.type) {
276 276
 			output.append(" as ");
277
-			output.append(statement.type.accept(expressionFormatter.typeFormatter));
277
+			output.append(expressionFormatter.typeFormatter.format(statement.type));
278 278
 		}
279 279
 		if (statement.initializer != null) {
280 280
 			output.append(" = ");

+ 30
- 22
CodeFormatter/src/main/java/org/openzen/zenscript/formatter/TypeFormatter.java 查看文件

@@ -13,14 +13,16 @@ import org.openzen.zenscript.codemodel.generic.TypeParameter;
13 13
 import org.openzen.zenscript.codemodel.type.ArrayTypeID;
14 14
 import org.openzen.zenscript.codemodel.type.AssocTypeID;
15 15
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
16
-import org.openzen.zenscript.codemodel.type.ModifiedTypeID;
16
+import org.openzen.zenscript.codemodel.type.OptionalTypeID;
17 17
 import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
18 18
 import org.openzen.zenscript.codemodel.type.FunctionTypeID;
19 19
 import org.openzen.zenscript.codemodel.type.GenericMapTypeID;
20 20
 import org.openzen.zenscript.codemodel.type.GenericTypeID;
21
-import org.openzen.zenscript.codemodel.type.ITypeID;
22 21
 import org.openzen.zenscript.codemodel.type.IteratorTypeID;
23 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 26
 import stdlib.Chars;
25 27
 import org.openzen.zenscript.codemodel.type.TypeVisitor;
26 28
 
@@ -36,25 +38,40 @@ public class TypeFormatter implements TypeVisitor<String>, GenericParameterBound
36 38
 		this.settings = settings;
37 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 50
 	@Override
41 51
 	public String visitBasic(BasicTypeID basic) {
42 52
 		return basic.name;
43 53
 	}
54
+	
55
+	@Override
56
+	public String visitString(StringTypeID string) {
57
+		return "string";
58
+	}
44 59
 
45 60
 	@Override
46 61
 	public String visitArray(ArrayTypeID array) {
47
-		String element = array.elementType.accept(this);
62
+		String element = format(array.elementType);
63
+		String result;
48 64
 		if (array.dimension == 1) {
49
-			return element + "[]";
65
+			result = element + "[]";
50 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 72
 	@Override
56 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 77
 	@Override
@@ -73,18 +90,18 @@ public class TypeFormatter implements TypeVisitor<String>, GenericParameterBound
73 90
 	@Override
74 91
 	public String visitDefinition(DefinitionTypeID definition) {
75 92
 		String importedName = importer.importDefinition(definition.definition);
76
-		if (definition.typeParameters == null)
93
+		if (definition.typeArguments == null)
77 94
 			return importedName;
78 95
 		
79 96
 		StringBuilder result = new StringBuilder();
80 97
 		result.append(importedName);
81 98
 		result.append("<");
82 99
 		int index = 0;
83
-		for (ITypeID typeParameter : definition.typeParameters) {
100
+		for (StoredType typeParameter : definition.typeArguments) {
84 101
 			if (index > 0)
85 102
 				result.append(", ");
86 103
 			
87
-			result.append(typeParameter.accept(this));
104
+			result.append(format(typeParameter));
88 105
 		}
89 106
 		result.append(">");
90 107
 		return result.toString();
@@ -97,21 +114,12 @@ public class TypeFormatter implements TypeVisitor<String>, GenericParameterBound
97 114
 
98 115
 	@Override
99 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 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 125
 	@Override
@@ -127,7 +135,7 @@ public class TypeFormatter implements TypeVisitor<String>, GenericParameterBound
127 135
 	@Override
128 136
 	public String visitGenericMap(GenericMapTypeID map) {
129 137
 		StringBuilder result = new StringBuilder();
130
-		result.append(map.value.accept(this));
138
+		result.append(format(map.value));
131 139
 		result.append("[<");
132 140
 		FormattingUtils.formatTypeParameters(result, new TypeParameter[] { map.key }, this);
133 141
 		result.append("]>");

+ 56
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/AccessScope.java 查看文件

@@ -0,0 +1,56 @@
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 查看文件

@@ -14,41 +14,46 @@ import org.openzen.zenscript.codemodel.expression.Expression;
14 14
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
15 15
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
16 16
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
17
-import org.openzen.zenscript.codemodel.type.ITypeID;
18 17
 import org.openzen.zenscript.codemodel.scope.TypeScope;
18
+import org.openzen.zenscript.codemodel.type.StoredType;
19 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 24
  * @author Hoofdgebruiker
24 25
  */
25 26
 public class FunctionHeader {
26
-	private static final FunctionParameter[] NO_PARAMETERS = new FunctionParameter[0];
27
-	
28 27
 	public final TypeParameter[] typeParameters;
29
-	private ITypeID returnType;
28
+	private StoredType returnType;
30 29
 	public final FunctionParameter[] parameters;
31
-	public final ITypeID thrownType;
30
+	public final StoredType thrownType;
31
+	public final StorageTag storage;
32 32
 	
33 33
 	public final int minParameters;
34 34
 	public final int maxParameters;
35 35
 	public final boolean hasUnknowns;
36 36
 	
37
-	public FunctionHeader(ITypeID returnType) {
37
+	public FunctionHeader(StoredType returnType) {
38 38
 		if (returnType == null)
39 39
 			throw new NullPointerException();
40 40
 		
41 41
 		this.typeParameters = TypeParameter.NONE;
42 42
 		this.returnType = returnType;
43
-		this.parameters = NO_PARAMETERS;
43
+		this.parameters = FunctionParameter.NONE;
44 44
 		this.thrownType = null;
45
+		this.storage = null;
45 46
 		
46 47
 		minParameters = 0;
47 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 57
 		if (returnType == null)
53 58
 			throw new NullPointerException();
54 59
 		
@@ -56,6 +61,7 @@ public class FunctionHeader {
56 61
 		this.returnType = returnType;
57 62
 		this.parameters = new FunctionParameter[parameterTypes.length];
58 63
 		this.thrownType = null;
64
+		this.storage = null;
59 65
 		
60 66
 		for (int i = 0; i < parameterTypes.length; i++)
61 67
 			parameters[i] = new FunctionParameter(parameterTypes[i], null);
@@ -65,7 +71,11 @@ public class FunctionHeader {
65 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 79
 		if (returnType == null)
70 80
 			throw new NullPointerException();
71 81
 		
@@ -73,13 +83,18 @@ public class FunctionHeader {
73 83
 		this.returnType = returnType;
74 84
 		this.parameters = parameters;
75 85
 		this.thrownType = null;
86
+		this.storage = null;
76 87
 		
77 88
 		minParameters = getMinParameters(parameters);
78 89
 		maxParameters = getMaxParameters(parameters);
79 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 98
 		if (returnType == null)
84 99
 			throw new NullPointerException();
85 100
 		if (typeParameters == null)
@@ -89,17 +104,18 @@ public class FunctionHeader {
89 104
 		this.returnType = returnType;
90 105
 		this.parameters = parameters;
91 106
 		this.thrownType = thrownType;
107
+		this.storage = storage;
92 108
 		
93 109
 		minParameters = getMinParameters(parameters);
94 110
 		maxParameters = getMaxParameters(parameters);
95 111
 		hasUnknowns = hasUnknowns(parameters, returnType);
96 112
 	}
97 113
 	
98
-	public ITypeID getReturnType() {
114
+	public StoredType getReturnType() {
99 115
 		return returnType;
100 116
 	}
101 117
 	
102
-	public void setReturnType(ITypeID returnType) {
118
+	public void setReturnType(StoredType returnType) {
103 119
 		if (returnType == null)
104 120
 			throw new NullPointerException();
105 121
 		
@@ -107,7 +123,7 @@ public class FunctionHeader {
107 123
 	}
108 124
 	
109 125
 	public boolean isDenormalized() {
110
-		if (returnType.getNormalized() != returnType)
126
+		if (!returnType.getNormalized().equals(returnType))
111 127
 			return true;
112 128
 		for (FunctionParameter parameter : parameters)
113 129
 			if (parameter.type.getNormalized() != parameter.type)
@@ -122,8 +138,8 @@ public class FunctionHeader {
122 138
 		
123 139
 		FunctionParameter[] normalizedParameters = new FunctionParameter[parameters.length];
124 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 145
 	public int getNumberOfTypeParameters() {
@@ -138,39 +154,39 @@ public class FunctionHeader {
138 154
 		return false;
139 155
 	}
140 156
 	
141
-	public FunctionHeader withReturnType(ITypeID returnType) {
142
-		return new FunctionHeader(typeParameters, returnType, thrownType, parameters);
143
-	}
144
-	
145 157
 	public FunctionHeader inferFromOverride(GlobalTypeRegistry registry, FunctionHeader overridden) {
146 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 161
 			resultReturnType = overridden.returnType;
150 162
 		
151
-		ITypeID resultThrownType = this.thrownType;
163
+		StoredType resultThrownType = this.thrownType;
152 164
 		if (resultThrownType == null && overridden.thrownType != null)
153 165
 			resultThrownType = overridden.thrownType;
154 166
 		
155 167
 		FunctionParameter[] resultParameters = Arrays.copyOf(parameters, parameters.length);
156 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 170
 				FunctionParameter parameter = resultParameters[i];
159 171
 				FunctionParameter original = overridden.parameters[i];
160 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 183
 	public boolean matchesExactly(CallArguments arguments, TypeScope scope) {
168 184
 		if (arguments.arguments.length < minParameters || arguments.arguments.length > maxParameters)
169 185
 			return false;
170 186
 		
171
-		FunctionHeader header = fillGenericArguments(scope.getTypeRegistry(), arguments.typeArguments, scope.getLocalTypeParameters());
187
+		FunctionHeader header = fillGenericArguments(scope, arguments.typeArguments);
172 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 190
 				return false;
175 191
 		}
176 192
 		
@@ -181,7 +197,7 @@ public class FunctionHeader {
181 197
 		if (arguments.arguments.length < minParameters || arguments.arguments.length > maxParameters)
182 198
 			return false;
183 199
 		
184
-		FunctionHeader header = fillGenericArguments(scope.getTypeRegistry(), arguments.typeArguments, scope.getLocalTypeParameters());
200
+		FunctionHeader header = fillGenericArguments(scope, arguments.typeArguments);
185 201
 		for (int i = 0; i < header.parameters.length; i++) {
186 202
 			if (!scope.getTypeMembers(arguments.arguments[i].type).canCastImplicit(header.parameters[i].type))
187 203
 				return false;
@@ -201,6 +217,8 @@ public class FunctionHeader {
201 217
 			}
202 218
 			result.append('>');
203 219
 		}
220
+		if (storage != null)
221
+			result.append(storage);
204 222
 		result.append('(');
205 223
 		for (int i = 0; i < parameters.length; i++) {
206 224
 			if (i > 0)
@@ -211,15 +229,15 @@ public class FunctionHeader {
211 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 233
 		if (arguments.arguments.length != this.parameters.length)
216 234
 			return null;
217 235
 		
218
-		Map<TypeParameter, ITypeID> mapping = new HashMap<>();
236
+		Map<TypeParameter, StoredType> mapping = new HashMap<>();
219 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 241
 					mapping = temp;
224 242
 					break;
225 243
 				}
@@ -227,14 +245,18 @@ public class FunctionHeader {
227 245
 		}
228 246
 		
229 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 251
 				return null;
252
+			
253
+			mapping.putAll(forParameter);
254
+		}
233 255
 		
234 256
 		if (mapping.size() > typeParameters.length)
235 257
 			return null;
236 258
 		
237
-		ITypeID[] result = new ITypeID[typeParameters.length];
259
+		StoredType[] result = new StoredType[typeParameters.length];
238 260
 		for (int i = 0; i < typeParameters.length; i++) {
239 261
 			TypeParameter typeParameter = typeParameters[i];
240 262
 			if (!mapping.containsKey(typeParameter)) {
@@ -272,11 +294,11 @@ public class FunctionHeader {
272 294
 			throw new NullPointerException();
273 295
 		if (parameters.length != other.parameters.length)
274 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 298
 			return false;
277 299
 		
278 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 302
 				continue;
281 303
 			
282 304
 			if (parameters[i].variadic != other.parameters[i].variadic)
@@ -300,7 +322,7 @@ public class FunctionHeader {
300 322
 			return false;
301 323
 		
302 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 326
 				return false;
305 327
 		}
306 328
 		
@@ -341,54 +363,46 @@ public class FunctionHeader {
341 363
 	
342 364
 	public FunctionHeader instanceForCall(GlobalTypeRegistry registry, CallArguments arguments) {
343 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 368
 		} else {
352 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 382
 		FunctionParameter[] parameters = new FunctionParameter[this.parameters.length];
367 383
 		for (int i = 0; i < parameters.length; i++) {
368 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 390
 		if (arguments == null || arguments.length == 0)
375 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 397
 		FunctionParameter[] parameters = new FunctionParameter[this.parameters.length];
384 398
 		for (int i = 0; i < parameters.length; i++) {
385 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 404
 	public FunctionHeader forTypeParameterInference() {
391
-		return new FunctionHeader(BasicTypeID.UNDETERMINED, parameters);
405
+		return new FunctionHeader(BasicTypeID.UNDETERMINED.stored, parameters);
392 406
 	}
393 407
 	
394 408
 	public FunctionHeader forLambda(FunctionHeader lambdaHeader) {
@@ -396,7 +410,7 @@ public class FunctionHeader {
396 410
 		for (int i = 0; i < lambdaHeader.parameters.length; i++)
397 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 416
 	public FunctionParameter getVariadicParameter() {
@@ -462,23 +476,23 @@ public class FunctionHeader {
462 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 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 485
 				return true;
472 486
 		
473 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 492
 			return true;
479 493
 		
480 494
 		for (FunctionParameter parameter : parameters)
481
-			if (parameter.type == BasicTypeID.UNDETERMINED)
495
+			if (parameter.type.type == BasicTypeID.UNDETERMINED)
482 496
 				return true;
483 497
 		
484 498
 		return false;

+ 19
- 20
CodeModel/src/main/java/org/openzen/zenscript/codemodel/FunctionParameter.java 查看文件

@@ -5,12 +5,13 @@
5 5
  */
6 6
 package org.openzen.zenscript.codemodel;
7 7
 
8
-import org.openzen.zenscript.codemodel.annotations.Annotation;
9 8
 import java.util.Objects;
10 9
 import org.openzen.zencode.shared.Taggable;
11 10
 import org.openzen.zenscript.codemodel.expression.Expression;
11
+import org.openzen.zenscript.codemodel.type.BasicTypeID;
12 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,45 +20,49 @@ import org.openzen.zenscript.codemodel.type.ITypeID;
19 20
 public class FunctionParameter extends Taggable {
20 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 25
 	public final String name;
25 26
 	public Expression defaultValue;
26 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 31
 		this.type = type;
31 32
 		this.name = "";
32 33
 		this.defaultValue = null;
33 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 43
 		this.type = type;
39 44
 		this.name = name;
40 45
 		this.defaultValue = null;
41 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 51
 		this.type = type;
47 52
 		this.name = name;
48 53
 		this.defaultValue = defaultValue;
49 54
 		this.variadic = variadic;
50 55
 	}
51 56
 	
52
-	public FunctionParameter normalized(GlobalTypeRegistry registry) {
57
+	public FunctionParameter normalize(GlobalTypeRegistry registry) {
53 58
 		FunctionParameter result = new FunctionParameter(type.getNormalized(), name, defaultValue, variadic);
54 59
 		result.annotations = this.annotations;
55 60
 		return result;
56 61
 	}
57 62
 	
58 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 66
 			return this;
62 67
 		
63 68
 		FunctionParameter result = new FunctionParameter(instanced, name, defaultValue, variadic);
@@ -91,12 +96,6 @@ public class FunctionParameter extends Taggable {
91 96
 			return false;
92 97
 		}
93 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 查看文件

@@ -11,7 +11,7 @@ import java.util.Map;
11 11
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
12 12
 import org.openzen.zenscript.codemodel.type.GenericTypeID;
13 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,52 +21,52 @@ public class GenericMapper {
21 21
 	public static final GenericMapper EMPTY = new GenericMapper(null, Collections.emptyMap());
22 22
 	
23 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 27
 		this.registry = registry;
28 28
 		this.mapping = mapping;
29 29
 	}
30 30
 	
31
-	public Map<TypeParameter, ITypeID> getMapping() {
31
+	public Map<TypeParameter, StoredType> getMapping() {
32 32
 		return mapping;
33 33
 	}
34 34
 	
35
-	public ITypeID map(ITypeID original) {
35
+	public StoredType map(StoredType original) {
36 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 41
 			return original;
42 42
 		
43
-		ITypeID[] mapped = new ITypeID[original.length];
43
+		StoredType[] mapped = new StoredType[original.length];
44 44
 		for (int i = 0; i < original.length; i++)
45 45
 			mapped[i] = original[i].instance(this);
46 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 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 62
 		resultMap.putAll(mapping);
63 63
 		return new GenericMapper(registry, resultMap);
64 64
 	}
65 65
 	
66 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 68
 		for (TypeParameter parameter : parameters)
69
-			resultMap.put(parameter, registry.getGeneric(parameter));
69
+			resultMap.put(parameter, new StoredType(registry.getGeneric(parameter), null));
70 70
 		return new GenericMapper(registry, resultMap);
71 71
 	}
72 72
 	
@@ -78,7 +78,7 @@ public class GenericMapper {
78 78
 		StringBuilder result = new StringBuilder();
79 79
 		result.append('{');
80 80
 		boolean first = true;
81
-		for (Map.Entry<TypeParameter, ITypeID> entry : mapping.entrySet()) {
81
+		for (Map.Entry<TypeParameter, StoredType> entry : mapping.entrySet()) {
82 82
 			if (first) {
83 83
 				first = false;
84 84
 			} else {

CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/GenericName.java → CodeModel/src/main/java/org/openzen/zenscript/codemodel/GenericName.java 查看文件

@@ -3,9 +3,13 @@
3 3
  * To change this template file, choose Tools | Templates
4 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 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,13 +17,13 @@ import java.util.List;
13 17
  */
14 18
 public class GenericName {
15 19
 	public final String name;
16
-	public final ITypeID[] arguments;
20
+	public final StoredType[] arguments;
17 21
 	
18 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 27
 		if (arguments == null)
24 28
 			throw new NullPointerException("Arguments cannot be null");
25 29
 		
@@ -39,7 +43,7 @@ public class GenericName {
39 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 47
 		while (index < name.size()) {
44 48
 			GenericName innerName = name.get(index++);
45 49
 			type = type.getInnerType(innerName, registry);

+ 47
- 6
CodeModel/src/main/java/org/openzen/zenscript/codemodel/HighLevelDefinition.java 查看文件

@@ -6,7 +6,9 @@
6 6
 package org.openzen.zenscript.codemodel;
7 7
 
8 8
 import java.util.ArrayList;
9
+import java.util.HashSet;
9 10
 import java.util.List;
11
+import java.util.Set;
10 12
 import org.openzen.zencode.shared.CodePosition;
11 13
 import org.openzen.zencode.shared.Taggable;
12 14
 import org.openzen.zenscript.codemodel.annotations.DefinitionAnnotation;
@@ -25,7 +27,8 @@ import org.openzen.zenscript.codemodel.member.IDefinitionMember;
25 27
 import org.openzen.zenscript.codemodel.member.ImplementationMember;
26 28
 import org.openzen.zenscript.codemodel.member.InnerDefinitionMember;
27 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,7 +45,7 @@ public abstract class HighLevelDefinition extends Taggable {
42 45
 	public DefinitionAnnotation[] annotations = DefinitionAnnotation.NONE;
43 46
 	
44 47
 	public HighLevelDefinition outerDefinition;
45
-	private ITypeID superType;
48
+	private TypeID superType;
46 49
 	
47 50
 	private boolean isDestructible = false;
48 51
 	
@@ -72,16 +75,26 @@ public abstract class HighLevelDefinition extends Taggable {
72 75
 		return pkg.fullName + '.' + name;
73 76
 	}
74 77
 	
75
-	public ITypeID getSuperType() {
78
+	public TypeID getSuperType() {
76 79
 		return superType;
77 80
 	}
78 81
 	
79
-	public void setSuperType(ITypeID superType) {
82
+	public void setSuperType(TypeID superType) {
80 83
 		this.superType = superType;
81 84
 		if (outerDefinition != null)
82 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 98
 	public int getNumberOfGenericParameters() {
86 99
 		return typeParameters == null ? 0 : typeParameters.length;
87 100
 	}
@@ -113,15 +126,30 @@ public abstract class HighLevelDefinition extends Taggable {
113 126
 	}
114 127
 	
115 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 139
 		boolean isDestructible = false;
117 140
 		for (IDefinitionMember member : members) {
118 141
 			if (member instanceof DestructorMember)
119 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 148
 			if ((member instanceof ImplementationMember) && ((ImplementationMember)member).type.isDestructible())
123 149
 				isDestructible = true;
124 150
 		}
151
+		
152
+		scanning.remove(this);
125 153
 		return isDestructible;
126 154
 	}
127 155
 	
@@ -129,6 +157,10 @@ public abstract class HighLevelDefinition extends Taggable {
129 157
 		this.typeParameters = typeParameters;
130 158
 	}
131 159
 	
160
+	public AccessScope getAccessScope() {
161
+		return new AccessScope(module, this);
162
+	}
163
+	
132 164
 	public List<FieldMember> getFields() {
133 165
 		List<FieldMember> fields = new ArrayList<>();
134 166
 		for (IDefinitionMember member : members)
@@ -195,4 +227,13 @@ public abstract class HighLevelDefinition extends Taggable {
195 227
 		
196 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 查看文件

@@ -13,7 +13,7 @@ public class Modifiers {
13 13
 	private Modifiers() {}
14 14
 	
15 15
 	public static final int PUBLIC = 1;
16
-	public static final int EXPORT = 2;
16
+	public static final int INTERNAL = 2;
17 17
 	public static final int PRIVATE = 4;
18 18
 	public static final int ABSTRACT = 8;
19 19
 	public static final int FINAL = 16;
@@ -30,8 +30,8 @@ public class Modifiers {
30 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 37
 	public static boolean isProtected(int modifiers) {
@@ -77,4 +77,8 @@ public class Modifiers {
77 77
 	public static boolean isOverride(int modifiers) {
78 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 查看文件

@@ -5,13 +5,11 @@
5 5
  */
6 6
 package org.openzen.zenscript.codemodel;
7 7
 
8
-import org.openzen.zencode.shared.Taggable;
9
-
10 8
 /**
11 9
  *
12 10
  * @author Hoofdgebruiker
13 11
  */
14
-public class Module extends Taggable {
12
+public class Module {
15 13
 	public static final Module BUILTIN = new Module("builtin");
16 14
 	
17 15
 	public final String name;
@@ -19,4 +17,9 @@ public class Module extends Taggable {
19 17
 	public Module(String name) {
20 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 查看文件

@@ -5,9 +5,13 @@
5 5
  */
6 6
 package org.openzen.zenscript.codemodel;
7 7
 
8
+import java.util.ArrayList;
8 9
 import java.util.List;
10
+import org.openzen.zencode.shared.ConcatMap;
9 11
 import org.openzen.zencode.shared.Taggable;
10 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 15
 import org.openzen.zenscript.codemodel.statement.Statement;
12 16
 
13 17
 /**
@@ -15,16 +19,28 @@ import org.openzen.zenscript.codemodel.statement.Statement;
15 19
  * @author Hoofdgebruiker
16 20
  */
17 21
 public class ScriptBlock extends Taggable {
22
+	public final Module module;
18 23
 	public final ZSPackage pkg;
19 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 28
 		this.pkg = pkg;
23 29
 		this.statements = statements;
24 30
 	}
25 31
 	
26 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 44
 		result.addAllTagsFrom(this);
29 45
 		return result;
30 46
 	}

+ 2
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/WhitespaceInfo.java 查看文件

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

+ 2
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/WhitespacePostComment.java 查看文件

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

+ 2
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/AnnotationDefinition.java 查看文件

@@ -43,7 +43,7 @@ public interface AnnotationDefinition {
43 43
 	
44 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 48
 	public MemberAnnotation deserializeForMember(CodeSerializationInput input, TypeContext context, IDefinitionMember member);
49 49
 	
@@ -51,5 +51,5 @@ public interface AnnotationDefinition {
51 51
 	
52 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 查看文件

@@ -0,0 +1,102 @@
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 查看文件

@@ -0,0 +1,56 @@
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 查看文件

@@ -0,0 +1,70 @@
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 查看文件

@@ -0,0 +1,42 @@
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 查看文件

@@ -0,0 +1,44 @@
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 查看文件

@@ -22,6 +22,7 @@ import org.openzen.zenscript.codemodel.scope.StatementScope;
22 22
 import org.openzen.zenscript.codemodel.serialization.CodeSerializationInput;
23 23
 import org.openzen.zenscript.codemodel.statement.Statement;
24 24
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
25
+import org.openzen.zenscript.codemodel.type.StringTypeID;
25 26
 
26 27
 /**
27 28
  *
@@ -31,7 +32,7 @@ public class NativeAnnotationDefinition implements AnnotationDefinition {
31 32
 	public static final NativeAnnotationDefinition INSTANCE = new NativeAnnotationDefinition();
32 33
 	
33 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 37
 	private NativeAnnotationDefinition() {}
37 38
 
@@ -85,7 +86,7 @@ public class NativeAnnotationDefinition implements AnnotationDefinition {
85 86
 	}
86 87
 
87 88
 	@Override
88
-	public Annotation createForParameter(CodePosition position, CallArguments arguments) {
89
+	public ParameterAnnotation createForParameter(CodePosition position, CallArguments arguments) {
89 90
 		throw new UnsupportedOperationException("Not supported");
90 91
 	}
91 92
 
@@ -107,7 +108,7 @@ public class NativeAnnotationDefinition implements AnnotationDefinition {
107 108
 	}
108 109
 
109 110
 	@Override
110
-	public Annotation deserializeForParameter(CodeSerializationInput input, TypeContext context) {
111
+	public ParameterAnnotation deserializeForParameter(CodeSerializationInput input, TypeContext context) {
111 112
 		throw new UnsupportedOperationException("Not supported");
112 113
 	}
113 114
 }

+ 3
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/NativeTag.java 查看文件

@@ -5,11 +5,13 @@
5 5
  */
6 6
 package org.openzen.zenscript.codemodel.annotations;
7 7
 
8
+import org.openzen.zencode.shared.Tag;
9
+
8 10
 /**
9 11
  *
10 12
  * @author Hoofdgebruiker
11 13
  */
12
-public class NativeTag {
14
+public class NativeTag implements Tag {
13 15
 	public final String value;
14 16
 	
15 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 查看文件

@@ -9,8 +9,8 @@ package org.openzen.zenscript.codemodel.annotations;
9 9
  *
10 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 15
 	public AnnotationDefinition getDefinition();
16 16
 	

+ 9
- 7
CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/PreconditionAnnotationDefinition.java 查看文件

@@ -26,7 +26,9 @@ import org.openzen.zenscript.codemodel.scope.StatementScope;
26 26
 import org.openzen.zenscript.codemodel.serialization.CodeSerializationInput;
27 27
 import org.openzen.zenscript.codemodel.statement.Statement;
28 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,10 +51,10 @@ public class PreconditionAnnotationDefinition implements AnnotationDefinition {
49 51
 	@Override
50 52
 	public List<FunctionHeader> getInitializers(BaseScope scope) {
51 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 60
 	@Override
@@ -104,7 +106,7 @@ public class PreconditionAnnotationDefinition implements AnnotationDefinition {
104 106
 	}
105 107
 
106 108
 	@Override
107
-	public Annotation createForParameter(CodePosition position, CallArguments arguments) {
109
+	public ParameterAnnotation createForParameter(CodePosition position, CallArguments arguments) {
108 110
 		throw new UnsupportedOperationException("Not supported");
109 111
 	}
110 112
 
@@ -129,7 +131,7 @@ public class PreconditionAnnotationDefinition implements AnnotationDefinition {
129 131
 	}
130 132
 
131 133
 	@Override
132
-	public Annotation deserializeForParameter(CodeSerializationInput input, TypeContext context) {
134
+	public ParameterAnnotation deserializeForParameter(CodeSerializationInput input, TypeContext context) {
133 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 查看文件

@@ -9,6 +9,7 @@ import java.util.ArrayList;
9 9
 import java.util.Arrays;
10 10
 import java.util.List;
11 11
 import org.openzen.zencode.shared.CodePosition;
12
+import org.openzen.zencode.shared.CompileException;
12 13
 import org.openzen.zenscript.codemodel.context.StatementContext;
13 14
 import org.openzen.zenscript.codemodel.context.TypeContext;
14 15
 import org.openzen.zenscript.codemodel.expression.Expression;
@@ -83,19 +84,25 @@ public class PreconditionForMethod implements MemberAnnotation {
83 84
 		if (body == null)
84 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 108
 	@Override

+ 5
- 5
CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/CompilingPackage.java 查看文件

@@ -12,8 +12,8 @@ import org.openzen.zenscript.codemodel.HighLevelDefinition;
12 12
 import org.openzen.zenscript.codemodel.Module;
13 13
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
14 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,11 +71,11 @@ public class CompilingPackage {
71 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 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 79
 		if (index == name.size())
80 80
 			return null;
81 81
 		
@@ -91,7 +91,7 @@ public class CompilingPackage {
91 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 95
 		if (index == name.size())
96 96
 			return result;
97 97
 		

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/CompilingType.java 查看文件

@@ -8,7 +8,7 @@ package org.openzen.zenscript.codemodel.context;
8 8
 import java.util.List;
9 9
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
10 10
 import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
11
-import org.openzen.zenscript.codemodel.type.GenericName;
11
+import org.openzen.zenscript.codemodel.GenericName;
12 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 查看文件

@@ -9,11 +9,15 @@ import java.util.HashMap;
9 9
 import java.util.List;
10 10
 import java.util.Map;
11 11
 import org.openzen.zencode.shared.CodePosition;
12
+import org.openzen.zencode.shared.CompileExceptionCode;
12 13
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
13 14
 import org.openzen.zenscript.codemodel.annotations.AnnotationDefinition;
14
-import org.openzen.zenscript.codemodel.type.GenericName;
15
+import org.openzen.zenscript.codemodel.GenericName;
15 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,24 +48,33 @@ public class FileResolutionContext implements TypeResolutionContext {
44 48
 	}
45 49
 
46 50
 	@Override
47
-	public ITypeID getType(CodePosition position, List<GenericName> name) {
51
+	public TypeID getType(CodePosition position, List<GenericName> name) {
48 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 57
 			return GenericName.getInnerType(
50 58
 					getTypeRegistry(),
51
-					getTypeRegistry().getForDefinition(imports.get(name.get(0).name), name.get(0).arguments),
59
+					getTypeRegistry().getForDefinition(definition, name.get(0).arguments),
52 60
 					name,
53 61
 					1);
54 62
 		}
55 63
 		
56
-		ITypeID moduleType = modulePackage.getType(this, name);
64
+		TypeID moduleType = modulePackage.getType(this, name);
57 65
 		if (moduleType != null)
58 66
 			return moduleType;
59 67
 		
60 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 76
 	@Override
64
-	public ITypeID getThisType() {
77
+	public StoredType getThisType() {
65 78
 		return null;
66 79
 	}
67 80
 }

+ 18
- 5
CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/LocalTypeResolutionContext.java 查看文件

@@ -10,9 +10,13 @@ import org.openzen.zencode.shared.CodePosition;
10 10
 import org.openzen.zenscript.codemodel.annotations.AnnotationDefinition;
11 11
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
12 12
 import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
13
-import org.openzen.zenscript.codemodel.type.GenericName;
13
+import org.openzen.zenscript.codemodel.GenericName;
14 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,7 +44,7 @@ public class LocalTypeResolutionContext implements TypeResolutionContext {
40 44
 	}
41 45
 
42 46
 	@Override
43
-	public ITypeID getType(CodePosition position, List<GenericName> name) {
47
+	public TypeID getType(CodePosition position, List<GenericName> name) {
44 48
 		if (type != null) {
45 49
 			CompilingType compiling = type.getInner(name.get(0).name);
46 50
 			if (compiling != null) {
@@ -57,9 +61,18 @@ public class LocalTypeResolutionContext implements TypeResolutionContext {
57 61
 		
58 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 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 查看文件

@@ -9,12 +9,17 @@ import java.util.HashMap;
9 9
 import java.util.List;
10 10
 import java.util.Map;
11 11
 import org.openzen.zencode.shared.CodePosition;
12
+import org.openzen.zencode.shared.CompileExceptionCode;
12 13
 import org.openzen.zenscript.codemodel.annotations.AnnotationDefinition;
13 14
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
14
-import org.openzen.zenscript.codemodel.type.GenericName;
15
+import org.openzen.zenscript.codemodel.GenericName;
15 16
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
16 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,6 +28,7 @@ import org.openzen.zenscript.codemodel.type.ITypeID;
23 28
 public class ModuleTypeResolutionContext implements TypeResolutionContext {
24 29
 	private final GlobalTypeRegistry registry;
25 30
 	private final Map<String, AnnotationDefinition> annotations = new HashMap<>();
31
+	private final Map<String, StorageType> storageTypes = new HashMap<>();
26 32
 	private final Map<String, ISymbol> globals;
27 33
 	private final ZSPackage rootPackage;
28 34
 	
@@ -31,6 +37,7 @@ public class ModuleTypeResolutionContext implements TypeResolutionContext {
31 37
 	public ModuleTypeResolutionContext(
32 38
 			GlobalTypeRegistry registry,
33 39
 			AnnotationDefinition[] annotations,
40
+			StorageType[] storageTypes,
34 41
 			ZSPackage rootPackage,
35 42
 			CompilingPackage rootCompiling,
36 43
 			Map<String, ISymbol> globals)
@@ -42,6 +49,8 @@ public class ModuleTypeResolutionContext implements TypeResolutionContext {
42 49
 		
43 50
 		for (AnnotationDefinition annotation : annotations)
44 51
 			this.annotations.put(annotation.getAnnotationName(), annotation);
52
+		for (StorageType storageType : storageTypes)
53
+			this.storageTypes.put(storageType.getName(), storageType);
45 54
 	}
46 55
 	
47 56
 	@Override
@@ -55,9 +64,9 @@ public class ModuleTypeResolutionContext implements TypeResolutionContext {
55 64
 	}
56 65
 
57 66
 	@Override
58
-	public ITypeID getType(CodePosition position, List<GenericName> name) {
67
+	public TypeID getType(CodePosition position, List<GenericName> name) {
59 68
 		if (rootCompiling != null) {
60
-			ITypeID compiling = rootCompiling.getType(this, name);
69
+			TypeID compiling = rootCompiling.getType(this, name);
61 70
 			if (compiling != null)
62 71
 				return compiling;
63 72
 		}
@@ -69,7 +78,15 @@ public class ModuleTypeResolutionContext implements TypeResolutionContext {
69 78
 	}
70 79
 	
71 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 90
 		return null;
74 91
 	}
75 92
 }

+ 3
- 3
CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/StatementContext.java 查看文件

@@ -15,7 +15,7 @@ import org.openzen.zenscript.codemodel.expression.switchvalue.VariantOptionSwitc
15 15
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
16 16
 import org.openzen.zenscript.codemodel.statement.LoopStatement;
17 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,7 +30,7 @@ public class StatementContext extends TypeContext {
30 30
 	
31 31
 	public VariantOptionSwitchValue variantOptionSwitchValue;
32 32
 	
33
-	public StatementContext(ModuleContext module, ITypeID thisType) {
33
+	public StatementContext(ModuleContext module, StoredType thisType) {
34 34
 		super(module, TypeParameter.NONE, thisType);
35 35
 		
36 36
 		loops = LoopStatement.NONE;
@@ -39,7 +39,7 @@ public class StatementContext extends TypeContext {
39 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 43
 		super(module, header.typeParameters, thisType);
44 44
 		
45 45
 		loops = LoopStatement.NONE;

+ 7
- 10
CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/TypeContext.java 查看文件

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

+ 8
- 4
CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/TypeResolutionContext.java 查看文件

@@ -8,9 +8,11 @@ package org.openzen.zenscript.codemodel.context;
8 8
 import java.util.List;
9 9
 import org.openzen.zencode.shared.CodePosition;
10 10
 import org.openzen.zenscript.codemodel.annotations.AnnotationDefinition;
11
-import org.openzen.zenscript.codemodel.type.GenericName;
11
+import org.openzen.zenscript.codemodel.GenericName;
12 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,7 +23,9 @@ public interface TypeResolutionContext {
21 23
 	
22 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 查看文件

@@ -9,20 +9,20 @@ import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
10 10
 import org.openzen.zenscript.codemodel.Module;
11 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 16
  * @author Hoofdgebruiker
17 17
  */
18 18
 public class AliasDefinition extends HighLevelDefinition {
19
-	public ITypeID type;
19
+	public TypeID type;
20 20
 	
21 21
 	public AliasDefinition(CodePosition position, Module module, ZSPackage pkg, String name, int modifiers, HighLevelDefinition outerDefinition) {
22 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 26
 		if (type == null)
27 27
 			throw new NullPointerException("type cannot be null!");
28 28
 		

+ 2
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/definition/EnumDefinition.java 查看文件

@@ -11,12 +11,14 @@ import org.openzen.zencode.shared.CodePosition;
11 11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12 12
 import org.openzen.zenscript.codemodel.Module;
13 13
 import org.openzen.zenscript.codemodel.member.EnumConstantMember;
14
+import org.openzen.zenscript.codemodel.type.TypeID;
14 15
 
15 16
 /**
16 17
  *
17 18
  * @author Hoofdgebruiker
18 19
  */
19 20
 public class EnumDefinition extends HighLevelDefinition {
21
+	public TypeID asType;
20 22
 	public List<EnumConstantMember> enumConstants = new ArrayList<>();
21 23
 	
22 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 查看文件

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

+ 6
- 7
CodeModel/src/main/java/org/openzen/zenscript/codemodel/definition/FunctionDefinition.java 查看文件

@@ -15,8 +15,9 @@ import org.openzen.zenscript.codemodel.member.CallerMember;
15 15
 import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
16 16
 import org.openzen.zenscript.codemodel.statement.Statement;
17 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 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,13 +25,12 @@ import org.openzen.zenscript.codemodel.type.member.TypeMemberPriority;
24 25
  */
25 26
 public class FunctionDefinition extends HighLevelDefinition {
26 27
 	public FunctionHeader header;
27
-	public Statement statement;
28 28
 	public CallerMember caller;
29
-	public final DefinitionMemberGroup callerGroup;
29
+	public final TypeMemberGroup callerGroup;
30 30
 	
31 31
 	public FunctionDefinition(CodePosition position, Module module, ZSPackage pkg, String name, int modifiers, HighLevelDefinition outerDefinition) {
32 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 36
 	public FunctionDefinition(CodePosition position, Module module, ZSPackage pkg, String name, int modifiers, FunctionHeader header, GlobalTypeRegistry registry) {
@@ -40,12 +40,11 @@ public class FunctionDefinition extends HighLevelDefinition {
40 40
 	
41 41
 	public void setHeader(GlobalTypeRegistry registry, FunctionHeader header) {
42 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 47
 	public void setCode(Statement statement) {
48
-		this.statement = statement;
49 48
 		caller.setBody(statement);
50 49
 	}
51 50
 

+ 4
- 4
CodeModel/src/main/java/org/openzen/zenscript/codemodel/definition/InterfaceDefinition.java 查看文件

@@ -10,26 +10,26 @@ import java.util.List;
10 10
 import org.openzen.zencode.shared.CodePosition;
11 11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12 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 17
  * @author Hoofdgebruiker
18 18
  */
19 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 22
 	public InterfaceDefinition(CodePosition position, Module module, ZSPackage pkg, String name, int modifiers, HighLevelDefinition outerDefinition) {
23 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 27
 		baseInterfaces.add(baseInterface);
28 28
 	}
29 29
 	
30 30
 	@Override
31 31
 	public boolean isDestructible() {
32
-		for (ITypeID baseInterface : baseInterfaces)
32
+		for (TypeID baseInterface : baseInterfaces)
33 33
 			if (baseInterface.isDestructible())
34 34
 				return true;
35 35
 		

+ 6
- 4
CodeModel/src/main/java/org/openzen/zenscript/codemodel/definition/VariantDefinition.java 查看文件

@@ -13,7 +13,7 @@ import org.openzen.zenscript.codemodel.GenericMapper;
13 13
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
14 14
 import org.openzen.zenscript.codemodel.Module;
15 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,19 +45,21 @@ public class VariantDefinition extends HighLevelDefinition {
45 45
 	}
46 46
 	
47 47
 	public static class Option extends Taggable {
48
+		public final CodePosition position;
48 49
 		public final VariantDefinition variant;
49 50
 		public final String name;
50 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 56
 			this.variant = variant;
55 57
 			this.name = name;
56 58
 			this.ordinal = ordinal;
57 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 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 查看文件

@@ -17,9 +17,9 @@ import org.openzen.zenscript.codemodel.partial.IPartialExpression;
17 17
 import org.openzen.zenscript.codemodel.partial.PartialPackageExpression;
18 18
 import org.openzen.zenscript.codemodel.partial.PartialTypeExpression;
19 19
 import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
20
-import org.openzen.zenscript.codemodel.type.GenericName;
20
+import org.openzen.zenscript.codemodel.GenericName;
21 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,7 +50,7 @@ public class ZSPackage {
50 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 54
 		if (subPackages.containsKey(name.name) && name.hasNoArguments())
55 55
 			return new PartialPackageExpression(position, subPackages.get(name.name));
56 56
 		
@@ -85,11 +85,11 @@ public class ZSPackage {
85 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 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 93
 		if (types.containsKey(name.name)) {
94 94
 			return context.getTypeRegistry().getForDefinition(types.get(name.name), name.arguments);
95 95
 		}
@@ -97,7 +97,7 @@ public class ZSPackage {
97 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 101
 		if (depth >= nameParts.size())
102 102
 			return null;
103 103
 		

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/AndAndExpression.java 查看文件

@@ -18,7 +18,7 @@ public class AndAndExpression extends Expression {
18 18
 	public final Expression right;
19 19
 	
20 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 23
 		this.left = left;
24 24
 		this.right = right;

+ 5
- 4
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ArrayExpression.java 查看文件

@@ -8,6 +8,7 @@ package org.openzen.zenscript.codemodel.expression;
8 8
 import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.scope.TypeScope;
10 10
 import org.openzen.zenscript.codemodel.type.ArrayTypeID;
11
+import org.openzen.zenscript.codemodel.type.StoredType;
11 12
 
12 13
 /**
13 14
  *
@@ -17,11 +18,11 @@ public class ArrayExpression extends Expression {
17 18
 	public final Expression[] expressions;
18 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 22
 		super(position, type, multiThrow(position, expressions));
22 23
 		
23 24
 		this.expressions = expressions;
24
-		this.arrayType = type;
25
+		this.arrayType = (ArrayTypeID)type.type;
25 26
 	}
26 27
 
27 28
 	@Override
@@ -37,7 +38,7 @@ public class ArrayExpression extends Expression {
37 38
 	@Override
38 39
 	public Expression transform(ExpressionTransformer transformer) {
39 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 44
 	@Override
@@ -45,6 +46,6 @@ public class ArrayExpression extends Expression {
45 46
 		Expression[] normalized = new Expression[expressions.length];
46 47
 		for (int i = 0; i < normalized.length; i++)
47 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 查看文件

@@ -7,11 +7,10 @@ package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import java.util.Arrays;
9 9
 import org.openzen.zencode.shared.CodePosition;
10
-import org.openzen.zencode.shared.CompileException;
11 10
 import org.openzen.zencode.shared.CompileExceptionCode;
12 11
 import org.openzen.zenscript.codemodel.FunctionHeader;
13 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,17 +19,17 @@ import org.openzen.zenscript.codemodel.type.ITypeID;
20 19
 public class CallArguments {
21 20
 	public static final CallArguments EMPTY = new CallArguments(new Expression[0]);
22 21
 	
23
-	public final ITypeID[] typeArguments;
22
+	public final StoredType[] typeArguments;
24 23
 	public final Expression[] arguments;
25 24
 	
26 25
 	public CallArguments(Expression... arguments) {
27
-		this.typeArguments = ITypeID.NONE;
26
+		this.typeArguments = StoredType.NONE;
28 27
 		this.arguments = arguments;
29 28
 	}
30 29
 	
31
-	public CallArguments(ITypeID[] typeArguments, Expression[] arguments) {
30
+	public CallArguments(StoredType[] typeArguments, Expression[] arguments) {
32 31
 		if (typeArguments == null)
33
-			typeArguments = ITypeID.NONE;
32
+			typeArguments = StoredType.NONE;
34 33
 		if (arguments == null)
35 34
 			throw new IllegalArgumentException("Arguments cannot be null!");
36 35
 		
@@ -38,8 +37,8 @@ public class CallArguments {
38 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 42
 		this.arguments = new Expression[dummy.length];
44 43
 		for (int i = 0; i < dummy.length; i++)
45 44
 			arguments[i] = new DummyExpression(dummy[i]);
@@ -58,15 +57,16 @@ public class CallArguments {
58 57
 		CallArguments result = this;
59 58
 		
60 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 63
 		if (arguments.length < header.parameters.length) {
65 64
 			Expression[] newArguments = Arrays.copyOf(arguments, header.parameters.length);
66 65
 			for (int i = arguments.length; i < header.parameters.length; i++) {
67 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 71
 			result = new CallArguments(typeArguments, newArguments);
72 72
 		}

+ 3
- 3
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CallStaticExpression.java 查看文件

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

+ 2
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CapturedExpression.java 查看文件

@@ -7,7 +7,7 @@ package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.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,7 +16,7 @@ import org.openzen.zenscript.codemodel.type.ITypeID;
16 16
 public abstract class CapturedExpression extends Expression {
17 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 20
 		super(position, type, null);
21 21
 		
22 22
 		this.closure = closure;

+ 2
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CapturedThisExpression.java 查看文件

@@ -7,14 +7,14 @@ package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9 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 14
  * @author Hoofdgebruiker
15 15
  */
16 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 18
 		super(position, type, closure);
19 19
 	}
20 20
 

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CompareExpression.java 查看文件

@@ -24,7 +24,7 @@ public class CompareExpression extends Expression {
24 24
 	public final CompareType comparison;
25 25
 	
26 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 29
 		this.left = left;
30 30
 		this.right = right;

+ 4
- 4
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConditionalExpression.java 查看文件

@@ -7,7 +7,7 @@ package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.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,10 +23,10 @@ public class ConditionalExpression extends Expression {
23 23
 			Expression condition,
24 24
 			Expression ifThen,
25 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 30
 			throw new AssertionError();
31 31
 		
32 32
 		this.condition = condition;

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantBoolExpression.java 查看文件

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

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantByteExpression.java 查看文件

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

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantCharExpression.java 查看文件

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

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantDoubleExpression.java 查看文件

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

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantFloatExpression.java 查看文件

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

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantIntExpression.java 查看文件

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

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantLongExpression.java 查看文件

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

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantSByteExpression.java 查看文件

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

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantShortExpression.java 查看文件

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

+ 2
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantStringExpression.java 查看文件

@@ -7,7 +7,7 @@ package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.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,7 +17,7 @@ public class ConstantStringExpression extends Expression {
17 17
 	public final String value;
18 18
 	
19 19
 	public ConstantStringExpression(CodePosition position, String value) {
20
-		super(position, BasicTypeID.STRING, null);
20
+		super(position, StringTypeID.STATIC, null);
21 21
 		
22 22
 		this.value = value;
23 23
 	}

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantUIntExpression.java 查看文件

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

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantULongExpression.java 查看文件

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

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantUShortExpression.java 查看文件

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

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantUSizeExpression.java 查看文件

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

+ 4
- 4
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstructorSuperCallExpression.java 查看文件

@@ -9,19 +9,19 @@ import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
10 10
 import org.openzen.zenscript.codemodel.scope.TypeScope;
11 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 16
  * @author Hoofdgebruiker
17 17
  */
18 18
 public class ConstructorSuperCallExpression extends Expression {
19
-	public final ITypeID objectType;
19
+	public final StoredType objectType;
20 20
 	public final FunctionalMemberRef constructor;
21 21
 	public final CallArguments arguments;
22 22
 	
23
-	public ConstructorSuperCallExpression(CodePosition position, ITypeID type, FunctionalMemberRef constructor, CallArguments arguments) {
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 26
 		this.objectType = type;
27 27
 		this.constructor = constructor;

+ 5
- 5
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstructorThisCallExpression.java 查看文件

@@ -9,21 +9,21 @@ import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
10 10
 import org.openzen.zenscript.codemodel.scope.TypeScope;
11 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 16
  * @author Hoofdgebruiker
17 17
  */
18 18
 public class ConstructorThisCallExpression extends Expression {
19
-	public final ITypeID objectType;
19
+	public final StoredType objectType;
20 20
 	public final FunctionalMemberRef constructor;
21 21
 	public final CallArguments arguments;
22 22
 	
23
-	public ConstructorThisCallExpression(CodePosition position, ITypeID type, FunctionalMemberRef constructor, CallArguments arguments) {
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 27
 			throw new IllegalArgumentException("Type cannot be basic type");
28 28
 		
29 29
 		this.objectType = type;

+ 2
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/DummyExpression.java 查看文件

@@ -7,14 +7,14 @@ package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9 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 14
  * @author Hoofdgebruiker
15 15
  */
16 16
 public class DummyExpression extends Expression {
17
-	public DummyExpression(ITypeID type) {
17
+	public DummyExpression(StoredType type) {
18 18
 		super(CodePosition.BUILTIN, type, null);
19 19
 	}
20 20
 

+ 5
- 4
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/EnumConstantExpression.java 查看文件

@@ -10,7 +10,8 @@ import org.openzen.zenscript.codemodel.definition.EnumDefinition;
10 10
 import org.openzen.zenscript.codemodel.member.EnumConstantMember;
11 11
 import org.openzen.zenscript.codemodel.scope.TypeScope;
12 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,14 +20,14 @@ import org.openzen.zenscript.codemodel.type.ITypeID;
19 20
 public class EnumConstantExpression extends Expression {
20 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 26
 		this.value = value;
26 27
 	}
27 28
 	
28 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 32
 		this.value = value;
32 33
 	}

+ 23
- 21
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/Expression.java 查看文件

@@ -7,6 +7,7 @@ package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import java.util.Collections;
9 9
 import java.util.List;
10
+import java.util.Objects;
10 11
 import java.util.function.Consumer;
11 12
 import java.util.stream.Collectors;
12 13
 import org.openzen.zencode.shared.CodePosition;
@@ -16,14 +17,15 @@ import org.openzen.zenscript.codemodel.FunctionHeader;
16 17
 import org.openzen.zenscript.codemodel.OperatorType;
17 18
 import org.openzen.zenscript.codemodel.member.EnumConstantMember;
18 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 21
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
22 22
 import org.openzen.zenscript.codemodel.scope.TypeScope;
23 23
 import org.openzen.zenscript.codemodel.statement.Statement;
24 24
 import org.openzen.zenscript.codemodel.statement.StatementTransformer;
25 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,13 +35,13 @@ public abstract class Expression implements IPartialExpression {
33 35
 	public static final Expression[] NONE = new Expression[0];
34 36
 	
35 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 42
 		if (type == null)
41 43
 			throw new NullPointerException();
42
-		if (type == BasicTypeID.UNDETERMINED)
44
+		if (type.type == BasicTypeID.UNDETERMINED)
43 45
 			throw new IllegalArgumentException(position + ": Cannot use undetermined type as expression type");
44 46
 		
45 47
 		this.position = position;
@@ -61,7 +63,7 @@ public abstract class Expression implements IPartialExpression {
61 63
 				if (body == function.body)
62 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 67
 			} else {
66 68
 				return expression;
67 69
 			}
@@ -71,7 +73,7 @@ public abstract class Expression implements IPartialExpression {
71 73
 	public abstract Expression normalize(TypeScope scope);
72 74
 	
73 75
 	@Override
74
-	public List<ITypeID> getAssignHints() {
76
+	public List<StoredType> getAssignHints() {
75 77
 		return Collections.singletonList(type);
76 78
 	}
77 79
 	
@@ -80,11 +82,11 @@ public abstract class Expression implements IPartialExpression {
80 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 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 90
 		return scope.getTypeMembers(type).castImplicit(position, this, asType, true);
89 91
 	}
90 92
 	
@@ -99,12 +101,12 @@ public abstract class Expression implements IPartialExpression {
99 101
 	}
100 102
 	
101 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 105
 		return scope.getTypeMembers(type).getOrCreateGroup(OperatorType.CALL).predictCallTypes(scope, hints, arguments);
104 106
 	}
105 107
 	
106 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 110
 		return scope.getTypeMembers(type)
109 111
 				.getOrCreateGroup(OperatorType.CALL)
110 112
 				.getMethodMembers().stream()
@@ -114,12 +116,12 @@ public abstract class Expression implements IPartialExpression {
114 116
 	}
115 117
 	
116 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 120
 		return scope.getTypeMembers(type).getOrCreateGroup(OperatorType.CALL).call(position, scope, this, arguments, false);
119 121
 	}
120 122
 	
121 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 125
 		TypeMembers members = scope.getTypeMembers(type);
124 126
 		IPartialExpression result = members.getMemberExpression(position, scope, this, name, false);
125 127
 		if (result == null)
@@ -128,7 +130,7 @@ public abstract class Expression implements IPartialExpression {
128 130
 	}
129 131
 	
130 132
 	@Override
131
-	public ITypeID[] getGenericCallTypes() {
133
+	public StoredType[] getTypeArguments() {
132 134
 		return null;
133 135
 	}
134 136
 	
@@ -144,19 +146,19 @@ public abstract class Expression implements IPartialExpression {
144 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 151
 			return left;
150 152
 		else if (left == null)
151 153
 			return right;
152 154
 		else if (right == null)
153 155
 			return left;
154 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 162
 		for (Expression expression : expressions)
161 163
 			result = binaryThrow(position, result, expression.thrownType);
162 164
 		return result;

+ 13
- 11
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ExpressionBuilder.java 查看文件

@@ -13,10 +13,12 @@ import org.openzen.zencode.shared.CompileExceptionCode;
13 13
 import org.openzen.zenscript.codemodel.OperatorType;
14 14
 import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
15 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 20
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
21
+import org.openzen.zenscript.codemodel.type.storage.UniqueStorageTag;
20 22
 import stdlib.Strings;
21 23
 
22 24
 /**
@@ -32,21 +34,21 @@ public class ExpressionBuilder {
32 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 38
 		String[] nameParts = Strings.split(typename, '.');
37 39
 		List<GenericName> name = new ArrayList<>();
38 40
 		for (String namePart : nameParts)
39 41
 			name.add(new GenericName(namePart));
40
-		ITypeID type = scope.getType(position, name);
42
+		TypeID type = scope.getType(position, name);
41 43
 		if (type == null)
42 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 52
 		CallArguments compiledArguments = new CallArguments(arguments);
51 53
 		FunctionalMemberRef member = constructors.selectMethod(position, scope, compiledArguments, true, true);
52 54
 		if (member == null)
@@ -59,10 +61,10 @@ public class ExpressionBuilder {
59 61
 				type,
60 62
 				member,
61 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 68
 		TypeMembers members = scope.getTypeMembers(value.type);
67 69
 		return members.getOrCreateGroup(OperatorType.NOT)
68 70
 				.call(position, scope, value, CallArguments.EMPTY, false);

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ExpressionVisitor.java 查看文件

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

+ 4
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ExpressionVisitorWithContext.java 查看文件

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

+ 4
- 3
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/FunctionExpression.java 查看文件

@@ -18,6 +18,7 @@ import org.openzen.zenscript.codemodel.statement.LoopStatement;
18 18
 import org.openzen.zenscript.codemodel.statement.ReturnStatement;
19 19
 import org.openzen.zenscript.codemodel.statement.Statement;
20 20
 import org.openzen.zenscript.codemodel.type.FunctionTypeID;
21
+import org.openzen.zenscript.codemodel.type.StoredType;
21 22
 
22 23
 /**
23 24
  *
@@ -30,7 +31,7 @@ public class FunctionExpression extends Expression {
30 31
 	
31 32
 	public FunctionExpression(
32 33
 			CodePosition position,
33
-			FunctionTypeID type,
34
+			StoredType type,
34 35
 			LambdaClosure closure,
35 36
 			FunctionHeader header,
36 37
 			Statement body) {
@@ -54,7 +55,7 @@ public class FunctionExpression extends Expression {
54 55
 	@Override
55 56
 	public FunctionExpression transform(ExpressionTransformer transformer) {
56 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 61
 	@Override
@@ -83,7 +84,7 @@ public class FunctionExpression extends Expression {
83 84
 
84 85
 	@Override
85 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 90
 	private static class ReturnExpressionTransformer implements ExpressionTransformer {

+ 2
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/GetFieldExpression.java 查看文件

@@ -11,7 +11,7 @@ import org.openzen.zencode.shared.CodePosition;
11 11
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
12 12
 import org.openzen.zenscript.codemodel.member.ref.FieldMemberRef;
13 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,7 +29,7 @@ public class GetFieldExpression extends Expression {
29 29
 	}
30 30
 	
31 31
 	@Override
32
-	public List<ITypeID> getAssignHints() {
32
+	public List<StoredType> getAssignHints() {
33 33
 		return Collections.singletonList(type);
34 34
 	}
35 35
 	

+ 2
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/GetStaticFieldExpression.java 查看文件

@@ -11,7 +11,7 @@ import org.openzen.zencode.shared.CodePosition;
11 11
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
12 12
 import org.openzen.zenscript.codemodel.member.ref.FieldMemberRef;
13 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,7 +27,7 @@ public class GetStaticFieldExpression extends Expression {
27 27
 	}
28 28
 	
29 29
 	@Override
30
-	public List<ITypeID> getAssignHints() {
30
+	public List<StoredType> getAssignHints() {
31 31
 		return Collections.singletonList(field.getType());
32 32
 	}
33 33
 	

+ 9
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/GetterExpression.java 查看文件

@@ -6,8 +6,10 @@
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zencode.shared.CompileException;
9 10
 import org.openzen.zenscript.codemodel.member.ref.GetterMemberRef;
10 11
 import org.openzen.zenscript.codemodel.scope.TypeScope;
12
+import org.openzen.zenscript.codemodel.type.member.TypeMembers;
11 13
 
12 14
 /**
13 15
  *
@@ -44,4 +46,11 @@ public class GetterExpression extends Expression {
44 46
 	public Expression normalize(TypeScope scope) {
45 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 查看文件

@@ -6,8 +6,8 @@
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.member.ref.ImplementationMemberRef;
9 10
 import org.openzen.zenscript.codemodel.scope.TypeScope;
10
-import org.openzen.zenscript.codemodel.type.ITypeID;
11 11
 
12 12
 /**
13 13
  *
@@ -15,11 +15,13 @@ import org.openzen.zenscript.codemodel.type.ITypeID;
15 15
  */
16 16
 public class InterfaceCastExpression extends Expression {
17 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 23
 		this.value = value;
24
+		this.implementation = implementation;
23 25
 	}
24 26
 
25 27
 	@Override
@@ -35,11 +37,11 @@ public class InterfaceCastExpression extends Expression {
35 37
 	@Override
36 38
 	public Expression transform(ExpressionTransformer transformer) {
37 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 43
 	@Override
42 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 查看文件

@@ -0,0 +1,52 @@
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 查看文件

@@ -8,7 +8,7 @@ package org.openzen.zenscript.codemodel.expression;
8 8
 import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.scope.TypeScope;
10 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,10 +16,10 @@ import org.openzen.zenscript.codemodel.type.ITypeID;
16 16
  */
17 17
 public class IsExpression extends Expression {
18 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 24
 		this.value = value;
25 25
 		this.isType = type;
@@ -38,11 +38,11 @@ public class IsExpression extends Expression {
38 38
 	@Override
39 39
 	public Expression transform(ExpressionTransformer transformer) {
40 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 44
 	@Override
45 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 查看文件

@@ -7,7 +7,7 @@ package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.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,7 +16,7 @@ import org.openzen.zenscript.codemodel.type.ITypeID;
16 16
 public class MakeConstExpression extends Expression {
17 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 20
 		super(position, constType, value.thrownType);
21 21
 		
22 22
 		this.value = value;

+ 2
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/MapExpression.java 查看文件

@@ -7,7 +7,7 @@ package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.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,7 +21,7 @@ public class MapExpression extends Expression {
21 21
 			CodePosition position,
22 22
 			Expression[] keys,
23 23
 			Expression[] values,
24
-			ITypeID type) {
24
+			StoredType type) {
25 25
 		super(position, type, binaryThrow(position, multiThrow(position, keys), multiThrow(position, values)));
26 26
 		
27 27
 		this.keys = keys;

+ 7
- 6
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/MatchExpression.java 查看文件

@@ -16,8 +16,9 @@ import org.openzen.zenscript.codemodel.statement.Statement;
16 16
 import org.openzen.zenscript.codemodel.statement.SwitchCase;
17 17
 import org.openzen.zenscript.codemodel.statement.SwitchStatement;
18 18
 import org.openzen.zenscript.codemodel.statement.VarStatement;
19
+import org.openzen.zenscript.codemodel.statement.VariableID;
19 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,7 +28,7 @@ public class MatchExpression extends Expression {
27 28
 	public final Expression value;
28 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 32
 		super(position, type, binaryThrow(position, value.thrownType, getThrownType(position, cases)));
32 33
 		
33 34
 		this.value = value;
@@ -65,7 +66,7 @@ public class MatchExpression extends Expression {
65 66
 	}
66 67
 	
67 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 70
 		SwitchStatement switchStatement = new SwitchStatement(position, null, value);
70 71
 		boolean hasDefault = false;
71 72
 		for (MatchExpression.Case matchCase : cases) {
@@ -88,7 +89,7 @@ public class MatchExpression extends Expression {
88 89
 				hasDefault = true;
89 90
 		}
90 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 93
 			switchStatement.cases.add(new SwitchCase(null, new Statement[] { defaultCase }));
93 94
 		}
94 95
 		return new SwitchedMatch(result, switchStatement);
@@ -123,11 +124,11 @@ public class MatchExpression extends Expression {
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 128
 		if (cases.length == 0)
128 129
 			return null;
129 130
 		
130
-		ITypeID result = cases[0].value.thrownType;
131
+		StoredType result = cases[0].value.thrownType;
131 132
 		for (int i = 1; i < cases.length; i++)
132 133
 			result = binaryThrow(position, result, cases[i].value.thrownType);
133 134
 		

+ 4
- 3
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/NewExpression.java 查看文件

@@ -9,7 +9,8 @@ import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.FunctionHeader;
10 10
 import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
11 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,7 +23,7 @@ public class NewExpression extends Expression {
22 23
 	
23 24
 	public NewExpression(
24 25
 			CodePosition position,
25
-			ITypeID type,
26
+			StoredType type,
26 27
 			FunctionalMemberRef constructor,
27 28
 			CallArguments arguments)
28 29
 	{
@@ -31,7 +32,7 @@ public class NewExpression extends Expression {
31 32
 	
32 33
 	public NewExpression(
33 34
 			CodePosition position,
34
-			ITypeID type,
35
+			StoredType type,
35 36
 			FunctionalMemberRef constructor,
36 37
 			CallArguments arguments,
37 38
 			FunctionHeader instancedHeader)

+ 3
- 3
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/NullExpression.java 查看文件

@@ -8,7 +8,7 @@ package org.openzen.zenscript.codemodel.expression;
8 8
 import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.scope.TypeScope;
10 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,10 +16,10 @@ import org.openzen.zenscript.codemodel.type.ITypeID;
16 16
  */
17 17
 public class NullExpression extends Expression {
18 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 23
 		super(position, optionalType, null);
24 24
 	}
25 25
 

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/OrOrExpression.java 查看文件

@@ -18,7 +18,7 @@ public class OrOrExpression extends Expression {
18 18
 	public final Expression right;
19 19
 	
20 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 23
 		this.left = left;
24 24
 		this.right = right;

+ 2
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/PanicExpression.java 查看文件

@@ -7,7 +7,7 @@ package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.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,7 +16,7 @@ import org.openzen.zenscript.codemodel.type.ITypeID;
16 16
 public class PanicExpression extends Expression {
17 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 20
 		super(position, type, null);
21 21
 		
22 22
 		this.value = value;

+ 7
- 7
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/RangeExpression.java 查看文件

@@ -7,8 +7,8 @@ package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.scope.TypeScope;
10
-import org.openzen.zenscript.codemodel.type.ITypeID;
11 10
 import org.openzen.zenscript.codemodel.type.RangeTypeID;
11
+import org.openzen.zenscript.codemodel.type.StoredType;
12 12
 
13 13
 /**
14 14
  *
@@ -18,14 +18,14 @@ public class RangeExpression extends Expression {
18 18
 	public final Expression from;
19 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 22
 		super(position, type, binaryThrow(position, from.thrownType, to.thrownType));
23 23
 	
24 24
 		this.from = from;
25 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 29
 		super(position, type, thrownType);
30 30
 		
31 31
 		this.from = from;
@@ -51,11 +51,11 @@ public class RangeExpression extends Expression {
51 51
 
52 52
 	@Override
53 53
 	public Expression normalize(TypeScope scope) {
54
-		RangeTypeID rangeType = (RangeTypeID)type;
54
+		StoredType baseType = ((RangeTypeID)type.type).baseType;
55 55
 		return new RangeExpression(
56 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 查看文件

@@ -19,7 +19,7 @@ public class SameObjectExpression extends Expression {
19 19
 	public final boolean inverted;
20 20
 	
21 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 24
 		this.left = left;
25 25
 		this.right = right;

+ 8
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/StaticGetterExpression.java 查看文件

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zencode.shared.CompileException;
9 10
 import org.openzen.zenscript.codemodel.member.ref.GetterMemberRef;
10 11
 import org.openzen.zenscript.codemodel.scope.TypeScope;
11 12
 
@@ -41,4 +42,11 @@ public class StaticGetterExpression extends Expression {
41 42
 	public Expression normalize(TypeScope scope) {
42 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 查看文件

@@ -0,0 +1,46 @@
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 查看文件

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

+ 2
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ThisExpression.java 查看文件

@@ -8,14 +8,14 @@ package org.openzen.zenscript.codemodel.expression;
8 8
 import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.partial.IPartialExpression;
10 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 15
  * @author Hoofdgebruiker
16 16
  */
17 17
 public class ThisExpression extends Expression {
18
-	public ThisExpression(CodePosition position, ITypeID type) {
18
+	public ThisExpression(CodePosition position, StoredType type) {
19 19
 		super(position, type, null);
20 20
 	}
21 21
 	

+ 2
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ThrowExpression.java 查看文件

@@ -7,7 +7,7 @@ package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.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,7 +16,7 @@ import org.openzen.zenscript.codemodel.type.ITypeID;
16 16
 public class ThrowExpression extends Expression {
17 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 20
 		super(position, type, value.type);
21 21
 		
22 22
 		this.value = value;

+ 2
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/TryConvertExpression.java 查看文件

@@ -7,7 +7,7 @@ package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.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,7 +16,7 @@ import org.openzen.zenscript.codemodel.type.ITypeID;
16 16
 public class TryConvertExpression extends Expression {
17 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 20
 		super(position, type, null);
21 21
 		
22 22
 		this.value = value;

+ 2
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/TryRethrowAsExceptionExpression.java 查看文件

@@ -7,7 +7,7 @@ package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.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,7 +16,7 @@ import org.openzen.zenscript.codemodel.type.ITypeID;
16 16
 public class TryRethrowAsExceptionExpression extends Expression {
17 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 20
 		super(position, type, thrownType);
21 21
 		
22 22
 		this.value = value;

+ 2
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/TryRethrowAsResultExpression.java 查看文件

@@ -7,7 +7,7 @@ package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.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,7 +16,7 @@ import org.openzen.zenscript.codemodel.type.ITypeID;
16 16
 public class TryRethrowAsResultExpression extends Expression {
17 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 20
 		super(position, type, null);
21 21
 		
22 22
 		this.value = value;

+ 6
- 5
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/VariantValueExpression.java 查看文件

@@ -7,9 +7,10 @@ package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import java.util.List;
9 9
 import org.openzen.zencode.shared.CodePosition;
10
+import org.openzen.zencode.shared.CompileException;
10 11
 import org.openzen.zenscript.codemodel.member.ref.VariantOptionRef;
11 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,11 +20,11 @@ public class VariantValueExpression extends Expression {
19 20
 	public final VariantOptionRef option;
20 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 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 28
 		super(position, variantType, multiThrow(position, arguments));
28 29
 		
29 30
 		this.option = option;
@@ -35,7 +36,7 @@ public class VariantValueExpression extends Expression {
35 36
 	}
36 37
 	
37 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 40
 		if (arguments != null)
40 41
 			return super.call(position, scope, hints, arguments);
41 42
 		
@@ -62,7 +63,7 @@ public class VariantValueExpression extends Expression {
62 63
 	public Expression normalize(TypeScope scope) {
63 64
 		Expression[] normalized = new Expression[arguments.length];
64 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 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 查看文件

@@ -7,7 +7,7 @@ package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.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,7 +16,7 @@ import org.openzen.zenscript.codemodel.type.ITypeID;
16 16
 public class WrapOptionalExpression extends Expression {
17 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 20
 		super(position, optionalType, value.thrownType);
21 21
 		
22 22
 		if (value.type.isOptional())

+ 0
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/generic/ParameterSuperBound.java 查看文件


部分文件因文件數量過多而無法顯示

Loading…
取消
儲存