Selaa lähdekoodia

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

kindlich 6 vuotta sitten
vanhempi
commit
2551c899d0
No known key found for this signature in database
100 muutettua tiedostoa jossa 1371 lisäystä ja 1720 poistoa
  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 Näytä tiedosto

36
 import org.openzen.zenscript.codemodel.expression.ConstantUIntExpression;
36
 import org.openzen.zenscript.codemodel.expression.ConstantUIntExpression;
37
 import org.openzen.zenscript.codemodel.expression.ConstantULongExpression;
37
 import org.openzen.zenscript.codemodel.expression.ConstantULongExpression;
38
 import org.openzen.zenscript.codemodel.expression.ConstantUShortExpression;
38
 import org.openzen.zenscript.codemodel.expression.ConstantUShortExpression;
39
+import org.openzen.zenscript.codemodel.expression.ConstantUSizeExpression;
39
 import org.openzen.zenscript.codemodel.expression.ConstructorSuperCallExpression;
40
 import org.openzen.zenscript.codemodel.expression.ConstructorSuperCallExpression;
40
 import org.openzen.zenscript.codemodel.expression.ConstructorThisCallExpression;
41
 import org.openzen.zenscript.codemodel.expression.ConstructorThisCallExpression;
41
 import org.openzen.zenscript.codemodel.expression.EnumConstantExpression;
42
 import org.openzen.zenscript.codemodel.expression.EnumConstantExpression;
391
 	public ExpressionString visitConstantShort(ConstantShortExpression expression) {
392
 	public ExpressionString visitConstantShort(ConstantShortExpression expression) {
392
 		return new ExpressionString(Integer.toString(expression.value) + " as short", ZenScriptOperator.CAST);
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
 	@Override
401
 	@Override
396
 	public ExpressionString visitConstantString(ConstantStringExpression expression) {
402
 	public ExpressionString visitConstantString(ConstantStringExpression expression) {
402
 
408
 
403
 	@Override
409
 	@Override
404
 	public ExpressionString visitConstantUInt(ConstantUIntExpression expression) {
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
 	@Override
414
 	@Override
409
 	public ExpressionString visitConstantULong(ConstantULongExpression expression) {
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
 	@Override
419
 	@Override
414
 	public ExpressionString visitConstantUShort(ConstantUShortExpression expression) {
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
 	@Override
424
 	@Override

+ 3
- 3
CodeFormatter/src/main/java/org/openzen/zenscript/formatter/FormattingUtils.java Näytä tiedosto

80
 			
80
 			
81
 			if (!settings.showAnyInFunctionHeaders || parameter.type != BasicTypeID.UNDETERMINED) {
81
 			if (!settings.showAnyInFunctionHeaders || parameter.type != BasicTypeID.UNDETERMINED) {
82
 				result.append(" as ");
82
 				result.append(" as ");
83
-				result.append(header.returnType.accept(typeFormatter));
83
+				result.append(header.getReturnType().accept(typeFormatter));
84
 			}
84
 			}
85
 			
85
 			
86
 			parameterIndex++;
86
 			parameterIndex++;
87
 		}
87
 		}
88
 		result.append(")");
88
 		result.append(")");
89
-		if (!settings.showAnyInFunctionHeaders || header.returnType != BasicTypeID.UNDETERMINED) {
89
+		if (!settings.showAnyInFunctionHeaders || header.getReturnType() != BasicTypeID.UNDETERMINED) {
90
 			result.append(" as ");
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 Näytä tiedosto

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

97
 
97
 
98
 	@Override
98
 	@Override
99
 	public String visitRange(RangeTypeID range) {
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
 	@Override
103
 	@Override

+ 17
- 5
CodeModel/src/main/java/org/openzen/zenscript/codemodel/FunctionHeader.java Näytä tiedosto

27
 	private static final FunctionParameter[] NO_PARAMETERS = new FunctionParameter[0];
27
 	private static final FunctionParameter[] NO_PARAMETERS = new FunctionParameter[0];
28
 	
28
 	
29
 	public final TypeParameter[] typeParameters;
29
 	public final TypeParameter[] typeParameters;
30
-	public ITypeID returnType;
30
+	private ITypeID returnType;
31
 	public final FunctionParameter[] parameters;
31
 	public final FunctionParameter[] parameters;
32
 	public final ITypeID thrownType;
32
 	public final ITypeID thrownType;
33
 	
33
 	
96
 		hasUnknowns = hasUnknowns(parameters, returnType);
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
 	public boolean isDenormalized() {
110
 	public boolean isDenormalized() {
100
 		if (returnType.getNormalized() != returnType)
111
 		if (returnType.getNormalized() != returnType)
101
 			return true;
112
 			return true;
321
 		return true;
332
 		return true;
322
 	}
333
 	}
323
 	
334
 	
324
-	public FunctionHeader withGenericArguments(GenericMapper mapper) {
335
+	public FunctionHeader withGenericArguments(GlobalTypeRegistry registry, GenericMapper mapper) {
325
 		if (typeParameters.length > 0) {
336
 		if (typeParameters.length > 0) {
326
 			Map<TypeParameter, ITypeID> innerMap = new HashMap<>();
337
 			Map<TypeParameter, ITypeID> innerMap = new HashMap<>();
327
 			for (TypeParameter parameter : typeParameters)
338
 			for (TypeParameter parameter : typeParameters)
328
 				innerMap.put(parameter, mapper.registry.getGeneric(parameter));
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
 		ITypeID returnType = this.returnType.instance(mapper);
344
 		ITypeID returnType = this.returnType.instance(mapper);
345
 		Map<TypeParameter, ITypeID> typeArguments = new HashMap<>();
356
 		Map<TypeParameter, ITypeID> typeArguments = new HashMap<>();
346
 		for (int i = 0; i < typeParameters.length; i++)
357
 		for (int i = 0; i < typeParameters.length; i++)
347
 			typeArguments.put(typeParameters[i], arguments[i]);
358
 			typeArguments.put(typeParameters[i], arguments[i]);
348
-		GenericMapper mapper = typeParameterMapping.getInner(typeArguments);
359
+		GenericMapper mapper = typeParameterMapping.getInner(registry, typeArguments);
349
 		
360
 		
350
 		ITypeID returnType = this.returnType.instance(mapper);
361
 		ITypeID returnType = this.returnType.instance(mapper);
351
 		FunctionParameter[] parameters = new FunctionParameter[this.parameters.length];
362
 		FunctionParameter[] parameters = new FunctionParameter[this.parameters.length];
410
 				result.append(", ");
421
 				result.append(", ");
411
 			result.append(parameters[i].toString());
422
 			result.append(parameters[i].toString());
412
 		}
423
 		}
413
-		result.append(")");
424
+		result.append(") as ");
425
+		result.append(returnType.toString());
414
 		return result.toString();
426
 		return result.toString();
415
 	}
427
 	}
416
 
428
 

+ 2
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/GenericMapper.java Näytä tiedosto

54
 	}
54
 	}
55
 	
55
 	
56
 	public FunctionHeader map(FunctionHeader original) {
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
 		Map<TypeParameter, ITypeID> resultMap = new HashMap<>(this.mapping);
61
 		Map<TypeParameter, ITypeID> resultMap = new HashMap<>(this.mapping);
62
 		resultMap.putAll(mapping);
62
 		resultMap.putAll(mapping);
63
 		return new GenericMapper(registry, resultMap);
63
 		return new GenericMapper(registry, resultMap);

+ 56
- 4
CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/AnnotationProcessor.java Näytä tiedosto

18
 import org.openzen.zenscript.codemodel.member.CasterMember;
18
 import org.openzen.zenscript.codemodel.member.CasterMember;
19
 import org.openzen.zenscript.codemodel.member.ConstMember;
19
 import org.openzen.zenscript.codemodel.member.ConstMember;
20
 import org.openzen.zenscript.codemodel.member.ConstructorMember;
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
 import org.openzen.zenscript.codemodel.member.DestructorMember;
22
 import org.openzen.zenscript.codemodel.member.DestructorMember;
23
 import org.openzen.zenscript.codemodel.member.FieldMember;
23
 import org.openzen.zenscript.codemodel.member.FieldMember;
24
 import org.openzen.zenscript.codemodel.member.FunctionalMember;
24
 import org.openzen.zenscript.codemodel.member.FunctionalMember;
32
 import org.openzen.zenscript.codemodel.member.SetterMember;
32
 import org.openzen.zenscript.codemodel.member.SetterMember;
33
 import org.openzen.zenscript.codemodel.member.StaticInitializerMember;
33
 import org.openzen.zenscript.codemodel.member.StaticInitializerMember;
34
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
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
 import org.openzen.zenscript.codemodel.scope.DefinitionScope;
37
 import org.openzen.zenscript.codemodel.scope.DefinitionScope;
36
 import org.openzen.zenscript.codemodel.scope.FileScope;
38
 import org.openzen.zenscript.codemodel.scope.FileScope;
37
 import org.openzen.zenscript.codemodel.scope.FunctionScope;
39
 import org.openzen.zenscript.codemodel.scope.FunctionScope;
130
 
132
 
131
 		@Override
133
 		@Override
132
 		public Void visitGetter(GetterMember member) {
134
 		public Void visitGetter(GetterMember member) {
133
-			return functional(member);
135
+			return getter(member);
134
 		}
136
 		}
135
 
137
 
136
 		@Override
138
 		@Override
137
 		public Void visitSetter(SetterMember member) {
139
 		public Void visitSetter(SetterMember member) {
138
-			return functional(member);
140
+			return setter(member);
139
 		}
141
 		}
140
 
142
 
141
 		@Override
143
 		@Override
149
 		}
151
 		}
150
 
152
 
151
 		@Override
153
 		@Override
152
-		public Void visitCustomIterator(CustomIteratorMember member) {
154
+		public Void visitCustomIterator(IteratorMember member) {
153
 			return functional(member);
155
 			return functional(member);
154
 		}
156
 		}
155
 
157
 
199
 			return null;
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
 		private void functional(FunctionalMember member, DefinitionMemberRef overrides) {
236
 		private void functional(FunctionalMember member, DefinitionMemberRef overrides) {
203
 			for (MemberAnnotation annotation : overrides.getAnnotations())
237
 			for (MemberAnnotation annotation : overrides.getAnnotations())
204
 				annotation.applyOnOverridingMethod(member, scope);
238
 				annotation.applyOnOverridingMethod(member, scope);
207
 				functional(member, overrides.getOverrides());
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 Näytä tiedosto

6
 package org.openzen.zenscript.codemodel.annotations;
6
 package org.openzen.zenscript.codemodel.annotations;
7
 
7
 
8
 import org.openzen.zenscript.codemodel.member.FunctionalMember;
8
 import org.openzen.zenscript.codemodel.member.FunctionalMember;
9
+import org.openzen.zenscript.codemodel.member.GetterMember;
9
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
10
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
11
+import org.openzen.zenscript.codemodel.member.SetterMember;
10
 import org.openzen.zenscript.codemodel.scope.BaseScope;
12
 import org.openzen.zenscript.codemodel.scope.BaseScope;
11
 
13
 
12
 /**
14
 /**
19
 	public void apply(IDefinitionMember member, BaseScope scope);
21
 	public void apply(IDefinitionMember member, BaseScope scope);
20
 	
22
 	
21
 	public void applyOnOverridingMethod(FunctionalMember member, BaseScope scope);
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 Näytä tiedosto

6
 package org.openzen.zenscript.codemodel.annotations;
6
 package org.openzen.zenscript.codemodel.annotations;
7
 
7
 
8
 import org.openzen.zenscript.codemodel.member.FunctionalMember;
8
 import org.openzen.zenscript.codemodel.member.FunctionalMember;
9
+import org.openzen.zenscript.codemodel.member.GetterMember;
9
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
10
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
11
+import org.openzen.zenscript.codemodel.member.SetterMember;
10
 import org.openzen.zenscript.codemodel.scope.BaseScope;
12
 import org.openzen.zenscript.codemodel.scope.BaseScope;
11
 
13
 
12
 /**
14
 /**
29
 	public void applyOnOverridingMethod(FunctionalMember member, BaseScope scope) {
31
 	public void applyOnOverridingMethod(FunctionalMember member, BaseScope scope) {
30
 		// not inherited
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 Näytä tiedosto

12
 import org.openzen.zenscript.codemodel.expression.ExpressionBuilder;
12
 import org.openzen.zenscript.codemodel.expression.ExpressionBuilder;
13
 import org.openzen.zenscript.codemodel.expression.PanicExpression;
13
 import org.openzen.zenscript.codemodel.expression.PanicExpression;
14
 import org.openzen.zenscript.codemodel.member.FunctionalMember;
14
 import org.openzen.zenscript.codemodel.member.FunctionalMember;
15
+import org.openzen.zenscript.codemodel.member.GetterMember;
15
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
16
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
17
+import org.openzen.zenscript.codemodel.member.SetterMember;
16
 import org.openzen.zenscript.codemodel.scope.BaseScope;
18
 import org.openzen.zenscript.codemodel.scope.BaseScope;
17
 import org.openzen.zenscript.codemodel.scope.ExpressionScope;
19
 import org.openzen.zenscript.codemodel.scope.ExpressionScope;
18
 import org.openzen.zenscript.codemodel.statement.BlockStatement;
20
 import org.openzen.zenscript.codemodel.statement.BlockStatement;
44
 
46
 
45
 	@Override
47
 	@Override
46
 	public void apply(IDefinitionMember member, BaseScope scope) {
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
 	@Override
58
 	@Override
51
 	public void applyOnOverridingMethod(FunctionalMember member, BaseScope scope) {
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
 		ExpressionScope expressionScope = new ExpressionScope(scope, BasicTypeID.BOOL);
77
 		ExpressionScope expressionScope = new ExpressionScope(scope, BasicTypeID.BOOL);
56
 		List<Statement> statements = new ArrayList<>();
78
 		List<Statement> statements = new ArrayList<>();
58
 		Expression inverseCondition = expressionBuilder.not(condition);
80
 		Expression inverseCondition = expressionBuilder.not(condition);
59
 		Statement throwStatement = new ExpressionStatement(position, new PanicExpression(position, BasicTypeID.VOID, message));
81
 		Statement throwStatement = new ExpressionStatement(position, new PanicExpression(position, BasicTypeID.VOID, message));
60
 		statements.add(new IfStatement(position, inverseCondition, throwStatement, null));
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
 		} else {
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 Näytä tiedosto

41
 			this.types = types;
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 Näytä tiedosto

21
 	public final FunctionHeader instancedHeader;
21
 	public final FunctionHeader instancedHeader;
22
 	
22
 	
23
 	public CallExpression(CodePosition position, Expression target, FunctionalMemberRef member, FunctionHeader instancedHeader, CallArguments arguments) {
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
 		this.target = target;
26
 		this.target = target;
27
 		this.member = member;
27
 		this.member = member;

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CallStaticExpression.java Näytä tiedosto

22
 	public final FunctionHeader instancedHeader;
22
 	public final FunctionHeader instancedHeader;
23
 	
23
 	
24
 	public CallStaticExpression(CodePosition position, ITypeID target, FunctionalMemberRef member, FunctionHeader instancedHeader, CallArguments arguments) {
24
 	public CallStaticExpression(CodePosition position, 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
 		this.member = member;
27
 		this.member = member;
28
 		this.target = target;
28
 		this.target = target;

+ 39
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantUSizeExpression.java Näytä tiedosto

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 Näytä tiedosto

66
 	
66
 	
67
 	public T visitConstantUShort(ConstantUShortExpression expression);
67
 	public T visitConstantUShort(ConstantUShortExpression expression);
68
 	
68
 	
69
+	public T visitConstantUSize(ConstantUSizeExpression expression);
70
+	
69
 	public T visitConstructorThisCall(ConstructorThisCallExpression expression);
71
 	public T visitConstructorThisCall(ConstructorThisCallExpression expression);
70
 	
72
 	
71
 	public T visitConstructorSuperCall(ConstructorSuperCallExpression expression);
73
 	public T visitConstructorSuperCall(ConstructorSuperCallExpression expression);

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/PostCallExpression.java Näytä tiedosto

22
 	public final FunctionHeader instancedHeader;
22
 	public final FunctionHeader instancedHeader;
23
 	
23
 	
24
 	public PostCallExpression(CodePosition position, Expression target, FunctionalMemberRef member, FunctionHeader instancedHeader) {
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
 		if (member.getOperator() != OperatorType.DECREMENT && member.getOperator() != OperatorType.INCREMENT)
27
 		if (member.getOperator() != OperatorType.DECREMENT && member.getOperator() != OperatorType.INCREMENT)
28
 			throw new IllegalArgumentException("Operator must be increment or decrement");
28
 			throw new IllegalArgumentException("Operator must be increment or decrement");

+ 9
- 3
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/RangeExpression.java Näytä tiedosto

9
 import org.openzen.zenscript.codemodel.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.scope.TypeScope;
10
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
10
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
11
 import org.openzen.zenscript.codemodel.type.ITypeID;
11
 import org.openzen.zenscript.codemodel.type.ITypeID;
12
+import org.openzen.zenscript.codemodel.type.RangeTypeID;
12
 
13
 
13
 /**
14
 /**
14
  *
15
  *
18
 	public final Expression from;
19
 	public final Expression from;
19
 	public final Expression to;
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
 		this.from = from;
25
 		this.from = from;
25
 		this.to = to;
26
 		this.to = to;
46
 
47
 
47
 	@Override
48
 	@Override
48
 	public Expression normalize(TypeScope scope) {
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 Näytä tiedosto

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

+ 0
- 26
CodeModel/src/main/java/org/openzen/zenscript/codemodel/iterator/ForeachIteratorVisitor.java Näytä tiedosto

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 Näytä tiedosto

6
 package org.openzen.zenscript.codemodel.member;
6
 package org.openzen.zenscript.codemodel.member;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zencode.shared.ConcatMap;
9
 import org.openzen.zenscript.codemodel.FunctionHeader;
10
 import org.openzen.zenscript.codemodel.FunctionHeader;
10
 import org.openzen.zenscript.codemodel.GenericMapper;
11
 import org.openzen.zenscript.codemodel.GenericMapper;
11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
13
+import org.openzen.zenscript.codemodel.Modifiers;
14
+import org.openzen.zenscript.codemodel.definition.EnumDefinition;
12
 import org.openzen.zenscript.codemodel.expression.ConstructorSuperCallExpression;
15
 import org.openzen.zenscript.codemodel.expression.ConstructorSuperCallExpression;
13
 import org.openzen.zenscript.codemodel.expression.ConstructorThisCallExpression;
16
 import org.openzen.zenscript.codemodel.expression.ConstructorThisCallExpression;
14
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
17
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
18
+import org.openzen.zenscript.codemodel.scope.TypeScope;
15
 import org.openzen.zenscript.codemodel.statement.BlockStatement;
19
 import org.openzen.zenscript.codemodel.statement.BlockStatement;
16
 import org.openzen.zenscript.codemodel.statement.ExpressionStatement;
20
 import org.openzen.zenscript.codemodel.statement.ExpressionStatement;
21
+import org.openzen.zenscript.codemodel.statement.LoopStatement;
17
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
22
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
18
 import org.openzen.zenscript.codemodel.type.member.BuiltinID;
23
 import org.openzen.zenscript.codemodel.type.member.BuiltinID;
19
 import org.openzen.zenscript.codemodel.type.member.TypeMemberPriority;
24
 import org.openzen.zenscript.codemodel.type.member.TypeMemberPriority;
84
 	public DefinitionMemberRef getOverrides() {
89
 	public DefinitionMemberRef getOverrides() {
85
 		return null;
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 Näytä tiedosto

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

+ 15
- 18
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/GetterMember.java Näytä tiedosto

6
 package org.openzen.zenscript.codemodel.member;
6
 package org.openzen.zenscript.codemodel.member;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zencode.shared.ConcatMap;
9
 import org.openzen.zenscript.codemodel.FunctionHeader;
10
 import org.openzen.zenscript.codemodel.FunctionHeader;
10
 import org.openzen.zenscript.codemodel.GenericMapper;
11
 import org.openzen.zenscript.codemodel.GenericMapper;
11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
 import org.openzen.zenscript.codemodel.member.ref.GetterMemberRef;
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
 import org.openzen.zenscript.codemodel.statement.Statement;
16
 import org.openzen.zenscript.codemodel.statement.Statement;
14
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
17
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
15
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
18
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
21
  *
24
  *
22
  * @author Hoofdgebruiker
25
  * @author Hoofdgebruiker
23
  */
26
  */
24
-public class GetterMember extends FunctionalMember implements IPropertyMember {
27
+public class GetterMember extends PropertyMember {
25
 	public final String name;
28
 	public final String name;
26
-	public ITypeID type;
27
 	private GetterMemberRef overrides;
29
 	private GetterMemberRef overrides;
30
+	public Statement body = null;
28
 	
31
 	
29
 	public GetterMember(
32
 	public GetterMember(
30
 			CodePosition position,
33
 			CodePosition position,
33
 			String name,
36
 			String name,
34
 			ITypeID type,
37
 			ITypeID type,
35
 			BuiltinID builtin) {
38
 			BuiltinID builtin) {
36
-		super(position, definition, modifiers, new FunctionHeader(type), builtin);
39
+		super(position, definition, modifiers, type, builtin);
37
 		
40
 		
38
 		this.name = name;
41
 		this.name = name;
39
-		this.type = type;
40
 	}
42
 	}
41
 	
43
 	
42
-	@Override
43
 	public void setBody(Statement body) {
44
 	public void setBody(Statement body) {
44
-		super.setBody(body);
45
+		this.body = body;
45
 		
46
 		
46
 		if (type == BasicTypeID.UNDETERMINED)
47
 		if (type == BasicTypeID.UNDETERMINED)
47
 			type = body.getReturnType();
48
 			type = body.getReturnType();
48
 	}
49
 	}
49
 	
50
 	
50
 	@Override
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
 	@Override
56
 	@Override
81
 	public GetterMemberRef getOverrides() {
72
 	public GetterMemberRef getOverrides() {
82
 		return overrides;
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
 	public void setOverrides(GetterMemberRef override) {
82
 	public void setOverrides(GetterMemberRef override) {
86
 		this.overrides = override;
83
 		this.overrides = override;

+ 0
- 21
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/IIteratorMember.java Näytä tiedosto

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 Näytä tiedosto

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 Näytä tiedosto

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

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/MemberVisitor.java Näytä tiedosto

28
 	
28
 	
29
 	public T visitCaster(CasterMember member);
29
 	public T visitCaster(CasterMember member);
30
 	
30
 	
31
-	public T visitCustomIterator(CustomIteratorMember member);
31
+	public T visitCustomIterator(IteratorMember member);
32
 	
32
 	
33
 	public T visitCaller(CallerMember member);
33
 	public T visitCaller(CallerMember member);
34
 	
34
 	

+ 6
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/PropertyMember.java Näytä tiedosto

14
  *
14
  *
15
  * @author Hoofdgebruiker
15
  * @author Hoofdgebruiker
16
  */
16
  */
17
-public abstract class PropertyMember extends DefinitionMember implements IPropertyMember {
17
+public abstract class PropertyMember extends DefinitionMember {
18
 	public ITypeID type;
18
 	public ITypeID type;
19
 	public final BuiltinID builtin;
19
 	public final BuiltinID builtin;
20
 	
20
 	
25
 		this.builtin = builtin;
25
 		this.builtin = builtin;
26
 	}
26
 	}
27
 	
27
 	
28
-	@Override
29
 	public ITypeID getType() {
28
 	public ITypeID getType() {
30
 		return type;
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 Näytä tiedosto

14
 import org.openzen.zenscript.codemodel.member.ref.SetterMemberRef;
14
 import org.openzen.zenscript.codemodel.member.ref.SetterMemberRef;
15
 import org.openzen.zenscript.codemodel.scope.TypeScope;
15
 import org.openzen.zenscript.codemodel.scope.TypeScope;
16
 import org.openzen.zenscript.codemodel.statement.LoopStatement;
16
 import org.openzen.zenscript.codemodel.statement.LoopStatement;
17
+import org.openzen.zenscript.codemodel.statement.Statement;
17
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
18
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
18
 import org.openzen.zenscript.codemodel.type.ITypeID;
19
 import org.openzen.zenscript.codemodel.type.ITypeID;
19
 import org.openzen.zenscript.codemodel.type.member.BuiltinID;
20
 import org.openzen.zenscript.codemodel.type.member.BuiltinID;
24
  *
25
  *
25
  * @author Hoofdgebruiker
26
  * @author Hoofdgebruiker
26
  */
27
  */
27
-public class SetterMember extends FunctionalMember implements IPropertyMember {
28
-	public ITypeID type;
28
+public class SetterMember extends PropertyMember {
29
 	public final String name;
29
 	public final String name;
30
 	private SetterMemberRef overrides;
30
 	private SetterMemberRef overrides;
31
+	public Statement body;
32
+	public final FunctionParameter parameter;
31
 	
33
 	
32
 	public SetterMember(
34
 	public SetterMember(
33
 			CodePosition position,
35
 			CodePosition position,
40
 		super(position,
42
 		super(position,
41
 				definition,
43
 				definition,
42
 				modifiers,
44
 				modifiers,
43
-				new FunctionHeader(BasicTypeID.VOID, new FunctionParameter(type, "$")),
45
+				type,
44
 				builtin);
46
 				builtin);
45
 		
47
 		
46
-		this.type = type;
47
 		this.name = name;
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
 	@Override
56
 	@Override
88
 			body = body.normalize(scope, ConcatMap.empty(LoopStatement.class, LoopStatement.class));
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
 	public void setOverrides(SetterMemberRef overrides) {
87
 	public void setOverrides(SetterMemberRef overrides) {
92
 		this.overrides = overrides;
88
 		this.overrides = overrides;
93
 		
89
 		

+ 4
- 11
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/StaticInitializerMember.java Näytä tiedosto

7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
 import org.openzen.zencode.shared.ConcatMap;
9
 import org.openzen.zencode.shared.ConcatMap;
10
-import org.openzen.zencode.shared.Taggable;
11
 import org.openzen.zenscript.codemodel.GenericMapper;
10
 import org.openzen.zenscript.codemodel.GenericMapper;
11
+import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
 import org.openzen.zenscript.codemodel.annotations.MemberAnnotation;
12
 import org.openzen.zenscript.codemodel.annotations.MemberAnnotation;
13
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
13
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
14
 import org.openzen.zenscript.codemodel.scope.TypeScope;
14
 import org.openzen.zenscript.codemodel.scope.TypeScope;
22
  *
22
  *
23
  * @author Hoofdgebruiker
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
 	public Statement body;
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
 	@Override
32
 	@Override

+ 0
- 95
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/builtin/ArrayIteratorKeyValues.java Näytä tiedosto

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 Näytä tiedosto

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 Näytä tiedosto

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 Näytä tiedosto

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 Näytä tiedosto

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 Näytä tiedosto

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

+ 5
- 6
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/IteratorMemberRef.java Näytä tiedosto

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

+ 3
- 3
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/PropertyRef.java Näytä tiedosto

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

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/SetterMemberRef.java Näytä tiedosto

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

+ 3
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/VariantOptionRef.java Näytä tiedosto

14
  */
14
  */
15
 public class VariantOptionRef {
15
 public class VariantOptionRef {
16
 	private final VariantDefinition.Option option;
16
 	private final VariantDefinition.Option option;
17
+	public final ITypeID variant;
17
 	public final ITypeID[] types;
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
 		this.option = option;
21
 		this.option = option;
22
+		this.variant = variant;
21
 		this.types = types;
23
 		this.types = types;
22
 	}
24
 	}
23
 	
25
 	

+ 73
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/partial/PartialVariantOptionExpression.java Näytä tiedosto

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 Näytä tiedosto

76
 		}
76
 		}
77
 		
77
 		
78
 		members = withMembers ? outer.getMemberCache().get(type) : null;
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
 	public void addInnerType(String name, Supplier<HighLevelDefinition> innerType) {
82
 	public void addInnerType(String name, Supplier<HighLevelDefinition> innerType) {

+ 2
- 8
CodeModel/src/main/java/org/openzen/zenscript/codemodel/scope/ExpressionScope.java Näytä tiedosto

22
 import org.openzen.zenscript.codemodel.partial.IPartialExpression;
22
 import org.openzen.zenscript.codemodel.partial.IPartialExpression;
23
 import org.openzen.zenscript.codemodel.statement.LoopStatement;
23
 import org.openzen.zenscript.codemodel.statement.LoopStatement;
24
 import org.openzen.zenscript.codemodel.statement.VarStatement;
24
 import org.openzen.zenscript.codemodel.statement.VarStatement;
25
+import org.openzen.zenscript.codemodel.type.BasicTypeID;
25
 import org.openzen.zenscript.codemodel.type.GenericName;
26
 import org.openzen.zenscript.codemodel.type.GenericName;
26
 import org.openzen.zenscript.codemodel.type.ITypeID;
27
 import org.openzen.zenscript.codemodel.type.ITypeID;
27
 import org.openzen.zenscript.codemodel.type.member.LocalMemberCache;
28
 import org.openzen.zenscript.codemodel.type.member.LocalMemberCache;
55
 	
56
 	
56
 	public ExpressionScope(BaseScope scope, ITypeID hint) {
57
 	public ExpressionScope(BaseScope scope, ITypeID hint) {
57
 		this.outer = scope;
58
 		this.outer = scope;
58
-		this.hints = Collections.singletonList(hint);
59
+		this.hints = hint == BasicTypeID.UNDETERMINED ? Collections.emptyList() : Collections.singletonList(hint);
59
 		this.dollar = null;
60
 		this.dollar = null;
60
 		this.genericInferenceMap = Collections.emptyMap();
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
 	private ExpressionScope(
64
 	private ExpressionScope(
71
 			BaseScope scope,
65
 			BaseScope scope,
72
 			List<ITypeID> hints,
66
 			List<ITypeID> hints,

+ 1
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/BasicTypeID.java Näytä tiedosto

26
 	UINT("uint"),
26
 	UINT("uint"),
27
 	LONG("long"),
27
 	LONG("long"),
28
 	ULONG("ulong"),
28
 	ULONG("ulong"),
29
+	USIZE("usize"),
29
 	FLOAT("float"),
30
 	FLOAT("float"),
30
 	DOUBLE("double"),
31
 	DOUBLE("double"),
31
 	CHAR("char"),
32
 	CHAR("char"),

+ 2
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/DefinitionTypeID.java Näytä tiedosto

133
 			return this;
133
 			return this;
134
 		if (mapper.getMapping().isEmpty())
134
 		if (mapper.getMapping().isEmpty())
135
 			return this;
135
 			return this;
136
+		if (mapper.registry == null)
137
+			throw new NullPointerException();
136
 		
138
 		
137
 		ITypeID[] instancedArguments = ITypeID.NONE;
139
 		ITypeID[] instancedArguments = ITypeID.NONE;
138
 		if (hasTypeParameters()) {
140
 		if (hasTypeParameters()) {

+ 4
- 4
CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/FunctionTypeID.java Näytä tiedosto

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

+ 3
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/GlobalTypeRegistry.java Näytä tiedosto

37
 		arrayTypes.put(ArrayTypeID.CHAR, ArrayTypeID.CHAR);
37
 		arrayTypes.put(ArrayTypeID.CHAR, ArrayTypeID.CHAR);
38
 		
38
 		
39
 		rangeTypes.put(RangeTypeID.INT, RangeTypeID.INT);
39
 		rangeTypes.put(RangeTypeID.INT, RangeTypeID.INT);
40
+		rangeTypes.put(RangeTypeID.USIZE, RangeTypeID.USIZE);
40
 	}
41
 	}
41
 	
42
 	
42
 	public ArrayTypeID getArray(ITypeID baseType, int dimension) {
43
 	public ArrayTypeID getArray(ITypeID baseType, int dimension) {
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
 		if (rangeTypes.containsKey(id)) {
95
 		if (rangeTypes.containsKey(id)) {
95
 			return rangeTypes.get(id);
96
 			return rangeTypes.get(id);
96
 		} else {
97
 		} else {

+ 2
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/ITypeID.java Näytä tiedosto

149
 				if (functionType.header.parameters.length != function.header.parameters.length)
149
 				if (functionType.header.parameters.length != function.header.parameters.length)
150
 					return false;
150
 					return false;
151
 				
151
 				
152
-				if (!match(functionType.header.returnType, function.header.returnType))
152
+				if (!match(functionType.header.getReturnType(), function.header.getReturnType()))
153
 					return false;
153
 					return false;
154
 				
154
 				
155
 				for (int i = 0; i < function.header.parameters.length; i++) {
155
 				for (int i = 0; i < function.header.parameters.length; i++) {
199
 		public Boolean visitRange(RangeTypeID range) {
199
 		public Boolean visitRange(RangeTypeID range) {
200
 			if (type instanceof RangeTypeID) {
200
 			if (type instanceof RangeTypeID) {
201
 				RangeTypeID rangeType = (RangeTypeID) type;
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
 			} else {
203
 			} else {
204
 				return false;
204
 				return false;
205
 			}
205
 			}

+ 13
- 18
CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/RangeTypeID.java Näytä tiedosto

14
  * @author Hoofdgebruiker
14
  * @author Hoofdgebruiker
15
  */
15
  */
16
 public class RangeTypeID implements ITypeID {
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
 	private final RangeTypeID normalized;
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
 			normalized = this;
27
 			normalized = this;
29
 		} else {
28
 		} else {
30
-			normalized = registry.getRange(from.getNormalized(), to.getNormalized());
29
+			normalized = registry.getRange(baseType.getNormalized());
31
 		}
30
 		}
32
 	}
31
 	}
33
 	
32
 	
38
 	
37
 	
39
 	@Override
38
 	@Override
40
 	public ITypeID instance(GenericMapper mapper) {
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
 	@Override
43
 	@Override
70
 
67
 
71
 	@Override
68
 	@Override
72
 	public boolean hasInferenceBlockingTypeParameters(TypeParameter[] parameters) {
69
 	public boolean hasInferenceBlockingTypeParameters(TypeParameter[] parameters) {
73
-		return from.hasInferenceBlockingTypeParameters(parameters) || to.hasInferenceBlockingTypeParameters(parameters);
70
+		return baseType.hasInferenceBlockingTypeParameters(parameters);
74
 	}
71
 	}
75
 
72
 
76
 	@Override
73
 	@Override
80
 
77
 
81
 	@Override
78
 	@Override
82
 	public void extractTypeParameters(List<TypeParameter> typeParameters) {
79
 	public void extractTypeParameters(List<TypeParameter> typeParameters) {
83
-		from.extractTypeParameters(typeParameters);
84
-		to.extractTypeParameters(typeParameters);
80
+		baseType.extractTypeParameters(typeParameters);
85
 	}
81
 	}
86
 
82
 
87
 	@Override
83
 	@Override
88
 	public int hashCode() {
84
 	public int hashCode() {
89
 		int hash = 5;
85
 		int hash = 5;
90
-		hash = 89 * hash + from.hashCode();
91
-		hash = 89 * hash + to.hashCode();
86
+		hash = 89 * hash + baseType.hashCode();
92
 		return hash;
87
 		return hash;
93
 	}
88
 	}
94
 
89
 
104
 			return false;
99
 			return false;
105
 		}
100
 		}
106
 		final RangeTypeID other = (RangeTypeID) obj;
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
 	@Override
105
 	@Override
111
 	public String toString() {
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 Näytä tiedosto

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

+ 60
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/member/BuiltinID.java Näytä tiedosto

38
 	BYTE_TO_UINT,
38
 	BYTE_TO_UINT,
39
 	BYTE_TO_LONG,
39
 	BYTE_TO_LONG,
40
 	BYTE_TO_ULONG,
40
 	BYTE_TO_ULONG,
41
+	BYTE_TO_USIZE,
41
 	BYTE_TO_FLOAT,
42
 	BYTE_TO_FLOAT,
42
 	BYTE_TO_DOUBLE,
43
 	BYTE_TO_DOUBLE,
43
 	BYTE_TO_CHAR,
44
 	BYTE_TO_CHAR,
67
 	SBYTE_TO_UINT,
68
 	SBYTE_TO_UINT,
68
 	SBYTE_TO_LONG,
69
 	SBYTE_TO_LONG,
69
 	SBYTE_TO_ULONG,
70
 	SBYTE_TO_ULONG,
71
+	SBYTE_TO_USIZE,
70
 	SBYTE_TO_FLOAT,
72
 	SBYTE_TO_FLOAT,
71
 	SBYTE_TO_DOUBLE,
73
 	SBYTE_TO_DOUBLE,
72
 	SBYTE_TO_CHAR,
74
 	SBYTE_TO_CHAR,
96
 	SHORT_TO_UINT,
98
 	SHORT_TO_UINT,
97
 	SHORT_TO_LONG,
99
 	SHORT_TO_LONG,
98
 	SHORT_TO_ULONG,
100
 	SHORT_TO_ULONG,
101
+	SHORT_TO_USIZE,
99
 	SHORT_TO_FLOAT,
102
 	SHORT_TO_FLOAT,
100
 	SHORT_TO_DOUBLE,
103
 	SHORT_TO_DOUBLE,
101
 	SHORT_TO_CHAR,
104
 	SHORT_TO_CHAR,
124
 	USHORT_TO_UINT,
127
 	USHORT_TO_UINT,
125
 	USHORT_TO_LONG,
128
 	USHORT_TO_LONG,
126
 	USHORT_TO_ULONG,
129
 	USHORT_TO_ULONG,
130
+	USHORT_TO_USIZE,
127
 	USHORT_TO_FLOAT,
131
 	USHORT_TO_FLOAT,
128
 	USHORT_TO_DOUBLE,
132
 	USHORT_TO_DOUBLE,
129
 	USHORT_TO_CHAR,
133
 	USHORT_TO_CHAR,
156
 	INT_TO_UINT,
160
 	INT_TO_UINT,
157
 	INT_TO_LONG,
161
 	INT_TO_LONG,
158
 	INT_TO_ULONG,
162
 	INT_TO_ULONG,
163
+	INT_TO_USIZE,
159
 	INT_TO_FLOAT,
164
 	INT_TO_FLOAT,
160
 	INT_TO_DOUBLE,
165
 	INT_TO_DOUBLE,
161
 	INT_TO_CHAR,
166
 	INT_TO_CHAR,
195
 	UINT_TO_INT,
200
 	UINT_TO_INT,
196
 	UINT_TO_LONG,
201
 	UINT_TO_LONG,
197
 	UINT_TO_ULONG,
202
 	UINT_TO_ULONG,
203
+	UINT_TO_USIZE,
198
 	UINT_TO_FLOAT,
204
 	UINT_TO_FLOAT,
199
 	UINT_TO_DOUBLE,
205
 	UINT_TO_DOUBLE,
200
 	UINT_TO_CHAR,
206
 	UINT_TO_CHAR,
236
 	LONG_TO_INT,
242
 	LONG_TO_INT,
237
 	LONG_TO_UINT,
243
 	LONG_TO_UINT,
238
 	LONG_TO_ULONG,
244
 	LONG_TO_ULONG,
245
+	LONG_TO_USIZE,
239
 	LONG_TO_FLOAT,
246
 	LONG_TO_FLOAT,
240
 	LONG_TO_DOUBLE,
247
 	LONG_TO_DOUBLE,
241
 	LONG_TO_CHAR,
248
 	LONG_TO_CHAR,
275
 	ULONG_TO_INT,
282
 	ULONG_TO_INT,
276
 	ULONG_TO_UINT,
283
 	ULONG_TO_UINT,
277
 	ULONG_TO_LONG,
284
 	ULONG_TO_LONG,
285
+	ULONG_TO_USIZE,
278
 	ULONG_TO_FLOAT,
286
 	ULONG_TO_FLOAT,
279
 	ULONG_TO_DOUBLE,
287
 	ULONG_TO_DOUBLE,
280
 	ULONG_TO_CHAR,
288
 	ULONG_TO_CHAR,
293
 	ULONG_LOWEST_ZERO_BIT,
301
 	ULONG_LOWEST_ZERO_BIT,
294
 	ULONG_BIT_COUNT,
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
 	FLOAT_NEG,
345
 	FLOAT_NEG,
297
 	FLOAT_INC,
346
 	FLOAT_INC,
298
 	FLOAT_DEC,
347
 	FLOAT_DEC,
310
 	FLOAT_TO_UINT,
359
 	FLOAT_TO_UINT,
311
 	FLOAT_TO_LONG,
360
 	FLOAT_TO_LONG,
312
 	FLOAT_TO_ULONG,
361
 	FLOAT_TO_ULONG,
362
+	FLOAT_TO_USIZE,
313
 	FLOAT_TO_DOUBLE,
363
 	FLOAT_TO_DOUBLE,
314
 	FLOAT_TO_STRING,
364
 	FLOAT_TO_STRING,
315
 	FLOAT_BITS,
365
 	FLOAT_BITS,
335
 	DOUBLE_TO_UINT,
385
 	DOUBLE_TO_UINT,
336
 	DOUBLE_TO_LONG,
386
 	DOUBLE_TO_LONG,
337
 	DOUBLE_TO_ULONG,
387
 	DOUBLE_TO_ULONG,
388
+	DOUBLE_TO_USIZE,
338
 	DOUBLE_TO_FLOAT,
389
 	DOUBLE_TO_FLOAT,
339
 	DOUBLE_TO_STRING,
390
 	DOUBLE_TO_STRING,
340
 	DOUBLE_BITS,
391
 	DOUBLE_BITS,
355
 	CHAR_TO_UINT,
406
 	CHAR_TO_UINT,
356
 	CHAR_TO_LONG,
407
 	CHAR_TO_LONG,
357
 	CHAR_TO_ULONG,
408
 	CHAR_TO_ULONG,
409
+	CHAR_TO_USIZE,
358
 	CHAR_TO_STRING,
410
 	CHAR_TO_STRING,
359
 	CHAR_GET_MIN_VALUE,
411
 	CHAR_GET_MIN_VALUE,
360
 	CHAR_GET_MAX_VALUE,
412
 	CHAR_GET_MAX_VALUE,
444
 	
496
 	
445
 	OPTIONAL_IS_NULL,
497
 	OPTIONAL_IS_NULL,
446
 	OPTIONAL_IS_NOT_NULL,
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 Näytä tiedosto

24
 import org.openzen.zenscript.codemodel.type.ITypeID;
24
 import org.openzen.zenscript.codemodel.type.ITypeID;
25
 import org.openzen.zenscript.codemodel.CompareType;
25
 import org.openzen.zenscript.codemodel.CompareType;
26
 import org.openzen.zenscript.codemodel.FunctionHeader;
26
 import org.openzen.zenscript.codemodel.FunctionHeader;
27
-import org.openzen.zenscript.codemodel.GenericMapper;
28
 import org.openzen.zenscript.codemodel.expression.ConstExpression;
27
 import org.openzen.zenscript.codemodel.expression.ConstExpression;
29
 import org.openzen.zenscript.codemodel.expression.PostCallExpression;
28
 import org.openzen.zenscript.codemodel.expression.PostCallExpression;
30
 import org.openzen.zenscript.codemodel.member.FunctionalMember;
29
 import org.openzen.zenscript.codemodel.member.FunctionalMember;
263
 			if (header.typeParameters != null) {
262
 			if (header.typeParameters != null) {
264
 				for (ITypeID resultHint : typeHints) {
263
 				for (ITypeID resultHint : typeHints) {
265
 					Map<TypeParameter, ITypeID> mapping = new HashMap<>();
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
 						break;
267
 						break;
269
 					}
268
 					}
270
 				}
269
 				}
361
 				throw new CompileException(position, CompileExceptionCode.CALL_NO_VALID_METHOD, "This type has no " + name);
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
 				if (!(method.member.isStatic() ? allowStatic : allowNonStatic)) {
364
 				if (!(method.member.isStatic() ? allowStatic : allowNonStatic)) {
366
 					message.append(method.member.isStatic() ? "Method must not be static" : "Method must be static").append('\n');
365
 					message.append(method.member.isStatic() ? "Method must not be static" : "Method must be static").append('\n');
367
 					continue;
366
 					continue;

+ 135
- 41
CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/member/TypeMemberBuilder.java Näytä tiedosto

47
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
47
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
48
 import org.openzen.zenscript.codemodel.member.MethodMember;
48
 import org.openzen.zenscript.codemodel.member.MethodMember;
49
 import org.openzen.zenscript.codemodel.member.OperatorMember;
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
 import org.openzen.zenscript.codemodel.member.ref.CasterMemberRef;
50
 import org.openzen.zenscript.codemodel.member.ref.CasterMemberRef;
56
 import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
51
 import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
57
 import org.openzen.zenscript.codemodel.member.ref.TranslatedOperatorMemberRef;
52
 import org.openzen.zenscript.codemodel.member.ref.TranslatedOperatorMemberRef;
74
 import org.openzen.zencode.shared.CompileException;
69
 import org.openzen.zencode.shared.CompileException;
75
 import org.openzen.zencode.shared.CompileExceptionCode;
70
 import org.openzen.zencode.shared.CompileExceptionCode;
76
 import org.openzen.zenscript.codemodel.definition.InterfaceDefinition;
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
 			case ULONG:
150
 			case ULONG:
154
 				visitULong();
151
 				visitULong();
155
 				break;
152
 				break;
153
+			case USIZE:
154
+				visitUSize();
155
+				break;
156
 			case FLOAT:
156
 			case FLOAT:
157
 				visitFloat();
157
 				visitFloat();
158
 				break;
158
 				break;
178
 
178
 
179
 		FunctionParameter[] indexGetParameters = new FunctionParameter[dimension];
179
 		FunctionParameter[] indexGetParameters = new FunctionParameter[dimension];
180
 		for (int i = 0; i < indexGetParameters.length; i++)
180
 		for (int i = 0; i < indexGetParameters.length; i++)
181
-			indexGetParameters[i] = new FunctionParameter(INT);
181
+			indexGetParameters[i] = new FunctionParameter(USIZE);
182
 		
182
 		
183
 		operator(
183
 		operator(
184
 				definition,
184
 				definition,
187
 				ARRAY_INDEXGET);
187
 				ARRAY_INDEXGET);
188
 		
188
 		
189
 		if (dimension == 1) {
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
 			operator(
191
 			operator(
192
 					definition,
192
 					definition,
193
 					OperatorType.INDEXGET,
193
 					OperatorType.INDEXGET,
213
 
213
 
214
 		FunctionParameter[] initialValueConstructorParameters = new FunctionParameter[dimension + 1];
214
 		FunctionParameter[] initialValueConstructorParameters = new FunctionParameter[dimension + 1];
215
 		for (int i = 0; i < dimension; i++)
215
 		for (int i = 0; i < dimension; i++)
216
-			initialValueConstructorParameters[i] = new FunctionParameter(INT);
216
+			initialValueConstructorParameters[i] = new FunctionParameter(USIZE);
217
 		initialValueConstructorParameters[dimension] = new FunctionParameter(baseType);
217
 		initialValueConstructorParameters[dimension] = new FunctionParameter(baseType);
218
 		FunctionHeader initialValueConstructorHeader = new FunctionHeader(VOID, initialValueConstructorParameters);
218
 		FunctionHeader initialValueConstructorHeader = new FunctionHeader(VOID, initialValueConstructorParameters);
219
 		new ConstructorMember(
219
 		new ConstructorMember(
226
 		
226
 		
227
 		FunctionParameter[] lambdaConstructorParameters = new FunctionParameter[dimension + 1];
227
 		FunctionParameter[] lambdaConstructorParameters = new FunctionParameter[dimension + 1];
228
 		for (int i = 0; i < dimension; i++)
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
 		FunctionHeader lambdaConstructorFunction = new FunctionHeader(baseType, indexGetParameters);
231
 		FunctionHeader lambdaConstructorFunction = new FunctionHeader(baseType, indexGetParameters);
232
 		lambdaConstructorParameters[dimension] = new FunctionParameter(cache.getRegistry().getFunction(lambdaConstructorFunction), null);
232
 		lambdaConstructorParameters[dimension] = new FunctionParameter(cache.getRegistry().getFunction(lambdaConstructorFunction), null);
259
 			TypeParameter mappedConstructorParameter = new TypeParameter(BUILTIN, "T");
259
 			TypeParameter mappedConstructorParameter = new TypeParameter(BUILTIN, "T");
260
 			FunctionParameter[] projectionParameters = new FunctionParameter[dimension + 1];
260
 			FunctionParameter[] projectionParameters = new FunctionParameter[dimension + 1];
261
 			for (int i = 0; i < dimension; i++)
261
 			for (int i = 0; i < dimension; i++)
262
-				projectionParameters[i] = new FunctionParameter(INT);
262
+				projectionParameters[i] = new FunctionParameter(USIZE);
263
 			projectionParameters[dimension] = new FunctionParameter(registry.getGeneric(mappedConstructorParameter));
263
 			projectionParameters[dimension] = new FunctionParameter(registry.getGeneric(mappedConstructorParameter));
264
 			
264
 			
265
 			FunctionHeader mappedConstructorHeaderWithIndex = new FunctionHeader(baseType, projectionParameters);
265
 			FunctionHeader mappedConstructorHeaderWithIndex = new FunctionHeader(baseType, projectionParameters);
274
 		
274
 		
275
 		FunctionParameter[] indexSetParameters = new FunctionParameter[dimension + 1];
275
 		FunctionParameter[] indexSetParameters = new FunctionParameter[dimension + 1];
276
 		for (int i = 0; i < dimension; i++)
276
 		for (int i = 0; i < dimension; i++)
277
-			indexSetParameters[i] = new FunctionParameter(INT, null);
277
+			indexSetParameters[i] = new FunctionParameter(USIZE, null);
278
 		indexSetParameters[dimension] = new FunctionParameter(baseType, null);
278
 		indexSetParameters[dimension] = new FunctionParameter(baseType, null);
279
 
279
 
280
 		FunctionHeader indexSetHeader = new FunctionHeader(VOID, indexSetParameters);
280
 		FunctionHeader indexSetHeader = new FunctionHeader(VOID, indexSetParameters);
281
 		operator(definition, OperatorType.INDEXSET, indexSetHeader, ARRAY_INDEXSET);
281
 		operator(definition, OperatorType.INDEXSET, indexSetHeader, ARRAY_INDEXSET);
282
 		
282
 		
283
 		if (dimension == 1) {
283
 		if (dimension == 1) {
284
-			getter(definition, ARRAY_LENGTH, "length", INT);
284
+			getter(definition, ARRAY_LENGTH, "length", USIZE);
285
 		}
285
 		}
286
 
286
 
287
 		getter(definition, ARRAY_ISEMPTY, "isEmpty", BOOL);
287
 		getter(definition, ARRAY_ISEMPTY, "isEmpty", BOOL);
288
 		getter(definition, ARRAY_HASHCODE, "objectHashCode", INT);
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
 		equals(definition, ARRAY_EQUALS, array);
292
 		equals(definition, ARRAY_EQUALS, array);
293
 		notequals(definition, ARRAY_NOTEQUALS, array);
293
 		notequals(definition, ARRAY_NOTEQUALS, array);
318
 				new FunctionHeader(BOOL, new FunctionParameter(keyType, "key")),
318
 				new FunctionHeader(BOOL, new FunctionParameter(keyType, "key")),
319
 				ASSOC_CONTAINS);
319
 				ASSOC_CONTAINS);
320
 		
320
 		
321
-		getter(builtin, BuiltinID.ASSOC_SIZE, "size", INT);
321
+		getter(builtin, BuiltinID.ASSOC_SIZE, "size", USIZE);
322
 		getter(builtin, BuiltinID.ASSOC_ISEMPTY, "isEmpty", BOOL);
322
 		getter(builtin, BuiltinID.ASSOC_ISEMPTY, "isEmpty", BOOL);
323
 		getter(builtin, BuiltinID.ASSOC_KEYS, "keys", cache.getRegistry().getArray(keyType, 1));
323
 		getter(builtin, BuiltinID.ASSOC_KEYS, "keys", cache.getRegistry().getArray(keyType, 1));
324
 		getter(builtin, BuiltinID.ASSOC_VALUES, "values", cache.getRegistry().getArray(valueType, 1));
324
 		getter(builtin, BuiltinID.ASSOC_VALUES, "values", cache.getRegistry().getArray(valueType, 1));
325
 		getter(builtin, BuiltinID.ASSOC_HASHCODE, "objectHashCode", BasicTypeID.INT);
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
 		equals(builtin, BuiltinID.ASSOC_EQUALS, assoc);
330
 		equals(builtin, BuiltinID.ASSOC_EQUALS, assoc);
330
 		notequals(builtin, BuiltinID.ASSOC_NOTEQUALS, assoc);
331
 		notequals(builtin, BuiltinID.ASSOC_NOTEQUALS, assoc);
353
 		method(builtin, "contains", containsHeader, GENERICMAP_CONTAINS);
354
 		method(builtin, "contains", containsHeader, GENERICMAP_CONTAINS);
354
 		method(builtin, "addAll", new FunctionHeader(VOID, map), GENERICMAP_ADDALL);
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
 		getter(builtin, GENERICMAP_ISEMPTY, "isEmpty", BOOL);
358
 		getter(builtin, GENERICMAP_ISEMPTY, "isEmpty", BOOL);
358
 		getter(builtin, GENERICMAP_HASHCODE, "objectHashCode", INT);
359
 		getter(builtin, GENERICMAP_HASHCODE, "objectHashCode", INT);
359
 		
360
 		
399
 		if (definition instanceof VariantDefinition) {
400
 		if (definition instanceof VariantDefinition) {
400
 			VariantDefinition variant = (VariantDefinition) definition;
401
 			VariantDefinition variant = (VariantDefinition) definition;
401
 			for (VariantDefinition.Option option : variant.options)
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
 		if (definition instanceof EnumDefinition) {
406
 		if (definition instanceof EnumDefinition) {
446
 		
447
 		
447
 		if (definition instanceof EnumDefinition) {
448
 		if (definition instanceof EnumDefinition) {
448
 			getter(definition, ENUM_NAME, "name", STRING);
449
 			getter(definition, ENUM_NAME, "name", STRING);
449
-			getter(definition, ENUM_ORDINAL, "ordinal", INT);
450
+			getter(definition, ENUM_ORDINAL, "ordinal", USIZE);
450
 			
451
 			
451
 			List<EnumConstantMember> enumConstants = ((EnumDefinition) definition).enumConstants;
452
 			List<EnumConstantMember> enumConstants = ((EnumDefinition) definition).enumConstants;
452
 			Expression[] constValues = new Expression[enumConstants.size()];
453
 			Expression[] constValues = new Expression[enumConstants.size()];
493
 
494
 
494
 	@Override
495
 	@Override
495
 	public Void visitRange(RangeTypeID range) {
496
 	public Void visitRange(RangeTypeID range) {
496
-		ITypeID fromType = range.from;
497
-		ITypeID toType = range.to;
497
+		ITypeID baseType = range.baseType;
498
 
498
 
499
 		ClassDefinition definition = new ClassDefinition(BUILTIN, null, "", Modifiers.EXPORT);
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
 		processType(definition, range);
515
 		processType(definition, range);
565
 		castImplicit(builtin, BYTE_TO_UINT, UINT);
567
 		castImplicit(builtin, BYTE_TO_UINT, UINT);
566
 		castImplicit(builtin, BYTE_TO_LONG, LONG);
568
 		castImplicit(builtin, BYTE_TO_LONG, LONG);
567
 		castImplicit(builtin, BYTE_TO_ULONG, ULONG);
569
 		castImplicit(builtin, BYTE_TO_ULONG, ULONG);
570
+		castImplicit(builtin, BYTE_TO_USIZE, USIZE);
568
 		castImplicit(builtin, BYTE_TO_FLOAT, FLOAT);
571
 		castImplicit(builtin, BYTE_TO_FLOAT, FLOAT);
569
 		castImplicit(builtin, BYTE_TO_DOUBLE, DOUBLE);
572
 		castImplicit(builtin, BYTE_TO_DOUBLE, DOUBLE);
570
 		castExplicit(builtin, BYTE_TO_CHAR, CHAR);
573
 		castExplicit(builtin, BYTE_TO_CHAR, CHAR);
603
 		castImplicit(builtin, SBYTE_TO_UINT, UINT);
606
 		castImplicit(builtin, SBYTE_TO_UINT, UINT);
604
 		castImplicit(builtin, SBYTE_TO_LONG, LONG);
607
 		castImplicit(builtin, SBYTE_TO_LONG, LONG);
605
 		castImplicit(builtin, SBYTE_TO_ULONG, ULONG);
608
 		castImplicit(builtin, SBYTE_TO_ULONG, ULONG);
609
+		castImplicit(builtin, SBYTE_TO_USIZE, USIZE);
606
 		castImplicit(builtin, SBYTE_TO_FLOAT, FLOAT);
610
 		castImplicit(builtin, SBYTE_TO_FLOAT, FLOAT);
607
 		castImplicit(builtin, SBYTE_TO_DOUBLE, DOUBLE);
611
 		castImplicit(builtin, SBYTE_TO_DOUBLE, DOUBLE);
608
 		castExplicit(builtin, SBYTE_TO_CHAR, CHAR);
612
 		castExplicit(builtin, SBYTE_TO_CHAR, CHAR);
641
 		castImplicit(builtin, SHORT_TO_UINT, UINT);
645
 		castImplicit(builtin, SHORT_TO_UINT, UINT);
642
 		castImplicit(builtin, SHORT_TO_LONG, LONG);
646
 		castImplicit(builtin, SHORT_TO_LONG, LONG);
643
 		castImplicit(builtin, SHORT_TO_ULONG, ULONG);
647
 		castImplicit(builtin, SHORT_TO_ULONG, ULONG);
648
+		castImplicit(builtin, SHORT_TO_USIZE, USIZE);
644
 		castImplicit(builtin, SHORT_TO_FLOAT, FLOAT);
649
 		castImplicit(builtin, SHORT_TO_FLOAT, FLOAT);
645
 		castImplicit(builtin, SHORT_TO_DOUBLE, DOUBLE);
650
 		castImplicit(builtin, SHORT_TO_DOUBLE, DOUBLE);
646
 		castExplicit(builtin, SHORT_TO_CHAR, CHAR);
651
 		castExplicit(builtin, SHORT_TO_CHAR, CHAR);
678
 		castImplicit(builtin, USHORT_TO_UINT, UINT);
683
 		castImplicit(builtin, USHORT_TO_UINT, UINT);
679
 		castImplicit(builtin, USHORT_TO_LONG, LONG);
684
 		castImplicit(builtin, USHORT_TO_LONG, LONG);
680
 		castImplicit(builtin, USHORT_TO_ULONG, ULONG);
685
 		castImplicit(builtin, USHORT_TO_ULONG, ULONG);
686
+		castImplicit(builtin, USHORT_TO_USIZE, USIZE);
681
 		castImplicit(builtin, USHORT_TO_FLOAT, FLOAT);
687
 		castImplicit(builtin, USHORT_TO_FLOAT, FLOAT);
682
 		castImplicit(builtin, USHORT_TO_DOUBLE, DOUBLE);
688
 		castImplicit(builtin, USHORT_TO_DOUBLE, DOUBLE);
683
 		castExplicit(builtin, USHORT_TO_CHAR, CHAR);
689
 		castExplicit(builtin, USHORT_TO_CHAR, CHAR);
749
 		castImplicit(builtin, INT_TO_UINT, UINT);
755
 		castImplicit(builtin, INT_TO_UINT, UINT);
750
 		castImplicit(builtin, INT_TO_LONG, LONG);
756
 		castImplicit(builtin, INT_TO_LONG, LONG);
751
 		castImplicit(builtin, INT_TO_ULONG, ULONG);
757
 		castImplicit(builtin, INT_TO_ULONG, ULONG);
758
+		castImplicit(builtin, INT_TO_USIZE, USIZE);
752
 		castImplicit(builtin, INT_TO_FLOAT, FLOAT);
759
 		castImplicit(builtin, INT_TO_FLOAT, FLOAT);
753
 		castImplicit(builtin, INT_TO_DOUBLE, DOUBLE);
760
 		castImplicit(builtin, INT_TO_DOUBLE, DOUBLE);
754
 		castExplicit(builtin, INT_TO_CHAR, CHAR);
761
 		castExplicit(builtin, INT_TO_CHAR, CHAR);
827
 		castImplicit(builtin, UINT_TO_INT, INT);
834
 		castImplicit(builtin, UINT_TO_INT, INT);
828
 		castImplicit(builtin, UINT_TO_LONG, LONG);
835
 		castImplicit(builtin, UINT_TO_LONG, LONG);
829
 		castImplicit(builtin, UINT_TO_ULONG, ULONG);
836
 		castImplicit(builtin, UINT_TO_ULONG, ULONG);
837
+		castImplicit(builtin, UINT_TO_USIZE, USIZE);
830
 		castImplicit(builtin, UINT_TO_FLOAT, FLOAT);
838
 		castImplicit(builtin, UINT_TO_FLOAT, FLOAT);
831
 		castImplicit(builtin, UINT_TO_DOUBLE, DOUBLE);
839
 		castImplicit(builtin, UINT_TO_DOUBLE, DOUBLE);
832
 		castExplicit(builtin, UINT_TO_CHAR, CHAR);
840
 		castExplicit(builtin, UINT_TO_CHAR, CHAR);
898
 		castExplicit(builtin, LONG_TO_INT, INT);
906
 		castExplicit(builtin, LONG_TO_INT, INT);
899
 		castExplicit(builtin, LONG_TO_UINT, UINT);
907
 		castExplicit(builtin, LONG_TO_UINT, UINT);
900
 		castImplicit(builtin, LONG_TO_ULONG, ULONG);
908
 		castImplicit(builtin, LONG_TO_ULONG, ULONG);
909
+		castExplicit(builtin, LONG_TO_USIZE, USIZE);
901
 		castImplicit(builtin, LONG_TO_FLOAT, FLOAT);
910
 		castImplicit(builtin, LONG_TO_FLOAT, FLOAT);
902
 		castImplicit(builtin, LONG_TO_DOUBLE, DOUBLE);
911
 		castImplicit(builtin, LONG_TO_DOUBLE, DOUBLE);
903
 		castExplicit(builtin, LONG_TO_CHAR, CHAR);
912
 		castExplicit(builtin, LONG_TO_CHAR, CHAR);
967
 		castExplicit(builtin, ULONG_TO_INT, INT);
976
 		castExplicit(builtin, ULONG_TO_INT, INT);
968
 		castExplicit(builtin, ULONG_TO_UINT, UINT);
977
 		castExplicit(builtin, ULONG_TO_UINT, UINT);
969
 		castImplicit(builtin, ULONG_TO_LONG, LONG);
978
 		castImplicit(builtin, ULONG_TO_LONG, LONG);
979
+		castExplicit(builtin, ULONG_TO_USIZE, USIZE);
970
 		castImplicit(builtin, ULONG_TO_FLOAT, FLOAT);
980
 		castImplicit(builtin, ULONG_TO_FLOAT, FLOAT);
971
 		castImplicit(builtin, ULONG_TO_DOUBLE, DOUBLE);
981
 		castImplicit(builtin, ULONG_TO_DOUBLE, DOUBLE);
972
 		castExplicit(builtin, ULONG_TO_CHAR, CHAR);
982
 		castExplicit(builtin, ULONG_TO_CHAR, CHAR);
990
 		processType(builtin, ULONG);
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
 	private void visitFloat() {
1079
 	private void visitFloat() {
994
 		ClassDefinition builtin = new ClassDefinition(BUILTIN, null, "float", Modifiers.EXPORT, null);
1080
 		ClassDefinition builtin = new ClassDefinition(BUILTIN, null, "float", Modifiers.EXPORT, null);
995
 		
1081
 		
1021
 		castExplicit(builtin, FLOAT_TO_USHORT, USHORT);
1107
 		castExplicit(builtin, FLOAT_TO_USHORT, USHORT);
1022
 		castExplicit(builtin, FLOAT_TO_INT, INT);
1108
 		castExplicit(builtin, FLOAT_TO_INT, INT);
1023
 		castExplicit(builtin, FLOAT_TO_UINT, UINT);
1109
 		castExplicit(builtin, FLOAT_TO_UINT, UINT);
1110
+		castExplicit(builtin, FLOAT_TO_LONG, LONG);
1024
 		castExplicit(builtin, FLOAT_TO_ULONG, ULONG);
1111
 		castExplicit(builtin, FLOAT_TO_ULONG, ULONG);
1025
-		castExplicit(builtin, FLOAT_TO_ULONG, ULONG);
1112
+		castExplicit(builtin, FLOAT_TO_USIZE, USIZE);
1026
 		castImplicit(builtin, FLOAT_TO_DOUBLE, DOUBLE);
1113
 		castImplicit(builtin, FLOAT_TO_DOUBLE, DOUBLE);
1027
 		castImplicit(builtin, FLOAT_TO_STRING, STRING);
1114
 		castImplicit(builtin, FLOAT_TO_STRING, STRING);
1028
 		
1115
 		
1029
 		staticMethod(builtin, FLOAT_PARSE, "parse", FLOAT, STRING);
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
 		processType(builtin, FLOAT);
1121
 		processType(builtin, FLOAT);
1035
 	}
1122
 	}
1058
 		castExplicit(builtin, DOUBLE_TO_UINT, UINT);
1145
 		castExplicit(builtin, DOUBLE_TO_UINT, UINT);
1059
 		castExplicit(builtin, DOUBLE_TO_ULONG, ULONG);
1146
 		castExplicit(builtin, DOUBLE_TO_ULONG, ULONG);
1060
 		castExplicit(builtin, DOUBLE_TO_ULONG, ULONG);
1147
 		castExplicit(builtin, DOUBLE_TO_ULONG, ULONG);
1148
+		castExplicit(builtin, DOUBLE_TO_USIZE, USIZE);
1061
 		castImplicit(builtin, DOUBLE_TO_FLOAT, FLOAT);
1149
 		castImplicit(builtin, DOUBLE_TO_FLOAT, FLOAT);
1062
 		castImplicit(builtin, DOUBLE_TO_STRING, STRING);
1150
 		castImplicit(builtin, DOUBLE_TO_STRING, STRING);
1063
 		
1151
 		
1064
 		staticMethod(builtin, DOUBLE_PARSE, "parse", DOUBLE, STRING);
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
 		processType(builtin, DOUBLE);
1157
 		processType(builtin, DOUBLE);
1070
 	}
1158
 	}
1085
 		castImplicit(builtin, CHAR_TO_UINT, UINT);
1173
 		castImplicit(builtin, CHAR_TO_UINT, UINT);
1086
 		castImplicit(builtin, CHAR_TO_LONG, LONG);
1174
 		castImplicit(builtin, CHAR_TO_LONG, LONG);
1087
 		castImplicit(builtin, CHAR_TO_ULONG, ULONG);
1175
 		castImplicit(builtin, CHAR_TO_ULONG, ULONG);
1176
+		castImplicit(builtin, CHAR_TO_USIZE, USIZE);
1088
 		castImplicit(builtin, CHAR_TO_STRING, STRING);
1177
 		castImplicit(builtin, CHAR_TO_STRING, STRING);
1089
 		
1178
 		
1090
 		getter(builtin, CHAR_GET_MIN_VALUE, "MIN_VALUE", CHAR);
1179
 		getter(builtin, CHAR_GET_MIN_VALUE, "MIN_VALUE", CHAR);
1103
 		constructor(builtin, STRING_CONSTRUCTOR_CHARACTERS, registry.getArray(CHAR, 1));
1192
 		constructor(builtin, STRING_CONSTRUCTOR_CHARACTERS, registry.getArray(CHAR, 1));
1104
 		
1193
 		
1105
 		add(builtin, STRING_ADD_STRING, STRING, STRING);
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
 		compare(builtin, STRING_COMPARE, STRING);
1197
 		compare(builtin, STRING_COMPARE, STRING);
1109
 		
1198
 		
1110
-		getter(builtin, STRING_LENGTH, "length", INT);
1199
+		getter(builtin, STRING_LENGTH, "length", USIZE);
1111
 		getter(builtin, STRING_CHARACTERS, "characters", registry.getArray(CHAR, 1));
1200
 		getter(builtin, STRING_CHARACTERS, "characters", registry.getArray(CHAR, 1));
1112
 		getter(builtin, STRING_ISEMPTY, "isEmpty", BOOL);
1201
 		getter(builtin, STRING_ISEMPTY, "isEmpty", BOOL);
1113
 
1202
 
1116
 		method(builtin, STRING_TO_LOWER_CASE, "toLowerCase", STRING);
1205
 		method(builtin, STRING_TO_LOWER_CASE, "toLowerCase", STRING);
1117
 		method(builtin, STRING_TO_UPPER_CASE, "toUpperCase", STRING);
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
 		processType(builtin, STRING);
1210
 		processType(builtin, STRING);
1122
 	}
1211
 	}
1557
 				new FunctionHeader(BOOL, new FunctionParameter(type)),
1646
 				new FunctionHeader(BOOL, new FunctionParameter(type)),
1558
 				id).registerTo(members, TypeMemberPriority.SPECIFIED, null);
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 Näytä tiedosto

39
 import org.openzen.zenscript.codemodel.partial.PartialMemberGroupExpression;
39
 import org.openzen.zenscript.codemodel.partial.PartialMemberGroupExpression;
40
 import org.openzen.zenscript.codemodel.partial.PartialStaticMemberGroupExpression;
40
 import org.openzen.zenscript.codemodel.partial.PartialStaticMemberGroupExpression;
41
 import org.openzen.zenscript.codemodel.partial.PartialTypeExpression;
41
 import org.openzen.zenscript.codemodel.partial.PartialTypeExpression;
42
+import org.openzen.zenscript.codemodel.partial.PartialVariantOptionExpression;
42
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
43
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
43
 import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
44
 import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
44
 import org.openzen.zenscript.codemodel.type.GenericName;
45
 import org.openzen.zenscript.codemodel.type.GenericName;
483
 			return new PartialStaticMemberGroupExpression(position, scope, type, members.get(name.name), name.arguments);
484
 			return new PartialStaticMemberGroupExpression(position, scope, type, members.get(name.name), name.arguments);
484
 		if (innerTypes.containsKey(name.name))
485
 		if (innerTypes.containsKey(name.name))
485
 			return new PartialTypeExpression(position, innerTypes.get(name.name).instance(cache.getRegistry(), name.arguments, (DefinitionTypeID)type), name.arguments);
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
 		return null;
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 Näytä tiedosto

3
  * To change this template file, choose Tools | Templates
3
  * To change this template file, choose Tools | Templates
4
  * and open the template in the editor.
4
  * and open the template in the editor.
5
  */
5
  */
6
-package org.openzen.zenscript.constructor.module;
6
+package org.openzen.zenscript.compiler;
7
 
7
 
8
 import org.openzen.zenscript.compiler.SemanticModule;
8
 import org.openzen.zenscript.compiler.SemanticModule;
9
 import java.util.ArrayList;
9
 import java.util.ArrayList;
10
 import java.util.HashMap;
10
 import java.util.HashMap;
11
 import java.util.List;
11
 import java.util.List;
12
 import java.util.Map;
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
 import org.openzen.zenscript.codemodel.annotations.AnnotationDefinition;
16
 import org.openzen.zenscript.codemodel.annotations.AnnotationDefinition;
14
 import org.openzen.zenscript.codemodel.annotations.NativeAnnotationDefinition;
17
 import org.openzen.zenscript.codemodel.annotations.NativeAnnotationDefinition;
15
 import org.openzen.zenscript.codemodel.annotations.PreconditionAnnotationDefinition;
18
 import org.openzen.zenscript.codemodel.annotations.PreconditionAnnotationDefinition;
16
 import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
19
 import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
17
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
20
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
18
 import org.openzen.zenscript.compiler.CompilationUnit;
21
 import org.openzen.zenscript.compiler.CompilationUnit;
19
-import org.openzen.zenscript.constructor.ConstructorException;
20
 import org.openzen.zenscript.codemodel.type.ISymbol;
22
 import org.openzen.zenscript.codemodel.type.ISymbol;
21
 
23
 
22
 /**
24
 /**
45
 		
47
 		
46
 		for (Map.Entry<String, ISymbol> globalEntry : dependency.globals.entrySet()) {
48
 		for (Map.Entry<String, ISymbol> globalEntry : dependency.globals.entrySet()) {
47
 			if (globals.containsKey(globalEntry.getKey()))
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
 			globals.put(globalEntry.getKey(), globalEntry.getValue());
52
 			globals.put(globalEntry.getKey(), globalEntry.getValue());
51
 		}
53
 		}

+ 0
- 84
Constructor/src/main/java/org/openzen/zenscript/constructor/Module.java Näytä tiedosto

10
 import java.io.FileInputStream;
10
 import java.io.FileInputStream;
11
 import java.io.IOException;
11
 import java.io.IOException;
12
 import java.util.ArrayList;
12
 import java.util.ArrayList;
13
-import java.util.Collections;
14
 import java.util.List;
13
 import java.util.List;
15
-import java.util.Map;
16
 import java.util.function.Consumer;
14
 import java.util.function.Consumer;
17
 import org.json.JSONArray;
15
 import org.json.JSONArray;
18
 import org.json.JSONObject;
16
 import org.json.JSONObject;
19
 import org.json.JSONTokener;
17
 import org.json.JSONTokener;
20
 import org.openzen.zencode.shared.CompileException;
18
 import org.openzen.zencode.shared.CompileException;
21
-import org.openzen.zenscript.codemodel.PackageDefinitions;
22
-import org.openzen.zenscript.codemodel.ScriptBlock;
23
 import org.openzen.zenscript.codemodel.context.CompilingPackage;
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
 import org.openzen.zenscript.parser.BracketExpressionParser;
20
 import org.openzen.zenscript.parser.BracketExpressionParser;
31
 import org.openzen.zenscript.parser.ParsedFile;
21
 import org.openzen.zenscript.parser.ParsedFile;
32
-import org.openzen.zenscript.parser.PrecompilationState;
33
 
22
 
34
 /**
23
 /**
35
  *
24
  *
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 Näytä tiedosto

5
  */
5
  */
6
 package org.openzen.zenscript.constructor.module;
6
 package org.openzen.zenscript.constructor.module;
7
 
7
 
8
+import org.openzen.zenscript.compiler.ModuleSpace;
8
 import org.openzen.zenscript.compiler.SemanticModule;
9
 import org.openzen.zenscript.compiler.SemanticModule;
9
 import java.io.File;
10
 import java.io.File;
10
 import java.io.IOException;
11
 import java.io.IOException;
84
 			CompilingPackage compilingPackage = new CompilingPackage(pkg);
85
 			CompilingPackage compilingPackage = new CompilingPackage(pkg);
85
 			
86
 			
86
 			ParsedFile[] parsedFiles = module.parse(compilingPackage);
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
 			JSONObject globals = json.optJSONObject("globals");
90
 			JSONObject globals = json.optJSONObject("globals");
90
 			if (globals != null) {
91
 			if (globals != null) {

+ 1
- 1
IDE/src/main/java/org/openzen/zenscript/ide/host/local/LocalTarget.java Näytä tiedosto

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

+ 1
- 0
IDE/src/main/java/org/openzen/zenscript/ide/ui/view/editor/SourceEditor.java Näytä tiedosto

887
 				case K_UINT:
887
 				case K_UINT:
888
 				case K_LONG:
888
 				case K_LONG:
889
 				case K_ULONG:
889
 				case K_ULONG:
890
+				case K_USIZE:
890
 				case K_FLOAT:
891
 				case K_FLOAT:
891
 				case K_DOUBLE:
892
 				case K_DOUBLE:
892
 				case K_CHAR:
893
 				case K_CHAR:

+ 0
- 12
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/implementations/IntRange.java Näytä tiedosto

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 Näytä tiedosto

5
  */
5
  */
6
 package org.openzen.zenscript.javabytecode;
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
 import org.objectweb.asm.Type;
12
 import org.objectweb.asm.Type;
9
 import org.openzen.zenscript.codemodel.FunctionHeader;
13
 import org.openzen.zenscript.codemodel.FunctionHeader;
10
-import org.openzen.zenscript.codemodel.FunctionParameter;
11
 import org.openzen.zenscript.codemodel.type.FunctionTypeID;
14
 import org.openzen.zenscript.codemodel.type.FunctionTypeID;
12
 import org.openzen.zenscript.codemodel.type.ITypeID;
15
 import org.openzen.zenscript.codemodel.type.ITypeID;
13
 import org.openzen.zenscript.codemodel.type.RangeTypeID;
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
 import org.openzen.zenscript.javashared.JavaContext;
19
 import org.openzen.zenscript.javashared.JavaContext;
20
+import org.openzen.zenscript.javashared.JavaMethod;
16
 import org.openzen.zenscript.javashared.JavaSynthesizedClass;
21
 import org.openzen.zenscript.javashared.JavaSynthesizedClass;
22
+import org.openzen.zenscript.javashared.JavaSynthesizedClassNamer;
17
 import org.openzen.zenscript.javashared.JavaSyntheticClassGenerator;
23
 import org.openzen.zenscript.javashared.JavaSyntheticClassGenerator;
18
 import org.openzen.zenscript.javashared.JavaTypeDescriptorVisitor;
24
 import org.openzen.zenscript.javashared.JavaTypeDescriptorVisitor;
19
 import org.openzen.zenscript.javashared.JavaTypeInternalNameVisitor;
25
 import org.openzen.zenscript.javashared.JavaTypeInternalNameVisitor;
27
 	private final TypeGenerator typeGenerator;
33
 	private final TypeGenerator typeGenerator;
28
 	private final JavaTypeInternalNameVisitor internalNameVisitor;
34
 	private final JavaTypeInternalNameVisitor internalNameVisitor;
29
 	private final JavaTypeDescriptorVisitor descriptorVisitor;
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
 	public JavaBytecodeContext(JavaModule module) {
40
 	public JavaBytecodeContext(JavaModule module) {
32
 		this.module = module;
41
 		this.module = module;
56
 	public void register(String name, byte[] bytecode) {
65
 	public void register(String name, byte[] bytecode) {
57
 		module.register(name, bytecode);
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
 	private class TypeGenerator implements JavaSyntheticClassGenerator {
138
 	private class TypeGenerator implements JavaSyntheticClassGenerator {
61
 
139
 
62
 		@Override
140
 		@Override
63
 		public JavaSynthesizedClass synthesizeFunction(FunctionTypeID type) {
141
 		public JavaSynthesizedClass synthesizeFunction(FunctionTypeID type) {
64
-			return CompilerUtils.getLambdaInterface(JavaBytecodeContext.this, type);
142
+			return getLambdaInterface(type);
65
 		}
143
 		}
66
 
144
 
67
 		@Override
145
 		@Override
68
 		public JavaSynthesizedClass synthesizeRange(RangeTypeID type) {
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 Näytä tiedosto

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 Näytä tiedosto

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 Näytä tiedosto

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

+ 0
- 42
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaMethodInfo.java Näytä tiedosto

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 Näytä tiedosto

19
  */
19
  */
20
 public class JavaModule {
20
 public class JavaModule {
21
 	private final Map<String, byte[]> classes = new HashMap<>();
21
 	private final Map<String, byte[]> classes = new HashMap<>();
22
-
22
+	private final File debugOutput;
23
+	
23
 	public JavaModule() {
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
 	public void register(String classname, byte[] bytecode) {
33
 	public void register(String classname, byte[] bytecode) {
28
 		if (bytecode == null)
34
 		if (bytecode == null)
29
 			return;
35
 			return;
30
 		
36
 		
37
+		classname = classname.replace('/', '.');
31
 		classes.put(classname, bytecode);
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 Näytä tiedosto

1
 package org.openzen.zenscript.javabytecode.compiler;
1
 package org.openzen.zenscript.javabytecode.compiler;
2
 
2
 
3
-import org.objectweb.asm.ClassWriter;
4
 import org.objectweb.asm.Opcodes;
3
 import org.objectweb.asm.Opcodes;
5
-import org.objectweb.asm.Type;
6
-import org.openzen.zencode.shared.CodePosition;
7
 import org.openzen.zenscript.codemodel.FunctionHeader;
4
 import org.openzen.zenscript.codemodel.FunctionHeader;
8
 import org.openzen.zenscript.codemodel.FunctionParameter;
5
 import org.openzen.zenscript.codemodel.FunctionParameter;
9
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
6
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
13
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
10
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
14
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
11
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
15
 import org.openzen.zenscript.codemodel.type.ITypeID;
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
 import org.openzen.zenscript.javabytecode.JavaBytecodeContext;
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
 public class CompilerUtils {
17
 public class CompilerUtils {
29
 	private CompilerUtils() {}
18
 	private CompilerUtils() {}
66
 		return out;
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
     public static void tagMethodParameters(JavaBytecodeContext context, FunctionHeader header, boolean isStatic) {
58
     public static void tagMethodParameters(JavaBytecodeContext context, FunctionHeader header, boolean isStatic) {
74
         for (int i = 0; i < header.parameters.length; i++) {
59
         for (int i = 0; i < header.parameters.length; i++) {
75
             FunctionParameter parameter = header.parameters[i];
60
             FunctionParameter parameter = header.parameters[i];
76
-            Type parameterType = context.getType(parameter.type);
61
+            String parameterType = context.getDescriptor(parameter.type);
77
             parameter.setTag(JavaParameterInfo.class, new JavaParameterInfo(isStatic ? i : i + 1, parameterType));
62
             parameter.setTag(JavaParameterInfo.class, new JavaParameterInfo(isStatic ? i : i + 1, parameterType));
78
         }
63
         }
79
     }
64
     }
81
     public static void tagConstructorParameters(JavaBytecodeContext context, FunctionHeader header, boolean isEnum) {
66
     public static void tagConstructorParameters(JavaBytecodeContext context, FunctionHeader header, boolean isEnum) {
82
         for (int i = 0; i < header.parameters.length; i++) {
67
         for (int i = 0; i < header.parameters.length; i++) {
83
             FunctionParameter parameter = header.parameters[i];
68
             FunctionParameter parameter = header.parameters[i];
84
-            Type parameterType = context.getType(parameter.type);
69
+            String parameterType = context.getDescriptor(parameter.type);
85
             parameter.setTag(JavaParameterInfo.class, new JavaParameterInfo(isEnum ? i + 3 : i + 1, parameterType));
70
             parameter.setTag(JavaParameterInfo.class, new JavaParameterInfo(isEnum ? i + 3 : i + 1, parameterType));
86
         }
71
         }
87
     }
72
     }
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
 	public static int getKeyForSwitch(SwitchValue expression) {
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 Näytä tiedosto

1
 package org.openzen.zenscript.javabytecode.compiler;
1
 package org.openzen.zenscript.javabytecode.compiler;
2
 
2
 
3
 import org.openzen.zenscript.codemodel.type.*;
3
 import org.openzen.zenscript.codemodel.type.*;
4
-import org.openzen.zenscript.javabytecode.JavaMethodInfo;
5
 import org.openzen.zenscript.javashared.JavaClass;
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
 	private final JavaWriter writer;
17
 	private final JavaWriter writer;
10
 
18
 
13
 	}
21
 	}
14
 
22
 
15
 	@Override
23
 	@Override
16
-	public JavaMethodInfo visitBasic(BasicTypeID basic) {
17
-		final JavaMethodInfo info;
24
+	public Void visitBasic(BasicTypeID basic) {
25
+		final JavaMethod method;
18
 		switch (basic) {
26
 		switch (basic) {
19
 			case BOOL:
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
 				break;
29
 				break;
23
 			case BYTE:
30
 			case BYTE:
31
+				method = INTEGER_VALUEOF;
32
+				break;
24
 			case SBYTE:
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
 				break;
35
 				break;
28
 			case SHORT:
36
 			case SHORT:
37
+				method = SHORT_VALUEOF;
38
+				break;
29
 			case USHORT:
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
 				break;
41
 				break;
33
 			case INT:
42
 			case INT:
34
 			case UINT:
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
 				break;
46
 				break;
38
 			case LONG:
47
 			case LONG:
39
 			case ULONG:
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
 				break;
50
 				break;
43
 			case FLOAT:
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
 				break;
53
 				break;
47
 			case DOUBLE:
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
 				break;
56
 				break;
51
 			case CHAR:
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
 				break;
59
 				break;
55
 			default:
60
 			default:
56
 				return null;
61
 				return null;
57
 		}
62
 		}
58
 		writer.dup();
63
 		writer.dup();
59
-		return info;
64
+		
65
+		if (method != null)
66
+			writer.invokeStatic(method);
67
+		return null;
60
 	}
68
 	}
61
 
69
 
62
 	@Override
70
 	@Override
63
-	public JavaMethodInfo visitArray(ArrayTypeID array) {
71
+	public Void visitArray(ArrayTypeID array) {
64
 		//NO-OP
72
 		//NO-OP
65
 		return null;
73
 		return null;
66
 	}
74
 	}
67
 
75
 
68
 	@Override
76
 	@Override
69
-	public JavaMethodInfo visitAssoc(AssocTypeID assoc) {
77
+	public Void visitAssoc(AssocTypeID assoc) {
70
 		//NO-OP
78
 		//NO-OP
71
 		return null;
79
 		return null;
72
 	}
80
 	}
73
 
81
 
74
 	@Override
82
 	@Override
75
-	public JavaMethodInfo visitGenericMap(GenericMapTypeID map) {
83
+	public Void visitGenericMap(GenericMapTypeID map) {
76
 		//NO-OP
84
 		//NO-OP
77
 		return null;
85
 		return null;
78
 	}
86
 	}
79
 
87
 
80
 	@Override
88
 	@Override
81
-	public JavaMethodInfo visitIterator(IteratorTypeID iterator) {
89
+	public Void visitIterator(IteratorTypeID iterator) {
82
 		//NO-OP
90
 		//NO-OP
83
 		return null;
91
 		return null;
84
 	}
92
 	}
85
 
93
 
86
 	@Override
94
 	@Override
87
-	public JavaMethodInfo visitFunction(FunctionTypeID function) {
95
+	public Void visitFunction(FunctionTypeID function) {
88
 		//NO-OP
96
 		//NO-OP
89
 		return null;
97
 		return null;
90
 	}
98
 	}
91
 
99
 
92
 	@Override
100
 	@Override
93
-	public JavaMethodInfo visitDefinition(DefinitionTypeID definition) {
101
+	public Void visitDefinition(DefinitionTypeID definition) {
94
 		//NO-OP
102
 		//NO-OP
95
 		return null;
103
 		return null;
96
 	}
104
 	}
97
 
105
 
98
 	@Override
106
 	@Override
99
-	public JavaMethodInfo visitGeneric(GenericTypeID generic) {
107
+	public Void visitGeneric(GenericTypeID generic) {
100
 		//NO-OP
108
 		//NO-OP
101
 		return null;
109
 		return null;
102
 	}
110
 	}
103
 
111
 
104
 	@Override
112
 	@Override
105
-	public JavaMethodInfo visitRange(RangeTypeID range) {
113
+	public Void visitRange(RangeTypeID range) {
106
 		//NO-OP
114
 		//NO-OP
107
 		return null;
115
 		return null;
108
 	}
116
 	}
109
 
117
 
110
 	@Override
118
 	@Override
111
-	public JavaMethodInfo visitModified(ModifiedTypeID type) {
119
+	public Void visitModified(ModifiedTypeID type) {
112
 		//NO-OP
120
 		//NO-OP
113
 		return null;
121
 		return null;
114
 	}
122
 	}

+ 210
- 173
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaExpressionVisitor.java Näytä tiedosto

1
 package org.openzen.zenscript.javabytecode.compiler;
1
 package org.openzen.zenscript.javabytecode.compiler;
2
 
2
 
3
+import org.openzen.zenscript.javashared.JavaParameterInfo;
3
 import java.util.Arrays;
4
 import java.util.Arrays;
4
 import java.util.Comparator;
5
 import java.util.Comparator;
5
 import java.util.StringJoiner;
6
 import java.util.StringJoiner;
18
 import org.openzen.zenscript.codemodel.statement.ReturnStatement;
19
 import org.openzen.zenscript.codemodel.statement.ReturnStatement;
19
 import org.openzen.zenscript.codemodel.type.*;
20
 import org.openzen.zenscript.codemodel.type.*;
20
 import org.openzen.zenscript.codemodel.type.member.BuiltinID;
21
 import org.openzen.zenscript.codemodel.type.member.BuiltinID;
21
-import org.openzen.zenscript.implementations.IntRange;
22
 import org.openzen.zenscript.javabytecode.*;
22
 import org.openzen.zenscript.javabytecode.*;
23
 
23
 
24
 import java.io.FileOutputStream;
24
 import java.io.FileOutputStream;
25
 import java.io.IOException;
25
 import java.io.IOException;
26
 import org.openzen.zenscript.javashared.JavaClass;
26
 import org.openzen.zenscript.javashared.JavaClass;
27
 import org.openzen.zenscript.javashared.JavaField;
27
 import org.openzen.zenscript.javashared.JavaField;
28
+import org.openzen.zenscript.javashared.JavaMethod;
29
+import org.openzen.zenscript.javashared.JavaSynthesizedClass;
28
 import org.openzen.zenscript.javashared.JavaSynthesizedClassNamer;
30
 import org.openzen.zenscript.javashared.JavaSynthesizedClassNamer;
31
+import org.openzen.zenscript.javashared.JavaVariantOption;
29
 
32
 
30
 public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
33
 public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
31
 	private static final int PUBLIC = Opcodes.ACC_PUBLIC;
34
 	private static final int PUBLIC = Opcodes.ACC_PUBLIC;
32
 	private static final int STATIC = Opcodes.ACC_STATIC;
35
 	private static final int STATIC = Opcodes.ACC_STATIC;
33
 	private static final int PUBLIC_STATIC = PUBLIC | STATIC;
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
 	private static final JavaField BYTE_MIN_VALUE = new JavaField(JavaClass.BYTE, "MIN_VALUE", "B");
42
 	private static final JavaField BYTE_MIN_VALUE = new JavaField(JavaClass.BYTE, "MIN_VALUE", "B");
40
 	private static final JavaField BYTE_MAX_VALUE = new JavaField(JavaClass.BYTE, "MAX_VALUE", "B");
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
 	private static final JavaField SHORT_MIN_VALUE = new JavaField(JavaClass.SHORT, "MIN_VALUE", "S");
47
 	private static final JavaField SHORT_MIN_VALUE = new JavaField(JavaClass.SHORT, "MIN_VALUE", "S");
45
 	private static final JavaField SHORT_MAX_VALUE = new JavaField(JavaClass.SHORT, "MAX_VALUE", "S");
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
 	private static final JavaField INTEGER_MIN_VALUE = new JavaField(JavaClass.INTEGER, "MIN_VALUE", "I");
62
 	private static final JavaField INTEGER_MIN_VALUE = new JavaField(JavaClass.INTEGER, "MIN_VALUE", "I");
60
 	private static final JavaField INTEGER_MAX_VALUE = new JavaField(JavaClass.INTEGER, "MAX_VALUE", "I");
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
 	private static final JavaField LONG_MIN_VALUE = new JavaField(JavaClass.LONG, "MIN_VALUE", "J");
79
 	private static final JavaField LONG_MIN_VALUE = new JavaField(JavaClass.LONG, "MIN_VALUE", "J");
77
 	private static final JavaField LONG_MAX_VALUE = new JavaField(JavaClass.LONG, "MAX_VALUE", "J");
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
 	private static final JavaField FLOAT_MIN_VALUE = new JavaField(JavaClass.FLOAT, "MIN_VALUE", "F");
87
 	private static final JavaField FLOAT_MIN_VALUE = new JavaField(JavaClass.FLOAT, "MIN_VALUE", "F");
85
 	private static final JavaField FLOAT_MAX_VALUE = new JavaField(JavaClass.FLOAT, "MAX_VALUE", "F");
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
 	private static final JavaField DOUBLE_MIN_VALUE = new JavaField(JavaClass.DOUBLE, "MIN_VALUE", "D");
94
 	private static final JavaField DOUBLE_MIN_VALUE = new JavaField(JavaClass.DOUBLE, "MIN_VALUE", "D");
92
 	private static final JavaField DOUBLE_MAX_VALUE = new JavaField(JavaClass.DOUBLE, "MAX_VALUE", "D");
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
 	private static final JavaField CHARACTER_MIN_VALUE = new JavaField(JavaClass.CHARACTER, "MIN_VALUE", "C");
99
 	private static final JavaField CHARACTER_MIN_VALUE = new JavaField(JavaClass.CHARACTER, "MIN_VALUE", "C");
97
 	private static final JavaField CHARACTER_MAX_VALUE = new JavaField(JavaClass.CHARACTER, "MAX_VALUE", "C");
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
 	protected final JavaWriter javaWriter;
153
 	protected final JavaWriter javaWriter;
151
 	private final JavaCapturedExpressionVisitor capturedExpressionVisitor = new JavaCapturedExpressionVisitor(this);
154
 	private final JavaCapturedExpressionVisitor capturedExpressionVisitor = new JavaCapturedExpressionVisitor(this);
271
 					throw new UnsupportedOperationException("Unknown builtin comparator: " + expression.operator.getBuiltin());
274
 					throw new UnsupportedOperationException("Unknown builtin comparator: " + expression.operator.getBuiltin());
272
 			}
275
 			}
273
 		} else {
276
 		} else {
274
-			if (!checkAndExecuteMethodInfo(expression.operator))
277
+			if (!checkAndExecuteMethodInfo(expression.operator, expression.type))
275
 				throw new IllegalStateException("Call target has no method info!");
278
 				throw new IllegalStateException("Call target has no method info!");
276
 
279
 
277
 			expression.left.accept(this);
280
 			expression.left.accept(this);
355
 				argument.accept(this);
358
 				argument.accept(this);
356
 			}
359
 			}
357
 
360
 
358
-			if (!checkAndExecuteMethodInfo(expression.member))
361
+			if (!checkAndExecuteMethodInfo(expression.member, expression.type))
359
 				throw new IllegalStateException("Call target has no method info!");
362
 				throw new IllegalStateException("Call target has no method info!");
360
 			//if (expression.member.getHeader().returnType != expression.type)
363
 			//if (expression.member.getHeader().returnType != expression.type)
361
 
364
 
404
 			case USHORT_NOT:
407
 			case USHORT_NOT:
405
 			case INT_NOT:
408
 			case INT_NOT:
406
 			case UINT_NOT:
409
 			case UINT_NOT:
410
+			case USIZE_NOT:
407
 				javaWriter.iNot();
411
 				javaWriter.iNot();
408
 				break;
412
 				break;
409
 			case SBYTE_NEG:
413
 			case SBYTE_NEG:
417
 			case USHORT_ADD_USHORT:
421
 			case USHORT_ADD_USHORT:
418
 			case INT_ADD_INT:
422
 			case INT_ADD_INT:
419
 			case UINT_ADD_UINT:
423
 			case UINT_ADD_UINT:
424
+			case USIZE_ADD_USIZE:
420
 				javaWriter.iAdd();
425
 				javaWriter.iAdd();
421
 				break;
426
 				break;
422
 			case BYTE_SUB_BYTE:
427
 			case BYTE_SUB_BYTE:
425
 			case USHORT_SUB_USHORT:
430
 			case USHORT_SUB_USHORT:
426
 			case INT_SUB_INT:
431
 			case INT_SUB_INT:
427
 			case UINT_SUB_UINT:
432
 			case UINT_SUB_UINT:
433
+			case USIZE_SUB_USIZE:
428
 				javaWriter.iSub();
434
 				javaWriter.iSub();
429
 				break;
435
 				break;
430
 			case BYTE_MUL_BYTE:
436
 			case BYTE_MUL_BYTE:
433
 			case USHORT_MUL_USHORT:
439
 			case USHORT_MUL_USHORT:
434
 			case INT_MUL_INT:
440
 			case INT_MUL_INT:
435
 			case UINT_MUL_UINT:
441
 			case UINT_MUL_UINT:
442
+			case USIZE_MUL_USIZE:
436
 				javaWriter.iMul();
443
 				javaWriter.iMul();
437
 				break;
444
 				break;
438
 			case SBYTE_DIV_SBYTE:
445
 			case SBYTE_DIV_SBYTE:
439
 			case SHORT_DIV_SHORT:
446
 			case SHORT_DIV_SHORT:
440
 			case INT_DIV_INT:
447
 			case INT_DIV_INT:
448
+			case USIZE_DIV_USIZE:
441
 				javaWriter.iDiv();
449
 				javaWriter.iDiv();
442
 				break;
450
 				break;
443
 			case SBYTE_MOD_SBYTE:
451
 			case SBYTE_MOD_SBYTE:
444
 			case SHORT_MOD_SHORT:
452
 			case SHORT_MOD_SHORT:
445
 			case INT_MOD_INT:
453
 			case INT_MOD_INT:
454
+			case USIZE_MOD_USIZE:
446
 				javaWriter.iRem();
455
 				javaWriter.iRem();
447
 				break;
456
 				break;
448
 			case BYTE_DIV_BYTE:
457
 			case BYTE_DIV_BYTE:
461
 			case USHORT_AND_USHORT:
470
 			case USHORT_AND_USHORT:
462
 			case INT_AND_INT:
471
 			case INT_AND_INT:
463
 			case UINT_AND_UINT:
472
 			case UINT_AND_UINT:
473
+			case USIZE_AND_USIZE:
464
 				javaWriter.iAnd();
474
 				javaWriter.iAnd();
465
 				break;
475
 				break;
466
 			case BYTE_OR_BYTE:
476
 			case BYTE_OR_BYTE:
469
 			case USHORT_OR_USHORT:
479
 			case USHORT_OR_USHORT:
470
 			case INT_OR_INT:
480
 			case INT_OR_INT:
471
 			case UINT_OR_UINT:
481
 			case UINT_OR_UINT:
482
+			case USIZE_OR_USIZE:
472
 				javaWriter.iOr();
483
 				javaWriter.iOr();
473
 				break;
484
 				break;
474
 			case BYTE_XOR_BYTE:
485
 			case BYTE_XOR_BYTE:
477
 			case USHORT_XOR_USHORT:
488
 			case USHORT_XOR_USHORT:
478
 			case INT_XOR_INT:
489
 			case INT_XOR_INT:
479
 			case UINT_XOR_UINT:
490
 			case UINT_XOR_UINT:
491
+			case USIZE_XOR_USIZE:
480
 				javaWriter.iXor();
492
 				javaWriter.iXor();
481
 				break;
493
 				break;
482
 			case INT_SHL:
494
 			case INT_SHL:
483
 			case UINT_SHL:
495
 			case UINT_SHL:
496
+			case USIZE_SHL:
484
 				javaWriter.iShl();
497
 				javaWriter.iShl();
485
 				break;
498
 				break;
486
 			case INT_SHR:
499
 			case INT_SHR:
488
 				break;
501
 				break;
489
 			case INT_USHR:
502
 			case INT_USHR:
490
 			case UINT_SHR:
503
 			case UINT_SHR:
504
+			case USIZE_SHR:
491
 				javaWriter.iUShr();
505
 				javaWriter.iUShr();
492
 				break;
506
 				break;
493
 			case INT_COUNT_LOW_ZEROES:
507
 			case INT_COUNT_LOW_ZEROES:
494
 			case UINT_COUNT_LOW_ZEROES:
508
 			case UINT_COUNT_LOW_ZEROES:
509
+			case USIZE_COUNT_LOW_ZEROES:
495
 				javaWriter.invokeStatic(INTEGER_NUMBER_OF_TRAILING_ZEROS);
510
 				javaWriter.invokeStatic(INTEGER_NUMBER_OF_TRAILING_ZEROS);
496
 				break;
511
 				break;
497
 			case INT_COUNT_HIGH_ZEROES:
512
 			case INT_COUNT_HIGH_ZEROES:
498
 			case UINT_COUNT_HIGH_ZEROES:
513
 			case UINT_COUNT_HIGH_ZEROES:
514
+			case USIZE_COUNT_HIGH_ZEROES:
499
 				javaWriter.invokeStatic(INTEGER_NUMBER_OF_LEADING_ZEROS);
515
 				javaWriter.invokeStatic(INTEGER_NUMBER_OF_LEADING_ZEROS);
500
 				break;
516
 				break;
501
 			case INT_COUNT_LOW_ONES:
517
 			case INT_COUNT_LOW_ONES:
502
 			case UINT_COUNT_LOW_ONES:
518
 			case UINT_COUNT_LOW_ONES:
519
+			case USIZE_COUNT_LOW_ONES:
503
 				javaWriter.iNot();
520
 				javaWriter.iNot();
504
 				javaWriter.invokeStatic(INTEGER_NUMBER_OF_TRAILING_ZEROS);
521
 				javaWriter.invokeStatic(INTEGER_NUMBER_OF_TRAILING_ZEROS);
505
 				break;
522
 				break;
506
 			case INT_COUNT_HIGH_ONES:
523
 			case INT_COUNT_HIGH_ONES:
507
 			case UINT_COUNT_HIGH_ONES:
524
 			case UINT_COUNT_HIGH_ONES:
525
+			case USIZE_COUNT_HIGH_ONES:
508
 				javaWriter.iNot();
526
 				javaWriter.iNot();
509
 				javaWriter.invokeStatic(INTEGER_NUMBER_OF_LEADING_ZEROS);
527
 				javaWriter.invokeStatic(INTEGER_NUMBER_OF_LEADING_ZEROS);
510
 				break;
528
 				break;
794
 					}
812
 					}
795
 				} else {
813
 				} else {
796
 					javaWriter.invokeStatic(ARRAYS_COPY_OF_RANGE_OBJECTS);
814
 					javaWriter.invokeStatic(ARRAYS_COPY_OF_RANGE_OBJECTS);
797
-					javaWriter.checkCast(context.getDescriptor(type));
815
+					javaWriter.checkCast(context.getInternalName(type));
798
 				}
816
 				}
799
 				break;
817
 				break;
800
 			}
818
 			}
851
 			}
869
 			}
852
 			case FUNCTION_CALL:
870
 			case FUNCTION_CALL:
853
 				javaWriter.invokeInterface(
871
 				javaWriter.invokeInterface(
854
-						new JavaMethodInfo(
872
+						JavaMethod.getNativeVirtual(
855
 								JavaClass.fromInternalName(context.getInternalName(expression.target.type), JavaClass.Kind.INTERFACE),
873
 								JavaClass.fromInternalName(context.getInternalName(expression.target.type), JavaClass.Kind.INTERFACE),
856
 								"accept",
874
 								"accept",
857
-								context.getMethodSignature(expression.instancedHeader),
858
-								Opcodes.ACC_PUBLIC));
875
+								context.getMethodSignature(expression.instancedHeader)));
859
 				break;
876
 				break;
860
 			case AUTOOP_NOTEQUALS:
877
 			case AUTOOP_NOTEQUALS:
861
 				throw new UnsupportedOperationException("Not yet supported!");
878
 				throw new UnsupportedOperationException("Not yet supported!");
873
 
890
 
874
 		BuiltinID builtin = expression.member.getBuiltin();
891
 		BuiltinID builtin = expression.member.getBuiltin();
875
 		if (builtin == null) {
892
 		if (builtin == null) {
876
-			if (!checkAndExecuteMethodInfo(expression.member))
893
+			if (!checkAndExecuteMethodInfo(expression.member, expression.type))
877
 				throw new IllegalStateException("Call target has no method info!");
894
 				throw new IllegalStateException("Call target has no method info!");
878
 
895
 
879
 			return null;
896
 			return null;
914
 				javaWriter.invokeStatic(INTEGER_PARSE_WITH_BASE);
931
 				javaWriter.invokeStatic(INTEGER_PARSE_WITH_BASE);
915
 				break;
932
 				break;
916
 			case UINT_PARSE:
933
 			case UINT_PARSE:
934
+			case USIZE_PARSE:
917
 				javaWriter.invokeStatic(INTEGER_PARSE_UNSIGNED);
935
 				javaWriter.invokeStatic(INTEGER_PARSE_UNSIGNED);
918
 				break;
936
 				break;
919
 			case UINT_PARSE_WITH_BASE:
937
 			case UINT_PARSE_WITH_BASE:
938
+			case USIZE_PARSE_WITH_BASE:
920
 				javaWriter.invokeStatic(INTEGER_PARSE_UNSIGNED_WITH_BASE);
939
 				javaWriter.invokeStatic(INTEGER_PARSE_UNSIGNED_WITH_BASE);
921
 				break;
940
 				break;
922
 			case LONG_PARSE:
941
 			case LONG_PARSE:
980
 
999
 
981
 		BuiltinID builtin = expression.member.member.builtin;
1000
 		BuiltinID builtin = expression.member.member.builtin;
982
 		if (builtin == null) {
1001
 		if (builtin == null) {
983
-			if (!checkAndExecuteByteCodeImplementation(expression.member) && !checkAndExecuteMethodInfo(expression.member))
1002
+			if (!checkAndExecuteMethodInfo(expression.member, expression.type))
984
 				throw new IllegalStateException("Call target has no method info!");
1003
 				throw new IllegalStateException("Call target has no method info!");
985
 
1004
 
986
 			return null;
1005
 			return null;
1001
 			case BYTE_TO_USHORT:
1020
 			case BYTE_TO_USHORT:
1002
 			case BYTE_TO_INT:
1021
 			case BYTE_TO_INT:
1003
 			case BYTE_TO_UINT:
1022
 			case BYTE_TO_UINT:
1023
+			case BYTE_TO_USIZE:
1004
 				javaWriter.constant(0xFF);
1024
 				javaWriter.constant(0xFF);
1005
 				javaWriter.iAnd();
1025
 				javaWriter.iAnd();
1006
 				break;
1026
 				break;
1034
 			case SBYTE_TO_USHORT:
1054
 			case SBYTE_TO_USHORT:
1035
 			case SBYTE_TO_INT:
1055
 			case SBYTE_TO_INT:
1036
 			case SBYTE_TO_UINT:
1056
 			case SBYTE_TO_UINT:
1057
+			case SBYTE_TO_USIZE:
1037
 				break;
1058
 				break;
1038
 			case SBYTE_TO_LONG:
1059
 			case SBYTE_TO_LONG:
1039
 			case SBYTE_TO_ULONG:
1060
 			case SBYTE_TO_ULONG:
1058
 			case SHORT_TO_USHORT:
1079
 			case SHORT_TO_USHORT:
1059
 			case SHORT_TO_INT:
1080
 			case SHORT_TO_INT:
1060
 			case SHORT_TO_UINT:
1081
 			case SHORT_TO_UINT:
1082
+			case SHORT_TO_USIZE:
1061
 				break;
1083
 				break;
1062
 			case SHORT_TO_LONG:
1084
 			case SHORT_TO_LONG:
1063
 			case SHORT_TO_ULONG:
1085
 			case SHORT_TO_ULONG:
1084
 				break;
1106
 				break;
1085
 			case USHORT_TO_INT:
1107
 			case USHORT_TO_INT:
1086
 			case USHORT_TO_UINT:
1108
 			case USHORT_TO_UINT:
1109
+			case USHORT_TO_USIZE:
1087
 				javaWriter.constant(0xFFFF);
1110
 				javaWriter.constant(0xFFFF);
1088
 				javaWriter.iAnd();
1111
 				javaWriter.iAnd();
1089
 				break;
1112
 				break;
1122
 			case INT_TO_USHORT:
1145
 			case INT_TO_USHORT:
1123
 				break;
1146
 				break;
1124
 			case INT_TO_UINT:
1147
 			case INT_TO_UINT:
1148
+			case INT_TO_USIZE:
1125
 				break;
1149
 				break;
1126
 			case INT_TO_LONG:
1150
 			case INT_TO_LONG:
1127
 			case INT_TO_ULONG:
1151
 			case INT_TO_ULONG:
1149
 				break;
1173
 				break;
1150
 			case UINT_TO_USHORT:
1174
 			case UINT_TO_USHORT:
1151
 			case UINT_TO_INT:
1175
 			case UINT_TO_INT:
1176
+			case UINT_TO_USIZE:
1152
 				break;
1177
 				break;
1153
 			case UINT_TO_LONG:
1178
 			case UINT_TO_LONG:
1154
 				javaWriter.i2l();
1179
 				javaWriter.i2l();
1190
 			case LONG_TO_USHORT:
1215
 			case LONG_TO_USHORT:
1191
 			case LONG_TO_INT:
1216
 			case LONG_TO_INT:
1192
 			case LONG_TO_UINT:
1217
 			case LONG_TO_UINT:
1218
+			case LONG_TO_USIZE:
1193
 				javaWriter.l2i();
1219
 				javaWriter.l2i();
1194
 				break;
1220
 				break;
1195
 			case LONG_TO_ULONG:
1221
 			case LONG_TO_ULONG:
1221
 			case ULONG_TO_USHORT:
1247
 			case ULONG_TO_USHORT:
1222
 			case ULONG_TO_INT:
1248
 			case ULONG_TO_INT:
1223
 			case ULONG_TO_UINT:
1249
 			case ULONG_TO_UINT:
1250
+			case ULONG_TO_USIZE:
1224
 				javaWriter.l2i();
1251
 				javaWriter.l2i();
1225
 				break;
1252
 				break;
1226
 			case ULONG_TO_LONG:
1253
 			case ULONG_TO_LONG:
1251
 			case FLOAT_TO_USHORT:
1278
 			case FLOAT_TO_USHORT:
1252
 			case FLOAT_TO_UINT:
1279
 			case FLOAT_TO_UINT:
1253
 			case FLOAT_TO_INT:
1280
 			case FLOAT_TO_INT:
1281
+			case FLOAT_TO_USIZE:
1254
 				javaWriter.f2i();
1282
 				javaWriter.f2i();
1255
 				break;
1283
 				break;
1256
 			case FLOAT_TO_LONG:
1284
 			case FLOAT_TO_LONG:
1277
 			case DOUBLE_TO_USHORT:
1305
 			case DOUBLE_TO_USHORT:
1278
 			case DOUBLE_TO_INT:
1306
 			case DOUBLE_TO_INT:
1279
 			case DOUBLE_TO_UINT:
1307
 			case DOUBLE_TO_UINT:
1308
+			case DOUBLE_TO_USIZE:
1280
 				javaWriter.d2i();
1309
 				javaWriter.d2i();
1281
 				break;
1310
 				break;
1282
 			case DOUBLE_TO_LONG:
1311
 			case DOUBLE_TO_LONG:
1298
 			case CHAR_TO_USHORT:
1327
 			case CHAR_TO_USHORT:
1299
 			case CHAR_TO_INT:
1328
 			case CHAR_TO_INT:
1300
 			case CHAR_TO_UINT:
1329
 			case CHAR_TO_UINT:
1330
+			case CHAR_TO_USIZE:
1301
 				break;
1331
 				break;
1302
 			case CHAR_TO_LONG:
1332
 			case CHAR_TO_LONG:
1303
 			case CHAR_TO_ULONG:
1333
 			case CHAR_TO_ULONG:
1323
         javaWriter.dup();
1353
         javaWriter.dup();
1324
         javaWriter.ifNonNull(end);
1354
         javaWriter.ifNonNull(end);
1325
         javaWriter.pop();
1355
         javaWriter.pop();
1326
-        javaWriter.newObject(NullPointerException.class);
1356
+        javaWriter.newObject("java/lang/NullPointerException");
1327
         javaWriter.dup();
1357
         javaWriter.dup();
1328
         javaWriter.constant("Tried to convert a null value to nonnull type " + context.getType(expression.type).getClassName());
1358
         javaWriter.constant("Tried to convert a null value to nonnull type " + context.getType(expression.type).getClassName());
1329
         javaWriter.invokeSpecial(NullPointerException.class, "<init>", "(Ljava/lang/String;)V");
1359
         javaWriter.invokeSpecial(NullPointerException.class, "<init>", "(Ljava/lang/String;)V");
1418
 			case ULONG_GET_MAX_VALUE:
1448
 			case ULONG_GET_MAX_VALUE:
1419
 				javaWriter.constant(-1L);
1449
 				javaWriter.constant(-1L);
1420
 				break;
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
 			case FLOAT_GET_MIN_VALUE:
1460
 			case FLOAT_GET_MIN_VALUE:
1422
 				javaWriter.getStaticField(FLOAT_MIN_VALUE);
1461
 				javaWriter.getStaticField(FLOAT_MIN_VALUE);
1423
 				break;
1462
 				break;
1439
 			case ENUM_VALUES: {
1478
 			case ENUM_VALUES: {
1440
 				DefinitionTypeID type = (DefinitionTypeID) expression.type;
1479
 				DefinitionTypeID type = (DefinitionTypeID) expression.type;
1441
 				JavaClass cls = type.definition.getTag(JavaClass.class);
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
 				break;
1482
 				break;
1444
 			}
1483
 			}
1445
 			default:
1484
 			default:
1530
 		return null;
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
     @Override
1578
     @Override
1534
     public Void visitConstructorThisCall(ConstructorThisCallExpression expression) {
1579
     public Void visitConstructorThisCall(ConstructorThisCallExpression expression) {
1535
 		javaWriter.loadObject(0);
1580
 		javaWriter.loadObject(0);
1536
-		if (javaWriter.method.javaClass.isEnum()) {
1581
+		if (javaWriter.method.cls.isEnum()) {
1537
 			javaWriter.loadObject(1);
1582
 			javaWriter.loadObject(1);
1538
 			javaWriter.loadInt(2);
1583
 			javaWriter.loadInt(2);
1539
 		}
1584
 		}
1542
 			argument.accept(this);
1587
 			argument.accept(this);
1543
 		}
1588
 		}
1544
 		String internalName = context.getInternalName(expression.objectType);
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
 				? context.getEnumConstructorDescriptor(expression.constructor.getHeader())
1591
 				? context.getEnumConstructorDescriptor(expression.constructor.getHeader())
1547
 				: context.getMethodDescriptor(expression.constructor.getHeader()));
1592
 				: context.getMethodDescriptor(expression.constructor.getHeader()));
1548
         return null;
1593
         return null;
1579
             return null;
1624
             return null;
1580
         }
1625
         }
1581
         final String signature = context.getMethodSignature(expression.header);
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
 		final ClassWriter lambdaCW = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
1630
 		final ClassWriter lambdaCW = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
1586
 		lambdaCW.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, name, null, "java/lang/Object", new String[]{JavaSynthesizedClassNamer.createFunctionName(new FunctionTypeID(null, expression.header)).cls.internalName});
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
 		final JavaWriter functionWriter = new JavaWriter(lambdaCW, methodInfo, null, signature, null, "java/lang/Override");
1632
 		final JavaWriter functionWriter = new JavaWriter(lambdaCW, methodInfo, null, signature, null, "java/lang/Override");
1592
 		final String constructorDesc = calcFunctionSignature(expression.closure);
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
 		constructorWriter.start();
1641
 		constructorWriter.start();
1597
 		constructorWriter.loadObject(0);
1642
 		constructorWriter.loadObject(0);
1598
 		constructorWriter.dup();
1643
 		constructorWriter.dup();
1722
 	public Void visitGetMatchingVariantField(GetMatchingVariantField expression) {
1767
 	public Void visitGetMatchingVariantField(GetMatchingVariantField expression) {
1723
 		javaWriter.loadObject(0);
1768
 		javaWriter.loadObject(0);
1724
 		final ITypeID type = expression.value.option.getParameterType(expression.index);
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
 		return null;
1773
 		return null;
1729
 	}
1774
 	}
1730
 
1775
 
1741
 
1786
 
1742
 		BuiltinID builtin = expression.getter.member.builtin;
1787
 		BuiltinID builtin = expression.getter.member.builtin;
1743
 		if (builtin == null) {
1788
 		if (builtin == null) {
1744
-			if (!checkAndExecuteMethodInfo(expression.getter))
1789
+			if (!checkAndExecuteMethodInfo(expression.getter, expression.type))
1745
 				throw new IllegalStateException("Call target has no method info!");
1790
 				throw new IllegalStateException("Call target has no method info!");
1746
 
1791
 
1747
 			return null;
1792
 			return null;
1750
 		switch (builtin) {
1795
 		switch (builtin) {
1751
 			case INT_HIGHEST_ONE_BIT:
1796
 			case INT_HIGHEST_ONE_BIT:
1752
 			case UINT_HIGHEST_ONE_BIT:
1797
 			case UINT_HIGHEST_ONE_BIT:
1798
+			case USIZE_HIGHEST_ONE_BIT:
1753
 				javaWriter.invokeStatic(INTEGER_HIGHEST_ONE_BIT);
1799
 				javaWriter.invokeStatic(INTEGER_HIGHEST_ONE_BIT);
1754
 				break;
1800
 				break;
1755
 			case INT_LOWEST_ONE_BIT:
1801
 			case INT_LOWEST_ONE_BIT:
1756
 			case UINT_LOWEST_ONE_BIT:
1802
 			case UINT_LOWEST_ONE_BIT:
1803
+			case USIZE_LOWEST_ONE_BIT:
1757
 				javaWriter.invokeStatic(INTEGER_LOWEST_ONE_BIT);
1804
 				javaWriter.invokeStatic(INTEGER_LOWEST_ONE_BIT);
1758
 				break;
1805
 				break;
1759
 			case INT_HIGHEST_ZERO_BIT:
1806
 			case INT_HIGHEST_ZERO_BIT:
1760
 			case UINT_HIGHEST_ZERO_BIT:
1807
 			case UINT_HIGHEST_ZERO_BIT:
1808
+			case USIZE_HIGHEST_ZERO_BIT:
1761
 				javaWriter.iNeg();
1809
 				javaWriter.iNeg();
1762
 				javaWriter.invokeStatic(INTEGER_HIGHEST_ONE_BIT);
1810
 				javaWriter.invokeStatic(INTEGER_HIGHEST_ONE_BIT);
1763
 				break;
1811
 				break;
1764
 			case INT_LOWEST_ZERO_BIT:
1812
 			case INT_LOWEST_ZERO_BIT:
1765
 			case UINT_LOWEST_ZERO_BIT:
1813
 			case UINT_LOWEST_ZERO_BIT:
1814
+			case USIZE_LOWEST_ZERO_BIT:
1766
 				javaWriter.iNeg();
1815
 				javaWriter.iNeg();
1767
 				javaWriter.invokeStatic(INTEGER_LOWEST_ONE_BIT);
1816
 				javaWriter.invokeStatic(INTEGER_LOWEST_ONE_BIT);
1768
 				break;
1817
 				break;
1769
 			case INT_BIT_COUNT:
1818
 			case INT_BIT_COUNT:
1770
 			case UINT_BIT_COUNT:
1819
 			case UINT_BIT_COUNT:
1820
+			case USIZE_BIT_COUNT:
1771
 				javaWriter.invokeStatic(INTEGER_BIT_COUNT);
1821
 				javaWriter.invokeStatic(INTEGER_BIT_COUNT);
1772
 				break;
1822
 				break;
1773
 			case LONG_HIGHEST_ONE_BIT:
1823
 			case LONG_HIGHEST_ONE_BIT:
1914
 			case OBJECT_HASHCODE:
1964
 			case OBJECT_HASHCODE:
1915
 				javaWriter.invokeVirtual(OBJECT_HASHCODE);
1965
 				javaWriter.invokeVirtual(OBJECT_HASHCODE);
1916
 				break;
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
 				break;
1971
 				break;
1972
+			}
1921
 			case RANGE_TO:
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
 				break;
1977
 				break;
1925
 		}
1978
 		}
1926
 
1979
 
1940
     @Override
1993
     @Override
1941
     public Void visitInterfaceCast(InterfaceCastExpression expression) {
1994
     public Void visitInterfaceCast(InterfaceCastExpression expression) {
1942
         expression.value.accept(this);
1995
         expression.value.accept(this);
1943
-        javaWriter.checkCast(context.getDescriptor(expression.type));
1996
+        javaWriter.checkCast(context.getInternalName(expression.type));
1944
         return null;
1997
         return null;
1945
     }
1998
     }
1946
 
1999
 
1947
     @Override
2000
     @Override
1948
     public Void visitIs(IsExpression expression) {
2001
     public Void visitIs(IsExpression expression) {
1949
         expression.value.accept(this);
2002
         expression.value.accept(this);
1950
-        javaWriter.instanceOf(context.getDescriptor(expression.isType));
2003
+        javaWriter.instanceOf(context.getInternalName(expression.isType));
1951
         return null;
2004
         return null;
1952
     }
2005
     }
1953
 
2006
 
1973
 
2026
 
1974
 	@Override
2027
 	@Override
1975
 	public Void visitMatch(MatchExpression expression) {
2028
 	public Void visitMatch(MatchExpression expression) {
1976
-
1977
 		final Label start = new Label();
2029
 		final Label start = new Label();
1978
 		final Label end = new Label();
2030
 		final Label end = new Label();
1979
 
2031
 
1980
-
1981
 		javaWriter.label(start);
2032
 		javaWriter.label(start);
1982
 		expression.value.accept(this);
2033
 		expression.value.accept(this);
1983
 
2034
 
1984
-
1985
 		//TODO replace beforeSwitch visitor or similar
2035
 		//TODO replace beforeSwitch visitor or similar
1986
 		if (expression.value.type == BasicTypeID.STRING)
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
 		//TODO replace with beforeSwitch visitor or similar
2039
 		//TODO replace with beforeSwitch visitor or similar
1990
 		for (MatchExpression.Case aCase : expression.cases) {
2040
 		for (MatchExpression.Case aCase : expression.cases) {
1991
 			if (aCase.key instanceof VariantOptionSwitchValue) {
2041
 			if (aCase.key instanceof VariantOptionSwitchValue) {
1992
 				VariantOptionSwitchValue variantOptionSwitchValue = (VariantOptionSwitchValue) aCase.key;
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
 				break;
2045
 				break;
1996
 			}
2046
 			}
1997
 		}
2047
 		}
1998
 
2048
 
1999
-
2000
 		final boolean hasNoDefault = hasNoDefault(expression);
2049
 		final boolean hasNoDefault = hasNoDefault(expression);
2001
 
2050
 
2002
 		final MatchExpression.Case[] cases = expression.cases;
2051
 		final MatchExpression.Case[] cases = expression.cases;
2048
     @Override
2097
     @Override
2049
     public Void visitNew(NewExpression expression) {
2098
     public Void visitNew(NewExpression expression) {
2050
 		// TODO: this code is incorrect!
2099
 		// TODO: this code is incorrect!
2100
+		JavaMethod method = expression.constructor.getTag(JavaMethod.class);
2051
 
2101
 
2052
         final String type;
2102
         final String type;
2053
         if (expression.type instanceof DefinitionTypeID)
2103
         if (expression.type instanceof DefinitionTypeID)
2057
 
2107
 
2058
         javaWriter.newObject(type);
2108
         javaWriter.newObject(type);
2059
         javaWriter.dup();
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
 		return null;
2116
 		return null;
2070
 	}
2117
 	}
2071
 
2118
 
2072
 	@Override
2119
 	@Override
2073
 	public Void visitNull(NullExpression expression) {
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
 		return null;
2125
 		return null;
2076
 	}
2126
 	}
2077
 
2127
 
2102
 
2152
 
2103
 	@Override
2153
 	@Override
2104
 	public Void visitPanic(PanicExpression expression) {
2154
 	public Void visitPanic(PanicExpression expression) {
2105
-		javaWriter.newObject(AssertionError.class);
2155
+		javaWriter.newObject("java/lang/AssertionError");
2106
 		javaWriter.dup();
2156
 		javaWriter.dup();
2107
 		expression.value.accept(this);
2157
 		expression.value.accept(this);
2108
 		javaWriter.invokeSpecial(AssertionError.class, "<init>", "(Ljava/lang/String;)V");
2158
 		javaWriter.invokeSpecial(AssertionError.class, "<init>", "(Ljava/lang/String;)V");
2114
 	public Void visitPostCall(PostCallExpression expression) {
2164
 	public Void visitPostCall(PostCallExpression expression) {
2115
 		expression.target.accept(this);
2165
 		expression.target.accept(this);
2116
 		javaWriter.dup(context.getType(expression.type));
2166
 		javaWriter.dup(context.getType(expression.type));
2117
-		if (!checkAndExecuteByteCodeImplementation(expression.member) && !checkAndExecuteMethodInfo(expression.member))
2167
+		if (!checkAndExecuteMethodInfo(expression.member, expression.type))
2118
 			throw new IllegalStateException("Call target has no method info!");
2168
 			throw new IllegalStateException("Call target has no method info!");
2119
 
2169
 
2120
 		return null;
2170
 		return null;
2122
 
2172
 
2123
     @Override
2173
     @Override
2124
     public Void visitRange(RangeExpression expression) {
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
 		javaWriter.dup();
2178
 		javaWriter.dup();
2131
 		expression.from.accept(this);
2179
 		expression.from.accept(this);
2132
 		expression.to.accept(this);
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
 		return null;
2183
 		return null;
2136
 	}
2184
 	}
2207
 	public Void visitStaticGetter(StaticGetterExpression expression) {
2255
 	public Void visitStaticGetter(StaticGetterExpression expression) {
2208
 		BuiltinID builtin = expression.getter.member.builtin;
2256
 		BuiltinID builtin = expression.getter.member.builtin;
2209
 		if (builtin == null) {
2257
 		if (builtin == null) {
2210
-			if (!checkAndExecuteMethodInfo(expression.getter))
2258
+			if (!checkAndExecuteMethodInfo(expression.getter, expression.type))
2211
 				throw new IllegalStateException("Call target has no method info!");
2259
 				throw new IllegalStateException("Call target has no method info!");
2212
 
2260
 
2213
 			return null;
2261
 			return null;
2283
 			case ENUM_VALUES: {
2331
 			case ENUM_VALUES: {
2284
 				DefinitionTypeID type = (DefinitionTypeID) expression.type;
2332
 				DefinitionTypeID type = (DefinitionTypeID) expression.type;
2285
 				JavaClass cls = type.definition.getTag(JavaClass.class);
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
 				break;
2335
 				break;
2288
 			}
2336
 			}
2289
 			default:
2337
 			default:
2333
 
2381
 
2334
 	@Override
2382
 	@Override
2335
 	public Void visitVariantValue(VariantValueExpression expression) {
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
 		javaWriter.newObject(internalName);
2386
 		javaWriter.newObject(internalName);
2338
 		javaWriter.dup();
2387
 		javaWriter.dup();
2339
 
2388
 
2355
 	@Override
2404
 	@Override
2356
 	public Void visitWrapOptional(WrapOptionalExpression expression) {
2405
 	public Void visitWrapOptional(WrapOptionalExpression expression) {
2357
 		//Does nothing if not required to be wrapped
2406
 		//Does nothing if not required to be wrapped
2358
-		final JavaMethodInfo info = expression.value.type.accept(new JavaBoxingTypeVisitor(javaWriter));
2359
 		expression.value.accept(this);
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
 		return null;
2409
 		return null;
2365
 	}
2410
 	}
2366
 
2411
 
2368
         return javaWriter;
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
     //Will return true if a JavaMethodInfo.class tag exists, and will compile that tag
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
         if (methodInfo == null)
2419
         if (methodInfo == null)
2386
             return false;
2420
             return false;
2387
 
2421
 
2388
-        if (methodInfo.isStatic()) {
2422
+        if (methodInfo.kind == JavaMethod.Kind.STATIC) {
2389
             getJavaWriter().invokeStatic(methodInfo);
2423
             getJavaWriter().invokeStatic(methodInfo);
2390
         } else {
2424
         } else {
2391
             getJavaWriter().invokeVirtual(methodInfo);
2425
             getJavaWriter().invokeVirtual(methodInfo);
2392
         }
2426
         }
2427
+		if (methodInfo.genericResult)
2428
+			getJavaWriter().checkCast(context.getInternalName(resultType));
2429
+
2393
         return true;
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 Näytä tiedosto

1
 package org.openzen.zenscript.javabytecode.compiler;
1
 package org.openzen.zenscript.javabytecode.compiler;
2
 
2
 
3
 import org.objectweb.asm.Label;
3
 import org.objectweb.asm.Label;
4
-import org.openzen.zenscript.codemodel.iterator.ForeachIteratorVisitor;
5
 import org.openzen.zenscript.codemodel.statement.Statement;
4
 import org.openzen.zenscript.codemodel.statement.Statement;
6
 import org.openzen.zenscript.codemodel.statement.VarStatement;
5
 import org.openzen.zenscript.codemodel.statement.VarStatement;
7
 import org.openzen.zenscript.javabytecode.JavaLocalVariableInfo;
6
 import org.openzen.zenscript.javabytecode.JavaLocalVariableInfo;
8
 
7
 
9
-public class JavaForeachVisitor implements ForeachIteratorVisitor<Void> {
8
+public class JavaForeachWriter {
10
 
9
 
11
 	private final JavaWriter javaWriter;
10
 	private final JavaWriter javaWriter;
12
 	private final VarStatement[] variables;
11
 	private final VarStatement[] variables;
15
 	private final Label endLabel;
14
 	private final Label endLabel;
16
 	private final JavaStatementVisitor statementVisitor;
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
 		this.statementVisitor = statementVisitor;
18
 		this.statementVisitor = statementVisitor;
20
 		this.javaWriter = statementVisitor.getJavaWriter();
19
 		this.javaWriter = statementVisitor.getJavaWriter();
21
 		this.variables = variables;
20
 		this.variables = variables;
24
 		this.endLabel = end;
23
 		this.endLabel = end;
25
 	}
24
 	}
26
 
25
 
27
-	@Override
28
-	public Void visitIntRange() {
26
+	public void visitIntRange() {
29
 		javaWriter.dup();
27
 		javaWriter.dup();
30
-		javaWriter.getField("org/openzen/zenscript/implementations/IntRange", "to", "I");
28
+		javaWriter.getField("zsynthetic/IntRange", "to", "I");
31
 		javaWriter.swap();
29
 		javaWriter.swap();
32
-		javaWriter.getField("org/openzen/zenscript/implementations/IntRange", "from", "I");
30
+		javaWriter.getField("zsynthetic/IntRange", "from", "I");
33
 
31
 
34
 		final int z = variables[0].getTag(JavaLocalVariableInfo.class).local;
32
 		final int z = variables[0].getTag(JavaLocalVariableInfo.class).local;
35
 		javaWriter.storeInt(z);
33
 		javaWriter.storeInt(z);
40
 
38
 
41
 		content.accept(statementVisitor);
39
 		content.accept(statementVisitor);
42
 		javaWriter.iinc(z);
40
 		javaWriter.iinc(z);
43
-
44
-
45
-		return null;
46
 	}
41
 	}
47
 
42
 
48
-	@Override
49
-	public Void visitArrayValueIterator() {
43
+	public void visitArrayValueIterator() {
50
 		handleArray(javaWriter.local(int.class), variables[0].getTag(JavaLocalVariableInfo.class));
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
 		handleArray(variables[0].getTag(JavaLocalVariableInfo.class).local, variables[1].getTag(JavaLocalVariableInfo.class));
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
 		//TODO UNTESTED!
52
 		//TODO UNTESTED!
63
 		javaWriter.invokeSpecial("java/lang/String", "toCharArray()", "()[C");
53
 		javaWriter.invokeSpecial("java/lang/String", "toCharArray()", "()[C");
64
 		handleArray(javaWriter.local(int.class), variables[0].getTag(JavaLocalVariableInfo.class));
54
 		handleArray(javaWriter.local(int.class), variables[0].getTag(JavaLocalVariableInfo.class));
65
-		return null;
66
 	}
55
 	}
67
 
56
 
68
 	private void handleArray(final int z, final JavaLocalVariableInfo arrayTypeInfo) {
57
 	private void handleArray(final int z, final JavaLocalVariableInfo arrayTypeInfo) {
85
 		javaWriter.iinc(z);
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
 		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
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
 		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
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 Näytä tiedosto

6
 package org.openzen.zenscript.javabytecode.compiler;
6
 package org.openzen.zenscript.javabytecode.compiler;
7
 
7
 
8
 import org.objectweb.asm.Type;
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
 import org.openzen.zenscript.javabytecode.JavaBytecodeContext;
10
 import org.openzen.zenscript.javabytecode.JavaBytecodeContext;
78
 import org.openzen.zenscript.javabytecode.JavaLocalVariableInfo;
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
 		throw new UnsupportedOperationException("Invalid increment target");
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
 	@Override
174
 	@Override
237
 	public Void visitConstructorThisCall(ConstructorThisCallExpression expression) {
175
 	public Void visitConstructorThisCall(ConstructorThisCallExpression expression) {
238
 		throw new UnsupportedOperationException("Invalid increment target");
176
 		throw new UnsupportedOperationException("Invalid increment target");

+ 7
- 69
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaPreIncrementVisitor.java Näytä tiedosto

6
 package org.openzen.zenscript.javabytecode.compiler;
6
 package org.openzen.zenscript.javabytecode.compiler;
7
 
7
 
8
 import org.objectweb.asm.Type;
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
 import org.openzen.zenscript.javabytecode.JavaBytecodeContext;
10
 import org.openzen.zenscript.javabytecode.JavaBytecodeContext;
78
 import org.openzen.zenscript.javabytecode.JavaLocalVariableInfo;
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
 		throw new UnsupportedOperationException("Invalid increment target");
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
 	@Override
174
 	@Override
237
 	public Void visitConstructorThisCall(ConstructorThisCallExpression expression) {
175
 	public Void visitConstructorThisCall(ConstructorThisCallExpression expression) {
238
 		throw new UnsupportedOperationException("Invalid increment target");
176
 		throw new UnsupportedOperationException("Invalid increment target");

+ 2
- 3
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaScriptFile.java Näytä tiedosto

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

+ 29
- 4
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaStatementVisitor.java Näytä tiedosto

5
 import org.openzen.zenscript.codemodel.statement.*;
5
 import org.openzen.zenscript.codemodel.statement.*;
6
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
6
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
7
 import org.openzen.zenscript.javabytecode.JavaLocalVariableInfo;
7
 import org.openzen.zenscript.javabytecode.JavaLocalVariableInfo;
8
-import org.openzen.zenscript.javabytecode.JavaMethodInfo;
9
 
8
 
10
 import java.util.Arrays;
9
 import java.util.Arrays;
11
 import java.util.List;
10
 import java.util.List;
12
 import org.openzen.zenscript.javabytecode.JavaBytecodeContext;
11
 import org.openzen.zenscript.javabytecode.JavaBytecodeContext;
13
-import org.openzen.zenscript.javashared.JavaClass;
14
 
12
 
15
 public class JavaStatementVisitor implements StatementVisitor<Boolean> {
13
 public class JavaStatementVisitor implements StatementVisitor<Boolean> {
16
     private final JavaWriter javaWriter;
14
     private final JavaWriter javaWriter;
110
         }
108
         }
111
 
109
 
112
 		//javaWriter.label(min);
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
 		javaWriter.goTo(start);
139
 		javaWriter.goTo(start);
115
 		javaWriter.label(end);
140
 		javaWriter.label(end);
116
 		return false;
141
 		return false;
166
 		javaWriter.label(start);
191
 		javaWriter.label(start);
167
 		statement.value.accept(expressionVisitor);
192
 		statement.value.accept(expressionVisitor);
168
 		if (statement.value.type == BasicTypeID.STRING)
193
 		if (statement.value.type == BasicTypeID.STRING)
169
-			javaWriter.invokeVirtual(new JavaMethodInfo(JavaClass.OBJECT, "hashCode", "()I", 0));
194
+			javaWriter.invokeVirtual(JavaExpressionVisitor.OBJECT_HASHCODE);
170
 		boolean out = false;
195
 		boolean out = false;
171
 
196
 
172
 		final boolean hasNoDefault = hasNoDefault(statement);
197
 		final boolean hasNoDefault = hasNoDefault(statement);

+ 48
- 0
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaSwitchKeyVisitor.java Näytä tiedosto

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 Näytä tiedosto

12
 import org.openzen.zencode.shared.CodePosition;
12
 import org.openzen.zencode.shared.CodePosition;
13
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
13
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
14
 import org.openzen.zenscript.javabytecode.JavaLocalVariableInfo;
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
 import org.openzen.zenscript.javashared.JavaClass;
16
 import org.openzen.zenscript.javashared.JavaClass;
18
 import org.openzen.zenscript.javashared.JavaField;
17
 import org.openzen.zenscript.javashared.JavaField;
18
+import org.openzen.zenscript.javashared.JavaMethod;
19
 
19
 
20
 public class JavaWriter {
20
 public class JavaWriter {
21
-    private static final JavaMethodInfo STRING_CONCAT = new JavaMethodInfo(
21
+    private static final JavaMethod STRING_CONCAT = JavaMethod.getNativeStatic(
22
             JavaClass.STRING,
22
             JavaClass.STRING,
23
             "concat",
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
     public final HighLevelDefinition forDefinition;
27
     public final HighLevelDefinition forDefinition;
29
 
28
 
30
     private final LocalVariablesSorter visitor;
29
     private final LocalVariablesSorter visitor;
38
     public JavaWriter(
37
     public JavaWriter(
39
             ClassVisitor visitor,
38
             ClassVisitor visitor,
40
             boolean nameVariables,
39
             boolean nameVariables,
41
-            JavaMethodInfo method,
40
+            JavaMethod method,
42
             HighLevelDefinition forDefinition,
41
             HighLevelDefinition forDefinition,
43
             String signature,
42
             String signature,
44
             String[] exceptions,
43
             String[] exceptions,
57
         this.nameVariables = nameVariables;
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
         this(visitor, true, method, forDefinition, signature, exceptions, annotations);
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
     public void enableDebug() {
63
     public void enableDebug() {
73
         debug = true;
64
         debug = true;
74
     }
65
     }
245
         if (debug)
236
         if (debug)
246
             System.out.println("load " + parameter.index);
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
     public void load(JavaLocalVariableInfo localVariable) {
242
     public void load(JavaLocalVariableInfo localVariable) {
259
         if (debug)
250
         if (debug)
260
             System.out.println("store " + parameter.index);
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
     public void store(JavaLocalVariableInfo localVariable) {
256
     public void store(JavaLocalVariableInfo localVariable) {
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
         if (debug)
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
     public void checkCast(Type type) {
359
     public void checkCast(Type type) {
810
         visitor.visitTypeInsn(INSTANCEOF, type.getDescriptor());
787
         visitor.visitTypeInsn(INSTANCEOF, type.getDescriptor());
811
     }
788
     }
812
 	
789
 	
813
-	public void invokeStatic(JavaMethodInfo method) {
790
+	public void invokeStatic(JavaMethod method) {
814
 		visitor.visitMethodInsn(
791
 		visitor.visitMethodInsn(
815
 				INVOKESTATIC,
792
 				INVOKESTATIC,
816
-				method.javaClass.internalName,
793
+				method.cls.internalName,
817
 				method.name,
794
 				method.name,
818
 				method.descriptor,
795
 				method.descriptor,
819
 				false);
796
 				false);
830
         invokeSpecial(Type.getInternalName(owner), name, descriptor);
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
         if (debug)
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
         if (debug)
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
     public void newObject(String internalName) {
828
     public void newObject(String internalName) {
862
         visitor.visitTypeInsn(NEW, internalName);
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
     public void goTo(Label lbl) {
835
     public void goTo(Label lbl) {
894
         if (debug)
836
         if (debug)
895
             System.out.println("goTo " + getLabelName(lbl));
837
             System.out.println("goTo " + getLabelName(lbl));
1048
 
990
 
1049
         visitor.visitFieldInsn(GETFIELD, owner, name, descriptor);
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
 	public void getField(JavaField field) {
994
 	public void getField(JavaField field) {
1060
         if (debug)
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
     public void putField(String owner, String name, String descriptor) {
1001
     public void putField(String owner, String name, String descriptor) {
1069
 
1004
 
1070
         visitor.visitFieldInsn(PUTFIELD, owner, name, descriptor);
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
 	public void putField(JavaField field) {
1008
 	public void putField(JavaField field) {
1081
         if (debug)
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
     public void getStaticField(String owner, String name, String descriptor) {
1015
     public void getStaticField(String owner, String name, String descriptor) {
1093
 	
1021
 	
1094
 	public void getStaticField(JavaField field) {
1022
 	public void getStaticField(JavaField field) {
1095
         if (debug)
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
     public void putStaticField(String owner, String name, String descriptor) {
1029
     public void putStaticField(String owner, String name, String descriptor) {
1104
 
1032
 
1105
         visitor.visitFieldInsn(PUTSTATIC, owner, name, descriptor);
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
 	public void putStaticField(JavaField field) {
1036
 	public void putStaticField(JavaField field) {
1116
         if (debug)
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
     public void aThrow() {
1043
     public void aThrow() {

+ 56
- 82
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/definitions/JavaDefinitionVisitor.java Näytä tiedosto

2
 
2
 
3
 import org.objectweb.asm.ClassWriter;
3
 import org.objectweb.asm.ClassWriter;
4
 import org.objectweb.asm.Opcodes;
4
 import org.objectweb.asm.Opcodes;
5
-import org.objectweb.asm.Type;
6
-import org.openzen.zenscript.codemodel.Modifiers;
7
 import org.openzen.zenscript.codemodel.definition.*;
5
 import org.openzen.zenscript.codemodel.definition.*;
8
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
6
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
9
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
7
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
11
 import org.openzen.zenscript.codemodel.type.GenericTypeID;
9
 import org.openzen.zenscript.codemodel.type.GenericTypeID;
12
 import org.openzen.zenscript.codemodel.type.ITypeID;
10
 import org.openzen.zenscript.codemodel.type.ITypeID;
13
 import org.openzen.zenscript.javabytecode.JavaBytecodeContext;
11
 import org.openzen.zenscript.javabytecode.JavaBytecodeContext;
14
-import org.openzen.zenscript.javabytecode.JavaMethodInfo;
15
-import org.openzen.zenscript.javabytecode.JavaModule;
16
 import org.openzen.zenscript.javabytecode.compiler.*;
12
 import org.openzen.zenscript.javabytecode.compiler.*;
17
 import org.openzen.zenscript.javashared.JavaClass;
13
 import org.openzen.zenscript.javashared.JavaClass;
18
 
14
 
19
 import java.io.FileOutputStream;
15
 import java.io.FileOutputStream;
20
 import java.io.IOException;
16
 import java.io.IOException;
17
+import java.util.ArrayList;
21
 import java.util.List;
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
 public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
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
 	private final JavaClassWriter outerWriter;
33
 	private final JavaClassWriter outerWriter;
39
 	private final JavaBytecodeContext context;
34
 	private final JavaBytecodeContext context;
47
 
42
 
48
 	@Override
43
 	@Override
49
 	public byte[] visitClass(ClassDefinition definition) {
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
 		JavaClassWriter writer = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
48
 		JavaClassWriter writer = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
60
 
49
 
61
         //TODO: Calculate signature from generic parameters
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
         String signature = null;
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
 		JavaMemberVisitor memberVisitor = new JavaMemberVisitor(context, writer, toClass, definition);
59
 		JavaMemberVisitor memberVisitor = new JavaMemberVisitor(context, writer, toClass, definition);
67
         for (IDefinitionMember member : definition.members) {
60
         for (IDefinitionMember member : definition.members) {
68
             member.accept(memberVisitor);
61
             member.accept(memberVisitor);
74
 
67
 
75
 	@Override
68
 	@Override
76
 	public byte[] visitInterface(InterfaceDefinition definition) {
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
 		ClassWriter writer = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
71
 		ClassWriter writer = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
79
 
72
 
80
 		//TODO: Calculate signature from generic parameters
73
 		//TODO: Calculate signature from generic parameters
81
-		//TODO: Extending Interfaces?
82
 		String signature = null;
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
 		JavaMemberVisitor memberVisitor = new JavaMemberVisitor(context, writer, toClass, definition);
80
 		JavaMemberVisitor memberVisitor = new JavaMemberVisitor(context, writer, toClass, definition);
85
 		for (IDefinitionMember member : definition.members) {
81
 		for (IDefinitionMember member : definition.members) {
86
 			member.accept(memberVisitor);
82
 			member.accept(memberVisitor);
94
 	public byte[] visitEnum(EnumDefinition definition) {
90
 	public byte[] visitEnum(EnumDefinition definition) {
95
 		System.out.println("Compiling enum " + definition.name + " in " + definition.position.getFilename());
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
 		ClassWriter writer = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
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
 		//Enum Stuff(required!)
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
         final JavaMemberVisitor visitor = new JavaMemberVisitor(context, writer, toClass, definition);
103
         final JavaMemberVisitor visitor = new JavaMemberVisitor(context, writer, toClass, definition);
113
         for (IDefinitionMember member : definition.members) {
104
         for (IDefinitionMember member : definition.members) {
114
             member.accept(visitor);
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
 		valuesWriter.start();
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
 		valuesWriter.returnObject();
114
 		valuesWriter.returnObject();
127
 		valuesWriter.end();
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
 		valueOfWriter.start();
119
 		valueOfWriter.start();
132
 		valueOfWriter.invokeStatic(CLASS_FORNAME);
120
 		valueOfWriter.invokeStatic(CLASS_FORNAME);
133
 		valueOfWriter.loadObject(0);
121
 		valueOfWriter.loadObject(0);
134
 		valueOfWriter.invokeStatic(ENUM_VALUEOF);
122
 		valueOfWriter.invokeStatic(ENUM_VALUEOF);
135
-		valueOfWriter.checkCast("L" + definition.name + ";");
123
+		valueOfWriter.checkCast(toClass.internalName);
136
 		valueOfWriter.returnObject();
124
 		valueOfWriter.returnObject();
137
 		valueOfWriter.end();
125
 		valueOfWriter.end();
138
 
126
 
139
-
140
 		writer.visitEnd();
127
 		writer.visitEnd();
141
 		return writer.toByteArray();
128
 		return writer.toByteArray();
142
 	}
129
 	}
152
 
139
 
153
         final String signature = context.getMethodSignature(definition.header);
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
         final JavaStatementVisitor statementVisitor = new JavaStatementVisitor(context, writer);
145
         final JavaStatementVisitor statementVisitor = new JavaStatementVisitor(context, writer);
160
         statementVisitor.start();
146
         statementVisitor.start();
161
 		boolean returns = definition.statement.accept(statementVisitor);
147
 		boolean returns = definition.statement.accept(statementVisitor);
162
 		if (!returns) {
148
 		if (!returns) {
163
-			ITypeID type = definition.header.returnType;
149
+			ITypeID type = definition.header.getReturnType();
164
 			if (CompilerUtils.isPrimitive(type))
150
 			if (CompilerUtils.isPrimitive(type))
165
 				writer.iConst0();
151
 				writer.iConst0();
166
 			else if (type != BasicTypeID.VOID)
152
 			else if (type != BasicTypeID.VOID)
169
 		}
155
 		}
170
 
156
 
171
 		statementVisitor.end();
157
 		statementVisitor.end();
172
-
173
-		definition.setTag(JavaMethodInfo.class, methodInfo);
174
-		definition.caller.setTag(JavaMethodInfo.class, methodInfo);
175
 		return null;
158
 		return null;
176
 	}
159
 	}
177
 
160
 
187
 
170
 
188
 	@Override
171
 	@Override
189
 	public byte[] visitVariant(VariantDefinition variant) {
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
 		final JavaClassWriter writer = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
174
 		final JavaClassWriter writer = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
194
 
175
 
195
 
176
 
196
 		final String ss = "<" + javaTypeGenericVisitor.getGenericSignature(variant.genericParameters) + ">Ljava/lang/Object;";
177
 		final String ss = "<" + javaTypeGenericVisitor.getGenericSignature(variant.genericParameters) + ">Ljava/lang/Object;";
197
 		JavaClassWriter.registerSuperClass(variantName, "java/lang/Object");
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
 		writer.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_ABSTRACT, "getDenominator", "()I", null, null).visitEnd();
181
 		writer.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_ABSTRACT, "getDenominator", "()I", null, null).visitEnd();
201
 
182
 
202
-
203
 		final JavaMemberVisitor visitor = new JavaMemberVisitor(context, writer, toClass, variant);
183
 		final JavaMemberVisitor visitor = new JavaMemberVisitor(context, writer, toClass, variant);
204
 
184
 
205
 		final List<VariantDefinition.Option> options = variant.options;
185
 		final List<VariantDefinition.Option> options = variant.options;
206
 		//Each option is one of the possible child classes
186
 		//Each option is one of the possible child classes
207
 		for (final VariantDefinition.Option option : options) {
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
 			final JavaClassWriter optionWriter = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
189
 			final JavaClassWriter optionWriter = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
211
 			JavaClassWriter.registerSuperClass(optionClassName, variantName);
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
 			//Generic option signature
194
 			//Generic option signature
220
 			final String signature;
195
 			final String signature;
226
 					builder.append(javaTypeGenericVisitor.getSignatureWithBound(type));
201
 					builder.append(javaTypeGenericVisitor.getSignatureWithBound(type));
227
 				}
202
 				}
228
 				builder.append(">");
203
 				builder.append(">");
229
-				builder.append("L").append(variantName).append("<");
204
+				builder.append("L").append(toClass.internalName).append("<");
230
 
205
 
231
 				for (final TypeParameter genericParameter : variant.genericParameters) {
206
 				for (final TypeParameter genericParameter : variant.genericParameters) {
232
 					boolean t = true;
207
 					boolean t = true;
247
 				signature = builder.append(">;").toString();
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
 			final StringBuilder optionInitDescBuilder = new StringBuilder("(");
227
 			final StringBuilder optionInitDescBuilder = new StringBuilder("(");
253
 			final StringBuilder optionInitSignatureBuilder = new StringBuilder("(");
228
 			final StringBuilder optionInitSignatureBuilder = new StringBuilder("(");
254
 
229
 
262
 			optionInitDescBuilder.append(")V");
237
 			optionInitDescBuilder.append(")V");
263
 			optionInitSignatureBuilder.append(")V");
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
 			initWriter.start();
242
 			initWriter.start();
268
 			initWriter.loadObject(0);
243
 			initWriter.loadObject(0);
269
 			initWriter.dup();
244
 			initWriter.dup();
270
-			initWriter.invokeSpecial(variantName, "<init>", "()V");
245
+			initWriter.invokeSpecial(toClass.internalName, "<init>", "()V");
271
 			for (int i = 0; i < types.length; ++i) {
246
 			for (int i = 0; i < types.length; ++i) {
272
 				initWriter.dup();
247
 				initWriter.dup();
273
 				initWriter.loadObject(i + 1);
248
 				initWriter.loadObject(i + 1);
274
 
249
 
275
 				final String descriptor = context.getDescriptor(types[i]);
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
 			initWriter.pop();
253
 			initWriter.pop();
279
 			initWriter.ret();
254
 			initWriter.ret();
280
 			initWriter.end();
255
 			initWriter.end();
281
 
256
 
282
-
283
 			//Denominator for switch-cases
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
 			getDenominator.start();
260
 			getDenominator.start();
286
 			getDenominator.constant(option.ordinal);
261
 			getDenominator.constant(option.ordinal);
287
 			getDenominator.returnInt();
262
 			getDenominator.returnInt();
288
 			getDenominator.end();
263
 			getDenominator.end();
289
 
264
 
290
-
291
 			optionVisitor.end();
265
 			optionVisitor.end();
292
 			optionWriter.visitEnd();
266
 			optionWriter.visitEnd();
293
 			final byte[] byteArray = optionWriter.toByteArray();
267
 			final byte[] byteArray = optionWriter.toByteArray();
294
-			context.register(optionClassName, byteArray);
268
+			context.register(optionTag.variantOptionClass.internalName, byteArray);
295
 
269
 
296
 			//Print the option files, won't be in production
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
 				out.write(byteArray);
272
 				out.write(byteArray);
299
 			} catch (IOException e) {
273
 			} catch (IOException e) {
300
 				e.printStackTrace();
274
 				e.printStackTrace();
306
 			member.accept(visitor);
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
 		superInitWriter.start();
284
 		superInitWriter.start();
311
 		superInitWriter.loadObject(0);
285
 		superInitWriter.loadObject(0);
312
 		superInitWriter.invokeSpecial("java/lang/Object", "<init>", "()V");
286
 		superInitWriter.invokeSpecial("java/lang/Object", "<init>", "()V");

+ 12
- 30
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/definitions/JavaMemberVisitor.java Näytä tiedosto

10
 import org.openzen.zenscript.codemodel.definition.EnumDefinition;
10
 import org.openzen.zenscript.codemodel.definition.EnumDefinition;
11
 import org.openzen.zenscript.codemodel.expression.Expression;
11
 import org.openzen.zenscript.codemodel.expression.Expression;
12
 import org.openzen.zenscript.codemodel.member.*;
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
 import org.openzen.zenscript.javabytecode.compiler.*;
14
 import org.openzen.zenscript.javabytecode.compiler.*;
16
 
15
 
17
 import java.util.List;
16
 import java.util.List;
18
 import org.openzen.zenscript.javabytecode.JavaBytecodeContext;
17
 import org.openzen.zenscript.javabytecode.JavaBytecodeContext;
19
 import org.openzen.zenscript.javashared.JavaClass;
18
 import org.openzen.zenscript.javashared.JavaClass;
20
 import org.openzen.zenscript.javashared.JavaField;
19
 import org.openzen.zenscript.javashared.JavaField;
20
+import org.openzen.zenscript.javashared.JavaMethod;
21
 
21
 
22
 public class JavaMemberVisitor implements MemberVisitor<Void> {
22
 public class JavaMemberVisitor implements MemberVisitor<Void> {
23
     private final ClassWriter writer;
23
     private final ClassWriter writer;
33
         this.definition = definition;
33
         this.definition = definition;
34
 		this.context = context;
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
         this.clinitStatementVisitor = new JavaStatementVisitor(context, javaWriter);
37
         this.clinitStatementVisitor = new JavaStatementVisitor(context, javaWriter);
38
         this.clinitStatementVisitor.start();
38
         this.clinitStatementVisitor.start();
39
         CompilerUtils.writeDefaultFieldInitializers(context, javaWriter, definition, true);
39
         CompilerUtils.writeDefaultFieldInitializers(context, javaWriter, definition, true);
41
 
41
 
42
 	@Override
42
 	@Override
43
 	public Void visitConst(ConstMember member) {
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
         return null;
46
         return null;
50
 	}
47
 	}
51
 
48
 
52
 	@Override
49
 	@Override
53
 	public Void visitField(FieldMember member) {
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
         return null;
53
         return null;
61
     }
54
     }
62
 
55
 
63
     @Override
56
     @Override
64
     public Void visitConstructor(ConstructorMember member) {
57
     public Void visitConstructor(ConstructorMember member) {
65
         final boolean isEnum = definition instanceof EnumDefinition;
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
         final Label constructorStart = new Label();
61
         final Label constructorStart = new Label();
70
         final Label constructorEnd = new Label();
62
         final Label constructorEnd = new Label();
94
 				constructorWriter.invokeSpecial(Type.getInternalName(Enum.class), "<init>", "(Ljava/lang/String;I)V");
86
 				constructorWriter.invokeSpecial(Type.getInternalName(Enum.class), "<init>", "(Ljava/lang/String;I)V");
95
 			} else if (definition.getSuperType() == null) {
87
 			} else if (definition.getSuperType() == null) {
96
 				System.out.println("Writing regular constructor");
88
 				System.out.println("Writing regular constructor");
97
-				constructorWriter.load(Type.getType(Object.class), 0);
89
+				constructorWriter.loadObject(0);
98
 				constructorWriter.invokeSpecial(Type.getInternalName(Object.class), "<init>", "()V");
90
 				constructorWriter.invokeSpecial(Type.getInternalName(Object.class), "<init>", "()V");
99
 			}
91
 			}
100
-
101
         }
92
         }
102
 
93
 
103
 		member.body.accept(statementVisitor);
94
 		member.body.accept(statementVisitor);
108
 
99
 
109
 	@Override
100
 	@Override
110
 	public Void visitDestructor(DestructorMember member) {
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
 		final Label constructorStart = new Label();
104
 		final Label constructorStart = new Label();
114
 		final Label constructorEnd = new Label();
105
 		final Label constructorEnd = new Label();
129
         CompilerUtils.tagMethodParameters(context, member.header, member.isStatic());
120
         CompilerUtils.tagMethodParameters(context, member.header, member.isStatic());
130
 
121
 
131
         final boolean isAbstract = member.body == null || Modifiers.isAbstract(member.modifiers);
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
 		final Label methodStart = new Label();
125
 		final Label methodStart = new Label();
142
 		final Label methodEnd = new Label();
126
 		final Label methodEnd = new Label();
157
 			methodWriter.label(methodEnd);
141
 			methodWriter.label(methodEnd);
158
 			statementVisitor.end();
142
 			statementVisitor.end();
159
 		}
143
 		}
160
-
161
-		member.setTag(JavaMethodInfo.class, method);
162
 		return null;
144
 		return null;
163
 	}
145
 	}
164
 
146
 
183
 	}
165
 	}
184
 
166
 
185
 	@Override
167
 	@Override
186
-	public Void visitCustomIterator(CustomIteratorMember member) {
168
+	public Void visitCustomIterator(IteratorMember member) {
187
 		return null;
169
 		return null;
188
 	}
170
 	}
189
 
171
 

+ 0
- 9
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/definitions/JavaOptionInfoTag.java Näytä tiedosto

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 Näytä tiedosto

47
 		return new JavaClass(pkg, internalName, kind, nameParts);
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
 	public final JavaClass outer;
57
 	public final JavaClass outer;
51
 	
58
 	
52
 	public final String pkg;
59
 	public final String pkg;

+ 2
- 2
JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaContext.java Näytä tiedosto

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

+ 4
- 3
JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaField.java Näytä tiedosto

12
 public class JavaField {
12
 public class JavaField {
13
 	public final JavaClass cls;
13
 	public final JavaClass cls;
14
 	public final String name;
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
 		this.cls = cls;
19
 		this.cls = cls;
19
 		this.name = name;
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 Näytä tiedosto

10
  * @author Hoofdgebruiker
10
  * @author Hoofdgebruiker
11
  */
11
  */
12
 public class JavaMethod {
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
 	public final JavaClass cls;
45
 	public final JavaClass cls;
14
 	public final Kind kind;
46
 	public final Kind kind;
15
 	public final String name;
47
 	public final String name;
18
 	
50
 	
19
 	public final String descriptor;
51
 	public final String descriptor;
20
 	public final int modifiers;
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
 		this.cls = cls;
56
 		this.cls = cls;
24
 		this.kind = kind;
57
 		this.kind = kind;
25
 		this.name = name;
58
 		this.name = name;
28
 		
61
 		
29
 		this.descriptor = descriptor;
62
 		this.descriptor = descriptor;
30
 		this.modifiers = modifiers;
63
 		this.modifiers = modifiers;
64
+		this.genericResult = genericResult;
31
 	}
65
 	}
32
 	
66
 	
33
 	public JavaMethod(JavaNativeTranslation<?> translation) {
67
 	public JavaMethod(JavaNativeTranslation<?> translation) {
38
 		this.translation = translation;
72
 		this.translation = translation;
39
 		this.descriptor = "";
73
 		this.descriptor = "";
40
 		this.modifiers = 0;
74
 		this.modifiers = 0;
75
+		this.genericResult = false;
41
 	}
76
 	}
42
 	
77
 	
43
 	public enum Kind {
78
 	public enum Kind {
44
 		STATIC,
79
 		STATIC,
80
+		STATICINIT,
45
 		INSTANCE,
81
 		INSTANCE,
46
 		EXPANSION,
82
 		EXPANSION,
47
 		CONSTRUCTOR,
83
 		CONSTRUCTOR,

+ 2
- 2
JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaNativeClass.java Näytä tiedosto

31
 	}
31
 	}
32
 	
32
 	
33
 	public void addConstructor(String key, String descriptor) {
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
 	public void addInstanceMethod(String key, String name, String descriptor) {
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
 	public JavaMethod getMethod(String name) {
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 Näytä tiedosto

3
  * To change this template file, choose Tools | Templates
3
  * To change this template file, choose Tools | Templates
4
  * and open the template in the editor.
4
  * and open the template in the editor.
5
  */
5
  */
6
-package org.openzen.zenscript.javabytecode;
7
-
8
-import org.objectweb.asm.Type;
6
+package org.openzen.zenscript.javashared;
9
 
7
 
10
 /**
8
 /**
11
  * @author Hoofdgebruiker
9
  * @author Hoofdgebruiker
12
  */
10
  */
13
 public class JavaParameterInfo {
11
 public class JavaParameterInfo {
14
 	public final int index;
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
 		this.index = index;
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 Näytä tiedosto

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

+ 3
- 4
JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaSyntheticTypeSignatureConverter.java Näytä tiedosto

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

+ 8
- 1
JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaTypeDescriptorVisitor.java Näytä tiedosto

33
 				case UINT: return "Ljava/lang/Integer;";
33
 				case UINT: return "Ljava/lang/Integer;";
34
 				case LONG: return "Ljava/lang/Long;";
34
 				case LONG: return "Ljava/lang/Long;";
35
 				case ULONG: return "Ljava/lang/Long;";
35
 				case ULONG: return "Ljava/lang/Long;";
36
+				case USIZE: return "I"; // special case: optional usize fits in an int where null = -1
36
 				case FLOAT: return "Ljava/lang/Float;";
37
 				case FLOAT: return "Ljava/lang/Float;";
37
 				case DOUBLE: return "Ljava/lang/Double;";
38
 				case DOUBLE: return "Ljava/lang/Double;";
38
 				case STRING: return "Ljava/lang/String;";
39
 				case STRING: return "Ljava/lang/String;";
52
 				case UINT: return "I";
53
 				case UINT: return "I";
53
 				case LONG: return "J";
54
 				case LONG: return "J";
54
 				case ULONG: return "J";
55
 				case ULONG: return "J";
56
+				case USIZE: return "I";
55
 				case FLOAT: return "F";
57
 				case FLOAT: return "F";
56
 				case DOUBLE: return "D";
58
 				case DOUBLE: return "D";
57
 				case STRING: return "Ljava/lang/String;";
59
 				case STRING: return "Ljava/lang/String;";
63
 
65
 
64
     @Override
66
     @Override
65
     public String visitArray(ArrayTypeID array) {
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
     @Override
76
     @Override

+ 2
- 0
JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaTypeInternalNameVisitor.java Näytä tiedosto

33
 				case UINT: return "java/lang/Integer";
33
 				case UINT: return "java/lang/Integer";
34
 				case LONG: return "java/lang/Long";
34
 				case LONG: return "java/lang/Long";
35
 				case ULONG: return "java/lang/Long";
35
 				case ULONG: return "java/lang/Long";
36
+				case USIZE: return "java/lang/Integer";
36
 				case FLOAT: return "java/lang/Float";
37
 				case FLOAT: return "java/lang/Float";
37
 				case DOUBLE: return "java/lang/Double";
38
 				case DOUBLE: return "java/lang/Double";
38
 				case STRING: return "java/lang/String";
39
 				case STRING: return "java/lang/String";
52
 				case UINT: return "I";
53
 				case UINT: return "I";
53
 				case LONG: return "J";
54
 				case LONG: return "J";
54
 				case ULONG: return "J";
55
 				case ULONG: return "J";
56
+				case USIZE: return "I";
55
 				case FLOAT: return "F";
57
 				case FLOAT: return "F";
56
 				case DOUBLE: return "D";
58
 				case DOUBLE: return "D";
57
 				case STRING: return "java/lang/String";
59
 				case STRING: return "java/lang/String";

+ 2
- 4
JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaTypeNameVisitor.java Näytä tiedosto

76
 		for (FunctionParameter parameter : function.header.parameters)
76
 		for (FunctionParameter parameter : function.header.parameters)
77
 			result.append(parameter.type.accept(this));
77
 			result.append(parameter.type.accept(this));
78
 		result.append("To");
78
 		result.append("To");
79
-		result.append(function.header.returnType.accept(this));
79
+		result.append(function.header.getReturnType().accept(this));
80
 		result.append("Function");
80
 		result.append("Function");
81
 		return result.toString();
81
 		return result.toString();
82
 	}
82
 	}
93
 
93
 
94
 	@Override
94
 	@Override
95
 	public String visitRange(RangeTypeID range) {
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
 	@Override
99
 	@Override

+ 34
- 20
JavaShared/src/main/java/org/openzen/zenscript/javashared/prepare/JavaPrepareClassMethodVisitor.java Näytä tiedosto

7
 
7
 
8
 import org.openzen.zenscript.javashared.JavaNativeClass;
8
 import org.openzen.zenscript.javashared.JavaNativeClass;
9
 import org.openzen.zencode.shared.StringExpansion;
9
 import org.openzen.zencode.shared.StringExpansion;
10
+import org.openzen.zenscript.codemodel.FunctionHeader;
10
 import org.openzen.zenscript.codemodel.OperatorType;
11
 import org.openzen.zenscript.codemodel.OperatorType;
11
 import org.openzen.zenscript.codemodel.annotations.NativeTag;
12
 import org.openzen.zenscript.codemodel.annotations.NativeTag;
12
 import org.openzen.zenscript.codemodel.member.CallerMember;
13
 import org.openzen.zenscript.codemodel.member.CallerMember;
13
 import org.openzen.zenscript.codemodel.member.CasterMember;
14
 import org.openzen.zenscript.codemodel.member.CasterMember;
14
 import org.openzen.zenscript.codemodel.member.ConstMember;
15
 import org.openzen.zenscript.codemodel.member.ConstMember;
15
 import org.openzen.zenscript.codemodel.member.ConstructorMember;
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
 import org.openzen.zenscript.codemodel.member.DefinitionMember;
18
 import org.openzen.zenscript.codemodel.member.DefinitionMember;
18
 import org.openzen.zenscript.codemodel.member.DestructorMember;
19
 import org.openzen.zenscript.codemodel.member.DestructorMember;
19
 import org.openzen.zenscript.codemodel.member.FieldMember;
20
 import org.openzen.zenscript.codemodel.member.FieldMember;
20
-import org.openzen.zenscript.codemodel.member.FunctionalMember;
21
 import org.openzen.zenscript.codemodel.member.GetterMember;
21
 import org.openzen.zenscript.codemodel.member.GetterMember;
22
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
22
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
23
 import org.openzen.zenscript.codemodel.member.ImplementationMember;
23
 import org.openzen.zenscript.codemodel.member.ImplementationMember;
28
 import org.openzen.zenscript.codemodel.member.SetterMember;
28
 import org.openzen.zenscript.codemodel.member.SetterMember;
29
 import org.openzen.zenscript.codemodel.member.StaticInitializerMember;
29
 import org.openzen.zenscript.codemodel.member.StaticInitializerMember;
30
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
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
 import org.openzen.zenscript.javashared.JavaTypeNameVisitor;
34
 import org.openzen.zenscript.javashared.JavaTypeNameVisitor;
32
 import org.openzen.zenscript.javashared.JavaClass;
35
 import org.openzen.zenscript.javashared.JavaClass;
33
 import org.openzen.zenscript.javashared.JavaField;
36
 import org.openzen.zenscript.javashared.JavaField;
44
 	private static final boolean DEBUG_EMPTY = true;
47
 	private static final boolean DEBUG_EMPTY = true;
45
 	
48
 	
46
 	private final JavaContext context;
49
 	private final JavaContext context;
47
-	private final String filename;
48
 	private final JavaClass cls;
50
 	private final JavaClass cls;
49
 	private final JavaNativeClass nativeClass;
51
 	private final JavaNativeClass nativeClass;
50
 	private final JavaPrepareDefinitionMemberVisitor memberPreparer;
52
 	private final JavaPrepareDefinitionMemberVisitor memberPreparer;
51
 	
53
 	
52
 	public JavaPrepareClassMethodVisitor(
54
 	public JavaPrepareClassMethodVisitor(
53
 			JavaContext context,
55
 			JavaContext context,
54
-			String filename,
55
 			JavaClass cls,
56
 			JavaClass cls,
56
 			JavaNativeClass nativeClass,
57
 			JavaNativeClass nativeClass,
57
 			JavaPrepareDefinitionMemberVisitor memberPreparer,
58
 			JavaPrepareDefinitionMemberVisitor memberPreparer,
58
 			boolean startsEmpty) {
59
 			boolean startsEmpty) {
59
 		this.context = context;
60
 		this.context = context;
60
-		this.filename = filename;
61
 		this.cls = cls;
61
 		this.cls = cls;
62
 		this.nativeClass = nativeClass;
62
 		this.nativeClass = nativeClass;
63
 		this.memberPreparer = memberPreparer;
63
 		this.memberPreparer = memberPreparer;
88
 
88
 
89
 	@Override
89
 	@Override
90
 	public Void visitConstructor(ConstructorMember member) {
90
 	public Void visitConstructor(ConstructorMember member) {
91
-		visitFunctional(member, "<init>");
91
+		visitFunctional(member, member.header, "<init>");
92
 		return null;
92
 		return null;
93
 	}
93
 	}
94
 
94
 
103
 
103
 
104
 	@Override
104
 	@Override
105
 	public Void visitMethod(MethodMember member) {
105
 	public Void visitMethod(MethodMember member) {
106
-		visitFunctional(member, member.name);
106
+		visitFunctional(member, member.header, member.name);
107
 		return null;
107
 		return null;
108
 	}
108
 	}
109
 
109
 
110
 	@Override
110
 	@Override
111
 	public Void visitGetter(GetterMember member) {
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
 		return null;
113
 		return null;
114
 	}
114
 	}
115
 
115
 
116
 	@Override
116
 	@Override
117
 	public Void visitSetter(SetterMember member) {
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
 		return null;
119
 		return null;
120
 	}
120
 	}
121
 
121
 
122
 	@Override
122
 	@Override
123
 	public Void visitOperator(OperatorMember member) {
123
 	public Void visitOperator(OperatorMember member) {
124
-		visitFunctional(member, getOperatorName(member.operator));
124
+		visitFunctional(member, member.header, getOperatorName(member.operator));
125
 		return null;
125
 		return null;
126
 	}
126
 	}
127
 
127
 
128
 	@Override
128
 	@Override
129
 	public Void visitCaster(CasterMember member) {
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
 		return null;
131
 		return null;
132
 	}
132
 	}
133
 
133
 
134
 	@Override
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
 		return null;
137
 		return null;
138
 	}
138
 	}
139
 
139
 
140
 	@Override
140
 	@Override
141
 	public Void visitCaller(CallerMember member) {
141
 	public Void visitCaller(CallerMember member) {
142
-		visitFunctional(member, "call");
142
+		visitFunctional(member, member.header, "call");
143
 		return null;
143
 		return null;
144
 	}
144
 	}
145
 
145
 
160
 			JavaClass implementationClass = new JavaClass(cls, member.type.accept(new JavaTypeNameVisitor()) + "Implementation", JavaClass.Kind.CLASS);
160
 			JavaClass implementationClass = new JavaClass(cls, member.type.accept(new JavaTypeNameVisitor()) + "Implementation", JavaClass.Kind.CLASS);
161
 			member.setTag(JavaImplementation.class, new JavaImplementation(false, implementationClass));
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
 			for (IDefinitionMember m : member.members)
164
 			for (IDefinitionMember m : member.members)
165
 				m.accept(visitor);
165
 				m.accept(visitor);
166
 		}
166
 		}
173
 
173
 
174
 	@Override
174
 	@Override
175
 	public Void visitInnerDefinition(InnerDefinitionMember member) {
175
 	public Void visitInnerDefinition(InnerDefinitionMember member) {
176
-		JavaPrepareDefinitionMemberVisitor innerDefinitionPrepare = new JavaPrepareDefinitionMemberVisitor(context, filename);
176
+		JavaPrepareDefinitionMemberVisitor innerDefinitionPrepare = new JavaPrepareDefinitionMemberVisitor(context);
177
 		member.innerDefinition.accept(innerDefinitionPrepare);
177
 		member.innerDefinition.accept(innerDefinitionPrepare);
178
 		
178
 		
179
 		if (DEBUG_EMPTY && cls.empty)
179
 		if (DEBUG_EMPTY && cls.empty)
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
 		NativeTag nativeTag = member.getTag(NativeTag.class);
285
 		NativeTag nativeTag = member.getTag(NativeTag.class);
286
 		JavaMethod method = null;
286
 		JavaMethod method = null;
287
 		if (nativeTag != null && nativeClass != null)
287
 		if (nativeTag != null && nativeClass != null)
293
 			if (baseMethod == null)
293
 			if (baseMethod == null)
294
 				throw new IllegalStateException("Base method not yet prepared!");
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
 		} else if (method == null) {
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
 			if (DEBUG_EMPTY && cls.empty)
316
 			if (DEBUG_EMPTY && cls.empty)
303
 				System.out.println("Class " + cls.fullName + " not empty because of " + member.describe());
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 Näytä tiedosto

30
  */
30
  */
31
 public class JavaPrepareDefinitionMemberVisitor implements DefinitionVisitor<JavaClass> {
31
 public class JavaPrepareDefinitionMemberVisitor implements DefinitionVisitor<JavaClass> {
32
 	private final JavaContext context;
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
 		this.context = context;
35
 		this.context = context;
37
-		this.filename = filename;
38
 	}
36
 	}
39
 	
37
 	
40
 	private boolean isPrepared(HighLevelDefinition definition) {
38
 	private boolean isPrepared(HighLevelDefinition definition) {
46
 			return;
44
 			return;
47
 			
45
 			
48
 		HighLevelDefinition definition = ((DefinitionTypeID)type).definition;
46
 		HighLevelDefinition definition = ((DefinitionTypeID)type).definition;
47
+		System.out.println("Preparing " + definition.name);
49
 		definition.accept(this);
48
 		definition.accept(this);
50
 	}
49
 	}
51
 	
50
 	
90
 			return definition.getTag(JavaClass.class);
89
 			return definition.getTag(JavaClass.class);
91
 		
90
 		
92
 		JavaClass cls = definition.getTag(JavaClass.class);
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
 		definition.caller.setTag(JavaMethod.class, method);
93
 		definition.caller.setTag(JavaMethod.class, method);
95
 		return cls;
94
 		return cls;
96
 	}
95
 	}
138
 	
137
 	
139
 	private void visitClassMembers(HighLevelDefinition definition, JavaClass cls, JavaNativeClass nativeClass, boolean startsEmpty) {
138
 	private void visitClassMembers(HighLevelDefinition definition, JavaClass cls, JavaNativeClass nativeClass, boolean startsEmpty) {
140
 		System.out.println("Preparing " + cls.internalName);
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
 		for (IDefinitionMember member : definition.members) {
141
 		for (IDefinitionMember member : definition.members) {
143
 			member.accept(methodVisitor);
142
 			member.accept(methodVisitor);
144
 		}
143
 		}

+ 30
- 11
JavaShared/src/main/java/org/openzen/zenscript/javashared/prepare/JavaPrepareDefinitionVisitor.java Näytä tiedosto

29
 import org.openzen.zenscript.codemodel.type.ITypeID;
29
 import org.openzen.zenscript.codemodel.type.ITypeID;
30
 import org.openzen.zenscript.javashared.JavaClass;
30
 import org.openzen.zenscript.javashared.JavaClass;
31
 import org.openzen.zenscript.javashared.JavaMethod;
31
 import org.openzen.zenscript.javashared.JavaMethod;
32
-import org.openzen.zenscript.javashared.JavaModifiers;
33
 import org.openzen.zenscript.javashared.JavaVariantOption;
32
 import org.openzen.zenscript.javashared.JavaVariantOption;
34
 
33
 
35
 /**
34
 /**
56
 			cls.addInstanceMethod("appendUInt", "append", "(I)Ljava/lang/StringBuilder;");
55
 			cls.addInstanceMethod("appendUInt", "append", "(I)Ljava/lang/StringBuilder;");
57
 			cls.addInstanceMethod("appendLong", "append", "(J)Ljava/lang/StringBuilder;");
56
 			cls.addInstanceMethod("appendLong", "append", "(J)Ljava/lang/StringBuilder;");
58
 			cls.addInstanceMethod("appendULong", "append", "(J)Ljava/lang/StringBuilder;");
57
 			cls.addInstanceMethod("appendULong", "append", "(J)Ljava/lang/StringBuilder;");
58
+			cls.addInstanceMethod("appendUSize", "append", "(I)Ljava/lang/StringBuilder;");
59
 			cls.addInstanceMethod("appendFloat", "append", "(F)Ljava/lang/StringBuilder;");
59
 			cls.addInstanceMethod("appendFloat", "append", "(F)Ljava/lang/StringBuilder;");
60
 			cls.addInstanceMethod("appendDouble", "append", "(D)Ljava/lang/StringBuilder;");
60
 			cls.addInstanceMethod("appendDouble", "append", "(D)Ljava/lang/StringBuilder;");
61
 			cls.addInstanceMethod("appendChar", "append", "(C)Ljava/lang/StringBuilder;");
61
 			cls.addInstanceMethod("appendChar", "append", "(C)Ljava/lang/StringBuilder;");
67
 		{
67
 		{
68
 			JavaNativeClass list = new JavaNativeClass(new JavaClass("java.util", "List", JavaClass.Kind.INTERFACE));
68
 			JavaNativeClass list = new JavaNativeClass(new JavaClass("java.util", "List", JavaClass.Kind.INTERFACE));
69
 			JavaClass arrayList = new JavaClass("java.util", "ArrayList", JavaClass.Kind.CLASS);
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
 			list.addInstanceMethod("add", "add", "(Ljava/lang/Object;)Z"); List<?> l;
71
 			list.addInstanceMethod("add", "add", "(Ljava/lang/Object;)Z"); List<?> l;
72
 			list.addInstanceMethod("insert", "add", "(Ljava/lang/Object;I)V");
72
 			list.addInstanceMethod("insert", "add", "(Ljava/lang/Object;I)V");
73
 			list.addInstanceMethod("remove", "remove", "(java/lang/Object;)Z");
73
 			list.addInstanceMethod("remove", "remove", "(java/lang/Object;)Z");
107
 			JavaClass math = new JavaClass("java.lang", "Math", JavaClass.Kind.CLASS);
107
 			JavaClass math = new JavaClass("java.lang", "Math", JavaClass.Kind.CLASS);
108
 			
108
 			
109
 			JavaNativeClass cls = new JavaNativeClass(integer);
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
 			nativeClasses.put("stdlib::Integer", cls);
113
 			nativeClasses.put("stdlib::Integer", cls);
114
+			nativeClasses.put("stdlib::USize", cls);
114
 		}
115
 		}
115
 		
116
 		
116
 		{
117
 		{
132
 		{
133
 		{
133
 			JavaClass arrays = new JavaClass("java.lang", "Arrays", JavaClass.Kind.CLASS);
134
 			JavaClass arrays = new JavaClass("java.lang", "Arrays", JavaClass.Kind.CLASS);
134
 			JavaNativeClass cls = new JavaNativeClass(arrays);
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
 			cls.addMethod("sorted", new JavaMethod((expression, translator) -> {
137
 			cls.addMethod("sorted", new JavaMethod((expression, translator) -> {
137
 				return translator.sorted(((CallExpression)expression).target);
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
 			cls.addMethod("sortedWithComparator", new JavaMethod((expression, translator) -> {
141
 			cls.addMethod("sortedWithComparator", new JavaMethod((expression, translator) -> {
141
 				return translator.sortedWithComparator(
142
 				return translator.sortedWithComparator(
142
 						((CallExpression)expression).target,
143
 						((CallExpression)expression).target,
145
 			cls.addMethod("copy", new JavaMethod((expression, translator) -> {
146
 			cls.addMethod("copy", new JavaMethod((expression, translator) -> {
146
 				return translator.copy(((CallExpression)expression).target);
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
 			cls.addMethod("copyTo", new JavaMethod((expression, translator) -> {
150
 			cls.addMethod("copyTo", new JavaMethod((expression, translator) -> {
150
 				return translator.copyTo((CallExpression)expression);
151
 				return translator.copyTo((CallExpression)expression);
151
 			}));
152
 			}));
189
 			cls.addInstanceMethod("readSlice", "read", "([CII)I");
190
 			cls.addInstanceMethod("readSlice", "read", "([CII)I");
190
 			nativeClasses.put("io::StringReader", cls);
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
 	private final String filename;
213
 	private final String filename;
251
 		if (isPrepared(definition))
270
 		if (isPrepared(definition))
252
 			return definition.getTag(JavaClass.class);
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
 		definition.setTag(JavaClass.class, cls);
274
 		definition.setTag(JavaClass.class, cls);
256
 		return cls;
275
 		return cls;
257
 	}
276
 	}
266
 			definition.setTag(JavaNativeClass.class, nativeClasses.get(nativeTag.value));
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
 		definition.setTag(JavaClass.class, cls);
289
 		definition.setTag(JavaClass.class, cls);
271
 		return cls;
290
 		return cls;
272
 	}
291
 	}
286
 		variant.setTag(JavaClass.class, cls);
305
 		variant.setTag(JavaClass.class, cls);
287
 		
306
 		
288
 		for (VariantDefinition.Option option : variant.options) {
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
 			option.setTag(JavaVariantOption.class, new JavaVariantOption(cls, variantCls));
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 Näytä tiedosto

7
 
7
 
8
 import org.openzen.zenscript.javashared.JavaNativeClass;
8
 import org.openzen.zenscript.javashared.JavaNativeClass;
9
 import org.openzen.zencode.shared.StringExpansion;
9
 import org.openzen.zencode.shared.StringExpansion;
10
+import org.openzen.zenscript.codemodel.FunctionHeader;
10
 import org.openzen.zenscript.codemodel.OperatorType;
11
 import org.openzen.zenscript.codemodel.OperatorType;
11
 import org.openzen.zenscript.codemodel.annotations.NativeTag;
12
 import org.openzen.zenscript.codemodel.annotations.NativeTag;
12
 import org.openzen.zenscript.codemodel.member.CallerMember;
13
 import org.openzen.zenscript.codemodel.member.CallerMember;
13
 import org.openzen.zenscript.codemodel.member.CasterMember;
14
 import org.openzen.zenscript.codemodel.member.CasterMember;
14
 import org.openzen.zenscript.codemodel.member.ConstMember;
15
 import org.openzen.zenscript.codemodel.member.ConstMember;
15
 import org.openzen.zenscript.codemodel.member.ConstructorMember;
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
 import org.openzen.zenscript.codemodel.member.DefinitionMember;
18
 import org.openzen.zenscript.codemodel.member.DefinitionMember;
18
 import org.openzen.zenscript.codemodel.member.DestructorMember;
19
 import org.openzen.zenscript.codemodel.member.DestructorMember;
19
 import org.openzen.zenscript.codemodel.member.FieldMember;
20
 import org.openzen.zenscript.codemodel.member.FieldMember;
20
-import org.openzen.zenscript.codemodel.member.FunctionalMember;
21
 import org.openzen.zenscript.codemodel.member.GetterMember;
21
 import org.openzen.zenscript.codemodel.member.GetterMember;
22
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
22
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
23
 import org.openzen.zenscript.codemodel.member.ImplementationMember;
23
 import org.openzen.zenscript.codemodel.member.ImplementationMember;
27
 import org.openzen.zenscript.codemodel.member.OperatorMember;
27
 import org.openzen.zenscript.codemodel.member.OperatorMember;
28
 import org.openzen.zenscript.codemodel.member.SetterMember;
28
 import org.openzen.zenscript.codemodel.member.SetterMember;
29
 import org.openzen.zenscript.codemodel.member.StaticInitializerMember;
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
 import org.openzen.zenscript.javashared.JavaTypeNameVisitor;
32
 import org.openzen.zenscript.javashared.JavaTypeNameVisitor;
31
 import org.openzen.zenscript.javashared.JavaClass;
33
 import org.openzen.zenscript.javashared.JavaClass;
32
 import org.openzen.zenscript.javashared.JavaField;
34
 import org.openzen.zenscript.javashared.JavaField;
75
 
77
 
76
 	@Override
78
 	@Override
77
 	public Void visitConstructor(ConstructorMember member) {
79
 	public Void visitConstructor(ConstructorMember member) {
78
-		visitFunctional(member, "");
80
+		visitFunctional(member, member.header, "");
79
 		return null;
81
 		return null;
80
 	}
82
 	}
81
 
83
 
84
 		if (nativeClass != null && nativeClass.nonDestructible)
86
 		if (nativeClass != null && nativeClass.nonDestructible)
85
 			return null;
87
 			return null;
86
 		
88
 		
87
-		visitFunctional(member, "");
89
+		visitFunctional(member, member.header, "");
88
 		return null;
90
 		return null;
89
 	}
91
 	}
90
 
92
 
91
 	@Override
93
 	@Override
92
 	public Void visitMethod(MethodMember member) {
94
 	public Void visitMethod(MethodMember member) {
93
-		visitFunctional(member, member.name);
95
+		visitFunctional(member, member.header, member.name);
94
 		return null;
96
 		return null;
95
 	}
97
 	}
96
 
98
 
97
 	@Override
99
 	@Override
98
 	public Void visitGetter(GetterMember member) {
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
 		return null;
102
 		return null;
101
 	}
103
 	}
102
 
104
 
103
 	@Override
105
 	@Override
104
 	public Void visitSetter(SetterMember member) {
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
 		return null;
108
 		return null;
107
 	}
109
 	}
108
 
110
 
109
 	@Override
111
 	@Override
110
 	public Void visitOperator(OperatorMember member) {
112
 	public Void visitOperator(OperatorMember member) {
111
-		visitFunctional(member, getOperatorName(member.operator));
113
+		visitFunctional(member, member.header, getOperatorName(member.operator));
112
 		return null;
114
 		return null;
113
 	}
115
 	}
114
 
116
 
115
 	@Override
117
 	@Override
116
 	public Void visitCaster(CasterMember member) {
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
 		return null;
120
 		return null;
119
 	}
121
 	}
120
 
122
 
121
 	@Override
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
 		return null;
126
 		return null;
125
 	}
127
 	}
126
 
128
 
127
 	@Override
129
 	@Override
128
 	public Void visitCaller(CallerMember member) {
130
 	public Void visitCaller(CallerMember member) {
129
-		visitFunctional(member, "call");
131
+		visitFunctional(member, member.header, "call");
130
 		return null;
132
 		return null;
131
 	}
133
 	}
132
 
134
 
153
 		return null;
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
 		NativeTag nativeTag = member.getTag(NativeTag.class);
159
 		NativeTag nativeTag = member.getTag(NativeTag.class);
158
 		JavaMethod method = null;
160
 		JavaMethod method = null;
159
 		if (nativeTag != null && nativeClass != null)
161
 		if (nativeTag != null && nativeClass != null)
160
 			method = nativeClass.getMethod(nativeTag.value);
162
 			method = nativeClass.getMethod(nativeTag.value);
161
 		if (method == null)
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
 		if (method.compile) {
166
 		if (method.compile) {
165
 			if (DEBUG_EMPTY && cls.empty)
167
 			if (DEBUG_EMPTY && cls.empty)

+ 6
- 0
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/ExpressionHoistingChecker.java Näytä tiedosto

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

+ 3
- 4
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/FormattingUtils.java Näytä tiedosto

7
 
7
 
8
 import org.openzen.zenscript.codemodel.FunctionHeader;
8
 import org.openzen.zenscript.codemodel.FunctionHeader;
9
 import org.openzen.zenscript.codemodel.FunctionParameter;
9
 import org.openzen.zenscript.codemodel.FunctionParameter;
10
-import org.openzen.zenscript.codemodel.Modifiers;
11
 import org.openzen.zenscript.codemodel.expression.CallArguments;
10
 import org.openzen.zenscript.codemodel.expression.CallArguments;
12
 import org.openzen.zenscript.codemodel.expression.Expression;
11
 import org.openzen.zenscript.codemodel.expression.Expression;
13
 import org.openzen.zenscript.codemodel.generic.GenericParameterBound;
12
 import org.openzen.zenscript.codemodel.generic.GenericParameterBound;
39
 			
38
 			
40
 			if (!settings.showAnyInFunctionHeaders || parameter.type != BasicTypeID.UNDETERMINED) {
39
 			if (!settings.showAnyInFunctionHeaders || parameter.type != BasicTypeID.UNDETERMINED) {
41
 				result.append(" as ");
40
 				result.append(" as ");
42
-				result.append(header.returnType.accept(typeFormatter));
41
+				result.append(header.getReturnType().accept(typeFormatter));
43
 			}
42
 			}
44
 			
43
 			
45
 			parameterIndex++;
44
 			parameterIndex++;
46
 		}
45
 		}
47
 		result.append(")");
46
 		result.append(")");
48
-		if (!settings.showAnyInFunctionHeaders || header.returnType != BasicTypeID.UNDETERMINED) {
47
+		if (!settings.showAnyInFunctionHeaders || header.getReturnType() != BasicTypeID.UNDETERMINED) {
49
 			result.append(" as ");
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 Näytä tiedosto

190
 				output.append(",\n");
190
 				output.append(",\n");
191
 			}
191
 			}
192
 			output.append("\t").append(constant.name);
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
 				output.append("(");
194
 				output.append("(");
196
 				boolean first = true;
195
 				boolean first = true;
197
 				for (Expression argument : constant.constructor.arguments.arguments) {
196
 				for (Expression argument : constant.constructor.arguments.arguments) {

+ 4
- 4
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaExpansionMemberCompiler.java Näytä tiedosto

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

+ 4
- 4
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaMemberCompiler.java Näytä tiedosto

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

+ 58
- 6
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceExpressionFormatter.java Näytä tiedosto

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


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

Loading…
Peruuta
Tallenna