Sfoglia il codice sorgente

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

kindlich 6 anni fa
parent
commit
2551c899d0
Non sono state trovate chiavi note per questa firma nel database
100 ha cambiato i file con 1371 aggiunte e 1720 eliminazioni
  1. 9
    3
      CodeFormatter/src/main/java/org/openzen/zenscript/formatter/ExpressionFormatter.java
  2. 3
    3
      CodeFormatter/src/main/java/org/openzen/zenscript/formatter/FormattingUtils.java
  3. 2
    2
      CodeFormatter/src/main/java/org/openzen/zenscript/formatter/MemberFormatter.java
  4. 1
    1
      CodeFormatter/src/main/java/org/openzen/zenscript/formatter/TypeFormatter.java
  5. 17
    5
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/FunctionHeader.java
  6. 2
    2
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/GenericMapper.java
  7. 56
    4
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/AnnotationProcessor.java
  8. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/MemberAnnotation.java
  9. 12
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/NativeMemberAnnotation.java
  10. 30
    7
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/PreconditionForMethod.java
  11. 2
    2
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/definition/VariantDefinition.java
  12. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CallExpression.java
  13. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CallStaticExpression.java
  14. 39
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantUSizeExpression.java
  15. 2
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ExpressionVisitor.java
  16. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/PostCallExpression.java
  17. 9
    3
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/RangeExpression.java
  18. 3
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/SetFieldExpression.java
  19. 0
    26
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/iterator/ForeachIteratorVisitor.java
  20. 13
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ConstructorMember.java
  21. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/FieldMember.java
  22. 15
    18
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/GetterMember.java
  23. 0
    21
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/IIteratorMember.java
  24. 0
    23
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/IPropertyMember.java
  25. 5
    18
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/IteratorMember.java
  26. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/MemberVisitor.java
  27. 6
    2
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/PropertyMember.java
  28. 13
    17
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/SetterMember.java
  29. 4
    11
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/StaticInitializerMember.java
  30. 0
    95
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/builtin/ArrayIteratorKeyValues.java
  31. 0
    90
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/builtin/ArrayIteratorValues.java
  32. 0
    93
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/builtin/AssocIterator.java
  33. 0
    101
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/builtin/RangeIterator.java
  34. 0
    84
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/builtin/StringCharIterator.java
  35. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/GetterMemberRef.java
  36. 5
    6
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/IteratorMemberRef.java
  37. 3
    3
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/PropertyRef.java
  38. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/SetterMemberRef.java
  39. 3
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/VariantOptionRef.java
  40. 73
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/partial/PartialVariantOptionExpression.java
  41. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/scope/DefinitionScope.java
  42. 2
    8
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/scope/ExpressionScope.java
  43. 1
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/BasicTypeID.java
  44. 2
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/DefinitionTypeID.java
  45. 4
    4
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/FunctionTypeID.java
  46. 3
    2
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/GlobalTypeRegistry.java
  47. 2
    2
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/ITypeID.java
  48. 13
    18
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/RangeTypeID.java
  49. 2
    3
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/TypeParameterCollector.java
  50. 60
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/member/BuiltinID.java
  51. 3
    4
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/member/DefinitionMemberGroup.java
  52. 135
    41
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/member/TypeMemberBuilder.java
  53. 3
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/member/TypeMembers.java
  54. 5
    3
      CompilerShared/src/main/java/org/openzen/zenscript/compiler/ModuleSpace.java
  55. 0
    84
      Constructor/src/main/java/org/openzen/zenscript/constructor/Module.java
  56. 2
    1
      Constructor/src/main/java/org/openzen/zenscript/constructor/module/DirectoryModuleReference.java
  57. 1
    1
      IDE/src/main/java/org/openzen/zenscript/ide/host/local/LocalTarget.java
  58. 1
    0
      IDE/src/main/java/org/openzen/zenscript/ide/ui/view/editor/SourceEditor.java
  59. 0
    12
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/implementations/IntRange.java
  60. 82
    4
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeContext.java
  61. 0
    15
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeImplementation.java
  62. 0
    23
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaCompileUtils.java
  63. 6
    7
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaCompiler.java
  64. 0
    42
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaMethodInfo.java
  65. 16
    7
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaModule.java
  66. 4
    91
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/CompilerUtils.java
  67. 38
    30
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaBoxingTypeVisitor.java
  68. 210
    173
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaExpressionVisitor.java
  69. 12
    26
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaForeachWriter.java
  70. 7
    69
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaPreDecrementVisitor.java
  71. 7
    69
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaPreIncrementVisitor.java
  72. 2
    3
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaScriptFile.java
  73. 29
    4
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaStatementVisitor.java
  74. 48
    0
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaSwitchKeyVisitor.java
  75. 30
    109
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaWriter.java
  76. 56
    82
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/definitions/JavaDefinitionVisitor.java
  77. 12
    30
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/definitions/JavaMemberVisitor.java
  78. 0
    9
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/definitions/JavaOptionInfoTag.java
  79. 7
    0
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaClass.java
  80. 2
    2
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaContext.java
  81. 4
    3
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaField.java
  82. 37
    1
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaMethod.java
  83. 2
    2
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaNativeClass.java
  84. 4
    6
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaParameterInfo.java
  85. 1
    1
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaSynthesizedClassNamer.java
  86. 3
    4
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaSyntheticTypeSignatureConverter.java
  87. 8
    1
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaTypeDescriptorVisitor.java
  88. 2
    0
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaTypeInternalNameVisitor.java
  89. 2
    4
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaTypeNameVisitor.java
  90. 34
    20
      JavaShared/src/main/java/org/openzen/zenscript/javashared/prepare/JavaPrepareClassMethodVisitor.java
  91. 4
    5
      JavaShared/src/main/java/org/openzen/zenscript/javashared/prepare/JavaPrepareDefinitionMemberVisitor.java
  92. 30
    11
      JavaShared/src/main/java/org/openzen/zenscript/javashared/prepare/JavaPrepareDefinitionVisitor.java
  93. 16
    14
      JavaShared/src/main/java/org/openzen/zenscript/javashared/prepare/JavaPrepareExpansionMethodVisitor.java
  94. 6
    0
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/ExpressionHoistingChecker.java
  95. 3
    4
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/FormattingUtils.java
  96. 1
    2
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaDefinitionVisitor.java
  97. 4
    4
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaExpansionMemberCompiler.java
  98. 4
    4
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaMemberCompiler.java
  99. 58
    6
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceExpressionFormatter.java
  100. 0
    0
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceFile.java

+ 9
- 3
CodeFormatter/src/main/java/org/openzen/zenscript/formatter/ExpressionFormatter.java Vedi File

@@ -36,6 +36,7 @@ import org.openzen.zenscript.codemodel.expression.ConstantStringExpression;
36 36
 import org.openzen.zenscript.codemodel.expression.ConstantUIntExpression;
37 37
 import org.openzen.zenscript.codemodel.expression.ConstantULongExpression;
38 38
 import org.openzen.zenscript.codemodel.expression.ConstantUShortExpression;
39
+import org.openzen.zenscript.codemodel.expression.ConstantUSizeExpression;
39 40
 import org.openzen.zenscript.codemodel.expression.ConstructorSuperCallExpression;
40 41
 import org.openzen.zenscript.codemodel.expression.ConstructorThisCallExpression;
41 42
 import org.openzen.zenscript.codemodel.expression.EnumConstantExpression;
@@ -391,6 +392,11 @@ public class ExpressionFormatter implements ExpressionVisitor<ExpressionString>
391 392
 	public ExpressionString visitConstantShort(ConstantShortExpression expression) {
392 393
 		return new ExpressionString(Integer.toString(expression.value) + " as short", ZenScriptOperator.CAST);
393 394
 	}
395
+	
396
+	@Override
397
+	public ExpressionString visitConstantUSize(ConstantUSizeExpression expression) {
398
+		return new ExpressionString(Long.toUnsignedString(expression.value) + " as usize", ZenScriptOperator.CAST);
399
+	}
394 400
 
395 401
 	@Override
396 402
 	public ExpressionString visitConstantString(ConstantStringExpression expression) {
@@ -402,17 +408,17 @@ public class ExpressionFormatter implements ExpressionVisitor<ExpressionString>
402 408
 
403 409
 	@Override
404 410
 	public ExpressionString visitConstantUInt(ConstantUIntExpression expression) {
405
-		return new ExpressionString(Integer.toString(expression.value) + " as uint", ZenScriptOperator.CAST);
411
+		return new ExpressionString(Integer.toUnsignedString(expression.value) + " as uint", ZenScriptOperator.CAST);
406 412
 	}
407 413
 
408 414
 	@Override
409 415
 	public ExpressionString visitConstantULong(ConstantULongExpression expression) {
410
-		return new ExpressionString(Long.toString(expression.value) + " as ulong", ZenScriptOperator.CAST);
416
+		return new ExpressionString(Long.toUnsignedString(expression.value) + " as ulong", ZenScriptOperator.CAST);
411 417
 	}
412 418
 
413 419
 	@Override
414 420
 	public ExpressionString visitConstantUShort(ConstantUShortExpression expression) {
415
-		return new ExpressionString(Integer.toString(expression.value) + " as ushort", ZenScriptOperator.CAST);
421
+		return new ExpressionString(Integer.toUnsignedString(expression.value) + " as ushort", ZenScriptOperator.CAST);
416 422
 	}
417 423
 
418 424
 	@Override

+ 3
- 3
CodeFormatter/src/main/java/org/openzen/zenscript/formatter/FormattingUtils.java Vedi File

@@ -80,15 +80,15 @@ public class FormattingUtils {
80 80
 			
81 81
 			if (!settings.showAnyInFunctionHeaders || parameter.type != BasicTypeID.UNDETERMINED) {
82 82
 				result.append(" as ");
83
-				result.append(header.returnType.accept(typeFormatter));
83
+				result.append(header.getReturnType().accept(typeFormatter));
84 84
 			}
85 85
 			
86 86
 			parameterIndex++;
87 87
 		}
88 88
 		result.append(")");
89
-		if (!settings.showAnyInFunctionHeaders || header.returnType != BasicTypeID.UNDETERMINED) {
89
+		if (!settings.showAnyInFunctionHeaders || header.getReturnType() != BasicTypeID.UNDETERMINED) {
90 90
 			result.append(" as ");
91
-			result.append(header.returnType.accept(typeFormatter));
91
+			result.append(header.getReturnType().accept(typeFormatter));
92 92
 		}
93 93
 	}
94 94
 	

+ 2
- 2
CodeFormatter/src/main/java/org/openzen/zenscript/formatter/MemberFormatter.java Vedi File

@@ -10,7 +10,7 @@ import org.openzen.zenscript.codemodel.member.CallerMember;
10 10
 import org.openzen.zenscript.codemodel.member.CasterMember;
11 11
 import org.openzen.zenscript.codemodel.member.ConstMember;
12 12
 import org.openzen.zenscript.codemodel.member.ConstructorMember;
13
-import org.openzen.zenscript.codemodel.member.CustomIteratorMember;
13
+import org.openzen.zenscript.codemodel.member.IteratorMember;
14 14
 import org.openzen.zenscript.codemodel.member.DestructorMember;
15 15
 import org.openzen.zenscript.codemodel.member.FieldMember;
16 16
 import org.openzen.zenscript.codemodel.member.GetterMember;
@@ -192,7 +192,7 @@ public class MemberFormatter implements MemberVisitor<Void> {
192 192
 	}
193 193
 
194 194
 	@Override
195
-	public Void visitCustomIterator(CustomIteratorMember member) {
195
+	public Void visitCustomIterator(IteratorMember member) {
196 196
 		visit(false);
197 197
 		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
198 198
 	}

+ 1
- 1
CodeFormatter/src/main/java/org/openzen/zenscript/formatter/TypeFormatter.java Vedi File

@@ -97,7 +97,7 @@ public class TypeFormatter implements ITypeVisitor<String>, GenericParameterBoun
97 97
 
98 98
 	@Override
99 99
 	public String visitRange(RangeTypeID range) {
100
-		return range.from.accept(this) + " .. " + range.to.accept(this);
100
+		return range.baseType.accept(this) + " .. " + range.baseType.accept(this);
101 101
 	}
102 102
 
103 103
 	@Override

+ 17
- 5
CodeModel/src/main/java/org/openzen/zenscript/codemodel/FunctionHeader.java Vedi File

@@ -27,7 +27,7 @@ public class FunctionHeader {
27 27
 	private static final FunctionParameter[] NO_PARAMETERS = new FunctionParameter[0];
28 28
 	
29 29
 	public final TypeParameter[] typeParameters;
30
-	public ITypeID returnType;
30
+	private ITypeID returnType;
31 31
 	public final FunctionParameter[] parameters;
32 32
 	public final ITypeID thrownType;
33 33
 	
@@ -96,6 +96,17 @@ public class FunctionHeader {
96 96
 		hasUnknowns = hasUnknowns(parameters, returnType);
97 97
 	}
98 98
 	
99
+	public ITypeID getReturnType() {
100
+		return returnType;
101
+	}
102
+	
103
+	public void setReturnType(ITypeID returnType) {
104
+		if (returnType == null)
105
+			throw new NullPointerException();
106
+		
107
+		this.returnType = returnType;
108
+	}
109
+	
99 110
 	public boolean isDenormalized() {
100 111
 		if (returnType.getNormalized() != returnType)
101 112
 			return true;
@@ -321,13 +332,13 @@ public class FunctionHeader {
321 332
 		return true;
322 333
 	}
323 334
 	
324
-	public FunctionHeader withGenericArguments(GenericMapper mapper) {
335
+	public FunctionHeader withGenericArguments(GlobalTypeRegistry registry, GenericMapper mapper) {
325 336
 		if (typeParameters.length > 0) {
326 337
 			Map<TypeParameter, ITypeID> innerMap = new HashMap<>();
327 338
 			for (TypeParameter parameter : typeParameters)
328 339
 				innerMap.put(parameter, mapper.registry.getGeneric(parameter));
329 340
 			
330
-			mapper = mapper.getInner(innerMap);
341
+			mapper = mapper.getInner(registry, innerMap);
331 342
 		}
332 343
 		
333 344
 		ITypeID returnType = this.returnType.instance(mapper);
@@ -345,7 +356,7 @@ public class FunctionHeader {
345 356
 		Map<TypeParameter, ITypeID> typeArguments = new HashMap<>();
346 357
 		for (int i = 0; i < typeParameters.length; i++)
347 358
 			typeArguments.put(typeParameters[i], arguments[i]);
348
-		GenericMapper mapper = typeParameterMapping.getInner(typeArguments);
359
+		GenericMapper mapper = typeParameterMapping.getInner(registry, typeArguments);
349 360
 		
350 361
 		ITypeID returnType = this.returnType.instance(mapper);
351 362
 		FunctionParameter[] parameters = new FunctionParameter[this.parameters.length];
@@ -410,7 +421,8 @@ public class FunctionHeader {
410 421
 				result.append(", ");
411 422
 			result.append(parameters[i].toString());
412 423
 		}
413
-		result.append(")");
424
+		result.append(") as ");
425
+		result.append(returnType.toString());
414 426
 		return result.toString();
415 427
 	}
416 428
 

+ 2
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/GenericMapper.java Vedi File

@@ -54,10 +54,10 @@ public class GenericMapper {
54 54
 	}
55 55
 	
56 56
 	public FunctionHeader map(FunctionHeader original) {
57
-		return mapping.isEmpty() ? original : original.withGenericArguments(this);
57
+		return mapping.isEmpty() ? original : original.withGenericArguments(registry, this);
58 58
 	}
59 59
 	
60
-	public GenericMapper getInner(Map<TypeParameter, ITypeID> mapping) {
60
+	public GenericMapper getInner(GlobalTypeRegistry registry, Map<TypeParameter, ITypeID> mapping) {
61 61
 		Map<TypeParameter, ITypeID> resultMap = new HashMap<>(this.mapping);
62 62
 		resultMap.putAll(mapping);
63 63
 		return new GenericMapper(registry, resultMap);

+ 56
- 4
CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/AnnotationProcessor.java Vedi File

@@ -18,7 +18,7 @@ import org.openzen.zenscript.codemodel.member.CallerMember;
18 18
 import org.openzen.zenscript.codemodel.member.CasterMember;
19 19
 import org.openzen.zenscript.codemodel.member.ConstMember;
20 20
 import org.openzen.zenscript.codemodel.member.ConstructorMember;
21
-import org.openzen.zenscript.codemodel.member.CustomIteratorMember;
21
+import org.openzen.zenscript.codemodel.member.IteratorMember;
22 22
 import org.openzen.zenscript.codemodel.member.DestructorMember;
23 23
 import org.openzen.zenscript.codemodel.member.FieldMember;
24 24
 import org.openzen.zenscript.codemodel.member.FunctionalMember;
@@ -32,6 +32,8 @@ import org.openzen.zenscript.codemodel.member.OperatorMember;
32 32
 import org.openzen.zenscript.codemodel.member.SetterMember;
33 33
 import org.openzen.zenscript.codemodel.member.StaticInitializerMember;
34 34
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
35
+import org.openzen.zenscript.codemodel.member.ref.GetterMemberRef;
36
+import org.openzen.zenscript.codemodel.member.ref.SetterMemberRef;
35 37
 import org.openzen.zenscript.codemodel.scope.DefinitionScope;
36 38
 import org.openzen.zenscript.codemodel.scope.FileScope;
37 39
 import org.openzen.zenscript.codemodel.scope.FunctionScope;
@@ -130,12 +132,12 @@ public class AnnotationProcessor implements ModuleProcessor {
130 132
 
131 133
 		@Override
132 134
 		public Void visitGetter(GetterMember member) {
133
-			return functional(member);
135
+			return getter(member);
134 136
 		}
135 137
 
136 138
 		@Override
137 139
 		public Void visitSetter(SetterMember member) {
138
-			return functional(member);
140
+			return setter(member);
139 141
 		}
140 142
 
141 143
 		@Override
@@ -149,7 +151,7 @@ public class AnnotationProcessor implements ModuleProcessor {
149 151
 		}
150 152
 
151 153
 		@Override
152
-		public Void visitCustomIterator(CustomIteratorMember member) {
154
+		public Void visitCustomIterator(IteratorMember member) {
153 155
 			return functional(member);
154 156
 		}
155 157
 
@@ -199,6 +201,38 @@ public class AnnotationProcessor implements ModuleProcessor {
199 201
 			return null;
200 202
 		}
201 203
 		
204
+		private Void getter(GetterMember member) {
205
+			for (MemberAnnotation annotation : member.annotations)
206
+				annotation.apply(member, scope);
207
+			
208
+			if (member.getOverrides() != null) {
209
+				getter(member, member.getOverrides());
210
+			}
211
+			
212
+			if (member.body == null)
213
+				return null;
214
+			
215
+			StatementScope scope = new FunctionScope(this.scope, new FunctionHeader(member.type));
216
+			member.body = process(member.body, scope);
217
+			return null;
218
+		}
219
+		
220
+		private Void setter(SetterMember member) {
221
+			for (MemberAnnotation annotation : member.annotations)
222
+				annotation.apply(member, scope);
223
+			
224
+			if (member.getOverrides() != null) {
225
+				setter(member, member.getOverrides());
226
+			}
227
+			
228
+			if (member.body == null)
229
+				return null;
230
+			
231
+			StatementScope scope = new FunctionScope(this.scope, new FunctionHeader(BasicTypeID.VOID, member.parameter));
232
+			member.body = process(member.body, scope);
233
+			return null;
234
+		}
235
+		
202 236
 		private void functional(FunctionalMember member, DefinitionMemberRef overrides) {
203 237
 			for (MemberAnnotation annotation : overrides.getAnnotations())
204 238
 				annotation.applyOnOverridingMethod(member, scope);
@@ -207,5 +241,23 @@ public class AnnotationProcessor implements ModuleProcessor {
207 241
 				functional(member, overrides.getOverrides());
208 242
 			}
209 243
 		}
244
+		
245
+		private void getter(GetterMember member, GetterMemberRef overrides) {
246
+			for (MemberAnnotation annotation : overrides.getAnnotations())
247
+				annotation.applyOnOverridingGetter(member, scope);
248
+			
249
+			if (overrides.getOverrides() != null) {
250
+				getter(member, overrides.getOverrides());
251
+			}
252
+		}
253
+		
254
+		private void setter(SetterMember member, SetterMemberRef overrides) {
255
+			for (MemberAnnotation annotation : overrides.getAnnotations())
256
+				annotation.applyOnOverridingSetter(member, scope);
257
+			
258
+			if (overrides.getOverrides() != null) {
259
+				setter(member, overrides.getOverrides());
260
+			}
261
+		}
210 262
 	}
211 263
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/MemberAnnotation.java Vedi File

@@ -6,7 +6,9 @@
6 6
 package org.openzen.zenscript.codemodel.annotations;
7 7
 
8 8
 import org.openzen.zenscript.codemodel.member.FunctionalMember;
9
+import org.openzen.zenscript.codemodel.member.GetterMember;
9 10
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
11
+import org.openzen.zenscript.codemodel.member.SetterMember;
10 12
 import org.openzen.zenscript.codemodel.scope.BaseScope;
11 13
 
12 14
 /**
@@ -19,4 +21,8 @@ public interface MemberAnnotation {
19 21
 	public void apply(IDefinitionMember member, BaseScope scope);
20 22
 	
21 23
 	public void applyOnOverridingMethod(FunctionalMember member, BaseScope scope);
24
+	
25
+	public void applyOnOverridingGetter(GetterMember member, BaseScope scope);
26
+	
27
+	public void applyOnOverridingSetter(SetterMember member, BaseScope scope);
22 28
 }

+ 12
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/NativeMemberAnnotation.java Vedi File

@@ -6,7 +6,9 @@
6 6
 package org.openzen.zenscript.codemodel.annotations;
7 7
 
8 8
 import org.openzen.zenscript.codemodel.member.FunctionalMember;
9
+import org.openzen.zenscript.codemodel.member.GetterMember;
9 10
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
11
+import org.openzen.zenscript.codemodel.member.SetterMember;
10 12
 import org.openzen.zenscript.codemodel.scope.BaseScope;
11 13
 
12 14
 /**
@@ -29,4 +31,14 @@ public class NativeMemberAnnotation implements MemberAnnotation {
29 31
 	public void applyOnOverridingMethod(FunctionalMember member, BaseScope scope) {
30 32
 		// not inherited
31 33
 	}
34
+
35
+	@Override
36
+	public void applyOnOverridingGetter(GetterMember member, BaseScope scope) {
37
+		// not inherited
38
+	}
39
+
40
+	@Override
41
+	public void applyOnOverridingSetter(SetterMember member, BaseScope scope) {
42
+		// not inherited
43
+	}
32 44
 }

+ 30
- 7
CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/PreconditionForMethod.java Vedi File

@@ -12,7 +12,9 @@ import org.openzen.zenscript.codemodel.expression.Expression;
12 12
 import org.openzen.zenscript.codemodel.expression.ExpressionBuilder;
13 13
 import org.openzen.zenscript.codemodel.expression.PanicExpression;
14 14
 import org.openzen.zenscript.codemodel.member.FunctionalMember;
15
+import org.openzen.zenscript.codemodel.member.GetterMember;
15 16
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
17
+import org.openzen.zenscript.codemodel.member.SetterMember;
16 18
 import org.openzen.zenscript.codemodel.scope.BaseScope;
17 19
 import org.openzen.zenscript.codemodel.scope.ExpressionScope;
18 20
 import org.openzen.zenscript.codemodel.statement.BlockStatement;
@@ -44,13 +46,33 @@ public class PreconditionForMethod implements MemberAnnotation {
44 46
 
45 47
 	@Override
46 48
 	public void apply(IDefinitionMember member, BaseScope scope) {
47
-		applyOnOverridingMethod((FunctionalMember)member, scope);
49
+		if (member instanceof GetterMember) {
50
+			applyOnOverridingGetter((GetterMember)member, scope);
51
+		} else if (member instanceof SetterMember) {
52
+			applyOnOverridingSetter((SetterMember)member, scope);
53
+		} else if (member instanceof FunctionalMember) {
54
+			applyOnOverridingMethod((FunctionalMember)member, scope);
55
+		}
48 56
 	}
49 57
 
50 58
 	@Override
51 59
 	public void applyOnOverridingMethod(FunctionalMember member, BaseScope scope) {
52
-		if (member.body == null)
53
-			return;
60
+		member.body = applyOnOverride(member.body, scope);
61
+	}
62
+
63
+	@Override
64
+	public void applyOnOverridingGetter(GetterMember member, BaseScope scope) {
65
+		member.body = applyOnOverride(member.body, scope);
66
+	}
67
+
68
+	@Override
69
+	public void applyOnOverridingSetter(SetterMember member, BaseScope scope) {
70
+		member.body = applyOnOverride(member.body, scope);
71
+	}
72
+	
73
+	private Statement applyOnOverride(Statement body, BaseScope scope) {
74
+		if (body == null)
75
+			return body;
54 76
 		
55 77
 		ExpressionScope expressionScope = new ExpressionScope(scope, BasicTypeID.BOOL);
56 78
 		List<Statement> statements = new ArrayList<>();
@@ -58,11 +80,12 @@ public class PreconditionForMethod implements MemberAnnotation {
58 80
 		Expression inverseCondition = expressionBuilder.not(condition);
59 81
 		Statement throwStatement = new ExpressionStatement(position, new PanicExpression(position, BasicTypeID.VOID, message));
60 82
 		statements.add(new IfStatement(position, inverseCondition, throwStatement, null));
61
-		if (member.body instanceof BlockStatement) {
62
-			statements.addAll(((BlockStatement)member.body).statements);
83
+		
84
+		if (body instanceof BlockStatement) {
85
+			statements.addAll(((BlockStatement)body).statements);
63 86
 		} else {
64
-			statements.add(member.body);
87
+			statements.add(body);
65 88
 		}
66
-		member.body = new BlockStatement(position, statements);
89
+		return new BlockStatement(position, statements);
67 90
 	}
68 91
 }

+ 2
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/definition/VariantDefinition.java Vedi File

@@ -41,8 +41,8 @@ public class VariantDefinition extends HighLevelDefinition {
41 41
 			this.types = types;
42 42
 		}
43 43
 		
44
-		public VariantOptionRef instance(GenericMapper mapper) {
45
-			return new VariantOptionRef(this, mapper.map(types));
44
+		public VariantOptionRef instance(ITypeID variantType, GenericMapper mapper) {
45
+			return new VariantOptionRef(this, variantType, mapper.map(types));
46 46
 		}
47 47
 	}
48 48
 }

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CallExpression.java Vedi File

@@ -21,7 +21,7 @@ public class CallExpression extends Expression {
21 21
 	public final FunctionHeader instancedHeader;
22 22
 	
23 23
 	public CallExpression(CodePosition position, Expression target, FunctionalMemberRef member, FunctionHeader instancedHeader, CallArguments arguments) {
24
-		super(position, instancedHeader.returnType, multiThrow(position, arguments.arguments));
24
+		super(position, instancedHeader.getReturnType(), multiThrow(position, arguments.arguments));
25 25
 		
26 26
 		this.target = target;
27 27
 		this.member = member;

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CallStaticExpression.java Vedi File

@@ -22,7 +22,7 @@ public class CallStaticExpression extends Expression {
22 22
 	public final FunctionHeader instancedHeader;
23 23
 	
24 24
 	public CallStaticExpression(CodePosition position, ITypeID target, FunctionalMemberRef member, FunctionHeader instancedHeader, CallArguments arguments) {
25
-		super(position, instancedHeader.returnType, multiThrow(position, arguments.arguments));
25
+		super(position, instancedHeader.getReturnType(), multiThrow(position, arguments.arguments));
26 26
 		
27 27
 		this.member = member;
28 28
 		this.target = target;

+ 39
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantUSizeExpression.java Vedi File

@@ -0,0 +1,39 @@
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.BasicTypeID;
11
+
12
+/**
13
+ *
14
+ * @author Hoofdgebruiker
15
+ */
16
+public class ConstantUSizeExpression extends Expression {
17
+	public final long value;
18
+	
19
+	public ConstantUSizeExpression(CodePosition position, long value) {
20
+		super(position, BasicTypeID.USIZE, null);
21
+		
22
+		this.value = value;
23
+	}
24
+
25
+	@Override
26
+	public <T> T accept(ExpressionVisitor<T> visitor) {
27
+		return visitor.visitConstantUSize(this);
28
+	}
29
+
30
+	@Override
31
+	public Expression transform(ExpressionTransformer transformer) {
32
+		return this;
33
+	}
34
+
35
+	@Override
36
+	public Expression normalize(TypeScope scope) {
37
+		return this;
38
+	}
39
+}

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

@@ -66,6 +66,8 @@ public interface ExpressionVisitor<T> {
66 66
 	
67 67
 	public T visitConstantUShort(ConstantUShortExpression expression);
68 68
 	
69
+	public T visitConstantUSize(ConstantUSizeExpression expression);
70
+	
69 71
 	public T visitConstructorThisCall(ConstructorThisCallExpression expression);
70 72
 	
71 73
 	public T visitConstructorSuperCall(ConstructorSuperCallExpression expression);

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/PostCallExpression.java Vedi File

@@ -22,7 +22,7 @@ public class PostCallExpression extends Expression {
22 22
 	public final FunctionHeader instancedHeader;
23 23
 	
24 24
 	public PostCallExpression(CodePosition position, Expression target, FunctionalMemberRef member, FunctionHeader instancedHeader) {
25
-		super(position, instancedHeader.returnType, binaryThrow(position, instancedHeader.thrownType, target.thrownType));
25
+		super(position, instancedHeader.getReturnType(), binaryThrow(position, instancedHeader.thrownType, target.thrownType));
26 26
 		
27 27
 		if (member.getOperator() != OperatorType.DECREMENT && member.getOperator() != OperatorType.INCREMENT)
28 28
 			throw new IllegalArgumentException("Operator must be increment or decrement");

+ 9
- 3
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/RangeExpression.java Vedi File

@@ -9,6 +9,7 @@ import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.scope.TypeScope;
10 10
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
11 11
 import org.openzen.zenscript.codemodel.type.ITypeID;
12
+import org.openzen.zenscript.codemodel.type.RangeTypeID;
12 13
 
13 14
 /**
14 15
  *
@@ -18,8 +19,8 @@ public class RangeExpression extends Expression {
18 19
 	public final Expression from;
19 20
 	public final Expression to;
20 21
 	
21
-	public RangeExpression(CodePosition position, GlobalTypeRegistry registry, Expression from, Expression to) {
22
-		super(position, registry.getRange(from.type, to.type), binaryThrow(position, from.thrownType, to.thrownType));
22
+	public RangeExpression(CodePosition position, RangeTypeID type, Expression from, Expression to) {
23
+		super(position, type, binaryThrow(position, from.thrownType, to.thrownType));
23 24
 	
24 25
 		this.from = from;
25 26
 		this.to = to;
@@ -46,6 +47,11 @@ public class RangeExpression extends Expression {
46 47
 
47 48
 	@Override
48 49
 	public Expression normalize(TypeScope scope) {
49
-		return new RangeExpression(position, scope.getTypeRegistry(), from.normalize(scope), to.normalize(scope));
50
+		RangeTypeID rangeType = (RangeTypeID)type;
51
+		return new RangeExpression(
52
+				position,
53
+				rangeType,
54
+				from.normalize(scope).castImplicit(position, scope, rangeType.baseType),
55
+				to.normalize(scope).castImplicit(position, scope, rangeType.baseType));
50 56
 	}
51 57
 }

+ 3
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/SetFieldExpression.java Vedi File

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.FunctionParameter;
9 10
 import org.openzen.zenscript.codemodel.member.ref.FieldMemberRef;
10 11
 import org.openzen.zenscript.codemodel.scope.TypeScope;
11 12
 
@@ -17,6 +18,7 @@ public class SetFieldExpression extends Expression {
17 18
 	public final Expression target;
18 19
 	public final FieldMemberRef field;
19 20
 	public final Expression value;
21
+	public final FunctionParameter parameter;
20 22
 	
21 23
 	public SetFieldExpression(CodePosition position, Expression target, FieldMemberRef field, Expression value) {
22 24
 		super(position, field.getType(), binaryThrow(position, target.thrownType, value.thrownType));
@@ -24,6 +26,7 @@ public class SetFieldExpression extends Expression {
24 26
 		this.target = target;
25 27
 		this.field = field;
26 28
 		this.value = value;
29
+		this.parameter = new FunctionParameter(type);
27 30
 	}
28 31
 
29 32
 	@Override

+ 0
- 26
CodeModel/src/main/java/org/openzen/zenscript/codemodel/iterator/ForeachIteratorVisitor.java Vedi File

@@ -1,26 +0,0 @@
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.iterator;
7
-
8
-/**
9
- *
10
- * @author Hoofdgebruiker
11
- */
12
-public interface ForeachIteratorVisitor<T> {
13
-	T visitIntRange();
14
-	
15
-	T visitArrayValueIterator();
16
-	
17
-	T visitArrayKeyValueIterator();
18
-	
19
-	T visitAssocKeyIterator();
20
-	
21
-	T visitAssocKeyValueIterator();
22
-	
23
-	T visitStringCharacterIterator();
24
-	
25
-	T visitCustomIterator();
26
-}

+ 13
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ConstructorMember.java Vedi File

@@ -6,14 +6,19 @@
6 6
 package org.openzen.zenscript.codemodel.member;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zencode.shared.ConcatMap;
9 10
 import org.openzen.zenscript.codemodel.FunctionHeader;
10 11
 import org.openzen.zenscript.codemodel.GenericMapper;
11 12
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
13
+import org.openzen.zenscript.codemodel.Modifiers;
14
+import org.openzen.zenscript.codemodel.definition.EnumDefinition;
12 15
 import org.openzen.zenscript.codemodel.expression.ConstructorSuperCallExpression;
13 16
 import org.openzen.zenscript.codemodel.expression.ConstructorThisCallExpression;
14 17
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
18
+import org.openzen.zenscript.codemodel.scope.TypeScope;
15 19
 import org.openzen.zenscript.codemodel.statement.BlockStatement;
16 20
 import org.openzen.zenscript.codemodel.statement.ExpressionStatement;
21
+import org.openzen.zenscript.codemodel.statement.LoopStatement;
17 22
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
18 23
 import org.openzen.zenscript.codemodel.type.member.BuiltinID;
19 24
 import org.openzen.zenscript.codemodel.type.member.TypeMemberPriority;
@@ -84,4 +89,12 @@ public class ConstructorMember extends FunctionalMember {
84 89
 	public DefinitionMemberRef getOverrides() {
85 90
 		return null;
86 91
 	}
92
+
93
+	@Override
94
+	public void normalize(TypeScope scope) {
95
+		if (definition instanceof EnumDefinition)
96
+			modifiers |= Modifiers.PRIVATE;
97
+		
98
+		super.normalize(scope);
99
+	}
87 100
 }

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/FieldMember.java Vedi File

@@ -77,7 +77,7 @@ public class FieldMember extends PropertyMember {
77 77
 					position,
78 78
 					new ThisExpression(position, thisType),
79 79
 					new FieldMemberRef(this, null),
80
-					new GetFunctionParameterExpression(position, this.autoSetter.header.parameters[0]))));
80
+					new GetFunctionParameterExpression(position, this.autoSetter.parameter))));
81 81
 		} else {
82 82
 			this.autoSetter = null;
83 83
 		}

+ 15
- 18
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/GetterMember.java Vedi File

@@ -6,10 +6,13 @@
6 6
 package org.openzen.zenscript.codemodel.member;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zencode.shared.ConcatMap;
9 10
 import org.openzen.zenscript.codemodel.FunctionHeader;
10 11
 import org.openzen.zenscript.codemodel.GenericMapper;
11 12
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12 13
 import org.openzen.zenscript.codemodel.member.ref.GetterMemberRef;
14
+import org.openzen.zenscript.codemodel.scope.TypeScope;
15
+import org.openzen.zenscript.codemodel.statement.LoopStatement;
13 16
 import org.openzen.zenscript.codemodel.statement.Statement;
14 17
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
15 18
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
@@ -21,10 +24,10 @@ import org.openzen.zenscript.codemodel.type.member.TypeMemberPriority;
21 24
  *
22 25
  * @author Hoofdgebruiker
23 26
  */
24
-public class GetterMember extends FunctionalMember implements IPropertyMember {
27
+public class GetterMember extends PropertyMember {
25 28
 	public final String name;
26
-	public ITypeID type;
27 29
 	private GetterMemberRef overrides;
30
+	public Statement body = null;
28 31
 	
29 32
 	public GetterMember(
30 33
 			CodePosition position,
@@ -33,33 +36,21 @@ public class GetterMember extends FunctionalMember implements IPropertyMember {
33 36
 			String name,
34 37
 			ITypeID type,
35 38
 			BuiltinID builtin) {
36
-		super(position, definition, modifiers, new FunctionHeader(type), builtin);
39
+		super(position, definition, modifiers, type, builtin);
37 40
 		
38 41
 		this.name = name;
39
-		this.type = type;
40 42
 	}
41 43
 	
42
-	@Override
43 44
 	public void setBody(Statement body) {
44
-		super.setBody(body);
45
+		this.body = body;
45 46
 		
46 47
 		if (type == BasicTypeID.UNDETERMINED)
47 48
 			type = body.getReturnType();
48 49
 	}
49 50
 	
50 51
 	@Override
51
-	public ITypeID getType() {
52
-		return type;
53
-	}
54
-	
55
-	@Override
56
-	public String getCanonicalName() {
57
-		return definition.getFullName() + ":getter:" + name;
58
-	}
59
-	
60
-	@Override
61
-	public FunctionalKind getKind() {
62
-		return FunctionalKind.GETTER;
52
+	public boolean isAbstract() {
53
+		return body == null && builtin == null;
63 54
 	}
64 55
 	
65 56
 	@Override
@@ -81,6 +72,12 @@ public class GetterMember extends FunctionalMember implements IPropertyMember {
81 72
 	public GetterMemberRef getOverrides() {
82 73
 		return overrides;
83 74
 	}
75
+
76
+	@Override
77
+	public void normalize(TypeScope scope) {
78
+		if (body != null)
79
+			body = body.normalize(scope, ConcatMap.empty(LoopStatement.class, LoopStatement.class));
80
+	}
84 81
 	
85 82
 	public void setOverrides(GetterMemberRef override) {
86 83
 		this.overrides = override;

+ 0
- 21
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/IIteratorMember.java Vedi File

@@ -1,21 +0,0 @@
1
-/*
2
- * To change this license header, choose License Headers in Project Properties.
3
- * To change this template file, choose Tools | Templates
4
- * and open the template in the editor.
5
- */
6
-package org.openzen.zenscript.codemodel.member;
7
-
8
-import org.openzen.zenscript.codemodel.iterator.ForeachIteratorVisitor;
9
-import org.openzen.zenscript.codemodel.type.ITypeID;
10
-
11
-/**
12
- *
13
- * @author Hoofdgebruiker
14
- */
15
-public interface IIteratorMember extends IDefinitionMember {
16
-	public int getLoopVariableCount();
17
-	
18
-	public ITypeID[] getLoopVariableTypes();
19
-	
20
-	public <T> T acceptForIterator(ForeachIteratorVisitor<T> visitor);
21
-}

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

@@ -1,23 +0,0 @@
1
-/*
2
- * To change this license header, choose License Headers in Project Properties.
3
- * To change this template file, choose Tools | Templates
4
- * and open the template in the editor.
5
- */
6
-package org.openzen.zenscript.codemodel.member;
7
-
8
-import org.openzen.zenscript.codemodel.annotations.MemberAnnotation;
9
-import org.openzen.zenscript.codemodel.type.ITypeID;
10
-
11
-/**
12
- *
13
- * @author Hoofdgebruiker
14
- */
15
-public interface IPropertyMember extends IDefinitionMember {
16
-	ITypeID getType();
17
-	
18
-	boolean isStatic();
19
-	
20
-	boolean isFinal();
21
-	
22
-	MemberAnnotation[] getAnnotations();
23
-}

CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/CustomIteratorMember.java → CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/IteratorMember.java Vedi File

@@ -9,7 +9,6 @@ import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.FunctionHeader;
10 10
 import org.openzen.zenscript.codemodel.GenericMapper;
11 11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
-import org.openzen.zenscript.codemodel.iterator.ForeachIteratorVisitor;
13 12
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
14 13
 import org.openzen.zenscript.codemodel.member.ref.IteratorMemberRef;
15 14
 import org.openzen.zenscript.codemodel.statement.Statement;
@@ -23,12 +22,12 @@ import org.openzen.zenscript.codemodel.type.member.TypeMembers;
23 22
  *
24 23
  * @author Hoofdgebruiker
25 24
  */
26
-public class CustomIteratorMember extends FunctionalMember implements IIteratorMember {
25
+public class IteratorMember extends FunctionalMember {
27 26
 	private final ITypeID[] iteratorTypes;
28 27
 	public Statement body;
29 28
 	public IteratorMemberRef overrides;
30 29
 	
31
-	public CustomIteratorMember(CodePosition position, HighLevelDefinition definition, int modifiers, ITypeID[] iteratorTypes, GlobalTypeRegistry registry, BuiltinID builtin) {
30
+	public IteratorMember(CodePosition position, HighLevelDefinition definition, int modifiers, ITypeID[] iteratorTypes, GlobalTypeRegistry registry, BuiltinID builtin) {
32 31
 		super(position, definition, modifiers, createIteratorHeader(registry, iteratorTypes), builtin);
33 32
 		
34 33
 		this.iteratorTypes = iteratorTypes;
@@ -42,25 +41,18 @@ public class CustomIteratorMember extends FunctionalMember implements IIteratorM
42 41
 	public String getCanonicalName() {
43 42
 		return definition.getFullName() + ":iterator:" + iteratorTypes.length;
44 43
 	}
45
-
46
-	@Override
44
+	
47 45
 	public int getLoopVariableCount() {
48 46
 		return iteratorTypes.length;
49 47
 	}
50
-
51
-	@Override
48
+	
52 49
 	public ITypeID[] getLoopVariableTypes() {
53 50
 		return iteratorTypes;
54 51
 	}
55
-	
56
-	@Override
57
-	public BuiltinID getBuiltin() {
58
-		return null;
59
-	}
60 52
 
61 53
 	@Override
62 54
 	public void registerTo(TypeMembers type, TypeMemberPriority priority, GenericMapper mapper) {
63
-		type.addIterator(new IteratorMemberRef(this, mapper.map(iteratorTypes)), priority);
55
+		type.addIterator(new IteratorMemberRef(this, mapper == null ? iteratorTypes : mapper.map(iteratorTypes)), priority);
64 56
 	}
65 57
 
66 58
 	@Override
@@ -72,11 +64,6 @@ public class CustomIteratorMember extends FunctionalMember implements IIteratorM
72 64
 	public <T> T accept(MemberVisitor<T> visitor) {
73 65
 		return visitor.visitCustomIterator(this);
74 66
 	}
75
-
76
-	@Override
77
-	public <T> T acceptForIterator(ForeachIteratorVisitor<T> visitor) {
78
-		return visitor.visitCustomIterator();
79
-	}
80 67
 	
81 68
 	public void setOverrides(IteratorMemberRef overrides) {
82 69
 		this.overrides = overrides;

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/MemberVisitor.java Vedi File

@@ -28,7 +28,7 @@ public interface MemberVisitor<T> {
28 28
 	
29 29
 	public T visitCaster(CasterMember member);
30 30
 	
31
-	public T visitCustomIterator(CustomIteratorMember member);
31
+	public T visitCustomIterator(IteratorMember member);
32 32
 	
33 33
 	public T visitCaller(CallerMember member);
34 34
 	

+ 6
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/PropertyMember.java Vedi File

@@ -14,7 +14,7 @@ import org.openzen.zenscript.codemodel.type.member.BuiltinID;
14 14
  *
15 15
  * @author Hoofdgebruiker
16 16
  */
17
-public abstract class PropertyMember extends DefinitionMember implements IPropertyMember {
17
+public abstract class PropertyMember extends DefinitionMember {
18 18
 	public ITypeID type;
19 19
 	public final BuiltinID builtin;
20 20
 	
@@ -25,8 +25,12 @@ public abstract class PropertyMember extends DefinitionMember implements IProper
25 25
 		this.builtin = builtin;
26 26
 	}
27 27
 	
28
-	@Override
29 28
 	public ITypeID getType() {
30 29
 		return type;
31 30
 	}
31
+	
32
+	@Override
33
+	public BuiltinID getBuiltin() {
34
+		return builtin;
35
+	}
32 36
 }

+ 13
- 17
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/SetterMember.java Vedi File

@@ -14,6 +14,7 @@ import org.openzen.zenscript.codemodel.HighLevelDefinition;
14 14
 import org.openzen.zenscript.codemodel.member.ref.SetterMemberRef;
15 15
 import org.openzen.zenscript.codemodel.scope.TypeScope;
16 16
 import org.openzen.zenscript.codemodel.statement.LoopStatement;
17
+import org.openzen.zenscript.codemodel.statement.Statement;
17 18
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
18 19
 import org.openzen.zenscript.codemodel.type.ITypeID;
19 20
 import org.openzen.zenscript.codemodel.type.member.BuiltinID;
@@ -24,10 +25,11 @@ import org.openzen.zenscript.codemodel.type.member.TypeMembers;
24 25
  *
25 26
  * @author Hoofdgebruiker
26 27
  */
27
-public class SetterMember extends FunctionalMember implements IPropertyMember {
28
-	public ITypeID type;
28
+public class SetterMember extends PropertyMember {
29 29
 	public final String name;
30 30
 	private SetterMemberRef overrides;
31
+	public Statement body;
32
+	public final FunctionParameter parameter;
31 33
 	
32 34
 	public SetterMember(
33 35
 			CodePosition position,
@@ -40,26 +42,15 @@ public class SetterMember extends FunctionalMember implements IPropertyMember {
40 42
 		super(position,
41 43
 				definition,
42 44
 				modifiers,
43
-				new FunctionHeader(BasicTypeID.VOID, new FunctionParameter(type, "$")),
45
+				type,
44 46
 				builtin);
45 47
 		
46
-		this.type = type;
47 48
 		this.name = name;
49
+		this.parameter = new FunctionParameter(type, "value");
48 50
 	}
49 51
 	
50
-	@Override
51
-	public ITypeID getType() {
52
-		return type;
53
-	}
54
-	
55
-	@Override
56
-	public String getCanonicalName() {
57
-		return definition.getFullName() + ":setter:" + name;
58
-	}
59
-
60
-	@Override
61
-	public FunctionalKind getKind() {
62
-		return FunctionalKind.SETTER;
52
+	public void setBody(Statement body) {
53
+		this.body = body;
63 54
 	}
64 55
 
65 56
 	@Override
@@ -88,6 +79,11 @@ public class SetterMember extends FunctionalMember implements IPropertyMember {
88 79
 			body = body.normalize(scope, ConcatMap.empty(LoopStatement.class, LoopStatement.class));
89 80
 	}
90 81
 	
82
+	@Override
83
+	public boolean isAbstract() {
84
+		return body == null && builtin == null;
85
+	}
86
+	
91 87
 	public void setOverrides(SetterMemberRef overrides) {
92 88
 		this.overrides = overrides;
93 89
 		

+ 4
- 11
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/StaticInitializerMember.java Vedi File

@@ -7,8 +7,8 @@ package org.openzen.zenscript.codemodel.member;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zencode.shared.ConcatMap;
10
-import org.openzen.zencode.shared.Taggable;
11 10
 import org.openzen.zenscript.codemodel.GenericMapper;
11
+import org.openzen.zenscript.codemodel.HighLevelDefinition;
12 12
 import org.openzen.zenscript.codemodel.annotations.MemberAnnotation;
13 13
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
14 14
 import org.openzen.zenscript.codemodel.scope.TypeScope;
@@ -22,18 +22,11 @@ import org.openzen.zenscript.codemodel.type.member.TypeMembers;
22 22
  *
23 23
  * @author Hoofdgebruiker
24 24
  */
25
-public class StaticInitializerMember extends Taggable implements IDefinitionMember {
26
-	public final CodePosition position;
25
+public class StaticInitializerMember extends DefinitionMember {
27 26
 	public Statement body;
28
-	public MemberAnnotation[] annotations = MemberAnnotation.NONE;
29 27
 	
30
-	public StaticInitializerMember(CodePosition position) {
31
-		this.position = position;
32
-	}
33
-	
34
-	@Override
35
-	public CodePosition getPosition() {
36
-		return position;
28
+	public StaticInitializerMember(CodePosition position, HighLevelDefinition definition) {
29
+		super(position, definition, 0);
37 30
 	}
38 31
 	
39 32
 	@Override

+ 0
- 95
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/builtin/ArrayIteratorKeyValues.java Vedi File

@@ -1,95 +0,0 @@
1
-/*
2
- * To change this license header, choose License Headers in Project Properties.
3
- * To change this template file, choose Tools | Templates
4
- * and open the template in the editor.
5
- */
6
-package org.openzen.zenscript.codemodel.member.builtin;
7
-
8
-import org.openzen.zencode.shared.CodePosition;
9
-import org.openzen.zencode.shared.Taggable;
10
-import org.openzen.zenscript.codemodel.GenericMapper;
11
-import org.openzen.zenscript.codemodel.iterator.ForeachIteratorVisitor;
12
-import org.openzen.zenscript.codemodel.member.IIteratorMember;
13
-import org.openzen.zenscript.codemodel.member.MemberVisitor;
14
-import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
15
-import org.openzen.zenscript.codemodel.member.ref.IteratorMemberRef;
16
-import org.openzen.zenscript.codemodel.scope.TypeScope;
17
-import org.openzen.zenscript.codemodel.type.ArrayTypeID;
18
-import org.openzen.zenscript.codemodel.type.BasicTypeID;
19
-import org.openzen.zenscript.codemodel.type.ITypeID;
20
-import org.openzen.zenscript.codemodel.type.member.BuiltinID;
21
-import org.openzen.zenscript.codemodel.type.member.TypeMemberPriority;
22
-import org.openzen.zenscript.codemodel.type.member.TypeMembers;
23
-
24
-/**
25
- *
26
- * @author Hoofdgebruiker
27
- */
28
-public class ArrayIteratorKeyValues extends Taggable implements IIteratorMember {
29
-	private ArrayTypeID type;
30
-	private final ITypeID[] loopVariableTypes;
31
-	
32
-	public ArrayIteratorKeyValues(ArrayTypeID type) {
33
-		this.type = type;
34
-		
35
-		loopVariableTypes = new ITypeID[type.dimension + 1];
36
-		for (int i = 0; i < type.dimension; i++)
37
-			loopVariableTypes[i] = BasicTypeID.INT;
38
-		loopVariableTypes[type.dimension] = type.elementType;
39
-	}
40
-	
41
-	@Override
42
-	public CodePosition getPosition() {
43
-		return CodePosition.BUILTIN;
44
-	}
45
-	
46
-	@Override
47
-	public BuiltinID getBuiltin() {
48
-		return null;
49
-	}
50
-
51
-	@Override
52
-	public int getLoopVariableCount() {
53
-		return loopVariableTypes.length;
54
-	}
55
-
56
-	@Override
57
-	public ITypeID[] getLoopVariableTypes() {
58
-		return loopVariableTypes;
59
-	}
60
-
61
-	@Override
62
-	public String describe() {
63
-		return "iterator for array elements with index";
64
-	}
65
-
66
-	@Override
67
-	public void registerTo(TypeMembers members, TypeMemberPriority priority, GenericMapper mapper) {
68
-		members.addIterator(new IteratorMemberRef(this, mapper == null ? loopVariableTypes : mapper.map(loopVariableTypes)), priority);
69
-	}
70
-
71
-	@Override
72
-	public <T> T accept(MemberVisitor<T> visitor) {
73
-		throw new UnsupportedOperationException("Not a compilable member");
74
-	}
75
-
76
-	@Override
77
-	public <T> T acceptForIterator(ForeachIteratorVisitor<T> visitor) {
78
-		return visitor.visitArrayKeyValueIterator();
79
-	}
80
-
81
-	@Override
82
-	public DefinitionMemberRef getOverrides() {
83
-		return null;
84
-	}
85
-
86
-	@Override
87
-	public void normalize(TypeScope scope) {
88
-		
89
-	}
90
-
91
-	@Override
92
-	public boolean isAbstract() {
93
-		return false;
94
-	}
95
-}

+ 0
- 90
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/builtin/ArrayIteratorValues.java Vedi File

@@ -1,90 +0,0 @@
1
-/*
2
- * To change this license header, choose License Headers in Project Properties.
3
- * To change this template file, choose Tools | Templates
4
- * and open the template in the editor.
5
- */
6
-package org.openzen.zenscript.codemodel.member.builtin;
7
-
8
-import org.openzen.zencode.shared.CodePosition;
9
-import org.openzen.zencode.shared.Taggable;
10
-import org.openzen.zenscript.codemodel.GenericMapper;
11
-import org.openzen.zenscript.codemodel.iterator.ForeachIteratorVisitor;
12
-import org.openzen.zenscript.codemodel.member.IIteratorMember;
13
-import org.openzen.zenscript.codemodel.member.MemberVisitor;
14
-import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
15
-import org.openzen.zenscript.codemodel.member.ref.IteratorMemberRef;
16
-import org.openzen.zenscript.codemodel.scope.TypeScope;
17
-import org.openzen.zenscript.codemodel.type.ArrayTypeID;
18
-import org.openzen.zenscript.codemodel.type.ITypeID;
19
-import org.openzen.zenscript.codemodel.type.member.BuiltinID;
20
-import org.openzen.zenscript.codemodel.type.member.TypeMemberPriority;
21
-import org.openzen.zenscript.codemodel.type.member.TypeMembers;
22
-
23
-/**
24
- *
25
- * @author Hoofdgebruiker
26
- */
27
-public class ArrayIteratorValues extends Taggable implements IIteratorMember {
28
-	private final ArrayTypeID type;
29
-	private final ITypeID[] loopVariableTypes;
30
-	
31
-	public ArrayIteratorValues(ArrayTypeID type) {
32
-		this.type = type;
33
-		loopVariableTypes = new ITypeID[] { type.elementType };
34
-	}
35
-	
36
-	@Override
37
-	public CodePosition getPosition() {
38
-		return CodePosition.BUILTIN;
39
-	}
40
-	
41
-	@Override
42
-	public BuiltinID getBuiltin() {
43
-		return null;
44
-	}
45
-
46
-	@Override
47
-	public int getLoopVariableCount() {
48
-		return 1;
49
-	}
50
-
51
-	@Override
52
-	public ITypeID[] getLoopVariableTypes() {
53
-		return loopVariableTypes;
54
-	}
55
-
56
-	@Override
57
-	public String describe() {
58
-		return "iterator for array values";
59
-	}
60
-
61
-	@Override
62
-	public void registerTo(TypeMembers members, TypeMemberPriority priority, GenericMapper mapper) {
63
-		members.addIterator(new IteratorMemberRef(this, mapper == null ? loopVariableTypes : mapper.map(loopVariableTypes)), priority);
64
-	}
65
-
66
-	@Override
67
-	public <T> T accept(MemberVisitor<T> visitor) {
68
-		throw new UnsupportedOperationException("Not a compilable member");
69
-	}
70
-
71
-	@Override
72
-	public <T> T acceptForIterator(ForeachIteratorVisitor<T> visitor) {
73
-		return visitor.visitArrayValueIterator();
74
-	}
75
-
76
-	@Override
77
-	public DefinitionMemberRef getOverrides() {
78
-		return null;
79
-	}
80
-
81
-	@Override
82
-	public void normalize(TypeScope scope) {
83
-		
84
-	}
85
-
86
-	@Override
87
-	public boolean isAbstract() {
88
-		return false;
89
-	}
90
-}

+ 0
- 93
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/builtin/AssocIterator.java Vedi File

@@ -1,93 +0,0 @@
1
-/*
2
- * To change this license header, choose License Headers in Project Properties.
3
- * To change this template file, choose Tools | Templates
4
- * and open the template in the editor.
5
- */
6
-package org.openzen.zenscript.codemodel.member.builtin;
7
-
8
-import org.openzen.zencode.shared.CodePosition;
9
-import org.openzen.zencode.shared.Taggable;
10
-import org.openzen.zenscript.codemodel.GenericMapper;
11
-import org.openzen.zenscript.codemodel.iterator.ForeachIteratorVisitor;
12
-import org.openzen.zenscript.codemodel.member.IIteratorMember;
13
-import org.openzen.zenscript.codemodel.member.MemberVisitor;
14
-import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
15
-import org.openzen.zenscript.codemodel.member.ref.IteratorMemberRef;
16
-import org.openzen.zenscript.codemodel.scope.TypeScope;
17
-import org.openzen.zenscript.codemodel.type.AssocTypeID;
18
-import org.openzen.zenscript.codemodel.type.ITypeID;
19
-import org.openzen.zenscript.codemodel.type.member.BuiltinID;
20
-import org.openzen.zenscript.codemodel.type.member.TypeMemberPriority;
21
-import org.openzen.zenscript.codemodel.type.member.TypeMembers;
22
-
23
-/**
24
- *
25
- * @author Hoofdgebruiker
26
- */
27
-public class AssocIterator extends Taggable implements IIteratorMember {
28
-	private final AssocTypeID type;
29
-	private final ITypeID[] loopVariableTypes;
30
-	
31
-	public AssocIterator(AssocTypeID type) {
32
-		this.type = type;
33
-		
34
-		loopVariableTypes = new ITypeID[2];
35
-		loopVariableTypes[0] = type.keyType;
36
-		loopVariableTypes[1] = type.valueType;
37
-	}
38
-	
39
-	@Override
40
-	public CodePosition getPosition() {
41
-		return CodePosition.BUILTIN;
42
-	}
43
-	
44
-	@Override
45
-	public BuiltinID getBuiltin() {
46
-		return null;
47
-	}
48
-
49
-	@Override
50
-	public int getLoopVariableCount() {
51
-		return loopVariableTypes.length;
52
-	}
53
-
54
-	@Override
55
-	public ITypeID[] getLoopVariableTypes() {
56
-		return loopVariableTypes;
57
-	}
58
-
59
-	@Override
60
-	public String describe() {
61
-		return "iterator for key/value pairs in an associative array";
62
-	}
63
-
64
-	@Override
65
-	public void registerTo(TypeMembers type, TypeMemberPriority priority, GenericMapper mapper) {
66
-		type.addIterator(new IteratorMemberRef(this, mapper == null ? loopVariableTypes : mapper.map(loopVariableTypes)), priority);
67
-	}
68
-
69
-	@Override
70
-	public <T> T accept(MemberVisitor<T> visitor) {
71
-		throw new UnsupportedOperationException("Not a compilable member");
72
-	}
73
-
74
-	@Override
75
-	public <T> T acceptForIterator(ForeachIteratorVisitor<T> visitor) {
76
-		return visitor.visitAssocKeyValueIterator();
77
-	}
78
-
79
-	@Override
80
-	public DefinitionMemberRef getOverrides() {
81
-		return null;
82
-	}
83
-
84
-	@Override
85
-	public void normalize(TypeScope scope) {
86
-		
87
-	}
88
-
89
-	@Override
90
-	public boolean isAbstract() {
91
-		return false;
92
-	}
93
-}

+ 0
- 101
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/builtin/RangeIterator.java Vedi File

@@ -1,101 +0,0 @@
1
-/*
2
- * To change this license header, choose License Headers in Project Properties.
3
- * To change this template file, choose Tools | Templates
4
- * and open the template in the editor.
5
- */
6
-package org.openzen.zenscript.codemodel.member.builtin;
7
-
8
-import org.openzen.zencode.shared.CodePosition;
9
-import org.openzen.zencode.shared.Taggable;
10
-import org.openzen.zenscript.codemodel.GenericMapper;
11
-import org.openzen.zenscript.codemodel.iterator.ForeachIteratorVisitor;
12
-import org.openzen.zenscript.codemodel.member.IIteratorMember;
13
-import org.openzen.zenscript.codemodel.member.MemberVisitor;
14
-import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
15
-import org.openzen.zenscript.codemodel.member.ref.IteratorMemberRef;
16
-import org.openzen.zenscript.codemodel.scope.TypeScope;
17
-import org.openzen.zenscript.codemodel.type.BasicTypeID;
18
-import org.openzen.zenscript.codemodel.type.ITypeID;
19
-import org.openzen.zenscript.codemodel.type.RangeTypeID;
20
-import org.openzen.zenscript.codemodel.type.member.BuiltinID;
21
-import org.openzen.zenscript.codemodel.type.member.TypeMemberPriority;
22
-import org.openzen.zenscript.codemodel.type.member.TypeMembers;
23
-
24
-/**
25
- *
26
- * @author Hoofdgebruiker
27
- */
28
-public class RangeIterator extends Taggable implements IIteratorMember {
29
-	private final ITypeID[] loopVariableTypes;
30
-	
31
-	public RangeIterator(RangeTypeID type) {
32
-		if (type.from != type.to)
33
-			throw new UnsupportedOperationException("Cannot iterator over a range with different from and to types");
34
-		if (type.from != BasicTypeID.BYTE
35
-				&& type.from != BasicTypeID.SBYTE
36
-				&& type.from != BasicTypeID.SHORT
37
-				&& type.from != BasicTypeID.USHORT
38
-				&& type.from != BasicTypeID.INT
39
-				&& type.from != BasicTypeID.UINT
40
-				&& type.from != BasicTypeID.LONG
41
-				&& type.from != BasicTypeID.ULONG)
42
-			throw new UnsupportedOperationException("Can only use range iterator over integer types");
43
-		
44
-		loopVariableTypes = new ITypeID[] { type.from };
45
-	}
46
-	
47
-	@Override
48
-	public CodePosition getPosition() {
49
-		return CodePosition.BUILTIN;
50
-	}
51
-	
52
-	@Override
53
-	public BuiltinID getBuiltin() {
54
-		return null;
55
-	}
56
-
57
-	@Override
58
-	public int getLoopVariableCount() {
59
-		return 1;
60
-	}
61
-
62
-	@Override
63
-	public ITypeID[] getLoopVariableTypes() {
64
-		return loopVariableTypes;
65
-	}
66
-
67
-	@Override
68
-	public String describe() {
69
-		return "range iterator";
70
-	}
71
-
72
-	@Override
73
-	public void registerTo(TypeMembers type, TypeMemberPriority priority, GenericMapper mapper) {
74
-		type.addIterator(new IteratorMemberRef(this, mapper == null ? loopVariableTypes : mapper.map(loopVariableTypes)), priority);
75
-	}
76
-
77
-	@Override
78
-	public <T> T accept(MemberVisitor<T> visitor) {
79
-		throw new UnsupportedOperationException("Not a compilable member");
80
-	}
81
-
82
-	@Override
83
-	public <T> T acceptForIterator(ForeachIteratorVisitor<T> visitor) {
84
-		return visitor.visitIntRange();
85
-	}
86
-
87
-	@Override
88
-	public DefinitionMemberRef getOverrides() {
89
-		return null;
90
-	}
91
-
92
-	@Override
93
-	public void normalize(TypeScope scope) {
94
-		
95
-	}
96
-
97
-	@Override
98
-	public boolean isAbstract() {
99
-		return false;
100
-	}
101
-}

+ 0
- 84
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/builtin/StringCharIterator.java Vedi File

@@ -1,84 +0,0 @@
1
-/*
2
- * To change this license header, choose License Headers in Project Properties.
3
- * To change this template file, choose Tools | Templates
4
- * and open the template in the editor.
5
- */
6
-package org.openzen.zenscript.codemodel.member.builtin;
7
-
8
-import org.openzen.zencode.shared.CodePosition;
9
-import org.openzen.zencode.shared.Taggable;
10
-import org.openzen.zenscript.codemodel.GenericMapper;
11
-import org.openzen.zenscript.codemodel.iterator.ForeachIteratorVisitor;
12
-import org.openzen.zenscript.codemodel.member.IIteratorMember;
13
-import org.openzen.zenscript.codemodel.member.MemberVisitor;
14
-import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
15
-import org.openzen.zenscript.codemodel.member.ref.IteratorMemberRef;
16
-import org.openzen.zenscript.codemodel.scope.TypeScope;
17
-import org.openzen.zenscript.codemodel.type.BasicTypeID;
18
-import org.openzen.zenscript.codemodel.type.ITypeID;
19
-import org.openzen.zenscript.codemodel.type.member.BuiltinID;
20
-import org.openzen.zenscript.codemodel.type.member.TypeMemberPriority;
21
-import org.openzen.zenscript.codemodel.type.member.TypeMembers;
22
-
23
-/**
24
- *
25
- * @author Hoofdgebruiker
26
- */
27
-public class StringCharIterator extends Taggable implements IIteratorMember {
28
-	private static final ITypeID[] TYPES = new ITypeID[] { BasicTypeID.CHAR };
29
-
30
-	@Override
31
-	public int getLoopVariableCount() {
32
-		return 1;
33
-	}
34
-	
35
-	@Override
36
-	public BuiltinID getBuiltin() {
37
-		return null;
38
-	}
39
-
40
-	@Override
41
-	public ITypeID[] getLoopVariableTypes() {
42
-		return TYPES;
43
-	}
44
-
45
-	@Override
46
-	public <T> T acceptForIterator(ForeachIteratorVisitor<T> visitor) {
47
-		return visitor.visitStringCharacterIterator();
48
-	}
49
-
50
-	@Override
51
-	public CodePosition getPosition() {
52
-		return CodePosition.BUILTIN;
53
-	}
54
-
55
-	@Override
56
-	public String describe() {
57
-		return "string character iterator";
58
-	}
59
-
60
-	@Override
61
-	public void registerTo(TypeMembers type, TypeMemberPriority priority, GenericMapper mapper) {
62
-		type.addIterator(new IteratorMemberRef(this, TYPES), priority);
63
-	}
64
-
65
-	@Override
66
-	public <T> T accept(MemberVisitor<T> visitor) {
67
-		throw new UnsupportedOperationException("Not a compilable member");
68
-	}
69
-
70
-	@Override
71
-	public DefinitionMemberRef getOverrides() {
72
-		return null;
73
-	}
74
-
75
-	@Override
76
-	public void normalize(TypeScope scope) {
77
-		
78
-	}
79
-
80
-	@Override
81
-	public boolean isAbstract() {
82
-		return false;
83
-	}
84
-}

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/GetterMemberRef.java Vedi File

@@ -34,7 +34,7 @@ public class GetterMemberRef extends PropertyRef {
34 34
 	}
35 35
 
36 36
 	@Override
37
-	public DefinitionMemberRef getOverrides() {
37
+	public GetterMemberRef getOverrides() {
38 38
 		return member.getOverrides();
39 39
 	}
40 40
 }

+ 5
- 6
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/IteratorMemberRef.java Vedi File

@@ -8,9 +8,8 @@ package org.openzen.zenscript.codemodel.member.ref;
8 8
 import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.FunctionHeader;
10 10
 import org.openzen.zenscript.codemodel.annotations.MemberAnnotation;
11
-import org.openzen.zenscript.codemodel.member.CustomIteratorMember;
11
+import org.openzen.zenscript.codemodel.member.IteratorMember;
12 12
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
13
-import org.openzen.zenscript.codemodel.member.IIteratorMember;
14 13
 import org.openzen.zenscript.codemodel.type.ITypeID;
15 14
 
16 15
 /**
@@ -18,10 +17,10 @@ import org.openzen.zenscript.codemodel.type.ITypeID;
18 17
  * @author Hoofdgebruiker
19 18
  */
20 19
 public class IteratorMemberRef implements DefinitionMemberRef {
21
-	public final IIteratorMember target;
20
+	public final IteratorMember target;
22 21
 	public final ITypeID[] types;
23 22
 	
24
-	public IteratorMemberRef(IIteratorMember target, ITypeID... types) {
23
+	public IteratorMemberRef(IteratorMember target, ITypeID... types) {
25 24
 		this.target = target;
26 25
 		this.types = types;
27 26
 	}
@@ -57,8 +56,8 @@ public class IteratorMemberRef implements DefinitionMemberRef {
57 56
 
58 57
 	@Override
59 58
 	public MemberAnnotation[] getAnnotations() {
60
-		if (target instanceof CustomIteratorMember) {
61
-			return ((CustomIteratorMember)target).annotations;
59
+		if (target instanceof IteratorMember) {
60
+			return ((IteratorMember)target).annotations;
62 61
 		} else {
63 62
 			return null;
64 63
 		}

+ 3
- 3
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/PropertyRef.java Vedi File

@@ -10,7 +10,7 @@ import org.openzen.zenscript.codemodel.FunctionHeader;
10 10
 import org.openzen.zenscript.codemodel.GenericMapper;
11 11
 import org.openzen.zenscript.codemodel.annotations.MemberAnnotation;
12 12
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
13
-import org.openzen.zenscript.codemodel.member.IPropertyMember;
13
+import org.openzen.zenscript.codemodel.member.PropertyMember;
14 14
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
15 15
 import org.openzen.zenscript.codemodel.type.ITypeID;
16 16
 
@@ -19,12 +19,12 @@ import org.openzen.zenscript.codemodel.type.ITypeID;
19 19
  * @author Hoofdgebruiker
20 20
  */
21 21
 public abstract class PropertyRef implements DefinitionMemberRef {
22
-	private final IPropertyMember member;
22
+	private final PropertyMember member;
23 23
 	
24 24
 	private ITypeID type;
25 25
 	private GenericMapper mapper;
26 26
 	
27
-	public PropertyRef(IPropertyMember member, GenericMapper mapper) {
27
+	public PropertyRef(PropertyMember member, GenericMapper mapper) {
28 28
 		this.member = member;
29 29
 		
30 30
 		if (member.getType() == BasicTypeID.UNDETERMINED) {

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/SetterMemberRef.java Vedi File

@@ -22,7 +22,7 @@ public class SetterMemberRef extends PropertyRef {
22 22
 	}
23 23
 
24 24
 	@Override
25
-	public DefinitionMemberRef getOverrides() {
25
+	public SetterMemberRef getOverrides() {
26 26
 		return member.getOverrides();
27 27
 	}
28 28
 }

+ 3
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/VariantOptionRef.java Vedi File

@@ -14,10 +14,12 @@ import org.openzen.zenscript.codemodel.type.ITypeID;
14 14
  */
15 15
 public class VariantOptionRef {
16 16
 	private final VariantDefinition.Option option;
17
+	public final ITypeID variant;
17 18
 	public final ITypeID[] types;
18 19
 	
19
-	public VariantOptionRef(VariantDefinition.Option option, ITypeID[] types) {
20
+	public VariantOptionRef(VariantDefinition.Option option, ITypeID variant, ITypeID[] types) {
20 21
 		this.option = option;
22
+		this.variant = variant;
21 23
 		this.types = types;
22 24
 	}
23 25
 	

+ 73
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/partial/PartialVariantOptionExpression.java Vedi File

@@ -0,0 +1,73 @@
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.partial;
7
+
8
+import java.util.Arrays;
9
+import java.util.Collections;
10
+import java.util.List;
11
+import org.openzen.zencode.shared.CodePosition;
12
+import org.openzen.zencode.shared.CompileException;
13
+import org.openzen.zencode.shared.CompileExceptionCode;
14
+import org.openzen.zenscript.codemodel.FunctionHeader;
15
+import org.openzen.zenscript.codemodel.expression.CallArguments;
16
+import org.openzen.zenscript.codemodel.expression.Expression;
17
+import org.openzen.zenscript.codemodel.expression.VariantValueExpression;
18
+import org.openzen.zenscript.codemodel.member.ref.VariantOptionRef;
19
+import org.openzen.zenscript.codemodel.scope.TypeScope;
20
+import org.openzen.zenscript.codemodel.type.GenericName;
21
+import org.openzen.zenscript.codemodel.type.ITypeID;
22
+
23
+/**
24
+ *
25
+ * @author Hoofdgebruiker
26
+ */
27
+public class PartialVariantOptionExpression implements IPartialExpression {
28
+	private final CodePosition position;
29
+	private final TypeScope scope;
30
+	private final VariantOptionRef option;
31
+	
32
+	public PartialVariantOptionExpression(CodePosition position, TypeScope scope, VariantOptionRef option) {
33
+		this.position = position;
34
+		this.scope = scope;
35
+		this.option = option;
36
+	}
37
+	
38
+	@Override
39
+	public Expression eval() {
40
+		throw new CompileException(position, CompileExceptionCode.VARIANT_OPTION_NOT_AN_EXPRESSION, "Cannot use a variant option as expression");
41
+	}
42
+
43
+	@Override
44
+	public List<ITypeID>[] predictCallTypes(TypeScope scope, List<ITypeID> hints, int arguments) {
45
+		if (arguments != option.getOption().types.length)
46
+			return new List[0];
47
+		
48
+		return new List[] { Arrays.asList(option.getOption().types) };
49
+	}
50
+
51
+	@Override
52
+	public List<FunctionHeader> getPossibleFunctionHeaders(TypeScope scope, List<ITypeID> hints, int arguments) {
53
+		if (arguments != option.getOption().types.length)
54
+			return Collections.emptyList();
55
+		
56
+		return Collections.singletonList(new FunctionHeader(option.variant, option.types));
57
+	}
58
+
59
+	@Override
60
+	public IPartialExpression getMember(CodePosition position, TypeScope scope, List<ITypeID> hints, GenericName name) {
61
+		throw new CompileException(position, CompileExceptionCode.NO_SUCH_MEMBER, "Variant options don't have members");
62
+	}
63
+
64
+	@Override
65
+	public Expression call(CodePosition position, TypeScope scope, List<ITypeID> hints, CallArguments arguments) {
66
+		return new VariantValueExpression(position, option.variant, option, arguments.arguments);
67
+	}
68
+
69
+	@Override
70
+	public ITypeID[] getGenericCallTypes() {
71
+		return ITypeID.NONE;
72
+	}
73
+}

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/scope/DefinitionScope.java Vedi File

@@ -76,7 +76,7 @@ public class DefinitionScope extends BaseScope {
76 76
 		}
77 77
 		
78 78
 		members = withMembers ? outer.getMemberCache().get(type) : null;
79
-		typeParameterMap = outer.getLocalTypeParameters().getInner(typeParameters);
79
+		typeParameterMap = outer.getLocalTypeParameters().getInner(getTypeRegistry(), typeParameters);
80 80
 	}
81 81
 	
82 82
 	public void addInnerType(String name, Supplier<HighLevelDefinition> innerType) {

+ 2
- 8
CodeModel/src/main/java/org/openzen/zenscript/codemodel/scope/ExpressionScope.java Vedi File

@@ -22,6 +22,7 @@ import org.openzen.zenscript.codemodel.generic.TypeParameter;
22 22
 import org.openzen.zenscript.codemodel.partial.IPartialExpression;
23 23
 import org.openzen.zenscript.codemodel.statement.LoopStatement;
24 24
 import org.openzen.zenscript.codemodel.statement.VarStatement;
25
+import org.openzen.zenscript.codemodel.type.BasicTypeID;
25 26
 import org.openzen.zenscript.codemodel.type.GenericName;
26 27
 import org.openzen.zenscript.codemodel.type.ITypeID;
27 28
 import org.openzen.zenscript.codemodel.type.member.LocalMemberCache;
@@ -55,18 +56,11 @@ public class ExpressionScope extends BaseScope {
55 56
 	
56 57
 	public ExpressionScope(BaseScope scope, ITypeID hint) {
57 58
 		this.outer = scope;
58
-		this.hints = Collections.singletonList(hint);
59
+		this.hints = hint == BasicTypeID.UNDETERMINED ? Collections.emptyList() : Collections.singletonList(hint);
59 60
 		this.dollar = null;
60 61
 		this.genericInferenceMap = Collections.emptyMap();
61 62
 	}
62 63
 	
63
-	public ExpressionScope(BaseScope scope, List<ITypeID> hints, Function<CodePosition, Expression> dollar, Map<TypeParameter, ITypeID> genericInferenceMap) {
64
-		this.outer = scope;
65
-		this.hints = hints;
66
-		this.dollar = dollar;
67
-		this.genericInferenceMap = genericInferenceMap;
68
-	}
69
-	
70 64
 	private ExpressionScope(
71 65
 			BaseScope scope,
72 66
 			List<ITypeID> hints,

+ 1
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/BasicTypeID.java Vedi File

@@ -26,6 +26,7 @@ public enum BasicTypeID implements ITypeID {
26 26
 	UINT("uint"),
27 27
 	LONG("long"),
28 28
 	ULONG("ulong"),
29
+	USIZE("usize"),
29 30
 	FLOAT("float"),
30 31
 	DOUBLE("double"),
31 32
 	CHAR("char"),

+ 2
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/DefinitionTypeID.java Vedi File

@@ -133,6 +133,8 @@ public class DefinitionTypeID implements ITypeID {
133 133
 			return this;
134 134
 		if (mapper.getMapping().isEmpty())
135 135
 			return this;
136
+		if (mapper.registry == null)
137
+			throw new NullPointerException();
136 138
 		
137 139
 		ITypeID[] instancedArguments = ITypeID.NONE;
138 140
 		if (hasTypeParameters()) {

+ 4
- 4
CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/FunctionTypeID.java Vedi File

@@ -74,7 +74,7 @@ public class FunctionTypeID implements ITypeID {
74 74
 
75 75
 	@Override
76 76
 	public void extractTypeParameters(List<TypeParameter> typeParameters) {
77
-		header.returnType.extractTypeParameters(typeParameters);
77
+		header.getReturnType().extractTypeParameters(typeParameters);
78 78
 		for (FunctionParameter parameter : header.parameters)
79 79
 			parameter.type.extractTypeParameters(typeParameters);
80 80
 	}
@@ -82,7 +82,7 @@ public class FunctionTypeID implements ITypeID {
82 82
 	@Override
83 83
 	public int hashCode() {
84 84
 		int hash = 5;
85
-		hash = 71 * hash + header.returnType.hashCode();
85
+		hash = 71 * hash + header.getReturnType().hashCode();
86 86
 		hash = 71 * hash + Arrays.deepHashCode(header.parameters);
87 87
 		hash = 71 * hash + Arrays.deepHashCode(header.typeParameters);
88 88
 		return hash;
@@ -100,7 +100,7 @@ public class FunctionTypeID implements ITypeID {
100 100
 			return false;
101 101
 		}
102 102
 		final FunctionTypeID other = (FunctionTypeID) obj;
103
-		return this.header.returnType == other.header.returnType
103
+		return this.header.getReturnType() == other.header.getReturnType()
104 104
 				&& Arrays.deepEquals(this.header.parameters, other.header.parameters)
105 105
 				&& Arrays.deepEquals(this.header.typeParameters, other.header.typeParameters);
106 106
 	}
@@ -120,7 +120,7 @@ public class FunctionTypeID implements ITypeID {
120 120
 		}
121 121
 		result.append(')');
122 122
 		result.append(" as ");
123
-		result.append(header.returnType);
123
+		result.append(header.getReturnType());
124 124
 		return result.toString();
125 125
 	}
126 126
 }

+ 3
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/GlobalTypeRegistry.java Vedi File

@@ -37,6 +37,7 @@ public class GlobalTypeRegistry {
37 37
 		arrayTypes.put(ArrayTypeID.CHAR, ArrayTypeID.CHAR);
38 38
 		
39 39
 		rangeTypes.put(RangeTypeID.INT, RangeTypeID.INT);
40
+		rangeTypes.put(RangeTypeID.USIZE, RangeTypeID.USIZE);
40 41
 	}
41 42
 	
42 43
 	public ArrayTypeID getArray(ITypeID baseType, int dimension) {
@@ -89,8 +90,8 @@ public class GlobalTypeRegistry {
89 90
 		}
90 91
 	}
91 92
 	
92
-	public RangeTypeID getRange(ITypeID from, ITypeID to) {
93
-		RangeTypeID id = new RangeTypeID(this, from, to);
93
+	public RangeTypeID getRange(ITypeID type) {
94
+		RangeTypeID id = new RangeTypeID(this, type);
94 95
 		if (rangeTypes.containsKey(id)) {
95 96
 			return rangeTypes.get(id);
96 97
 		} else {

+ 2
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/ITypeID.java Vedi File

@@ -149,7 +149,7 @@ public interface ITypeID {
149 149
 				if (functionType.header.parameters.length != function.header.parameters.length)
150 150
 					return false;
151 151
 				
152
-				if (!match(functionType.header.returnType, function.header.returnType))
152
+				if (!match(functionType.header.getReturnType(), function.header.getReturnType()))
153 153
 					return false;
154 154
 				
155 155
 				for (int i = 0; i < function.header.parameters.length; i++) {
@@ -199,7 +199,7 @@ public interface ITypeID {
199 199
 		public Boolean visitRange(RangeTypeID range) {
200 200
 			if (type instanceof RangeTypeID) {
201 201
 				RangeTypeID rangeType = (RangeTypeID) type;
202
-				return match(rangeType.from, range.from) && match(rangeType.to, range.to);
202
+				return match(rangeType.baseType, range.baseType);
203 203
 			} else {
204 204
 				return false;
205 205
 			}

+ 13
- 18
CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/RangeTypeID.java Vedi File

@@ -14,20 +14,19 @@ import org.openzen.zenscript.codemodel.generic.TypeParameter;
14 14
  * @author Hoofdgebruiker
15 15
  */
16 16
 public class RangeTypeID implements ITypeID {
17
-	public static final RangeTypeID INT = new RangeTypeID(null, BasicTypeID.INT, BasicTypeID.INT);
17
+	public static final RangeTypeID INT = new RangeTypeID(null, BasicTypeID.INT);
18
+	public static final RangeTypeID USIZE = new RangeTypeID(null, BasicTypeID.USIZE);
18 19
 	
19
-	public final ITypeID from;
20
-	public final ITypeID to;
20
+	public final ITypeID baseType;
21 21
 	private final RangeTypeID normalized;
22 22
 	
23
-	public RangeTypeID(GlobalTypeRegistry registry, ITypeID from, ITypeID to) {
24
-		this.from = from;
25
-		this.to = to;
23
+	public RangeTypeID(GlobalTypeRegistry registry, ITypeID baseType) {
24
+		this.baseType = baseType;
26 25
 		
27
-		if (from.getNormalized() == from && to.getNormalized() == to) {
26
+		if (baseType.getNormalized() == baseType) {
28 27
 			normalized = this;
29 28
 		} else {
30
-			normalized = registry.getRange(from.getNormalized(), to.getNormalized());
29
+			normalized = registry.getRange(baseType.getNormalized());
31 30
 		}
32 31
 	}
33 32
 	
@@ -38,9 +37,7 @@ public class RangeTypeID implements ITypeID {
38 37
 	
39 38
 	@Override
40 39
 	public ITypeID instance(GenericMapper mapper) {
41
-		return mapper.registry.getRange(
42
-				from.instance(mapper),
43
-				to.instance(mapper));
40
+		return mapper.registry.getRange(baseType.instance(mapper));
44 41
 	}
45 42
 
46 43
 	@Override
@@ -70,7 +67,7 @@ public class RangeTypeID implements ITypeID {
70 67
 
71 68
 	@Override
72 69
 	public boolean hasInferenceBlockingTypeParameters(TypeParameter[] parameters) {
73
-		return from.hasInferenceBlockingTypeParameters(parameters) || to.hasInferenceBlockingTypeParameters(parameters);
70
+		return baseType.hasInferenceBlockingTypeParameters(parameters);
74 71
 	}
75 72
 
76 73
 	@Override
@@ -80,15 +77,13 @@ public class RangeTypeID implements ITypeID {
80 77
 
81 78
 	@Override
82 79
 	public void extractTypeParameters(List<TypeParameter> typeParameters) {
83
-		from.extractTypeParameters(typeParameters);
84
-		to.extractTypeParameters(typeParameters);
80
+		baseType.extractTypeParameters(typeParameters);
85 81
 	}
86 82
 
87 83
 	@Override
88 84
 	public int hashCode() {
89 85
 		int hash = 5;
90
-		hash = 89 * hash + from.hashCode();
91
-		hash = 89 * hash + to.hashCode();
86
+		hash = 89 * hash + baseType.hashCode();
92 87
 		return hash;
93 88
 	}
94 89
 
@@ -104,11 +99,11 @@ public class RangeTypeID implements ITypeID {
104 99
 			return false;
105 100
 		}
106 101
 		final RangeTypeID other = (RangeTypeID) obj;
107
-		return this.from == other.from && this.to == other.to;
102
+		return this.baseType == other.baseType;
108 103
 	}
109 104
 	
110 105
 	@Override
111 106
 	public String toString() {
112
-		return from.toString() + " .. " + to.toString();
107
+		return baseType.toString() + " .. " + baseType.toString();
113 108
 	}
114 109
 }

+ 2
- 3
CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/TypeParameterCollector.java Vedi File

@@ -52,7 +52,7 @@ public class TypeParameterCollector implements ITypeVisitor<Void> {
52 52
 
53 53
 	@Override
54 54
 	public Void visitFunction(FunctionTypeID function) {
55
-		function.header.returnType.accept(this);
55
+		function.header.getReturnType().accept(this);
56 56
 		for (FunctionParameter parameter : function.header.parameters)
57 57
 			parameter.type.accept(this);
58 58
 		return null;
@@ -75,8 +75,7 @@ public class TypeParameterCollector implements ITypeVisitor<Void> {
75 75
 
76 76
 	@Override
77 77
 	public Void visitRange(RangeTypeID range) {
78
-		range.from.accept(this);
79
-		range.to.accept(this);
78
+		range.baseType.accept(this);
80 79
 		return null;
81 80
 	}
82 81
 

+ 60
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/member/BuiltinID.java Vedi File

@@ -38,6 +38,7 @@ public enum BuiltinID {
38 38
 	BYTE_TO_UINT,
39 39
 	BYTE_TO_LONG,
40 40
 	BYTE_TO_ULONG,
41
+	BYTE_TO_USIZE,
41 42
 	BYTE_TO_FLOAT,
42 43
 	BYTE_TO_DOUBLE,
43 44
 	BYTE_TO_CHAR,
@@ -67,6 +68,7 @@ public enum BuiltinID {
67 68
 	SBYTE_TO_UINT,
68 69
 	SBYTE_TO_LONG,
69 70
 	SBYTE_TO_ULONG,
71
+	SBYTE_TO_USIZE,
70 72
 	SBYTE_TO_FLOAT,
71 73
 	SBYTE_TO_DOUBLE,
72 74
 	SBYTE_TO_CHAR,
@@ -96,6 +98,7 @@ public enum BuiltinID {
96 98
 	SHORT_TO_UINT,
97 99
 	SHORT_TO_LONG,
98 100
 	SHORT_TO_ULONG,
101
+	SHORT_TO_USIZE,
99 102
 	SHORT_TO_FLOAT,
100 103
 	SHORT_TO_DOUBLE,
101 104
 	SHORT_TO_CHAR,
@@ -124,6 +127,7 @@ public enum BuiltinID {
124 127
 	USHORT_TO_UINT,
125 128
 	USHORT_TO_LONG,
126 129
 	USHORT_TO_ULONG,
130
+	USHORT_TO_USIZE,
127 131
 	USHORT_TO_FLOAT,
128 132
 	USHORT_TO_DOUBLE,
129 133
 	USHORT_TO_CHAR,
@@ -156,6 +160,7 @@ public enum BuiltinID {
156 160
 	INT_TO_UINT,
157 161
 	INT_TO_LONG,
158 162
 	INT_TO_ULONG,
163
+	INT_TO_USIZE,
159 164
 	INT_TO_FLOAT,
160 165
 	INT_TO_DOUBLE,
161 166
 	INT_TO_CHAR,
@@ -195,6 +200,7 @@ public enum BuiltinID {
195 200
 	UINT_TO_INT,
196 201
 	UINT_TO_LONG,
197 202
 	UINT_TO_ULONG,
203
+	UINT_TO_USIZE,
198 204
 	UINT_TO_FLOAT,
199 205
 	UINT_TO_DOUBLE,
200 206
 	UINT_TO_CHAR,
@@ -236,6 +242,7 @@ public enum BuiltinID {
236 242
 	LONG_TO_INT,
237 243
 	LONG_TO_UINT,
238 244
 	LONG_TO_ULONG,
245
+	LONG_TO_USIZE,
239 246
 	LONG_TO_FLOAT,
240 247
 	LONG_TO_DOUBLE,
241 248
 	LONG_TO_CHAR,
@@ -275,6 +282,7 @@ public enum BuiltinID {
275 282
 	ULONG_TO_INT,
276 283
 	ULONG_TO_UINT,
277 284
 	ULONG_TO_LONG,
285
+	ULONG_TO_USIZE,
278 286
 	ULONG_TO_FLOAT,
279 287
 	ULONG_TO_DOUBLE,
280 288
 	ULONG_TO_CHAR,
@@ -293,6 +301,47 @@ public enum BuiltinID {
293 301
 	ULONG_LOWEST_ZERO_BIT,
294 302
 	ULONG_BIT_COUNT,
295 303
 	
304
+	USIZE_NOT,
305
+	USIZE_INC,
306
+	USIZE_DEC,
307
+	USIZE_ADD_USIZE,
308
+	USIZE_SUB_USIZE,
309
+	USIZE_MUL_USIZE,
310
+	USIZE_DIV_USIZE,
311
+	USIZE_MOD_USIZE,
312
+	USIZE_AND_USIZE,
313
+	USIZE_OR_USIZE,
314
+	USIZE_XOR_USIZE,
315
+	USIZE_SHL,
316
+	USIZE_SHR,
317
+	USIZE_COMPARE,
318
+	USIZE_TO_BYTE,
319
+	USIZE_TO_SBYTE,
320
+	USIZE_TO_SHORT,
321
+	USIZE_TO_USHORT,
322
+	USIZE_TO_INT,
323
+	USIZE_TO_UINT,
324
+	USIZE_TO_LONG,
325
+	USIZE_TO_ULONG,
326
+	USIZE_TO_FLOAT,
327
+	USIZE_TO_DOUBLE,
328
+	USIZE_TO_CHAR,
329
+	USIZE_TO_STRING,
330
+	USIZE_PARSE,
331
+	USIZE_PARSE_WITH_BASE,
332
+	USIZE_GET_MIN_VALUE,
333
+	USIZE_GET_MAX_VALUE,
334
+	USIZE_COUNT_LOW_ZEROES,
335
+	USIZE_COUNT_HIGH_ZEROES,
336
+	USIZE_COUNT_LOW_ONES,
337
+	USIZE_COUNT_HIGH_ONES,
338
+	USIZE_HIGHEST_ONE_BIT,
339
+	USIZE_LOWEST_ONE_BIT,
340
+	USIZE_HIGHEST_ZERO_BIT,
341
+	USIZE_LOWEST_ZERO_BIT,
342
+	USIZE_BIT_COUNT,
343
+	USIZE_BITS,
344
+	
296 345
 	FLOAT_NEG,
297 346
 	FLOAT_INC,
298 347
 	FLOAT_DEC,
@@ -310,6 +359,7 @@ public enum BuiltinID {
310 359
 	FLOAT_TO_UINT,
311 360
 	FLOAT_TO_LONG,
312 361
 	FLOAT_TO_ULONG,
362
+	FLOAT_TO_USIZE,
313 363
 	FLOAT_TO_DOUBLE,
314 364
 	FLOAT_TO_STRING,
315 365
 	FLOAT_BITS,
@@ -335,6 +385,7 @@ public enum BuiltinID {
335 385
 	DOUBLE_TO_UINT,
336 386
 	DOUBLE_TO_LONG,
337 387
 	DOUBLE_TO_ULONG,
388
+	DOUBLE_TO_USIZE,
338 389
 	DOUBLE_TO_FLOAT,
339 390
 	DOUBLE_TO_STRING,
340 391
 	DOUBLE_BITS,
@@ -355,6 +406,7 @@ public enum BuiltinID {
355 406
 	CHAR_TO_UINT,
356 407
 	CHAR_TO_LONG,
357 408
 	CHAR_TO_ULONG,
409
+	CHAR_TO_USIZE,
358 410
 	CHAR_TO_STRING,
359 411
 	CHAR_GET_MIN_VALUE,
360 412
 	CHAR_GET_MAX_VALUE,
@@ -444,5 +496,12 @@ public enum BuiltinID {
444 496
 	
445 497
 	OPTIONAL_IS_NULL,
446 498
 	OPTIONAL_IS_NOT_NULL,
447
-	AUTOOP_NOTEQUALS
499
+	AUTOOP_NOTEQUALS,
500
+	
501
+	ITERATOR_INT_RANGE,
502
+	ITERATOR_ARRAY_VALUES,
503
+	ITERATOR_ARRAY_KEY_VALUES,
504
+	ITERATOR_ASSOC_KEYS,
505
+	ITERATOR_ASSOC_KEY_VALUES,
506
+	ITERATOR_STRING_CHARS
448 507
 }

+ 3
- 4
CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/member/DefinitionMemberGroup.java Vedi File

@@ -24,7 +24,6 @@ import org.openzen.zenscript.codemodel.generic.TypeParameter;
24 24
 import org.openzen.zenscript.codemodel.type.ITypeID;
25 25
 import org.openzen.zenscript.codemodel.CompareType;
26 26
 import org.openzen.zenscript.codemodel.FunctionHeader;
27
-import org.openzen.zenscript.codemodel.GenericMapper;
28 27
 import org.openzen.zenscript.codemodel.expression.ConstExpression;
29 28
 import org.openzen.zenscript.codemodel.expression.PostCallExpression;
30 29
 import org.openzen.zenscript.codemodel.member.FunctionalMember;
@@ -263,8 +262,8 @@ public class DefinitionMemberGroup {
263 262
 			if (header.typeParameters != null) {
264 263
 				for (ITypeID resultHint : typeHints) {
265 264
 					Map<TypeParameter, ITypeID> mapping = new HashMap<>();
266
-					if (header.returnType.inferTypeParameters(scope.getMemberCache(), resultHint, mapping)) {
267
-						header = header.withGenericArguments(scope.getLocalTypeParameters().getInner(mapping));
265
+					if (header.getReturnType().inferTypeParameters(scope.getMemberCache(), resultHint, mapping)) {
266
+						header = header.withGenericArguments(scope.getTypeRegistry(), scope.getLocalTypeParameters().getInner(scope.getTypeRegistry(), mapping));
268 267
 						break;
269 268
 					}
270 269
 				}
@@ -361,7 +360,7 @@ public class DefinitionMemberGroup {
361 360
 				throw new CompileException(position, CompileExceptionCode.CALL_NO_VALID_METHOD, "This type has no " + name);
362 361
 			}
363 362
 			
364
-			outer: for (TypeMember<FunctionalMemberRef> method : methods) {
363
+			for (TypeMember<FunctionalMemberRef> method : methods) {
365 364
 				if (!(method.member.isStatic() ? allowStatic : allowNonStatic)) {
366 365
 					message.append(method.member.isStatic() ? "Method must not be static" : "Method must be static").append('\n');
367 366
 					continue;

+ 135
- 41
CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/member/TypeMemberBuilder.java Vedi File

@@ -47,11 +47,6 @@ import org.openzen.zenscript.codemodel.member.GetterMember;
47 47
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
48 48
 import org.openzen.zenscript.codemodel.member.MethodMember;
49 49
 import org.openzen.zenscript.codemodel.member.OperatorMember;
50
-import org.openzen.zenscript.codemodel.member.builtin.ArrayIteratorKeyValues;
51
-import org.openzen.zenscript.codemodel.member.builtin.ArrayIteratorValues;
52
-import org.openzen.zenscript.codemodel.member.builtin.AssocIterator;
53
-import org.openzen.zenscript.codemodel.member.builtin.RangeIterator;
54
-import org.openzen.zenscript.codemodel.member.builtin.StringCharIterator;
55 50
 import org.openzen.zenscript.codemodel.member.ref.CasterMemberRef;
56 51
 import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
57 52
 import org.openzen.zenscript.codemodel.member.ref.TranslatedOperatorMemberRef;
@@ -74,6 +69,8 @@ import static org.openzen.zencode.shared.CodePosition.BUILTIN;
74 69
 import org.openzen.zencode.shared.CompileException;
75 70
 import org.openzen.zencode.shared.CompileExceptionCode;
76 71
 import org.openzen.zenscript.codemodel.definition.InterfaceDefinition;
72
+import org.openzen.zenscript.codemodel.expression.ConstantUSizeExpression;
73
+import org.openzen.zenscript.codemodel.member.IteratorMember;
77 74
 
78 75
 /**
79 76
  *
@@ -153,6 +150,9 @@ public class TypeMemberBuilder implements ITypeVisitor<Void> {
153 150
 			case ULONG:
154 151
 				visitULong();
155 152
 				break;
153
+			case USIZE:
154
+				visitUSize();
155
+				break;
156 156
 			case FLOAT:
157 157
 				visitFloat();
158 158
 				break;
@@ -178,7 +178,7 @@ public class TypeMemberBuilder implements ITypeVisitor<Void> {
178 178
 
179 179
 		FunctionParameter[] indexGetParameters = new FunctionParameter[dimension];
180 180
 		for (int i = 0; i < indexGetParameters.length; i++)
181
-			indexGetParameters[i] = new FunctionParameter(INT);
181
+			indexGetParameters[i] = new FunctionParameter(USIZE);
182 182
 		
183 183
 		operator(
184 184
 				definition,
@@ -187,7 +187,7 @@ public class TypeMemberBuilder implements ITypeVisitor<Void> {
187 187
 				ARRAY_INDEXGET);
188 188
 		
189 189
 		if (dimension == 1) {
190
-			FunctionHeader sliceHeader = new FunctionHeader(array, new FunctionParameter(cache.getRegistry().getRange(INT, INT), "range"));
190
+			FunctionHeader sliceHeader = new FunctionHeader(array, new FunctionParameter(RangeTypeID.USIZE, "range"));
191 191
 			operator(
192 192
 					definition,
193 193
 					OperatorType.INDEXGET,
@@ -213,7 +213,7 @@ public class TypeMemberBuilder implements ITypeVisitor<Void> {
213 213
 
214 214
 		FunctionParameter[] initialValueConstructorParameters = new FunctionParameter[dimension + 1];
215 215
 		for (int i = 0; i < dimension; i++)
216
-			initialValueConstructorParameters[i] = new FunctionParameter(INT);
216
+			initialValueConstructorParameters[i] = new FunctionParameter(USIZE);
217 217
 		initialValueConstructorParameters[dimension] = new FunctionParameter(baseType);
218 218
 		FunctionHeader initialValueConstructorHeader = new FunctionHeader(VOID, initialValueConstructorParameters);
219 219
 		new ConstructorMember(
@@ -226,7 +226,7 @@ public class TypeMemberBuilder implements ITypeVisitor<Void> {
226 226
 		
227 227
 		FunctionParameter[] lambdaConstructorParameters = new FunctionParameter[dimension + 1];
228 228
 		for (int i = 0; i < dimension; i++)
229
-			lambdaConstructorParameters[i] = new FunctionParameter(INT, null);
229
+			lambdaConstructorParameters[i] = new FunctionParameter(USIZE, null);
230 230
 		
231 231
 		FunctionHeader lambdaConstructorFunction = new FunctionHeader(baseType, indexGetParameters);
232 232
 		lambdaConstructorParameters[dimension] = new FunctionParameter(cache.getRegistry().getFunction(lambdaConstructorFunction), null);
@@ -259,7 +259,7 @@ public class TypeMemberBuilder implements ITypeVisitor<Void> {
259 259
 			TypeParameter mappedConstructorParameter = new TypeParameter(BUILTIN, "T");
260 260
 			FunctionParameter[] projectionParameters = new FunctionParameter[dimension + 1];
261 261
 			for (int i = 0; i < dimension; i++)
262
-				projectionParameters[i] = new FunctionParameter(INT);
262
+				projectionParameters[i] = new FunctionParameter(USIZE);
263 263
 			projectionParameters[dimension] = new FunctionParameter(registry.getGeneric(mappedConstructorParameter));
264 264
 			
265 265
 			FunctionHeader mappedConstructorHeaderWithIndex = new FunctionHeader(baseType, projectionParameters);
@@ -274,20 +274,20 @@ public class TypeMemberBuilder implements ITypeVisitor<Void> {
274 274
 		
275 275
 		FunctionParameter[] indexSetParameters = new FunctionParameter[dimension + 1];
276 276
 		for (int i = 0; i < dimension; i++)
277
-			indexSetParameters[i] = new FunctionParameter(INT, null);
277
+			indexSetParameters[i] = new FunctionParameter(USIZE, null);
278 278
 		indexSetParameters[dimension] = new FunctionParameter(baseType, null);
279 279
 
280 280
 		FunctionHeader indexSetHeader = new FunctionHeader(VOID, indexSetParameters);
281 281
 		operator(definition, OperatorType.INDEXSET, indexSetHeader, ARRAY_INDEXSET);
282 282
 		
283 283
 		if (dimension == 1) {
284
-			getter(definition, ARRAY_LENGTH, "length", INT);
284
+			getter(definition, ARRAY_LENGTH, "length", USIZE);
285 285
 		}
286 286
 
287 287
 		getter(definition, ARRAY_ISEMPTY, "isEmpty", BOOL);
288 288
 		getter(definition, ARRAY_HASHCODE, "objectHashCode", INT);
289
-		new ArrayIteratorKeyValues(array).registerTo(members, TypeMemberPriority.SPECIFIED, null);
290
-		new ArrayIteratorValues(array).registerTo(members, TypeMemberPriority.SPECIFIED, null);
289
+		iterator(definition, ITERATOR_ARRAY_VALUES, baseType);
290
+		iterator(definition, ITERATOR_ARRAY_KEY_VALUES, USIZE, baseType);
291 291
 		
292 292
 		equals(definition, ARRAY_EQUALS, array);
293 293
 		notequals(definition, ARRAY_NOTEQUALS, array);
@@ -318,13 +318,14 @@ public class TypeMemberBuilder implements ITypeVisitor<Void> {
318 318
 				new FunctionHeader(BOOL, new FunctionParameter(keyType, "key")),
319 319
 				ASSOC_CONTAINS);
320 320
 		
321
-		getter(builtin, BuiltinID.ASSOC_SIZE, "size", INT);
321
+		getter(builtin, BuiltinID.ASSOC_SIZE, "size", USIZE);
322 322
 		getter(builtin, BuiltinID.ASSOC_ISEMPTY, "isEmpty", BOOL);
323 323
 		getter(builtin, BuiltinID.ASSOC_KEYS, "keys", cache.getRegistry().getArray(keyType, 1));
324 324
 		getter(builtin, BuiltinID.ASSOC_VALUES, "values", cache.getRegistry().getArray(valueType, 1));
325 325
 		getter(builtin, BuiltinID.ASSOC_HASHCODE, "objectHashCode", BasicTypeID.INT);
326 326
 		
327
-		new AssocIterator(assoc).registerTo(members, TypeMemberPriority.SPECIFIED, null);
327
+		iterator(builtin, ITERATOR_ASSOC_KEYS, keyType);
328
+		iterator(builtin, ITERATOR_ASSOC_KEY_VALUES, keyType, valueType);
328 329
 		
329 330
 		equals(builtin, BuiltinID.ASSOC_EQUALS, assoc);
330 331
 		notequals(builtin, BuiltinID.ASSOC_NOTEQUALS, assoc);
@@ -353,7 +354,7 @@ public class TypeMemberBuilder implements ITypeVisitor<Void> {
353 354
 		method(builtin, "contains", containsHeader, GENERICMAP_CONTAINS);
354 355
 		method(builtin, "addAll", new FunctionHeader(VOID, map), GENERICMAP_ADDALL);
355 356
 		
356
-		getter(builtin, GENERICMAP_SIZE, "size", INT);
357
+		getter(builtin, GENERICMAP_SIZE, "size", USIZE);
357 358
 		getter(builtin, GENERICMAP_ISEMPTY, "isEmpty", BOOL);
358 359
 		getter(builtin, GENERICMAP_HASHCODE, "objectHashCode", INT);
359 360
 		
@@ -399,7 +400,7 @@ public class TypeMemberBuilder implements ITypeVisitor<Void> {
399 400
 		if (definition instanceof VariantDefinition) {
400 401
 			VariantDefinition variant = (VariantDefinition) definition;
401 402
 			for (VariantDefinition.Option option : variant.options)
402
-				members.addVariantOption(option.instance(mapper));
403
+				members.addVariantOption(option.instance(type, mapper));
403 404
 		}
404 405
 		
405 406
 		if (definition instanceof EnumDefinition) {
@@ -446,7 +447,7 @@ public class TypeMemberBuilder implements ITypeVisitor<Void> {
446 447
 		
447 448
 		if (definition instanceof EnumDefinition) {
448 449
 			getter(definition, ENUM_NAME, "name", STRING);
449
-			getter(definition, ENUM_ORDINAL, "ordinal", INT);
450
+			getter(definition, ENUM_ORDINAL, "ordinal", USIZE);
450 451
 			
451 452
 			List<EnumConstantMember> enumConstants = ((EnumDefinition) definition).enumConstants;
452 453
 			Expression[] constValues = new Expression[enumConstants.size()];
@@ -493,21 +494,22 @@ public class TypeMemberBuilder implements ITypeVisitor<Void> {
493 494
 
494 495
 	@Override
495 496
 	public Void visitRange(RangeTypeID range) {
496
-		ITypeID fromType = range.from;
497
-		ITypeID toType = range.to;
497
+		ITypeID baseType = range.baseType;
498 498
 
499 499
 		ClassDefinition definition = new ClassDefinition(BUILTIN, null, "", Modifiers.EXPORT);
500
-		getter(definition, RANGE_FROM, "from", fromType);
501
-		getter(definition, RANGE_TO, "to", toType);
502
-		if (range.from == range.to && (range.from == BasicTypeID.BYTE
503
-				|| range.from == SBYTE
504
-				|| range.from == SHORT
505
-				|| range.from == USHORT
506
-				|| range.from == INT
507
-				|| range.from == UINT
508
-				|| range.from == LONG
509
-				|| range.from == ULONG)) {
510
-			new RangeIterator(range).registerTo(members, TypeMemberPriority.SPECIFIED, null);
500
+		getter(definition, RANGE_FROM, "from", baseType);
501
+		getter(definition, RANGE_TO, "to", baseType);
502
+		if (baseType == BYTE
503
+				|| baseType == SBYTE
504
+				|| baseType == SHORT
505
+				|| baseType == USHORT
506
+				|| baseType == INT
507
+				|| baseType == UINT
508
+				|| baseType == LONG
509
+				|| baseType == ULONG
510
+				|| baseType == USIZE) {
511
+			
512
+			iterator(definition, ITERATOR_INT_RANGE, baseType);
511 513
 		}
512 514
 		
513 515
 		processType(definition, range);
@@ -565,6 +567,7 @@ public class TypeMemberBuilder implements ITypeVisitor<Void> {
565 567
 		castImplicit(builtin, BYTE_TO_UINT, UINT);
566 568
 		castImplicit(builtin, BYTE_TO_LONG, LONG);
567 569
 		castImplicit(builtin, BYTE_TO_ULONG, ULONG);
570
+		castImplicit(builtin, BYTE_TO_USIZE, USIZE);
568 571
 		castImplicit(builtin, BYTE_TO_FLOAT, FLOAT);
569 572
 		castImplicit(builtin, BYTE_TO_DOUBLE, DOUBLE);
570 573
 		castExplicit(builtin, BYTE_TO_CHAR, CHAR);
@@ -603,6 +606,7 @@ public class TypeMemberBuilder implements ITypeVisitor<Void> {
603 606
 		castImplicit(builtin, SBYTE_TO_UINT, UINT);
604 607
 		castImplicit(builtin, SBYTE_TO_LONG, LONG);
605 608
 		castImplicit(builtin, SBYTE_TO_ULONG, ULONG);
609
+		castImplicit(builtin, SBYTE_TO_USIZE, USIZE);
606 610
 		castImplicit(builtin, SBYTE_TO_FLOAT, FLOAT);
607 611
 		castImplicit(builtin, SBYTE_TO_DOUBLE, DOUBLE);
608 612
 		castExplicit(builtin, SBYTE_TO_CHAR, CHAR);
@@ -641,6 +645,7 @@ public class TypeMemberBuilder implements ITypeVisitor<Void> {
641 645
 		castImplicit(builtin, SHORT_TO_UINT, UINT);
642 646
 		castImplicit(builtin, SHORT_TO_LONG, LONG);
643 647
 		castImplicit(builtin, SHORT_TO_ULONG, ULONG);
648
+		castImplicit(builtin, SHORT_TO_USIZE, USIZE);
644 649
 		castImplicit(builtin, SHORT_TO_FLOAT, FLOAT);
645 650
 		castImplicit(builtin, SHORT_TO_DOUBLE, DOUBLE);
646 651
 		castExplicit(builtin, SHORT_TO_CHAR, CHAR);
@@ -678,6 +683,7 @@ public class TypeMemberBuilder implements ITypeVisitor<Void> {
678 683
 		castImplicit(builtin, USHORT_TO_UINT, UINT);
679 684
 		castImplicit(builtin, USHORT_TO_LONG, LONG);
680 685
 		castImplicit(builtin, USHORT_TO_ULONG, ULONG);
686
+		castImplicit(builtin, USHORT_TO_USIZE, USIZE);
681 687
 		castImplicit(builtin, USHORT_TO_FLOAT, FLOAT);
682 688
 		castImplicit(builtin, USHORT_TO_DOUBLE, DOUBLE);
683 689
 		castExplicit(builtin, USHORT_TO_CHAR, CHAR);
@@ -749,6 +755,7 @@ public class TypeMemberBuilder implements ITypeVisitor<Void> {
749 755
 		castImplicit(builtin, INT_TO_UINT, UINT);
750 756
 		castImplicit(builtin, INT_TO_LONG, LONG);
751 757
 		castImplicit(builtin, INT_TO_ULONG, ULONG);
758
+		castImplicit(builtin, INT_TO_USIZE, USIZE);
752 759
 		castImplicit(builtin, INT_TO_FLOAT, FLOAT);
753 760
 		castImplicit(builtin, INT_TO_DOUBLE, DOUBLE);
754 761
 		castExplicit(builtin, INT_TO_CHAR, CHAR);
@@ -827,6 +834,7 @@ public class TypeMemberBuilder implements ITypeVisitor<Void> {
827 834
 		castImplicit(builtin, UINT_TO_INT, INT);
828 835
 		castImplicit(builtin, UINT_TO_LONG, LONG);
829 836
 		castImplicit(builtin, UINT_TO_ULONG, ULONG);
837
+		castImplicit(builtin, UINT_TO_USIZE, USIZE);
830 838
 		castImplicit(builtin, UINT_TO_FLOAT, FLOAT);
831 839
 		castImplicit(builtin, UINT_TO_DOUBLE, DOUBLE);
832 840
 		castExplicit(builtin, UINT_TO_CHAR, CHAR);
@@ -898,6 +906,7 @@ public class TypeMemberBuilder implements ITypeVisitor<Void> {
898 906
 		castExplicit(builtin, LONG_TO_INT, INT);
899 907
 		castExplicit(builtin, LONG_TO_UINT, UINT);
900 908
 		castImplicit(builtin, LONG_TO_ULONG, ULONG);
909
+		castExplicit(builtin, LONG_TO_USIZE, USIZE);
901 910
 		castImplicit(builtin, LONG_TO_FLOAT, FLOAT);
902 911
 		castImplicit(builtin, LONG_TO_DOUBLE, DOUBLE);
903 912
 		castExplicit(builtin, LONG_TO_CHAR, CHAR);
@@ -967,6 +976,7 @@ public class TypeMemberBuilder implements ITypeVisitor<Void> {
967 976
 		castExplicit(builtin, ULONG_TO_INT, INT);
968 977
 		castExplicit(builtin, ULONG_TO_UINT, UINT);
969 978
 		castImplicit(builtin, ULONG_TO_LONG, LONG);
979
+		castExplicit(builtin, ULONG_TO_USIZE, USIZE);
970 980
 		castImplicit(builtin, ULONG_TO_FLOAT, FLOAT);
971 981
 		castImplicit(builtin, ULONG_TO_DOUBLE, DOUBLE);
972 982
 		castExplicit(builtin, ULONG_TO_CHAR, CHAR);
@@ -990,6 +1000,82 @@ public class TypeMemberBuilder implements ITypeVisitor<Void> {
990 1000
 		processType(builtin, ULONG);
991 1001
 	}
992 1002
 	
1003
+	private void visitUSize() {
1004
+		ClassDefinition builtin = new ClassDefinition(BUILTIN, null, "usize", Modifiers.EXPORT, null);
1005
+		
1006
+		invert(builtin, USIZE_NOT, USIZE);
1007
+		inc(builtin, USIZE_DEC, USIZE);
1008
+		dec(builtin, USIZE_INC, USIZE);
1009
+
1010
+		add(builtin, USIZE_ADD_USIZE, USIZE, USIZE);
1011
+		add(builtin, ULONG_ADD_ULONG, ULONG, ULONG, USIZE_TO_ULONG);
1012
+		add(builtin, FLOAT_ADD_FLOAT, FLOAT, FLOAT, USIZE_TO_FLOAT);
1013
+		add(builtin, DOUBLE_ADD_DOUBLE, DOUBLE, DOUBLE, USIZE_TO_DOUBLE);
1014
+		
1015
+		sub(builtin, USIZE_SUB_USIZE, USIZE, USIZE);
1016
+		sub(builtin, ULONG_SUB_ULONG, ULONG, ULONG, USIZE_TO_ULONG);
1017
+		sub(builtin, FLOAT_SUB_FLOAT, FLOAT, FLOAT, USIZE_TO_FLOAT);
1018
+		sub(builtin, DOUBLE_SUB_DOUBLE, DOUBLE, DOUBLE, USIZE_TO_DOUBLE);
1019
+		
1020
+		mul(builtin, USIZE_MUL_USIZE, USIZE, USIZE);
1021
+		mul(builtin, ULONG_MUL_ULONG, ULONG, ULONG, USIZE_TO_ULONG);
1022
+		mul(builtin, FLOAT_MUL_FLOAT, FLOAT, FLOAT, USIZE_TO_FLOAT);
1023
+		mul(builtin, DOUBLE_MUL_DOUBLE, DOUBLE, DOUBLE, USIZE_TO_DOUBLE);
1024
+		
1025
+		div(builtin, USIZE_DIV_USIZE, USIZE, USIZE);
1026
+		div(builtin, ULONG_DIV_ULONG, ULONG, ULONG, USIZE_TO_ULONG);
1027
+		div(builtin, FLOAT_DIV_FLOAT, FLOAT, FLOAT, USIZE_TO_FLOAT);
1028
+		div(builtin, DOUBLE_DIV_DOUBLE, DOUBLE, DOUBLE, USIZE_TO_DOUBLE);
1029
+		
1030
+		mod(builtin, USIZE_MOD_USIZE, USIZE, USIZE);
1031
+		
1032
+		or(builtin, USIZE_OR_USIZE, USIZE, USIZE);
1033
+		and(builtin, USIZE_AND_USIZE, USIZE, USIZE);
1034
+		xor(builtin, USIZE_XOR_USIZE, USIZE, USIZE);
1035
+		
1036
+		shl(builtin, USIZE_SHL, INT, USIZE);
1037
+		shr(builtin, USIZE_SHR, INT, USIZE);
1038
+		
1039
+		compare(builtin, USIZE_COMPARE, USIZE);
1040
+		compare(builtin, ULONG_COMPARE, ULONG, USIZE_TO_ULONG);
1041
+		compare(builtin, FLOAT_COMPARE, FLOAT, USIZE_TO_FLOAT);
1042
+		compare(builtin, DOUBLE_COMPARE, DOUBLE, USIZE_TO_DOUBLE);
1043
+		
1044
+		constant(builtin, USIZE_GET_MIN_VALUE, "MIN_VALUE", new ConstantUSizeExpression(BUILTIN, 0));
1045
+		constant(builtin, USIZE_GET_MAX_VALUE, "MAX_VALUE", new ConstantUSizeExpression(BUILTIN, -2L));
1046
+		constant(builtin, USIZE_BITS, "BITS", new ConstantUSizeExpression(BUILTIN, 32));
1047
+		
1048
+		castExplicit(builtin, USIZE_TO_BYTE, BYTE);
1049
+		castExplicit(builtin, USIZE_TO_SBYTE, SBYTE);
1050
+		castExplicit(builtin, USIZE_TO_SHORT, SHORT);
1051
+		castExplicit(builtin, USIZE_TO_USHORT, USHORT);
1052
+		castExplicit(builtin, USIZE_TO_INT, INT);
1053
+		castExplicit(builtin, USIZE_TO_UINT, UINT);
1054
+		castImplicit(builtin, USIZE_TO_LONG, LONG);
1055
+		castImplicit(builtin, USIZE_TO_ULONG, ULONG);
1056
+		castImplicit(builtin, USIZE_TO_FLOAT, FLOAT);
1057
+		castImplicit(builtin, USIZE_TO_DOUBLE, DOUBLE);
1058
+		castExplicit(builtin, USIZE_TO_CHAR, CHAR);
1059
+		castImplicit(builtin, USIZE_TO_STRING, STRING);
1060
+		
1061
+		staticMethod(builtin, USIZE_PARSE, "parse", USIZE, STRING);
1062
+		staticMethod(builtin, USIZE_PARSE_WITH_BASE, "parse", USIZE, STRING, INT);
1063
+		
1064
+		method(builtin, USIZE_COUNT_LOW_ZEROES, "countLowZeroes", INT);
1065
+		method(builtin, USIZE_COUNT_HIGH_ZEROES, "countHighZeroes", INT);
1066
+		method(builtin, USIZE_COUNT_LOW_ONES, "countLowOnes", INT);
1067
+		method(builtin, USIZE_COUNT_HIGH_ONES, "countHighOnes", INT);
1068
+		
1069
+		ITypeID optionalInt = registry.getOptional(INT);
1070
+		getter(builtin, USIZE_HIGHEST_ONE_BIT, "highestOneBit", optionalInt);
1071
+		getter(builtin, USIZE_LOWEST_ONE_BIT, "lowestOneBit", optionalInt);
1072
+		getter(builtin, USIZE_HIGHEST_ZERO_BIT, "highestZeroBit", optionalInt);
1073
+		getter(builtin, USIZE_LOWEST_ZERO_BIT, "lowestZeroBit", optionalInt);
1074
+		getter(builtin, USIZE_BIT_COUNT, "bitCount", INT);
1075
+		
1076
+		processType(builtin, USIZE);
1077
+	}
1078
+	
993 1079
 	private void visitFloat() {
994 1080
 		ClassDefinition builtin = new ClassDefinition(BUILTIN, null, "float", Modifiers.EXPORT, null);
995 1081
 		
@@ -1021,15 +1107,16 @@ public class TypeMemberBuilder implements ITypeVisitor<Void> {
1021 1107
 		castExplicit(builtin, FLOAT_TO_USHORT, USHORT);
1022 1108
 		castExplicit(builtin, FLOAT_TO_INT, INT);
1023 1109
 		castExplicit(builtin, FLOAT_TO_UINT, UINT);
1110
+		castExplicit(builtin, FLOAT_TO_LONG, LONG);
1024 1111
 		castExplicit(builtin, FLOAT_TO_ULONG, ULONG);
1025
-		castExplicit(builtin, FLOAT_TO_ULONG, ULONG);
1112
+		castExplicit(builtin, FLOAT_TO_USIZE, USIZE);
1026 1113
 		castImplicit(builtin, FLOAT_TO_DOUBLE, DOUBLE);
1027 1114
 		castImplicit(builtin, FLOAT_TO_STRING, STRING);
1028 1115
 		
1029 1116
 		staticMethod(builtin, FLOAT_PARSE, "parse", FLOAT, STRING);
1030
-		staticMethod(builtin, FLOAT_FROM_BITS, "fromBits", FLOAT, INT);
1117
+		staticMethod(builtin, FLOAT_FROM_BITS, "fromBits", FLOAT, UINT);
1031 1118
 		
1032
-		getter(builtin, FLOAT_BITS, "bits", INT);
1119
+		getter(builtin, FLOAT_BITS, "bits", UINT);
1033 1120
 		
1034 1121
 		processType(builtin, FLOAT);
1035 1122
 	}
@@ -1058,13 +1145,14 @@ public class TypeMemberBuilder implements ITypeVisitor<Void> {
1058 1145
 		castExplicit(builtin, DOUBLE_TO_UINT, UINT);
1059 1146
 		castExplicit(builtin, DOUBLE_TO_ULONG, ULONG);
1060 1147
 		castExplicit(builtin, DOUBLE_TO_ULONG, ULONG);
1148
+		castExplicit(builtin, DOUBLE_TO_USIZE, USIZE);
1061 1149
 		castImplicit(builtin, DOUBLE_TO_FLOAT, FLOAT);
1062 1150
 		castImplicit(builtin, DOUBLE_TO_STRING, STRING);
1063 1151
 		
1064 1152
 		staticMethod(builtin, DOUBLE_PARSE, "parse", DOUBLE, STRING);
1065
-		staticMethod(builtin, DOUBLE_FROM_BITS, "fromBits", DOUBLE, LONG);
1153
+		staticMethod(builtin, DOUBLE_FROM_BITS, "fromBits", DOUBLE, ULONG);
1066 1154
 		
1067
-		getter(builtin, DOUBLE_BITS, "bits", LONG);
1155
+		getter(builtin, DOUBLE_BITS, "bits", ULONG);
1068 1156
 		
1069 1157
 		processType(builtin, DOUBLE);
1070 1158
 	}
@@ -1085,6 +1173,7 @@ public class TypeMemberBuilder implements ITypeVisitor<Void> {
1085 1173
 		castImplicit(builtin, CHAR_TO_UINT, UINT);
1086 1174
 		castImplicit(builtin, CHAR_TO_LONG, LONG);
1087 1175
 		castImplicit(builtin, CHAR_TO_ULONG, ULONG);
1176
+		castImplicit(builtin, CHAR_TO_USIZE, USIZE);
1088 1177
 		castImplicit(builtin, CHAR_TO_STRING, STRING);
1089 1178
 		
1090 1179
 		getter(builtin, CHAR_GET_MIN_VALUE, "MIN_VALUE", CHAR);
@@ -1103,11 +1192,11 @@ public class TypeMemberBuilder implements ITypeVisitor<Void> {
1103 1192
 		constructor(builtin, STRING_CONSTRUCTOR_CHARACTERS, registry.getArray(CHAR, 1));
1104 1193
 		
1105 1194
 		add(builtin, STRING_ADD_STRING, STRING, STRING);
1106
-		indexGet(builtin, STRING_INDEXGET, INT, CHAR);
1107
-		indexGet(builtin, STRING_RANGEGET, registry.getRange(INT, INT), STRING);
1195
+		indexGet(builtin, STRING_INDEXGET, USIZE, CHAR);
1196
+		indexGet(builtin, STRING_RANGEGET, RangeTypeID.USIZE, STRING);
1108 1197
 		compare(builtin, STRING_COMPARE, STRING);
1109 1198
 		
1110
-		getter(builtin, STRING_LENGTH, "length", INT);
1199
+		getter(builtin, STRING_LENGTH, "length", USIZE);
1111 1200
 		getter(builtin, STRING_CHARACTERS, "characters", registry.getArray(CHAR, 1));
1112 1201
 		getter(builtin, STRING_ISEMPTY, "isEmpty", BOOL);
1113 1202
 
@@ -1116,7 +1205,7 @@ public class TypeMemberBuilder implements ITypeVisitor<Void> {
1116 1205
 		method(builtin, STRING_TO_LOWER_CASE, "toLowerCase", STRING);
1117 1206
 		method(builtin, STRING_TO_UPPER_CASE, "toUpperCase", STRING);
1118 1207
 		
1119
-		new StringCharIterator().registerTo(members, TypeMemberPriority.SPECIFIED, null);
1208
+		iterator(builtin, ITERATOR_STRING_CHARS, CHAR);
1120 1209
 		
1121 1210
 		processType(builtin, STRING);
1122 1211
 	}
@@ -1557,4 +1646,9 @@ public class TypeMemberBuilder implements ITypeVisitor<Void> {
1557 1646
 				new FunctionHeader(BOOL, new FunctionParameter(type)),
1558 1647
 				id).registerTo(members, TypeMemberPriority.SPECIFIED, null);
1559 1648
 	}
1649
+	
1650
+	private void iterator(HighLevelDefinition cls, BuiltinID builtin, ITypeID... types) {
1651
+		new IteratorMember(BUILTIN, cls, Modifiers.PUBLIC, types, registry, builtin)
1652
+				.registerTo(members, TypeMemberPriority.SPECIFIED, null);
1653
+	}
1560 1654
 }

+ 3
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/member/TypeMembers.java Vedi File

@@ -39,6 +39,7 @@ import org.openzen.zenscript.codemodel.partial.IPartialExpression;
39 39
 import org.openzen.zenscript.codemodel.partial.PartialMemberGroupExpression;
40 40
 import org.openzen.zenscript.codemodel.partial.PartialStaticMemberGroupExpression;
41 41
 import org.openzen.zenscript.codemodel.partial.PartialTypeExpression;
42
+import org.openzen.zenscript.codemodel.partial.PartialVariantOptionExpression;
42 43
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
43 44
 import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
44 45
 import org.openzen.zenscript.codemodel.type.GenericName;
@@ -483,6 +484,8 @@ public final class TypeMembers {
483 484
 			return new PartialStaticMemberGroupExpression(position, scope, type, members.get(name.name), name.arguments);
484 485
 		if (innerTypes.containsKey(name.name))
485 486
 			return new PartialTypeExpression(position, innerTypes.get(name.name).instance(cache.getRegistry(), name.arguments, (DefinitionTypeID)type), name.arguments);
487
+		if (variantOptions.containsKey(name.name))
488
+			return new PartialVariantOptionExpression(position, scope, variantOptions.get(name.name));
486 489
 		
487 490
 		return null;
488 491
 	}

Constructor/src/main/java/org/openzen/zenscript/constructor/module/ModuleSpace.java → CompilerShared/src/main/java/org/openzen/zenscript/compiler/ModuleSpace.java Vedi File

@@ -3,20 +3,22 @@
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.constructor.module;
6
+package org.openzen.zenscript.compiler;
7 7
 
8 8
 import org.openzen.zenscript.compiler.SemanticModule;
9 9
 import java.util.ArrayList;
10 10
 import java.util.HashMap;
11 11
 import java.util.List;
12 12
 import java.util.Map;
13
+import org.openzen.zencode.shared.CodePosition;
14
+import org.openzen.zencode.shared.CompileException;
15
+import org.openzen.zencode.shared.CompileExceptionCode;
13 16
 import org.openzen.zenscript.codemodel.annotations.AnnotationDefinition;
14 17
 import org.openzen.zenscript.codemodel.annotations.NativeAnnotationDefinition;
15 18
 import org.openzen.zenscript.codemodel.annotations.PreconditionAnnotationDefinition;
16 19
 import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
17 20
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
18 21
 import org.openzen.zenscript.compiler.CompilationUnit;
19
-import org.openzen.zenscript.constructor.ConstructorException;
20 22
 import org.openzen.zenscript.codemodel.type.ISymbol;
21 23
 
22 24
 /**
@@ -45,7 +47,7 @@ public final class ModuleSpace {
45 47
 		
46 48
 		for (Map.Entry<String, ISymbol> globalEntry : dependency.globals.entrySet()) {
47 49
 			if (globals.containsKey(globalEntry.getKey()))
48
-				throw new ConstructorException("Duplicate global: " + globalEntry.getKey());
50
+				throw new CompileException(CodePosition.META, CompileExceptionCode.DUPLICATE_GLOBAL, "Duplicate global: " + globalEntry.getKey());
49 51
 			
50 52
 			globals.put(globalEntry.getKey(), globalEntry.getValue());
51 53
 		}

+ 0
- 84
Constructor/src/main/java/org/openzen/zenscript/constructor/Module.java Vedi File

@@ -10,26 +10,15 @@ import java.io.File;
10 10
 import java.io.FileInputStream;
11 11
 import java.io.IOException;
12 12
 import java.util.ArrayList;
13
-import java.util.Collections;
14 13
 import java.util.List;
15
-import java.util.Map;
16 14
 import java.util.function.Consumer;
17 15
 import org.json.JSONArray;
18 16
 import org.json.JSONObject;
19 17
 import org.json.JSONTokener;
20 18
 import org.openzen.zencode.shared.CompileException;
21
-import org.openzen.zenscript.codemodel.PackageDefinitions;
22
-import org.openzen.zenscript.codemodel.ScriptBlock;
23 19
 import org.openzen.zenscript.codemodel.context.CompilingPackage;
24
-import org.openzen.zenscript.codemodel.context.ModuleTypeResolutionContext;
25
-import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
26
-import org.openzen.zenscript.codemodel.definition.ZSPackage;
27
-import org.openzen.zenscript.constructor.module.ModuleSpace;
28
-import org.openzen.zenscript.compiler.SemanticModule;
29
-import org.openzen.zenscript.codemodel.type.ISymbol;
30 20
 import org.openzen.zenscript.parser.BracketExpressionParser;
31 21
 import org.openzen.zenscript.parser.ParsedFile;
32
-import org.openzen.zenscript.parser.PrecompilationState;
33 22
 
34 23
 /**
35 24
  *
@@ -86,77 +75,4 @@ public class Module {
86 75
 			}
87 76
 		}
88 77
 	}
89
-	
90
-	public static SemanticModule compileSyntaxToSemantic(
91
-			String name,
92
-			SemanticModule[] dependencies,
93
-			CompilingPackage pkg,
94
-			ParsedFile[] files,
95
-			ModuleSpace registry,
96
-			Consumer<CompileException> exceptionLogger) {
97
-		// We are considering all these files to be in the same package, so make
98
-		// a single PackageDefinition instance. If these files were in multiple
99
-		// packages, we'd need an instance for every package.
100
-		PackageDefinitions definitions = new PackageDefinitions();
101
-		for (ParsedFile file : files) {
102
-			// listDefinitions will merely register all definitions (classes,
103
-			// interfaces, functions ...) so they can later be available to
104
-			// the other files as well. It doesn't yet compile anything.
105
-			file.listDefinitions(definitions);
106
-		}
107
-		
108
-		ZSPackage rootPackage = registry.collectPackages();
109
-		List<ExpansionDefinition> expansions = registry.collectExpansions();
110
-		definitions.registerExpansionsTo(expansions);
111
-		
112
-		Map<String, ISymbol> globals = registry.collectGlobals();
113
-		boolean failed = false;
114
-		
115
-		ModuleTypeResolutionContext moduleContext = new ModuleTypeResolutionContext(
116
-				registry.compilationUnit.globalTypeRegistry,
117
-				registry.getAnnotations(),
118
-				rootPackage,
119
-				pkg,
120
-				globals);
121
-		
122
-		for (ParsedFile file : files) {
123
-			file.registerTypes(moduleContext, rootPackage, pkg);
124
-		}
125
-		
126
-		for (ParsedFile file : files) {
127
-			// compileMembers will register all definition members to their
128
-			// respective definitions, such as fields, constructors, methods...
129
-			// It doesn't yet compile the method contents.
130
-			try {
131
-				file.compileTypes(moduleContext, rootPackage, pkg);
132
-			} catch (CompileException ex) {
133
-				exceptionLogger.accept(ex);
134
-				failed = true;
135
-			}
136
-		}
137
-		
138
-		if (failed)
139
-			return new SemanticModule(name, dependencies, SemanticModule.State.INVALID, rootPackage, pkg.getPackage(), definitions, Collections.emptyList(), registry.compilationUnit, expansions, registry.getAnnotations());
140
-		
141
-		// scripts will store all the script blocks encountered in the files
142
-		PrecompilationState precompiler = new PrecompilationState();
143
-		for (ParsedFile file : files) {
144
-			file.registerMembers(moduleContext, precompiler, rootPackage, pkg, expansions, globals);
145
-		}
146
-		
147
-		List<ScriptBlock> scripts = new ArrayList<>();
148
-		for (ParsedFile file : files) {
149
-			// compileCode will convert the parsed statements and expressions
150
-			// into semantic code. This semantic code can then be compiled
151
-			// to various targets.
152
-			try {
153
-				file.compileCode(moduleContext, precompiler, rootPackage, pkg, expansions, scripts, globals);
154
-			} catch (CompileException ex) {
155
-				exceptionLogger.accept(ex);
156
-				failed = true;
157
-			}
158
-		}
159
-		
160
-		return new SemanticModule(name, dependencies, SemanticModule.State.ASSEMBLED, rootPackage, pkg.getPackage(), definitions, scripts, registry.compilationUnit, expansions, registry.getAnnotations());
161
-	}
162 78
 }

+ 2
- 1
Constructor/src/main/java/org/openzen/zenscript/constructor/module/DirectoryModuleReference.java Vedi File

@@ -5,6 +5,7 @@
5 5
  */
6 6
 package org.openzen.zenscript.constructor.module;
7 7
 
8
+import org.openzen.zenscript.compiler.ModuleSpace;
8 9
 import org.openzen.zenscript.compiler.SemanticModule;
9 10
 import java.io.File;
10 11
 import java.io.IOException;
@@ -84,7 +85,7 @@ public class DirectoryModuleReference implements ModuleReference {
84 85
 			CompilingPackage compilingPackage = new CompilingPackage(pkg);
85 86
 			
86 87
 			ParsedFile[] parsedFiles = module.parse(compilingPackage);
87
-			SemanticModule result = Module.compileSyntaxToSemantic(module.name, dependencies, compilingPackage, parsedFiles, space, exceptionLogger);
88
+			SemanticModule result = ParsedFile.compileSyntaxToSemantic(module.name, dependencies, compilingPackage, parsedFiles, space, exceptionLogger);
88 89
 			
89 90
 			JSONObject globals = json.optJSONObject("globals");
90 91
 			if (globals != null) {

+ 1
- 1
IDE/src/main/java/org/openzen/zenscript/ide/host/local/LocalTarget.java Vedi File

@@ -138,7 +138,7 @@ public class LocalTarget implements IDETarget {
138 138
 			if (compiledModules.contains(dependency.name))
139 139
 				continue;
140 140
 			compiledModules.add(dependency.name);
141
-			System.out.println("== Compiling module " + dependency + " ==");
141
+			System.out.println("== Compiling module " + dependency.name + " ==");
142 142
 			
143 143
 			if (compilingModules.contains(dependency.name)) {
144 144
 				StringBuilder message = new StringBuilder("Circular dependency:\n");

+ 1
- 0
IDE/src/main/java/org/openzen/zenscript/ide/ui/view/editor/SourceEditor.java Vedi File

@@ -887,6 +887,7 @@ public class SourceEditor implements DComponent {
887 887
 				case K_UINT:
888 888
 				case K_LONG:
889 889
 				case K_ULONG:
890
+				case K_USIZE:
890 891
 				case K_FLOAT:
891 892
 				case K_DOUBLE:
892 893
 				case K_CHAR:

+ 0
- 12
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/implementations/IntRange.java Vedi File

@@ -1,12 +0,0 @@
1
-package org.openzen.zenscript.implementations;
2
-
3
-public class IntRange {
4
-	public final int from;
5
-	public final int to;
6
-
7
-
8
-	public IntRange(int from, int to) {
9
-		this.from = from;
10
-		this.to = to;
11
-	}
12
-}

+ 82
- 4
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeContext.java Vedi File

@@ -5,15 +5,21 @@
5 5
  */
6 6
 package org.openzen.zenscript.javabytecode;
7 7
 
8
+import java.util.HashMap;
9
+import java.util.Map;
10
+import org.objectweb.asm.ClassWriter;
11
+import org.objectweb.asm.Opcodes;
8 12
 import org.objectweb.asm.Type;
9 13
 import org.openzen.zenscript.codemodel.FunctionHeader;
10
-import org.openzen.zenscript.codemodel.FunctionParameter;
11 14
 import org.openzen.zenscript.codemodel.type.FunctionTypeID;
12 15
 import org.openzen.zenscript.codemodel.type.ITypeID;
13 16
 import org.openzen.zenscript.codemodel.type.RangeTypeID;
14
-import org.openzen.zenscript.javabytecode.compiler.CompilerUtils;
17
+import org.openzen.zenscript.javabytecode.compiler.JavaWriter;
18
+import org.openzen.zenscript.javashared.JavaClass;
15 19
 import org.openzen.zenscript.javashared.JavaContext;
20
+import org.openzen.zenscript.javashared.JavaMethod;
16 21
 import org.openzen.zenscript.javashared.JavaSynthesizedClass;
22
+import org.openzen.zenscript.javashared.JavaSynthesizedClassNamer;
17 23
 import org.openzen.zenscript.javashared.JavaSyntheticClassGenerator;
18 24
 import org.openzen.zenscript.javashared.JavaTypeDescriptorVisitor;
19 25
 import org.openzen.zenscript.javashared.JavaTypeInternalNameVisitor;
@@ -27,6 +33,9 @@ public class JavaBytecodeContext extends JavaContext {
27 33
 	private final TypeGenerator typeGenerator;
28 34
 	private final JavaTypeInternalNameVisitor internalNameVisitor;
29 35
 	private final JavaTypeDescriptorVisitor descriptorVisitor;
36
+	private final Map<String, JavaSynthesizedClass> functions = new HashMap<>();
37
+	private final Map<String, JavaSynthesizedClass> ranges = new HashMap<>();
38
+	private int lambdaCounter = 0;
30 39
 	
31 40
 	public JavaBytecodeContext(JavaModule module) {
32 41
 		this.module = module;
@@ -56,17 +65,86 @@ public class JavaBytecodeContext extends JavaContext {
56 65
 	public void register(String name, byte[] bytecode) {
57 66
 		module.register(name, bytecode);
58 67
 	}
68
+
69
+    private JavaSynthesizedClass getLambdaInterface(FunctionTypeID function) {
70
+		String signature = JavaSynthesizedClassNamer.getFunctionSignature(function);
71
+		if (functions.containsKey(signature))
72
+			return functions.get(signature).withTypeParameters(JavaSynthesizedClassNamer.extractTypeParameters(function));
73
+		
74
+		JavaSynthesizedClass result = JavaSynthesizedClassNamer.createFunctionName(function);
75
+		functions.put(signature, result);
76
+		
77
+        createLambdaInterface(function.header, result.cls);
78
+        return result;
79
+    }
80
+	
81
+	private JavaSynthesizedClass getRangeType(RangeTypeID type) {
82
+		String signature = JavaSynthesizedClassNamer.getRangeSignature(type);
83
+		if (ranges.containsKey(signature))
84
+			return ranges.get(signature).withTypeParameters(JavaSynthesizedClassNamer.extractTypeParameters(type));
85
+		
86
+		JavaSynthesizedClass result = JavaSynthesizedClassNamer.createRangeName(type);
87
+		ranges.put(signature, result);
88
+		
89
+		createRangeClass(type.baseType, result.cls);
90
+		return result;
91
+	}
92
+
93
+    private void createLambdaInterface(FunctionHeader header, JavaClass cls) {
94
+        ClassWriter ifaceWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
95
+        ifaceWriter.visitAnnotation("java/lang/FunctionalInterface", true).visitEnd();
96
+        ifaceWriter.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC | Opcodes.ACC_INTERFACE | Opcodes.ACC_ABSTRACT, cls.internalName, null, "java/lang/Object", null);
97
+
98
+        ifaceWriter
99
+				.visitMethod(
100
+					Opcodes.ACC_PUBLIC | Opcodes.ACC_ABSTRACT,
101
+					"accept",
102
+					getMethodDescriptor(header),
103
+					getMethodSignature(header),
104
+					null)
105
+				.visitEnd();
106
+
107
+        register(cls.internalName, ifaceWriter.toByteArray());
108
+    }
109
+	
110
+	private void createRangeClass(ITypeID baseType, JavaClass cls) {
111
+		ClassWriter rangeWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
112
+		rangeWriter.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, cls.internalName, null, "java/lang/Object", null);
113
+		rangeWriter.visitField(Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL, "from", getDescriptor(baseType), null, null).visitEnd();
114
+		rangeWriter.visitField(Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL, "to", getDescriptor(baseType), null, null).visitEnd();
115
+		
116
+		JavaMethod method = JavaMethod.getConstructor(cls, "(" + getDescriptor(baseType) + getDescriptor(baseType) + ")V", Opcodes.ACC_PUBLIC);
117
+		JavaWriter constructorWriter = new JavaWriter(rangeWriter, method, null, method.descriptor, null);
118
+		constructorWriter.loadObject(0);
119
+		constructorWriter.invokeSpecial("java/lang/Object", "<init>", "()V");
120
+		constructorWriter.loadObject(0);
121
+		constructorWriter.load(getType(baseType), 1);
122
+		constructorWriter.putField(cls.internalName, "from", getDescriptor(baseType));
123
+		constructorWriter.loadObject(0);
124
+		constructorWriter.load(getType(baseType), 2);
125
+		constructorWriter.putField(cls.internalName, "to", getDescriptor(baseType));
126
+		constructorWriter.ret();
127
+		constructorWriter.end();
128
+		
129
+		rangeWriter.visitEnd();
130
+		
131
+		register(cls.internalName, rangeWriter.toByteArray());
132
+	}
133
+
134
+    public String getLambdaCounter() {
135
+        return "lambda" + ++lambdaCounter;
136
+    }
59 137
 	
60 138
 	private class TypeGenerator implements JavaSyntheticClassGenerator {
61 139
 
62 140
 		@Override
63 141
 		public JavaSynthesizedClass synthesizeFunction(FunctionTypeID type) {
64
-			return CompilerUtils.getLambdaInterface(JavaBytecodeContext.this, type);
142
+			return getLambdaInterface(type);
65 143
 		}
66 144
 
67 145
 		@Override
68 146
 		public JavaSynthesizedClass synthesizeRange(RangeTypeID type) {
69
-			throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
147
+			return getRangeType(type);
70 148
 		}
71 149
 	}
72 150
 }

+ 0
- 15
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeImplementation.java Vedi File

@@ -1,15 +0,0 @@
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.javabytecode;
7
-
8
-import org.openzen.zenscript.javabytecode.compiler.JavaWriter;
9
-
10
-/**
11
- * @author Hoofdgebruiker
12
- */
13
-public interface JavaBytecodeImplementation {
14
-	void compile(JavaWriter writer);
15
-}

+ 0
- 23
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaCompileUtils.java Vedi File

@@ -1,23 +0,0 @@
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.javabytecode;
7
-
8
-import org.objectweb.asm.Type;
9
-import org.openzen.zenscript.javashared.JavaClass;
10
-
11
-/**
12
- *
13
- * @author Hoofdgebruiker
14
- */
15
-public class JavaCompileUtils {
16
-	private JavaCompileUtils() {}
17
-	
18
-	public static JavaClass get(Class<?> cls) {
19
-		return JavaClass.fromInternalName(
20
-				Type.getInternalName(cls),
21
-				cls.isInterface() ? JavaClass.Kind.INTERFACE : (cls.isEnum() ? JavaClass.Kind.ENUM : JavaClass.Kind.CLASS));
22
-	}
23
-}

+ 6
- 7
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaCompiler.java Vedi File

@@ -7,8 +7,6 @@ package org.openzen.zenscript.javabytecode;
7 7
 
8 8
 import java.io.File;
9 9
 import java.util.ArrayList;
10
-import java.util.HashMap;
11
-import java.util.Map;
12 10
 
13 11
 import org.objectweb.asm.ClassWriter;
14 12
 import org.objectweb.asm.Opcodes;
@@ -28,6 +26,7 @@ import java.util.HashMap;
28 26
 import java.util.List;
29 27
 import java.util.Map;
30 28
 import org.openzen.zenscript.javashared.JavaClass;
29
+import org.openzen.zenscript.javashared.JavaMethod;
31 30
 import org.openzen.zenscript.javashared.prepare.JavaPrepareDefinitionMemberVisitor;
32 31
 import org.openzen.zenscript.javashared.prepare.JavaPrepareDefinitionVisitor;
33 32
 
@@ -51,7 +50,7 @@ public class JavaCompiler implements ZenCodeCompiler {
51 50
 	}
52 51
 
53 52
 	public JavaCompiler(boolean debug, File jarFile) {
54
-		target = new JavaModule();
53
+		target = new JavaModule(new File("classes"));
55 54
 		this.jarFile = jarFile;
56 55
 		this.context = new JavaBytecodeContext(target);
57 56
 		
@@ -116,7 +115,7 @@ public class JavaCompiler implements ZenCodeCompiler {
116 115
 		finished = true;
117 116
 		
118 117
 		for (HighLevelDefinition definition : definitions) {
119
-			JavaPrepareDefinitionMemberVisitor memberPreparer = new JavaPrepareDefinitionMemberVisitor(context, definition.position.getFilename());
118
+			JavaPrepareDefinitionMemberVisitor memberPreparer = new JavaPrepareDefinitionMemberVisitor(context);
120 119
 			definition.accept(memberPreparer);
121 120
 		}
122 121
 		
@@ -137,7 +136,7 @@ public class JavaCompiler implements ZenCodeCompiler {
137 136
 			// convert scripts into methods (add them to a Scripts class?)
138 137
 			// (TODO: can we break very long scripts into smaller methods? for the extreme scripts)
139 138
 			final JavaClassWriter visitor = scriptFile.classWriter;
140
-			JavaMethodInfo method = new JavaMethodInfo(new JavaClass(script.pkg.fullName, className, JavaClass.Kind.CLASS), methodName, "()V", Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC);
139
+			JavaMethod method = JavaMethod.getStatic(new JavaClass(script.pkg.fullName, className, JavaClass.Kind.CLASS), methodName, "()V", Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC);
141 140
 			scriptFile.scriptMethods.add(method);
142 141
 
143 142
 			final JavaStatementVisitor statementVisitor = new JavaStatementVisitor(context, new JavaWriter(visitor, method, null, null, null));
@@ -148,11 +147,11 @@ public class JavaCompiler implements ZenCodeCompiler {
148 147
 			statementVisitor.end();
149 148
 		}
150 149
 		
151
-		JavaMethodInfo runMethod = new JavaMethodInfo(new JavaClass("script", "Scripts", JavaClass.Kind.CLASS), "run", "()V", Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC);
150
+		JavaMethod runMethod = JavaMethod.getStatic(new JavaClass("script", "Scripts", JavaClass.Kind.CLASS), "run", "()V", Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC);
152 151
 		final JavaWriter runWriter = new JavaWriter(scriptsClassWriter, runMethod, null, null, null);
153 152
 		runWriter.start();
154 153
 		for (Map.Entry<String, JavaScriptFile> entry : scriptBlocks.entrySet()) {
155
-			for (JavaMethodInfo method : entry.getValue().scriptMethods)
154
+			for (JavaMethod method : entry.getValue().scriptMethods)
156 155
 				runWriter.invokeStatic(method);
157 156
 
158 157
 			entry.getValue().classWriter.visitEnd();

+ 0
- 42
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaMethodInfo.java Vedi File

@@ -1,42 +0,0 @@
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.javabytecode;
7
-
8
-import org.objectweb.asm.Opcodes;
9
-import org.objectweb.asm.Type;
10
-import org.openzen.zenscript.javashared.JavaClass;
11
-
12
-/**
13
- * @author Hoofdgebruiker
14
- */
15
-public class JavaMethodInfo {
16
-	public static JavaMethodInfo get(int modifiers, Class owner, String name, Class result, Class... arguments) {
17
-		StringBuilder descriptor = new StringBuilder();
18
-		descriptor.append('(');
19
-		for (Class argument : arguments) {
20
-			descriptor.append(Type.getDescriptor(argument));
21
-		}
22
-		descriptor.append(')');
23
-		descriptor.append(result == null ? 'V' : Type.getDescriptor(result));
24
-		return new JavaMethodInfo(JavaCompileUtils.get(owner), name, descriptor.toString(), modifiers);
25
-	}
26
-
27
-	public final JavaClass javaClass;
28
-	public final String name;
29
-	public final String descriptor;
30
-	public final int modifiers;
31
-
32
-	public JavaMethodInfo(JavaClass javaClass, String name, String signature, int modifiers) {
33
-		this.javaClass = javaClass;
34
-		this.name = name;
35
-		this.descriptor = signature;
36
-		this.modifiers = modifiers;
37
-	}
38
-
39
-	public boolean isStatic() {
40
-		return (modifiers & Opcodes.ACC_STATIC) > 0;
41
-	}
42
-}

+ 16
- 7
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaModule.java Vedi File

@@ -19,21 +19,30 @@ import java.util.logging.Logger;
19 19
  */
20 20
 public class JavaModule {
21 21
 	private final Map<String, byte[]> classes = new HashMap<>();
22
-
22
+	private final File debugOutput;
23
+	
23 24
 	public JavaModule() {
24
-
25
+		debugOutput = null;
25 26
 	}
26
-
27
+	
28
+	public JavaModule(File debugOutput) {
29
+		this.debugOutput = debugOutput;
30
+		debugOutput.mkdirs();
31
+	}
32
+	
27 33
 	public void register(String classname, byte[] bytecode) {
28 34
 		if (bytecode == null)
29 35
 			return;
30 36
 		
37
+		classname = classname.replace('/', '.');
31 38
 		classes.put(classname, bytecode);
32 39
 		
33
-		try (FileOutputStream writer = new FileOutputStream(new File(classname.replace('/', '_') + ".class"))) {
34
-			writer.write(bytecode);
35
-		} catch (IOException e) {
36
-			e.printStackTrace();
40
+		if (debugOutput != null) {
41
+			try (FileOutputStream writer = new FileOutputStream(new File(debugOutput, classname + ".class"))) {
42
+				writer.write(bytecode);
43
+			} catch (IOException e) {
44
+				e.printStackTrace();
45
+			}
37 46
 		}
38 47
 	}
39 48
 

+ 4
- 91
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/CompilerUtils.java Vedi File

@@ -1,9 +1,6 @@
1 1
 package org.openzen.zenscript.javabytecode.compiler;
2 2
 
3
-import org.objectweb.asm.ClassWriter;
4 3
 import org.objectweb.asm.Opcodes;
5
-import org.objectweb.asm.Type;
6
-import org.openzen.zencode.shared.CodePosition;
7 4
 import org.openzen.zenscript.codemodel.FunctionHeader;
8 5
 import org.openzen.zenscript.codemodel.FunctionParameter;
9 6
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
@@ -13,17 +10,9 @@ import org.openzen.zenscript.codemodel.member.FieldMember;
13 10
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
14 11
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
15 12
 import org.openzen.zenscript.codemodel.type.ITypeID;
16
-import org.openzen.zenscript.javabytecode.JavaParameterInfo;
13
+import org.openzen.zenscript.javashared.JavaParameterInfo;
17 14
 
18
-import java.io.FileOutputStream;
19
-import java.io.IOException;
20
-import java.util.HashMap;
21
-import java.util.Map;
22
-import org.openzen.zenscript.codemodel.type.FunctionTypeID;
23 15
 import org.openzen.zenscript.javabytecode.JavaBytecodeContext;
24
-import org.openzen.zenscript.javashared.JavaClass;
25
-import org.openzen.zenscript.javashared.JavaSynthesizedClass;
26
-import org.openzen.zenscript.javashared.JavaSynthesizedClassNamer;
27 16
 
28 17
 public class CompilerUtils {
29 18
 	private CompilerUtils() {}
@@ -66,14 +55,10 @@ public class CompilerUtils {
66 55
 		return out;
67 56
 	}
68 57
 
69
-	public static String calcClasName(CodePosition position) {
70
-		return position.getFilename().substring(0, position.getFilename().lastIndexOf('.')).replace("/", "_");
71
-	}
72
-
73 58
     public static void tagMethodParameters(JavaBytecodeContext context, FunctionHeader header, boolean isStatic) {
74 59
         for (int i = 0; i < header.parameters.length; i++) {
75 60
             FunctionParameter parameter = header.parameters[i];
76
-            Type parameterType = context.getType(parameter.type);
61
+            String parameterType = context.getDescriptor(parameter.type);
77 62
             parameter.setTag(JavaParameterInfo.class, new JavaParameterInfo(isStatic ? i : i + 1, parameterType));
78 63
         }
79 64
     }
@@ -81,7 +66,7 @@ public class CompilerUtils {
81 66
     public static void tagConstructorParameters(JavaBytecodeContext context, FunctionHeader header, boolean isEnum) {
82 67
         for (int i = 0; i < header.parameters.length; i++) {
83 68
             FunctionParameter parameter = header.parameters[i];
84
-            Type parameterType = context.getType(parameter.type);
69
+            String parameterType = context.getDescriptor(parameter.type);
85 70
             parameter.setTag(JavaParameterInfo.class, new JavaParameterInfo(isEnum ? i + 3 : i + 1, parameterType));
86 71
         }
87 72
     }
@@ -105,79 +90,7 @@ public class CompilerUtils {
105 90
         }
106 91
     }
107 92
 
108
-	private static final Map<String, JavaSynthesizedClass> functions = new HashMap<>();
109
-	
110
-    public static JavaSynthesizedClass getLambdaInterface(JavaBytecodeContext context, FunctionTypeID function) {
111
-		String signature = JavaSynthesizedClassNamer.getFunctionSignature(function);
112
-		if (functions.containsKey(signature))
113
-			return functions.get(signature).withTypeParameters(JavaSynthesizedClassNamer.extractTypeParameters(function));
114
-		
115
-		System.out.println("Generating function " + signature);
116
-		
117
-		JavaSynthesizedClass result = JavaSynthesizedClassNamer.createFunctionName(function);
118
-		functions.put(signature, result);
119
-		
120
-        createLambdaInterface(context, function.header, result.cls);
121
-        return result;
122
-    }
123
-
124
-    private static void createLambdaInterface(JavaBytecodeContext context, FunctionHeader header, JavaClass cls) {
125
-        ClassWriter ifaceWriter = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
126
-        ifaceWriter.visitAnnotation("java/lang/FunctionalInterface", true).visitEnd();
127
-        ifaceWriter.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC | Opcodes.ACC_INTERFACE | Opcodes.ACC_ABSTRACT, cls.internalName, null, "java/lang/Object", null);
128
-
129
-        ifaceWriter
130
-				.visitMethod(
131
-					Opcodes.ACC_PUBLIC | Opcodes.ACC_ABSTRACT,
132
-					"accept",
133
-					context.getMethodDescriptor(header),
134
-					context.getMethodSignature(header),
135
-					null)
136
-				.visitEnd();
137
-
138
-        context.register(cls.internalName.replace('/', '.'), ifaceWriter.toByteArray());
139
-
140
-        try (FileOutputStream out = new FileOutputStream(cls.getClassName() + ".class")){
141
-            out.write(ifaceWriter.toByteArray());
142
-        } catch (IOException e) {
143
-            e.printStackTrace();
144
-        }
145
-    }
146
-
147
-	private static int lambdaCounter = 0;
148
-    public static String getLambdaCounter() {
149
-        return "lambda" + ++lambdaCounter;
150
-    }
151
-
152 93
 	public static int getKeyForSwitch(SwitchValue expression) {
153
-		return expression.accept(new SwitchKeyVisitor());
154
-	}
155
-
156
-	private static class SwitchKeyVisitor implements SwitchValueVisitor<Integer> {
157
-
158
-		@Override
159
-		public Integer acceptInt(IntSwitchValue value) {
160
-			return value.value;
161
-		}
162
-
163
-		@Override
164
-		public Integer acceptChar(CharSwitchValue value) {
165
-			return (int) value.value;
166
-		}
167
-
168
-		@Override
169
-		public Integer acceptString(StringSwitchValue value) {
170
-			return value.value.hashCode();
171
-		}
172
-
173
-		@Override
174
-		public Integer acceptEnumConstant(EnumConstantSwitchValue value) {
175
-			return value.constant.ordinal;
176
-		}
177
-
178
-		@Override
179
-		public Integer acceptVariantOption(VariantOptionSwitchValue value) {
180
-			return value.option.getOrdinal();
181
-		}
94
+		return expression.accept(JavaSwitchKeyVisitor.INSTANCE);
182 95
 	}
183 96
 }

+ 38
- 30
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaBoxingTypeVisitor.java Vedi File

@@ -1,10 +1,18 @@
1 1
 package org.openzen.zenscript.javabytecode.compiler;
2 2
 
3 3
 import org.openzen.zenscript.codemodel.type.*;
4
-import org.openzen.zenscript.javabytecode.JavaMethodInfo;
5 4
 import org.openzen.zenscript.javashared.JavaClass;
5
+import org.openzen.zenscript.javashared.JavaMethod;
6 6
 
7
-public class JavaBoxingTypeVisitor implements ITypeVisitor<JavaMethodInfo> {
7
+public class JavaBoxingTypeVisitor implements ITypeVisitor<Void> {
8
+	private static final JavaMethod BOOLEAN_VALUEOF = JavaMethod.getNativeStatic(JavaClass.BOOLEAN, "valueOf", "(Z)Ljava/lang/Boolean;");
9
+	private static final JavaMethod BYTE_VALUEOF = JavaMethod.getNativeStatic(JavaClass.BYTE, "valueOf", "(B)Ljava/lang/Byte;");
10
+	private static final JavaMethod SHORT_VALUEOF = JavaMethod.getNativeStatic(JavaClass.SHORT, "valueOf", "(S)Ljava/lang/Short;");
11
+	private static final JavaMethod INTEGER_VALUEOF = JavaMethod.getNativeStatic(JavaClass.INTEGER, "valueOf", "(I)Ljava/lang/Integer;");
12
+	private static final JavaMethod LONG_VALUEOF = JavaMethod.getNativeStatic(JavaClass.LONG, "valueOf", "(J)Ljava/lang/Long;");
13
+	private static final JavaMethod FLOAT_VALUEOF = JavaMethod.getNativeStatic(JavaClass.FLOAT, "valueOf", "(F)Ljava/lang/Float;");
14
+	private static final JavaMethod DOUBLE_VALUEOF = JavaMethod.getNativeStatic(JavaClass.DOUBLE, "valueOf", "(D)Ljava/lang/Double;");
15
+	private static final JavaMethod CHARACTER_VALUEOF = JavaMethod.getNativeStatic(JavaClass.CHARACTER, "valueOf", "(C)Ljava/lang/Character;");
8 16
 
9 17
 	private final JavaWriter writer;
10 18
 
@@ -13,102 +21,102 @@ public class JavaBoxingTypeVisitor implements ITypeVisitor<JavaMethodInfo> {
13 21
 	}
14 22
 
15 23
 	@Override
16
-	public JavaMethodInfo visitBasic(BasicTypeID basic) {
17
-		final JavaMethodInfo info;
24
+	public Void visitBasic(BasicTypeID basic) {
25
+		final JavaMethod method;
18 26
 		switch (basic) {
19 27
 			case BOOL:
20
-				writer.newObject(Boolean.class);
21
-				info = new JavaMethodInfo(new JavaClass("java.lang", "Boolean", JavaClass.Kind.CLASS), "<init>", "(Z)V", -1);
28
+				method = BOOLEAN_VALUEOF;
22 29
 				break;
23 30
 			case BYTE:
31
+				method = INTEGER_VALUEOF;
32
+				break;
24 33
 			case SBYTE:
25
-				writer.newObject(Byte.class);
26
-				info = new JavaMethodInfo(new JavaClass("java.lang", "Byte", JavaClass.Kind.CLASS), "<init>", "(B)V", -1);
34
+				method = BYTE_VALUEOF;
27 35
 				break;
28 36
 			case SHORT:
37
+				method = SHORT_VALUEOF;
38
+				break;
29 39
 			case USHORT:
30
-				writer.newObject(Short.class);
31
-				info = new JavaMethodInfo(new JavaClass("java.lang", "Short", JavaClass.Kind.CLASS), "<init>", "(S)V", -1);
40
+				method = INTEGER_VALUEOF;
32 41
 				break;
33 42
 			case INT:
34 43
 			case UINT:
35
-				writer.newObject(Byte.class);
36
-				info = new JavaMethodInfo(new JavaClass("java.lang", "Byte", JavaClass.Kind.CLASS), "<init>", "(B)V", -1);
44
+			case USIZE:
45
+				method = INTEGER_VALUEOF;
37 46
 				break;
38 47
 			case LONG:
39 48
 			case ULONG:
40
-				writer.newObject(Long.class);
41
-				info = new JavaMethodInfo(new JavaClass("java.lang", "Long", JavaClass.Kind.CLASS), "<init>", "(S)V", -1);
49
+				method = LONG_VALUEOF;
42 50
 				break;
43 51
 			case FLOAT:
44
-				writer.newObject(Float.class);
45
-				info = new JavaMethodInfo(new JavaClass("java.lang", "Float", JavaClass.Kind.CLASS), "<init>", "(F)V", -1);
52
+				method = FLOAT_VALUEOF;
46 53
 				break;
47 54
 			case DOUBLE:
48
-				writer.newObject(Double.class);
49
-				info = new JavaMethodInfo(new JavaClass("java.lang", "Double", JavaClass.Kind.CLASS), "<init>", "(D)V", -1);
55
+				method = DOUBLE_VALUEOF;
50 56
 				break;
51 57
 			case CHAR:
52
-				writer.newObject(Character.class);
53
-				info = new JavaMethodInfo(new JavaClass("java.lang", "Character", JavaClass.Kind.CLASS), "<init>", "(C)V", -1);
58
+				method = CHARACTER_VALUEOF;
54 59
 				break;
55 60
 			default:
56 61
 				return null;
57 62
 		}
58 63
 		writer.dup();
59
-		return info;
64
+		
65
+		if (method != null)
66
+			writer.invokeStatic(method);
67
+		return null;
60 68
 	}
61 69
 
62 70
 	@Override
63
-	public JavaMethodInfo visitArray(ArrayTypeID array) {
71
+	public Void visitArray(ArrayTypeID array) {
64 72
 		//NO-OP
65 73
 		return null;
66 74
 	}
67 75
 
68 76
 	@Override
69
-	public JavaMethodInfo visitAssoc(AssocTypeID assoc) {
77
+	public Void visitAssoc(AssocTypeID assoc) {
70 78
 		//NO-OP
71 79
 		return null;
72 80
 	}
73 81
 
74 82
 	@Override
75
-	public JavaMethodInfo visitGenericMap(GenericMapTypeID map) {
83
+	public Void visitGenericMap(GenericMapTypeID map) {
76 84
 		//NO-OP
77 85
 		return null;
78 86
 	}
79 87
 
80 88
 	@Override
81
-	public JavaMethodInfo visitIterator(IteratorTypeID iterator) {
89
+	public Void visitIterator(IteratorTypeID iterator) {
82 90
 		//NO-OP
83 91
 		return null;
84 92
 	}
85 93
 
86 94
 	@Override
87
-	public JavaMethodInfo visitFunction(FunctionTypeID function) {
95
+	public Void visitFunction(FunctionTypeID function) {
88 96
 		//NO-OP
89 97
 		return null;
90 98
 	}
91 99
 
92 100
 	@Override
93
-	public JavaMethodInfo visitDefinition(DefinitionTypeID definition) {
101
+	public Void visitDefinition(DefinitionTypeID definition) {
94 102
 		//NO-OP
95 103
 		return null;
96 104
 	}
97 105
 
98 106
 	@Override
99
-	public JavaMethodInfo visitGeneric(GenericTypeID generic) {
107
+	public Void visitGeneric(GenericTypeID generic) {
100 108
 		//NO-OP
101 109
 		return null;
102 110
 	}
103 111
 
104 112
 	@Override
105
-	public JavaMethodInfo visitRange(RangeTypeID range) {
113
+	public Void visitRange(RangeTypeID range) {
106 114
 		//NO-OP
107 115
 		return null;
108 116
 	}
109 117
 
110 118
 	@Override
111
-	public JavaMethodInfo visitModified(ModifiedTypeID type) {
119
+	public Void visitModified(ModifiedTypeID type) {
112 120
 		//NO-OP
113 121
 		return null;
114 122
 	}

+ 210
- 173
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaExpressionVisitor.java Vedi File

@@ -1,5 +1,6 @@
1 1
 package org.openzen.zenscript.javabytecode.compiler;
2 2
 
3
+import org.openzen.zenscript.javashared.JavaParameterInfo;
3 4
 import java.util.Arrays;
4 5
 import java.util.Comparator;
5 6
 import java.util.StringJoiner;
@@ -18,134 +19,136 @@ import org.openzen.zenscript.codemodel.member.ref.FieldMemberRef;
18 19
 import org.openzen.zenscript.codemodel.statement.ReturnStatement;
19 20
 import org.openzen.zenscript.codemodel.type.*;
20 21
 import org.openzen.zenscript.codemodel.type.member.BuiltinID;
21
-import org.openzen.zenscript.implementations.IntRange;
22 22
 import org.openzen.zenscript.javabytecode.*;
23 23
 
24 24
 import java.io.FileOutputStream;
25 25
 import java.io.IOException;
26 26
 import org.openzen.zenscript.javashared.JavaClass;
27 27
 import org.openzen.zenscript.javashared.JavaField;
28
+import org.openzen.zenscript.javashared.JavaMethod;
29
+import org.openzen.zenscript.javashared.JavaSynthesizedClass;
28 30
 import org.openzen.zenscript.javashared.JavaSynthesizedClassNamer;
31
+import org.openzen.zenscript.javashared.JavaVariantOption;
29 32
 
30 33
 public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
31 34
 	private static final int PUBLIC = Opcodes.ACC_PUBLIC;
32 35
 	private static final int STATIC = Opcodes.ACC_STATIC;
33 36
 	private static final int PUBLIC_STATIC = PUBLIC | STATIC;
34 37
 
35
-	private static final JavaMethodInfo BOOLEAN_PARSE = new JavaMethodInfo(JavaClass.BOOLEAN, "parseBoolean", "(Ljava/lang/String;)Z", PUBLIC_STATIC);
36
-	private static final JavaMethodInfo BOOLEAN_TO_STRING = new JavaMethodInfo(JavaClass.BOOLEAN, "toString", "(Z)Ljava/lang/String;", PUBLIC_STATIC);
37
-	private static final JavaMethodInfo BYTE_PARSE = new JavaMethodInfo(JavaClass.BYTE, "parseByte", "(Ljava/lang/String;)B", PUBLIC_STATIC);
38
-	private static final JavaMethodInfo BYTE_PARSE_WITH_BASE = new JavaMethodInfo(JavaClass.BYTE, "parseByte", "(Ljava/lang/String;I)B", PUBLIC_STATIC);
38
+	private static final JavaMethod BOOLEAN_PARSE = JavaMethod.getNativeStatic(JavaClass.BOOLEAN, "parseBoolean", "(Ljava/lang/String;)Z");
39
+	private static final JavaMethod BOOLEAN_TO_STRING = JavaMethod.getNativeStatic(JavaClass.BOOLEAN, "toString", "(Z)Ljava/lang/String;");
40
+	private static final JavaMethod BYTE_PARSE = JavaMethod.getNativeStatic(JavaClass.BYTE, "parseByte", "(Ljava/lang/String;)B");
41
+	private static final JavaMethod BYTE_PARSE_WITH_BASE = JavaMethod.getNativeStatic(JavaClass.BYTE, "parseByte", "(Ljava/lang/String;I)B");
39 42
 	private static final JavaField BYTE_MIN_VALUE = new JavaField(JavaClass.BYTE, "MIN_VALUE", "B");
40 43
 	private static final JavaField BYTE_MAX_VALUE = new JavaField(JavaClass.BYTE, "MAX_VALUE", "B");
41
-	private static final JavaMethodInfo BYTE_TO_STRING = new JavaMethodInfo(JavaClass.BYTE, "toString", "(B)Ljava/lang/String;", PUBLIC_STATIC);
42
-	private static final JavaMethodInfo SHORT_PARSE = new JavaMethodInfo(JavaClass.SHORT, "parseShort", "(Ljava/lang/String;)S", PUBLIC_STATIC);
43
-	private static final JavaMethodInfo SHORT_PARSE_WITH_BASE = new JavaMethodInfo(JavaClass.SHORT, "parseShort", "(Ljava/lang/String;I)S", PUBLIC_STATIC);
44
+	private static final JavaMethod BYTE_TO_STRING = JavaMethod.getNativeStatic(JavaClass.BYTE, "toString", "(B)Ljava/lang/String;");
45
+	private static final JavaMethod SHORT_PARSE = JavaMethod.getNativeStatic(JavaClass.SHORT, "parseShort", "(Ljava/lang/String;)S");
46
+	private static final JavaMethod SHORT_PARSE_WITH_BASE = JavaMethod.getNativeStatic(JavaClass.SHORT, "parseShort", "(Ljava/lang/String;I)S");
44 47
 	private static final JavaField SHORT_MIN_VALUE = new JavaField(JavaClass.SHORT, "MIN_VALUE", "S");
45 48
 	private static final JavaField SHORT_MAX_VALUE = new JavaField(JavaClass.SHORT, "MAX_VALUE", "S");
46
-	private static final JavaMethodInfo SHORT_TO_STRING = new JavaMethodInfo(JavaClass.SHORT, "toString", "(S)Ljava/lang/String;", PUBLIC_STATIC);
47
-	private static final JavaMethodInfo INTEGER_COMPARE_UNSIGNED = new JavaMethodInfo(JavaClass.INTEGER, "compareUnsigned", "(II)I", PUBLIC_STATIC);
48
-	private static final JavaMethodInfo INTEGER_DIVIDE_UNSIGNED = new JavaMethodInfo(JavaClass.INTEGER, "divideUnsigned", "(II)I", PUBLIC_STATIC);
49
-	private static final JavaMethodInfo INTEGER_REMAINDER_UNSIGNED = new JavaMethodInfo(JavaClass.INTEGER, "remainderUnsigned", "(II)I", PUBLIC_STATIC);
50
-	private static final JavaMethodInfo INTEGER_NUMBER_OF_TRAILING_ZEROS = new JavaMethodInfo(JavaClass.INTEGER, "numberOfTrailingZeros", "(I)I", PUBLIC_STATIC);
51
-	private static final JavaMethodInfo INTEGER_NUMBER_OF_LEADING_ZEROS = new JavaMethodInfo(JavaClass.INTEGER, "numberOfLeadingZeros", "(I)I", PUBLIC_STATIC);
52
-	private static final JavaMethodInfo INTEGER_PARSE = new JavaMethodInfo(JavaClass.INTEGER, "parseInt", "(Ljava/lang/String;)I", PUBLIC_STATIC);
53
-	private static final JavaMethodInfo INTEGER_PARSE_WITH_BASE = new JavaMethodInfo(JavaClass.INTEGER, "parseInt", "(Ljava/lang/String;I)I", PUBLIC_STATIC);
54
-	private static final JavaMethodInfo INTEGER_PARSE_UNSIGNED = new JavaMethodInfo(JavaClass.INTEGER, "parseUnsignedInt", "(Ljava/lang/String;)I", PUBLIC_STATIC);
55
-	private static final JavaMethodInfo INTEGER_PARSE_UNSIGNED_WITH_BASE = new JavaMethodInfo(JavaClass.INTEGER, "parseUnsignedInt", "(Ljava/lang/String;I)I", PUBLIC_STATIC);
56
-	private static final JavaMethodInfo INTEGER_HIGHEST_ONE_BIT = new JavaMethodInfo(JavaClass.INTEGER, "highestOneBit", "(I)I", PUBLIC_STATIC);
57
-	private static final JavaMethodInfo INTEGER_LOWEST_ONE_BIT = new JavaMethodInfo(JavaClass.INTEGER, "lowestOneBit", "(I)I", PUBLIC_STATIC);
58
-	private static final JavaMethodInfo INTEGER_BIT_COUNT = new JavaMethodInfo(JavaClass.INTEGER, "bitCount", "(I)I", PUBLIC_STATIC);
49
+	private static final JavaMethod SHORT_TO_STRING = JavaMethod.getNativeStatic(JavaClass.SHORT, "toString", "(S)Ljava/lang/String;");
50
+	private static final JavaMethod INTEGER_COMPARE_UNSIGNED = JavaMethod.getNativeStatic(JavaClass.INTEGER, "compareUnsigned", "(II)I");
51
+	private static final JavaMethod INTEGER_DIVIDE_UNSIGNED = JavaMethod.getNativeStatic(JavaClass.INTEGER, "divideUnsigned", "(II)I");
52
+	private static final JavaMethod INTEGER_REMAINDER_UNSIGNED = JavaMethod.getNativeStatic(JavaClass.INTEGER, "remainderUnsigned", "(II)I");
53
+	private static final JavaMethod INTEGER_NUMBER_OF_TRAILING_ZEROS = JavaMethod.getNativeStatic(JavaClass.INTEGER, "numberOfTrailingZeros", "(I)I");
54
+	private static final JavaMethod INTEGER_NUMBER_OF_LEADING_ZEROS = JavaMethod.getNativeStatic(JavaClass.INTEGER, "numberOfLeadingZeros", "(I)I");
55
+	private static final JavaMethod INTEGER_PARSE = JavaMethod.getNativeStatic(JavaClass.INTEGER, "parseInt", "(Ljava/lang/String;)I");
56
+	private static final JavaMethod INTEGER_PARSE_WITH_BASE = JavaMethod.getNativeStatic(JavaClass.INTEGER, "parseInt", "(Ljava/lang/String;I)I");
57
+	private static final JavaMethod INTEGER_PARSE_UNSIGNED = JavaMethod.getNativeStatic(JavaClass.INTEGER, "parseUnsignedInt", "(Ljava/lang/String;)I");
58
+	private static final JavaMethod INTEGER_PARSE_UNSIGNED_WITH_BASE = JavaMethod.getNativeStatic(JavaClass.INTEGER, "parseUnsignedInt", "(Ljava/lang/String;I)I");
59
+	private static final JavaMethod INTEGER_HIGHEST_ONE_BIT = JavaMethod.getNativeStatic(JavaClass.INTEGER, "highestOneBit", "(I)I");
60
+	private static final JavaMethod INTEGER_LOWEST_ONE_BIT = JavaMethod.getNativeStatic(JavaClass.INTEGER, "lowestOneBit", "(I)I");
61
+	private static final JavaMethod INTEGER_BIT_COUNT = JavaMethod.getNativeStatic(JavaClass.INTEGER, "bitCount", "(I)I");
59 62
 	private static final JavaField INTEGER_MIN_VALUE = new JavaField(JavaClass.INTEGER, "MIN_VALUE", "I");
60 63
 	private static final JavaField INTEGER_MAX_VALUE = new JavaField(JavaClass.INTEGER, "MAX_VALUE", "I");
61
-	private static final JavaMethodInfo INTEGER_TO_STRING = new JavaMethodInfo(JavaClass.INTEGER, "toString", "(I)Ljava/lang/String;", PUBLIC_STATIC);
62
-	private static final JavaMethodInfo INTEGER_TO_UNSIGNED_STRING = new JavaMethodInfo(JavaClass.INTEGER, "toUnsignedString", "(I)Ljava/lang/String;", PUBLIC_STATIC);
63
-	private static final JavaMethodInfo LONG_COMPARE = new JavaMethodInfo(JavaClass.LONG, "compare", "(JJ)I", PUBLIC_STATIC);
64
-	private static final JavaMethodInfo LONG_COMPARE_UNSIGNED = new JavaMethodInfo(JavaClass.LONG, "compareUnsigned", "(JJ)I", PUBLIC_STATIC);
65
-	private static final JavaMethodInfo LONG_DIVIDE_UNSIGNED = new JavaMethodInfo(JavaClass.LONG, "divideUnsigned", "(JJ)J", PUBLIC_STATIC);
66
-	private static final JavaMethodInfo LONG_REMAINDER_UNSIGNED = new JavaMethodInfo(JavaClass.LONG, "remainderUnsigned", "(JJ)J", PUBLIC_STATIC);
67
-	private static final JavaMethodInfo LONG_NUMBER_OF_TRAILING_ZEROS = new JavaMethodInfo(JavaClass.LONG, "numberOfTrailingZeros", "(J)I", PUBLIC_STATIC);
68
-	private static final JavaMethodInfo LONG_NUMBER_OF_LEADING_ZEROS = new JavaMethodInfo(JavaClass.LONG, "numberOfLeadingZeros", "(J)I", PUBLIC_STATIC);
69
-	private static final JavaMethodInfo LONG_PARSE = new JavaMethodInfo(JavaClass.LONG, "parseLong", "(Ljava/lang/String;)J", PUBLIC_STATIC);
70
-	private static final JavaMethodInfo LONG_PARSE_WITH_BASE = new JavaMethodInfo(JavaClass.LONG, "parseLong", "(Ljava/lang/String;I)J", PUBLIC_STATIC);
71
-	private static final JavaMethodInfo LONG_PARSE_UNSIGNED = new JavaMethodInfo(JavaClass.LONG, "parseUnsignedLong", "(Ljava/lang/String;)J", PUBLIC_STATIC);
72
-	private static final JavaMethodInfo LONG_PARSE_UNSIGNED_WITH_BASE = new JavaMethodInfo(JavaClass.LONG, "parseUnsignedLong", "(Ljava/lang/String;I)J", PUBLIC_STATIC);
73
-	private static final JavaMethodInfo LONG_HIGHEST_ONE_BIT = new JavaMethodInfo(JavaClass.LONG, "highestOneBit", "(J)J", PUBLIC_STATIC);
74
-	private static final JavaMethodInfo LONG_LOWEST_ONE_BIT = new JavaMethodInfo(JavaClass.LONG, "lowestOneBit", "(J)J", PUBLIC_STATIC);
75
-	private static final JavaMethodInfo LONG_BIT_COUNT = new JavaMethodInfo(JavaClass.LONG, "bitCount", "(J)I", PUBLIC_STATIC);
64
+	private static final JavaMethod INTEGER_TO_STRING = JavaMethod.getNativeStatic(JavaClass.INTEGER, "toString", "(I)Ljava/lang/String;");
65
+	private static final JavaMethod INTEGER_TO_UNSIGNED_STRING = JavaMethod.getNativeStatic(JavaClass.INTEGER, "toUnsignedString", "(I)Ljava/lang/String;");
66
+	private static final JavaMethod LONG_COMPARE = JavaMethod.getNativeStatic(JavaClass.LONG, "compare", "(JJ)I");
67
+	private static final JavaMethod LONG_COMPARE_UNSIGNED = JavaMethod.getNativeStatic(JavaClass.LONG, "compareUnsigned", "(JJ)I");
68
+	private static final JavaMethod LONG_DIVIDE_UNSIGNED = JavaMethod.getNativeStatic(JavaClass.LONG, "divideUnsigned", "(JJ)J");
69
+	private static final JavaMethod LONG_REMAINDER_UNSIGNED = JavaMethod.getNativeStatic(JavaClass.LONG, "remainderUnsigned", "(JJ)J");
70
+	private static final JavaMethod LONG_NUMBER_OF_TRAILING_ZEROS = JavaMethod.getNativeStatic(JavaClass.LONG, "numberOfTrailingZeros", "(J)I");
71
+	private static final JavaMethod LONG_NUMBER_OF_LEADING_ZEROS = JavaMethod.getNativeStatic(JavaClass.LONG, "numberOfLeadingZeros", "(J)I");
72
+	private static final JavaMethod LONG_PARSE = JavaMethod.getNativeStatic(JavaClass.LONG, "parseLong", "(Ljava/lang/String;)J");
73
+	private static final JavaMethod LONG_PARSE_WITH_BASE = JavaMethod.getNativeStatic(JavaClass.LONG, "parseLong", "(Ljava/lang/String;I)J");
74
+	private static final JavaMethod LONG_PARSE_UNSIGNED = JavaMethod.getNativeStatic(JavaClass.LONG, "parseUnsignedLong", "(Ljava/lang/String;)J");
75
+	private static final JavaMethod LONG_PARSE_UNSIGNED_WITH_BASE = JavaMethod.getNativeStatic(JavaClass.LONG, "parseUnsignedLong", "(Ljava/lang/String;I)J");
76
+	private static final JavaMethod LONG_HIGHEST_ONE_BIT = JavaMethod.getNativeStatic(JavaClass.LONG, "highestOneBit", "(J)J");
77
+	private static final JavaMethod LONG_LOWEST_ONE_BIT = JavaMethod.getNativeStatic(JavaClass.LONG, "lowestOneBit", "(J)J");
78
+	private static final JavaMethod LONG_BIT_COUNT = JavaMethod.getNativeStatic(JavaClass.LONG, "bitCount", "(J)I");
76 79
 	private static final JavaField LONG_MIN_VALUE = new JavaField(JavaClass.LONG, "MIN_VALUE", "J");
77 80
 	private static final JavaField LONG_MAX_VALUE = new JavaField(JavaClass.LONG, "MAX_VALUE", "J");
78
-	private static final JavaMethodInfo LONG_TO_STRING = new JavaMethodInfo(JavaClass.LONG, "toString", "(J)Ljava/lang/String;", PUBLIC_STATIC);
79
-	private static final JavaMethodInfo LONG_TO_UNSIGNED_STRING = new JavaMethodInfo(JavaClass.LONG, "toUnsignedString", "(J)Ljava/lang/String;", PUBLIC_STATIC);
80
-	private static final JavaMethodInfo FLOAT_COMPARE = new JavaMethodInfo(JavaClass.FLOAT, "compare", "(FF)I", PUBLIC_STATIC);
81
-	private static final JavaMethodInfo FLOAT_PARSE = new JavaMethodInfo(JavaClass.FLOAT, "parseFloat", "(Ljava/lang/String;)F", PUBLIC_STATIC);
82
-	private static final JavaMethodInfo FLOAT_FROM_BITS = new JavaMethodInfo(JavaClass.FLOAT, "intBitsToFloat", "(I)F", PUBLIC_STATIC);
83
-	private static final JavaMethodInfo FLOAT_BITS = new JavaMethodInfo(JavaClass.FLOAT, "floatToRawIntBits", "(F)I", PUBLIC_STATIC);
81
+	private static final JavaMethod LONG_TO_STRING = JavaMethod.getNativeStatic(JavaClass.LONG, "toString", "(J)Ljava/lang/String;");
82
+	private static final JavaMethod LONG_TO_UNSIGNED_STRING = JavaMethod.getNativeStatic(JavaClass.LONG, "toUnsignedString", "(J)Ljava/lang/String;");
83
+	private static final JavaMethod FLOAT_COMPARE = JavaMethod.getNativeStatic(JavaClass.FLOAT, "compare", "(FF)I");
84
+	private static final JavaMethod FLOAT_PARSE = JavaMethod.getNativeStatic(JavaClass.FLOAT, "parseFloat", "(Ljava/lang/String;)F");
85
+	private static final JavaMethod FLOAT_FROM_BITS = JavaMethod.getNativeStatic(JavaClass.FLOAT, "intBitsToFloat", "(I)F");
86
+	private static final JavaMethod FLOAT_BITS = JavaMethod.getNativeStatic(JavaClass.FLOAT, "floatToRawIntBits", "(F)I");
84 87
 	private static final JavaField FLOAT_MIN_VALUE = new JavaField(JavaClass.FLOAT, "MIN_VALUE", "F");
85 88
 	private static final JavaField FLOAT_MAX_VALUE = new JavaField(JavaClass.FLOAT, "MAX_VALUE", "F");
86
-	private static final JavaMethodInfo FLOAT_TO_STRING = new JavaMethodInfo(JavaClass.FLOAT, "toString", "(F)Ljava/lang/String;", PUBLIC_STATIC);
87
-	private static final JavaMethodInfo DOUBLE_COMPARE = new JavaMethodInfo(JavaClass.DOUBLE, "compare", "(DD)I", PUBLIC_STATIC);
88
-	private static final JavaMethodInfo DOUBLE_PARSE = new JavaMethodInfo(JavaClass.DOUBLE, "parseDouble", "(Ljava/lang/String;)D", PUBLIC_STATIC);
89
-	private static final JavaMethodInfo DOUBLE_FROM_BITS = new JavaMethodInfo(JavaClass.DOUBLE, "longBitsToDouble", "(J)D", PUBLIC_STATIC);
90
-	private static final JavaMethodInfo DOUBLE_BITS = new JavaMethodInfo(JavaClass.DOUBLE, "doubleToRawLongBits", "(D)J", PUBLIC_STATIC);
89
+	private static final JavaMethod FLOAT_TO_STRING = JavaMethod.getNativeStatic(JavaClass.FLOAT, "toString", "(F)Ljava/lang/String;");
90
+	private static final JavaMethod DOUBLE_COMPARE = JavaMethod.getNativeStatic(JavaClass.DOUBLE, "compare", "(DD)I");
91
+	private static final JavaMethod DOUBLE_PARSE = JavaMethod.getNativeStatic(JavaClass.DOUBLE, "parseDouble", "(Ljava/lang/String;)D");
92
+	private static final JavaMethod DOUBLE_FROM_BITS = JavaMethod.getNativeStatic(JavaClass.DOUBLE, "longBitsToDouble", "(J)D");
93
+	private static final JavaMethod DOUBLE_BITS = JavaMethod.getNativeStatic(JavaClass.DOUBLE, "doubleToRawLongBits", "(D)J");
91 94
 	private static final JavaField DOUBLE_MIN_VALUE = new JavaField(JavaClass.DOUBLE, "MIN_VALUE", "D");
92 95
 	private static final JavaField DOUBLE_MAX_VALUE = new JavaField(JavaClass.DOUBLE, "MAX_VALUE", "D");
93
-	private static final JavaMethodInfo DOUBLE_TO_STRING = new JavaMethodInfo(JavaClass.DOUBLE, "toString", "(D)Ljava/lang/String;", PUBLIC_STATIC);
94
-	private static final JavaMethodInfo CHARACTER_TO_LOWER_CASE = new JavaMethodInfo(JavaClass.CHARACTER, "toLowerCase", "()C", PUBLIC);
95
-	private static final JavaMethodInfo CHARACTER_TO_UPPER_CASE = new JavaMethodInfo(JavaClass.CHARACTER, "toUpperCase", "()C", PUBLIC);
96
+	private static final JavaMethod DOUBLE_TO_STRING = JavaMethod.getNativeStatic(JavaClass.DOUBLE, "toString", "(D)Ljava/lang/String;");
97
+	private static final JavaMethod CHARACTER_TO_LOWER_CASE = JavaMethod.getNativeVirtual(JavaClass.CHARACTER, "toLowerCase", "()C");
98
+	private static final JavaMethod CHARACTER_TO_UPPER_CASE = JavaMethod.getNativeVirtual(JavaClass.CHARACTER, "toUpperCase", "()C");
96 99
 	private static final JavaField CHARACTER_MIN_VALUE = new JavaField(JavaClass.CHARACTER, "MIN_VALUE", "C");
97 100
 	private static final JavaField CHARACTER_MAX_VALUE = new JavaField(JavaClass.CHARACTER, "MAX_VALUE", "C");
98
-	private static final JavaMethodInfo CHARACTER_TO_STRING = new JavaMethodInfo(JavaClass.CHARACTER, "toString", "(C)Ljava/lang/String;", PUBLIC_STATIC);
99
-	private static final JavaMethodInfo STRING_COMPARETO = new JavaMethodInfo(JavaClass.STRING, "compareTo", "(Ljava/lang/String;)I", PUBLIC);
100
-	private static final JavaMethodInfo STRING_CONCAT = new JavaMethodInfo(JavaClass.STRING, "concat", "(Ljava/lang/String;)Ljava/lang/String;", PUBLIC);
101
-	private static final JavaMethodInfo STRING_CHAR_AT = new JavaMethodInfo(JavaClass.STRING, "charAt", "(I)C", PUBLIC);
102
-	private static final JavaMethodInfo STRING_SUBSTRING = new JavaMethodInfo(JavaClass.STRING, "substring", "(II)Ljava/lang/String;", PUBLIC);
103
-	private static final JavaMethodInfo STRING_TRIM = new JavaMethodInfo(JavaClass.STRING, "trim", "()Ljava/lang/String;", PUBLIC);
104
-	private static final JavaMethodInfo STRING_TO_LOWER_CASE = new JavaMethodInfo(JavaClass.STRING, "toLowerCase", "()Ljava/lang/String;", PUBLIC);
105
-	private static final JavaMethodInfo STRING_TO_UPPER_CASE = new JavaMethodInfo(JavaClass.STRING, "toUpperCase", "()Ljava/lang/String;", PUBLIC);
106
-	private static final JavaMethodInfo STRING_LENGTH = new JavaMethodInfo(JavaClass.STRING, "length", "()I", PUBLIC);
107
-	private static final JavaMethodInfo STRING_CHARACTERS = new JavaMethodInfo(JavaClass.STRING, "toCharArray", "()[C", PUBLIC);
108
-	private static final JavaMethodInfo STRING_ISEMPTY = new JavaMethodInfo(JavaClass.STRING, "isEmpty", "()Z", PUBLIC);
109
-	private static final JavaMethodInfo ENUM_COMPARETO = new JavaMethodInfo(JavaClass.ENUM, "compareTo", "(Ljava/lang/Enum;)I", PUBLIC);
110
-	private static final JavaMethodInfo ENUM_NAME = new JavaMethodInfo(JavaClass.ENUM, "name", "()Ljava/lang/String;", PUBLIC);
111
-	private static final JavaMethodInfo ENUM_ORDINAL = new JavaMethodInfo(JavaClass.ENUM, "ordinal", "()I", PUBLIC);
112
-	private static final JavaMethodInfo MAP_GET = new JavaMethodInfo(JavaClass.MAP, "get", "(Ljava/lang/Object;)Ljava/lang/Object;", PUBLIC);
113
-	private static final JavaMethodInfo MAP_PUT = new JavaMethodInfo(JavaClass.MAP, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;", PUBLIC);
114
-	private static final JavaMethodInfo MAP_CONTAINS_KEY = new JavaMethodInfo(JavaClass.MAP, "containsKey", "(Ljava/lang/Object;)Z", PUBLIC);
115
-	private static final JavaMethodInfo MAP_SIZE = new JavaMethodInfo(JavaClass.MAP, "size", "()I", PUBLIC);
116
-	private static final JavaMethodInfo MAP_ISEMPTY = new JavaMethodInfo(JavaClass.MAP, "isEmpty", "()Z", PUBLIC);
117
-	private static final JavaMethodInfo MAP_KEYS = new JavaMethodInfo(JavaClass.MAP, "keys", "()Ljava/lang/Object;", PUBLIC);
118
-	private static final JavaMethodInfo MAP_VALUES = new JavaMethodInfo(JavaClass.MAP, "values", "()Ljava/lang/Object;", PUBLIC);
119
-	private static final JavaMethodInfo ARRAYS_COPY_OF_RANGE_OBJECTS = new JavaMethodInfo(JavaClass.ARRAYS, "copyOfRange", "([Ljava/lang/Object;II)[Ljava/lang/Object;", PUBLIC_STATIC);
120
-	private static final JavaMethodInfo ARRAYS_COPY_OF_RANGE_BOOLS = new JavaMethodInfo(JavaClass.ARRAYS, "copyOfRange", "([ZII)[Z", PUBLIC_STATIC);
121
-	private static final JavaMethodInfo ARRAYS_COPY_OF_RANGE_BYTES = new JavaMethodInfo(JavaClass.ARRAYS, "copyOfRange", "([BII)[B", PUBLIC_STATIC);
122
-	private static final JavaMethodInfo ARRAYS_COPY_OF_RANGE_SHORTS = new JavaMethodInfo(JavaClass.ARRAYS, "copyOfRange", "([SII)[S", PUBLIC_STATIC);
123
-	private static final JavaMethodInfo ARRAYS_COPY_OF_RANGE_INTS = new JavaMethodInfo(JavaClass.ARRAYS, "copyOfRange", "([III)[I", PUBLIC_STATIC);
124
-	private static final JavaMethodInfo ARRAYS_COPY_OF_RANGE_LONGS = new JavaMethodInfo(JavaClass.ARRAYS, "copyOfRange", "([JII)[J", PUBLIC_STATIC);
125
-	private static final JavaMethodInfo ARRAYS_COPY_OF_RANGE_FLOATS = new JavaMethodInfo(JavaClass.ARRAYS, "copyOfRange", "([FII)[F", PUBLIC_STATIC);
126
-	private static final JavaMethodInfo ARRAYS_COPY_OF_RANGE_DOUBLES = new JavaMethodInfo(JavaClass.ARRAYS, "copyOfRange", "([DII)[D", PUBLIC_STATIC);
127
-	private static final JavaMethodInfo ARRAYS_COPY_OF_RANGE_CHARS = new JavaMethodInfo(JavaClass.ARRAYS, "copyOfRange", "([CII)[C", PUBLIC_STATIC);
128
-	private static final JavaMethodInfo ARRAYS_EQUALS_OBJECTS = new JavaMethodInfo(JavaClass.ARRAYS, "equals", "([Ljava/lang/Object[Ljava/lang/Object)Z", PUBLIC_STATIC);
129
-	private static final JavaMethodInfo ARRAYS_EQUALS_BOOLS = new JavaMethodInfo(JavaClass.ARRAYS, "equals", "([Z[Z)Z", PUBLIC_STATIC);
130
-	private static final JavaMethodInfo ARRAYS_EQUALS_BYTES = new JavaMethodInfo(JavaClass.ARRAYS, "equals", "([B[B)Z", PUBLIC_STATIC);
131
-	private static final JavaMethodInfo ARRAYS_EQUALS_SHORTS = new JavaMethodInfo(JavaClass.ARRAYS, "equals", "([S[S)Z", PUBLIC_STATIC);
132
-	private static final JavaMethodInfo ARRAYS_EQUALS_INTS = new JavaMethodInfo(JavaClass.ARRAYS, "equals", "([I[I)Z", PUBLIC_STATIC);
133
-	private static final JavaMethodInfo ARRAYS_EQUALS_LONGS = new JavaMethodInfo(JavaClass.ARRAYS, "equals", "([L[L)Z", PUBLIC_STATIC);
134
-	private static final JavaMethodInfo ARRAYS_EQUALS_FLOATS = new JavaMethodInfo(JavaClass.ARRAYS, "equals", "([F[F)Z", PUBLIC_STATIC);
135
-	private static final JavaMethodInfo ARRAYS_EQUALS_DOUBLES = new JavaMethodInfo(JavaClass.ARRAYS, "equals", "([D[D)Z", PUBLIC_STATIC);
136
-	private static final JavaMethodInfo ARRAYS_EQUALS_CHARS = new JavaMethodInfo(JavaClass.ARRAYS, "equals", "([C[C)Z", PUBLIC_STATIC);
137
-	private static final JavaMethodInfo ARRAYS_DEEPHASHCODE = new JavaMethodInfo(JavaClass.ARRAYS, "deepHashCode", "([Ljava/lang/Object;)", PUBLIC_STATIC);
138
-	private static final JavaMethodInfo ARRAYS_HASHCODE_BOOLS = new JavaMethodInfo(JavaClass.ARRAYS, "hashCode", "([Z)I", PUBLIC_STATIC);
139
-	private static final JavaMethodInfo ARRAYS_HASHCODE_BYTES = new JavaMethodInfo(JavaClass.ARRAYS, "hashCode", "([B)I", PUBLIC_STATIC);
140
-	private static final JavaMethodInfo ARRAYS_HASHCODE_SHORTS = new JavaMethodInfo(JavaClass.ARRAYS, "hashCode", "([S)I", PUBLIC_STATIC);
141
-	private static final JavaMethodInfo ARRAYS_HASHCODE_INTS = new JavaMethodInfo(JavaClass.ARRAYS, "hashCode", "([I)I", PUBLIC_STATIC);
142
-	private static final JavaMethodInfo ARRAYS_HASHCODE_LONGS = new JavaMethodInfo(JavaClass.ARRAYS, "hashCode", "([L)I", PUBLIC_STATIC);
143
-	private static final JavaMethodInfo ARRAYS_HASHCODE_FLOATS = new JavaMethodInfo(JavaClass.ARRAYS, "hashCode", "([F)I", PUBLIC_STATIC);
144
-	private static final JavaMethodInfo ARRAYS_HASHCODE_DOUBLES = new JavaMethodInfo(JavaClass.ARRAYS, "hashCode", "([D)I", PUBLIC_STATIC);
145
-	private static final JavaMethodInfo ARRAYS_HASHCODE_CHARS = new JavaMethodInfo(JavaClass.ARRAYS, "hashCode", "([C)I", PUBLIC_STATIC);
146
-	private static final JavaMethodInfo OBJECT_HASHCODE = new JavaMethodInfo(JavaClass.OBJECT, "hashCode", "()I", PUBLIC);
147
-	private static final JavaMethodInfo COLLECTION_SIZE = new JavaMethodInfo(JavaClass.COLLECTION, "size", "()I", PUBLIC);
148
-	private static final JavaMethodInfo COLLECTION_TOARRAY = new JavaMethodInfo(JavaClass.COLLECTION, "toArray", "([Ljava/lang/Object;)[Ljava/lang/Object;", PUBLIC);
101
+	private static final JavaMethod CHARACTER_TO_STRING = JavaMethod.getNativeStatic(JavaClass.CHARACTER, "toString", "(C)Ljava/lang/String;");
102
+	private static final JavaMethod STRING_COMPARETO = JavaMethod.getNativeVirtual(JavaClass.STRING, "compareTo", "(Ljava/lang/String;)I");
103
+	private static final JavaMethod STRING_CONCAT = JavaMethod.getNativeVirtual(JavaClass.STRING, "concat", "(Ljava/lang/String;)Ljava/lang/String;");
104
+	private static final JavaMethod STRING_CHAR_AT = JavaMethod.getNativeVirtual(JavaClass.STRING, "charAt", "(I)C");
105
+	private static final JavaMethod STRING_SUBSTRING = JavaMethod.getNativeVirtual(JavaClass.STRING, "substring", "(II)Ljava/lang/String;");
106
+	private static final JavaMethod STRING_TRIM = JavaMethod.getNativeVirtual(JavaClass.STRING, "trim", "()Ljava/lang/String;");
107
+	private static final JavaMethod STRING_TO_LOWER_CASE = JavaMethod.getNativeVirtual(JavaClass.STRING, "toLowerCase", "()Ljava/lang/String;");
108
+	private static final JavaMethod STRING_TO_UPPER_CASE = JavaMethod.getNativeVirtual(JavaClass.STRING, "toUpperCase", "()Ljava/lang/String;");
109
+	private static final JavaMethod STRING_LENGTH = JavaMethod.getNativeVirtual(JavaClass.STRING, "length", "()I");
110
+	private static final JavaMethod STRING_CHARACTERS = JavaMethod.getNativeVirtual(JavaClass.STRING, "toCharArray", "()[C");
111
+	private static final JavaMethod STRING_ISEMPTY = JavaMethod.getNativeVirtual(JavaClass.STRING, "isEmpty", "()Z");
112
+	private static final JavaMethod ENUM_COMPARETO = JavaMethod.getNativeVirtual(JavaClass.ENUM, "compareTo", "(Ljava/lang/Enum;)I");
113
+	private static final JavaMethod ENUM_NAME = JavaMethod.getNativeVirtual(JavaClass.ENUM, "name", "()Ljava/lang/String;");
114
+	private static final JavaMethod ENUM_ORDINAL = JavaMethod.getNativeVirtual(JavaClass.ENUM, "ordinal", "()I");
115
+	private static final JavaMethod MAP_GET = JavaMethod.getNativeVirtual(JavaClass.MAP, "get", "(Ljava/lang/Object;)Ljava/lang/Object;");
116
+	private static final JavaMethod MAP_PUT = JavaMethod.getNativeVirtual(JavaClass.MAP, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
117
+	private static final JavaMethod MAP_CONTAINS_KEY = JavaMethod.getNativeVirtual(JavaClass.MAP, "containsKey", "(Ljava/lang/Object;)Z");
118
+	private static final JavaMethod MAP_SIZE = JavaMethod.getNativeVirtual(JavaClass.MAP, "size", "()I");
119
+	private static final JavaMethod MAP_ISEMPTY = JavaMethod.getNativeVirtual(JavaClass.MAP, "isEmpty", "()Z");
120
+	private static final JavaMethod MAP_KEYS = JavaMethod.getNativeVirtual(JavaClass.MAP, "keys", "()Ljava/lang/Object;");
121
+	private static final JavaMethod MAP_VALUES = JavaMethod.getNativeVirtual(JavaClass.MAP, "values", "()Ljava/lang/Object;");
122
+	private static final JavaMethod ARRAYS_COPY_OF_RANGE_OBJECTS = JavaMethod.getNativeStatic(JavaClass.ARRAYS, "copyOfRange", "([Ljava/lang/Object;II)[Ljava/lang/Object;");
123
+	private static final JavaMethod ARRAYS_COPY_OF_RANGE_BOOLS = JavaMethod.getNativeStatic(JavaClass.ARRAYS, "copyOfRange", "([ZII)[Z");
124
+	private static final JavaMethod ARRAYS_COPY_OF_RANGE_BYTES = JavaMethod.getNativeStatic(JavaClass.ARRAYS, "copyOfRange", "([BII)[B");
125
+	private static final JavaMethod ARRAYS_COPY_OF_RANGE_SHORTS = JavaMethod.getNativeStatic(JavaClass.ARRAYS, "copyOfRange", "([SII)[S");
126
+	private static final JavaMethod ARRAYS_COPY_OF_RANGE_INTS = JavaMethod.getNativeStatic(JavaClass.ARRAYS, "copyOfRange", "([III)[I");
127
+	private static final JavaMethod ARRAYS_COPY_OF_RANGE_LONGS = JavaMethod.getNativeStatic(JavaClass.ARRAYS, "copyOfRange", "([JII)[J");
128
+	private static final JavaMethod ARRAYS_COPY_OF_RANGE_FLOATS = JavaMethod.getNativeStatic(JavaClass.ARRAYS, "copyOfRange", "([FII)[F");
129
+	private static final JavaMethod ARRAYS_COPY_OF_RANGE_DOUBLES = JavaMethod.getNativeStatic(JavaClass.ARRAYS, "copyOfRange", "([DII)[D");
130
+	private static final JavaMethod ARRAYS_COPY_OF_RANGE_CHARS = JavaMethod.getNativeStatic(JavaClass.ARRAYS, "copyOfRange", "([CII)[C");
131
+	private static final JavaMethod ARRAYS_EQUALS_OBJECTS = JavaMethod.getNativeStatic(JavaClass.ARRAYS, "equals", "([Ljava/lang/Object[Ljava/lang/Object)Z");
132
+	private static final JavaMethod ARRAYS_EQUALS_BOOLS = JavaMethod.getNativeStatic(JavaClass.ARRAYS, "equals", "([Z[Z)Z");
133
+	private static final JavaMethod ARRAYS_EQUALS_BYTES = JavaMethod.getNativeStatic(JavaClass.ARRAYS, "equals", "([B[B)Z");
134
+	private static final JavaMethod ARRAYS_EQUALS_SHORTS = JavaMethod.getNativeStatic(JavaClass.ARRAYS, "equals", "([S[S)Z");
135
+	private static final JavaMethod ARRAYS_EQUALS_INTS = JavaMethod.getNativeStatic(JavaClass.ARRAYS, "equals", "([I[I)Z");
136
+	private static final JavaMethod ARRAYS_EQUALS_LONGS = JavaMethod.getNativeStatic(JavaClass.ARRAYS, "equals", "([L[L)Z");
137
+	private static final JavaMethod ARRAYS_EQUALS_FLOATS = JavaMethod.getNativeStatic(JavaClass.ARRAYS, "equals", "([F[F)Z");
138
+	private static final JavaMethod ARRAYS_EQUALS_DOUBLES = JavaMethod.getNativeStatic(JavaClass.ARRAYS, "equals", "([D[D)Z");
139
+	private static final JavaMethod ARRAYS_EQUALS_CHARS = JavaMethod.getNativeStatic(JavaClass.ARRAYS, "equals", "([C[C)Z");
140
+	private static final JavaMethod ARRAYS_DEEPHASHCODE = JavaMethod.getNativeStatic(JavaClass.ARRAYS, "deepHashCode", "([Ljava/lang/Object;)");
141
+	private static final JavaMethod ARRAYS_HASHCODE_BOOLS = JavaMethod.getNativeStatic(JavaClass.ARRAYS, "hashCode", "([Z)I");
142
+	private static final JavaMethod ARRAYS_HASHCODE_BYTES = JavaMethod.getNativeStatic(JavaClass.ARRAYS, "hashCode", "([B)I");
143
+	private static final JavaMethod ARRAYS_HASHCODE_SHORTS = JavaMethod.getNativeStatic(JavaClass.ARRAYS, "hashCode", "([S)I");
144
+	private static final JavaMethod ARRAYS_HASHCODE_INTS = JavaMethod.getNativeStatic(JavaClass.ARRAYS, "hashCode", "([I)I");
145
+	private static final JavaMethod ARRAYS_HASHCODE_LONGS = JavaMethod.getNativeStatic(JavaClass.ARRAYS, "hashCode", "([L)I");
146
+	private static final JavaMethod ARRAYS_HASHCODE_FLOATS = JavaMethod.getNativeStatic(JavaClass.ARRAYS, "hashCode", "([F)I");
147
+	private static final JavaMethod ARRAYS_HASHCODE_DOUBLES = JavaMethod.getNativeStatic(JavaClass.ARRAYS, "hashCode", "([D)I");
148
+	private static final JavaMethod ARRAYS_HASHCODE_CHARS = JavaMethod.getNativeStatic(JavaClass.ARRAYS, "hashCode", "([C)I");
149
+	public static final JavaMethod OBJECT_HASHCODE = JavaMethod.getNativeVirtual(JavaClass.OBJECT, "hashCode", "()I");
150
+	private static final JavaMethod COLLECTION_SIZE = JavaMethod.getNativeVirtual(JavaClass.COLLECTION, "size", "()I");
151
+	private static final JavaMethod COLLECTION_TOARRAY = JavaMethod.getNativeVirtual(JavaClass.COLLECTION, "toArray", "([Ljava/lang/Object;)[Ljava/lang/Object;");
149 152
 
150 153
 	protected final JavaWriter javaWriter;
151 154
 	private final JavaCapturedExpressionVisitor capturedExpressionVisitor = new JavaCapturedExpressionVisitor(this);
@@ -271,7 +274,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
271 274
 					throw new UnsupportedOperationException("Unknown builtin comparator: " + expression.operator.getBuiltin());
272 275
 			}
273 276
 		} else {
274
-			if (!checkAndExecuteMethodInfo(expression.operator))
277
+			if (!checkAndExecuteMethodInfo(expression.operator, expression.type))
275 278
 				throw new IllegalStateException("Call target has no method info!");
276 279
 
277 280
 			expression.left.accept(this);
@@ -355,7 +358,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
355 358
 				argument.accept(this);
356 359
 			}
357 360
 
358
-			if (!checkAndExecuteMethodInfo(expression.member))
361
+			if (!checkAndExecuteMethodInfo(expression.member, expression.type))
359 362
 				throw new IllegalStateException("Call target has no method info!");
360 363
 			//if (expression.member.getHeader().returnType != expression.type)
361 364
 
@@ -404,6 +407,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
404 407
 			case USHORT_NOT:
405 408
 			case INT_NOT:
406 409
 			case UINT_NOT:
410
+			case USIZE_NOT:
407 411
 				javaWriter.iNot();
408 412
 				break;
409 413
 			case SBYTE_NEG:
@@ -417,6 +421,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
417 421
 			case USHORT_ADD_USHORT:
418 422
 			case INT_ADD_INT:
419 423
 			case UINT_ADD_UINT:
424
+			case USIZE_ADD_USIZE:
420 425
 				javaWriter.iAdd();
421 426
 				break;
422 427
 			case BYTE_SUB_BYTE:
@@ -425,6 +430,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
425 430
 			case USHORT_SUB_USHORT:
426 431
 			case INT_SUB_INT:
427 432
 			case UINT_SUB_UINT:
433
+			case USIZE_SUB_USIZE:
428 434
 				javaWriter.iSub();
429 435
 				break;
430 436
 			case BYTE_MUL_BYTE:
@@ -433,16 +439,19 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
433 439
 			case USHORT_MUL_USHORT:
434 440
 			case INT_MUL_INT:
435 441
 			case UINT_MUL_UINT:
442
+			case USIZE_MUL_USIZE:
436 443
 				javaWriter.iMul();
437 444
 				break;
438 445
 			case SBYTE_DIV_SBYTE:
439 446
 			case SHORT_DIV_SHORT:
440 447
 			case INT_DIV_INT:
448
+			case USIZE_DIV_USIZE:
441 449
 				javaWriter.iDiv();
442 450
 				break;
443 451
 			case SBYTE_MOD_SBYTE:
444 452
 			case SHORT_MOD_SHORT:
445 453
 			case INT_MOD_INT:
454
+			case USIZE_MOD_USIZE:
446 455
 				javaWriter.iRem();
447 456
 				break;
448 457
 			case BYTE_DIV_BYTE:
@@ -461,6 +470,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
461 470
 			case USHORT_AND_USHORT:
462 471
 			case INT_AND_INT:
463 472
 			case UINT_AND_UINT:
473
+			case USIZE_AND_USIZE:
464 474
 				javaWriter.iAnd();
465 475
 				break;
466 476
 			case BYTE_OR_BYTE:
@@ -469,6 +479,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
469 479
 			case USHORT_OR_USHORT:
470 480
 			case INT_OR_INT:
471 481
 			case UINT_OR_UINT:
482
+			case USIZE_OR_USIZE:
472 483
 				javaWriter.iOr();
473 484
 				break;
474 485
 			case BYTE_XOR_BYTE:
@@ -477,10 +488,12 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
477 488
 			case USHORT_XOR_USHORT:
478 489
 			case INT_XOR_INT:
479 490
 			case UINT_XOR_UINT:
491
+			case USIZE_XOR_USIZE:
480 492
 				javaWriter.iXor();
481 493
 				break;
482 494
 			case INT_SHL:
483 495
 			case UINT_SHL:
496
+			case USIZE_SHL:
484 497
 				javaWriter.iShl();
485 498
 				break;
486 499
 			case INT_SHR:
@@ -488,23 +501,28 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
488 501
 				break;
489 502
 			case INT_USHR:
490 503
 			case UINT_SHR:
504
+			case USIZE_SHR:
491 505
 				javaWriter.iUShr();
492 506
 				break;
493 507
 			case INT_COUNT_LOW_ZEROES:
494 508
 			case UINT_COUNT_LOW_ZEROES:
509
+			case USIZE_COUNT_LOW_ZEROES:
495 510
 				javaWriter.invokeStatic(INTEGER_NUMBER_OF_TRAILING_ZEROS);
496 511
 				break;
497 512
 			case INT_COUNT_HIGH_ZEROES:
498 513
 			case UINT_COUNT_HIGH_ZEROES:
514
+			case USIZE_COUNT_HIGH_ZEROES:
499 515
 				javaWriter.invokeStatic(INTEGER_NUMBER_OF_LEADING_ZEROS);
500 516
 				break;
501 517
 			case INT_COUNT_LOW_ONES:
502 518
 			case UINT_COUNT_LOW_ONES:
519
+			case USIZE_COUNT_LOW_ONES:
503 520
 				javaWriter.iNot();
504 521
 				javaWriter.invokeStatic(INTEGER_NUMBER_OF_TRAILING_ZEROS);
505 522
 				break;
506 523
 			case INT_COUNT_HIGH_ONES:
507 524
 			case UINT_COUNT_HIGH_ONES:
525
+			case USIZE_COUNT_HIGH_ONES:
508 526
 				javaWriter.iNot();
509 527
 				javaWriter.invokeStatic(INTEGER_NUMBER_OF_LEADING_ZEROS);
510 528
 				break;
@@ -794,7 +812,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
794 812
 					}
795 813
 				} else {
796 814
 					javaWriter.invokeStatic(ARRAYS_COPY_OF_RANGE_OBJECTS);
797
-					javaWriter.checkCast(context.getDescriptor(type));
815
+					javaWriter.checkCast(context.getInternalName(type));
798 816
 				}
799 817
 				break;
800 818
 			}
@@ -851,11 +869,10 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
851 869
 			}
852 870
 			case FUNCTION_CALL:
853 871
 				javaWriter.invokeInterface(
854
-						new JavaMethodInfo(
872
+						JavaMethod.getNativeVirtual(
855 873
 								JavaClass.fromInternalName(context.getInternalName(expression.target.type), JavaClass.Kind.INTERFACE),
856 874
 								"accept",
857
-								context.getMethodSignature(expression.instancedHeader),
858
-								Opcodes.ACC_PUBLIC));
875
+								context.getMethodSignature(expression.instancedHeader)));
859 876
 				break;
860 877
 			case AUTOOP_NOTEQUALS:
861 878
 				throw new UnsupportedOperationException("Not yet supported!");
@@ -873,7 +890,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
873 890
 
874 891
 		BuiltinID builtin = expression.member.getBuiltin();
875 892
 		if (builtin == null) {
876
-			if (!checkAndExecuteMethodInfo(expression.member))
893
+			if (!checkAndExecuteMethodInfo(expression.member, expression.type))
877 894
 				throw new IllegalStateException("Call target has no method info!");
878 895
 
879 896
 			return null;
@@ -914,9 +931,11 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
914 931
 				javaWriter.invokeStatic(INTEGER_PARSE_WITH_BASE);
915 932
 				break;
916 933
 			case UINT_PARSE:
934
+			case USIZE_PARSE:
917 935
 				javaWriter.invokeStatic(INTEGER_PARSE_UNSIGNED);
918 936
 				break;
919 937
 			case UINT_PARSE_WITH_BASE:
938
+			case USIZE_PARSE_WITH_BASE:
920 939
 				javaWriter.invokeStatic(INTEGER_PARSE_UNSIGNED_WITH_BASE);
921 940
 				break;
922 941
 			case LONG_PARSE:
@@ -980,7 +999,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
980 999
 
981 1000
 		BuiltinID builtin = expression.member.member.builtin;
982 1001
 		if (builtin == null) {
983
-			if (!checkAndExecuteByteCodeImplementation(expression.member) && !checkAndExecuteMethodInfo(expression.member))
1002
+			if (!checkAndExecuteMethodInfo(expression.member, expression.type))
984 1003
 				throw new IllegalStateException("Call target has no method info!");
985 1004
 
986 1005
 			return null;
@@ -1001,6 +1020,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1001 1020
 			case BYTE_TO_USHORT:
1002 1021
 			case BYTE_TO_INT:
1003 1022
 			case BYTE_TO_UINT:
1023
+			case BYTE_TO_USIZE:
1004 1024
 				javaWriter.constant(0xFF);
1005 1025
 				javaWriter.iAnd();
1006 1026
 				break;
@@ -1034,6 +1054,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1034 1054
 			case SBYTE_TO_USHORT:
1035 1055
 			case SBYTE_TO_INT:
1036 1056
 			case SBYTE_TO_UINT:
1057
+			case SBYTE_TO_USIZE:
1037 1058
 				break;
1038 1059
 			case SBYTE_TO_LONG:
1039 1060
 			case SBYTE_TO_ULONG:
@@ -1058,6 +1079,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1058 1079
 			case SHORT_TO_USHORT:
1059 1080
 			case SHORT_TO_INT:
1060 1081
 			case SHORT_TO_UINT:
1082
+			case SHORT_TO_USIZE:
1061 1083
 				break;
1062 1084
 			case SHORT_TO_LONG:
1063 1085
 			case SHORT_TO_ULONG:
@@ -1084,6 +1106,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1084 1106
 				break;
1085 1107
 			case USHORT_TO_INT:
1086 1108
 			case USHORT_TO_UINT:
1109
+			case USHORT_TO_USIZE:
1087 1110
 				javaWriter.constant(0xFFFF);
1088 1111
 				javaWriter.iAnd();
1089 1112
 				break;
@@ -1122,6 +1145,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1122 1145
 			case INT_TO_USHORT:
1123 1146
 				break;
1124 1147
 			case INT_TO_UINT:
1148
+			case INT_TO_USIZE:
1125 1149
 				break;
1126 1150
 			case INT_TO_LONG:
1127 1151
 			case INT_TO_ULONG:
@@ -1149,6 +1173,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1149 1173
 				break;
1150 1174
 			case UINT_TO_USHORT:
1151 1175
 			case UINT_TO_INT:
1176
+			case UINT_TO_USIZE:
1152 1177
 				break;
1153 1178
 			case UINT_TO_LONG:
1154 1179
 				javaWriter.i2l();
@@ -1190,6 +1215,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1190 1215
 			case LONG_TO_USHORT:
1191 1216
 			case LONG_TO_INT:
1192 1217
 			case LONG_TO_UINT:
1218
+			case LONG_TO_USIZE:
1193 1219
 				javaWriter.l2i();
1194 1220
 				break;
1195 1221
 			case LONG_TO_ULONG:
@@ -1221,6 +1247,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1221 1247
 			case ULONG_TO_USHORT:
1222 1248
 			case ULONG_TO_INT:
1223 1249
 			case ULONG_TO_UINT:
1250
+			case ULONG_TO_USIZE:
1224 1251
 				javaWriter.l2i();
1225 1252
 				break;
1226 1253
 			case ULONG_TO_LONG:
@@ -1251,6 +1278,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1251 1278
 			case FLOAT_TO_USHORT:
1252 1279
 			case FLOAT_TO_UINT:
1253 1280
 			case FLOAT_TO_INT:
1281
+			case FLOAT_TO_USIZE:
1254 1282
 				javaWriter.f2i();
1255 1283
 				break;
1256 1284
 			case FLOAT_TO_LONG:
@@ -1277,6 +1305,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1277 1305
 			case DOUBLE_TO_USHORT:
1278 1306
 			case DOUBLE_TO_INT:
1279 1307
 			case DOUBLE_TO_UINT:
1308
+			case DOUBLE_TO_USIZE:
1280 1309
 				javaWriter.d2i();
1281 1310
 				break;
1282 1311
 			case DOUBLE_TO_LONG:
@@ -1298,6 +1327,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1298 1327
 			case CHAR_TO_USHORT:
1299 1328
 			case CHAR_TO_INT:
1300 1329
 			case CHAR_TO_UINT:
1330
+			case CHAR_TO_USIZE:
1301 1331
 				break;
1302 1332
 			case CHAR_TO_LONG:
1303 1333
 			case CHAR_TO_ULONG:
@@ -1323,7 +1353,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1323 1353
         javaWriter.dup();
1324 1354
         javaWriter.ifNonNull(end);
1325 1355
         javaWriter.pop();
1326
-        javaWriter.newObject(NullPointerException.class);
1356
+        javaWriter.newObject("java/lang/NullPointerException");
1327 1357
         javaWriter.dup();
1328 1358
         javaWriter.constant("Tried to convert a null value to nonnull type " + context.getType(expression.type).getClassName());
1329 1359
         javaWriter.invokeSpecial(NullPointerException.class, "<init>", "(Ljava/lang/String;)V");
@@ -1418,6 +1448,15 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1418 1448
 			case ULONG_GET_MAX_VALUE:
1419 1449
 				javaWriter.constant(-1L);
1420 1450
 				break;
1451
+			case USIZE_GET_MIN_VALUE:
1452
+				javaWriter.iConst0();
1453
+				break;
1454
+			case USIZE_GET_MAX_VALUE:
1455
+				javaWriter.getStaticField(INTEGER_MAX_VALUE);
1456
+				break;
1457
+			case USIZE_BITS:
1458
+				javaWriter.constant(32);
1459
+				break;
1421 1460
 			case FLOAT_GET_MIN_VALUE:
1422 1461
 				javaWriter.getStaticField(FLOAT_MIN_VALUE);
1423 1462
 				break;
@@ -1439,7 +1478,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1439 1478
 			case ENUM_VALUES: {
1440 1479
 				DefinitionTypeID type = (DefinitionTypeID) expression.type;
1441 1480
 				JavaClass cls = type.definition.getTag(JavaClass.class);
1442
-				javaWriter.invokeStatic(new JavaMethodInfo(cls, "values", "()[L" + cls.internalName + ";", PUBLIC_STATIC));
1481
+				javaWriter.invokeStatic(JavaMethod.getNativeStatic(cls, "values", "()[L" + cls.internalName + ";"));
1443 1482
 				break;
1444 1483
 			}
1445 1484
 			default:
@@ -1530,10 +1569,16 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1530 1569
 		return null;
1531 1570
 	}
1532 1571
 
1572
+	@Override
1573
+	public Void visitConstantUSize(ConstantUSizeExpression expression) {
1574
+		getJavaWriter().constant((int)expression.value);
1575
+		return null;
1576
+	}
1577
+
1533 1578
     @Override
1534 1579
     public Void visitConstructorThisCall(ConstructorThisCallExpression expression) {
1535 1580
 		javaWriter.loadObject(0);
1536
-		if (javaWriter.method.javaClass.isEnum()) {
1581
+		if (javaWriter.method.cls.isEnum()) {
1537 1582
 			javaWriter.loadObject(1);
1538 1583
 			javaWriter.loadInt(2);
1539 1584
 		}
@@ -1542,7 +1587,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1542 1587
 			argument.accept(this);
1543 1588
 		}
1544 1589
 		String internalName = context.getInternalName(expression.objectType);
1545
-        javaWriter.invokeSpecial(internalName, "<init>", javaWriter.method.javaClass.isEnum()
1590
+        javaWriter.invokeSpecial(internalName, "<init>", javaWriter.method.cls.isEnum()
1546 1591
 				? context.getEnumConstructorDescriptor(expression.constructor.getHeader())
1547 1592
 				: context.getMethodDescriptor(expression.constructor.getHeader()));
1548 1593
         return null;
@@ -1579,9 +1624,9 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1579 1624
             return null;
1580 1625
         }
1581 1626
         final String signature = context.getMethodSignature(expression.header);
1582
-		final String name = CompilerUtils.getLambdaCounter();
1627
+		final String name = context.getLambdaCounter();
1583 1628
 
1584
-		final JavaMethodInfo methodInfo = new JavaMethodInfo(javaWriter.method.javaClass, "accept", signature, Opcodes.ACC_PUBLIC);
1629
+		final JavaMethod methodInfo = JavaMethod.getNativeVirtual(javaWriter.method.cls, "accept", signature);
1585 1630
 		final ClassWriter lambdaCW = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
1586 1631
 		lambdaCW.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, name, null, "java/lang/Object", new String[]{JavaSynthesizedClassNamer.createFunctionName(new FunctionTypeID(null, expression.header)).cls.internalName});
1587 1632
 		final JavaWriter functionWriter = new JavaWriter(lambdaCW, methodInfo, null, signature, null, "java/lang/Override");
@@ -1592,7 +1637,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1592 1637
 		final String constructorDesc = calcFunctionSignature(expression.closure);
1593 1638
 
1594 1639
 
1595
-		final JavaWriter constructorWriter = new JavaWriter(lambdaCW, new JavaMethodInfo(javaWriter.method.javaClass, "<init>", constructorDesc, Opcodes.ACC_PUBLIC), null, null, null);
1640
+		final JavaWriter constructorWriter = new JavaWriter(lambdaCW, JavaMethod.getConstructor(javaWriter.method.cls, constructorDesc, Opcodes.ACC_PUBLIC), null, null, null);
1596 1641
 		constructorWriter.start();
1597 1642
 		constructorWriter.loadObject(0);
1598 1643
 		constructorWriter.dup();
@@ -1722,9 +1767,9 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1722 1767
 	public Void visitGetMatchingVariantField(GetMatchingVariantField expression) {
1723 1768
 		javaWriter.loadObject(0);
1724 1769
 		final ITypeID type = expression.value.option.getParameterType(expression.index);
1725
-		final JavaClass tag = expression.value.option.getTag(JavaClass.class);
1726
-		javaWriter.checkCast(tag.internalName);
1727
-		javaWriter.getField(new JavaField(tag, "Field" + expression.index, context.getDescriptor(type)));
1770
+		final JavaVariantOption tag = expression.value.option.getTag(JavaVariantOption.class);
1771
+		javaWriter.checkCast(tag.variantOptionClass.internalName);
1772
+		javaWriter.getField(new JavaField(tag.variantOptionClass, "field" + expression.index, context.getDescriptor(type)));
1728 1773
 		return null;
1729 1774
 	}
1730 1775
 
@@ -1741,7 +1786,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1741 1786
 
1742 1787
 		BuiltinID builtin = expression.getter.member.builtin;
1743 1788
 		if (builtin == null) {
1744
-			if (!checkAndExecuteMethodInfo(expression.getter))
1789
+			if (!checkAndExecuteMethodInfo(expression.getter, expression.type))
1745 1790
 				throw new IllegalStateException("Call target has no method info!");
1746 1791
 
1747 1792
 			return null;
@@ -1750,24 +1795,29 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1750 1795
 		switch (builtin) {
1751 1796
 			case INT_HIGHEST_ONE_BIT:
1752 1797
 			case UINT_HIGHEST_ONE_BIT:
1798
+			case USIZE_HIGHEST_ONE_BIT:
1753 1799
 				javaWriter.invokeStatic(INTEGER_HIGHEST_ONE_BIT);
1754 1800
 				break;
1755 1801
 			case INT_LOWEST_ONE_BIT:
1756 1802
 			case UINT_LOWEST_ONE_BIT:
1803
+			case USIZE_LOWEST_ONE_BIT:
1757 1804
 				javaWriter.invokeStatic(INTEGER_LOWEST_ONE_BIT);
1758 1805
 				break;
1759 1806
 			case INT_HIGHEST_ZERO_BIT:
1760 1807
 			case UINT_HIGHEST_ZERO_BIT:
1808
+			case USIZE_HIGHEST_ZERO_BIT:
1761 1809
 				javaWriter.iNeg();
1762 1810
 				javaWriter.invokeStatic(INTEGER_HIGHEST_ONE_BIT);
1763 1811
 				break;
1764 1812
 			case INT_LOWEST_ZERO_BIT:
1765 1813
 			case UINT_LOWEST_ZERO_BIT:
1814
+			case USIZE_LOWEST_ZERO_BIT:
1766 1815
 				javaWriter.iNeg();
1767 1816
 				javaWriter.invokeStatic(INTEGER_LOWEST_ONE_BIT);
1768 1817
 				break;
1769 1818
 			case INT_BIT_COUNT:
1770 1819
 			case UINT_BIT_COUNT:
1820
+			case USIZE_BIT_COUNT:
1771 1821
 				javaWriter.invokeStatic(INTEGER_BIT_COUNT);
1772 1822
 				break;
1773 1823
 			case LONG_HIGHEST_ONE_BIT:
@@ -1914,13 +1964,16 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1914 1964
 			case OBJECT_HASHCODE:
1915 1965
 				javaWriter.invokeVirtual(OBJECT_HASHCODE);
1916 1966
 				break;
1917
-			case RANGE_FROM:
1918
-				// TODO: range types
1919
-				javaWriter.getField(IntRange.class, "from", int.class);
1967
+			case RANGE_FROM: {
1968
+				RangeTypeID type = (RangeTypeID)expression.target.type;
1969
+				JavaClass cls = context.getTypeGenerator().synthesizeRange(type).cls;
1970
+				javaWriter.getField(cls.internalName, "from", context.getDescriptor(type.baseType));
1920 1971
 				break;
1972
+			}
1921 1973
 			case RANGE_TO:
1922
-				// TODO: range types
1923
-				javaWriter.getField(IntRange.class, "to", int.class);
1974
+				RangeTypeID type = (RangeTypeID)expression.target.type;
1975
+				JavaClass cls = context.getTypeGenerator().synthesizeRange(type).cls;
1976
+				javaWriter.getField(cls.internalName, "to", context.getDescriptor(type.baseType));
1924 1977
 				break;
1925 1978
 		}
1926 1979
 
@@ -1940,14 +1993,14 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1940 1993
     @Override
1941 1994
     public Void visitInterfaceCast(InterfaceCastExpression expression) {
1942 1995
         expression.value.accept(this);
1943
-        javaWriter.checkCast(context.getDescriptor(expression.type));
1996
+        javaWriter.checkCast(context.getInternalName(expression.type));
1944 1997
         return null;
1945 1998
     }
1946 1999
 
1947 2000
     @Override
1948 2001
     public Void visitIs(IsExpression expression) {
1949 2002
         expression.value.accept(this);
1950
-        javaWriter.instanceOf(context.getDescriptor(expression.isType));
2003
+        javaWriter.instanceOf(context.getInternalName(expression.isType));
1951 2004
         return null;
1952 2005
     }
1953 2006
 
@@ -1973,30 +2026,26 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1973 2026
 
1974 2027
 	@Override
1975 2028
 	public Void visitMatch(MatchExpression expression) {
1976
-
1977 2029
 		final Label start = new Label();
1978 2030
 		final Label end = new Label();
1979 2031
 
1980
-
1981 2032
 		javaWriter.label(start);
1982 2033
 		expression.value.accept(this);
1983 2034
 
1984
-
1985 2035
 		//TODO replace beforeSwitch visitor or similar
1986 2036
 		if (expression.value.type == BasicTypeID.STRING)
1987
-			javaWriter.invokeVirtual(new JavaMethodInfo(JavaClass.OBJECT, "hashCode", "()I", 0));
2037
+			javaWriter.invokeVirtual(OBJECT_HASHCODE);
1988 2038
 
1989 2039
 		//TODO replace with beforeSwitch visitor or similar
1990 2040
 		for (MatchExpression.Case aCase : expression.cases) {
1991 2041
 			if (aCase.key instanceof VariantOptionSwitchValue) {
1992 2042
 				VariantOptionSwitchValue variantOptionSwitchValue = (VariantOptionSwitchValue) aCase.key;
1993
-				final String className = variantOptionSwitchValue.option.getTag(JavaClass.class).internalName;
1994
-				javaWriter.invokeVirtual(new JavaMethodInfo(new JavaClass("", className.substring(0, className.lastIndexOf('$')), JavaClass.Kind.CLASS), "getDenominator", "()I", 0));
2043
+				JavaVariantOption option = variantOptionSwitchValue.option.getTag(JavaVariantOption.class);
2044
+				javaWriter.invokeVirtual(JavaMethod.getNativeVirtual(option.variantClass, "getDenominator", "()I"));
1995 2045
 				break;
1996 2046
 			}
1997 2047
 		}
1998 2048
 
1999
-
2000 2049
 		final boolean hasNoDefault = hasNoDefault(expression);
2001 2050
 
2002 2051
 		final MatchExpression.Case[] cases = expression.cases;
@@ -2048,6 +2097,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
2048 2097
     @Override
2049 2098
     public Void visitNew(NewExpression expression) {
2050 2099
 		// TODO: this code is incorrect!
2100
+		JavaMethod method = expression.constructor.getTag(JavaMethod.class);
2051 2101
 
2052 2102
         final String type;
2053 2103
         if (expression.type instanceof DefinitionTypeID)
@@ -2057,21 +2107,21 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
2057 2107
 
2058 2108
         javaWriter.newObject(type);
2059 2109
         javaWriter.dup();
2060
-        StringBuilder signatureBuilder = new StringBuilder("(");
2061
-        for (Expression argument : expression.arguments.arguments) {
2062
-            argument.accept(this);
2063
-            signatureBuilder.append(context.getDescriptor(argument.type));
2064
-        }
2065
-        signatureBuilder.append(")V");
2066
-        javaWriter.invokeSpecial(type, "<init>", signatureBuilder.toString());
2067 2110
 
2068
-		//throw new UnsupportedOperationException("Not yet implemented!");
2111
+		for (Expression argument : expression.arguments.arguments) {
2112
+			argument.accept(this);
2113
+		}
2114
+
2115
+        javaWriter.invokeSpecial(method);
2069 2116
 		return null;
2070 2117
 	}
2071 2118
 
2072 2119
 	@Override
2073 2120
 	public Void visitNull(NullExpression expression) {
2074
-		javaWriter.aConstNull();
2121
+		if (expression.type.withoutOptional() == BasicTypeID.USIZE)
2122
+			javaWriter.constant(-1); // special case: usize? null = -1
2123
+		else
2124
+			javaWriter.aConstNull();
2075 2125
 		return null;
2076 2126
 	}
2077 2127
 
@@ -2102,7 +2152,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
2102 2152
 
2103 2153
 	@Override
2104 2154
 	public Void visitPanic(PanicExpression expression) {
2105
-		javaWriter.newObject(AssertionError.class);
2155
+		javaWriter.newObject("java/lang/AssertionError");
2106 2156
 		javaWriter.dup();
2107 2157
 		expression.value.accept(this);
2108 2158
 		javaWriter.invokeSpecial(AssertionError.class, "<init>", "(Ljava/lang/String;)V");
@@ -2114,7 +2164,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
2114 2164
 	public Void visitPostCall(PostCallExpression expression) {
2115 2165
 		expression.target.accept(this);
2116 2166
 		javaWriter.dup(context.getType(expression.type));
2117
-		if (!checkAndExecuteByteCodeImplementation(expression.member) && !checkAndExecuteMethodInfo(expression.member))
2167
+		if (!checkAndExecuteMethodInfo(expression.member, expression.type))
2118 2168
 			throw new IllegalStateException("Call target has no method info!");
2119 2169
 
2120 2170
 		return null;
@@ -2122,15 +2172,13 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
2122 2172
 
2123 2173
     @Override
2124 2174
     public Void visitRange(RangeExpression expression) {
2125
-        // TODO: there are other kinds of ranges also; there should be a Range<T, T> type with creation of synthetic types
2126
-        if (!context.getDescriptor(expression.from.type).equals("I"))
2127
-            throw new CompileException(expression.position, CompileExceptionCode.INTERNAL_ERROR, "Only integer ranges supported");
2128
-
2129
-		javaWriter.newObject(IntRange.class);
2175
+		RangeTypeID type = (RangeTypeID)expression.type;
2176
+		JavaSynthesizedClass cls = context.getTypeGenerator().synthesizeRange(type);
2177
+		javaWriter.newObject(cls.cls.internalName);
2130 2178
 		javaWriter.dup();
2131 2179
 		expression.from.accept(this);
2132 2180
 		expression.to.accept(this);
2133
-		javaWriter.invokeSpecial("org/openzen/zenscript/implementations/IntRange", "<init>", "(II)V");
2181
+		javaWriter.invokeSpecial(cls.cls.internalName, "<init>", "(" + context.getDescriptor(type.baseType) + context.getDescriptor(type.baseType) + ")V");
2134 2182
 
2135 2183
 		return null;
2136 2184
 	}
@@ -2207,7 +2255,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
2207 2255
 	public Void visitStaticGetter(StaticGetterExpression expression) {
2208 2256
 		BuiltinID builtin = expression.getter.member.builtin;
2209 2257
 		if (builtin == null) {
2210
-			if (!checkAndExecuteMethodInfo(expression.getter))
2258
+			if (!checkAndExecuteMethodInfo(expression.getter, expression.type))
2211 2259
 				throw new IllegalStateException("Call target has no method info!");
2212 2260
 
2213 2261
 			return null;
@@ -2283,7 +2331,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
2283 2331
 			case ENUM_VALUES: {
2284 2332
 				DefinitionTypeID type = (DefinitionTypeID) expression.type;
2285 2333
 				JavaClass cls = type.definition.getTag(JavaClass.class);
2286
-				javaWriter.invokeStatic(new JavaMethodInfo(cls, "values", "()[L" + cls.internalName + ";", PUBLIC_STATIC));
2334
+				javaWriter.invokeStatic(JavaMethod.getNativeStatic(cls, "values", "()[L" + cls.internalName + ";"));
2287 2335
 				break;
2288 2336
 			}
2289 2337
 			default:
@@ -2333,7 +2381,8 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
2333 2381
 
2334 2382
 	@Override
2335 2383
 	public Void visitVariantValue(VariantValueExpression expression) {
2336
-		final String internalName = expression.option.getTag(JavaClass.class).internalName;
2384
+		JavaVariantOption tag = expression.option.getTag(JavaVariantOption.class);
2385
+		final String internalName = tag.variantOptionClass.internalName;
2337 2386
 		javaWriter.newObject(internalName);
2338 2387
 		javaWriter.dup();
2339 2388
 
@@ -2355,12 +2404,8 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
2355 2404
 	@Override
2356 2405
 	public Void visitWrapOptional(WrapOptionalExpression expression) {
2357 2406
 		//Does nothing if not required to be wrapped
2358
-		final JavaMethodInfo info = expression.value.type.accept(new JavaBoxingTypeVisitor(javaWriter));
2359 2407
 		expression.value.accept(this);
2360
-
2361
-		//i.e. if it was a primitive
2362
-		if (info != null)
2363
-			javaWriter.invokeSpecial(info);
2408
+		expression.value.type.accept(new JavaBoxingTypeVisitor(javaWriter));
2364 2409
 		return null;
2365 2410
 	}
2366 2411
 
@@ -2368,28 +2413,20 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
2368 2413
         return javaWriter;
2369 2414
     }
2370 2415
 
2371
-
2372
-    //Will return true if a JavaBytecodeImplementation.class tag exists, and will compile that tag
2373
-    private boolean checkAndExecuteByteCodeImplementation(DefinitionMemberRef member) {
2374
-        JavaBytecodeImplementation implementation = member.getTag(JavaBytecodeImplementation.class);
2375
-        if (implementation != null) {
2376
-            implementation.compile(getJavaWriter());
2377
-            return true;
2378
-        }
2379
-        return false;
2380
-    }
2381
-
2382 2416
     //Will return true if a JavaMethodInfo.class tag exists, and will compile that tag
2383
-    private boolean checkAndExecuteMethodInfo(DefinitionMemberRef member) {
2384
-        JavaMethodInfo methodInfo = member.getTag(JavaMethodInfo.class);
2417
+    private boolean checkAndExecuteMethodInfo(DefinitionMemberRef member, ITypeID resultType) {
2418
+        JavaMethod methodInfo = member.getTag(JavaMethod.class);
2385 2419
         if (methodInfo == null)
2386 2420
             return false;
2387 2421
 
2388
-        if (methodInfo.isStatic()) {
2422
+        if (methodInfo.kind == JavaMethod.Kind.STATIC) {
2389 2423
             getJavaWriter().invokeStatic(methodInfo);
2390 2424
         } else {
2391 2425
             getJavaWriter().invokeVirtual(methodInfo);
2392 2426
         }
2427
+		if (methodInfo.genericResult)
2428
+			getJavaWriter().checkCast(context.getInternalName(resultType));
2429
+
2393 2430
         return true;
2394 2431
     }
2395 2432
 

JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaForeachVisitor.java → JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaForeachWriter.java Vedi File

@@ -1,12 +1,11 @@
1 1
 package org.openzen.zenscript.javabytecode.compiler;
2 2
 
3 3
 import org.objectweb.asm.Label;
4
-import org.openzen.zenscript.codemodel.iterator.ForeachIteratorVisitor;
5 4
 import org.openzen.zenscript.codemodel.statement.Statement;
6 5
 import org.openzen.zenscript.codemodel.statement.VarStatement;
7 6
 import org.openzen.zenscript.javabytecode.JavaLocalVariableInfo;
8 7
 
9
-public class JavaForeachVisitor implements ForeachIteratorVisitor<Void> {
8
+public class JavaForeachWriter {
10 9
 
11 10
 	private final JavaWriter javaWriter;
12 11
 	private final VarStatement[] variables;
@@ -15,7 +14,7 @@ public class JavaForeachVisitor implements ForeachIteratorVisitor<Void> {
15 14
 	private final Label endLabel;
16 15
 	private final JavaStatementVisitor statementVisitor;
17 16
 
18
-	public JavaForeachVisitor(JavaStatementVisitor statementVisitor, VarStatement[] variables, Statement content, Label start, Label end) {
17
+	public JavaForeachWriter(JavaStatementVisitor statementVisitor, VarStatement[] variables, Statement content, Label start, Label end) {
19 18
 		this.statementVisitor = statementVisitor;
20 19
 		this.javaWriter = statementVisitor.getJavaWriter();
21 20
 		this.variables = variables;
@@ -24,12 +23,11 @@ public class JavaForeachVisitor implements ForeachIteratorVisitor<Void> {
24 23
 		this.endLabel = end;
25 24
 	}
26 25
 
27
-	@Override
28
-	public Void visitIntRange() {
26
+	public void visitIntRange() {
29 27
 		javaWriter.dup();
30
-		javaWriter.getField("org/openzen/zenscript/implementations/IntRange", "to", "I");
28
+		javaWriter.getField("zsynthetic/IntRange", "to", "I");
31 29
 		javaWriter.swap();
32
-		javaWriter.getField("org/openzen/zenscript/implementations/IntRange", "from", "I");
30
+		javaWriter.getField("zsynthetic/IntRange", "from", "I");
33 31
 
34 32
 		final int z = variables[0].getTag(JavaLocalVariableInfo.class).local;
35 33
 		javaWriter.storeInt(z);
@@ -40,29 +38,20 @@ public class JavaForeachVisitor implements ForeachIteratorVisitor<Void> {
40 38
 
41 39
 		content.accept(statementVisitor);
42 40
 		javaWriter.iinc(z);
43
-
44
-
45
-		return null;
46 41
 	}
47 42
 
48
-	@Override
49
-	public Void visitArrayValueIterator() {
43
+	public void visitArrayValueIterator() {
50 44
 		handleArray(javaWriter.local(int.class), variables[0].getTag(JavaLocalVariableInfo.class));
51
-		return null;
52 45
 	}
53 46
 
54
-	@Override
55
-	public Void visitArrayKeyValueIterator() {
47
+	public void visitArrayKeyValueIterator() {
56 48
 		handleArray(variables[0].getTag(JavaLocalVariableInfo.class).local, variables[1].getTag(JavaLocalVariableInfo.class));
57
-		return null;
58 49
 	}
59 50
 
60
-	@Override
61
-	public Void visitStringCharacterIterator() {
51
+	public void visitStringCharacterIterator() {
62 52
 		//TODO UNTESTED!
63 53
 		javaWriter.invokeSpecial("java/lang/String", "toCharArray()", "()[C");
64 54
 		handleArray(javaWriter.local(int.class), variables[0].getTag(JavaLocalVariableInfo.class));
65
-		return null;
66 55
 	}
67 56
 
68 57
 	private void handleArray(final int z, final JavaLocalVariableInfo arrayTypeInfo) {
@@ -85,18 +74,15 @@ public class JavaForeachVisitor implements ForeachIteratorVisitor<Void> {
85 74
 		javaWriter.iinc(z);
86 75
 	}
87 76
 
88
-	@Override
89
-	public Void visitCustomIterator() {
90
-		return null;
77
+	public void visitCustomIterator() {
78
+		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
91 79
 	}
92 80
 
93
-	@Override
94
-	public Void visitAssocKeyIterator() {
81
+	public void visitAssocKeyIterator() {
95 82
 		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
96 83
 	}
97 84
 
98
-	@Override
99
-	public Void visitAssocKeyValueIterator() {
85
+	public void visitAssocKeyValueIterator() {
100 86
 		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
101 87
 	}
102 88
 }

+ 7
- 69
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaPreDecrementVisitor.java Vedi File

@@ -6,77 +6,10 @@
6 6
 package org.openzen.zenscript.javabytecode.compiler;
7 7
 
8 8
 import org.objectweb.asm.Type;
9
-import org.openzen.zenscript.codemodel.expression.AndAndExpression;
10
-import org.openzen.zenscript.codemodel.expression.ArrayExpression;
11
-import org.openzen.zenscript.codemodel.expression.CompareExpression;
12
-import org.openzen.zenscript.codemodel.expression.CallExpression;
13
-import org.openzen.zenscript.codemodel.expression.CallStaticExpression;
14
-import org.openzen.zenscript.codemodel.expression.CapturedClosureExpression;
15
-import org.openzen.zenscript.codemodel.expression.CapturedDirectExpression;
16
-import org.openzen.zenscript.codemodel.expression.CapturedLocalVariableExpression;
17
-import org.openzen.zenscript.codemodel.expression.CapturedParameterExpression;
18
-import org.openzen.zenscript.codemodel.expression.CapturedThisExpression;
19
-import org.openzen.zenscript.codemodel.expression.CastExpression;
20
-import org.openzen.zenscript.codemodel.expression.CheckNullExpression;
21
-import org.openzen.zenscript.codemodel.expression.CoalesceExpression;
22
-import org.openzen.zenscript.codemodel.expression.ConditionalExpression;
23
-import org.openzen.zenscript.codemodel.expression.ConstExpression;
24
-import org.openzen.zenscript.codemodel.expression.ConstantBoolExpression;
25
-import org.openzen.zenscript.codemodel.expression.ConstantByteExpression;
26
-import org.openzen.zenscript.codemodel.expression.ConstantCharExpression;
27
-import org.openzen.zenscript.codemodel.expression.ConstantDoubleExpression;
28
-import org.openzen.zenscript.codemodel.expression.ConstantFloatExpression;
29
-import org.openzen.zenscript.codemodel.expression.ConstantIntExpression;
30
-import org.openzen.zenscript.codemodel.expression.ConstantLongExpression;
31
-import org.openzen.zenscript.codemodel.expression.ConstantSByteExpression;
32
-import org.openzen.zenscript.codemodel.expression.ConstantShortExpression;
33
-import org.openzen.zenscript.codemodel.expression.ConstantStringExpression;
34
-import org.openzen.zenscript.codemodel.expression.ConstantUIntExpression;
35
-import org.openzen.zenscript.codemodel.expression.ConstantULongExpression;
36
-import org.openzen.zenscript.codemodel.expression.ConstantUShortExpression;
37
-import org.openzen.zenscript.codemodel.expression.ConstructorSuperCallExpression;
38
-import org.openzen.zenscript.codemodel.expression.ConstructorThisCallExpression;
39
-import org.openzen.zenscript.codemodel.expression.EnumConstantExpression;
40
-import org.openzen.zenscript.codemodel.expression.ExpressionVisitor;
41
-import org.openzen.zenscript.codemodel.expression.FunctionExpression;
42
-import org.openzen.zenscript.codemodel.expression.GetFieldExpression;
43
-import org.openzen.zenscript.codemodel.expression.GetFunctionParameterExpression;
44
-import org.openzen.zenscript.codemodel.expression.GetLocalVariableExpression;
45
-import org.openzen.zenscript.codemodel.expression.GetMatchingVariantField;
46
-import org.openzen.zenscript.codemodel.expression.GetStaticFieldExpression;
47
-import org.openzen.zenscript.codemodel.expression.GetterExpression;
48
-import org.openzen.zenscript.codemodel.expression.GlobalCallExpression;
49
-import org.openzen.zenscript.codemodel.expression.GlobalExpression;
50
-import org.openzen.zenscript.codemodel.expression.InterfaceCastExpression;
51
-import org.openzen.zenscript.codemodel.expression.IsExpression;
52
-import org.openzen.zenscript.codemodel.expression.MakeConstExpression;
53
-import org.openzen.zenscript.codemodel.expression.MapExpression;
54
-import org.openzen.zenscript.codemodel.expression.MatchExpression;
55
-import org.openzen.zenscript.codemodel.expression.NewExpression;
56
-import org.openzen.zenscript.codemodel.expression.NullExpression;
57
-import org.openzen.zenscript.codemodel.expression.OrOrExpression;
58
-import org.openzen.zenscript.codemodel.expression.PanicExpression;
59
-import org.openzen.zenscript.codemodel.expression.PostCallExpression;
60
-import org.openzen.zenscript.codemodel.expression.RangeExpression;
61
-import org.openzen.zenscript.codemodel.expression.SameObjectExpression;
62
-import org.openzen.zenscript.codemodel.expression.SetFieldExpression;
63
-import org.openzen.zenscript.codemodel.expression.SetFunctionParameterExpression;
64
-import org.openzen.zenscript.codemodel.expression.SetLocalVariableExpression;
65
-import org.openzen.zenscript.codemodel.expression.SetStaticFieldExpression;
66
-import org.openzen.zenscript.codemodel.expression.SetterExpression;
67
-import org.openzen.zenscript.codemodel.expression.StaticGetterExpression;
68
-import org.openzen.zenscript.codemodel.expression.StaticSetterExpression;
69
-import org.openzen.zenscript.codemodel.expression.SupertypeCastExpression;
70
-import org.openzen.zenscript.codemodel.expression.ThisExpression;
71
-import org.openzen.zenscript.codemodel.expression.ThrowExpression;
72
-import org.openzen.zenscript.codemodel.expression.TryConvertExpression;
73
-import org.openzen.zenscript.codemodel.expression.TryRethrowAsExceptionExpression;
74
-import org.openzen.zenscript.codemodel.expression.TryRethrowAsResultExpression;
75
-import org.openzen.zenscript.codemodel.expression.VariantValueExpression;
76
-import org.openzen.zenscript.codemodel.expression.WrapOptionalExpression;
9
+import org.openzen.zenscript.codemodel.expression.*;
77 10
 import org.openzen.zenscript.javabytecode.JavaBytecodeContext;
78 11
 import org.openzen.zenscript.javabytecode.JavaLocalVariableInfo;
79
-import org.openzen.zenscript.javabytecode.JavaParameterInfo;
12
+import org.openzen.zenscript.javashared.JavaParameterInfo;
80 13
 
81 14
 /**
82 15
  *
@@ -233,6 +166,11 @@ public class JavaPreDecrementVisitor implements ExpressionVisitor<Void> {
233 166
 		throw new UnsupportedOperationException("Invalid increment target");
234 167
 	}
235 168
 
169
+	@Override
170
+	public Void visitConstantUSize(ConstantUSizeExpression expression) {
171
+		throw new UnsupportedOperationException("Invalid increment target");
172
+	}
173
+
236 174
 	@Override
237 175
 	public Void visitConstructorThisCall(ConstructorThisCallExpression expression) {
238 176
 		throw new UnsupportedOperationException("Invalid increment target");

+ 7
- 69
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaPreIncrementVisitor.java Vedi File

@@ -6,77 +6,10 @@
6 6
 package org.openzen.zenscript.javabytecode.compiler;
7 7
 
8 8
 import org.objectweb.asm.Type;
9
-import org.openzen.zenscript.codemodel.expression.AndAndExpression;
10
-import org.openzen.zenscript.codemodel.expression.ArrayExpression;
11
-import org.openzen.zenscript.codemodel.expression.CompareExpression;
12
-import org.openzen.zenscript.codemodel.expression.CallExpression;
13
-import org.openzen.zenscript.codemodel.expression.CallStaticExpression;
14
-import org.openzen.zenscript.codemodel.expression.CapturedClosureExpression;
15
-import org.openzen.zenscript.codemodel.expression.CapturedDirectExpression;
16
-import org.openzen.zenscript.codemodel.expression.CapturedLocalVariableExpression;
17
-import org.openzen.zenscript.codemodel.expression.CapturedParameterExpression;
18
-import org.openzen.zenscript.codemodel.expression.CapturedThisExpression;
19
-import org.openzen.zenscript.codemodel.expression.CastExpression;
20
-import org.openzen.zenscript.codemodel.expression.CheckNullExpression;
21
-import org.openzen.zenscript.codemodel.expression.CoalesceExpression;
22
-import org.openzen.zenscript.codemodel.expression.ConditionalExpression;
23
-import org.openzen.zenscript.codemodel.expression.ConstExpression;
24
-import org.openzen.zenscript.codemodel.expression.ConstantBoolExpression;
25
-import org.openzen.zenscript.codemodel.expression.ConstantByteExpression;
26
-import org.openzen.zenscript.codemodel.expression.ConstantCharExpression;
27
-import org.openzen.zenscript.codemodel.expression.ConstantDoubleExpression;
28
-import org.openzen.zenscript.codemodel.expression.ConstantFloatExpression;
29
-import org.openzen.zenscript.codemodel.expression.ConstantIntExpression;
30
-import org.openzen.zenscript.codemodel.expression.ConstantLongExpression;
31
-import org.openzen.zenscript.codemodel.expression.ConstantSByteExpression;
32
-import org.openzen.zenscript.codemodel.expression.ConstantShortExpression;
33
-import org.openzen.zenscript.codemodel.expression.ConstantStringExpression;
34
-import org.openzen.zenscript.codemodel.expression.ConstantUIntExpression;
35
-import org.openzen.zenscript.codemodel.expression.ConstantULongExpression;
36
-import org.openzen.zenscript.codemodel.expression.ConstantUShortExpression;
37
-import org.openzen.zenscript.codemodel.expression.ConstructorSuperCallExpression;
38
-import org.openzen.zenscript.codemodel.expression.ConstructorThisCallExpression;
39
-import org.openzen.zenscript.codemodel.expression.EnumConstantExpression;
40
-import org.openzen.zenscript.codemodel.expression.ExpressionVisitor;
41
-import org.openzen.zenscript.codemodel.expression.FunctionExpression;
42
-import org.openzen.zenscript.codemodel.expression.GetFieldExpression;
43
-import org.openzen.zenscript.codemodel.expression.GetFunctionParameterExpression;
44
-import org.openzen.zenscript.codemodel.expression.GetLocalVariableExpression;
45
-import org.openzen.zenscript.codemodel.expression.GetMatchingVariantField;
46
-import org.openzen.zenscript.codemodel.expression.GetStaticFieldExpression;
47
-import org.openzen.zenscript.codemodel.expression.GetterExpression;
48
-import org.openzen.zenscript.codemodel.expression.GlobalCallExpression;
49
-import org.openzen.zenscript.codemodel.expression.GlobalExpression;
50
-import org.openzen.zenscript.codemodel.expression.InterfaceCastExpression;
51
-import org.openzen.zenscript.codemodel.expression.IsExpression;
52
-import org.openzen.zenscript.codemodel.expression.MakeConstExpression;
53
-import org.openzen.zenscript.codemodel.expression.MapExpression;
54
-import org.openzen.zenscript.codemodel.expression.MatchExpression;
55
-import org.openzen.zenscript.codemodel.expression.NewExpression;
56
-import org.openzen.zenscript.codemodel.expression.NullExpression;
57
-import org.openzen.zenscript.codemodel.expression.OrOrExpression;
58
-import org.openzen.zenscript.codemodel.expression.PanicExpression;
59
-import org.openzen.zenscript.codemodel.expression.PostCallExpression;
60
-import org.openzen.zenscript.codemodel.expression.RangeExpression;
61
-import org.openzen.zenscript.codemodel.expression.SameObjectExpression;
62
-import org.openzen.zenscript.codemodel.expression.SetFieldExpression;
63
-import org.openzen.zenscript.codemodel.expression.SetFunctionParameterExpression;
64
-import org.openzen.zenscript.codemodel.expression.SetLocalVariableExpression;
65
-import org.openzen.zenscript.codemodel.expression.SetStaticFieldExpression;
66
-import org.openzen.zenscript.codemodel.expression.SetterExpression;
67
-import org.openzen.zenscript.codemodel.expression.StaticGetterExpression;
68
-import org.openzen.zenscript.codemodel.expression.StaticSetterExpression;
69
-import org.openzen.zenscript.codemodel.expression.SupertypeCastExpression;
70
-import org.openzen.zenscript.codemodel.expression.ThisExpression;
71
-import org.openzen.zenscript.codemodel.expression.ThrowExpression;
72
-import org.openzen.zenscript.codemodel.expression.TryConvertExpression;
73
-import org.openzen.zenscript.codemodel.expression.TryRethrowAsExceptionExpression;
74
-import org.openzen.zenscript.codemodel.expression.TryRethrowAsResultExpression;
75
-import org.openzen.zenscript.codemodel.expression.VariantValueExpression;
76
-import org.openzen.zenscript.codemodel.expression.WrapOptionalExpression;
9
+import org.openzen.zenscript.codemodel.expression.*;
77 10
 import org.openzen.zenscript.javabytecode.JavaBytecodeContext;
78 11
 import org.openzen.zenscript.javabytecode.JavaLocalVariableInfo;
79
-import org.openzen.zenscript.javabytecode.JavaParameterInfo;
12
+import org.openzen.zenscript.javashared.JavaParameterInfo;
80 13
 
81 14
 /**
82 15
  *
@@ -233,6 +166,11 @@ public class JavaPreIncrementVisitor implements ExpressionVisitor<Void> {
233 166
 		throw new UnsupportedOperationException("Invalid increment target");
234 167
 	}
235 168
 
169
+	@Override
170
+	public Void visitConstantUSize(ConstantUSizeExpression expression) {
171
+		throw new UnsupportedOperationException("Invalid increment target");
172
+	}
173
+
236 174
 	@Override
237 175
 	public Void visitConstructorThisCall(ConstructorThisCallExpression expression) {
238 176
 		throw new UnsupportedOperationException("Invalid increment target");

+ 2
- 3
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaScriptFile.java Vedi File

@@ -5,17 +5,16 @@
5 5
  */
6 6
 package org.openzen.zenscript.javabytecode.compiler;
7 7
 
8
-import org.openzen.zenscript.javabytecode.JavaMethodInfo;
9
-
10 8
 import java.util.ArrayList;
11 9
 import java.util.List;
10
+import org.openzen.zenscript.javashared.JavaMethod;
12 11
 
13 12
 /**
14 13
  * @author Hoofdgebruiker
15 14
  */
16 15
 public class JavaScriptFile {
17 16
 	public final JavaClassWriter classWriter;
18
-	public final List<JavaMethodInfo> scriptMethods;
17
+	public final List<JavaMethod> scriptMethods;
19 18
 
20 19
 	public JavaScriptFile(JavaClassWriter classWriter) {
21 20
 		this.classWriter = classWriter;

+ 29
- 4
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaStatementVisitor.java Vedi File

@@ -5,12 +5,10 @@ import org.objectweb.asm.Type;
5 5
 import org.openzen.zenscript.codemodel.statement.*;
6 6
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
7 7
 import org.openzen.zenscript.javabytecode.JavaLocalVariableInfo;
8
-import org.openzen.zenscript.javabytecode.JavaMethodInfo;
9 8
 
10 9
 import java.util.Arrays;
11 10
 import java.util.List;
12 11
 import org.openzen.zenscript.javabytecode.JavaBytecodeContext;
13
-import org.openzen.zenscript.javashared.JavaClass;
14 12
 
15 13
 public class JavaStatementVisitor implements StatementVisitor<Boolean> {
16 14
     private final JavaWriter javaWriter;
@@ -110,7 +108,34 @@ public class JavaStatementVisitor implements StatementVisitor<Boolean> {
110 108
         }
111 109
 
112 110
 		//javaWriter.label(min);
113
-		statement.iterator.target.acceptForIterator(new JavaForeachVisitor(this, statement.loopVariables, statement.content, start, end));
111
+		JavaForeachWriter iteratorWriter = new JavaForeachWriter(this, statement.loopVariables, statement.content, start, end);
112
+		if (statement.iterator.target.getBuiltin() == null) {
113
+			iteratorWriter.visitCustomIterator();
114
+		} else {
115
+			switch (statement.iterator.target.getBuiltin()) {
116
+				case ITERATOR_INT_RANGE:
117
+					iteratorWriter.visitIntRange();
118
+					break;
119
+				case ITERATOR_ARRAY_VALUES:
120
+					iteratorWriter.visitArrayValueIterator();
121
+					break;
122
+				case ITERATOR_ARRAY_KEY_VALUES:
123
+					iteratorWriter.visitArrayKeyValueIterator();
124
+					break;
125
+				case ITERATOR_ASSOC_KEYS:
126
+					iteratorWriter.visitAssocKeyIterator();
127
+					break;
128
+				case ITERATOR_ASSOC_KEY_VALUES:
129
+					iteratorWriter.visitAssocKeyValueIterator();
130
+					break;
131
+				case ITERATOR_STRING_CHARS:
132
+					iteratorWriter.visitStringCharacterIterator();
133
+					break;
134
+				default:
135
+					throw new IllegalArgumentException("Invalid iterator: " + statement.iterator.target.getBuiltin());
136
+			}
137
+		}
138
+		
114 139
 		javaWriter.goTo(start);
115 140
 		javaWriter.label(end);
116 141
 		return false;
@@ -166,7 +191,7 @@ public class JavaStatementVisitor implements StatementVisitor<Boolean> {
166 191
 		javaWriter.label(start);
167 192
 		statement.value.accept(expressionVisitor);
168 193
 		if (statement.value.type == BasicTypeID.STRING)
169
-			javaWriter.invokeVirtual(new JavaMethodInfo(JavaClass.OBJECT, "hashCode", "()I", 0));
194
+			javaWriter.invokeVirtual(JavaExpressionVisitor.OBJECT_HASHCODE);
170 195
 		boolean out = false;
171 196
 
172 197
 		final boolean hasNoDefault = hasNoDefault(statement);

+ 48
- 0
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaSwitchKeyVisitor.java Vedi File

@@ -0,0 +1,48 @@
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.javabytecode.compiler;
7
+
8
+import org.openzen.zenscript.codemodel.expression.switchvalue.CharSwitchValue;
9
+import org.openzen.zenscript.codemodel.expression.switchvalue.EnumConstantSwitchValue;
10
+import org.openzen.zenscript.codemodel.expression.switchvalue.IntSwitchValue;
11
+import org.openzen.zenscript.codemodel.expression.switchvalue.StringSwitchValue;
12
+import org.openzen.zenscript.codemodel.expression.switchvalue.SwitchValueVisitor;
13
+import org.openzen.zenscript.codemodel.expression.switchvalue.VariantOptionSwitchValue;
14
+
15
+/**
16
+ *
17
+ * @author Hoofdgebruiker
18
+ */
19
+public class JavaSwitchKeyVisitor implements SwitchValueVisitor<Integer> {
20
+	public static final JavaSwitchKeyVisitor INSTANCE = new JavaSwitchKeyVisitor();
21
+	
22
+	private JavaSwitchKeyVisitor() {}
23
+	
24
+	@Override
25
+	public Integer acceptInt(IntSwitchValue value) {
26
+		return value.value;
27
+	}
28
+
29
+	@Override
30
+	public Integer acceptChar(CharSwitchValue value) {
31
+		return (int) value.value;
32
+	}
33
+
34
+	@Override
35
+	public Integer acceptString(StringSwitchValue value) {
36
+		return value.value.hashCode();
37
+	}
38
+
39
+	@Override
40
+	public Integer acceptEnumConstant(EnumConstantSwitchValue value) {
41
+		return value.constant.ordinal;
42
+	}
43
+
44
+	@Override
45
+	public Integer acceptVariantOption(VariantOptionSwitchValue value) {
46
+		return value.option.getOrdinal();
47
+	}
48
+}

+ 30
- 109
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaWriter.java Vedi File

@@ -12,19 +12,18 @@ import org.objectweb.asm.commons.LocalVariablesSorter;
12 12
 import org.openzen.zencode.shared.CodePosition;
13 13
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
14 14
 import org.openzen.zenscript.javabytecode.JavaLocalVariableInfo;
15
-import org.openzen.zenscript.javabytecode.JavaMethodInfo;
16
-import org.openzen.zenscript.javabytecode.JavaParameterInfo;
15
+import org.openzen.zenscript.javashared.JavaParameterInfo;
17 16
 import org.openzen.zenscript.javashared.JavaClass;
18 17
 import org.openzen.zenscript.javashared.JavaField;
18
+import org.openzen.zenscript.javashared.JavaMethod;
19 19
 
20 20
 public class JavaWriter {
21
-    private static final JavaMethodInfo STRING_CONCAT = new JavaMethodInfo(
21
+    private static final JavaMethod STRING_CONCAT = JavaMethod.getNativeStatic(
22 22
             JavaClass.STRING,
23 23
             "concat",
24
-            "(Ljava/lang/String;)Ljava/lang/String;",
25
-            Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC);
24
+            "(Ljava/lang/String;)Ljava/lang/String;");
26 25
 
27
-    public final JavaMethodInfo method;
26
+    public final JavaMethod method;
28 27
     public final HighLevelDefinition forDefinition;
29 28
 
30 29
     private final LocalVariablesSorter visitor;
@@ -38,7 +37,7 @@ public class JavaWriter {
38 37
     public JavaWriter(
39 38
             ClassVisitor visitor,
40 39
             boolean nameVariables,
41
-            JavaMethodInfo method,
40
+            JavaMethod method,
42 41
             HighLevelDefinition forDefinition,
43 42
             String signature,
44 43
             String[] exceptions,
@@ -57,18 +56,10 @@ public class JavaWriter {
57 56
         this.nameVariables = nameVariables;
58 57
     }
59 58
 
60
-    public JavaWriter(ClassVisitor visitor, JavaMethodInfo method, HighLevelDefinition forDefinition, String signature, String[] exceptions, String... annotations) {
59
+    public JavaWriter(ClassVisitor visitor, JavaMethod method, HighLevelDefinition forDefinition, String signature, String[] exceptions, String... annotations) {
61 60
         this(visitor, true, method, forDefinition, signature, exceptions, annotations);
62 61
     }
63 62
 
64
-    private static String signature(Class aClass) {
65
-        return Type.getDescriptor(aClass);
66
-    }
67
-
68
-    private static String internal(Class aClass) {
69
-        return Type.getInternalName(aClass);
70
-    }
71
-
72 63
     public void enableDebug() {
73 64
         debug = true;
74 65
     }
@@ -245,7 +236,7 @@ public class JavaWriter {
245 236
         if (debug)
246 237
             System.out.println("load " + parameter.index);
247 238
 
248
-        visitor.visitVarInsn(parameter.type.getOpcode(ILOAD), parameter.index);
239
+        visitor.visitVarInsn(Type.getType(parameter.typeDescriptor).getOpcode(ILOAD), parameter.index);
249 240
     }
250 241
 
251 242
     public void load(JavaLocalVariableInfo localVariable) {
@@ -259,7 +250,7 @@ public class JavaWriter {
259 250
         if (debug)
260 251
             System.out.println("store " + parameter.index);
261 252
 
262
-        visitor.visitVarInsn(parameter.type.getOpcode(ISTORE), parameter.index);
253
+        visitor.visitVarInsn(Type.getType(parameter.typeDescriptor).getOpcode(ISTORE), parameter.index);
263 254
     }
264 255
 
265 256
     public void store(JavaLocalVariableInfo localVariable) {
@@ -358,25 +349,11 @@ public class JavaWriter {
358 349
         }
359 350
     }
360 351
 
361
-    public void newArray(Class componentType) {
362
-        if (debug)
363
-            System.out.println("newArray " + componentType.getName());
364
-
365
-        visitor.visitTypeInsn(NEWARRAY, internal(componentType));
366
-    }
367
-
368
-    public void checkCast(Class newClass) {
369
-        if (debug)
370
-            System.out.println("checkCast " + newClass.getName());
371
-
372
-        visitor.visitTypeInsn(CHECKCAST, signature(newClass));
373
-    }
374
-
375
-    public void checkCast(String descriptor) {
352
+    public void checkCast(String internalName) {
376 353
         if (debug)
377
-            System.out.println("checkCast " + descriptor);
354
+            System.out.println("checkCast " + internalName);
378 355
 
379
-        visitor.visitTypeInsn(CHECKCAST, descriptor);
356
+        visitor.visitTypeInsn(CHECKCAST, internalName);
380 357
     }
381 358
 
382 359
     public void checkCast(Type type) {
@@ -810,10 +787,10 @@ public class JavaWriter {
810 787
         visitor.visitTypeInsn(INSTANCEOF, type.getDescriptor());
811 788
     }
812 789
 	
813
-	public void invokeStatic(JavaMethodInfo method) {
790
+	public void invokeStatic(JavaMethod method) {
814 791
 		visitor.visitMethodInsn(
815 792
 				INVOKESTATIC,
816
-				method.javaClass.internalName,
793
+				method.cls.internalName,
817 794
 				method.name,
818 795
 				method.descriptor,
819 796
 				false);
@@ -830,29 +807,22 @@ public class JavaWriter {
830 807
         invokeSpecial(Type.getInternalName(owner), name, descriptor);
831 808
     }
832 809
 
833
-	public void invokeSpecial (JavaMethodInfo method) {
834
-		invokeSpecial(method.javaClass.internalName, method.name, method.descriptor);
810
+	public void invokeSpecial(JavaMethod method) {
811
+		invokeSpecial(method.cls.internalName, method.name, method.descriptor);
835 812
 	}
836 813
 
837
-    public void invokeVirtual(JavaMethodInfo method) {
838
-        if (debug)
839
-            System.out.println("invokeVirtual " + method.javaClass.internalName + '.' + method.name + method.descriptor);
840
-
841
-        visitor.visitMethodInsn(INVOKEVIRTUAL, method.javaClass.internalName, method.name, method.descriptor, false);
842
-    }
843
-
844
-    public void invokeInterface(JavaMethodInfo method) {
814
+    public void invokeVirtual(JavaMethod method) {
845 815
         if (debug)
846
-            System.out.println("invokeInterface " + method.javaClass.internalName + '.' + method.name + method.descriptor);
816
+            System.out.println("invokeVirtual " + method.cls.internalName + '.' + method.name + method.descriptor);
847 817
 
848
-        visitor.visitMethodInsn(INVOKEINTERFACE, method.javaClass.internalName, method.name, method.descriptor, true);
818
+        visitor.visitMethodInsn(INVOKEVIRTUAL, method.cls.internalName, method.name, method.descriptor, false);
849 819
     }
850 820
 
851
-    public void newObject(Class type) {
821
+    public void invokeInterface(JavaMethod method) {
852 822
         if (debug)
853
-            System.out.println("newObject " + type.getName());
823
+            System.out.println("invokeInterface " + method.cls.internalName + '.' + method.name + method.descriptor);
854 824
 
855
-        visitor.visitTypeInsn(NEW, internal(type));
825
+        visitor.visitMethodInsn(INVOKEINTERFACE, method.cls.internalName, method.name, method.descriptor, true);
856 826
     }
857 827
 
858 828
     public void newObject(String internalName) {
@@ -862,34 +832,6 @@ public class JavaWriter {
862 832
         visitor.visitTypeInsn(NEW, internalName);
863 833
     }
864 834
 
865
-    public void construct(Class type, Class... arguments) {
866
-        StringBuilder descriptor = new StringBuilder();
867
-        descriptor.append('(');
868
-        for (Class argument : arguments) {
869
-            descriptor.append(signature(argument));
870
-        }
871
-        descriptor.append(")V");
872
-
873
-        if (debug)
874
-            System.out.println("invokeSpecial " + internal(type) + ".<init>" + descriptor);
875
-
876
-        visitor.visitMethodInsn(INVOKESPECIAL, internal(type), "<init>", descriptor.toString(), false);
877
-    }
878
-
879
-    public void construct(String type, String... arguments) {
880
-        StringBuilder descriptor = new StringBuilder();
881
-        descriptor.append('(');
882
-        for (String argument : arguments) {
883
-            descriptor.append(argument);
884
-        }
885
-        descriptor.append(")V");
886
-
887
-        if (debug)
888
-            System.out.println("invokeSpecial " + type + ".<init>" + descriptor);
889
-
890
-        visitor.visitMethodInsn(INVOKESPECIAL, type, "<init>", descriptor.toString(), false);
891
-    }
892
-
893 835
     public void goTo(Label lbl) {
894 836
         if (debug)
895 837
             System.out.println("goTo " + getLabelName(lbl));
@@ -1048,19 +990,12 @@ public class JavaWriter {
1048 990
 
1049 991
         visitor.visitFieldInsn(GETFIELD, owner, name, descriptor);
1050 992
     }
1051
-
1052
-    public void getField(Class owner, String name, Class descriptor) {
1053
-        if (debug)
1054
-            System.out.println("getField " + owner.getName() + '.' + name + ":" + descriptor.getName());
1055
-
1056
-        visitor.visitFieldInsn(GETFIELD, internal(owner), name, signature(descriptor));
1057
-    }
1058 993
 	
1059 994
 	public void getField(JavaField field) {
1060 995
         if (debug)
1061
-            System.out.println("getField " + field.cls.internalName + '.' + field.name + ":" + field.signature);
996
+            System.out.println("getField " + field.cls.internalName + '.' + field.name + ":" + field.descriptor);
1062 997
 		
1063
-		visitor.visitFieldInsn(GETFIELD, field.cls.internalName, field.name, field.signature);
998
+		visitor.visitFieldInsn(GETFIELD, field.cls.internalName, field.name, field.descriptor);
1064 999
 	}
1065 1000
 
1066 1001
     public void putField(String owner, String name, String descriptor) {
@@ -1069,19 +1004,12 @@ public class JavaWriter {
1069 1004
 
1070 1005
         visitor.visitFieldInsn(PUTFIELD, owner, name, descriptor);
1071 1006
     }
1072
-
1073
-    public void putField(Class owner, String name, Class descriptor) {
1074
-        if (debug)
1075
-            System.out.println("putField " + owner.getName() + '.' + name + ":" + descriptor.getName());
1076
-
1077
-        visitor.visitFieldInsn(PUTFIELD, internal(owner), name, signature(descriptor));
1078
-    }
1079 1007
 	
1080 1008
 	public void putField(JavaField field) {
1081 1009
         if (debug)
1082
-            System.out.println("putField " + field.cls.internalName + '.' + field.name + ":" + field.signature);
1010
+            System.out.println("putField " + field.cls.internalName + '.' + field.name + ":" + field.descriptor);
1083 1011
 		
1084
-		visitor.visitFieldInsn(PUTFIELD, field.cls.internalName, field.name, field.signature);
1012
+		visitor.visitFieldInsn(PUTFIELD, field.cls.internalName, field.name, field.descriptor);
1085 1013
 	}
1086 1014
 
1087 1015
     public void getStaticField(String owner, String name, String descriptor) {
@@ -1093,9 +1021,9 @@ public class JavaWriter {
1093 1021
 	
1094 1022
 	public void getStaticField(JavaField field) {
1095 1023
         if (debug)
1096
-            System.out.println("getStaticField " + field.cls.internalName + '.' + field.name + ":" + field.signature);
1024
+            System.out.println("getStaticField " + field.cls.internalName + '.' + field.name + ":" + field.descriptor);
1097 1025
 		
1098
-		visitor.visitFieldInsn(GETSTATIC, field.cls.internalName, field.name, field.signature);
1026
+		visitor.visitFieldInsn(GETSTATIC, field.cls.internalName, field.name, field.descriptor);
1099 1027
 	}
1100 1028
 
1101 1029
     public void putStaticField(String owner, String name, String descriptor) {
@@ -1104,19 +1032,12 @@ public class JavaWriter {
1104 1032
 
1105 1033
         visitor.visitFieldInsn(PUTSTATIC, owner, name, descriptor);
1106 1034
     }
1107
-
1108
-    public void putStaticField(Class owner, Field field) {
1109
-        if (debug)
1110
-            System.out.println("putStatic " + owner.getName() + '.' + field.getName() + ":" + signature(field.getType()));
1111
-
1112
-        visitor.visitFieldInsn(PUTSTATIC, internal(owner), field.getName(), signature(field.getType()));
1113
-    }
1114 1035
 	
1115 1036
 	public void putStaticField(JavaField field) {
1116 1037
         if (debug)
1117
-            System.out.println("putStaticField " + field.cls.internalName + '.' + field.name + ":" + field.signature);
1038
+            System.out.println("putStaticField " + field.cls.internalName + '.' + field.name + ":" + field.descriptor);
1118 1039
 		
1119
-		visitor.visitFieldInsn(PUTSTATIC, field.cls.internalName, field.name, field.signature);
1040
+		visitor.visitFieldInsn(PUTSTATIC, field.cls.internalName, field.name, field.descriptor);
1120 1041
 	}
1121 1042
 
1122 1043
     public void aThrow() {

+ 56
- 82
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/definitions/JavaDefinitionVisitor.java Vedi File

@@ -2,8 +2,6 @@ package org.openzen.zenscript.javabytecode.compiler.definitions;
2 2
 
3 3
 import org.objectweb.asm.ClassWriter;
4 4
 import org.objectweb.asm.Opcodes;
5
-import org.objectweb.asm.Type;
6
-import org.openzen.zenscript.codemodel.Modifiers;
7 5
 import org.openzen.zenscript.codemodel.definition.*;
8 6
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
9 7
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
@@ -11,29 +9,26 @@ import org.openzen.zenscript.codemodel.type.BasicTypeID;
11 9
 import org.openzen.zenscript.codemodel.type.GenericTypeID;
12 10
 import org.openzen.zenscript.codemodel.type.ITypeID;
13 11
 import org.openzen.zenscript.javabytecode.JavaBytecodeContext;
14
-import org.openzen.zenscript.javabytecode.JavaMethodInfo;
15
-import org.openzen.zenscript.javabytecode.JavaModule;
16 12
 import org.openzen.zenscript.javabytecode.compiler.*;
17 13
 import org.openzen.zenscript.javashared.JavaClass;
18 14
 
19 15
 import java.io.FileOutputStream;
20 16
 import java.io.IOException;
17
+import java.util.ArrayList;
21 18
 import java.util.List;
19
+import org.openzen.zenscript.codemodel.member.ImplementationMember;
20
+import org.openzen.zenscript.javashared.JavaMethod;
21
+import org.openzen.zenscript.javashared.JavaModifiers;
22
+import org.openzen.zenscript.javashared.JavaVariantOption;
22 23
 
23 24
 
24 25
 public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
25
-	private static final JavaMethodInfo CLASS_FORNAME = new JavaMethodInfo(
26
-			JavaClass.CLASS,
27
-			"forName",
28
-			"(Ljava/lang/String;)Ljava/lang/Class;",
29
-			Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC);
30
-
31
-
32
-	private static final JavaMethodInfo ENUM_VALUEOF = new JavaMethodInfo(
33
-			JavaClass.ENUM,
34
-			"valueOf",
35
-			"(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;",
36
-			Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC);
26
+	private static final JavaMethod CLASS_FORNAME
27
+			= JavaMethod.getNativeStatic(JavaClass.CLASS, "forName", "(Ljava/lang/String;)Ljava/lang/Class;");
28
+	private static final JavaMethod ENUM_VALUEOF
29
+			= JavaMethod.getNativeStatic(JavaClass.CLASS, "valueOf", "(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;");
30
+	private static final JavaMethod ARRAY_CLONE
31
+			= JavaMethod.getNativeVirtual(JavaClass.ARRAYS, "clone", "()Ljava/lang/Object;");
37 32
 
38 33
 	private final JavaClassWriter outerWriter;
39 34
 	private final JavaBytecodeContext context;
@@ -47,22 +42,20 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
47 42
 
48 43
 	@Override
49 44
 	public byte[] visitClass(ClassDefinition definition) {
50
-		//Classes will always be created in a new File/Class
51
-
52
-        final Type superType;
53
-        if (definition.getSuperType() == null)
54
-            superType = Type.getType(Object.class);
55
-        else
56
-            superType = context.getType(definition.getSuperType());
45
+        final String superTypeInternalName = definition.getSuperType() == null ? "java/lang/Object" : context.getInternalName(definition.getSuperType());
57 46
 
58
-		JavaClass toClass = new JavaClass(definition.pkg.fullName, definition.name, JavaClass.Kind.CLASS);
47
+		JavaClass toClass = definition.getTag(JavaClass.class);
59 48
 		JavaClassWriter writer = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
60 49
 
61 50
         //TODO: Calculate signature from generic parameters
62
-        //TODO: Interfaces?
51
+		List<String> interfaces = new ArrayList<>();
52
+		for (IDefinitionMember member : definition.members) {
53
+			if (member instanceof ImplementationMember)
54
+				interfaces.add(context.getInternalName(((ImplementationMember) member).type));
55
+		}
63 56
         String signature = null;
64 57
 
65
-        writer.visit(Opcodes.V1_8, definition.modifiers, definition.name, signature, superType.getInternalName(), null);
58
+        writer.visit(Opcodes.V1_8, definition.modifiers, toClass.internalName, signature, superTypeInternalName, interfaces.toArray(new String[interfaces.size()]));
66 59
 		JavaMemberVisitor memberVisitor = new JavaMemberVisitor(context, writer, toClass, definition);
67 60
         for (IDefinitionMember member : definition.members) {
68 61
             member.accept(memberVisitor);
@@ -74,13 +67,16 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
74 67
 
75 68
 	@Override
76 69
 	public byte[] visitInterface(InterfaceDefinition definition) {
77
-		JavaClass toClass = new JavaClass(definition.pkg.fullName, definition.name, JavaClass.Kind.INTERFACE);
70
+		JavaClass toClass = definition.getTag(JavaClass.class);
78 71
 		ClassWriter writer = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
79 72
 
80 73
 		//TODO: Calculate signature from generic parameters
81
-		//TODO: Extending Interfaces?
82 74
 		String signature = null;
83
-		writer.visit(Opcodes.V1_8, definition.modifiers | Opcodes.ACC_INTERFACE | Opcodes.ACC_ABSTRACT, definition.name, signature, Type.getInternalName(Object.class), null);
75
+		String[] baseInterfaces = new String[definition.baseInterfaces.size()];
76
+		for (int i = 0; i < baseInterfaces.length; i++)
77
+			baseInterfaces[i] = context.getInternalName(definition.baseInterfaces.get(i));
78
+
79
+		writer.visit(Opcodes.V1_8, definition.modifiers | Opcodes.ACC_INTERFACE | Opcodes.ACC_ABSTRACT, toClass.internalName, signature, "java/lang/Object", baseInterfaces);
84 80
 		JavaMemberVisitor memberVisitor = new JavaMemberVisitor(context, writer, toClass, definition);
85 81
 		for (IDefinitionMember member : definition.members) {
86 82
 			member.accept(memberVisitor);
@@ -94,49 +90,40 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
94 90
 	public byte[] visitEnum(EnumDefinition definition) {
95 91
 		System.out.println("Compiling enum " + definition.name + " in " + definition.position.getFilename());
96 92
 
97
-        final Type superType;
98
-        if (definition.getSuperType() == null)
99
-            superType = Type.getType(Object.class);
100
-        else
101
-            superType = context.getType(definition.getSuperType());
93
+		String superTypeInternalName = definition.getSuperType() == null ? "java/lang/Object" : context.getInternalName(definition.getSuperType());
102 94
 
103 95
 		ClassWriter writer = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
104 96
 
105
-		writer.visit(Opcodes.V1_8, Opcodes.ACC_ENUM | Opcodes.ACC_PUBLIC | Opcodes.ACC_SUPER | Opcodes.ACC_FINAL, definition.name, "Ljava/lang/Enum<L" + definition.name + ";>;", superType.getInternalName(), null);
106
-
107
-		JavaClass toClass = new JavaClass(definition.pkg.fullName, definition.name, JavaClass.Kind.ENUM);
97
+		JavaClass toClass = definition.getTag(JavaClass.class);
98
+		writer.visit(Opcodes.V1_8, Opcodes.ACC_ENUM | Opcodes.ACC_PUBLIC | Opcodes.ACC_SUPER | Opcodes.ACC_FINAL, toClass.internalName, "Ljava/lang/Enum<L" + toClass.internalName + ";>;", superTypeInternalName, null);
108 99
 
109 100
 		//Enum Stuff(required!)
110
-		writer.visitField(Opcodes.ACC_STATIC | Opcodes.ACC_PRIVATE | Opcodes.ACC_FINAL | Opcodes.ACC_SYNTHETIC, "$VALUES", "[L" + definition.name + ";", null, null).visitEnd();
101
+		writer.visitField(Opcodes.ACC_STATIC | Opcodes.ACC_PRIVATE | Opcodes.ACC_FINAL | Opcodes.ACC_SYNTHETIC, "$VALUES", "[L" + toClass.internalName + ";", null, null).visitEnd();
111 102
 
112 103
         final JavaMemberVisitor visitor = new JavaMemberVisitor(context, writer, toClass, definition);
113 104
         for (IDefinitionMember member : definition.members) {
114 105
             member.accept(visitor);
115 106
         }
116 107
 
117
-		JavaClass arrayClass = JavaClass.fromInternalName("[L" + definition.name + ";", JavaClass.Kind.ARRAY);
118
-		JavaMethodInfo arrayClone = new JavaMethodInfo(arrayClass, "clone", "()Ljava/lang/Object;", Opcodes.ACC_PUBLIC);
119
-
120
-		JavaMethodInfo valuesMethodInfo = new JavaMethodInfo(toClass, "values", "()[L" + definition.name + ";", Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC);
121
-		JavaWriter valuesWriter = new JavaWriter(writer, true, valuesMethodInfo, definition, null, null);
108
+		JavaMethod valuesMethod = JavaMethod.getStatic(toClass, "values", "()[L" + toClass.internalName + ";", Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC);
109
+		JavaWriter valuesWriter = new JavaWriter(writer, true, valuesMethod, definition, null, null);
122 110
 		valuesWriter.start();
123
-		valuesWriter.getStaticField(definition.name, "$VALUES", "[L" + definition.name + ";");
124
-		valuesWriter.invokeVirtual(arrayClone);
125
-		valuesWriter.checkCast("[L" + definition.name + ";");
111
+		valuesWriter.getStaticField(toClass.internalName, "$VALUES", "[L" + toClass.internalName + ";");
112
+		valuesWriter.invokeVirtual(ARRAY_CLONE);
113
+		valuesWriter.checkCast("[L" + toClass.internalName + ";");
126 114
 		valuesWriter.returnObject();
127 115
 		valuesWriter.end();
128 116
 
129
-		JavaMethodInfo valueOfMethodInfo = new JavaMethodInfo(toClass, "valueOf", "(Ljava/lang/String;)L" + definition.name + ";", Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC);
130
-		JavaWriter valueOfWriter = new JavaWriter(writer, true, valueOfMethodInfo, definition, null, null);
117
+		JavaMethod valueOfMethod = JavaMethod.getStatic(toClass, "valueOf", "(Ljava/lang/String;)L" + toClass.internalName + ";", Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC);
118
+		JavaWriter valueOfWriter = new JavaWriter(writer, true, valueOfMethod, definition, null, null);
131 119
 		valueOfWriter.start();
132 120
 		valueOfWriter.invokeStatic(CLASS_FORNAME);
133 121
 		valueOfWriter.loadObject(0);
134 122
 		valueOfWriter.invokeStatic(ENUM_VALUEOF);
135
-		valueOfWriter.checkCast("L" + definition.name + ";");
123
+		valueOfWriter.checkCast(toClass.internalName);
136 124
 		valueOfWriter.returnObject();
137 125
 		valueOfWriter.end();
138 126
 
139
-
140 127
 		writer.visitEnd();
141 128
 		return writer.toByteArray();
142 129
 	}
@@ -152,15 +139,14 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
152 139
 
153 140
         final String signature = context.getMethodSignature(definition.header);
154 141
 
155
-		final JavaClass toClass = new JavaClass(definition.pkg.fullName, CompilerUtils.calcClasName(definition.position), JavaClass.Kind.CLASS);
156
-		final JavaMethodInfo methodInfo = new JavaMethodInfo(toClass, definition.name, context.getMethodDescriptor(definition.header), CompilerUtils.calcAccess(definition.modifiers) | Opcodes.ACC_STATIC);
142
+		final JavaMethod method = definition.caller.getTag(JavaMethod.class);
157 143
 
158
-		final JavaWriter writer = new JavaWriter(outerWriter, true, methodInfo, definition, signature, null);
144
+		final JavaWriter writer = new JavaWriter(outerWriter, true, method, definition, signature, null);
159 145
         final JavaStatementVisitor statementVisitor = new JavaStatementVisitor(context, writer);
160 146
         statementVisitor.start();
161 147
 		boolean returns = definition.statement.accept(statementVisitor);
162 148
 		if (!returns) {
163
-			ITypeID type = definition.header.returnType;
149
+			ITypeID type = definition.header.getReturnType();
164 150
 			if (CompilerUtils.isPrimitive(type))
165 151
 				writer.iConst0();
166 152
 			else if (type != BasicTypeID.VOID)
@@ -169,9 +155,6 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
169 155
 		}
170 156
 
171 157
 		statementVisitor.end();
172
-
173
-		definition.setTag(JavaMethodInfo.class, methodInfo);
174
-		definition.caller.setTag(JavaMethodInfo.class, methodInfo);
175 158
 		return null;
176 159
 	}
177 160
 
@@ -187,34 +170,26 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
187 170
 
188 171
 	@Override
189 172
 	public byte[] visitVariant(VariantDefinition variant) {
190
-
191
-		final String variantName = variant.name;
192
-		final JavaClass toClass = new JavaClass("", variantName, JavaClass.Kind.CLASS);
173
+		final JavaClass toClass = variant.getTag(JavaClass.class);
193 174
 		final JavaClassWriter writer = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
194 175
 
195 176
 
196 177
 		final String ss = "<" + javaTypeGenericVisitor.getGenericSignature(variant.genericParameters) + ">Ljava/lang/Object;";
197 178
 		JavaClassWriter.registerSuperClass(variantName, "java/lang/Object");
198 179
 
199
-		writer.visit(Opcodes.V1_8, Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC, variantName, ss, "java/lang/Object", null);
180
+		writer.visit(Opcodes.V1_8, Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC, toClass.internalName, ss, "java/lang/Object", null);
200 181
 		writer.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_ABSTRACT, "getDenominator", "()I", null, null).visitEnd();
201 182
 
202
-
203 183
 		final JavaMemberVisitor visitor = new JavaMemberVisitor(context, writer, toClass, variant);
204 184
 
205 185
 		final List<VariantDefinition.Option> options = variant.options;
206 186
 		//Each option is one of the possible child classes
207 187
 		for (final VariantDefinition.Option option : options) {
208
-			final String optionClassName = variantName + "$" + option.name;
209
-			final JavaClass optionClass = new JavaClass("", optionClassName, JavaClass.Kind.CLASS);
188
+			JavaVariantOption optionTag = option.getTag(JavaVariantOption.class);
210 189
 			final JavaClassWriter optionWriter = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
211 190
 			JavaClassWriter.registerSuperClass(optionClassName, variantName);
212 191
 
213
-			writer.visitInnerClass(optionClassName, variantName, option.name, Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL);
214
-
215
-
216
-			option.setTag(JavaClass.class, optionClass);
217
-
192
+			writer.visitInnerClass(optionTag.variantOptionClass.internalName, optionTag.variantClass.internalName, option.name, Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL);
218 193
 
219 194
 			//Generic option signature
220 195
 			final String signature;
@@ -226,7 +201,7 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
226 201
 					builder.append(javaTypeGenericVisitor.getSignatureWithBound(type));
227 202
 				}
228 203
 				builder.append(">");
229
-				builder.append("L").append(variantName).append("<");
204
+				builder.append("L").append(toClass.internalName).append("<");
230 205
 
231 206
 				for (final TypeParameter genericParameter : variant.genericParameters) {
232 207
 					boolean t = true;
@@ -247,8 +222,8 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
247 222
 				signature = builder.append(">;").toString();
248 223
 			}
249 224
 
250
-			optionWriter.visit(Opcodes.V1_8, Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC, optionClassName, signature, variantName, null);
251
-			final JavaMemberVisitor optionVisitor = new JavaMemberVisitor(context, optionWriter, optionClass, variant);
225
+			optionWriter.visit(Opcodes.V1_8, Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC, optionTag.variantOptionClass.internalName, signature, optionTag.variantClass.internalName, null);
226
+			final JavaMemberVisitor optionVisitor = new JavaMemberVisitor(context, optionWriter, optionTag.variantOptionClass, variant);
252 227
 			final StringBuilder optionInitDescBuilder = new StringBuilder("(");
253 228
 			final StringBuilder optionInitSignatureBuilder = new StringBuilder("(");
254 229
 
@@ -262,39 +237,38 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
262 237
 			optionInitDescBuilder.append(")V");
263 238
 			optionInitSignatureBuilder.append(")V");
264 239
 
265
-
266
-			final JavaWriter initWriter = new JavaWriter(optionWriter, new JavaMethodInfo(optionClass, "<init>", optionInitDescBuilder.toString(), Opcodes.ACC_PUBLIC), variant, optionInitSignatureBuilder.toString(), null);
240
+JavaMethod constructorMethod = JavaMethod.getConstructor(optionTag.variantOptionClass, optionInitDescBuilder.toString(), JavaModifiers.PUBLIC);
241
+			final JavaWriter initWriter = new JavaWriter(optionWriter, constructorMethod, variant, optionInitSignatureBuilder.toString(), null);
267 242
 			initWriter.start();
268 243
 			initWriter.loadObject(0);
269 244
 			initWriter.dup();
270
-			initWriter.invokeSpecial(variantName, "<init>", "()V");
245
+			initWriter.invokeSpecial(toClass.internalName, "<init>", "()V");
271 246
 			for (int i = 0; i < types.length; ++i) {
272 247
 				initWriter.dup();
273 248
 				initWriter.loadObject(i + 1);
274 249
 
275 250
 				final String descriptor = context.getDescriptor(types[i]);
276
-				initWriter.putField(optionClassName, "Field" + i, descriptor);
251
+				initWriter.putField(optionTag.variantOptionClass.internalName, "field" + i, descriptor);
277 252
 			}
278 253
 			initWriter.pop();
279 254
 			initWriter.ret();
280 255
 			initWriter.end();
281 256
 
282
-
283 257
 			//Denominator for switch-cases
284
-			final JavaWriter getDenominator = new JavaWriter(optionWriter, new JavaMethodInfo(optionClass, "getDenominator", "()I", Modifiers.PUBLIC), null, null, null, "java/lang/Override");
258
+			JavaMethod denominator = JavaMethod.getVirtual(optionTag.variantOptionClass, "getDenominator", "()I", JavaModifiers.PUBLIC);
259
+			final JavaWriter getDenominator = new JavaWriter(optionWriter, denominator, null, null, null, "java/lang/Override");
285 260
 			getDenominator.start();
286 261
 			getDenominator.constant(option.ordinal);
287 262
 			getDenominator.returnInt();
288 263
 			getDenominator.end();
289 264
 
290
-
291 265
 			optionVisitor.end();
292 266
 			optionWriter.visitEnd();
293 267
 			final byte[] byteArray = optionWriter.toByteArray();
294
-			context.register(optionClassName, byteArray);
268
+			context.register(optionTag.variantOptionClass.internalName, byteArray);
295 269
 
296 270
 			//Print the option files, won't be in production
297
-			try (FileOutputStream out = new FileOutputStream(optionClassName + ".class")) {
271
+			try (FileOutputStream out = new FileOutputStream(optionTag.variantOptionClass.internalName.replace('/', '_') + ".class")) {
298 272
 				out.write(byteArray);
299 273
 			} catch (IOException e) {
300 274
 				e.printStackTrace();
@@ -306,7 +280,7 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
306 280
 			member.accept(visitor);
307 281
 		}
308 282
 
309
-		final JavaWriter superInitWriter = new JavaWriter(writer, new JavaMethodInfo(toClass, "<init>", "()V", Opcodes.ACC_PUBLIC), variant, "()V", null);
283
+		final JavaWriter superInitWriter = new JavaWriter(writer, JavaMethod.getConstructor(toClass, "()V", Opcodes.ACC_PUBLIC), variant, "()V", null);
310 284
 		superInitWriter.start();
311 285
 		superInitWriter.loadObject(0);
312 286
 		superInitWriter.invokeSpecial("java/lang/Object", "<init>", "()V");

+ 12
- 30
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/definitions/JavaMemberVisitor.java Vedi File

@@ -10,14 +10,14 @@ import org.openzen.zenscript.codemodel.Modifiers;
10 10
 import org.openzen.zenscript.codemodel.definition.EnumDefinition;
11 11
 import org.openzen.zenscript.codemodel.expression.Expression;
12 12
 import org.openzen.zenscript.codemodel.member.*;
13
-import org.openzen.zenscript.javabytecode.JavaMethodInfo;
14
-import org.openzen.zenscript.javabytecode.JavaParameterInfo;
13
+import org.openzen.zenscript.javashared.JavaParameterInfo;
15 14
 import org.openzen.zenscript.javabytecode.compiler.*;
16 15
 
17 16
 import java.util.List;
18 17
 import org.openzen.zenscript.javabytecode.JavaBytecodeContext;
19 18
 import org.openzen.zenscript.javashared.JavaClass;
20 19
 import org.openzen.zenscript.javashared.JavaField;
20
+import org.openzen.zenscript.javashared.JavaMethod;
21 21
 
22 22
 public class JavaMemberVisitor implements MemberVisitor<Void> {
23 23
     private final ClassWriter writer;
@@ -33,7 +33,7 @@ public class JavaMemberVisitor implements MemberVisitor<Void> {
33 33
         this.definition = definition;
34 34
 		this.context = context;
35 35
 
36
-        final JavaWriter javaWriter = new JavaWriter(writer, new JavaMethodInfo(toClass, "<clinit>", "()V", 0), definition, null, null);
36
+        final JavaWriter javaWriter = new JavaWriter(writer, new JavaMethod(toClass, JavaMethod.Kind.STATICINIT, "<clinit>", true, "()V", 0, false), definition, null, null);
37 37
         this.clinitStatementVisitor = new JavaStatementVisitor(context, javaWriter);
38 38
         this.clinitStatementVisitor.start();
39 39
         CompilerUtils.writeDefaultFieldInitializers(context, javaWriter, definition, true);
@@ -41,30 +41,22 @@ public class JavaMemberVisitor implements MemberVisitor<Void> {
41 41
 
42 42
 	@Override
43 43
 	public Void visitConst(ConstMember member) {
44
-        //TODO calc signature
45
-        String signature = null;
46
-        final String descriptor = context.getDescriptor(member.type);
47
-        writer.visitField(CompilerUtils.calcAccess(member.modifiers), member.name, descriptor, signature, null).visitEnd();
48
-        member.setTag(JavaField.class, new JavaField(toClass, member.name, descriptor));
44
+		JavaField field = member.getTag(JavaField.class);
45
+        writer.visitField(CompilerUtils.calcAccess(member.modifiers), field.name, field.descriptor, field.signature, null).visitEnd();
49 46
         return null;
50 47
 	}
51 48
 
52 49
 	@Override
53 50
 	public Void visitField(FieldMember member) {
54
-
55
-        //TODO calc signature
56
-        String signature = null;
57
-        final String descriptor = context.getDescriptor(member.type);
58
-        writer.visitField(CompilerUtils.calcAccess(member.modifiers), member.name, descriptor, signature, null).visitEnd();
59
-        member.setTag(JavaField.class, new JavaField(toClass, member.name, descriptor));
51
+		JavaField field = member.getTag(JavaField.class);
52
+        writer.visitField(CompilerUtils.calcAccess(member.modifiers), field.name, field.descriptor, field.signature, null).visitEnd();
60 53
         return null;
61 54
     }
62 55
 
63 56
     @Override
64 57
     public Void visitConstructor(ConstructorMember member) {
65 58
         final boolean isEnum = definition instanceof EnumDefinition;
66
-        String descriptor = isEnum ? context.getEnumConstructorDescriptor(member.header) : context.getMethodDescriptor(member.header);
67
-        final JavaMethodInfo method = new JavaMethodInfo(toClass, "<init>", descriptor, isEnum ? Opcodes.ACC_PRIVATE : CompilerUtils.calcAccess(member.modifiers));
59
+        final JavaMethod method = member.getTag(JavaMethod.class);
68 60
 
69 61
         final Label constructorStart = new Label();
70 62
         final Label constructorEnd = new Label();
@@ -94,10 +86,9 @@ public class JavaMemberVisitor implements MemberVisitor<Void> {
94 86
 				constructorWriter.invokeSpecial(Type.getInternalName(Enum.class), "<init>", "(Ljava/lang/String;I)V");
95 87
 			} else if (definition.getSuperType() == null) {
96 88
 				System.out.println("Writing regular constructor");
97
-				constructorWriter.load(Type.getType(Object.class), 0);
89
+				constructorWriter.loadObject(0);
98 90
 				constructorWriter.invokeSpecial(Type.getInternalName(Object.class), "<init>", "()V");
99 91
 			}
100
-
101 92
         }
102 93
 
103 94
 		member.body.accept(statementVisitor);
@@ -108,7 +99,7 @@ public class JavaMemberVisitor implements MemberVisitor<Void> {
108 99
 
109 100
 	@Override
110 101
 	public Void visitDestructor(DestructorMember member) {
111
-		final JavaMethodInfo method = new JavaMethodInfo(toClass, "close", "()V", Opcodes.ACC_PUBLIC);
102
+		final JavaMethod method = JavaMethod.getVirtual(toClass, "close", "()V", Opcodes.ACC_PUBLIC);
112 103
 
113 104
 		final Label constructorStart = new Label();
114 105
 		final Label constructorEnd = new Label();
@@ -129,14 +120,7 @@ public class JavaMemberVisitor implements MemberVisitor<Void> {
129 120
         CompilerUtils.tagMethodParameters(context, member.header, member.isStatic());
130 121
 
131 122
         final boolean isAbstract = member.body == null || Modifiers.isAbstract(member.modifiers);
132
-        int modifiers = (isAbstract ? Opcodes.ACC_ABSTRACT : 0)
133
-                | (member.isStatic() ? Opcodes.ACC_STATIC : 0)
134
-                | CompilerUtils.calcAccess(member.modifiers);
135
-        final JavaMethodInfo method = new JavaMethodInfo(
136
-                toClass,
137
-                member.name,
138
-                context.getMethodSignature(member.header),
139
-                modifiers);
123
+        final JavaMethod method = member.getTag(JavaMethod.class);
140 124
 
141 125
 		final Label methodStart = new Label();
142 126
 		final Label methodEnd = new Label();
@@ -157,8 +141,6 @@ public class JavaMemberVisitor implements MemberVisitor<Void> {
157 141
 			methodWriter.label(methodEnd);
158 142
 			statementVisitor.end();
159 143
 		}
160
-
161
-		member.setTag(JavaMethodInfo.class, method);
162 144
 		return null;
163 145
 	}
164 146
 
@@ -183,7 +165,7 @@ public class JavaMemberVisitor implements MemberVisitor<Void> {
183 165
 	}
184 166
 
185 167
 	@Override
186
-	public Void visitCustomIterator(CustomIteratorMember member) {
168
+	public Void visitCustomIterator(IteratorMember member) {
187 169
 		return null;
188 170
 	}
189 171
 

+ 0
- 9
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/definitions/JavaOptionInfoTag.java Vedi File

@@ -1,9 +0,0 @@
1
-package org.openzen.zenscript.javabytecode.compiler.definitions;
2
-
3
-public class JavaOptionInfoTag {
4
-	public final int number;
5
-
6
-	public JavaOptionInfoTag(int number) {
7
-		this.number = number;
8
-	}
9
-}

+ 7
- 0
JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaClass.java Vedi File

@@ -47,6 +47,13 @@ public class JavaClass implements Comparable<JavaClass> {
47 47
 		return new JavaClass(pkg, internalName, kind, nameParts);
48 48
 	}
49 49
 	
50
+	public static String getNameFromFile(String filename) {
51
+		if (filename.indexOf('.') > 0)
52
+			return filename.substring(0, filename.indexOf('.'));
53
+		else
54
+			return filename;
55
+	}
56
+	
50 57
 	public final JavaClass outer;
51 58
 	
52 59
 	public final String pkg;

+ 2
- 2
JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaContext.java Vedi File

@@ -25,7 +25,7 @@ public abstract class JavaContext {
25 25
         for (FunctionParameter parameter : header.parameters) {
26 26
             signatureBuilder.append(getDescriptor(parameter.type));
27 27
         }
28
-        signatureBuilder.append(")").append(getDescriptor(header.returnType));
28
+        signatureBuilder.append(")").append(getDescriptor(header.getReturnType()));
29 29
         return signatureBuilder.toString();
30 30
     }
31 31
 	
@@ -42,7 +42,7 @@ public abstract class JavaContext {
42 42
 			descBuilder.append(getDescriptor(parameter.type));
43 43
         }
44 44
         descBuilder.append(")");
45
-        descBuilder.append(getDescriptor(header.returnType));
45
+        descBuilder.append(getDescriptor(header.getReturnType()));
46 46
         return descBuilder.toString();
47 47
     }
48 48
 }

+ 4
- 3
JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaField.java Vedi File

@@ -12,11 +12,12 @@ package org.openzen.zenscript.javashared;
12 12
 public class JavaField {
13 13
 	public final JavaClass cls;
14 14
 	public final String name;
15
-	public final String signature;
15
+	public final String descriptor;
16
+	public final String signature = null; // TODO: calculate signature too
16 17
 	
17
-	public JavaField(JavaClass cls, String name, String signature) {
18
+	public JavaField(JavaClass cls, String name, String descriptor) {
18 19
 		this.cls = cls;
19 20
 		this.name = name;
20
-		this.signature = signature;
21
+		this.descriptor = descriptor;
21 22
 	}
22 23
 }

+ 37
- 1
JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaMethod.java Vedi File

@@ -10,6 +10,38 @@ package org.openzen.zenscript.javashared;
10 10
  * @author Hoofdgebruiker
11 11
  */
12 12
 public class JavaMethod {
13
+	public static JavaMethod getConstructor(JavaClass cls, String descriptor, int modifiers) {
14
+		return new JavaMethod(cls, Kind.CONSTRUCTOR, "<init>", true, descriptor, modifiers, false);
15
+	}
16
+	
17
+	public static JavaMethod getNativeConstructor(JavaClass cls, String descriptor) {
18
+		return new JavaMethod(cls, Kind.CONSTRUCTOR, "<init>", false, descriptor, JavaModifiers.PUBLIC, false);
19
+	}
20
+	
21
+	public static JavaMethod getDestructor(JavaClass cls, int modifiers) {
22
+		return new JavaMethod(cls, Kind.INSTANCE, "close", true, "()V", modifiers, false);
23
+	}
24
+	
25
+	public static JavaMethod getStatic(JavaClass cls, String name, String descriptor, int modifiers) {
26
+		return new JavaMethod(cls, Kind.STATIC, name, true, descriptor, modifiers | JavaModifiers.STATIC, false);
27
+	}
28
+	
29
+	public static JavaMethod getNativeStatic(JavaClass cls, String name, String descriptor) {
30
+		return new JavaMethod(cls, Kind.STATIC, name, false, descriptor, JavaModifiers.STATIC | JavaModifiers.PUBLIC, false);
31
+	}
32
+	
33
+	public static JavaMethod getVirtual(JavaClass cls, String name, String descriptor, int modifiers) {
34
+		return new JavaMethod(cls, Kind.INSTANCE, name, true, descriptor, modifiers, false);
35
+	}
36
+	
37
+	public static JavaMethod getNativeVirtual(JavaClass cls, String name, String descriptor) {
38
+		return new JavaMethod(cls, Kind.INSTANCE, name, false, descriptor, JavaModifiers.PUBLIC, false);
39
+	}
40
+
41
+	public static JavaMethod getNativeExpansion(JavaClass cls, String name, String descriptor) {
42
+		return new JavaMethod(cls, Kind.EXPANSION, name, false, descriptor, JavaModifiers.PUBLIC | JavaModifiers.STATIC, false);
43
+	}
44
+	
13 45
 	public final JavaClass cls;
14 46
 	public final Kind kind;
15 47
 	public final String name;
@@ -18,8 +50,9 @@ public class JavaMethod {
18 50
 	
19 51
 	public final String descriptor;
20 52
 	public final int modifiers;
53
+	public final boolean genericResult;
21 54
 	
22
-	public JavaMethod(JavaClass cls, Kind kind, String name, boolean compile, String descriptor, int modifiers) {
55
+	public JavaMethod(JavaClass cls, Kind kind, String name, boolean compile, String descriptor, int modifiers, boolean genericResult) {
23 56
 		this.cls = cls;
24 57
 		this.kind = kind;
25 58
 		this.name = name;
@@ -28,6 +61,7 @@ public class JavaMethod {
28 61
 		
29 62
 		this.descriptor = descriptor;
30 63
 		this.modifiers = modifiers;
64
+		this.genericResult = genericResult;
31 65
 	}
32 66
 	
33 67
 	public JavaMethod(JavaNativeTranslation<?> translation) {
@@ -38,10 +72,12 @@ public class JavaMethod {
38 72
 		this.translation = translation;
39 73
 		this.descriptor = "";
40 74
 		this.modifiers = 0;
75
+		this.genericResult = false;
41 76
 	}
42 77
 	
43 78
 	public enum Kind {
44 79
 		STATIC,
80
+		STATICINIT,
45 81
 		INSTANCE,
46 82
 		EXPANSION,
47 83
 		CONSTRUCTOR,

+ 2
- 2
JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaNativeClass.java Vedi File

@@ -31,11 +31,11 @@ public class JavaNativeClass {
31 31
 	}
32 32
 	
33 33
 	public void addConstructor(String key, String descriptor) {
34
-		methods.put(key, new JavaMethod(cls, JavaMethod.Kind.CONSTRUCTOR, "<init>", false, descriptor, JavaModifiers.PUBLIC));
34
+		methods.put(key, new JavaMethod(cls, JavaMethod.Kind.CONSTRUCTOR, "<init>", false, descriptor, JavaModifiers.PUBLIC, false));
35 35
 	}
36 36
 	
37 37
 	public void addInstanceMethod(String key, String name, String descriptor) {
38
-		methods.put(key, new JavaMethod(cls, JavaMethod.Kind.INSTANCE, name, false, descriptor, JavaModifiers.PUBLIC));
38
+		methods.put(key, new JavaMethod(cls, JavaMethod.Kind.INSTANCE, name, false, descriptor, JavaModifiers.PUBLIC, false));
39 39
 	}
40 40
 	
41 41
 	public JavaMethod getMethod(String name) {

JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaParameterInfo.java → JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaParameterInfo.java Vedi File

@@ -3,19 +3,17 @@
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.javabytecode;
7
-
8
-import org.objectweb.asm.Type;
6
+package org.openzen.zenscript.javashared;
9 7
 
10 8
 /**
11 9
  * @author Hoofdgebruiker
12 10
  */
13 11
 public class JavaParameterInfo {
14 12
 	public final int index;
15
-	public final Type type;
13
+	public final String typeDescriptor;
16 14
 
17
-	public JavaParameterInfo(int index, Type type) {
15
+	public JavaParameterInfo(int index, String typeDescriptor) {
18 16
 		this.index = index;
19
-		this.type = type;
17
+		this.typeDescriptor = typeDescriptor;
20 18
 	}
21 19
 }

+ 1
- 1
JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaSynthesizedClassNamer.java Vedi File

@@ -29,7 +29,7 @@ public class JavaSynthesizedClassNamer {
29 29
 	
30 30
 	public static JavaSynthesizedClass createRangeName(RangeTypeID range) {
31 31
 		String signature = getRangeSignature(range);
32
-		String className = signature + "Range";
32
+		String className = signature;
33 33
 		JavaClass cls = new JavaClass("zsynthetic", className, JavaClass.Kind.CLASS);
34 34
 		return new JavaSynthesizedClass(cls, extractTypeParameters(range));
35 35
 	}

+ 3
- 4
JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaSyntheticTypeSignatureConverter.java Vedi File

@@ -46,6 +46,7 @@ public class JavaSyntheticTypeSignatureConverter implements ITypeVisitor<String>
46 46
 			case UINT: return "UInt";
47 47
 			case LONG: return "Long";
48 48
 			case ULONG: return "ULong";
49
+			case USIZE: return "USize";
49 50
 			case FLOAT: return "Float";
50 51
 			case DOUBLE: return "Double";
51 52
 			case CHAR: return "Char";
@@ -94,7 +95,7 @@ public class JavaSyntheticTypeSignatureConverter implements ITypeVisitor<String>
94 95
 		for (FunctionParameter parameter : function.header.parameters)
95 96
 			result.append(parameter.type.accept(this));
96 97
 		result.append("To");
97
-		result.append(function.header.returnType.accept(this));
98
+		result.append(function.header.getReturnType().accept(this));
98 99
 		if (function.header.thrownType != null) {
99 100
 			result.append("Throwing");
100 101
 			result.append(function.header.thrownType.accept(this));
@@ -129,9 +130,7 @@ public class JavaSyntheticTypeSignatureConverter implements ITypeVisitor<String>
129 130
 	@Override
130 131
 	public String visitRange(RangeTypeID range) {
131 132
 		StringBuilder result = new StringBuilder();
132
-		result.append(range.from.accept(this));
133
-		if (range.from != range.to)
134
-			result.append(range.to.accept(this));
133
+		result.append(range.baseType.accept(this));
135 134
 		result.append("Range");
136 135
 		return result.toString();
137 136
 	}

+ 8
- 1
JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaTypeDescriptorVisitor.java Vedi File

@@ -33,6 +33,7 @@ public class JavaTypeDescriptorVisitor implements ITypeVisitor<String> {
33 33
 				case UINT: return "Ljava/lang/Integer;";
34 34
 				case LONG: return "Ljava/lang/Long;";
35 35
 				case ULONG: return "Ljava/lang/Long;";
36
+				case USIZE: return "I"; // special case: optional usize fits in an int where null = -1
36 37
 				case FLOAT: return "Ljava/lang/Float;";
37 38
 				case DOUBLE: return "Ljava/lang/Double;";
38 39
 				case STRING: return "Ljava/lang/String;";
@@ -52,6 +53,7 @@ public class JavaTypeDescriptorVisitor implements ITypeVisitor<String> {
52 53
 				case UINT: return "I";
53 54
 				case LONG: return "J";
54 55
 				case ULONG: return "J";
56
+				case USIZE: return "I";
55 57
 				case FLOAT: return "F";
56 58
 				case DOUBLE: return "D";
57 59
 				case STRING: return "Ljava/lang/String;";
@@ -63,7 +65,12 @@ public class JavaTypeDescriptorVisitor implements ITypeVisitor<String> {
63 65
 
64 66
     @Override
65 67
     public String visitArray(ArrayTypeID array) {
66
-		return "[" + array.elementType.accept(this);
68
+		if (array.elementType == BasicTypeID.BYTE)
69
+			return "[B"; // instead of int[], save memory, save compatibility
70
+		else if (array.elementType == BasicTypeID.USHORT)
71
+			return "[S"; // instead of int[], save memory
72
+		else
73
+			return "[" + array.elementType.accept(this);
67 74
     }
68 75
 
69 76
     @Override

+ 2
- 0
JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaTypeInternalNameVisitor.java Vedi File

@@ -33,6 +33,7 @@ public class JavaTypeInternalNameVisitor implements ITypeVisitor<String> {
33 33
 				case UINT: return "java/lang/Integer";
34 34
 				case LONG: return "java/lang/Long";
35 35
 				case ULONG: return "java/lang/Long";
36
+				case USIZE: return "java/lang/Integer";
36 37
 				case FLOAT: return "java/lang/Float";
37 38
 				case DOUBLE: return "java/lang/Double";
38 39
 				case STRING: return "java/lang/String";
@@ -52,6 +53,7 @@ public class JavaTypeInternalNameVisitor implements ITypeVisitor<String> {
52 53
 				case UINT: return "I";
53 54
 				case LONG: return "J";
54 55
 				case ULONG: return "J";
56
+				case USIZE: return "I";
55 57
 				case FLOAT: return "F";
56 58
 				case DOUBLE: return "D";
57 59
 				case STRING: return "java/lang/String";

+ 2
- 4
JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaTypeNameVisitor.java Vedi File

@@ -76,7 +76,7 @@ public class JavaTypeNameVisitor implements ITypeVisitor<String> {
76 76
 		for (FunctionParameter parameter : function.header.parameters)
77 77
 			result.append(parameter.type.accept(this));
78 78
 		result.append("To");
79
-		result.append(function.header.returnType.accept(this));
79
+		result.append(function.header.getReturnType().accept(this));
80 80
 		result.append("Function");
81 81
 		return result.toString();
82 82
 	}
@@ -93,9 +93,7 @@ public class JavaTypeNameVisitor implements ITypeVisitor<String> {
93 93
 
94 94
 	@Override
95 95
 	public String visitRange(RangeTypeID range) {
96
-		return range.from == range.to
97
-				? range.from.accept(this) + "Range"
98
-				: range.from.accept(this) + range.to.accept(this) + "Range";
96
+		return range.baseType.accept(this) + "Range";
99 97
 	}
100 98
 
101 99
 	@Override

+ 34
- 20
JavaShared/src/main/java/org/openzen/zenscript/javashared/prepare/JavaPrepareClassMethodVisitor.java Vedi File

@@ -7,17 +7,17 @@ package org.openzen.zenscript.javashared.prepare;
7 7
 
8 8
 import org.openzen.zenscript.javashared.JavaNativeClass;
9 9
 import org.openzen.zencode.shared.StringExpansion;
10
+import org.openzen.zenscript.codemodel.FunctionHeader;
10 11
 import org.openzen.zenscript.codemodel.OperatorType;
11 12
 import org.openzen.zenscript.codemodel.annotations.NativeTag;
12 13
 import org.openzen.zenscript.codemodel.member.CallerMember;
13 14
 import org.openzen.zenscript.codemodel.member.CasterMember;
14 15
 import org.openzen.zenscript.codemodel.member.ConstMember;
15 16
 import org.openzen.zenscript.codemodel.member.ConstructorMember;
16
-import org.openzen.zenscript.codemodel.member.CustomIteratorMember;
17
+import org.openzen.zenscript.codemodel.member.IteratorMember;
17 18
 import org.openzen.zenscript.codemodel.member.DefinitionMember;
18 19
 import org.openzen.zenscript.codemodel.member.DestructorMember;
19 20
 import org.openzen.zenscript.codemodel.member.FieldMember;
20
-import org.openzen.zenscript.codemodel.member.FunctionalMember;
21 21
 import org.openzen.zenscript.codemodel.member.GetterMember;
22 22
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
23 23
 import org.openzen.zenscript.codemodel.member.ImplementationMember;
@@ -28,6 +28,9 @@ import org.openzen.zenscript.codemodel.member.OperatorMember;
28 28
 import org.openzen.zenscript.codemodel.member.SetterMember;
29 29
 import org.openzen.zenscript.codemodel.member.StaticInitializerMember;
30 30
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
31
+import org.openzen.zenscript.codemodel.type.BasicTypeID;
32
+import org.openzen.zenscript.codemodel.type.GenericTypeID;
33
+import org.openzen.zenscript.codemodel.type.member.BuiltinID;
31 34
 import org.openzen.zenscript.javashared.JavaTypeNameVisitor;
32 35
 import org.openzen.zenscript.javashared.JavaClass;
33 36
 import org.openzen.zenscript.javashared.JavaField;
@@ -44,20 +47,17 @@ public class JavaPrepareClassMethodVisitor implements MemberVisitor<Void> {
44 47
 	private static final boolean DEBUG_EMPTY = true;
45 48
 	
46 49
 	private final JavaContext context;
47
-	private final String filename;
48 50
 	private final JavaClass cls;
49 51
 	private final JavaNativeClass nativeClass;
50 52
 	private final JavaPrepareDefinitionMemberVisitor memberPreparer;
51 53
 	
52 54
 	public JavaPrepareClassMethodVisitor(
53 55
 			JavaContext context,
54
-			String filename,
55 56
 			JavaClass cls,
56 57
 			JavaNativeClass nativeClass,
57 58
 			JavaPrepareDefinitionMemberVisitor memberPreparer,
58 59
 			boolean startsEmpty) {
59 60
 		this.context = context;
60
-		this.filename = filename;
61 61
 		this.cls = cls;
62 62
 		this.nativeClass = nativeClass;
63 63
 		this.memberPreparer = memberPreparer;
@@ -88,7 +88,7 @@ public class JavaPrepareClassMethodVisitor implements MemberVisitor<Void> {
88 88
 
89 89
 	@Override
90 90
 	public Void visitConstructor(ConstructorMember member) {
91
-		visitFunctional(member, "<init>");
91
+		visitFunctional(member, member.header, "<init>");
92 92
 		return null;
93 93
 	}
94 94
 
@@ -103,43 +103,43 @@ public class JavaPrepareClassMethodVisitor implements MemberVisitor<Void> {
103 103
 
104 104
 	@Override
105 105
 	public Void visitMethod(MethodMember member) {
106
-		visitFunctional(member, member.name);
106
+		visitFunctional(member, member.header, member.name);
107 107
 		return null;
108 108
 	}
109 109
 
110 110
 	@Override
111 111
 	public Void visitGetter(GetterMember member) {
112
-		visitFunctional(member, "get" + StringExpansion.capitalize(member.name));
112
+		visitFunctional(member, new FunctionHeader(member.type), "get" + StringExpansion.capitalize(member.name));
113 113
 		return null;
114 114
 	}
115 115
 
116 116
 	@Override
117 117
 	public Void visitSetter(SetterMember member) {
118
-		visitFunctional(member, "set" + StringExpansion.capitalize(member.name));
118
+		visitFunctional(member, new FunctionHeader(BasicTypeID.VOID, member.type), "set" + StringExpansion.capitalize(member.name));
119 119
 		return null;
120 120
 	}
121 121
 
122 122
 	@Override
123 123
 	public Void visitOperator(OperatorMember member) {
124
-		visitFunctional(member, getOperatorName(member.operator));
124
+		visitFunctional(member, member.header, getOperatorName(member.operator));
125 125
 		return null;
126 126
 	}
127 127
 
128 128
 	@Override
129 129
 	public Void visitCaster(CasterMember member) {
130
-		visitFunctional(member, "to" + member.toType.accept(new JavaTypeNameVisitor()));
130
+		visitFunctional(member, member.header, "to" + member.toType.accept(new JavaTypeNameVisitor()));
131 131
 		return null;
132 132
 	}
133 133
 
134 134
 	@Override
135
-	public Void visitCustomIterator(CustomIteratorMember member) {
136
-		visitFunctional(member, member.getLoopVariableCount() == 1 ? "iterator" : "iterator" + member.getLoopVariableCount());
135
+	public Void visitCustomIterator(IteratorMember member) {
136
+		visitFunctional(member, member.header, member.getLoopVariableCount() == 1 ? "iterator" : "iterator" + member.getLoopVariableCount());
137 137
 		return null;
138 138
 	}
139 139
 
140 140
 	@Override
141 141
 	public Void visitCaller(CallerMember member) {
142
-		visitFunctional(member, "call");
142
+		visitFunctional(member, member.header, "call");
143 143
 		return null;
144 144
 	}
145 145
 
@@ -160,7 +160,7 @@ public class JavaPrepareClassMethodVisitor implements MemberVisitor<Void> {
160 160
 			JavaClass implementationClass = new JavaClass(cls, member.type.accept(new JavaTypeNameVisitor()) + "Implementation", JavaClass.Kind.CLASS);
161 161
 			member.setTag(JavaImplementation.class, new JavaImplementation(false, implementationClass));
162 162
 			
163
-			JavaPrepareClassMethodVisitor visitor = new JavaPrepareClassMethodVisitor(context, filename, implementationClass, null, memberPreparer, true);
163
+			JavaPrepareClassMethodVisitor visitor = new JavaPrepareClassMethodVisitor(context, implementationClass, null, memberPreparer, true);
164 164
 			for (IDefinitionMember m : member.members)
165 165
 				m.accept(visitor);
166 166
 		}
@@ -173,7 +173,7 @@ public class JavaPrepareClassMethodVisitor implements MemberVisitor<Void> {
173 173
 
174 174
 	@Override
175 175
 	public Void visitInnerDefinition(InnerDefinitionMember member) {
176
-		JavaPrepareDefinitionMemberVisitor innerDefinitionPrepare = new JavaPrepareDefinitionMemberVisitor(context, filename);
176
+		JavaPrepareDefinitionMemberVisitor innerDefinitionPrepare = new JavaPrepareDefinitionMemberVisitor(context);
177 177
 		member.innerDefinition.accept(innerDefinitionPrepare);
178 178
 		
179 179
 		if (DEBUG_EMPTY && cls.empty)
@@ -281,7 +281,7 @@ public class JavaPrepareClassMethodVisitor implements MemberVisitor<Void> {
281 281
 		}
282 282
 	}
283 283
 	
284
-	private void visitFunctional(FunctionalMember member, String name) {
284
+	private void visitFunctional(DefinitionMember member, FunctionHeader header, String name) {
285 285
 		NativeTag nativeTag = member.getTag(NativeTag.class);
286 286
 		JavaMethod method = null;
287 287
 		if (nativeTag != null && nativeClass != null)
@@ -293,12 +293,26 @@ public class JavaPrepareClassMethodVisitor implements MemberVisitor<Void> {
293 293
 			if (baseMethod == null)
294 294
 				throw new IllegalStateException("Base method not yet prepared!");
295 295
 			
296
-			method = new JavaMethod(cls, baseMethod.kind, baseMethod.name, true, context.getMethodDescriptor(member.header), JavaModifiers.getJavaModifiers(member.modifiers));
296
+			method = new JavaMethod(
297
+					cls,
298
+					baseMethod.kind,
299
+					baseMethod.name,
300
+					true,
301
+					context.getMethodDescriptor(header),
302
+					JavaModifiers.getJavaModifiers(member.modifiers),
303
+					header.getReturnType() instanceof GenericTypeID);
297 304
 		} else if (method == null) {
298
-			method = new JavaMethod(cls, getKind(member), name, true, context.getMethodDescriptor(member.header), JavaModifiers.getJavaModifiers(member.modifiers));
305
+			method = new JavaMethod(
306
+					cls,
307
+					getKind(member),
308
+					name,
309
+					true,
310
+					context.getMethodDescriptor(header),
311
+					JavaModifiers.getJavaModifiers(member.modifiers),
312
+					header.getReturnType() instanceof GenericTypeID);
299 313
 		}
300 314
 		
301
-		if (method.compile) {
315
+		if (method.compile && member.getBuiltin() != BuiltinID.CLASS_DEFAULT_CONSTRUCTOR) {
302 316
 			if (DEBUG_EMPTY && cls.empty)
303 317
 				System.out.println("Class " + cls.fullName + " not empty because of " + member.describe());
304 318
 			

+ 4
- 5
JavaShared/src/main/java/org/openzen/zenscript/javashared/prepare/JavaPrepareDefinitionMemberVisitor.java Vedi File

@@ -30,11 +30,9 @@ import org.openzen.zenscript.javashared.JavaModifiers;
30 30
  */
31 31
 public class JavaPrepareDefinitionMemberVisitor implements DefinitionVisitor<JavaClass> {
32 32
 	private final JavaContext context;
33
-	private final String filename;
34 33
 	
35
-	public JavaPrepareDefinitionMemberVisitor(JavaContext context, String filename) {
34
+	public JavaPrepareDefinitionMemberVisitor(JavaContext context) {
36 35
 		this.context = context;
37
-		this.filename = filename;
38 36
 	}
39 37
 	
40 38
 	private boolean isPrepared(HighLevelDefinition definition) {
@@ -46,6 +44,7 @@ public class JavaPrepareDefinitionMemberVisitor implements DefinitionVisitor<Jav
46 44
 			return;
47 45
 			
48 46
 		HighLevelDefinition definition = ((DefinitionTypeID)type).definition;
47
+		System.out.println("Preparing " + definition.name);
49 48
 		definition.accept(this);
50 49
 	}
51 50
 	
@@ -90,7 +89,7 @@ public class JavaPrepareDefinitionMemberVisitor implements DefinitionVisitor<Jav
90 89
 			return definition.getTag(JavaClass.class);
91 90
 		
92 91
 		JavaClass cls = definition.getTag(JavaClass.class);
93
-		JavaMethod method = new JavaMethod(cls, JavaMethod.Kind.STATIC, definition.name, true, context.getMethodDescriptor(definition.header), JavaModifiers.getJavaModifiers(definition.modifiers));
92
+		JavaMethod method = JavaMethod.getStatic(cls, definition.name, context.getMethodDescriptor(definition.header), JavaModifiers.getJavaModifiers(definition.modifiers));
94 93
 		definition.caller.setTag(JavaMethod.class, method);
95 94
 		return cls;
96 95
 	}
@@ -138,7 +137,7 @@ public class JavaPrepareDefinitionMemberVisitor implements DefinitionVisitor<Jav
138 137
 	
139 138
 	private void visitClassMembers(HighLevelDefinition definition, JavaClass cls, JavaNativeClass nativeClass, boolean startsEmpty) {
140 139
 		System.out.println("Preparing " + cls.internalName);
141
-		JavaPrepareClassMethodVisitor methodVisitor = new JavaPrepareClassMethodVisitor(context, filename, cls, nativeClass, this, startsEmpty);
140
+		JavaPrepareClassMethodVisitor methodVisitor = new JavaPrepareClassMethodVisitor(context, cls, nativeClass, this, startsEmpty);
142 141
 		for (IDefinitionMember member : definition.members) {
143 142
 			member.accept(methodVisitor);
144 143
 		}

+ 30
- 11
JavaShared/src/main/java/org/openzen/zenscript/javashared/prepare/JavaPrepareDefinitionVisitor.java Vedi File

@@ -29,7 +29,6 @@ import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
29 29
 import org.openzen.zenscript.codemodel.type.ITypeID;
30 30
 import org.openzen.zenscript.javashared.JavaClass;
31 31
 import org.openzen.zenscript.javashared.JavaMethod;
32
-import org.openzen.zenscript.javashared.JavaModifiers;
33 32
 import org.openzen.zenscript.javashared.JavaVariantOption;
34 33
 
35 34
 /**
@@ -56,6 +55,7 @@ public class JavaPrepareDefinitionVisitor implements DefinitionVisitor<JavaClass
56 55
 			cls.addInstanceMethod("appendUInt", "append", "(I)Ljava/lang/StringBuilder;");
57 56
 			cls.addInstanceMethod("appendLong", "append", "(J)Ljava/lang/StringBuilder;");
58 57
 			cls.addInstanceMethod("appendULong", "append", "(J)Ljava/lang/StringBuilder;");
58
+			cls.addInstanceMethod("appendUSize", "append", "(I)Ljava/lang/StringBuilder;");
59 59
 			cls.addInstanceMethod("appendFloat", "append", "(F)Ljava/lang/StringBuilder;");
60 60
 			cls.addInstanceMethod("appendDouble", "append", "(D)Ljava/lang/StringBuilder;");
61 61
 			cls.addInstanceMethod("appendChar", "append", "(C)Ljava/lang/StringBuilder;");
@@ -67,7 +67,7 @@ public class JavaPrepareDefinitionVisitor implements DefinitionVisitor<JavaClass
67 67
 		{
68 68
 			JavaNativeClass list = new JavaNativeClass(new JavaClass("java.util", "List", JavaClass.Kind.INTERFACE));
69 69
 			JavaClass arrayList = new JavaClass("java.util", "ArrayList", JavaClass.Kind.CLASS);
70
-			list.addMethod("constructor", new JavaMethod(arrayList, JavaMethod.Kind.CONSTRUCTOR, "", false, "()V", JavaModifiers.PUBLIC));
70
+			list.addMethod("constructor", JavaMethod.getNativeConstructor(arrayList, "()V"));
71 71
 			list.addInstanceMethod("add", "add", "(Ljava/lang/Object;)Z"); List<?> l;
72 72
 			list.addInstanceMethod("insert", "add", "(Ljava/lang/Object;I)V");
73 73
 			list.addInstanceMethod("remove", "remove", "(java/lang/Object;)Z");
@@ -107,10 +107,11 @@ public class JavaPrepareDefinitionVisitor implements DefinitionVisitor<JavaClass
107 107
 			JavaClass math = new JavaClass("java.lang", "Math", JavaClass.Kind.CLASS);
108 108
 			
109 109
 			JavaNativeClass cls = new JavaNativeClass(integer);
110
-			cls.addMethod("min", new JavaMethod(math, JavaMethod.Kind.STATIC, "min", false, "(II)I", JavaModifiers.PUBLIC | JavaModifiers.STATIC));
111
-			cls.addMethod("max", new JavaMethod(math, JavaMethod.Kind.STATIC, "max", false, "(II)I", JavaModifiers.PUBLIC | JavaModifiers.STATIC));
112
-			cls.addMethod("toHexString", new JavaMethod(integer, JavaMethod.Kind.EXPANSION, "toHexString", false, "()Ljava/lang/String;", JavaModifiers.PUBLIC | JavaModifiers.STATIC));
110
+			cls.addMethod("min", JavaMethod.getNativeStatic(math, "min", "(II)I"));
111
+			cls.addMethod("max", JavaMethod.getNativeStatic(math, "max", "(II)I"));
112
+			cls.addMethod("toHexString", JavaMethod.getNativeExpansion(integer, "toHexString", "(I)Ljava/lang/String;"));
113 113
 			nativeClasses.put("stdlib::Integer", cls);
114
+			nativeClasses.put("stdlib::USize", cls);
114 115
 		}
115 116
 		
116 117
 		{
@@ -132,11 +133,11 @@ public class JavaPrepareDefinitionVisitor implements DefinitionVisitor<JavaClass
132 133
 		{
133 134
 			JavaClass arrays = new JavaClass("java.lang", "Arrays", JavaClass.Kind.CLASS);
134 135
 			JavaNativeClass cls = new JavaNativeClass(arrays);
135
-			cls.addMethod("sort", new JavaMethod(arrays, JavaMethod.Kind.EXPANSION, "sort", false, "([Ljava/lang/Object;)[Ljava/lang/Object;", JavaModifiers.PUBLIC | JavaModifiers.STATIC));
136
+			cls.addMethod("sort", JavaMethod.getNativeExpansion(arrays, "sort", "([Ljava/lang/Object;)[Ljava/lang/Object;"));
136 137
 			cls.addMethod("sorted", new JavaMethod((expression, translator) -> {
137 138
 				return translator.sorted(((CallExpression)expression).target);
138 139
 			}));
139
-			cls.addMethod("sortWithComparator", new JavaMethod(arrays, JavaMethod.Kind.EXPANSION, "sort", false, "([Ljava/lang/Object;Ljava/lang/Comparator;)[Ljava/lang/Object;", JavaModifiers.PUBLIC | JavaModifiers.STATIC));
140
+			cls.addMethod("sortWithComparator", JavaMethod.getNativeExpansion(arrays, "sort", "([Ljava/lang/Object;Ljava/lang/Comparator;)[Ljava/lang/Object;"));
140 141
 			cls.addMethod("sortedWithComparator", new JavaMethod((expression, translator) -> {
141 142
 				return translator.sortedWithComparator(
142 143
 						((CallExpression)expression).target,
@@ -145,7 +146,7 @@ public class JavaPrepareDefinitionVisitor implements DefinitionVisitor<JavaClass
145 146
 			cls.addMethod("copy", new JavaMethod((expression, translator) -> {
146 147
 				return translator.copy(((CallExpression)expression).target);
147 148
 			}));
148
-			cls.addMethod("copyResize", new JavaMethod(arrays, JavaMethod.Kind.EXPANSION, "copyOf", false, "([Ljava/lang/Object;I)[Ljava/lang/Object;", JavaModifiers.PUBLIC | JavaModifiers.STATIC));
149
+			cls.addMethod("copyResize", JavaMethod.getNativeExpansion(arrays, "copyOf", "([Ljava/lang/Object;I)[Ljava/lang/Object;"));
149 150
 			cls.addMethod("copyTo", new JavaMethod((expression, translator) -> {
150 151
 				return translator.copyTo((CallExpression)expression);
151 152
 			}));
@@ -189,6 +190,24 @@ public class JavaPrepareDefinitionVisitor implements DefinitionVisitor<JavaClass
189 190
 			cls.addInstanceMethod("readSlice", "read", "([CII)I");
190 191
 			nativeClasses.put("io::StringReader", cls);
191 192
 		}
193
+		
194
+		{
195
+			JavaNativeClass cls = new JavaNativeClass(new JavaClass("java.io", "InputStream", JavaClass.Kind.INTERFACE), true);
196
+			cls.addInstanceMethod("destructor", "close", "()V");
197
+			cls.addInstanceMethod("read", "read", "()I");
198
+			cls.addInstanceMethod("readArray", "read", "([B)I");
199
+			cls.addInstanceMethod("readSlice", "read", "([BII)I");
200
+			nativeClasses.put("io::InputStream", cls);
201
+		}
202
+		
203
+		{
204
+			JavaNativeClass cls = new JavaNativeClass(new JavaClass("java.io", "OutputStream", JavaClass.Kind.INTERFACE), true);
205
+			cls.addInstanceMethod("destructor", "close", "()V");
206
+			cls.addInstanceMethod("write", "write", "()I");
207
+			cls.addInstanceMethod("writeArray", "write", "([B)V");
208
+			cls.addInstanceMethod("writeSlice", "write", "([BII)V");
209
+			nativeClasses.put("io::OutputStream", cls);
210
+		}
192 211
 	}
193 212
 	
194 213
 	private final String filename;
@@ -251,7 +270,7 @@ public class JavaPrepareDefinitionVisitor implements DefinitionVisitor<JavaClass
251 270
 		if (isPrepared(definition))
252 271
 			return definition.getTag(JavaClass.class);
253 272
 		
254
-		JavaClass cls = new JavaClass(definition.pkg.fullName, filename, JavaClass.Kind.CLASS);
273
+		JavaClass cls = new JavaClass(definition.pkg.fullName, JavaClass.getNameFromFile(filename), JavaClass.Kind.CLASS);
255 274
 		definition.setTag(JavaClass.class, cls);
256 275
 		return cls;
257 276
 	}
@@ -266,7 +285,7 @@ public class JavaPrepareDefinitionVisitor implements DefinitionVisitor<JavaClass
266 285
 			definition.setTag(JavaNativeClass.class, nativeClasses.get(nativeTag.value));
267 286
 		}
268 287
 		
269
-		JavaClass cls = new JavaClass(definition.pkg.fullName, filename, JavaClass.Kind.CLASS);
288
+		JavaClass cls = new JavaClass(definition.pkg.fullName, JavaClass.getNameFromFile(filename), JavaClass.Kind.CLASS);
270 289
 		definition.setTag(JavaClass.class, cls);
271 290
 		return cls;
272 291
 	}
@@ -286,7 +305,7 @@ public class JavaPrepareDefinitionVisitor implements DefinitionVisitor<JavaClass
286 305
 		variant.setTag(JavaClass.class, cls);
287 306
 		
288 307
 		for (VariantDefinition.Option option : variant.options) {
289
-			JavaClass variantCls = new JavaClass(cls.fullName, option.name, JavaClass.Kind.CLASS);
308
+			JavaClass variantCls = new JavaClass(cls, option.name, JavaClass.Kind.CLASS);
290 309
 			option.setTag(JavaVariantOption.class, new JavaVariantOption(cls, variantCls));
291 310
 		}
292 311
 		

+ 16
- 14
JavaShared/src/main/java/org/openzen/zenscript/javashared/prepare/JavaPrepareExpansionMethodVisitor.java Vedi File

@@ -7,17 +7,17 @@ package org.openzen.zenscript.javashared.prepare;
7 7
 
8 8
 import org.openzen.zenscript.javashared.JavaNativeClass;
9 9
 import org.openzen.zencode.shared.StringExpansion;
10
+import org.openzen.zenscript.codemodel.FunctionHeader;
10 11
 import org.openzen.zenscript.codemodel.OperatorType;
11 12
 import org.openzen.zenscript.codemodel.annotations.NativeTag;
12 13
 import org.openzen.zenscript.codemodel.member.CallerMember;
13 14
 import org.openzen.zenscript.codemodel.member.CasterMember;
14 15
 import org.openzen.zenscript.codemodel.member.ConstMember;
15 16
 import org.openzen.zenscript.codemodel.member.ConstructorMember;
16
-import org.openzen.zenscript.codemodel.member.CustomIteratorMember;
17
+import org.openzen.zenscript.codemodel.member.IteratorMember;
17 18
 import org.openzen.zenscript.codemodel.member.DefinitionMember;
18 19
 import org.openzen.zenscript.codemodel.member.DestructorMember;
19 20
 import org.openzen.zenscript.codemodel.member.FieldMember;
20
-import org.openzen.zenscript.codemodel.member.FunctionalMember;
21 21
 import org.openzen.zenscript.codemodel.member.GetterMember;
22 22
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
23 23
 import org.openzen.zenscript.codemodel.member.ImplementationMember;
@@ -27,6 +27,8 @@ import org.openzen.zenscript.codemodel.member.MethodMember;
27 27
 import org.openzen.zenscript.codemodel.member.OperatorMember;
28 28
 import org.openzen.zenscript.codemodel.member.SetterMember;
29 29
 import org.openzen.zenscript.codemodel.member.StaticInitializerMember;
30
+import org.openzen.zenscript.codemodel.type.BasicTypeID;
31
+import org.openzen.zenscript.codemodel.type.GenericTypeID;
30 32
 import org.openzen.zenscript.javashared.JavaTypeNameVisitor;
31 33
 import org.openzen.zenscript.javashared.JavaClass;
32 34
 import org.openzen.zenscript.javashared.JavaField;
@@ -75,7 +77,7 @@ public class JavaPrepareExpansionMethodVisitor implements MemberVisitor<Void> {
75 77
 
76 78
 	@Override
77 79
 	public Void visitConstructor(ConstructorMember member) {
78
-		visitFunctional(member, "");
80
+		visitFunctional(member, member.header, "");
79 81
 		return null;
80 82
 	}
81 83
 
@@ -84,49 +86,49 @@ public class JavaPrepareExpansionMethodVisitor implements MemberVisitor<Void> {
84 86
 		if (nativeClass != null && nativeClass.nonDestructible)
85 87
 			return null;
86 88
 		
87
-		visitFunctional(member, "");
89
+		visitFunctional(member, member.header, "");
88 90
 		return null;
89 91
 	}
90 92
 
91 93
 	@Override
92 94
 	public Void visitMethod(MethodMember member) {
93
-		visitFunctional(member, member.name);
95
+		visitFunctional(member, member.header, member.name);
94 96
 		return null;
95 97
 	}
96 98
 
97 99
 	@Override
98 100
 	public Void visitGetter(GetterMember member) {
99
-		visitFunctional(member, "get" + StringExpansion.capitalize(member.name));
101
+		visitFunctional(member, new FunctionHeader(member.type), "get" + StringExpansion.capitalize(member.name));
100 102
 		return null;
101 103
 	}
102 104
 
103 105
 	@Override
104 106
 	public Void visitSetter(SetterMember member) {
105
-		visitFunctional(member, "set" + StringExpansion.capitalize(member.name));
107
+		visitFunctional(member, new FunctionHeader(BasicTypeID.VOID, member.type), "set" + StringExpansion.capitalize(member.name));
106 108
 		return null;
107 109
 	}
108 110
 
109 111
 	@Override
110 112
 	public Void visitOperator(OperatorMember member) {
111
-		visitFunctional(member, getOperatorName(member.operator));
113
+		visitFunctional(member, member.header, getOperatorName(member.operator));
112 114
 		return null;
113 115
 	}
114 116
 
115 117
 	@Override
116 118
 	public Void visitCaster(CasterMember member) {
117
-		visitFunctional(member, "to" + member.toType.accept(new JavaTypeNameVisitor()));
119
+		visitFunctional(member, member.header, "to" + member.toType.accept(new JavaTypeNameVisitor()));
118 120
 		return null;
119 121
 	}
120 122
 
121 123
 	@Override
122
-	public Void visitCustomIterator(CustomIteratorMember member) {
123
-		visitFunctional(member, member.getLoopVariableCount() == 1 ? "iterator" : "iterator" + member.getLoopVariableCount());
124
+	public Void visitCustomIterator(IteratorMember member) {
125
+		visitFunctional(member, member.header, member.getLoopVariableCount() == 1 ? "iterator" : "iterator" + member.getLoopVariableCount());
124 126
 		return null;
125 127
 	}
126 128
 
127 129
 	@Override
128 130
 	public Void visitCaller(CallerMember member) {
129
-		visitFunctional(member, "call");
131
+		visitFunctional(member, member.header, "call");
130 132
 		return null;
131 133
 	}
132 134
 
@@ -153,13 +155,13 @@ public class JavaPrepareExpansionMethodVisitor implements MemberVisitor<Void> {
153 155
 		return null;
154 156
 	}
155 157
 	
156
-	private void visitFunctional(FunctionalMember member, String name) {
158
+	private void visitFunctional(DefinitionMember member, FunctionHeader header, String name) {
157 159
 		NativeTag nativeTag = member.getTag(NativeTag.class);
158 160
 		JavaMethod method = null;
159 161
 		if (nativeTag != null && nativeClass != null)
160 162
 			method = nativeClass.getMethod(nativeTag.value);
161 163
 		if (method == null)
162
-			method = new JavaMethod(cls, getKind(member), name, true, context.getMethodDescriptor(member.header), JavaModifiers.getJavaModifiers(member.modifiers)); 
164
+			method = new JavaMethod(cls, getKind(member), name, true, context.getMethodDescriptor(header), JavaModifiers.getJavaModifiers(member.modifiers), header.getReturnType() instanceof GenericTypeID); 
163 165
 		
164 166
 		if (method.compile) {
165 167
 			if (DEBUG_EMPTY && cls.empty)

+ 6
- 0
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/ExpressionHoistingChecker.java Vedi File

@@ -33,6 +33,7 @@ import org.openzen.zenscript.codemodel.expression.ConstantStringExpression;
33 33
 import org.openzen.zenscript.codemodel.expression.ConstantUIntExpression;
34 34
 import org.openzen.zenscript.codemodel.expression.ConstantULongExpression;
35 35
 import org.openzen.zenscript.codemodel.expression.ConstantUShortExpression;
36
+import org.openzen.zenscript.codemodel.expression.ConstantUSizeExpression;
36 37
 import org.openzen.zenscript.codemodel.expression.ConstructorSuperCallExpression;
37 38
 import org.openzen.zenscript.codemodel.expression.ConstructorThisCallExpression;
38 39
 import org.openzen.zenscript.codemodel.expression.EnumConstantExpression;
@@ -223,6 +224,11 @@ public class ExpressionHoistingChecker implements ExpressionVisitor<Boolean> {
223 224
 		return false;
224 225
 	}
225 226
 
227
+	@Override
228
+	public Boolean visitConstantUSize(ConstantUSizeExpression expression) {
229
+		return false;
230
+	}
231
+
226 232
 	@Override
227 233
 	public Boolean visitConstructorThisCall(ConstructorThisCallExpression expression) {
228 234
 		return true;

+ 3
- 4
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/FormattingUtils.java Vedi File

@@ -7,7 +7,6 @@ package org.openzen.zenscript.javasource;
7 7
 
8 8
 import org.openzen.zenscript.codemodel.FunctionHeader;
9 9
 import org.openzen.zenscript.codemodel.FunctionParameter;
10
-import org.openzen.zenscript.codemodel.Modifiers;
11 10
 import org.openzen.zenscript.codemodel.expression.CallArguments;
12 11
 import org.openzen.zenscript.codemodel.expression.Expression;
13 12
 import org.openzen.zenscript.codemodel.generic.GenericParameterBound;
@@ -39,15 +38,15 @@ public class FormattingUtils {
39 38
 			
40 39
 			if (!settings.showAnyInFunctionHeaders || parameter.type != BasicTypeID.UNDETERMINED) {
41 40
 				result.append(" as ");
42
-				result.append(header.returnType.accept(typeFormatter));
41
+				result.append(header.getReturnType().accept(typeFormatter));
43 42
 			}
44 43
 			
45 44
 			parameterIndex++;
46 45
 		}
47 46
 		result.append(")");
48
-		if (!settings.showAnyInFunctionHeaders || header.returnType != BasicTypeID.UNDETERMINED) {
47
+		if (!settings.showAnyInFunctionHeaders || header.getReturnType() != BasicTypeID.UNDETERMINED) {
49 48
 			result.append(" as ");
50
-			result.append(header.returnType.accept(typeFormatter));
49
+			result.append(header.getReturnType().accept(typeFormatter));
51 50
 		}
52 51
 	}
53 52
 	

+ 1
- 2
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaDefinitionVisitor.java Vedi File

@@ -190,8 +190,7 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<Void> {
190 190
 				output.append(",\n");
191 191
 			}
192 192
 			output.append("\t").append(constant.name);
193
-			if (constant.constructor != null) {
194
-				
193
+			if (constant.constructor != null && constant.constructor.arguments.arguments.length > 0) {
195 194
 				output.append("(");
196 195
 				boolean first = true;
197 196
 				for (Expression argument : constant.constructor.arguments.arguments) {

+ 4
- 4
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaExpansionMemberCompiler.java Vedi File

@@ -16,7 +16,7 @@ import org.openzen.zenscript.codemodel.member.CallerMember;
16 16
 import org.openzen.zenscript.codemodel.member.CasterMember;
17 17
 import org.openzen.zenscript.codemodel.member.ConstMember;
18 18
 import org.openzen.zenscript.codemodel.member.ConstructorMember;
19
-import org.openzen.zenscript.codemodel.member.CustomIteratorMember;
19
+import org.openzen.zenscript.codemodel.member.IteratorMember;
20 20
 import org.openzen.zenscript.codemodel.member.DefinitionMember;
21 21
 import org.openzen.zenscript.codemodel.member.DestructorMember;
22 22
 import org.openzen.zenscript.codemodel.member.FieldMember;
@@ -71,7 +71,7 @@ public class JavaExpansionMemberCompiler extends BaseMemberCompiler {
71 71
 		else
72 72
 			JavaSourceUtils.formatTypeParameters(scope.typeVisitor, output, expansionTypeParameters, header.typeParameters);
73 73
 		
74
-		output.append(header.returnType.accept(scope.typeVisitor));
74
+		output.append(header.getReturnType().accept(scope.typeVisitor));
75 75
 		output.append(" ");
76 76
 		output.append(method.name);
77 77
 		formatParameters(member.isStatic(), expansionTypeParameters, header);
@@ -140,7 +140,7 @@ public class JavaExpansionMemberCompiler extends BaseMemberCompiler {
140 140
 
141 141
 	@Override
142 142
 	public Void visitGetter(GetterMember member) {
143
-		compileMethod(member, member.header, member.body);
143
+		compileMethod(member, new FunctionHeader(member.type), member.body);
144 144
 		return null;
145 145
 	}
146 146
 
@@ -163,7 +163,7 @@ public class JavaExpansionMemberCompiler extends BaseMemberCompiler {
163 163
 	}
164 164
 
165 165
 	@Override
166
-	public Void visitCustomIterator(CustomIteratorMember member) {
166
+	public Void visitCustomIterator(IteratorMember member) {
167 167
 		compileMethod(member, new FunctionHeader(scope.semanticScope.getTypeRegistry().getIterator(member.getLoopVariableTypes())), member.body);
168 168
 		return null;
169 169
 	}

+ 4
- 4
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaMemberCompiler.java Vedi File

@@ -19,7 +19,7 @@ import org.openzen.zenscript.codemodel.member.CallerMember;
19 19
 import org.openzen.zenscript.codemodel.member.CasterMember;
20 20
 import org.openzen.zenscript.codemodel.member.ConstMember;
21 21
 import org.openzen.zenscript.codemodel.member.ConstructorMember;
22
-import org.openzen.zenscript.codemodel.member.CustomIteratorMember;
22
+import org.openzen.zenscript.codemodel.member.IteratorMember;
23 23
 import org.openzen.zenscript.codemodel.member.DefinitionMember;
24 24
 import org.openzen.zenscript.codemodel.member.DestructorMember;
25 25
 import org.openzen.zenscript.codemodel.member.FieldMember;
@@ -93,7 +93,7 @@ public class JavaMemberCompiler extends BaseMemberCompiler {
93 93
 		
94 94
 		modifiers(member.modifiers);
95 95
 		JavaSourceUtils.formatTypeParameters(scope.typeVisitor, output, header.typeParameters, true);
96
-		output.append(header.returnType.accept(scope.typeVisitor));
96
+		output.append(header.getReturnType().accept(scope.typeVisitor));
97 97
 		output.append(" ");
98 98
 		output.append(method.name);
99 99
 		formatParameters(member.isStatic(), header);
@@ -186,7 +186,7 @@ public class JavaMemberCompiler extends BaseMemberCompiler {
186 186
 
187 187
 	@Override
188 188
 	public Void visitGetter(GetterMember member) {
189
-		compileMethod(member, member.header, member.body);
189
+		compileMethod(member, new FunctionHeader(member.type), member.body);
190 190
 		return null;
191 191
 	}
192 192
 
@@ -209,7 +209,7 @@ public class JavaMemberCompiler extends BaseMemberCompiler {
209 209
 	}
210 210
 
211 211
 	@Override
212
-	public Void visitCustomIterator(CustomIteratorMember member) {
212
+	public Void visitCustomIterator(IteratorMember member) {
213 213
 		compileMethod(member, new FunctionHeader(scope.semanticScope.getTypeRegistry().getIterator(member.getLoopVariableTypes())), member.body);
214 214
 		return null;
215 215
 	}

+ 58
- 6
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceExpressionFormatter.java Vedi File

@@ -40,6 +40,7 @@ import org.openzen.zenscript.codemodel.expression.ConstantStringExpression;
40 40
 import org.openzen.zenscript.codemodel.expression.ConstantUIntExpression;
41 41
 import org.openzen.zenscript.codemodel.expression.ConstantULongExpression;
42 42
 import org.openzen.zenscript.codemodel.expression.ConstantUShortExpression;
43
+import org.openzen.zenscript.codemodel.expression.ConstantUSizeExpression;
43 44
 import org.openzen.zenscript.codemodel.expression.ConstructorSuperCallExpression;
44 45
 import org.openzen.zenscript.codemodel.expression.ConstructorThisCallExpression;
45 46
 import org.openzen.zenscript.codemodel.expression.EnumConstantExpression;
@@ -95,7 +96,6 @@ import org.openzen.zenscript.formattershared.StatementFormattingTarget;
95 96
 import org.openzen.zenscript.javasource.scope.JavaSourceStatementScope;
96 97
 import org.openzen.zenscript.javashared.JavaClass;
97 98
 import org.openzen.zenscript.javashared.JavaField;
98
-import org.openzen.zenscript.javashared.JavaNativeTranslation;
99 99
 import org.openzen.zenscript.javashared.JavaNativeTranslator;
100 100
 import org.openzen.zenscript.javashared.JavaMethod;
101 101
 import org.openzen.zenscript.javashared.JavaVariantOption;
@@ -362,6 +362,11 @@ public class JavaSourceExpressionFormatter implements ExpressionVisitor<Expressi
362 362
 		return new ExpressionString("(short)" + Integer.toString(expression.value), JavaOperator.CAST);
363 363
 	}
364 364
 
365
+	@Override
366
+	public ExpressionString visitConstantUSize(ConstantUSizeExpression expression) {
367
+		return new ExpressionString(Integer.toString((int)expression.value), JavaOperator.CAST);
368
+	}
369
+
365 370
 	@Override
366 371
 	public ExpressionString visitConstructorThisCall(ConstructorThisCallExpression expression) {
367 372
 		StringBuilder result = new StringBuilder();
@@ -539,6 +544,9 @@ public class JavaSourceExpressionFormatter implements ExpressionVisitor<Expressi
539 544
 
540 545
 	@Override
541 546
 	public ExpressionString visitNull(NullExpression expression) {
547
+		if (expression.type.withoutOptional() == BasicTypeID.USIZE)
548
+			return new ExpressionString("-1", JavaOperator.PRIMARY); // usize? null = -1
549
+		
542 550
 		return new ExpressionString("null", JavaOperator.PRIMARY);
543 551
 	}
544 552
 
@@ -1044,6 +1052,21 @@ public class JavaSourceExpressionFormatter implements ExpressionVisitor<Expressi
1044 1052
 			case ULONG_COUNT_HIGH_ZEROES: return callAsStatic("Long.numberOfLeadingZeros", call);
1045 1053
 			case ULONG_COUNT_LOW_ONES: return new ExpressionString("Long.numberOfTrailingZeros(~" + call.target.accept(this).value + ")", JavaOperator.CALL);
1046 1054
 			case ULONG_COUNT_HIGH_ONES: return new ExpressionString("Long.numberOfLeadingZeros(~" + call.target.accept(this).value + ")", JavaOperator.CALL);
1055
+			case USIZE_NOT: return unaryPrefix(call, JavaOperator.INVERT);
1056
+			case USIZE_ADD_USIZE: return binary(call, JavaOperator.ADD);
1057
+			case USIZE_SUB_USIZE: return binary(call, JavaOperator.SUB);
1058
+			case USIZE_MUL_USIZE: return binary(call, JavaOperator.MUL);
1059
+			case USIZE_DIV_USIZE: return binary(call, JavaOperator.DIV);
1060
+			case USIZE_MOD_USIZE: return binary(call, JavaOperator.MOD);
1061
+			case USIZE_AND_USIZE: return binary(call, JavaOperator.AND);
1062
+			case USIZE_OR_USIZE: return binary(call, JavaOperator.OR);
1063
+			case USIZE_XOR_USIZE: return binary(call, JavaOperator.XOR);
1064
+			case USIZE_SHL: return binary(call, JavaOperator.SHL);
1065
+			case USIZE_SHR: return binary(call, JavaOperator.USHR);
1066
+			case USIZE_COUNT_LOW_ZEROES: return callAsStatic("Integer.numberOfTrailingZeros", call);
1067
+			case USIZE_COUNT_HIGH_ZEROES: return callAsStatic("Integer.numberOfLeadingZeros", call);
1068
+			case USIZE_COUNT_LOW_ONES: return new ExpressionString("Integer.numberOfTrailingZeros(~" + call.target.accept(this).value + ")", JavaOperator.CALL);
1069
+			case USIZE_COUNT_HIGH_ONES: return new ExpressionString("Integer.numberOfLeadingZeros(~" + call.target.accept(this).value + ")", JavaOperator.CALL);
1047 1070
 			case FLOAT_NEG: return unaryPrefix(call, JavaOperator.NEG);
1048 1071
 			case FLOAT_ADD_FLOAT: return binary(call, JavaOperator.ADD);
1049 1072
 			case FLOAT_SUB_FLOAT: return binary(call, JavaOperator.SUB);
@@ -1148,8 +1171,12 @@ public class JavaSourceExpressionFormatter implements ExpressionVisitor<Expressi
1148 1171
 			case FUNCTION_NOTSAME: return binary(call, JavaOperator.NOTEQUALS);
1149 1172
 			case OBJECT_SAME: return binary(call, JavaOperator.EQUALS);
1150 1173
 			case OBJECT_NOTSAME: return binary(call, JavaOperator.NOTEQUALS);
1151
-			case OPTIONAL_IS_NULL: return call.target.accept(this).unaryPostfix(JavaOperator.EQUALS, " == null");
1152
-			case OPTIONAL_IS_NOT_NULL: return call.target.accept(this).unaryPostfix(JavaOperator.NOTEQUALS, " != null");
1174
+			case OPTIONAL_IS_NULL: return call.target.type.withoutOptional() == BasicTypeID.USIZE
1175
+					? call.target.accept(this).unaryPostfix(JavaOperator.NOTEQUALS, " < 0")
1176
+					: call.target.accept(this).unaryPostfix(JavaOperator.EQUALS, " == null");
1177
+			case OPTIONAL_IS_NOT_NULL: return call.target.type.withoutOptional() == BasicTypeID.USIZE
1178
+					? call.target.accept(this).unaryPostfix(JavaOperator.NOTEQUALS, " >= 0")
1179
+					: call.target.accept(this).unaryPostfix(JavaOperator.NOTEQUALS, " != null");
1153 1180
 			case AUTOOP_NOTEQUALS:
1154 1181
 				throw new UnsupportedOperationException("Not yet supported!");
1155 1182
 		}
@@ -1168,8 +1195,12 @@ public class JavaSourceExpressionFormatter implements ExpressionVisitor<Expressi
1168 1195
 			case SHORT_PARSE_WITH_BASE: return callStatic("Short.parseShort", call);
1169 1196
 			case USHORT_PARSE: return callStatic("Integer.parseShort", call);
1170 1197
 			case USHORT_PARSE_WITH_BASE: return callStatic("Integer.parseShort", call);
1171
-			case INT_PARSE: return callStatic("Integer.parseInt", call);
1172
-			case INT_PARSE_WITH_BASE: return callStatic("Integer.parseInt", call);
1198
+			case INT_PARSE:
1199
+			case USIZE_PARSE:
1200
+				return callStatic("Integer.parseInt", call);
1201
+			case INT_PARSE_WITH_BASE:
1202
+			case USIZE_PARSE_WITH_BASE:
1203
+				return callStatic("Integer.parseInt", call);
1173 1204
 			case UINT_PARSE: return callStatic("Integer.parseUnsignedInt", call);
1174 1205
 			case UINT_PARSE_WITH_BASE: return callStatic("Integer.parseUnsignedInt", call);
1175 1206
 			case LONG_PARSE: return callStatic("Long.parseLong", call);
@@ -1197,7 +1228,9 @@ public class JavaSourceExpressionFormatter implements ExpressionVisitor<Expressi
1197 1228
 					call.left.accept(this).unaryPostfix(JavaOperator.AND_FFFF),
1198 1229
 					call.right.accept(this).unaryPostfix(JavaOperator.AND_FFFF),
1199 1230
 					call.comparison);
1200
-			case INT_COMPARE: return compare(call.left, call.right, call.comparison);
1231
+			case INT_COMPARE:
1232
+			case USIZE_COMPARE:
1233
+				return compare(call.left, call.right, call.comparison);
1201 1234
 			case UINT_COMPARE: return compare(callAsStatic("Integer.compareUnsigned", call.left, call.right), call.comparison);
1202 1235
 			case LONG_COMPARE: return compare(call.left, call.right, call.comparison);
1203 1236
 			case ULONG_COMPARE: return compare(callAsStatic("Long.compareUnsigned", call.left, call.right), call.comparison);
@@ -1221,18 +1254,23 @@ public class JavaSourceExpressionFormatter implements ExpressionVisitor<Expressi
1221 1254
 		switch (builtin) {
1222 1255
 			case INT_HIGHEST_ONE_BIT:
1223 1256
 			case UINT_HIGHEST_ONE_BIT:
1257
+			case USIZE_HIGHEST_ONE_BIT:
1224 1258
 				return callAsStatic("Integer.highestOneBit", call);
1225 1259
 			case INT_LOWEST_ONE_BIT:
1226 1260
 			case UINT_LOWEST_ONE_BIT:
1261
+			case USIZE_LOWEST_ONE_BIT:
1227 1262
 				return callAsStatic("Integer.lowestOneBit", call);
1228 1263
 			case INT_HIGHEST_ZERO_BIT:
1229 1264
 			case UINT_HIGHEST_ZERO_BIT:
1265
+			case USIZE_HIGHEST_ZERO_BIT:
1230 1266
 				return new ExpressionString("Integer.highestOneBit(~" + call.target.accept(this).value + ")", JavaOperator.CALL);
1231 1267
 			case INT_LOWEST_ZERO_BIT:
1232 1268
 			case UINT_LOWEST_ZERO_BIT:
1269
+			case USIZE_LOWEST_ZERO_BIT:
1233 1270
 				return new ExpressionString("Integer.lowestOneBit(~" + call.target.accept(this).value + ")", JavaOperator.CALL);
1234 1271
 			case INT_BIT_COUNT:
1235 1272
 			case UINT_BIT_COUNT:
1273
+			case USIZE_BIT_COUNT:
1236 1274
 				return callAsStatic("Integer.bitCount", call);
1237 1275
 			case LONG_HIGHEST_ONE_BIT:
1238 1276
 			case ULONG_HIGHEST_ONE_BIT:
@@ -1321,6 +1359,9 @@ public class JavaSourceExpressionFormatter implements ExpressionVisitor<Expressi
1321 1359
 			case LONG_GET_MAX_VALUE: return new ExpressionString("Long.MAX_VALUE", JavaOperator.MEMBER);
1322 1360
 			case ULONG_GET_MIN_VALUE: return new ExpressionString("0", JavaOperator.PRIMARY);
1323 1361
 			case ULONG_GET_MAX_VALUE: return new ExpressionString("-1", JavaOperator.PRIMARY);
1362
+			case USIZE_GET_MIN_VALUE: return new ExpressionString("0", JavaOperator.PRIMARY);
1363
+			case USIZE_GET_MAX_VALUE: return new ExpressionString("Integer.MAX_VALUE", JavaOperator.MEMBER);
1364
+			case USIZE_BITS: return new ExpressionString("32", JavaOperator.PRIMARY);
1324 1365
 			case FLOAT_GET_MIN_VALUE: return new ExpressionString("Float.MIN_VALUE", JavaOperator.MEMBER);
1325 1366
 			case FLOAT_GET_MAX_VALUE: return new ExpressionString("Float.MAX_VALUE", JavaOperator.MEMBER);
1326 1367
 			case DOUBLE_GET_MIN_VALUE: return new ExpressionString("Double.MIN_VALUE", JavaOperator.MEMBER);
@@ -1342,6 +1383,7 @@ public class JavaSourceExpressionFormatter implements ExpressionVisitor<Expressi
1342 1383
 			case BYTE_TO_USHORT: return castPostfix(cast, JavaOperator.AND_FF);
1343 1384
 			case BYTE_TO_INT: return castPostfix(cast, JavaOperator.AND_FF);
1344 1385
 			case BYTE_TO_UINT: return castPostfix(cast, JavaOperator.AND_FF);
1386
+			case BYTE_TO_USIZE: return castPostfix(cast, JavaOperator.AND_FF);
1345 1387
 			case BYTE_TO_LONG: return castPostfix(cast, JavaOperator.AND_FFL);
1346 1388
 			case BYTE_TO_ULONG: return castPostfix(cast, JavaOperator.AND_FFL);
1347 1389
 			case BYTE_TO_FLOAT: cast(castPostfix(cast, JavaOperator.AND_FF), "float");
@@ -1353,6 +1395,7 @@ public class JavaSourceExpressionFormatter implements ExpressionVisitor<Expressi
1353 1395
 			case SBYTE_TO_USHORT: return castImplicit(cast, "int");
1354 1396
 			case SBYTE_TO_INT: return castImplicit(cast, "int");
1355 1397
 			case SBYTE_TO_UINT: return castImplicit(cast, "int");
1398
+			case SBYTE_TO_USIZE: return castImplicit(cast, "int");
1356 1399
 			case SBYTE_TO_LONG: return castImplicit(cast, "long");
1357 1400
 			case SBYTE_TO_ULONG: return castImplicit(cast, "long");
1358 1401
 			case SBYTE_TO_FLOAT: return castImplicit(cast, "float");
@@ -1364,6 +1407,7 @@ public class JavaSourceExpressionFormatter implements ExpressionVisitor<Expressi
1364 1407
 			case SHORT_TO_USHORT: return castImplicit(cast, "int");
1365 1408
 			case SHORT_TO_INT: return castImplicit(cast, "int");
1366 1409
 			case SHORT_TO_UINT: return castImplicit(cast, "int");
1410
+			case SHORT_TO_USIZE: return castImplicit(cast, "int");
1367 1411
 			case SHORT_TO_LONG: return castImplicit(cast, "long");
1368 1412
 			case SHORT_TO_ULONG: return castImplicit(cast, "long");
1369 1413
 			case SHORT_TO_FLOAT: return castImplicit(cast, "float");
@@ -1377,6 +1421,7 @@ public class JavaSourceExpressionFormatter implements ExpressionVisitor<Expressi
1377 1421
 			case USHORT_TO_UINT: return castPostfix(cast, JavaOperator.AND_FFFF);
1378 1422
 			case USHORT_TO_LONG: return castPostfix(cast, JavaOperator.AND_FFFFL);
1379 1423
 			case USHORT_TO_ULONG: return castPostfix(cast, JavaOperator.AND_FFFFL);
1424
+			case USHORT_TO_USIZE: return castPostfix(cast, JavaOperator.AND_FFFF);
1380 1425
 			case USHORT_TO_FLOAT: return cast.isImplicit ? cast.target.accept(this) : cast(castPostfix(cast, JavaOperator.AND_FFFF), "float");
1381 1426
 			case USHORT_TO_DOUBLE: return cast.isImplicit ? cast.target.accept(this) : cast(castPostfix(cast, JavaOperator.AND_FFFF), "double");
1382 1427
 			case USHORT_TO_CHAR: return castImplicit(cast, "char");
@@ -1392,6 +1437,7 @@ public class JavaSourceExpressionFormatter implements ExpressionVisitor<Expressi
1392 1437
 			case INT_TO_DOUBLE: return castImplicit(cast, "double");
1393 1438
 			case INT_TO_CHAR: return cast(cast, "char");
1394 1439
 			case INT_TO_STRING: return callStatic("Integer.toString", cast.target);
1440
+			case INT_TO_USIZE: return cast.target.accept(this);
1395 1441
 			case UINT_TO_BYTE: return cast.target.accept(this);
1396 1442
 			case UINT_TO_SBYTE: return cast(cast, "byte");
1397 1443
 			case UINT_TO_SHORT: return cast(cast, "short");
@@ -1399,6 +1445,7 @@ public class JavaSourceExpressionFormatter implements ExpressionVisitor<Expressi
1399 1445
 			case UINT_TO_INT: return cast.target.accept(this);
1400 1446
 			case UINT_TO_LONG: return castImplicit(cast, "long");
1401 1447
 			case UINT_TO_ULONG: return castPostfix(cast, JavaOperator.AND_8FL);
1448
+			case UINT_TO_USIZE: return cast.target.accept(this);
1402 1449
 			case UINT_TO_FLOAT: return cast(castPostfix(cast, JavaOperator.AND_8FL), "float");
1403 1450
 			case UINT_TO_DOUBLE: return cast(castPostfix(cast, JavaOperator.AND_8FL), "double");
1404 1451
 			case UINT_TO_CHAR: return cast(cast, "char");
@@ -1410,6 +1457,7 @@ public class JavaSourceExpressionFormatter implements ExpressionVisitor<Expressi
1410 1457
 			case LONG_TO_INT: return cast(cast, "int");
1411 1458
 			case LONG_TO_UINT: return cast(cast, "int");
1412 1459
 			case LONG_TO_ULONG: return cast.target.accept(this);
1460
+			case LONG_TO_USIZE: return cast(cast, "int");
1413 1461
 			case LONG_TO_FLOAT: return castImplicit(cast, "float");
1414 1462
 			case LONG_TO_DOUBLE: return castImplicit(cast, "double");
1415 1463
 			case LONG_TO_CHAR: return cast(cast, "char");
@@ -1421,6 +1469,7 @@ public class JavaSourceExpressionFormatter implements ExpressionVisitor<Expressi
1421 1469
 			case ULONG_TO_INT: return cast(cast, "int");
1422 1470
 			case ULONG_TO_UINT: return cast(cast, "int");
1423 1471
 			case ULONG_TO_LONG: return cast.target.accept(this);
1472
+			case ULONG_TO_USIZE: return cast(cast, "int");
1424 1473
 			case ULONG_TO_FLOAT: return castImplicit(cast, "float"); // TODO: this is incorrect!
1425 1474
 			case ULONG_TO_DOUBLE: return castImplicit(cast, "double"); // TODO: this is incorrect!
1426 1475
 			case ULONG_TO_CHAR: return cast(cast, "char");
@@ -1433,6 +1482,7 @@ public class JavaSourceExpressionFormatter implements ExpressionVisitor<Expressi
1433 1482
 			case FLOAT_TO_UINT: return cast(cast, "int");
1434 1483
 			case FLOAT_TO_LONG: return cast(cast, "long");
1435 1484
 			case FLOAT_TO_ULONG: return cast(cast, "long");
1485
+			case FLOAT_TO_USIZE: return cast(cast, "int");
1436 1486
 			case FLOAT_TO_DOUBLE: return castImplicit(cast, "double");
1437 1487
 			case FLOAT_TO_STRING: return callStatic("Float.toString", cast.target);
1438 1488
 			case DOUBLE_TO_BYTE: return cast(cast, "int");
@@ -1443,6 +1493,7 @@ public class JavaSourceExpressionFormatter implements ExpressionVisitor<Expressi
1443 1493
 			case DOUBLE_TO_UINT: return cast(cast, "int");
1444 1494
 			case DOUBLE_TO_LONG: return cast(cast, "long");
1445 1495
 			case DOUBLE_TO_ULONG: return cast(cast, "long");
1496
+			case DOUBLE_TO_USIZE: return cast(cast, "int");
1446 1497
 			case DOUBLE_TO_FLOAT: return cast(cast, "float");
1447 1498
 			case DOUBLE_TO_STRING: return callStatic("Double.toString", cast.target);
1448 1499
 			case CHAR_TO_BYTE: return cast.target.accept(this);
@@ -1453,6 +1504,7 @@ public class JavaSourceExpressionFormatter implements ExpressionVisitor<Expressi
1453 1504
 			case CHAR_TO_UINT: return castImplicit(cast, "int");
1454 1505
 			case CHAR_TO_LONG: return castImplicit(cast, "long");
1455 1506
 			case CHAR_TO_ULONG: return castImplicit(cast, "long");
1507
+			case CHAR_TO_USIZE: return castImplicit(cast, "int");
1456 1508
 			case CHAR_TO_STRING: return callStatic("Character.toString", cast.target);
1457 1509
 			case ENUM_TO_STRING: return cast.target.accept(this).unaryPostfix(JavaOperator.TOSTRING);
1458 1510
 		}

+ 0
- 0
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceFile.java Vedi File


Dato che sono stati cambiati molti file in questo diff, alcuni di essi non verranno mostrati

Loading…
Annulla
Salva