Browse Source

Fixed results from generic methods not being cast to the right type. Also fixed some bugs related to variants and added the variant value creation syntax VariantName.Option(arguments).

Stan Hebben 6 years ago
parent
commit
fe2ccea44d
25 changed files with 186 additions and 74 deletions
  1. 5
    4
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/FunctionHeader.java
  2. 2
    2
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/GenericMapper.java
  3. 2
    2
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/definition/VariantDefinition.java
  4. 3
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/VariantOptionRef.java
  5. 73
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/partial/PartialVariantOptionExpression.java
  6. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/scope/DefinitionScope.java
  7. 2
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/scope/ExpressionScope.java
  8. 2
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/DefinitionTypeID.java
  9. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/member/DefinitionMemberGroup.java
  10. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/member/TypeMemberBuilder.java
  11. 3
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/member/TypeMembers.java
  12. 2
    2
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaCompiler.java
  13. 19
    15
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaExpressionVisitor.java
  14. 3
    3
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaWriter.java
  15. 9
    9
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/definitions/JavaDefinitionVisitor.java
  16. 2
    2
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/definitions/JavaMemberVisitor.java
  17. 15
    8
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaMethod.java
  18. 2
    2
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaNativeClass.java
  19. 17
    3
      JavaShared/src/main/java/org/openzen/zenscript/javashared/prepare/JavaPrepareClassMethodVisitor.java
  20. 8
    9
      JavaShared/src/main/java/org/openzen/zenscript/javashared/prepare/JavaPrepareDefinitionVisitor.java
  21. 2
    1
      JavaShared/src/main/java/org/openzen/zenscript/javashared/prepare/JavaPrepareExpansionMethodVisitor.java
  22. 2
    3
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceSyntheticHelperGenerator.java
  23. 1
    1
      Parser/src/main/java/org/openzen/zenscript/parser/expression/ParsedCallArguments.java
  24. 7
    2
      Parser/src/main/java/org/openzen/zenscript/parser/expression/ParsedExpressionFunction.java
  25. 2
    1
      Shared/src/main/java/org/openzen/zencode/shared/CompileExceptionCode.java

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

321
 		return true;
321
 		return true;
322
 	}
322
 	}
323
 	
323
 	
324
-	public FunctionHeader withGenericArguments(GenericMapper mapper) {
324
+	public FunctionHeader withGenericArguments(GlobalTypeRegistry registry, GenericMapper mapper) {
325
 		if (typeParameters.length > 0) {
325
 		if (typeParameters.length > 0) {
326
 			Map<TypeParameter, ITypeID> innerMap = new HashMap<>();
326
 			Map<TypeParameter, ITypeID> innerMap = new HashMap<>();
327
 			for (TypeParameter parameter : typeParameters)
327
 			for (TypeParameter parameter : typeParameters)
328
 				innerMap.put(parameter, mapper.registry.getGeneric(parameter));
328
 				innerMap.put(parameter, mapper.registry.getGeneric(parameter));
329
 			
329
 			
330
-			mapper = mapper.getInner(innerMap);
330
+			mapper = mapper.getInner(registry, innerMap);
331
 		}
331
 		}
332
 		
332
 		
333
 		ITypeID returnType = this.returnType.instance(mapper);
333
 		ITypeID returnType = this.returnType.instance(mapper);
345
 		Map<TypeParameter, ITypeID> typeArguments = new HashMap<>();
345
 		Map<TypeParameter, ITypeID> typeArguments = new HashMap<>();
346
 		for (int i = 0; i < typeParameters.length; i++)
346
 		for (int i = 0; i < typeParameters.length; i++)
347
 			typeArguments.put(typeParameters[i], arguments[i]);
347
 			typeArguments.put(typeParameters[i], arguments[i]);
348
-		GenericMapper mapper = typeParameterMapping.getInner(typeArguments);
348
+		GenericMapper mapper = typeParameterMapping.getInner(registry, typeArguments);
349
 		
349
 		
350
 		ITypeID returnType = this.returnType.instance(mapper);
350
 		ITypeID returnType = this.returnType.instance(mapper);
351
 		FunctionParameter[] parameters = new FunctionParameter[this.parameters.length];
351
 		FunctionParameter[] parameters = new FunctionParameter[this.parameters.length];
410
 				result.append(", ");
410
 				result.append(", ");
411
 			result.append(parameters[i].toString());
411
 			result.append(parameters[i].toString());
412
 		}
412
 		}
413
-		result.append(")");
413
+		result.append(") as ");
414
+		result.append(returnType.toString());
414
 		return result.toString();
415
 		return result.toString();
415
 	}
416
 	}
416
 
417
 

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

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);

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

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
 }

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

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 View File

1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.codemodel.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 View File

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
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/scope/ExpressionScope.java View File

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
 	}

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

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()) {

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/member/DefinitionMemberGroup.java View File

264
 				for (ITypeID resultHint : typeHints) {
264
 				for (ITypeID resultHint : typeHints) {
265
 					Map<TypeParameter, ITypeID> mapping = new HashMap<>();
265
 					Map<TypeParameter, ITypeID> mapping = new HashMap<>();
266
 					if (header.returnType.inferTypeParameters(scope.getMemberCache(), resultHint, mapping)) {
266
 					if (header.returnType.inferTypeParameters(scope.getMemberCache(), resultHint, mapping)) {
267
-						header = header.withGenericArguments(scope.getLocalTypeParameters().getInner(mapping));
267
+						header = header.withGenericArguments(scope.getTypeRegistry(), scope.getLocalTypeParameters().getInner(scope.getTypeRegistry(), mapping));
268
 						break;
268
 						break;
269
 					}
269
 					}
270
 				}
270
 				}

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/member/TypeMemberBuilder.java View File

399
 		if (definition instanceof VariantDefinition) {
399
 		if (definition instanceof VariantDefinition) {
400
 			VariantDefinition variant = (VariantDefinition) definition;
400
 			VariantDefinition variant = (VariantDefinition) definition;
401
 			for (VariantDefinition.Option option : variant.options)
401
 			for (VariantDefinition.Option option : variant.options)
402
-				members.addVariantOption(option.instance(mapper));
402
+				members.addVariantOption(option.instance(type, mapper));
403
 		}
403
 		}
404
 		
404
 		
405
 		if (definition instanceof EnumDefinition) {
405
 		if (definition instanceof EnumDefinition) {

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

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
 	}

+ 2
- 2
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaCompiler.java View File

136
 			// convert scripts into methods (add them to a Scripts class?)
136
 			// convert scripts into methods (add them to a Scripts class?)
137
 			// (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)
138
 			final JavaClassWriter visitor = scriptFile.classWriter;
138
 			final JavaClassWriter visitor = scriptFile.classWriter;
139
-			JavaMethod method = new JavaMethod(new JavaClass(script.pkg.fullName, className, JavaClass.Kind.CLASS), JavaMethod.Kind.STATIC, methodName, true, "()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);
140
 			scriptFile.scriptMethods.add(method);
140
 			scriptFile.scriptMethods.add(method);
141
 
141
 
142
 			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));
147
 			statementVisitor.end();
147
 			statementVisitor.end();
148
 		}
148
 		}
149
 		
149
 		
150
-		JavaMethod runMethod = new JavaMethod(new JavaClass("script", "Scripts", JavaClass.Kind.CLASS), JavaMethod.Kind.STATIC, "run", true, "()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);
151
 		final JavaWriter runWriter = new JavaWriter(scriptsClassWriter, runMethod, null, null, null);
151
 		final JavaWriter runWriter = new JavaWriter(scriptsClassWriter, runMethod, null, null, null);
152
 		runWriter.start();
152
 		runWriter.start();
153
 		for (Map.Entry<String, JavaScriptFile> entry : scriptBlocks.entrySet()) {
153
 		for (Map.Entry<String, JavaScriptFile> entry : scriptBlocks.entrySet()) {

+ 19
- 15
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaExpressionVisitor.java View File

274
 					throw new UnsupportedOperationException("Unknown builtin comparator: " + expression.operator.getBuiltin());
274
 					throw new UnsupportedOperationException("Unknown builtin comparator: " + expression.operator.getBuiltin());
275
 			}
275
 			}
276
 		} else {
276
 		} else {
277
-			if (!checkAndExecuteMethodInfo(expression.operator))
277
+			if (!checkAndExecuteMethodInfo(expression.operator, expression.type))
278
 				throw new IllegalStateException("Call target has no method info!");
278
 				throw new IllegalStateException("Call target has no method info!");
279
 
279
 
280
 			expression.left.accept(this);
280
 			expression.left.accept(this);
358
 				argument.accept(this);
358
 				argument.accept(this);
359
 			}
359
 			}
360
 
360
 
361
-			if (!checkAndExecuteMethodInfo(expression.member))
361
+			if (!checkAndExecuteMethodInfo(expression.member, expression.type))
362
 				throw new IllegalStateException("Call target has no method info!");
362
 				throw new IllegalStateException("Call target has no method info!");
363
 			return null;
363
 			return null;
364
 		}
364
 		}
792
 					}
792
 					}
793
 				} else {
793
 				} else {
794
 					javaWriter.invokeStatic(ARRAYS_COPY_OF_RANGE_OBJECTS);
794
 					javaWriter.invokeStatic(ARRAYS_COPY_OF_RANGE_OBJECTS);
795
-					javaWriter.checkCast(context.getDescriptor(type));
795
+					javaWriter.checkCast(context.getInternalName(type));
796
 				}
796
 				}
797
 				break;
797
 				break;
798
 			}
798
 			}
870
 
870
 
871
 		BuiltinID builtin = expression.member.getBuiltin();
871
 		BuiltinID builtin = expression.member.getBuiltin();
872
 		if (builtin == null) {
872
 		if (builtin == null) {
873
-			if (!checkAndExecuteMethodInfo(expression.member))
873
+			if (!checkAndExecuteMethodInfo(expression.member, expression.type))
874
 				throw new IllegalStateException("Call target has no method info!");
874
 				throw new IllegalStateException("Call target has no method info!");
875
 
875
 
876
 			return null;
876
 			return null;
977
 
977
 
978
 		BuiltinID builtin = expression.member.member.builtin;
978
 		BuiltinID builtin = expression.member.member.builtin;
979
 		if (builtin == null) {
979
 		if (builtin == null) {
980
-			if (!checkAndExecuteMethodInfo(expression.member))
980
+			if (!checkAndExecuteMethodInfo(expression.member, expression.type))
981
 				throw new IllegalStateException("Call target has no method info!");
981
 				throw new IllegalStateException("Call target has no method info!");
982
 
982
 
983
 			return null;
983
 			return null;
1719
 	public Void visitGetMatchingVariantField(GetMatchingVariantField expression) {
1719
 	public Void visitGetMatchingVariantField(GetMatchingVariantField expression) {
1720
 		javaWriter.loadObject(0);
1720
 		javaWriter.loadObject(0);
1721
 		final ITypeID type = expression.value.option.getParameterType(expression.index);
1721
 		final ITypeID type = expression.value.option.getParameterType(expression.index);
1722
-		final JavaClass tag = expression.value.option.getTag(JavaClass.class);
1723
-		javaWriter.checkCast("L" + tag.internalName + ";");
1724
-		javaWriter.getField(new JavaField(tag, "field" + expression.index, context.getDescriptor(type)));
1722
+		final JavaVariantOption tag = expression.value.option.getTag(JavaVariantOption.class);
1723
+		javaWriter.checkCast(tag.variantOptionClass.internalName);
1724
+		javaWriter.getField(new JavaField(tag.variantOptionClass, "field" + expression.index, context.getDescriptor(type)));
1725
 		return null;
1725
 		return null;
1726
 	}
1726
 	}
1727
 
1727
 
1738
 
1738
 
1739
 		BuiltinID builtin = expression.getter.member.builtin;
1739
 		BuiltinID builtin = expression.getter.member.builtin;
1740
 		if (builtin == null) {
1740
 		if (builtin == null) {
1741
-			if (!checkAndExecuteMethodInfo(expression.getter))
1741
+			if (!checkAndExecuteMethodInfo(expression.getter, expression.type))
1742
 				throw new IllegalStateException("Call target has no method info!");
1742
 				throw new IllegalStateException("Call target has no method info!");
1743
 
1743
 
1744
 			return null;
1744
 			return null;
1940
     @Override
1940
     @Override
1941
     public Void visitInterfaceCast(InterfaceCastExpression expression) {
1941
     public Void visitInterfaceCast(InterfaceCastExpression expression) {
1942
         expression.value.accept(this);
1942
         expression.value.accept(this);
1943
-        javaWriter.checkCast(context.getDescriptor(expression.type));
1943
+        javaWriter.checkCast(context.getInternalName(expression.type));
1944
         return null;
1944
         return null;
1945
     }
1945
     }
1946
 
1946
 
1947
     @Override
1947
     @Override
1948
     public Void visitIs(IsExpression expression) {
1948
     public Void visitIs(IsExpression expression) {
1949
         expression.value.accept(this);
1949
         expression.value.accept(this);
1950
-        javaWriter.instanceOf(context.getDescriptor(expression.isType));
1950
+        javaWriter.instanceOf(context.getInternalName(expression.isType));
1951
         return null;
1951
         return null;
1952
     }
1952
     }
1953
 
1953
 
2108
 	public Void visitPostCall(PostCallExpression expression) {
2108
 	public Void visitPostCall(PostCallExpression expression) {
2109
 		expression.target.accept(this);
2109
 		expression.target.accept(this);
2110
 		javaWriter.dup(context.getType(expression.type));
2110
 		javaWriter.dup(context.getType(expression.type));
2111
-		if (!checkAndExecuteMethodInfo(expression.member))
2111
+		if (!checkAndExecuteMethodInfo(expression.member, expression.type))
2112
 			throw new IllegalStateException("Call target has no method info!");
2112
 			throw new IllegalStateException("Call target has no method info!");
2113
 
2113
 
2114
 		return null;
2114
 		return null;
2199
 	public Void visitStaticGetter(StaticGetterExpression expression) {
2199
 	public Void visitStaticGetter(StaticGetterExpression expression) {
2200
 		BuiltinID builtin = expression.getter.member.builtin;
2200
 		BuiltinID builtin = expression.getter.member.builtin;
2201
 		if (builtin == null) {
2201
 		if (builtin == null) {
2202
-			if (!checkAndExecuteMethodInfo(expression.getter))
2202
+			if (!checkAndExecuteMethodInfo(expression.getter, expression.type))
2203
 				throw new IllegalStateException("Call target has no method info!");
2203
 				throw new IllegalStateException("Call target has no method info!");
2204
 
2204
 
2205
 			return null;
2205
 			return null;
2325
 
2325
 
2326
 	@Override
2326
 	@Override
2327
 	public Void visitVariantValue(VariantValueExpression expression) {
2327
 	public Void visitVariantValue(VariantValueExpression expression) {
2328
-		final String internalName = expression.option.getTag(JavaClass.class).internalName;
2328
+		JavaVariantOption tag = expression.option.getTag(JavaVariantOption.class);
2329
+		final String internalName = tag.variantOptionClass.internalName;
2329
 		javaWriter.newObject(internalName);
2330
 		javaWriter.newObject(internalName);
2330
 		javaWriter.dup();
2331
 		javaWriter.dup();
2331
 
2332
 
2357
     }
2358
     }
2358
 
2359
 
2359
     //Will return true if a JavaMethodInfo.class tag exists, and will compile that tag
2360
     //Will return true if a JavaMethodInfo.class tag exists, and will compile that tag
2360
-    private boolean checkAndExecuteMethodInfo(DefinitionMemberRef member) {
2361
+    private boolean checkAndExecuteMethodInfo(DefinitionMemberRef member, ITypeID resultType) {
2361
         JavaMethod methodInfo = member.getTag(JavaMethod.class);
2362
         JavaMethod methodInfo = member.getTag(JavaMethod.class);
2362
         if (methodInfo == null)
2363
         if (methodInfo == null)
2363
             return false;
2364
             return false;
2367
         } else {
2368
         } else {
2368
             getJavaWriter().invokeVirtual(methodInfo);
2369
             getJavaWriter().invokeVirtual(methodInfo);
2369
         }
2370
         }
2371
+		if (methodInfo.genericResult)
2372
+			getJavaWriter().checkCast(context.getInternalName(resultType));
2373
+		
2370
         return true;
2374
         return true;
2371
     }
2375
     }
2372
 
2376
 

+ 3
- 3
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaWriter.java View File

349
         }
349
         }
350
     }
350
     }
351
 
351
 
352
-    public void checkCast(String descriptor) {
352
+    public void checkCast(String internalName) {
353
         if (debug)
353
         if (debug)
354
-            System.out.println("checkCast " + descriptor);
354
+            System.out.println("checkCast " + internalName);
355
 
355
 
356
-        visitor.visitTypeInsn(CHECKCAST, descriptor);
356
+        visitor.visitTypeInsn(CHECKCAST, internalName);
357
     }
357
     }
358
 
358
 
359
     public void checkCast(Type type) {
359
     public void checkCast(Type type) {

+ 9
- 9
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/definitions/JavaDefinitionVisitor.java View File

101
             member.accept(visitor);
101
             member.accept(visitor);
102
         }
102
         }
103
 		
103
 		
104
-		JavaMethod valuesMethod = new JavaMethod(toClass, JavaMethod.Kind.STATIC, "values", true, "()[L" + toClass.internalName + ";", Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC);
104
+		JavaMethod valuesMethod = JavaMethod.getStatic(toClass, "values", "()[L" + toClass.internalName + ";", Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC);
105
 		JavaWriter valuesWriter = new JavaWriter(writer, true, valuesMethod, definition, null, null);
105
 		JavaWriter valuesWriter = new JavaWriter(writer, true, valuesMethod, definition, null, null);
106
 		valuesWriter.start();
106
 		valuesWriter.start();
107
 		valuesWriter.getStaticField(toClass.internalName, "$VALUES", "[L" + toClass.internalName + ";");
107
 		valuesWriter.getStaticField(toClass.internalName, "$VALUES", "[L" + toClass.internalName + ";");
110
 		valuesWriter.returnObject();
110
 		valuesWriter.returnObject();
111
 		valuesWriter.end();
111
 		valuesWriter.end();
112
 
112
 
113
-		JavaMethod valueOfMethod = new JavaMethod(toClass, JavaMethod.Kind.STATIC, "valueOf", true, "(Ljava/lang/String;)L" + toClass.internalName + ";", Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC);
113
+		JavaMethod valueOfMethod = JavaMethod.getStatic(toClass, "valueOf", "(Ljava/lang/String;)L" + toClass.internalName + ";", Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC);
114
 		JavaWriter valueOfWriter = new JavaWriter(writer, true, valueOfMethod, definition, null, null);
114
 		JavaWriter valueOfWriter = new JavaWriter(writer, true, valueOfMethod, definition, null, null);
115
 		valueOfWriter.start();
115
 		valueOfWriter.start();
116
 		valueOfWriter.invokeStatic(CLASS_FORNAME);
116
 		valueOfWriter.invokeStatic(CLASS_FORNAME);
117
 		valueOfWriter.loadObject(0);
117
 		valueOfWriter.loadObject(0);
118
 		valueOfWriter.invokeStatic(ENUM_VALUEOF);
118
 		valueOfWriter.invokeStatic(ENUM_VALUEOF);
119
-		valueOfWriter.checkCast("L" + toClass.internalName + ";");
119
+		valueOfWriter.checkCast(toClass.internalName);
120
 		valueOfWriter.returnObject();
120
 		valueOfWriter.returnObject();
121
 		valueOfWriter.end();
121
 		valueOfWriter.end();
122
 		
122
 		
202
 
202
 
203
 			ITypeID[] types = option.types;
203
 			ITypeID[] types = option.types;
204
 			for (int i = 0; i < types.length; ++i) {
204
 			for (int i = 0; i < types.length; ++i) {
205
-				final String internalName = context.getInternalName(types[i]);
206
-				optionInitDescBuilder.append(internalName);
207
-				optionWriter.visitField(Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL, "field" + i, internalName, "TT" + i + ";", null).visitEnd();
205
+				final String descriptor = context.getDescriptor(types[i]);
206
+				optionInitDescBuilder.append(descriptor);
207
+				optionWriter.visitField(Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL, "field" + i, descriptor, "TT" + i + ";", null).visitEnd();
208
 			}
208
 			}
209
 			optionInitDescBuilder.append(")V");
209
 			optionInitDescBuilder.append(")V");
210
 			
210
 			
211
-			JavaMethod constructorMethod = new JavaMethod(optionTag.variantOptionClass, JavaMethod.Kind.CONSTRUCTOR, "<init>", true, optionInitDescBuilder.toString(), JavaModifiers.PUBLIC);
211
+			JavaMethod constructorMethod = JavaMethod.getConstructor(optionTag.variantOptionClass, optionInitDescBuilder.toString(), JavaModifiers.PUBLIC);
212
 			final JavaWriter initWriter = new JavaWriter(optionWriter, constructorMethod, variant, optionInitDescBuilder.toString(), null);
212
 			final JavaWriter initWriter = new JavaWriter(optionWriter, constructorMethod, variant, optionInitDescBuilder.toString(), null);
213
 			initWriter.start();
213
 			initWriter.start();
214
 			initWriter.loadObject(0);
214
 			initWriter.loadObject(0);
226
 			initWriter.end();
226
 			initWriter.end();
227
 			
227
 			
228
 			//Denominator for switch-cases
228
 			//Denominator for switch-cases
229
-			JavaMethod denominator = new JavaMethod(optionTag.variantOptionClass, JavaMethod.Kind.INSTANCE, "getDenominator", true, "()I", JavaModifiers.PUBLIC);
229
+			JavaMethod denominator = JavaMethod.getVirtual(optionTag.variantOptionClass, "getDenominator", "()I", JavaModifiers.PUBLIC);
230
 			final JavaWriter getDenominator = new JavaWriter(optionWriter, denominator, null, null, null, "java/lang/Override");
230
 			final JavaWriter getDenominator = new JavaWriter(optionWriter, denominator, null, null, null, "java/lang/Override");
231
 			getDenominator.start();
231
 			getDenominator.start();
232
 			getDenominator.constant(option.ordinal);
232
 			getDenominator.constant(option.ordinal);
251
 			member.accept(visitor);
251
 			member.accept(visitor);
252
 		}
252
 		}
253
 
253
 
254
-		final JavaWriter superInitWriter = new JavaWriter(writer, new JavaMethod(toClass, JavaMethod.Kind.CONSTRUCTOR, "<init>", true, "()V", Opcodes.ACC_PUBLIC), variant, "()V", null);
254
+		final JavaWriter superInitWriter = new JavaWriter(writer, JavaMethod.getConstructor(toClass, "()V", Opcodes.ACC_PUBLIC), variant, "()V", null);
255
 		superInitWriter.start();
255
 		superInitWriter.start();
256
 		superInitWriter.loadObject(0);
256
 		superInitWriter.loadObject(0);
257
 		superInitWriter.invokeSpecial("java/lang/Object", "<init>", "()V");
257
 		superInitWriter.invokeSpecial("java/lang/Object", "<init>", "()V");

+ 2
- 2
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/definitions/JavaMemberVisitor.java View File

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 JavaMethod(toClass, JavaMethod.Kind.STATICINIT, "<clinit>", true, "()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);
99
 
99
 
100
 	@Override
100
 	@Override
101
 	public Void visitDestructor(DestructorMember member) {
101
 	public Void visitDestructor(DestructorMember member) {
102
-		final JavaMethod method = new JavaMethod(toClass, JavaMethod.Kind.INSTANCE, "close", true, "()V", Opcodes.ACC_PUBLIC);
102
+		final JavaMethod method = JavaMethod.getVirtual(toClass, "close", "()V", Opcodes.ACC_PUBLIC);
103
 
103
 
104
 		final Label constructorStart = new Label();
104
 		final Label constructorStart = new Label();
105
 		final Label constructorEnd = new Label();
105
 		final Label constructorEnd = new Label();

+ 15
- 8
JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaMethod.java View File

11
  */
11
  */
12
 public class JavaMethod {
12
 public class JavaMethod {
13
 	public static JavaMethod getConstructor(JavaClass cls, String descriptor, int modifiers) {
13
 	public static JavaMethod getConstructor(JavaClass cls, String descriptor, int modifiers) {
14
-		return new JavaMethod(cls, Kind.CONSTRUCTOR, "<init>", true, descriptor, modifiers);
14
+		return new JavaMethod(cls, Kind.CONSTRUCTOR, "<init>", true, descriptor, modifiers, false);
15
 	}
15
 	}
16
 	
16
 	
17
 	public static JavaMethod getNativeConstructor(JavaClass cls, String descriptor) {
17
 	public static JavaMethod getNativeConstructor(JavaClass cls, String descriptor) {
18
-		return new JavaMethod(cls, Kind.CONSTRUCTOR, "<init>", false, descriptor, JavaModifiers.PUBLIC);
18
+		return new JavaMethod(cls, Kind.CONSTRUCTOR, "<init>", false, descriptor, JavaModifiers.PUBLIC, false);
19
 	}
19
 	}
20
 	
20
 	
21
 	public static JavaMethod getDestructor(JavaClass cls, int modifiers) {
21
 	public static JavaMethod getDestructor(JavaClass cls, int modifiers) {
22
-		return new JavaMethod(cls, Kind.INSTANCE, "close", true, "()V", modifiers);
22
+		return new JavaMethod(cls, Kind.INSTANCE, "close", true, "()V", modifiers, false);
23
 	}
23
 	}
24
 	
24
 	
25
 	public static JavaMethod getStatic(JavaClass cls, String name, String descriptor, int modifiers) {
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);
26
+		return new JavaMethod(cls, Kind.STATIC, name, true, descriptor, modifiers | JavaModifiers.STATIC, false);
27
 	}
27
 	}
28
 	
28
 	
29
 	public static JavaMethod getNativeStatic(JavaClass cls, String name, String descriptor) {
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);
30
+		return new JavaMethod(cls, Kind.STATIC, name, false, descriptor, JavaModifiers.STATIC | JavaModifiers.PUBLIC, false);
31
 	}
31
 	}
32
 	
32
 	
33
 	public static JavaMethod getVirtual(JavaClass cls, String name, String descriptor, int modifiers) {
33
 	public static JavaMethod getVirtual(JavaClass cls, String name, String descriptor, int modifiers) {
34
-		return new JavaMethod(cls, Kind.INSTANCE, name, true, descriptor, modifiers);
34
+		return new JavaMethod(cls, Kind.INSTANCE, name, true, descriptor, modifiers, false);
35
 	}
35
 	}
36
 	
36
 	
37
 	public static JavaMethod getNativeVirtual(JavaClass cls, String name, String descriptor) {
37
 	public static JavaMethod getNativeVirtual(JavaClass cls, String name, String descriptor) {
38
-		return new JavaMethod(cls, Kind.INSTANCE, name, false, descriptor, JavaModifiers.PUBLIC);
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);
39
 	}
43
 	}
40
 	
44
 	
41
 	public final JavaClass cls;
45
 	public final JavaClass cls;
46
 	
50
 	
47
 	public final String descriptor;
51
 	public final String descriptor;
48
 	public final int modifiers;
52
 	public final int modifiers;
53
+	public final boolean genericResult;
49
 	
54
 	
50
-	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) {
51
 		this.cls = cls;
56
 		this.cls = cls;
52
 		this.kind = kind;
57
 		this.kind = kind;
53
 		this.name = name;
58
 		this.name = name;
56
 		
61
 		
57
 		this.descriptor = descriptor;
62
 		this.descriptor = descriptor;
58
 		this.modifiers = modifiers;
63
 		this.modifiers = modifiers;
64
+		this.genericResult = genericResult;
59
 	}
65
 	}
60
 	
66
 	
61
 	public JavaMethod(JavaNativeTranslation<?> translation) {
67
 	public JavaMethod(JavaNativeTranslation<?> translation) {
66
 		this.translation = translation;
72
 		this.translation = translation;
67
 		this.descriptor = "";
73
 		this.descriptor = "";
68
 		this.modifiers = 0;
74
 		this.modifiers = 0;
75
+		this.genericResult = false;
69
 	}
76
 	}
70
 	
77
 	
71
 	public enum Kind {
78
 	public enum Kind {

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

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) {

+ 17
- 3
JavaShared/src/main/java/org/openzen/zenscript/javashared/prepare/JavaPrepareClassMethodVisitor.java View File

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.Modifiers;
11
 import org.openzen.zenscript.codemodel.OperatorType;
10
 import org.openzen.zenscript.codemodel.OperatorType;
12
 import org.openzen.zenscript.codemodel.annotations.NativeTag;
11
 import org.openzen.zenscript.codemodel.annotations.NativeTag;
13
 import org.openzen.zenscript.codemodel.member.CallerMember;
12
 import org.openzen.zenscript.codemodel.member.CallerMember;
29
 import org.openzen.zenscript.codemodel.member.SetterMember;
28
 import org.openzen.zenscript.codemodel.member.SetterMember;
30
 import org.openzen.zenscript.codemodel.member.StaticInitializerMember;
29
 import org.openzen.zenscript.codemodel.member.StaticInitializerMember;
31
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
30
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
31
+import org.openzen.zenscript.codemodel.type.GenericTypeID;
32
 import org.openzen.zenscript.javashared.JavaTypeNameVisitor;
32
 import org.openzen.zenscript.javashared.JavaTypeNameVisitor;
33
 import org.openzen.zenscript.javashared.JavaClass;
33
 import org.openzen.zenscript.javashared.JavaClass;
34
 import org.openzen.zenscript.javashared.JavaField;
34
 import org.openzen.zenscript.javashared.JavaField;
291
 			if (baseMethod == null)
291
 			if (baseMethod == null)
292
 				throw new IllegalStateException("Base method not yet prepared!");
292
 				throw new IllegalStateException("Base method not yet prepared!");
293
 			
293
 			
294
-			method = new JavaMethod(cls, baseMethod.kind, baseMethod.name, true, context.getMethodDescriptor(member.header), JavaModifiers.getJavaModifiers(member.modifiers));
294
+			method = new JavaMethod(
295
+					cls,
296
+					baseMethod.kind,
297
+					baseMethod.name,
298
+					true,
299
+					context.getMethodDescriptor(member.header),
300
+					JavaModifiers.getJavaModifiers(member.modifiers),
301
+					member.header.returnType instanceof GenericTypeID);
295
 		} else if (method == null) {
302
 		} else if (method == null) {
296
-			method = new JavaMethod(cls, getKind(member), name, true, context.getMethodDescriptor(member.header), JavaModifiers.getJavaModifiers(member.modifiers));
303
+			method = new JavaMethod(
304
+					cls,
305
+					getKind(member),
306
+					name,
307
+					true,
308
+					context.getMethodDescriptor(member.header),
309
+					JavaModifiers.getJavaModifiers(member.modifiers),
310
+					member.header.returnType instanceof GenericTypeID);
297
 		}
311
 		}
298
 		
312
 		
299
 		if (method.compile) {
313
 		if (method.compile) {

+ 8
- 9
JavaShared/src/main/java/org/openzen/zenscript/javashared/prepare/JavaPrepareDefinitionVisitor.java View File

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
 /**
67
 		{
66
 		{
68
 			JavaNativeClass list = new JavaNativeClass(new JavaClass("java.util", "List", JavaClass.Kind.INTERFACE));
67
 			JavaNativeClass list = new JavaNativeClass(new JavaClass("java.util", "List", JavaClass.Kind.INTERFACE));
69
 			JavaClass arrayList = new JavaClass("java.util", "ArrayList", JavaClass.Kind.CLASS);
68
 			JavaClass arrayList = new JavaClass("java.util", "ArrayList", JavaClass.Kind.CLASS);
70
-			list.addMethod("constructor", new JavaMethod(arrayList, JavaMethod.Kind.CONSTRUCTOR, "", false, "()V", JavaModifiers.PUBLIC));
69
+			list.addMethod("constructor", JavaMethod.getNativeConstructor(arrayList, "()V"));
71
 			list.addInstanceMethod("add", "add", "(Ljava/lang/Object;)Z"); List<?> l;
70
 			list.addInstanceMethod("add", "add", "(Ljava/lang/Object;)Z"); List<?> l;
72
 			list.addInstanceMethod("insert", "add", "(Ljava/lang/Object;I)V");
71
 			list.addInstanceMethod("insert", "add", "(Ljava/lang/Object;I)V");
73
 			list.addInstanceMethod("remove", "remove", "(java/lang/Object;)Z");
72
 			list.addInstanceMethod("remove", "remove", "(java/lang/Object;)Z");
107
 			JavaClass math = new JavaClass("java.lang", "Math", JavaClass.Kind.CLASS);
106
 			JavaClass math = new JavaClass("java.lang", "Math", JavaClass.Kind.CLASS);
108
 			
107
 			
109
 			JavaNativeClass cls = new JavaNativeClass(integer);
108
 			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));
109
+			cls.addMethod("min", JavaMethod.getNativeStatic(math, "min", "(II)I"));
110
+			cls.addMethod("max", JavaMethod.getNativeStatic(math, "max", "(II)I"));
111
+			cls.addMethod("toHexString", JavaMethod.getNativeExpansion(integer, "toHexString", "(I)Ljava/lang/String;"));
113
 			nativeClasses.put("stdlib::Integer", cls);
112
 			nativeClasses.put("stdlib::Integer", cls);
114
 		}
113
 		}
115
 		
114
 		
132
 		{
131
 		{
133
 			JavaClass arrays = new JavaClass("java.lang", "Arrays", JavaClass.Kind.CLASS);
132
 			JavaClass arrays = new JavaClass("java.lang", "Arrays", JavaClass.Kind.CLASS);
134
 			JavaNativeClass cls = new JavaNativeClass(arrays);
133
 			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));
134
+			cls.addMethod("sort", JavaMethod.getNativeExpansion(arrays, "sort", "([Ljava/lang/Object;)[Ljava/lang/Object;"));
136
 			cls.addMethod("sorted", new JavaMethod((expression, translator) -> {
135
 			cls.addMethod("sorted", new JavaMethod((expression, translator) -> {
137
 				return translator.sorted(((CallExpression)expression).target);
136
 				return translator.sorted(((CallExpression)expression).target);
138
 			}));
137
 			}));
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));
138
+			cls.addMethod("sortWithComparator", JavaMethod.getNativeExpansion(arrays, "sort", "([Ljava/lang/Object;Ljava/lang/Comparator;)[Ljava/lang/Object;"));
140
 			cls.addMethod("sortedWithComparator", new JavaMethod((expression, translator) -> {
139
 			cls.addMethod("sortedWithComparator", new JavaMethod((expression, translator) -> {
141
 				return translator.sortedWithComparator(
140
 				return translator.sortedWithComparator(
142
 						((CallExpression)expression).target,
141
 						((CallExpression)expression).target,
145
 			cls.addMethod("copy", new JavaMethod((expression, translator) -> {
144
 			cls.addMethod("copy", new JavaMethod((expression, translator) -> {
146
 				return translator.copy(((CallExpression)expression).target);
145
 				return translator.copy(((CallExpression)expression).target);
147
 			}));
146
 			}));
148
-			cls.addMethod("copyResize", new JavaMethod(arrays, JavaMethod.Kind.EXPANSION, "copyOf", false, "([Ljava/lang/Object;I)[Ljava/lang/Object;", JavaModifiers.PUBLIC | JavaModifiers.STATIC));
147
+			cls.addMethod("copyResize", JavaMethod.getNativeExpansion(arrays, "copyOf", "([Ljava/lang/Object;I)[Ljava/lang/Object;"));
149
 			cls.addMethod("copyTo", new JavaMethod((expression, translator) -> {
148
 			cls.addMethod("copyTo", new JavaMethod((expression, translator) -> {
150
 				return translator.copyTo((CallExpression)expression);
149
 				return translator.copyTo((CallExpression)expression);
151
 			}));
150
 			}));
286
 		variant.setTag(JavaClass.class, cls);
285
 		variant.setTag(JavaClass.class, cls);
287
 		
286
 		
288
 		for (VariantDefinition.Option option : variant.options) {
287
 		for (VariantDefinition.Option option : variant.options) {
289
-			JavaClass variantCls = new JavaClass(cls.fullName, option.name, JavaClass.Kind.CLASS);
288
+			JavaClass variantCls = new JavaClass(cls, option.name, JavaClass.Kind.CLASS);
290
 			option.setTag(JavaVariantOption.class, new JavaVariantOption(cls, variantCls));
289
 			option.setTag(JavaVariantOption.class, new JavaVariantOption(cls, variantCls));
291
 		}
290
 		}
292
 		
291
 		

+ 2
- 1
JavaShared/src/main/java/org/openzen/zenscript/javashared/prepare/JavaPrepareExpansionMethodVisitor.java View File

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.GenericTypeID;
30
 import org.openzen.zenscript.javashared.JavaTypeNameVisitor;
31
 import org.openzen.zenscript.javashared.JavaTypeNameVisitor;
31
 import org.openzen.zenscript.javashared.JavaClass;
32
 import org.openzen.zenscript.javashared.JavaClass;
32
 import org.openzen.zenscript.javashared.JavaField;
33
 import org.openzen.zenscript.javashared.JavaField;
159
 		if (nativeTag != null && nativeClass != null)
160
 		if (nativeTag != null && nativeClass != null)
160
 			method = nativeClass.getMethod(nativeTag.value);
161
 			method = nativeClass.getMethod(nativeTag.value);
161
 		if (method == null)
162
 		if (method == null)
162
-			method = new JavaMethod(cls, getKind(member), name, true, context.getMethodDescriptor(member.header), JavaModifiers.getJavaModifiers(member.modifiers)); 
163
+			method = new JavaMethod(cls, getKind(member), name, true, context.getMethodDescriptor(member.header), JavaModifiers.getJavaModifiers(member.modifiers), member.header.returnType instanceof GenericTypeID); 
163
 		
164
 		
164
 		if (method.compile) {
165
 		if (method.compile) {
165
 			if (DEBUG_EMPTY && cls.empty)
166
 			if (DEBUG_EMPTY && cls.empty)

+ 2
- 3
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceSyntheticHelperGenerator.java View File

30
 import org.openzen.zenscript.javashared.JavaClass;
30
 import org.openzen.zenscript.javashared.JavaClass;
31
 import org.openzen.zenscript.javashared.JavaContext;
31
 import org.openzen.zenscript.javashared.JavaContext;
32
 import org.openzen.zenscript.javashared.JavaMethod;
32
 import org.openzen.zenscript.javashared.JavaMethod;
33
-import org.openzen.zenscript.javashared.JavaModifiers;
34
 
33
 
35
 /**
34
 /**
36
  *
35
  *
60
 		addMember(arrayHelpers, method);
59
 		addMember(arrayHelpers, method);
61
 		
60
 		
62
 		String descriptor = "(" + context.getDescriptor(type) + context.getDescriptor(type.elementType) + ")Z";
61
 		String descriptor = "(" + context.getDescriptor(type) + context.getDescriptor(type.elementType) + ")Z";
63
-		JavaMethod sourceMethod = new JavaMethod(arrayHelpers, JavaMethod.Kind.EXPANSION, kind.containsName, false, descriptor, JavaModifiers.PUBLIC | JavaModifiers.STATIC);
62
+		JavaMethod sourceMethod = JavaMethod.getNativeExpansion(arrayHelpers, kind.containsName, descriptor);
64
 		existingContains.put(kind, sourceMethod);
63
 		existingContains.put(kind, sourceMethod);
65
 		return sourceMethod;
64
 		return sourceMethod;
66
 	}
65
 	}
74
 		addMember(arrayHelpers, method);
73
 		addMember(arrayHelpers, method);
75
 		
74
 		
76
 		String descriptor = "(" + context.getDescriptor(type) + ")I";
75
 		String descriptor = "(" + context.getDescriptor(type) + ")I";
77
-		JavaMethod sourceMethod = new JavaMethod(arrayHelpers, JavaMethod.Kind.EXPANSION, kind.containsName, false, descriptor, JavaModifiers.PUBLIC | JavaModifiers.STATIC);
76
+		JavaMethod sourceMethod = JavaMethod.getNativeExpansion(arrayHelpers, kind.containsName, descriptor);
78
 		existingContains.put(kind, sourceMethod);
77
 		existingContains.put(kind, sourceMethod);
79
 		return sourceMethod;
78
 		return sourceMethod;
80
 	}
79
 	}

+ 1
- 1
Parser/src/main/java/org/openzen/zenscript/parser/expression/ParsedCallArguments.java View File

158
 		}
158
 		}
159
 		
159
 		
160
 		ITypeID[] typeParameters = genericParameters;
160
 		ITypeID[] typeParameters = genericParameters;
161
-		if (typeParameters == null) {
161
+		if (typeParameters == null || typeParameters.length == 0) {
162
 			for (FunctionHeader candidate : candidates) {
162
 			for (FunctionHeader candidate : candidates) {
163
 				if (candidate.typeParameters != null) {
163
 				if (candidate.typeParameters != null) {
164
 					typeParameters = new ITypeID[candidate.typeParameters.length];
164
 					typeParameters = new ITypeID[candidate.typeParameters.length];

+ 7
- 2
Parser/src/main/java/org/openzen/zenscript/parser/expression/ParsedExpressionFunction.java View File

24
 import org.openzen.zenscript.codemodel.scope.ExpressionScope;
24
 import org.openzen.zenscript.codemodel.scope.ExpressionScope;
25
 import org.openzen.zenscript.codemodel.scope.LambdaScope;
25
 import org.openzen.zenscript.codemodel.scope.LambdaScope;
26
 import org.openzen.zenscript.codemodel.scope.StatementScope;
26
 import org.openzen.zenscript.codemodel.scope.StatementScope;
27
+import org.openzen.zenscript.codemodel.type.BasicTypeID;
27
 import org.openzen.zenscript.parser.definitions.ParsedFunctionHeader;
28
 import org.openzen.zenscript.parser.definitions.ParsedFunctionHeader;
28
 import org.openzen.zenscript.parser.statements.ParsedFunctionBody;
29
 import org.openzen.zenscript.parser.statements.ParsedFunctionBody;
29
 
30
 
67
 		LambdaClosure closure = new LambdaClosure();
68
 		LambdaClosure closure = new LambdaClosure();
68
 		StatementScope innerScope = new LambdaScope(scope, closure, header);
69
 		StatementScope innerScope = new LambdaScope(scope, closure, header);
69
 		Statement statements = body.compile(innerScope, header);
70
 		Statement statements = body.compile(innerScope, header);
71
+		
72
+		if (header.returnType == BasicTypeID.UNDETERMINED) {
73
+			header.returnType = statements.getReturnType();
74
+		}
70
 		if (!scope.genericInferenceMap.isEmpty()) {
75
 		if (!scope.genericInferenceMap.isEmpty()) {
71
 			// perform type parameter inference
76
 			// perform type parameter inference
72
 			ITypeID returnType = statements.getReturnType();
77
 			ITypeID returnType = statements.getReturnType();
73
 			Map<TypeParameter, ITypeID> inferredTypes = new HashMap<>();
78
 			Map<TypeParameter, ITypeID> inferredTypes = new HashMap<>();
74
-			if (!genericHeader.returnType.inferTypeParameters(scope.getMemberCache(), returnType, inferredTypes))
79
+			if (!returnType.inferTypeParameters(scope.getMemberCache(), genericHeader.returnType, inferredTypes))
75
 				throw new CompileException(position, CompileExceptionCode.TYPE_ARGUMENTS_NOT_INFERRABLE, "Could not infer generic type parameters");
80
 				throw new CompileException(position, CompileExceptionCode.TYPE_ARGUMENTS_NOT_INFERRABLE, "Could not infer generic type parameters");
76
 			
81
 			
77
 			scope.genericInferenceMap.putAll(inferredTypes);
82
 			scope.genericInferenceMap.putAll(inferredTypes);
78
 		}
83
 		}
79
 		
84
 		
80
-		FunctionTypeID functionType = scope.getTypeRegistry().getFunction(genericHeader.withGenericArguments(new GenericMapper(scope.getTypeRegistry(), scope.genericInferenceMap)));
85
+		FunctionTypeID functionType = scope.getTypeRegistry().getFunction(genericHeader.withGenericArguments(scope.getTypeRegistry(), new GenericMapper(scope.getTypeRegistry(), scope.genericInferenceMap)));
81
 		return new FunctionExpression(position, functionType, closure, header, statements);
86
 		return new FunctionExpression(position, functionType, closure, header, statements);
82
 	}
87
 	}
83
 	
88
 	

+ 2
- 1
Shared/src/main/java/org/openzen/zencode/shared/CompileExceptionCode.java View File

65
 	UNTYPED_EMPTY_MAP(),
65
 	UNTYPED_EMPTY_MAP(),
66
 	VAR_WITHOUT_TYPE_OR_INITIALIZER(),
66
 	VAR_WITHOUT_TYPE_OR_INITIALIZER(),
67
 	NO_BRACKET_PARSER(),
67
 	NO_BRACKET_PARSER(),
68
-	INVALID_BRACKET_EXPRESSION()
68
+	INVALID_BRACKET_EXPRESSION(),
69
+	VARIANT_OPTION_NOT_AN_EXPRESSION
69
 }
70
 }

Loading…
Cancel
Save