浏览代码

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 年前
父节点
当前提交
fe2ccea44d
共有 25 个文件被更改,包括 186 次插入74 次删除
  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 查看文件

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 查看文件

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 查看文件

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 查看文件

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 查看文件

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 查看文件

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 查看文件

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 查看文件

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 查看文件

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 查看文件

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 查看文件

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 查看文件

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 查看文件

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 查看文件

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 查看文件

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 查看文件

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 查看文件

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 查看文件

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 查看文件

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 查看文件

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 查看文件

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 查看文件

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 查看文件

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 查看文件

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 查看文件

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
 }

正在加载...
取消
保存