Browse Source

Improved handling of functions, they now use the most generic variant available, using standard function types where possible. (TODO: there are still more to add)

Stan Hebben 6 years ago
parent
commit
854c3dbeae
25 changed files with 489 additions and 238 deletions
  1. 29
    57
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeContext.java
  2. 1
    1
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeJarTarget.java
  3. 1
    1
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeRunTarget.java
  4. 5
    4
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaCompiler.java
  5. 3
    4
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaExpressionVisitor.java
  6. 164
    0
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaContext.java
  7. 4
    8
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaSynthesizedClass.java
  8. 0
    50
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaSynthesizedClassNamer.java
  9. 27
    0
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaSynthesizedFunction.java
  10. 30
    0
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaSynthesizedFunctionInstance.java
  11. 25
    0
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaSynthesizedRange.java
  12. 2
    5
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaSyntheticClassGenerator.java
  13. 8
    8
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaTypeDescriptorVisitor.java
  14. 102
    0
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaTypeInfo.java
  15. 8
    8
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaTypeInternalNameVisitor.java
  16. 1
    1
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaDefinitionVisitor.java
  17. 2
    8
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceCompiler.java
  18. 13
    2
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceContext.java
  19. 10
    4
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceExpressionFormatter.java
  20. 2
    2
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceObjectTypeVisitor.java
  21. 23
    50
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceSyntheticTypeGenerator.java
  22. 18
    17
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceTypeVisitor.java
  23. 7
    7
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/scope/JavaSourceFileScope.java
  24. 3
    0
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/scope/JavaSourceStatementScope.java
  25. 1
    1
      ScriptingExample/src/main/java/org/openzen/zenscript/scriptingexample/Main.java

+ 29
- 57
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeContext.java View File

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

+ 1
- 1
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeJarTarget.java View File

@@ -28,7 +28,7 @@ public class JavaBytecodeJarTarget implements Target {
28 28
 
29 29
 	@Override
30 30
 	public JavaCompiler createCompiler(SemanticModule module) {
31
-		return new JavaCompiler(debugCompiler, file);
31
+		return new JavaCompiler(module.compilationUnit.globalTypeRegistry, debugCompiler, file);
32 32
 	}
33 33
 
34 34
 	@Override

+ 1
- 1
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeRunTarget.java View File

@@ -25,7 +25,7 @@ public class JavaBytecodeRunTarget implements Target {
25 25
 
26 26
 	@Override
27 27
 	public JavaCompiler createCompiler(SemanticModule module) {
28
-		return new JavaCompiler(debugCompiler, null);
28
+		return new JavaCompiler(module.compilationUnit.globalTypeRegistry, debugCompiler, null);
29 29
 	}
30 30
 
31 31
 	@Override

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

@@ -25,6 +25,7 @@ import org.openzen.zenscript.javabytecode.compiler.definitions.JavaDefinitionVis
25 25
 import java.util.HashMap;
26 26
 import java.util.List;
27 27
 import java.util.Map;
28
+import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
28 29
 import org.openzen.zenscript.javashared.JavaClass;
29 30
 import org.openzen.zenscript.javashared.JavaMethod;
30 31
 import org.openzen.zenscript.javashared.prepare.JavaPrepareDefinitionMemberVisitor;
@@ -45,14 +46,14 @@ public class JavaCompiler implements ZenCodeCompiler {
45 46
 	private final List<HighLevelDefinition> definitions = new ArrayList<>();
46 47
 	private final List<ScriptBlock> scripts = new ArrayList<>();
47 48
 	
48
-	public JavaCompiler(File jarFile) {
49
-		this(false, jarFile);
49
+	public JavaCompiler(GlobalTypeRegistry registry, File jarFile) {
50
+		this(registry, false, jarFile);
50 51
 	}
51 52
 
52
-	public JavaCompiler(boolean debug, File jarFile) {
53
+	public JavaCompiler(GlobalTypeRegistry registry, boolean debug, File jarFile) {
53 54
 		target = new JavaModule(new File("classes"));
54 55
 		this.jarFile = jarFile;
55
-		this.context = new JavaBytecodeContext(target);
56
+		this.context = new JavaBytecodeContext(registry, target);
56 57
 		
57 58
 		scriptsClassWriter = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
58 59
 		scriptsClassWriter.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, "Scripts", null, "java/lang/Object", null);

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

@@ -27,7 +27,6 @@ import org.openzen.zenscript.javashared.JavaClass;
27 27
 import org.openzen.zenscript.javashared.JavaField;
28 28
 import org.openzen.zenscript.javashared.JavaMethod;
29 29
 import org.openzen.zenscript.javashared.JavaSynthesizedClass;
30
-import org.openzen.zenscript.javashared.JavaSynthesizedClassNamer;
31 30
 import org.openzen.zenscript.javashared.JavaVariantOption;
32 31
 
33 32
 public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
@@ -1985,13 +1984,13 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1985 1984
 				break;
1986 1985
 			case RANGE_FROM: {
1987 1986
 				RangeTypeID type = (RangeTypeID)expression.target.type;
1988
-				JavaClass cls = context.getTypeGenerator().synthesizeRange(type).cls;
1987
+				JavaClass cls = context.getRange(type).cls;
1989 1988
 				javaWriter.getField(cls.internalName, "from", context.getDescriptor(type.baseType));
1990 1989
 				break;
1991 1990
 			}
1992 1991
 			case RANGE_TO:
1993 1992
 				RangeTypeID type = (RangeTypeID)expression.target.type;
1994
-				JavaClass cls = context.getTypeGenerator().synthesizeRange(type).cls;
1993
+				JavaClass cls = context.getRange(type).cls;
1995 1994
 				javaWriter.getField(cls.internalName, "to", context.getDescriptor(type.baseType));
1996 1995
 				break;
1997 1996
 		}
@@ -2192,7 +2191,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
2192 2191
     @Override
2193 2192
     public Void visitRange(RangeExpression expression) {
2194 2193
 		RangeTypeID type = (RangeTypeID)expression.type;
2195
-		JavaSynthesizedClass cls = context.getTypeGenerator().synthesizeRange(type);
2194
+		JavaSynthesizedClass cls = context.getRange(type);
2196 2195
 		javaWriter.newObject(cls.cls.internalName);
2197 2196
 		javaWriter.dup();
2198 2197
 		expression.from.accept(this);

+ 164
- 0
JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaContext.java View File

@@ -5,15 +5,71 @@
5 5
  */
6 6
 package org.openzen.zenscript.javashared;
7 7
 
8
+import java.util.ArrayList;
9
+import java.util.HashMap;
10
+import java.util.List;
11
+import java.util.Map;
12
+import org.openzen.zencode.shared.CodePosition;
8 13
 import org.openzen.zenscript.codemodel.FunctionHeader;
9 14
 import org.openzen.zenscript.codemodel.FunctionParameter;
15
+import org.openzen.zenscript.codemodel.generic.TypeParameter;
16
+import org.openzen.zenscript.codemodel.type.BasicTypeID;
17
+import org.openzen.zenscript.codemodel.type.FunctionTypeID;
18
+import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
10 19
 import org.openzen.zenscript.codemodel.type.ITypeID;
20
+import org.openzen.zenscript.codemodel.type.RangeTypeID;
11 21
 
12 22
 /**
13 23
  *
14 24
  * @author Hoofdgebruiker
15 25
  */
16 26
 public abstract class JavaContext {
27
+	private final GlobalTypeRegistry registry;
28
+	private final Map<String, JavaSynthesizedFunction> functions = new HashMap<>();
29
+	private final Map<String, JavaSynthesizedRange> ranges = new HashMap<>();
30
+	
31
+	public JavaContext(GlobalTypeRegistry registry) {
32
+		this.registry = registry;
33
+		
34
+		{
35
+			TypeParameter t = new TypeParameter(CodePosition.BUILTIN, "T");
36
+			TypeParameter u = new TypeParameter(CodePosition.BUILTIN, "U");
37
+			TypeParameter v = new TypeParameter(CodePosition.BUILTIN, "V");
38
+			
39
+			functions.put("TToU", new JavaSynthesizedFunction(
40
+					new JavaClass("java.util.function", "Function", JavaClass.Kind.INTERFACE),
41
+					new TypeParameter[] { t, u },
42
+					new FunctionHeader(registry.getGeneric(u), registry.getGeneric(t)),
43
+					"apply"));
44
+			
45
+			functions.put("TUToV", new JavaSynthesizedFunction(
46
+					new JavaClass("java.util.function", "BiFunction", JavaClass.Kind.INTERFACE),
47
+					new TypeParameter[] { t, u, v },
48
+					new FunctionHeader(registry.getGeneric(v), registry.getGeneric(t), registry.getGeneric(u)),
49
+					"apply"));
50
+			
51
+			functions.put("TToVoid", new JavaSynthesizedFunction(
52
+					new JavaClass("java.util.function", "Consumer", JavaClass.Kind.INTERFACE),
53
+					new TypeParameter[] { t },
54
+					new FunctionHeader(BasicTypeID.VOID, registry.getGeneric(t)),
55
+					"accept"));
56
+			
57
+			functions.put("TUToVoid", new JavaSynthesizedFunction(
58
+					new JavaClass("java.util.function", "BiConsumer", JavaClass.Kind.INTERFACE),
59
+					new TypeParameter[] { t, u },
60
+					new FunctionHeader(BasicTypeID.VOID, registry.getGeneric(t), registry.getGeneric(u)),
61
+					"accept"));
62
+			
63
+			functions.put("TToBool", new JavaSynthesizedFunction(
64
+					new JavaClass("java.util.function", "Predicate", JavaClass.Kind.INTERFACE),
65
+					new TypeParameter[] { t },
66
+					new FunctionHeader(BasicTypeID.BOOL, registry.getGeneric(t)),
67
+					"test"));
68
+		}
69
+	}
70
+	
71
+	protected abstract JavaSyntheticClassGenerator getTypeGenerator();
72
+			
17 73
 	public abstract String getDescriptor(ITypeID type);
18 74
 	
19 75
 	public String getMethodDescriptor(FunctionHeader header) {
@@ -33,6 +89,114 @@ public abstract class JavaContext {
33 89
 		return getMethodDescriptor(header, true);
34 90
 	}
35 91
 	
92
+	public JavaSynthesizedFunctionInstance getFunction(FunctionTypeID type) {
93
+		String id = getFunctionId(type.header);
94
+		JavaSynthesizedFunction function;
95
+		if (!functions.containsKey(id)) {
96
+			JavaClass cls = new JavaClass("zsynthetic", "Function" + id, JavaClass.Kind.INTERFACE);
97
+			List<TypeParameter> typeParameters = new ArrayList<>();
98
+			List<FunctionParameter> parameters = new ArrayList<>();
99
+			for (FunctionParameter parameter : type.header.parameters) {
100
+				JavaTypeInfo typeInfo = JavaTypeInfo.get(parameter.type);
101
+				if (typeInfo.primitive) {
102
+					parameters.add(new FunctionParameter(parameter.type, Character.toString((char)('a' + parameters.size()))));
103
+				} else {
104
+					TypeParameter typeParameter = new TypeParameter(CodePosition.BUILTIN, getTypeParameter(typeParameters.size()));
105
+					typeParameters.add(typeParameter);
106
+					parameters.add(new FunctionParameter(registry.getGeneric(typeParameter), Character.toString((char)('a' + parameters.size()))));
107
+				}
108
+			}
109
+			ITypeID returnType;
110
+			{
111
+				JavaTypeInfo typeInfo = JavaTypeInfo.get(type.header.getReturnType());
112
+				if (typeInfo.primitive) {
113
+					returnType = type.header.getReturnType();
114
+				} else {
115
+					TypeParameter typeParameter = new TypeParameter(CodePosition.BUILTIN, getTypeParameter(typeParameters.size()));
116
+					typeParameters.add(typeParameter);
117
+					returnType = registry.getGeneric(typeParameter);
118
+				}
119
+			}
120
+			function = new JavaSynthesizedFunction(
121
+					cls,
122
+					typeParameters.toArray(new TypeParameter[typeParameters.size()]),
123
+					new FunctionHeader(returnType, parameters.toArray(new FunctionParameter[parameters.size()])),
124
+					"invoke");
125
+			
126
+			functions.put(id, function);
127
+			getTypeGenerator().synthesizeFunction(function);
128
+		} else {
129
+			function = functions.get(id);
130
+		}
131
+		
132
+		List<ITypeID> typeArguments = new ArrayList<>();
133
+		for (FunctionParameter parameter : type.header.parameters) {
134
+			JavaTypeInfo typeInfo = JavaTypeInfo.get(parameter.type);
135
+			if (!typeInfo.primitive) {
136
+				typeArguments.add(parameter.type);
137
+			}
138
+		}
139
+		if (!JavaTypeInfo.isPrimitive(type.header.getReturnType()))
140
+			typeArguments.add(type.header.getReturnType());
141
+		
142
+		return new JavaSynthesizedFunctionInstance(function, typeArguments.toArray(new ITypeID[typeArguments.size()]));
143
+	}
144
+	
145
+	private String getFunctionId(FunctionHeader header) {
146
+		StringBuilder signature = new StringBuilder();
147
+		int typeParameterIndex = 0;
148
+		for (FunctionParameter parameter : header.parameters) {
149
+			JavaTypeInfo typeInfo = JavaTypeInfo.get(parameter.type);
150
+			String id = typeInfo.primitive ? parameter.type.accept(new JavaSyntheticTypeSignatureConverter()) : getTypeParameter(typeParameterIndex++);
151
+			signature.append(id);
152
+		}
153
+		signature.append("To");
154
+		{
155
+			JavaTypeInfo typeInfo = JavaTypeInfo.get(header.getReturnType());
156
+			String id = typeInfo.primitive ? header.getReturnType().accept(new JavaSyntheticTypeSignatureConverter()) : getTypeParameter(typeParameterIndex++);
157
+			signature.append(id);
158
+		}
159
+		return signature.toString();
160
+	}
161
+	
162
+	private String getTypeParameter(int index) {
163
+	switch (index) {
164
+			case 0: return "T";
165
+			case 1: return "U";
166
+			case 2: return "V";
167
+			case 3: return "W";
168
+			case 4: return "X";
169
+			case 5: return "Y";
170
+			case 6: return "Z";
171
+			default: return "T" + index;
172
+		}
173
+	}
174
+	
175
+	public JavaSynthesizedClass getRange(RangeTypeID type) {
176
+		JavaTypeInfo typeInfo = JavaTypeInfo.get(type.baseType);
177
+		String id = typeInfo.primitive ? type.accept(new JavaSyntheticTypeSignatureConverter()) : "T";
178
+		JavaSynthesizedRange range;
179
+		if (!ranges.containsKey(id)) {
180
+			JavaClass cls = new JavaClass("zsynthetic", id + "Range", JavaClass.Kind.CLASS);
181
+			if (typeInfo.primitive) {
182
+				range = new JavaSynthesizedRange(cls, TypeParameter.NONE, type.baseType);
183
+			} else {
184
+				TypeParameter typeParameter = new TypeParameter(CodePosition.BUILTIN, "T");
185
+				range = new JavaSynthesizedRange(cls, new TypeParameter[] { typeParameter }, registry.getGeneric(typeParameter));
186
+			}
187
+			ranges.put(id, range);
188
+			getTypeGenerator().synthesizeRange(range);
189
+		} else {
190
+			range = ranges.get(id);
191
+		}
192
+		
193
+		if (typeInfo.primitive) {
194
+			return new JavaSynthesizedClass(range.cls, ITypeID.NONE);
195
+		} else {
196
+			return new JavaSynthesizedClass(range.cls, new ITypeID[] { type.baseType });
197
+		}
198
+	}
199
+	
36 200
 	private String getMethodDescriptor(FunctionHeader header, boolean isEnumConstructor) {
37 201
         StringBuilder descBuilder = new StringBuilder("(");
38 202
         if (isEnumConstructor)

+ 4
- 8
JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaSynthesizedClass.java View File

@@ -5,7 +5,7 @@
5 5
  */
6 6
 package org.openzen.zenscript.javashared;
7 7
 
8
-import org.openzen.zenscript.codemodel.generic.TypeParameter;
8
+import org.openzen.zenscript.codemodel.type.ITypeID;
9 9
 
10 10
 /**
11 11
  *
@@ -13,14 +13,10 @@ import org.openzen.zenscript.codemodel.generic.TypeParameter;
13 13
  */
14 14
 public class JavaSynthesizedClass {
15 15
 	public final JavaClass cls;
16
-	public final TypeParameter[] typeParameters;
16
+	public final ITypeID[] typeArguments;
17 17
 	
18
-	public JavaSynthesizedClass(JavaClass cls, TypeParameter[] typeParameters) {
18
+	public JavaSynthesizedClass(JavaClass cls, ITypeID[] typeArguments) {
19 19
 		this.cls = cls;
20
-		this.typeParameters = typeParameters;
21
-	}
22
-
23
-	public JavaSynthesizedClass withTypeParameters(TypeParameter[] typeParameters) {
24
-		return new JavaSynthesizedClass(cls, typeParameters);
20
+		this.typeArguments = typeArguments;
25 21
 	}
26 22
 }

+ 0
- 50
JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaSynthesizedClassNamer.java View File

@@ -1,50 +0,0 @@
1
-/*
2
- * To change this license header, choose License Headers in Project Properties.
3
- * To change this template file, choose Tools | Templates
4
- * and open the template in the editor.
5
- */
6
-package org.openzen.zenscript.javashared;
7
-
8
-import java.util.ArrayList;
9
-import java.util.List;
10
-import org.openzen.zenscript.codemodel.generic.TypeParameter;
11
-import org.openzen.zenscript.codemodel.type.FunctionTypeID;
12
-import org.openzen.zenscript.codemodel.type.ITypeID;
13
-import org.openzen.zenscript.codemodel.type.RangeTypeID;
14
-
15
-/**
16
- *
17
- * @author Hoofdgebruiker
18
- */
19
-public class JavaSynthesizedClassNamer {
20
-	private JavaSynthesizedClassNamer() {}
21
-	
22
-	public static JavaSynthesizedClass createFunctionName(FunctionTypeID function) {
23
-		String signature = getFunctionSignature(function);
24
-		
25
-		String className = "Function" + signature;
26
-		JavaClass cls = new JavaClass("zsynthetic", className, JavaClass.Kind.INTERFACE);
27
-		return new JavaSynthesizedClass(cls, extractTypeParameters(function));
28
-	}
29
-	
30
-	public static JavaSynthesizedClass createRangeName(RangeTypeID range) {
31
-		String signature = getRangeSignature(range);
32
-		String className = signature;
33
-		JavaClass cls = new JavaClass("zsynthetic", className, JavaClass.Kind.CLASS);
34
-		return new JavaSynthesizedClass(cls, extractTypeParameters(range));
35
-	}
36
-	
37
-	public static TypeParameter[] extractTypeParameters(ITypeID type) {
38
-		List<TypeParameter> result = new ArrayList<>();
39
-		type.extractTypeParameters(result);
40
-		return result.toArray(new TypeParameter[result.size()]);
41
-	}
42
-	
43
-	public static String getFunctionSignature(FunctionTypeID type) {
44
-		return new JavaSyntheticTypeSignatureConverter().visitFunction(type);
45
-	}
46
-	
47
-	public static String getRangeSignature(RangeTypeID type) {
48
-		return new JavaSyntheticTypeSignatureConverter().visitRange(type);
49
-	}
50
-}

+ 27
- 0
JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaSynthesizedFunction.java View File

@@ -0,0 +1,27 @@
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.javashared;
7
+
8
+import org.openzen.zenscript.codemodel.FunctionHeader;
9
+import org.openzen.zenscript.codemodel.generic.TypeParameter;
10
+
11
+/**
12
+ *
13
+ * @author Hoofdgebruiker
14
+ */
15
+public class JavaSynthesizedFunction {
16
+	public final JavaClass cls;
17
+	public final TypeParameter[] typeParameters;
18
+	public final FunctionHeader header;
19
+	public final String method;
20
+	
21
+	public JavaSynthesizedFunction(JavaClass cls, TypeParameter[] parameters, FunctionHeader header, String method) {
22
+		this.cls = cls;
23
+		this.typeParameters = parameters;
24
+		this.header = header;
25
+		this.method = method;
26
+	}
27
+}

+ 30
- 0
JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaSynthesizedFunctionInstance.java View File

@@ -0,0 +1,30 @@
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.javashared;
7
+
8
+import org.openzen.zenscript.codemodel.type.ITypeID;
9
+
10
+/**
11
+ *
12
+ * @author Hoofdgebruiker
13
+ */
14
+public class JavaSynthesizedFunctionInstance {
15
+	private final JavaSynthesizedFunction function;
16
+	public final ITypeID[] typeArguments;
17
+	
18
+	public JavaSynthesizedFunctionInstance(JavaSynthesizedFunction function, ITypeID[] typeArguments) {
19
+		this.function = function;
20
+		this.typeArguments = typeArguments;
21
+	}
22
+	
23
+	public JavaClass getCls() {
24
+		return function.cls;
25
+	}
26
+	
27
+	public String getMethod() {
28
+		return function.method;
29
+	}
30
+}

+ 25
- 0
JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaSynthesizedRange.java View File

@@ -0,0 +1,25 @@
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.javashared;
7
+
8
+import org.openzen.zenscript.codemodel.generic.TypeParameter;
9
+import org.openzen.zenscript.codemodel.type.ITypeID;
10
+
11
+/**
12
+ *
13
+ * @author Hoofdgebruiker
14
+ */
15
+public class JavaSynthesizedRange {
16
+	public final JavaClass cls;
17
+	public final TypeParameter[] typeParameters;
18
+	public final ITypeID baseType;
19
+	
20
+	public JavaSynthesizedRange(JavaClass cls, TypeParameter[] typeParameters, ITypeID baseType) {
21
+		this.cls = cls;
22
+		this.typeParameters = typeParameters;
23
+		this.baseType = baseType;
24
+	}
25
+}

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

@@ -5,15 +5,12 @@
5 5
  */
6 6
 package org.openzen.zenscript.javashared;
7 7
 
8
-import org.openzen.zenscript.codemodel.type.FunctionTypeID;
9
-import org.openzen.zenscript.codemodel.type.RangeTypeID;
10
-
11 8
 /**
12 9
  *
13 10
  * @author Hoofdgebruiker
14 11
  */
15 12
 public interface JavaSyntheticClassGenerator {
16
-	JavaSynthesizedClass synthesizeFunction(FunctionTypeID type);
13
+	void synthesizeFunction(JavaSynthesizedFunction function);
17 14
 	
18
-	JavaSynthesizedClass synthesizeRange(RangeTypeID type);
15
+	void synthesizeRange(JavaSynthesizedRange range);
19 16
 }

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

@@ -6,17 +6,17 @@ import org.openzen.zenscript.codemodel.type.*;
6 6
 
7 7
 public class JavaTypeDescriptorVisitor implements ITypeVisitor<String> {
8 8
 	private final JavaTypeDescriptorVisitor forOptional;
9
-	private final JavaSyntheticClassGenerator generator;
9
+	private final JavaContext context;
10 10
 	private final boolean optional;
11 11
 	
12
-	public JavaTypeDescriptorVisitor(JavaSyntheticClassGenerator generator) {
13
-		this(generator, false);
12
+	public JavaTypeDescriptorVisitor(JavaContext context) {
13
+		this(context, false);
14 14
 	}
15 15
 	
16
-	private JavaTypeDescriptorVisitor(JavaSyntheticClassGenerator generator, boolean optional) {
16
+	private JavaTypeDescriptorVisitor(JavaContext context, boolean optional) {
17 17
 		this.optional = optional;
18
-		this.generator = generator;
19
-		forOptional = optional ? this : new JavaTypeDescriptorVisitor(generator, true);
18
+		this.context = context;
19
+		forOptional = optional ? this : new JavaTypeDescriptorVisitor(context, true);
20 20
 	}
21 21
 	
22 22
     @Override
@@ -85,7 +85,7 @@ public class JavaTypeDescriptorVisitor implements ITypeVisitor<String> {
85 85
 
86 86
     @Override
87 87
     public String visitFunction(FunctionTypeID function) {
88
-        return "L" + generator.synthesizeFunction(function).cls.internalName + ";";
88
+        return "L" + context.getFunction(function).getCls().internalName + ";";
89 89
     }
90 90
 
91 91
     @Override
@@ -110,7 +110,7 @@ public class JavaTypeDescriptorVisitor implements ITypeVisitor<String> {
110 110
 
111 111
     @Override
112 112
     public String visitRange(RangeTypeID range) {
113
-		return "L" + generator.synthesizeRange(range).cls.internalName + ";";
113
+		return "L" + context.getRange(range).cls.internalName + ";";
114 114
     }
115 115
 
116 116
     @Override

+ 102
- 0
JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaTypeInfo.java View File

@@ -0,0 +1,102 @@
1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.javashared;
7
+
8
+import org.openzen.zenscript.codemodel.type.ArrayTypeID;
9
+import org.openzen.zenscript.codemodel.type.AssocTypeID;
10
+import org.openzen.zenscript.codemodel.type.BasicTypeID;
11
+import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
12
+import org.openzen.zenscript.codemodel.type.FunctionTypeID;
13
+import org.openzen.zenscript.codemodel.type.GenericMapTypeID;
14
+import org.openzen.zenscript.codemodel.type.GenericTypeID;
15
+import org.openzen.zenscript.codemodel.type.ITypeID;
16
+import org.openzen.zenscript.codemodel.type.ITypeVisitor;
17
+import org.openzen.zenscript.codemodel.type.IteratorTypeID;
18
+import org.openzen.zenscript.codemodel.type.ModifiedTypeID;
19
+import org.openzen.zenscript.codemodel.type.RangeTypeID;
20
+
21
+/**
22
+ *
23
+ * @author Hoofdgebruiker
24
+ */
25
+public class JavaTypeInfo {
26
+	private static final JavaTypeInfo PRIMITIVE = new JavaTypeInfo(true);
27
+	private static final JavaTypeInfo OBJECT = new JavaTypeInfo(false);
28
+	private static final JavaTypeInfoVisitor VISITOR = new JavaTypeInfoVisitor();
29
+	
30
+	public static JavaTypeInfo get(ITypeID type) {
31
+		return type.accept(VISITOR);
32
+	}
33
+	
34
+	public static boolean isPrimitive(ITypeID type) {
35
+		return type.accept(VISITOR).primitive;
36
+	}
37
+	
38
+	public final boolean primitive;
39
+	
40
+	private JavaTypeInfo(boolean primitive) {
41
+		this.primitive = primitive;
42
+	}
43
+	
44
+	private static class JavaTypeInfoVisitor implements ITypeVisitor<JavaTypeInfo> {
45
+
46
+		@Override
47
+		public JavaTypeInfo visitBasic(BasicTypeID basic) {
48
+			switch (basic) {
49
+				case STRING:
50
+				case NULL:
51
+					return OBJECT;
52
+				default:
53
+					return PRIMITIVE;
54
+			}
55
+		}
56
+
57
+		@Override
58
+		public JavaTypeInfo visitArray(ArrayTypeID array) {
59
+			return OBJECT;
60
+		}
61
+
62
+		@Override
63
+		public JavaTypeInfo visitAssoc(AssocTypeID assoc) {
64
+			return OBJECT;
65
+		}
66
+
67
+		@Override
68
+		public JavaTypeInfo visitGenericMap(GenericMapTypeID map) {
69
+			return OBJECT;
70
+		}
71
+
72
+		@Override
73
+		public JavaTypeInfo visitIterator(IteratorTypeID iterator) {
74
+			return OBJECT;
75
+		}
76
+
77
+		@Override
78
+		public JavaTypeInfo visitFunction(FunctionTypeID function) {
79
+			return OBJECT;
80
+		}
81
+
82
+		@Override
83
+		public JavaTypeInfo visitDefinition(DefinitionTypeID definition) {
84
+			return OBJECT;
85
+		}
86
+
87
+		@Override
88
+		public JavaTypeInfo visitGeneric(GenericTypeID generic) {
89
+			return OBJECT;
90
+		}
91
+
92
+		@Override
93
+		public JavaTypeInfo visitRange(RangeTypeID range) {
94
+			return OBJECT;
95
+		}
96
+
97
+		@Override
98
+		public JavaTypeInfo visitModified(ModifiedTypeID type) {
99
+			return type.baseType.accept(this);
100
+		}
101
+	}
102
+}

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

@@ -6,17 +6,17 @@ import org.openzen.zenscript.codemodel.type.*;
6 6
 
7 7
 public class JavaTypeInternalNameVisitor implements ITypeVisitor<String> {
8 8
 	private final JavaTypeInternalNameVisitor forOptional;
9
-	private final JavaSyntheticClassGenerator generator;
9
+	private final JavaContext context;
10 10
 	private final boolean optional;
11 11
 	
12
-	public JavaTypeInternalNameVisitor(JavaSyntheticClassGenerator generator) {
13
-		this(generator, false);
12
+	public JavaTypeInternalNameVisitor(JavaContext context) {
13
+		this(context, false);
14 14
 	}
15 15
 	
16
-	private JavaTypeInternalNameVisitor(JavaSyntheticClassGenerator generator, boolean optional) {
16
+	private JavaTypeInternalNameVisitor(JavaContext context, boolean optional) {
17 17
 		this.optional = optional;
18
-		this.generator = generator;
19
-		forOptional = optional ? this : new JavaTypeInternalNameVisitor(generator, true);
18
+		this.context = context;
19
+		forOptional = optional ? this : new JavaTypeInternalNameVisitor(context, true);
20 20
 	}
21 21
 	
22 22
     @Override
@@ -80,7 +80,7 @@ public class JavaTypeInternalNameVisitor implements ITypeVisitor<String> {
80 80
 
81 81
     @Override
82 82
     public String visitFunction(FunctionTypeID function) {
83
-        return generator.synthesizeFunction(function).cls.internalName;
83
+        return context.getFunction(function).getCls().internalName;
84 84
     }
85 85
 
86 86
     @Override
@@ -101,7 +101,7 @@ public class JavaTypeInternalNameVisitor implements ITypeVisitor<String> {
101 101
 
102 102
     @Override
103 103
     public String visitRange(RangeTypeID range) {
104
-		return generator.synthesizeRange(range).cls.internalName;
104
+		return context.getRange(range).cls.internalName;
105 105
     }
106 106
 
107 107
     @Override

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

@@ -76,7 +76,7 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<Void> {
76 76
 		DefinitionTypeID thisType = typeRegistry.getForMyDefinition(definition);
77 77
 		
78 78
 		CompileScope scope = new CompileScope(module.compilationUnit.globalTypeRegistry, module.expansions, module.annotations);
79
-		return new JavaSourceFileScope(file.importer, compiler.typeGenerator, compiler.helperGenerator, cls, scope, definition instanceof InterfaceDefinition, thisType);
79
+		return new JavaSourceFileScope(file.importer, compiler.helperGenerator, cls, scope, definition instanceof InterfaceDefinition, thisType, compiler.context);
80 80
 	}
81 81
 
82 82
 	@Override

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

@@ -5,7 +5,6 @@
5 5
  */
6 6
 package org.openzen.zenscript.javasource;
7 7
 
8
-import org.openzen.zenscript.javashared.JavaContext;
9 8
 import java.io.File;
10 9
 import java.util.HashMap;
11 10
 import java.util.Map;
@@ -25,22 +24,18 @@ import org.openzen.zenscript.javashared.JavaClass;
25 24
  */
26 25
 public class JavaSourceCompiler implements ZenCodeCompiler {
27 26
 	public final JavaSourceFormattingSettings settings;
28
-	public final JavaSourceSyntheticTypeGenerator typeGenerator;
29 27
 	public final JavaSourceSyntheticHelperGenerator helperGenerator;
30 28
 	
31 29
 	private final File directory;
32 30
 	private final Map<File, JavaSourceFile> sourceFiles = new HashMap<>();
33
-	
34
-	private final Map<String, Integer> classNameCounters = new HashMap<>();
31
+	public final JavaSourceContext context;
35 32
 	
36 33
 	public JavaSourceCompiler(File directory, CompilationUnit compilationUnit) {
37 34
 		if (!directory.exists())
38 35
 			directory.mkdirs();
39 36
 		
40 37
 		settings = new JavaSourceFormattingSettings.Builder().build();
41
-		typeGenerator = new JavaSourceSyntheticTypeGenerator(directory, settings);
42
-		
43
-		JavaSourceContext context = new JavaSourceContext(typeGenerator);
38
+		context = new JavaSourceContext(compilationUnit.globalTypeRegistry, directory, settings);
44 39
 		helperGenerator = new JavaSourceSyntheticHelperGenerator(context, directory, settings);
45 40
 		
46 41
 		this.directory = directory;
@@ -68,7 +63,6 @@ public class JavaSourceCompiler implements ZenCodeCompiler {
68 63
 	
69 64
 	@Override
70 65
 	public void finish() {
71
-		JavaSourceContext context = new JavaSourceContext(typeGenerator);
72 66
 		for (JavaSourceFile sourceFile : sourceFiles.values()) {
73 67
 			sourceFile.prepare(context);
74 68
 		}

+ 13
- 2
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceContext.java View File

@@ -5,6 +5,8 @@
5 5
  */
6 6
 package org.openzen.zenscript.javasource;
7 7
 
8
+import java.io.File;
9
+import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
8 10
 import org.openzen.zenscript.codemodel.type.ITypeID;
9 11
 import org.openzen.zenscript.javashared.JavaContext;
10 12
 import org.openzen.zenscript.javashared.JavaSyntheticClassGenerator;
@@ -16,13 +18,22 @@ import org.openzen.zenscript.javashared.JavaTypeDescriptorVisitor;
16 18
  */
17 19
 public class JavaSourceContext extends JavaContext {
18 20
 	private final JavaTypeDescriptorVisitor typeDescriptorVisitor;
21
+	private final JavaSyntheticClassGenerator generator;
19 22
 	
20
-	public JavaSourceContext(JavaSyntheticClassGenerator generator) {
21
-		typeDescriptorVisitor = new JavaTypeDescriptorVisitor(generator);
23
+	public JavaSourceContext(GlobalTypeRegistry registry, File directory, JavaSourceFormattingSettings settings) {
24
+		super(registry);
25
+		
26
+		typeDescriptorVisitor = new JavaTypeDescriptorVisitor(this);
27
+		this.generator = new JavaSourceSyntheticTypeGenerator(directory, settings, this);
22 28
 	}
23 29
 	
24 30
 	@Override
25 31
 	public String getDescriptor(ITypeID type) {
26 32
 		return type.accept(typeDescriptorVisitor);
27 33
 	}
34
+
35
+	@Override
36
+	protected JavaSyntheticClassGenerator getTypeGenerator() {
37
+		return generator;
38
+	}
28 39
 }

+ 10
- 4
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceExpressionFormatter.java View File

@@ -87,6 +87,7 @@ import org.openzen.zenscript.codemodel.type.ArrayTypeID;
87 87
 import org.openzen.zenscript.codemodel.type.AssocTypeID;
88 88
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
89 89
 import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
90
+import org.openzen.zenscript.codemodel.type.FunctionTypeID;
90 91
 import org.openzen.zenscript.codemodel.type.GenericTypeID;
91 92
 import org.openzen.zenscript.codemodel.type.ITypeID;
92 93
 import org.openzen.zenscript.codemodel.type.member.BuiltinID;
@@ -98,6 +99,7 @@ import org.openzen.zenscript.javashared.JavaClass;
98 99
 import org.openzen.zenscript.javashared.JavaField;
99 100
 import org.openzen.zenscript.javashared.JavaNativeTranslator;
100 101
 import org.openzen.zenscript.javashared.JavaMethod;
102
+import org.openzen.zenscript.javashared.JavaSynthesizedFunctionInstance;
101 103
 import org.openzen.zenscript.javashared.JavaVariantOption;
102 104
 
103 105
 /**
@@ -1196,8 +1198,9 @@ public class JavaSourceExpressionFormatter implements ExpressionVisitor<Expressi
1196 1198
 			case ARRAY_NOTSAME: return binary(call, JavaOperator.NOTEQUALS);
1197 1199
 			case FUNCTION_CALL: {
1198 1200
 				StringBuilder output = new StringBuilder();
1201
+				JavaSynthesizedFunctionInstance function = scope.context.getFunction((FunctionTypeID)call.target.type);
1199 1202
 				output.append(call.target.accept(this).value);
1200
-				output.append(".invoke(");
1203
+				output.append(".").append(function.getMethod()).append("(");
1201 1204
 				int i = 0;
1202 1205
 				for (Expression argument : call.arguments.arguments) {
1203 1206
 					if (i > 0)
@@ -1702,6 +1705,7 @@ public class JavaSourceExpressionFormatter implements ExpressionVisitor<Expressi
1702 1705
 							throw new UnsupportedOperationException("Not yet supported!");
1703 1706
 						}
1704 1707
 					} else {
1708
+						JavaSynthesizedFunctionInstance function = scope.context.getFunction((FunctionTypeID)lambda.type);
1705 1709
 						target.writeLine(new StringBuilder()
1706 1710
 								.append(scope.settings.indent)
1707 1711
 								.append(temp)
@@ -1709,7 +1713,7 @@ public class JavaSourceExpressionFormatter implements ExpressionVisitor<Expressi
1709 1713
 								.append(tempI.name)
1710 1714
 								.append("] = ")
1711 1715
 								.append(lambdaString.value)
1712
-								.append(".invoke(")
1716
+								.append(".").append(function.getMethod()).append("(")
1713 1717
 								.append(tempI.name)
1714 1718
 								.append(");")
1715 1719
 								.toString());
@@ -1776,6 +1780,7 @@ public class JavaSourceExpressionFormatter implements ExpressionVisitor<Expressi
1776 1780
 							throw new UnsupportedOperationException("Not yet supported!");
1777 1781
 						}
1778 1782
 					} else {
1783
+						JavaSynthesizedFunctionInstance function = scope.context.getFunction((FunctionTypeID)lambda.type);
1779 1784
 						target.writeLine(new StringBuilder()
1780 1785
 								.append(scope.settings.indent)
1781 1786
 								.append(temp)
@@ -1783,7 +1788,7 @@ public class JavaSourceExpressionFormatter implements ExpressionVisitor<Expressi
1783 1788
 								.append(tempI.name)
1784 1789
 								.append("] = ")
1785 1790
 								.append(lambdaString.value)
1786
-								.append(".invoke(")
1791
+								.append(".").append(function.getMethod()).append("(")
1787 1792
 								.append(originalString.value)
1788 1793
 								.append("[")
1789 1794
 								.append(tempI.name)
@@ -1854,6 +1859,7 @@ public class JavaSourceExpressionFormatter implements ExpressionVisitor<Expressi
1854 1859
 							throw new UnsupportedOperationException("Not yet supported!");
1855 1860
 						}
1856 1861
 					} else {
1862
+						JavaSynthesizedFunctionInstance function = scope.context.getFunction((FunctionTypeID)lambda.type);
1857 1863
 						target.writeLine(new StringBuilder()
1858 1864
 								.append(scope.settings.indent)
1859 1865
 								.append(temp)
@@ -1861,7 +1867,7 @@ public class JavaSourceExpressionFormatter implements ExpressionVisitor<Expressi
1861 1867
 								.append(tempI.name)
1862 1868
 								.append("] = ")
1863 1869
 								.append(lambdaString.value)
1864
-								.append(".invoke(")
1870
+								.append(".").append(function.getMethod()).append("(")
1865 1871
 								.append(tempI.name)
1866 1872
 								.append(", ")
1867 1873
 								.append(originalString.value)

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

@@ -12,8 +12,8 @@ import org.openzen.zenscript.codemodel.type.BasicTypeID;
12 12
  * @author Hoofdgebruiker
13 13
  */
14 14
 public class JavaSourceObjectTypeVisitor extends JavaSourceTypeVisitor {
15
-	public JavaSourceObjectTypeVisitor(JavaSourceImporter importer, JavaSourceSyntheticTypeGenerator typeGenerator) {
16
-		super(importer, typeGenerator);
15
+	public JavaSourceObjectTypeVisitor(JavaSourceImporter importer, JavaSourceContext context) {
16
+		super(importer, context);
17 17
 	}
18 18
 	
19 19
 	@Override

+ 23
- 50
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceSyntheticTypeGenerator.java View File

@@ -5,7 +5,6 @@
5 5
  */
6 6
 package org.openzen.zenscript.javasource;
7 7
 
8
-import org.openzen.zenscript.javashared.JavaSynthesizedClass;
9 8
 import java.io.BufferedOutputStream;
10 9
 import java.io.File;
11 10
 import java.io.FileOutputStream;
@@ -13,13 +12,10 @@ import java.io.IOException;
13 12
 import java.io.OutputStreamWriter;
14 13
 import java.io.Writer;
15 14
 import java.nio.charset.StandardCharsets;
16
-import java.util.HashMap;
17
-import java.util.Map;
18 15
 import org.openzen.zenscript.codemodel.FunctionParameter;
19
-import org.openzen.zenscript.codemodel.type.FunctionTypeID;
20
-import org.openzen.zenscript.codemodel.type.RangeTypeID;
21 16
 import org.openzen.zenscript.javashared.JavaClass;
22
-import org.openzen.zenscript.javashared.JavaSynthesizedClassNamer;
17
+import org.openzen.zenscript.javashared.JavaSynthesizedFunction;
18
+import org.openzen.zenscript.javashared.JavaSynthesizedRange;
23 19
 import org.openzen.zenscript.javashared.JavaSyntheticClassGenerator;
24 20
 
25 21
 /**
@@ -27,42 +23,28 @@ import org.openzen.zenscript.javashared.JavaSyntheticClassGenerator;
27 23
  * @author Hoofdgebruiker
28 24
  */
29 25
 public class JavaSourceSyntheticTypeGenerator implements JavaSyntheticClassGenerator {
30
-	private final Map<String, JavaSynthesizedClass> functions = new HashMap<>();
31
-	private final Map<String, JavaSynthesizedClass> ranges = new HashMap<>();
32 26
 	private final File directory;
33 27
 	private final JavaSourceFormattingSettings settings;
28
+	private final JavaSourceContext context;
34 29
 	
35
-	public JavaSourceSyntheticTypeGenerator(File directory, JavaSourceFormattingSettings settings) {
30
+	public JavaSourceSyntheticTypeGenerator(File directory, JavaSourceFormattingSettings settings, JavaSourceContext context) {
36 31
 		this.directory = new File(directory, "zsynthetic");
37 32
 		this.settings = settings;
33
+		this.context = context;
38 34
 	}
39 35
 	
40 36
 	@Override
41
-	public JavaSynthesizedClass synthesizeFunction(FunctionTypeID function) {
42
-		String signature = JavaSynthesizedClassNamer.getFunctionSignature(function);
43
-		if (functions.containsKey(signature))
44
-			return functions.get(signature).withTypeParameters(JavaSynthesizedClassNamer.extractTypeParameters(function));
45
-		
46
-		JavaSynthesizedClass result = JavaSynthesizedClassNamer.createFunctionName(function);
47
-		functions.put(signature, result);
48
-		
49
-		JavaSourceImporter importer = new JavaSourceImporter(result.cls);
50
-		JavaSourceTypeVisitor typeVisitor = new JavaSourceTypeVisitor(importer, this);
37
+	public void synthesizeFunction(JavaSynthesizedFunction function) {
38
+		JavaSourceImporter importer = new JavaSourceImporter(function.cls);
39
+		JavaSourceTypeVisitor typeVisitor = new JavaSourceTypeVisitor(importer, context);
51 40
 		
52 41
 		StringBuilder contents = new StringBuilder();
53 42
 		contents.append("@FunctionalInterface\n");
54 43
 		contents.append("public interface ");
55
-		contents.append(result.cls.getName());
56
-		JavaSourceUtils.formatTypeParameters(typeVisitor, contents, result.typeParameters, false);
44
+		contents.append(function.cls.getName());
45
+		JavaSourceUtils.formatTypeParameters(typeVisitor, contents, function.typeParameters, false);
57 46
 		contents.append(" {\n");
58 47
 		contents.append(settings.indent);
59
-		if (function.header.getNumberOfTypeParameters() > 0) {
60
-			contents.append('<');
61
-			for (int i = 0; i < function.header.getNumberOfTypeParameters(); i++) {
62
-				
63
-			}
64
-			contents.append("> ");
65
-		}
66 48
 		contents.append(function.header.getReturnType().accept(typeVisitor));
67 49
 		contents.append(' ');
68 50
 		contents.append("invoke(");
@@ -82,49 +64,40 @@ public class JavaSourceSyntheticTypeGenerator implements JavaSyntheticClassGener
82 64
 		contents.append(");\n");
83 65
 		contents.append("}\n");
84 66
 		
85
-		writeFile(result, importer, contents);
86
-		return result;
67
+		writeFile(function.cls, importer, contents);
87 68
 	}
88 69
 	
89 70
 	@Override
90
-	public JavaSynthesizedClass synthesizeRange(RangeTypeID type) {
91
-		String signature = JavaSynthesizedClassNamer.getRangeSignature(type);
92
-		if (ranges.containsKey(signature))
93
-			return ranges.get(signature).withTypeParameters(JavaSynthesizedClassNamer.extractTypeParameters(type));
94
-		
95
-		JavaSynthesizedClass result = JavaSynthesizedClassNamer.createRangeName(type);
96
-		functions.put(signature, result);
97
-		
98
-		JavaSourceImporter importer = new JavaSourceImporter(result.cls);
99
-		JavaSourceTypeVisitor typeVisitor = new JavaSourceTypeVisitor(importer, this);
71
+	public void synthesizeRange(JavaSynthesizedRange range) {
72
+		JavaSourceImporter importer = new JavaSourceImporter(range.cls);
73
+		JavaSourceTypeVisitor typeVisitor = new JavaSourceTypeVisitor(importer, context);
100 74
 		
101 75
 		StringBuilder contents = new StringBuilder();
102
-		contents.append("public final class ").append(result.cls.getName()).append(" {\n");
103
-		contents.append(settings.indent).append("public final ").append(type.baseType.accept(typeVisitor)).append(" from;\n");
104
-		contents.append(settings.indent).append("public final ").append(type.baseType.accept(typeVisitor)).append(" to;\n");
76
+		contents.append("public final class ").append(range.cls.getName()).append(" {\n");
77
+		contents.append(settings.indent).append("public final ").append(range.baseType.accept(typeVisitor)).append(" from;\n");
78
+		contents.append(settings.indent).append("public final ").append(range.baseType.accept(typeVisitor)).append(" to;\n");
105 79
 		contents.append(settings.indent).append("\n");
106 80
 		contents.append(settings.indent)
107 81
 				.append("public ")
108
-				.append(result.cls.getName())
82
+				.append(range.cls.getName())
109 83
 				.append("(")
110
-				.append(type.baseType.accept(typeVisitor))
84
+				.append(range.baseType.accept(typeVisitor))
111 85
 				.append(" from, ")
112
-				.append(type.baseType.accept(typeVisitor))
86
+				.append(range.baseType.accept(typeVisitor))
113 87
 				.append(" to) {\n");
114 88
 		contents.append(settings.indent).append(settings.indent).append("this.from = from;\n");
115 89
 		contents.append(settings.indent).append(settings.indent).append("this.to = to;\n");
116 90
 		contents.append(settings.indent).append("}\n");
117 91
 		contents.append("}\n");
118 92
 		
119
-		writeFile(result, importer, contents);
120
-		return result;
93
+		writeFile(range.cls, importer, contents);
121 94
 	}
122 95
 	
123
-	private void writeFile(JavaSynthesizedClass result, JavaSourceImporter importer, StringBuilder contents) {
96
+	private void writeFile(JavaClass cls, JavaSourceImporter importer, StringBuilder contents) {
124 97
 		if (!directory.exists())
125 98
 			directory.mkdirs();
126 99
 		
127
-		File file = new File(directory, result.cls.getName() + ".java");
100
+		File file = new File(directory, cls.getName() + ".java");
128 101
 		try (Writer writer = new OutputStreamWriter(new BufferedOutputStream(new FileOutputStream(file)), StandardCharsets.UTF_8)) {
129 102
 			writer.write("package zsynthetic;\n");
130 103
 			

+ 18
- 17
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceTypeVisitor.java View File

@@ -21,6 +21,7 @@ import org.openzen.zenscript.codemodel.type.ITypeVisitor;
21 21
 import org.openzen.zenscript.codemodel.type.IteratorTypeID;
22 22
 import org.openzen.zenscript.codemodel.type.RangeTypeID;
23 23
 import org.openzen.zenscript.javashared.JavaClass;
24
+import org.openzen.zenscript.javashared.JavaSynthesizedFunctionInstance;
24 25
 
25 26
 /**
26 27
  *
@@ -28,23 +29,23 @@ import org.openzen.zenscript.javashared.JavaClass;
28 29
  */
29 30
 public class JavaSourceTypeVisitor implements ITypeVisitor<String>, GenericParameterBoundVisitor<String> {
30 31
 	public final JavaSourceImporter importer;
31
-	public final JavaSourceSyntheticTypeGenerator typeGenerator;
32
+	public final JavaSourceContext context;
32 33
 	public final JavaSourceObjectTypeVisitor objectTypeVisitor;
33 34
 	public final JavaClass cls;
34 35
 	
35
-	public JavaSourceTypeVisitor(JavaSourceImporter importer, JavaSourceSyntheticTypeGenerator typeGenerator) {
36
-		this(importer, typeGenerator, null);
36
+	public JavaSourceTypeVisitor(JavaSourceImporter importer, JavaSourceContext context) {
37
+		this(importer, context, null);
37 38
 	}
38 39
 	
39
-	public JavaSourceTypeVisitor(JavaSourceImporter importer, JavaSourceSyntheticTypeGenerator typeGenerator, JavaClass cls) {
40
+	public JavaSourceTypeVisitor(JavaSourceImporter importer, JavaSourceContext context, JavaClass cls) {
40 41
 		this.importer = importer;
41
-		this.typeGenerator = typeGenerator;
42
+		this.context = context;
42 43
 		this.cls = cls;
43 44
 		
44 45
 		if (this instanceof JavaSourceObjectTypeVisitor) {
45 46
 			objectTypeVisitor = (JavaSourceObjectTypeVisitor)this;
46 47
 		} else {
47
-			objectTypeVisitor = new JavaSourceObjectTypeVisitor(importer, typeGenerator);
48
+			objectTypeVisitor = new JavaSourceObjectTypeVisitor(importer, context);
48 49
 		}
49 50
 	}
50 51
 
@@ -92,7 +93,7 @@ public class JavaSourceTypeVisitor implements ITypeVisitor<String>, GenericParam
92 93
 	@Override
93 94
 	public String visitAssoc(AssocTypeID assoc) {
94 95
 		String map = importer.importType(JavaClass.MAP);
95
-		return map + "<" + assoc.keyType.accept(new JavaSourceObjectTypeVisitor(importer, typeGenerator)) + ", " + assoc.valueType.accept(new JavaSourceObjectTypeVisitor(importer, typeGenerator)) + ">";
96
+		return map + "<" + assoc.keyType.accept(new JavaSourceObjectTypeVisitor(importer, context)) + ", " + assoc.valueType.accept(new JavaSourceObjectTypeVisitor(importer, context)) + ">";
96 97
 	}
97 98
 
98 99
 	@Override
@@ -111,16 +112,16 @@ public class JavaSourceTypeVisitor implements ITypeVisitor<String>, GenericParam
111 112
 
112 113
 	@Override
113 114
 	public String visitFunction(FunctionTypeID function) {
114
-		JavaSynthesizedClass synthetic = typeGenerator.synthesizeFunction(function);
115
+		JavaSynthesizedFunctionInstance synthetic = context.getFunction(function);
115 116
 		StringBuilder result = new StringBuilder();
116
-		result.append(importer.importType(synthetic.cls));
117
-		if (synthetic.typeParameters.length > 0) {
117
+		result.append(importer.importType(synthetic.getCls()));
118
+		if (synthetic.typeArguments.length > 0) {
118 119
 			result.append('<');
119
-			for (int i = 0; i < synthetic.typeParameters.length; i++) {
120
+			for (int i = 0; i < synthetic.typeArguments.length; i++) {
120 121
 				if (i > 0)
121 122
 					result.append(", ");
122 123
 				
123
-				result.append(synthetic.typeParameters[i].name);
124
+				result.append(synthetic.typeArguments[i].accept(new JavaSourceObjectTypeVisitor(importer, context)));
124 125
 			}
125 126
 			result.append('>');
126 127
 		}
@@ -161,16 +162,16 @@ public class JavaSourceTypeVisitor implements ITypeVisitor<String>, GenericParam
161 162
 
162 163
 	@Override
163 164
 	public String visitRange(RangeTypeID range) {
164
-		JavaSynthesizedClass synthetic = typeGenerator.synthesizeRange(range);
165
+		JavaSynthesizedClass synthetic = context.getRange(range);
165 166
 		StringBuilder result = new StringBuilder();
166 167
 		result.append(importer.importType(synthetic.cls));
167
-		if (synthetic.typeParameters.length > 0) {
168
+		if (synthetic.typeArguments.length > 0) {
168 169
 			result.append('<');
169
-			for (int i = 0; i < synthetic.typeParameters.length; i++) {
170
+			for (int i = 0; i < synthetic.typeArguments.length; i++) {
170 171
 				if (i > 0)
171 172
 					result.append(", ");
172 173
 				
173
-				result.append(synthetic.typeParameters[i].name);
174
+				result.append(synthetic.typeArguments[i].accept(new JavaSourceObjectTypeVisitor(importer, context)));
174 175
 			}
175 176
 			result.append('>');
176 177
 		}
@@ -182,7 +183,7 @@ public class JavaSourceTypeVisitor implements ITypeVisitor<String>, GenericParam
182 183
 		if (optional.isOptional() && optional.withoutOptional() == BasicTypeID.USIZE)
183 184
 			return "int"; // usize? is an int
184 185
 		
185
-		return optional.baseType.accept(new JavaSourceObjectTypeVisitor(importer, typeGenerator));
186
+		return optional.baseType.accept(new JavaSourceObjectTypeVisitor(importer, context));
186 187
 	}
187 188
 
188 189
 	@Override

+ 7
- 7
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/scope/JavaSourceFileScope.java View File

@@ -10,9 +10,9 @@ import org.openzen.zenscript.codemodel.type.ITypeID;
10 10
 import org.openzen.zenscript.javasource.JavaSourceImporter;
11 11
 import org.openzen.zenscript.javasource.JavaSourceObjectTypeVisitor;
12 12
 import org.openzen.zenscript.javasource.JavaSourceSyntheticHelperGenerator;
13
-import org.openzen.zenscript.javasource.JavaSourceSyntheticTypeGenerator;
14 13
 import org.openzen.zenscript.javasource.JavaSourceTypeVisitor;
15 14
 import org.openzen.zenscript.javashared.JavaClass;
15
+import org.openzen.zenscript.javasource.JavaSourceContext;
16 16
 
17 17
 /**
18 18
  *
@@ -20,7 +20,6 @@ import org.openzen.zenscript.javashared.JavaClass;
20 20
  */
21 21
 public class JavaSourceFileScope {
22 22
 	public final JavaSourceImporter importer;
23
-	public final JavaSourceSyntheticTypeGenerator typeGenerator;
24 23
 	public final JavaSourceSyntheticHelperGenerator helperGenerator;
25 24
 	public final JavaClass cls;
26 25
 	public final JavaSourceTypeVisitor typeVisitor;
@@ -28,25 +27,26 @@ public class JavaSourceFileScope {
28 27
 	public final TypeScope semanticScope;
29 28
 	public final boolean isInterface;
30 29
 	public final ITypeID thisType;
30
+	public final JavaSourceContext context;
31 31
 	
32 32
 	public JavaSourceFileScope(
33 33
 			JavaSourceImporter importer, 
34
-			JavaSourceSyntheticTypeGenerator typeGenerator,
35 34
 			JavaSourceSyntheticHelperGenerator helperGenerator,
36 35
 			JavaClass cls,
37 36
 			TypeScope semanticScope,
38 37
 			boolean isInterface,
39
-			ITypeID thisType)
38
+			ITypeID thisType,
39
+			JavaSourceContext context)
40 40
 	{
41 41
 		this.importer = importer;
42
-		this.typeGenerator = typeGenerator;
43 42
 		this.helperGenerator = helperGenerator;
44 43
 		this.cls = cls;
45 44
 		this.semanticScope = semanticScope;
46 45
 		this.isInterface = isInterface;
47 46
 		this.thisType = thisType;
47
+		this.context = context;
48 48
 		
49
-		typeVisitor = new JavaSourceTypeVisitor(importer, typeGenerator);
49
+		typeVisitor = new JavaSourceTypeVisitor(importer, context);
50 50
 		objectTypeVisitor = typeVisitor.objectTypeVisitor;
51 51
 	}
52 52
 	
@@ -55,6 +55,6 @@ public class JavaSourceFileScope {
55 55
 	}
56 56
 	
57 57
 	public String type(ITypeID type, JavaClass rename) {
58
-		return type.accept(new JavaSourceTypeVisitor(importer, typeGenerator, rename));
58
+		return type.accept(new JavaSourceTypeVisitor(importer, context, rename));
59 59
 	}
60 60
 }

+ 3
- 0
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/scope/JavaSourceStatementScope.java View File

@@ -21,6 +21,7 @@ import org.openzen.zenscript.javasource.JavaSourceFormattingSettings;
21 21
 import org.openzen.zenscript.javasource.JavaSourceExpressionFormatter;
22 22
 import org.openzen.zenscript.javasource.JavaSourceStatementFormatter;
23 23
 import org.openzen.zenscript.javashared.JavaClass;
24
+import org.openzen.zenscript.javasource.JavaSourceContext;
24 25
 
25 26
 /**
26 27
  *
@@ -33,6 +34,7 @@ public class JavaSourceStatementScope {
33 34
 	public final LoopStatement innerLoop;
34 35
 	public final boolean isExpansion;
35 36
 	public final ITypeID thisType;
37
+	public final JavaSourceContext context;
36 38
 	
37 39
 	private final JavaSourceStatementScope outer;
38 40
 	private final Set<String> localVariables = new HashSet<>();
@@ -53,6 +55,7 @@ public class JavaSourceStatementScope {
53 55
 		this.outer = outer;
54 56
 		this.isExpansion = isExpansion;
55 57
 		this.thisType = fileScope.thisType;
58
+		this.context = fileScope.context;
56 59
 		
57 60
 		if (header != null) {
58 61
 			for (FunctionParameter parameter : header.parameters)

+ 1
- 1
ScriptingExample/src/main/java/org/openzen/zenscript/scriptingexample/Main.java View File

@@ -125,7 +125,7 @@ public class Main {
125 125
 	}
126 126
 	
127 127
 	private static JavaModule compileSemanticToJava(SemanticModule module) {
128
-		JavaCompiler compiler = new JavaCompiler(false, null);
128
+		JavaCompiler compiler = new JavaCompiler(module.compilationUnit.globalTypeRegistry, false, null);
129 129
 		for (HighLevelDefinition definition : module.definitions.getAll()) {
130 130
 			compiler.addDefinition(definition, module);
131 131
 		}

Loading…
Cancel
Save