Browse Source

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

kindlich 6 years ago
parent
commit
c4ac4f9a18
No known key found for this signature in database
52 changed files with 3164 additions and 2542 deletions
  1. 3
    0
      Constructor/src/main/java/org/openzen/zenscript/constructor/module/DirectoryModuleReference.java
  2. 72
    0
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeContext.java
  3. 56
    32
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaCompiler.java
  4. 0
    23
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaFieldInfo.java
  5. 8
    3
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaModule.java
  6. 82
    100
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/CompilerUtils.java
  7. 339
    366
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaExpressionVisitor.java
  8. 0
    98
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaOptionalTypeClassVisitor.java
  9. 94
    23
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaPreDecrementVisitor.java
  10. 93
    22
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaPreIncrementVisitor.java
  11. 31
    28
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaStatementVisitor.java
  12. 0
    98
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaTypeClassVisitor.java
  13. 0
    61
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaTypeVisitor.java
  14. 964
    965
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaWriter.java
  15. 40
    43
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/definitions/JavaDefinitionVisitor.java
  16. 76
    73
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/definitions/JavaMemberVisitor.java
  17. 12
    0
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaClass.java
  18. 48
    0
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaContext.java
  19. 5
    5
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaField.java
  20. 3
    5
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaImplementation.java
  21. 15
    10
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaMethod.java
  22. 57
    0
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaModifiers.java
  23. 44
    0
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaNativeClass.java
  24. 16
    0
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaNativeTranslation.java
  25. 30
    0
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaNativeTranslator.java
  26. 1
    2
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaSynthesizedClass.java
  27. 50
    0
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaSynthesizedClassNamer.java
  28. 19
    0
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaSyntheticClassGenerator.java
  29. 2
    2
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaSyntheticTypeSignatureConverter.java
  30. 121
    0
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaTypeDescriptorVisitor.java
  31. 117
    0
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaTypeInternalNameVisitor.java
  32. 3
    3
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaTypeNameVisitor.java
  33. 3
    5
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaVariantOption.java
  34. 35
    28
      JavaShared/src/main/java/org/openzen/zenscript/javashared/prepare/JavaPrepareClassMethodVisitor.java
  35. 156
    0
      JavaShared/src/main/java/org/openzen/zenscript/javashared/prepare/JavaPrepareDefinitionMemberVisitor.java
  36. 324
    0
      JavaShared/src/main/java/org/openzen/zenscript/javashared/prepare/JavaPrepareDefinitionVisitor.java
  37. 24
    18
      JavaShared/src/main/java/org/openzen/zenscript/javashared/prepare/JavaPrepareExpansionMethodVisitor.java
  38. 0
    27
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/FormattingUtils.java
  39. 1
    1
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaDefinitionVisitor.java
  40. 2
    2
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaExpansionMemberCompiler.java
  41. 6
    5
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaMemberCompiler.java
  42. 11
    5
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceCompiler.java
  43. 28
    0
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceContext.java
  44. 84
    27
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceExpressionFormatter.java
  45. 17
    1
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceFile.java
  46. 14
    8
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceSyntheticHelperGenerator.java
  47. 54
    32
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceSyntheticTypeGenerator.java
  48. 2
    1
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceTypeVisitor.java
  49. 0
    46
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/prepare/JavaNativeClass.java
  50. 0
    358
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/prepare/JavaSourcePrepareDefinitionVisitor.java
  51. 0
    14
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/prepare/JavaSourceSignatureVisitor.java
  52. 2
    2
      ScriptingExample/src/main/java/org/openzen/zenscript/scriptingexample/GlobalRegistry.java

+ 3
- 0
Constructor/src/main/java/org/openzen/zenscript/constructor/module/DirectoryModuleReference.java View File

@@ -115,6 +115,9 @@ public class DirectoryModuleReference implements ModuleReference {
115 115
 	}
116 116
 	
117 117
 	private SourcePackage loadPackage(String name, File directory) {
118
+		if (!directory.exists())
119
+			throw new IllegalArgumentException("Directory does not exist: " + directory.getAbsolutePath());
120
+		
118 121
 		SourcePackage pkg = new SourcePackage(directory, name);
119 122
 		
120 123
 		for (File file : directory.listFiles()) {

+ 72
- 0
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeContext.java View File

@@ -0,0 +1,72 @@
1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.javabytecode;
7
+
8
+import org.objectweb.asm.Type;
9
+import org.openzen.zenscript.codemodel.FunctionHeader;
10
+import org.openzen.zenscript.codemodel.FunctionParameter;
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
+import org.openzen.zenscript.javabytecode.compiler.CompilerUtils;
15
+import org.openzen.zenscript.javashared.JavaContext;
16
+import org.openzen.zenscript.javashared.JavaSynthesizedClass;
17
+import org.openzen.zenscript.javashared.JavaSyntheticClassGenerator;
18
+import org.openzen.zenscript.javashared.JavaTypeDescriptorVisitor;
19
+import org.openzen.zenscript.javashared.JavaTypeInternalNameVisitor;
20
+
21
+/**
22
+ *
23
+ * @author Hoofdgebruiker
24
+ */
25
+public class JavaBytecodeContext extends JavaContext {
26
+	private final JavaModule module;
27
+	private final TypeGenerator typeGenerator;
28
+	private final JavaTypeInternalNameVisitor internalNameVisitor;
29
+	private final JavaTypeDescriptorVisitor descriptorVisitor;
30
+	
31
+	public JavaBytecodeContext(JavaModule module) {
32
+		this.module = module;
33
+		
34
+		typeGenerator = new TypeGenerator();
35
+		internalNameVisitor = new JavaTypeInternalNameVisitor(typeGenerator);
36
+		descriptorVisitor = new JavaTypeDescriptorVisitor(typeGenerator);
37
+	}
38
+	
39
+	public JavaSyntheticClassGenerator getTypeGenerator() {
40
+		return typeGenerator;
41
+	}
42
+	
43
+	@Override
44
+	public String getDescriptor(ITypeID type) {
45
+		return type.accept(descriptorVisitor);
46
+	}
47
+	
48
+	public String getInternalName(ITypeID type) {
49
+		return type.accept(internalNameVisitor);
50
+	}
51
+	
52
+	public Type getType(ITypeID type) {
53
+		return Type.getType(getDescriptor(type));
54
+	}
55
+	
56
+	public void register(String name, byte[] bytecode) {
57
+		module.register(name, bytecode);
58
+	}
59
+	
60
+	private class TypeGenerator implements JavaSyntheticClassGenerator {
61
+
62
+		@Override
63
+		public JavaSynthesizedClass synthesizeFunction(FunctionTypeID type) {
64
+			return CompilerUtils.getLambdaInterface(JavaBytecodeContext.this, type);
65
+		}
66
+
67
+		@Override
68
+		public JavaSynthesizedClass synthesizeRange(RangeTypeID type) {
69
+			throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
70
+		}
71
+	}
72
+}

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

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.javabytecode;
7 7
 
8 8
 import java.io.File;
9
+import java.util.ArrayList;
9 10
 import java.util.HashMap;
10 11
 import java.util.Map;
11 12
 
@@ -24,8 +25,11 @@ import org.openzen.zenscript.javabytecode.compiler.JavaWriter;
24 25
 import org.openzen.zenscript.javabytecode.compiler.definitions.JavaDefinitionVisitor;
25 26
 
26 27
 import java.util.HashMap;
28
+import java.util.List;
27 29
 import java.util.Map;
28 30
 import org.openzen.zenscript.javashared.JavaClass;
31
+import org.openzen.zenscript.javashared.prepare.JavaPrepareDefinitionMemberVisitor;
32
+import org.openzen.zenscript.javashared.prepare.JavaPrepareDefinitionVisitor;
29 33
 
30 34
 /**
31 35
  * @author Hoofdgebruiker
@@ -36,49 +40,36 @@ public class JavaCompiler implements ZenCodeCompiler {
36 40
 	private final JavaClassWriter scriptsClassWriter;
37 41
 	private int generatedScriptBlockCounter = 0;
38 42
 	private boolean finished = false;
39
-	private JavaModule compiled = null;
40
-private final File jarFile;
41
-
43
+	private final File jarFile;
44
+	private final JavaBytecodeContext context;
45
+	
46
+	private final List<HighLevelDefinition> definitions = new ArrayList<>();
47
+	private final List<ScriptBlock> scripts = new ArrayList<>();
48
+	
42 49
 	public JavaCompiler(File jarFile) {
43 50
 		this(false, jarFile);
44 51
 	}
45 52
 
46 53
 	public JavaCompiler(boolean debug, File jarFile) {
47 54
 		target = new JavaModule();
48
-this.jarFile = jarFile;
49
-
55
+		this.jarFile = jarFile;
56
+		this.context = new JavaBytecodeContext(target);
57
+		
50 58
 		scriptsClassWriter = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
51 59
 		scriptsClassWriter.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, "Scripts", null, "java/lang/Object", null);
52 60
 	}
53 61
 
54 62
 	@Override
55 63
 	public void addDefinition(HighLevelDefinition definition, SemanticModule module) {
56
-		String className = getClassName(definition.position.getFilename());
57
-		JavaScriptFile scriptFile = getScriptFile(className);
58
-		target.register(definition.name, definition.accept(new JavaDefinitionVisitor(scriptFile.classWriter)));
64
+		JavaPrepareDefinitionVisitor preparer = new JavaPrepareDefinitionVisitor(definition.position.getFilename(), null);
65
+		definition.accept(preparer);
66
+		
67
+		definitions.add(definition);
59 68
 	}
60 69
 
61 70
 	@Override
62 71
 	public void addScriptBlock(ScriptBlock script) {
63
-		final SourceFile sourceFile = script.getTag(SourceFile.class);
64
-		final String className = getClassName(sourceFile == null ? null : sourceFile.getFilename());
65
-		JavaScriptFile scriptFile = getScriptFile(className);
66
-
67
-		String methodName = scriptFile.scriptMethods.isEmpty() ? "run" : "run" + scriptFile.scriptMethods.size();
68
-
69
-		// convert scripts into methods (add them to a Scripts class?)
70
-		// (TODO: can we break very long scripts into smaller methods? for the extreme scripts)
71
-		final JavaClassWriter visitor = scriptFile.classWriter;
72
-		JavaMethodInfo method = new JavaMethodInfo(new JavaClass(script.pkg.fullName, className, JavaClass.Kind.CLASS), methodName, "()V", Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC);
73
-		scriptFile.scriptMethods.add(method);
74
-
75
-		final JavaStatementVisitor statementVisitor = new JavaStatementVisitor(new JavaWriter(visitor, method, null, null, null));
76
-		statementVisitor.start();
77
-		for (Statement statement : script.statements) {
78
-			statement.accept(statementVisitor);
79
-		}
80
-		target.register("Scripts", scriptsClassWriter.toByteArray());
81
-		statementVisitor.end();
72
+		scripts.add(script);
82 73
 	}
83 74
 
84 75
 	private String getClassName(String filename) {
@@ -112,17 +103,51 @@ this.jarFile = jarFile;
112 103
 
113 104
 	@Override
114 105
 	public void run() {
115
-		if (compiled == null)
106
+		if (!finished)
116 107
 			throw new IllegalStateException("Not yet built!");
117
-
118
-// TODO: execute this
108
+		
109
+		// TODO: execute this
119 110
 	}
120 111
 
121 112
 	public JavaModule finishAndGetModule() {
122 113
 		if (finished)
123 114
 			throw new IllegalStateException("Already finished!");
115
+		
124 116
 		finished = true;
125
-
117
+		
118
+		for (HighLevelDefinition definition : definitions) {
119
+			JavaPrepareDefinitionMemberVisitor memberPreparer = new JavaPrepareDefinitionMemberVisitor(context, definition.position.getFilename());
120
+			definition.accept(memberPreparer);
121
+		}
122
+		
123
+		for (HighLevelDefinition definition : definitions) {
124
+			String className = getClassName(definition.position.getFilename());
125
+			JavaScriptFile scriptFile = getScriptFile(className);
126
+			
127
+			target.register(definition.name, definition.accept(new JavaDefinitionVisitor(context, scriptFile.classWriter)));
128
+		}
129
+ 
130
+		for (ScriptBlock script : scripts) {
131
+			final SourceFile sourceFile = script.getTag(SourceFile.class);
132
+			final String className = getClassName(sourceFile == null ? null : sourceFile.getFilename());
133
+			JavaScriptFile scriptFile = getScriptFile(className);
134
+
135
+			String methodName = scriptFile.scriptMethods.isEmpty() ? "run" : "run" + scriptFile.scriptMethods.size();
136
+
137
+			// convert scripts into methods (add them to a Scripts class?)
138
+			// (TODO: can we break very long scripts into smaller methods? for the extreme scripts)
139
+			final JavaClassWriter visitor = scriptFile.classWriter;
140
+			JavaMethodInfo method = new JavaMethodInfo(new JavaClass(script.pkg.fullName, className, JavaClass.Kind.CLASS), methodName, "()V", Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC);
141
+			scriptFile.scriptMethods.add(method);
142
+
143
+			final JavaStatementVisitor statementVisitor = new JavaStatementVisitor(context, new JavaWriter(visitor, method, null, null, null));
144
+			statementVisitor.start();
145
+			for (Statement statement : script.statements) {
146
+				statement.accept(statementVisitor);
147
+			}
148
+			statementVisitor.end();
149
+		}
150
+		
126 151
 		JavaMethodInfo runMethod = new JavaMethodInfo(new JavaClass("script", "Scripts", JavaClass.Kind.CLASS), "run", "()V", Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC);
127 152
 		final JavaWriter runWriter = new JavaWriter(scriptsClassWriter, runMethod, null, null, null);
128 153
 		runWriter.start();
@@ -137,7 +162,6 @@ this.jarFile = jarFile;
137 162
 		runWriter.end();
138 163
 
139 164
 		target.register("Scripts", scriptsClassWriter.toByteArray());
140
-
141 165
 		return target;
142 166
 	}
143 167
 }

+ 0
- 23
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaFieldInfo.java View File

@@ -1,23 +0,0 @@
1
-/*
2
- * To change this license header, choose License Headers in Project Properties.
3
- * To change this template file, choose Tools | Templates
4
- * and open the template in the editor.
5
- */
6
-package org.openzen.zenscript.javabytecode;
7
-
8
-import org.openzen.zenscript.javashared.JavaClass;
9
-
10
-/**
11
- * @author Hoofdgebruiker
12
- */
13
-public class JavaFieldInfo {
14
-	public final JavaClass javaClass;
15
-	public final String name;
16
-	public final String signature;
17
-
18
-	public JavaFieldInfo(JavaClass javaClass, String name, String signature) {
19
-		this.javaClass = javaClass;
20
-		this.name = name;
21
-		this.signature = signature;
22
-	}
23
-}

+ 8
- 3
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaModule.java View File

@@ -18,16 +18,19 @@ import java.util.logging.Logger;
18 18
  * @author Hoofdgebruiker
19 19
  */
20 20
 public class JavaModule {
21
-	public static final Map<String, byte[]> classes = new HashMap<>();
21
+	private final Map<String, byte[]> classes = new HashMap<>();
22 22
 
23 23
 	public JavaModule() {
24 24
 
25 25
 	}
26 26
 
27 27
 	public void register(String classname, byte[] bytecode) {
28
-		if (bytecode == null) return;
28
+		if (bytecode == null)
29
+			return;
30
+		
29 31
 		classes.put(classname, bytecode);
30
-		try (FileOutputStream writer = new FileOutputStream(new File(classname + ".class"))) {
32
+		
33
+		try (FileOutputStream writer = new FileOutputStream(new File(classname.replace('/', '_') + ".class"))) {
31 34
 			writer.write(bytecode);
32 35
 		} catch (IOException e) {
33 36
 			e.printStackTrace();
@@ -49,6 +52,8 @@ public class JavaModule {
49 52
 
50 53
 		@Override
51 54
 		public Class<?> loadClass(String name) throws ClassNotFoundException {
55
+			//System.out.println("LoadClass " + name);
56
+			
52 57
 			if (customClasses.containsKey(name))
53 58
 				return customClasses.get(name);
54 59
 			if (classes.containsKey(name)) {

+ 82
- 100
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/CompilerUtils.java View File

@@ -13,36 +13,20 @@ import org.openzen.zenscript.codemodel.member.FieldMember;
13 13
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
14 14
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
15 15
 import org.openzen.zenscript.codemodel.type.ITypeID;
16
-import org.openzen.zenscript.javabytecode.JavaModule;
17 16
 import org.openzen.zenscript.javabytecode.JavaParameterInfo;
18 17
 
19 18
 import java.io.FileOutputStream;
20 19
 import java.io.IOException;
21 20
 import java.util.HashMap;
22 21
 import java.util.Map;
22
+import org.openzen.zenscript.codemodel.type.FunctionTypeID;
23
+import org.openzen.zenscript.javabytecode.JavaBytecodeContext;
24
+import org.openzen.zenscript.javashared.JavaClass;
25
+import org.openzen.zenscript.javashared.JavaSynthesizedClass;
26
+import org.openzen.zenscript.javashared.JavaSynthesizedClassNamer;
23 27
 
24 28
 public class CompilerUtils {
25
-	public static String calcDesc(FunctionHeader header, boolean isEnum) {
26
-		StringBuilder descBuilder = new StringBuilder("(");
27
-		if (isEnum)
28
-			descBuilder.append("Ljava/lang/String;I");
29
-		for (FunctionParameter parameter : header.parameters) {
30
-			//descBuilder.append(Type.getDescriptor(parameter.type.accept(JavaTypeClassVisitor.INSTANCE)));
31
-			descBuilder.append(parameter.type.accept(JavaTypeVisitor.INSTANCE).getDescriptor());
32
-		}
33
-		descBuilder.append(")");
34
-		descBuilder.append(header.returnType.accept(JavaTypeVisitor.INSTANCE).getDescriptor());
35
-		return descBuilder.toString();
36
-	}
37
-
38
-	public static String calcSign(FunctionHeader header, boolean isEnum) {
39
-		StringBuilder signatureBuilder = new StringBuilder("(");
40
-		for (FunctionParameter parameter : header.parameters) {
41
-			signatureBuilder.append(parameter.type.accept(JavaTypeVisitor.INSTANCE).getDescriptor());
42
-		}
43
-		signatureBuilder.append(")").append(header.returnType.accept(JavaTypeVisitor.INSTANCE).getDescriptor());
44
-		return signatureBuilder.toString();
45
-	}
29
+	private CompilerUtils() {}
46 30
 
47 31
 	public static boolean isPrimitive(ITypeID id) {
48 32
 		if (id instanceof BasicTypeID) {
@@ -86,86 +70,84 @@ public class CompilerUtils {
86 70
 		return position.getFilename().substring(0, position.getFilename().lastIndexOf('.')).replace("/", "_");
87 71
 	}
88 72
 
89
-	public static void tagMethodParameters(FunctionHeader header, boolean isStatic) {
90
-		JavaTypeVisitor typeVisitor = new JavaTypeVisitor();
91
-		for (int i = 0; i < header.parameters.length; i++) {
92
-			FunctionParameter parameter = header.parameters[i];
93
-			Type parameterType = parameter.type.accept(typeVisitor);
94
-			parameter.setTag(JavaParameterInfo.class, new JavaParameterInfo(isStatic ? i : i + 1, parameterType));
95
-		}
96
-	}
73
+    public static void tagMethodParameters(JavaBytecodeContext context, FunctionHeader header, boolean isStatic) {
74
+        for (int i = 0; i < header.parameters.length; i++) {
75
+            FunctionParameter parameter = header.parameters[i];
76
+            Type parameterType = context.getType(parameter.type);
77
+            parameter.setTag(JavaParameterInfo.class, new JavaParameterInfo(isStatic ? i : i + 1, parameterType));
78
+        }
79
+    }
80
+
81
+    public static void tagConstructorParameters(JavaBytecodeContext context, FunctionHeader header, boolean isEnum) {
82
+        for (int i = 0; i < header.parameters.length; i++) {
83
+            FunctionParameter parameter = header.parameters[i];
84
+            Type parameterType = context.getType(parameter.type);
85
+            parameter.setTag(JavaParameterInfo.class, new JavaParameterInfo(isEnum ? i + 3 : i + 1, parameterType));
86
+        }
87
+    }
88
+
89
+    public static void writeDefaultFieldInitializers(JavaBytecodeContext context, JavaWriter constructorWriter, HighLevelDefinition definition, boolean staticFields) {
90
+        JavaExpressionVisitor expressionVisitor = new JavaExpressionVisitor(context, constructorWriter);
91
+        for (final IDefinitionMember definitionMember : definition.members) {
92
+            if (!(definitionMember instanceof FieldMember))
93
+                continue;
94
+
95
+            FieldMember field = (FieldMember) definitionMember;
96
+            if (field.isStatic() == staticFields && field.initializer != null) {
97
+                if (!staticFields)
98
+                    constructorWriter.loadObject(0);
99
+                field.initializer.accept(expressionVisitor);
100
+                if (staticFields)
101
+                    constructorWriter.putStaticField(definition.name, field.name, context.getDescriptor(field.type));
102
+                else
103
+                    constructorWriter.putField(definition.name, field.name, context.getDescriptor(field.type));
104
+            }
105
+        }
106
+    }
107
+
108
+	private static final Map<String, JavaSynthesizedClass> functions = new HashMap<>();
109
+	
110
+    public static JavaSynthesizedClass getLambdaInterface(JavaBytecodeContext context, FunctionTypeID function) {
111
+		String signature = JavaSynthesizedClassNamer.getFunctionSignature(function);
112
+		if (functions.containsKey(signature))
113
+			return functions.get(signature).withTypeParameters(JavaSynthesizedClassNamer.extractTypeParameters(function));
114
+		
115
+		System.out.println("Generating function " + signature);
116
+		
117
+		JavaSynthesizedClass result = JavaSynthesizedClassNamer.createFunctionName(function);
118
+		functions.put(signature, result);
119
+		
120
+        createLambdaInterface(context, function.header, result.cls);
121
+        return result;
122
+    }
123
+
124
+    private static void createLambdaInterface(JavaBytecodeContext context, FunctionHeader header, JavaClass cls) {
125
+        ClassWriter ifaceWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
126
+        ifaceWriter.visitAnnotation("java/lang/FunctionalInterface", true).visitEnd();
127
+        ifaceWriter.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC | Opcodes.ACC_INTERFACE | Opcodes.ACC_ABSTRACT, cls.internalName, null, "java/lang/Object", null);
128
+
129
+        ifaceWriter
130
+				.visitMethod(
131
+					Opcodes.ACC_PUBLIC | Opcodes.ACC_ABSTRACT,
132
+					"accept",
133
+					context.getMethodDescriptor(header),
134
+					context.getMethodSignature(header),
135
+					null)
136
+				.visitEnd();
137
+
138
+        context.register(cls.internalName.replace('/', '.'), ifaceWriter.toByteArray());
139
+
140
+        try (FileOutputStream out = new FileOutputStream(cls.getClassName() + ".class")){
141
+            out.write(ifaceWriter.toByteArray());
142
+        } catch (IOException e) {
143
+            e.printStackTrace();
144
+        }
145
+    }
97 146
 
98
-	public static void tagConstructorParameters(FunctionHeader header, boolean isEnum) {
99
-		JavaTypeVisitor typeVisitor = new JavaTypeVisitor();
100
-		for (int i = 0; i < header.parameters.length; i++) {
101
-			FunctionParameter parameter = header.parameters[i];
102
-			Type parameterType = parameter.type.accept(typeVisitor);
103
-			parameter.setTag(JavaParameterInfo.class, new JavaParameterInfo(isEnum ? i + 3 : i + 1, parameterType));
104
-		}
105
-	}
106
-
107
-	public static void writeDefaultFieldInitializers(JavaWriter constructorWriter, HighLevelDefinition definition, boolean staticFields) {
108
-		JavaExpressionVisitor expressionVisitor = new JavaExpressionVisitor(constructorWriter);
109
-		for (final IDefinitionMember definitionMember : definition.members) {
110
-			if (!(definitionMember instanceof FieldMember))
111
-				continue;
112
-
113
-			FieldMember field = (FieldMember) definitionMember;
114
-			if (field.isStatic() == staticFields && field.initializer != null) {
115
-				if (!staticFields)
116
-					constructorWriter.loadObject(0);
117
-				field.initializer.accept(expressionVisitor);
118
-				if (staticFields)
119
-					constructorWriter.putStaticField(definition.name, field.name, Type.getDescriptor(field.type.accept(JavaTypeClassVisitor.INSTANCE)));
120
-				else
121
-					constructorWriter.putField(definition.name, field.name, Type.getDescriptor(field.type.accept(JavaTypeClassVisitor.INSTANCE)));
122
-			}
123
-		}
124
-	}
125
-
126
-	private static final Map<String, String> lambdas = new HashMap<>();
127 147
 	private static int lambdaCounter = 0;
128
-	private static int lambdaICounter = 0;
129
-
130
-	public static String getLambdaInterface(final FunctionHeader header) {
131
-		StringBuilder builder = new StringBuilder("(");
132
-		for (FunctionParameter parameter : header.parameters) {
133
-			builder.append(parameter.type.accept(JavaTypeVisitor.INSTANCE).getDescriptor());
134
-		}
135
-
136
-		//final String identifier = header.toString();
137
-		final String identifier = builder.append(")").append(header.returnType.accept(JavaTypeVisitor.INSTANCE).getDescriptor()).toString();
138
-		if (!lambdas.containsKey(identifier)) {
139
-			final String name = "lambdaInterface" + ++lambdaICounter;
140
-			lambdas.put(identifier, name);
141
-			createLambdaInterface(header, name);
142
-		}
143
-		return lambdas.get(identifier);
144
-	}
145
-
146
-	private static void createLambdaInterface(FunctionHeader header, String name) {
147
-		ClassWriter ifaceWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
148
-		ifaceWriter.visitAnnotation("java/lang/FunctionalInterface", true).visitEnd();
149
-		ifaceWriter.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC | Opcodes.ACC_INTERFACE | Opcodes.ACC_ABSTRACT, name, null, "java/lang/Object", null);
150
-
151
-		ifaceWriter.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_ABSTRACT, "accept", calcDesc(header, false), calcSign(header, false), null).visitEnd();
152
-
153
-		ifaceWriter.visitEnd();
154
-
155
-		JavaModule.classes.putIfAbsent(name, ifaceWriter.toByteArray());
156
-
157
-		try (FileOutputStream out = new FileOutputStream(name + ".class")) {
158
-			out.write(ifaceWriter.toByteArray());
159
-		} catch (IOException e) {
160
-			e.printStackTrace();
161
-		}
162
-	}
163
-
164
-
165
-	public static String getLambdaCounter() {
166
-		return "lambda" + ++lambdaCounter;
167
-	}
168
-
148
+    public static String getLambdaCounter() {
149
+        return "lambda" + ++lambdaCounter;
150
+    }
169 151
 
170 152
 	public static int getKeyForSwitch(SwitchValue expression) {
171 153
 		return expression.accept(new SwitchKeyVisitor());

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

@@ -1,5 +1,8 @@
1 1
 package org.openzen.zenscript.javabytecode.compiler;
2 2
 
3
+import java.util.Arrays;
4
+import java.util.Comparator;
5
+import java.util.StringJoiner;
3 6
 import org.objectweb.asm.ClassWriter;
4 7
 import org.objectweb.asm.Label;
5 8
 import org.objectweb.asm.Opcodes;
@@ -21,190 +24,179 @@ import org.openzen.zenscript.javabytecode.*;
21 24
 import java.io.FileOutputStream;
22 25
 import java.io.IOException;
23 26
 import org.openzen.zenscript.javashared.JavaClass;
24
-import java.util.*;
27
+import org.openzen.zenscript.javashared.JavaField;
28
+import org.openzen.zenscript.javashared.JavaSynthesizedClassNamer;
25 29
 
26 30
 public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
27 31
 	private static final int PUBLIC = Opcodes.ACC_PUBLIC;
28 32
 	private static final int STATIC = Opcodes.ACC_STATIC;
29 33
 	private static final int PUBLIC_STATIC = PUBLIC | STATIC;
30 34
 
31
-	private static final JavaClass BOOLEAN = JavaCompileUtils.get(Boolean.class);
32
-	private static final JavaMethodInfo BOOLEAN_PARSE = new JavaMethodInfo(BOOLEAN, "parseBoolean", "(Ljava/lang/String;)Z", PUBLIC_STATIC);
33
-	private static final JavaMethodInfo BOOLEAN_TO_STRING = new JavaMethodInfo(BOOLEAN, "toString", "(Z)Ljava/lang/String;", PUBLIC_STATIC);
34
-	private static final JavaClass BYTE = JavaCompileUtils.get(Byte.class);
35
-	private static final JavaMethodInfo BYTE_PARSE = new JavaMethodInfo(BYTE, "parseByte", "(Ljava/lang/String;)B", PUBLIC_STATIC);
36
-	private static final JavaMethodInfo BYTE_PARSE_WITH_BASE = new JavaMethodInfo(BYTE, "parseByte", "(Ljava/lang/String;I)B", PUBLIC_STATIC);
37
-	private static final JavaFieldInfo BYTE_MIN_VALUE = new JavaFieldInfo(BYTE, "MIN_VALUE", "B");
38
-	private static final JavaFieldInfo BYTE_MAX_VALUE = new JavaFieldInfo(BYTE, "MAX_VALUE", "B");
39
-	private static final JavaMethodInfo BYTE_TO_STRING = new JavaMethodInfo(BYTE, "toString", "(B)Ljava/lang/String;", PUBLIC_STATIC);
40
-	private static final JavaClass SHORT = JavaCompileUtils.get(Short.class);
41
-	private static final JavaMethodInfo SHORT_PARSE = new JavaMethodInfo(SHORT, "parseShort", "(Ljava/lang/String;)S", PUBLIC_STATIC);
42
-	private static final JavaMethodInfo SHORT_PARSE_WITH_BASE = new JavaMethodInfo(SHORT, "parseShort", "(Ljava/lang/String;I)S", PUBLIC_STATIC);
43
-	private static final JavaFieldInfo SHORT_MIN_VALUE = new JavaFieldInfo(SHORT, "MIN_VALUE", "S");
44
-	private static final JavaFieldInfo SHORT_MAX_VALUE = new JavaFieldInfo(SHORT, "MAX_VALUE", "S");
45
-	private static final JavaMethodInfo SHORT_TO_STRING = new JavaMethodInfo(SHORT, "toString", "(S)Ljava/lang/String;", PUBLIC_STATIC);
46
-	private static final JavaClass INTEGER = JavaCompileUtils.get(Integer.class);
47
-	private static final JavaMethodInfo INTEGER_COMPARE_UNSIGNED = new JavaMethodInfo(INTEGER, "compareUnsigned", "(II)I", PUBLIC_STATIC);
48
-	private static final JavaMethodInfo INTEGER_DIVIDE_UNSIGNED = new JavaMethodInfo(INTEGER, "divideUnsigned", "(II)I", PUBLIC_STATIC);
49
-	private static final JavaMethodInfo INTEGER_REMAINDER_UNSIGNED = new JavaMethodInfo(INTEGER, "remainderUnsigned", "(II)I", PUBLIC_STATIC);
50
-	private static final JavaMethodInfo INTEGER_NUMBER_OF_TRAILING_ZEROS = new JavaMethodInfo(INTEGER, "numberOfTrailingZeros", "(I)I", PUBLIC_STATIC);
51
-	private static final JavaMethodInfo INTEGER_NUMBER_OF_LEADING_ZEROS = new JavaMethodInfo(INTEGER, "numberOfLeadingZeros", "(I)I", PUBLIC_STATIC);
52
-	private static final JavaMethodInfo INTEGER_PARSE = new JavaMethodInfo(INTEGER, "parseInt", "(Ljava/lang/String;)I", PUBLIC_STATIC);
53
-	private static final JavaMethodInfo INTEGER_PARSE_WITH_BASE = new JavaMethodInfo(INTEGER, "parseInt", "(Ljava/lang/String;I)I", PUBLIC_STATIC);
54
-	private static final JavaMethodInfo INTEGER_PARSE_UNSIGNED = new JavaMethodInfo(INTEGER, "parseUnsignedInt", "(Ljava/lang/String;)I", PUBLIC_STATIC);
55
-	private static final JavaMethodInfo INTEGER_PARSE_UNSIGNED_WITH_BASE = new JavaMethodInfo(INTEGER, "parseUnsignedInt", "(Ljava/lang/String;I)I", PUBLIC_STATIC);
56
-	private static final JavaMethodInfo INTEGER_HIGHEST_ONE_BIT = new JavaMethodInfo(INTEGER, "highestOneBit", "(I)I", PUBLIC_STATIC);
57
-	private static final JavaMethodInfo INTEGER_LOWEST_ONE_BIT = new JavaMethodInfo(INTEGER, "lowestOneBit", "(I)I", PUBLIC_STATIC);
58
-	private static final JavaMethodInfo INTEGER_BIT_COUNT = new JavaMethodInfo(INTEGER, "bitCount", "(I)I", PUBLIC_STATIC);
59
-	private static final JavaFieldInfo INTEGER_MIN_VALUE = new JavaFieldInfo(INTEGER, "MIN_VALUE", "I");
60
-	private static final JavaFieldInfo INTEGER_MAX_VALUE = new JavaFieldInfo(INTEGER, "MAX_VALUE", "I");
61
-	private static final JavaMethodInfo INTEGER_TO_STRING = new JavaMethodInfo(INTEGER, "toString", "(I)Ljava/lang/String;", PUBLIC_STATIC);
62
-	private static final JavaMethodInfo INTEGER_TO_UNSIGNED_STRING = new JavaMethodInfo(INTEGER, "toUnsignedString", "(I)Ljava/lang/String;", PUBLIC_STATIC);
63
-	private static final JavaClass LONG = JavaCompileUtils.get(Long.class);
64
-	private static final JavaMethodInfo LONG_COMPARE = new JavaMethodInfo(LONG, "compare", "(JJ)I", PUBLIC_STATIC);
65
-	private static final JavaMethodInfo LONG_COMPARE_UNSIGNED = new JavaMethodInfo(LONG, "compareUnsigned", "(JJ)I", PUBLIC_STATIC);
66
-	private static final JavaMethodInfo LONG_DIVIDE_UNSIGNED = new JavaMethodInfo(LONG, "divideUnsigned", "(JJ)J", PUBLIC_STATIC);
67
-	private static final JavaMethodInfo LONG_REMAINDER_UNSIGNED = new JavaMethodInfo(LONG, "remainderUnsigned", "(JJ)J", PUBLIC_STATIC);
68
-	private static final JavaMethodInfo LONG_NUMBER_OF_TRAILING_ZEROS = new JavaMethodInfo(LONG, "numberOfTrailingZeros", "(J)I", PUBLIC_STATIC);
69
-	private static final JavaMethodInfo LONG_NUMBER_OF_LEADING_ZEROS = new JavaMethodInfo(LONG, "numberOfLeadingZeros", "(J)I", PUBLIC_STATIC);
70
-	private static final JavaMethodInfo LONG_PARSE = new JavaMethodInfo(LONG, "parseLong", "(Ljava/lang/String;)J", PUBLIC_STATIC);
71
-	private static final JavaMethodInfo LONG_PARSE_WITH_BASE = new JavaMethodInfo(LONG, "parseLong", "(Ljava/lang/String;I)J", PUBLIC_STATIC);
72
-	private static final JavaMethodInfo LONG_PARSE_UNSIGNED = new JavaMethodInfo(LONG, "parseUnsignedLong", "(Ljava/lang/String;)J", PUBLIC_STATIC);
73
-	private static final JavaMethodInfo LONG_PARSE_UNSIGNED_WITH_BASE = new JavaMethodInfo(LONG, "parseUnsignedLong", "(Ljava/lang/String;I)J", PUBLIC_STATIC);
74
-	private static final JavaMethodInfo LONG_HIGHEST_ONE_BIT = new JavaMethodInfo(LONG, "highestOneBit", "(J)J", PUBLIC_STATIC);
75
-	private static final JavaMethodInfo LONG_LOWEST_ONE_BIT = new JavaMethodInfo(LONG, "lowestOneBit", "(J)J", PUBLIC_STATIC);
76
-	private static final JavaMethodInfo LONG_BIT_COUNT = new JavaMethodInfo(LONG, "bitCount", "(J)I", PUBLIC_STATIC);
77
-	private static final JavaFieldInfo LONG_MIN_VALUE = new JavaFieldInfo(LONG, "MIN_VALUE", "J");
78
-	private static final JavaFieldInfo LONG_MAX_VALUE = new JavaFieldInfo(LONG, "MAX_VALUE", "J");
79
-	private static final JavaMethodInfo LONG_TO_STRING = new JavaMethodInfo(LONG, "toString", "(J)Ljava/lang/String;", PUBLIC_STATIC);
80
-	private static final JavaMethodInfo LONG_TO_UNSIGNED_STRING = new JavaMethodInfo(LONG, "toUnsignedString", "(J)Ljava/lang/String;", PUBLIC_STATIC);
81
-	private static final JavaClass FLOAT = JavaCompileUtils.get(Float.class);
82
-	private static final JavaMethodInfo FLOAT_COMPARE = new JavaMethodInfo(FLOAT, "compare", "(FF)I", PUBLIC_STATIC);
83
-	private static final JavaMethodInfo FLOAT_PARSE = new JavaMethodInfo(FLOAT, "parseFloat", "(Ljava/lang/String;)F", PUBLIC_STATIC);
84
-	private static final JavaMethodInfo FLOAT_FROM_BITS = new JavaMethodInfo(FLOAT, "intBitsToFloat", "(I)F", PUBLIC_STATIC);
85
-	private static final JavaMethodInfo FLOAT_BITS = new JavaMethodInfo(FLOAT, "floatToRawIntBits", "(F)I", PUBLIC_STATIC);
86
-	private static final JavaFieldInfo FLOAT_MIN_VALUE = new JavaFieldInfo(FLOAT, "MIN_VALUE", "F");
87
-	private static final JavaFieldInfo FLOAT_MAX_VALUE = new JavaFieldInfo(FLOAT, "MAX_VALUE", "F");
88
-	private static final JavaMethodInfo FLOAT_TO_STRING = new JavaMethodInfo(FLOAT, "toString", "(F)Ljava/lang/String;", PUBLIC_STATIC);
89
-	private static final JavaClass DOUBLE = JavaCompileUtils.get(Double.class);
90
-	private static final JavaMethodInfo DOUBLE_COMPARE = new JavaMethodInfo(DOUBLE, "compare", "(DD)I", PUBLIC_STATIC);
91
-	private static final JavaMethodInfo DOUBLE_PARSE = new JavaMethodInfo(DOUBLE, "parseDouble", "(Ljava/lang/String;)D", PUBLIC_STATIC);
92
-	private static final JavaMethodInfo DOUBLE_FROM_BITS = new JavaMethodInfo(DOUBLE, "longBitsToDouble", "(J)D", PUBLIC_STATIC);
93
-	private static final JavaMethodInfo DOUBLE_BITS = new JavaMethodInfo(DOUBLE, "doubleToRawLongBits", "(D)J", PUBLIC_STATIC);
94
-	private static final JavaFieldInfo DOUBLE_MIN_VALUE = new JavaFieldInfo(DOUBLE, "MIN_VALUE", "D");
95
-	private static final JavaFieldInfo DOUBLE_MAX_VALUE = new JavaFieldInfo(DOUBLE, "MAX_VALUE", "D");
96
-	private static final JavaMethodInfo DOUBLE_TO_STRING = new JavaMethodInfo(DOUBLE, "toString", "(D)Ljava/lang/String;", PUBLIC_STATIC);
97
-	private static final JavaClass CHARACTER = JavaCompileUtils.get(Character.class);
98
-	private static final JavaMethodInfo CHARACTER_TO_LOWER_CASE = new JavaMethodInfo(CHARACTER, "toLowerCase", "()C", PUBLIC);
99
-	private static final JavaMethodInfo CHARACTER_TO_UPPER_CASE = new JavaMethodInfo(CHARACTER, "toUpperCase", "()C", PUBLIC);
100
-	private static final JavaFieldInfo CHARACTER_MIN_VALUE = new JavaFieldInfo(CHARACTER, "MIN_VALUE", "C");
101
-	private static final JavaFieldInfo CHARACTER_MAX_VALUE = new JavaFieldInfo(CHARACTER, "MAX_VALUE", "C");
102
-	private static final JavaMethodInfo CHARACTER_TO_STRING = new JavaMethodInfo(CHARACTER, "toString", "(C)Ljava/lang/String;", PUBLIC_STATIC);
103
-	private static final JavaClass STRING = JavaCompileUtils.get(String.class);
104
-	private static final JavaMethodInfo STRING_COMPARETO = new JavaMethodInfo(STRING, "compareTo", "(Ljava/lang/String;)I", PUBLIC);
105
-	private static final JavaMethodInfo STRING_CONCAT = new JavaMethodInfo(STRING, "concat", "(Ljava/lang/String;)Ljava/lang/String;", PUBLIC);
106
-	private static final JavaMethodInfo STRING_CHAR_AT = new JavaMethodInfo(STRING, "charAt", "(I)C", PUBLIC);
107
-	private static final JavaMethodInfo STRING_SUBSTRING = new JavaMethodInfo(STRING, "substring", "(II)Ljava/lang/String;", PUBLIC);
108
-	private static final JavaMethodInfo STRING_TRIM = new JavaMethodInfo(STRING, "trim", "()Ljava/lang/String;", PUBLIC);
109
-	private static final JavaMethodInfo STRING_TO_LOWER_CASE = new JavaMethodInfo(STRING, "toLowerCase", "()Ljava/lang/String;", PUBLIC);
110
-	private static final JavaMethodInfo STRING_TO_UPPER_CASE = new JavaMethodInfo(STRING, "toUpperCase", "()Ljava/lang/String;", PUBLIC);
111
-	private static final JavaMethodInfo STRING_LENGTH = new JavaMethodInfo(STRING, "length", "()I", PUBLIC);
112
-	private static final JavaMethodInfo STRING_CHARACTERS = new JavaMethodInfo(STRING, "toCharArray", "()[C", PUBLIC);
113
-	private static final JavaMethodInfo STRING_ISEMPTY = new JavaMethodInfo(STRING, "isEmpty", "()Z", PUBLIC);
114
-	private static final JavaClass ENUM = JavaCompileUtils.get(Enum.class);
115
-	private static final JavaMethodInfo ENUM_COMPARETO = new JavaMethodInfo(STRING, "compareTo", "(Ljava/lang/Enum;)I", PUBLIC);
116
-	private static final JavaMethodInfo ENUM_NAME = new JavaMethodInfo(STRING, "name", "()Ljava/lang/String;", PUBLIC);
117
-	private static final JavaMethodInfo ENUM_ORDINAL = new JavaMethodInfo(STRING, "ordinal", "()I", PUBLIC);
118
-	private static final JavaClass MAP = JavaCompileUtils.get(Map.class);
119
-	private static final JavaMethodInfo MAP_GET = new JavaMethodInfo(MAP, "get", "(Ljava/lang/Object;)Ljava/lang/Object;", PUBLIC);
120
-	private static final JavaMethodInfo MAP_PUT = new JavaMethodInfo(MAP, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;", PUBLIC);
121
-	private static final JavaMethodInfo MAP_CONTAINS_KEY = new JavaMethodInfo(MAP, "containsKey", "(Ljava/lang/Object;)Z", PUBLIC);
122
-	private static final JavaMethodInfo MAP_SIZE = new JavaMethodInfo(MAP, "size", "()I", PUBLIC);
123
-	private static final JavaMethodInfo MAP_ISEMPTY = new JavaMethodInfo(MAP, "isEmpty", "()Z", PUBLIC);
124
-	private static final JavaMethodInfo MAP_KEYS = new JavaMethodInfo(MAP, "keys", "()Ljava/lang/Object;", PUBLIC);
125
-	private static final JavaMethodInfo MAP_VALUES = new JavaMethodInfo(MAP, "values", "()Ljava/lang/Object;", PUBLIC);
126
-	private static final JavaClass ARRAYS = JavaCompileUtils.get(Arrays.class);
127
-	private static final JavaMethodInfo ARRAYS_COPY_OF_RANGE_OBJECTS = new JavaMethodInfo(ARRAYS, "copyOfRange", "([Ljava/lang/Object;II)[Ljava/lang/Object;", PUBLIC_STATIC);
128
-	private static final JavaMethodInfo ARRAYS_COPY_OF_RANGE_BOOLS = new JavaMethodInfo(ARRAYS, "copyOfRange", "([ZII)[Z", PUBLIC_STATIC);
129
-	private static final JavaMethodInfo ARRAYS_COPY_OF_RANGE_BYTES = new JavaMethodInfo(ARRAYS, "copyOfRange", "([BII)[B", PUBLIC_STATIC);
130
-	private static final JavaMethodInfo ARRAYS_COPY_OF_RANGE_SHORTS = new JavaMethodInfo(ARRAYS, "copyOfRange", "([SII)[S", PUBLIC_STATIC);
131
-	private static final JavaMethodInfo ARRAYS_COPY_OF_RANGE_INTS = new JavaMethodInfo(ARRAYS, "copyOfRange", "([III)[I", PUBLIC_STATIC);
132
-	private static final JavaMethodInfo ARRAYS_COPY_OF_RANGE_LONGS = new JavaMethodInfo(ARRAYS, "copyOfRange", "([JII)[J", PUBLIC_STATIC);
133
-	private static final JavaMethodInfo ARRAYS_COPY_OF_RANGE_FLOATS = new JavaMethodInfo(ARRAYS, "copyOfRange", "([FII)[F", PUBLIC_STATIC);
134
-	private static final JavaMethodInfo ARRAYS_COPY_OF_RANGE_DOUBLES = new JavaMethodInfo(ARRAYS, "copyOfRange", "([DII)[D", PUBLIC_STATIC);
135
-	private static final JavaMethodInfo ARRAYS_COPY_OF_RANGE_CHARS = new JavaMethodInfo(ARRAYS, "copyOfRange", "([CII)[C", PUBLIC_STATIC);
136
-	private static final JavaMethodInfo ARRAYS_EQUALS_OBJECTS = new JavaMethodInfo(ARRAYS, "equals", "([Ljava/lang/Object[Ljava/lang/Object)Z", PUBLIC_STATIC);
137
-	private static final JavaMethodInfo ARRAYS_EQUALS_BOOLS = new JavaMethodInfo(ARRAYS, "equals", "([Z[Z)Z", PUBLIC_STATIC);
138
-	private static final JavaMethodInfo ARRAYS_EQUALS_BYTES = new JavaMethodInfo(ARRAYS, "equals", "([B[B)Z", PUBLIC_STATIC);
139
-	private static final JavaMethodInfo ARRAYS_EQUALS_SHORTS = new JavaMethodInfo(ARRAYS, "equals", "([S[S)Z", PUBLIC_STATIC);
140
-	private static final JavaMethodInfo ARRAYS_EQUALS_INTS = new JavaMethodInfo(ARRAYS, "equals", "([I[I)Z", PUBLIC_STATIC);
141
-	private static final JavaMethodInfo ARRAYS_EQUALS_LONGS = new JavaMethodInfo(ARRAYS, "equals", "([L[L)Z", PUBLIC_STATIC);
142
-	private static final JavaMethodInfo ARRAYS_EQUALS_FLOATS = new JavaMethodInfo(ARRAYS, "equals", "([F[F)Z", PUBLIC_STATIC);
143
-	private static final JavaMethodInfo ARRAYS_EQUALS_DOUBLES = new JavaMethodInfo(ARRAYS, "equals", "([D[D)Z", PUBLIC_STATIC);
144
-	private static final JavaMethodInfo ARRAYS_EQUALS_CHARS = new JavaMethodInfo(ARRAYS, "equals", "([C[C)Z", PUBLIC_STATIC);
145
-	private static final JavaMethodInfo ARRAYS_DEEPHASHCODE = new JavaMethodInfo(ARRAYS, "deepHashCode", "([Ljava/lang/Object;)", PUBLIC_STATIC);
146
-	private static final JavaMethodInfo ARRAYS_HASHCODE_BOOLS = new JavaMethodInfo(ARRAYS, "hashCode", "([Z)I", PUBLIC_STATIC);
147
-	private static final JavaMethodInfo ARRAYS_HASHCODE_BYTES = new JavaMethodInfo(ARRAYS, "hashCode", "([B)I", PUBLIC_STATIC);
148
-	private static final JavaMethodInfo ARRAYS_HASHCODE_SHORTS = new JavaMethodInfo(ARRAYS, "hashCode", "([S)I", PUBLIC_STATIC);
149
-	private static final JavaMethodInfo ARRAYS_HASHCODE_INTS = new JavaMethodInfo(ARRAYS, "hashCode", "([I)I", PUBLIC_STATIC);
150
-	private static final JavaMethodInfo ARRAYS_HASHCODE_LONGS = new JavaMethodInfo(ARRAYS, "hashCode", "([L)I", PUBLIC_STATIC);
151
-	private static final JavaMethodInfo ARRAYS_HASHCODE_FLOATS = new JavaMethodInfo(ARRAYS, "hashCode", "([F)I", PUBLIC_STATIC);
152
-	private static final JavaMethodInfo ARRAYS_HASHCODE_DOUBLES = new JavaMethodInfo(ARRAYS, "hashCode", "([D)I", PUBLIC_STATIC);
153
-	private static final JavaMethodInfo ARRAYS_HASHCODE_CHARS = new JavaMethodInfo(ARRAYS, "hashCode", "([C)I", PUBLIC_STATIC);
154
-	private static final JavaClass OBJECT = JavaCompileUtils.get(Object.class);
155
-	private static final JavaMethodInfo OBJECT_HASHCODE = new JavaMethodInfo(OBJECT, "hashCode", "()I", PUBLIC);
156
-	private static final JavaClass COLLECTION = JavaCompileUtils.get(Collection.class);
157
-	private static final JavaMethodInfo COLLECTION_SIZE = new JavaMethodInfo(COLLECTION, "size", "()I", PUBLIC);
158
-	private static final JavaMethodInfo COLLECTION_TOARRAY = new JavaMethodInfo(COLLECTION, "toArray", "([Ljava/lang/Object;)[Ljava/lang/Object;", PUBLIC);
35
+	private static final JavaMethodInfo BOOLEAN_PARSE = new JavaMethodInfo(JavaClass.BOOLEAN, "parseBoolean", "(Ljava/lang/String;)Z", PUBLIC_STATIC);
36
+	private static final JavaMethodInfo BOOLEAN_TO_STRING = new JavaMethodInfo(JavaClass.BOOLEAN, "toString", "(Z)Ljava/lang/String;", PUBLIC_STATIC);
37
+	private static final JavaMethodInfo BYTE_PARSE = new JavaMethodInfo(JavaClass.BYTE, "parseByte", "(Ljava/lang/String;)B", PUBLIC_STATIC);
38
+	private static final JavaMethodInfo BYTE_PARSE_WITH_BASE = new JavaMethodInfo(JavaClass.BYTE, "parseByte", "(Ljava/lang/String;I)B", PUBLIC_STATIC);
39
+	private static final JavaField BYTE_MIN_VALUE = new JavaField(JavaClass.BYTE, "MIN_VALUE", "B");
40
+	private static final JavaField BYTE_MAX_VALUE = new JavaField(JavaClass.BYTE, "MAX_VALUE", "B");
41
+	private static final JavaMethodInfo BYTE_TO_STRING = new JavaMethodInfo(JavaClass.BYTE, "toString", "(B)Ljava/lang/String;", PUBLIC_STATIC);
42
+	private static final JavaMethodInfo SHORT_PARSE = new JavaMethodInfo(JavaClass.SHORT, "parseShort", "(Ljava/lang/String;)S", PUBLIC_STATIC);
43
+	private static final JavaMethodInfo SHORT_PARSE_WITH_BASE = new JavaMethodInfo(JavaClass.SHORT, "parseShort", "(Ljava/lang/String;I)S", PUBLIC_STATIC);
44
+	private static final JavaField SHORT_MIN_VALUE = new JavaField(JavaClass.SHORT, "MIN_VALUE", "S");
45
+	private static final JavaField SHORT_MAX_VALUE = new JavaField(JavaClass.SHORT, "MAX_VALUE", "S");
46
+	private static final JavaMethodInfo SHORT_TO_STRING = new JavaMethodInfo(JavaClass.SHORT, "toString", "(S)Ljava/lang/String;", PUBLIC_STATIC);
47
+	private static final JavaMethodInfo INTEGER_COMPARE_UNSIGNED = new JavaMethodInfo(JavaClass.INTEGER, "compareUnsigned", "(II)I", PUBLIC_STATIC);
48
+	private static final JavaMethodInfo INTEGER_DIVIDE_UNSIGNED = new JavaMethodInfo(JavaClass.INTEGER, "divideUnsigned", "(II)I", PUBLIC_STATIC);
49
+	private static final JavaMethodInfo INTEGER_REMAINDER_UNSIGNED = new JavaMethodInfo(JavaClass.INTEGER, "remainderUnsigned", "(II)I", PUBLIC_STATIC);
50
+	private static final JavaMethodInfo INTEGER_NUMBER_OF_TRAILING_ZEROS = new JavaMethodInfo(JavaClass.INTEGER, "numberOfTrailingZeros", "(I)I", PUBLIC_STATIC);
51
+	private static final JavaMethodInfo INTEGER_NUMBER_OF_LEADING_ZEROS = new JavaMethodInfo(JavaClass.INTEGER, "numberOfLeadingZeros", "(I)I", PUBLIC_STATIC);
52
+	private static final JavaMethodInfo INTEGER_PARSE = new JavaMethodInfo(JavaClass.INTEGER, "parseInt", "(Ljava/lang/String;)I", PUBLIC_STATIC);
53
+	private static final JavaMethodInfo INTEGER_PARSE_WITH_BASE = new JavaMethodInfo(JavaClass.INTEGER, "parseInt", "(Ljava/lang/String;I)I", PUBLIC_STATIC);
54
+	private static final JavaMethodInfo INTEGER_PARSE_UNSIGNED = new JavaMethodInfo(JavaClass.INTEGER, "parseUnsignedInt", "(Ljava/lang/String;)I", PUBLIC_STATIC);
55
+	private static final JavaMethodInfo INTEGER_PARSE_UNSIGNED_WITH_BASE = new JavaMethodInfo(JavaClass.INTEGER, "parseUnsignedInt", "(Ljava/lang/String;I)I", PUBLIC_STATIC);
56
+	private static final JavaMethodInfo INTEGER_HIGHEST_ONE_BIT = new JavaMethodInfo(JavaClass.INTEGER, "highestOneBit", "(I)I", PUBLIC_STATIC);
57
+	private static final JavaMethodInfo INTEGER_LOWEST_ONE_BIT = new JavaMethodInfo(JavaClass.INTEGER, "lowestOneBit", "(I)I", PUBLIC_STATIC);
58
+	private static final JavaMethodInfo INTEGER_BIT_COUNT = new JavaMethodInfo(JavaClass.INTEGER, "bitCount", "(I)I", PUBLIC_STATIC);
59
+	private static final JavaField INTEGER_MIN_VALUE = new JavaField(JavaClass.INTEGER, "MIN_VALUE", "I");
60
+	private static final JavaField INTEGER_MAX_VALUE = new JavaField(JavaClass.INTEGER, "MAX_VALUE", "I");
61
+	private static final JavaMethodInfo INTEGER_TO_STRING = new JavaMethodInfo(JavaClass.INTEGER, "toString", "(I)Ljava/lang/String;", PUBLIC_STATIC);
62
+	private static final JavaMethodInfo INTEGER_TO_UNSIGNED_STRING = new JavaMethodInfo(JavaClass.INTEGER, "toUnsignedString", "(I)Ljava/lang/String;", PUBLIC_STATIC);
63
+	private static final JavaMethodInfo LONG_COMPARE = new JavaMethodInfo(JavaClass.LONG, "compare", "(JJ)I", PUBLIC_STATIC);
64
+	private static final JavaMethodInfo LONG_COMPARE_UNSIGNED = new JavaMethodInfo(JavaClass.LONG, "compareUnsigned", "(JJ)I", PUBLIC_STATIC);
65
+	private static final JavaMethodInfo LONG_DIVIDE_UNSIGNED = new JavaMethodInfo(JavaClass.LONG, "divideUnsigned", "(JJ)J", PUBLIC_STATIC);
66
+	private static final JavaMethodInfo LONG_REMAINDER_UNSIGNED = new JavaMethodInfo(JavaClass.LONG, "remainderUnsigned", "(JJ)J", PUBLIC_STATIC);
67
+	private static final JavaMethodInfo LONG_NUMBER_OF_TRAILING_ZEROS = new JavaMethodInfo(JavaClass.LONG, "numberOfTrailingZeros", "(J)I", PUBLIC_STATIC);
68
+	private static final JavaMethodInfo LONG_NUMBER_OF_LEADING_ZEROS = new JavaMethodInfo(JavaClass.LONG, "numberOfLeadingZeros", "(J)I", PUBLIC_STATIC);
69
+	private static final JavaMethodInfo LONG_PARSE = new JavaMethodInfo(JavaClass.LONG, "parseLong", "(Ljava/lang/String;)J", PUBLIC_STATIC);
70
+	private static final JavaMethodInfo LONG_PARSE_WITH_BASE = new JavaMethodInfo(JavaClass.LONG, "parseLong", "(Ljava/lang/String;I)J", PUBLIC_STATIC);
71
+	private static final JavaMethodInfo LONG_PARSE_UNSIGNED = new JavaMethodInfo(JavaClass.LONG, "parseUnsignedLong", "(Ljava/lang/String;)J", PUBLIC_STATIC);
72
+	private static final JavaMethodInfo LONG_PARSE_UNSIGNED_WITH_BASE = new JavaMethodInfo(JavaClass.LONG, "parseUnsignedLong", "(Ljava/lang/String;I)J", PUBLIC_STATIC);
73
+	private static final JavaMethodInfo LONG_HIGHEST_ONE_BIT = new JavaMethodInfo(JavaClass.LONG, "highestOneBit", "(J)J", PUBLIC_STATIC);
74
+	private static final JavaMethodInfo LONG_LOWEST_ONE_BIT = new JavaMethodInfo(JavaClass.LONG, "lowestOneBit", "(J)J", PUBLIC_STATIC);
75
+	private static final JavaMethodInfo LONG_BIT_COUNT = new JavaMethodInfo(JavaClass.LONG, "bitCount", "(J)I", PUBLIC_STATIC);
76
+	private static final JavaField LONG_MIN_VALUE = new JavaField(JavaClass.LONG, "MIN_VALUE", "J");
77
+	private static final JavaField LONG_MAX_VALUE = new JavaField(JavaClass.LONG, "MAX_VALUE", "J");
78
+	private static final JavaMethodInfo LONG_TO_STRING = new JavaMethodInfo(JavaClass.LONG, "toString", "(J)Ljava/lang/String;", PUBLIC_STATIC);
79
+	private static final JavaMethodInfo LONG_TO_UNSIGNED_STRING = new JavaMethodInfo(JavaClass.LONG, "toUnsignedString", "(J)Ljava/lang/String;", PUBLIC_STATIC);
80
+	private static final JavaMethodInfo FLOAT_COMPARE = new JavaMethodInfo(JavaClass.FLOAT, "compare", "(FF)I", PUBLIC_STATIC);
81
+	private static final JavaMethodInfo FLOAT_PARSE = new JavaMethodInfo(JavaClass.FLOAT, "parseFloat", "(Ljava/lang/String;)F", PUBLIC_STATIC);
82
+	private static final JavaMethodInfo FLOAT_FROM_BITS = new JavaMethodInfo(JavaClass.FLOAT, "intBitsToFloat", "(I)F", PUBLIC_STATIC);
83
+	private static final JavaMethodInfo FLOAT_BITS = new JavaMethodInfo(JavaClass.FLOAT, "floatToRawIntBits", "(F)I", PUBLIC_STATIC);
84
+	private static final JavaField FLOAT_MIN_VALUE = new JavaField(JavaClass.FLOAT, "MIN_VALUE", "F");
85
+	private static final JavaField FLOAT_MAX_VALUE = new JavaField(JavaClass.FLOAT, "MAX_VALUE", "F");
86
+	private static final JavaMethodInfo FLOAT_TO_STRING = new JavaMethodInfo(JavaClass.FLOAT, "toString", "(F)Ljava/lang/String;", PUBLIC_STATIC);
87
+	private static final JavaMethodInfo DOUBLE_COMPARE = new JavaMethodInfo(JavaClass.DOUBLE, "compare", "(DD)I", PUBLIC_STATIC);
88
+	private static final JavaMethodInfo DOUBLE_PARSE = new JavaMethodInfo(JavaClass.DOUBLE, "parseDouble", "(Ljava/lang/String;)D", PUBLIC_STATIC);
89
+	private static final JavaMethodInfo DOUBLE_FROM_BITS = new JavaMethodInfo(JavaClass.DOUBLE, "longBitsToDouble", "(J)D", PUBLIC_STATIC);
90
+	private static final JavaMethodInfo DOUBLE_BITS = new JavaMethodInfo(JavaClass.DOUBLE, "doubleToRawLongBits", "(D)J", PUBLIC_STATIC);
91
+	private static final JavaField DOUBLE_MIN_VALUE = new JavaField(JavaClass.DOUBLE, "MIN_VALUE", "D");
92
+	private static final JavaField DOUBLE_MAX_VALUE = new JavaField(JavaClass.DOUBLE, "MAX_VALUE", "D");
93
+	private static final JavaMethodInfo DOUBLE_TO_STRING = new JavaMethodInfo(JavaClass.DOUBLE, "toString", "(D)Ljava/lang/String;", PUBLIC_STATIC);
94
+	private static final JavaMethodInfo CHARACTER_TO_LOWER_CASE = new JavaMethodInfo(JavaClass.CHARACTER, "toLowerCase", "()C", PUBLIC);
95
+	private static final JavaMethodInfo CHARACTER_TO_UPPER_CASE = new JavaMethodInfo(JavaClass.CHARACTER, "toUpperCase", "()C", PUBLIC);
96
+	private static final JavaField CHARACTER_MIN_VALUE = new JavaField(JavaClass.CHARACTER, "MIN_VALUE", "C");
97
+	private static final JavaField CHARACTER_MAX_VALUE = new JavaField(JavaClass.CHARACTER, "MAX_VALUE", "C");
98
+	private static final JavaMethodInfo CHARACTER_TO_STRING = new JavaMethodInfo(JavaClass.CHARACTER, "toString", "(C)Ljava/lang/String;", PUBLIC_STATIC);
99
+	private static final JavaMethodInfo STRING_COMPARETO = new JavaMethodInfo(JavaClass.STRING, "compareTo", "(Ljava/lang/String;)I", PUBLIC);
100
+	private static final JavaMethodInfo STRING_CONCAT = new JavaMethodInfo(JavaClass.STRING, "concat", "(Ljava/lang/String;)Ljava/lang/String;", PUBLIC);
101
+	private static final JavaMethodInfo STRING_CHAR_AT = new JavaMethodInfo(JavaClass.STRING, "charAt", "(I)C", PUBLIC);
102
+	private static final JavaMethodInfo STRING_SUBSTRING = new JavaMethodInfo(JavaClass.STRING, "substring", "(II)Ljava/lang/String;", PUBLIC);
103
+	private static final JavaMethodInfo STRING_TRIM = new JavaMethodInfo(JavaClass.STRING, "trim", "()Ljava/lang/String;", PUBLIC);
104
+	private static final JavaMethodInfo STRING_TO_LOWER_CASE = new JavaMethodInfo(JavaClass.STRING, "toLowerCase", "()Ljava/lang/String;", PUBLIC);
105
+	private static final JavaMethodInfo STRING_TO_UPPER_CASE = new JavaMethodInfo(JavaClass.STRING, "toUpperCase", "()Ljava/lang/String;", PUBLIC);
106
+	private static final JavaMethodInfo STRING_LENGTH = new JavaMethodInfo(JavaClass.STRING, "length", "()I", PUBLIC);
107
+	private static final JavaMethodInfo STRING_CHARACTERS = new JavaMethodInfo(JavaClass.STRING, "toCharArray", "()[C", PUBLIC);
108
+	private static final JavaMethodInfo STRING_ISEMPTY = new JavaMethodInfo(JavaClass.STRING, "isEmpty", "()Z", PUBLIC);
109
+	private static final JavaMethodInfo ENUM_COMPARETO = new JavaMethodInfo(JavaClass.ENUM, "compareTo", "(Ljava/lang/Enum;)I", PUBLIC);
110
+	private static final JavaMethodInfo ENUM_NAME = new JavaMethodInfo(JavaClass.ENUM, "name", "()Ljava/lang/String;", PUBLIC);
111
+	private static final JavaMethodInfo ENUM_ORDINAL = new JavaMethodInfo(JavaClass.ENUM, "ordinal", "()I", PUBLIC);
112
+	private static final JavaMethodInfo MAP_GET = new JavaMethodInfo(JavaClass.MAP, "get", "(Ljava/lang/Object;)Ljava/lang/Object;", PUBLIC);
113
+	private static final JavaMethodInfo MAP_PUT = new JavaMethodInfo(JavaClass.MAP, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;", PUBLIC);
114
+	private static final JavaMethodInfo MAP_CONTAINS_KEY = new JavaMethodInfo(JavaClass.MAP, "containsKey", "(Ljava/lang/Object;)Z", PUBLIC);
115
+	private static final JavaMethodInfo MAP_SIZE = new JavaMethodInfo(JavaClass.MAP, "size", "()I", PUBLIC);
116
+	private static final JavaMethodInfo MAP_ISEMPTY = new JavaMethodInfo(JavaClass.MAP, "isEmpty", "()Z", PUBLIC);
117
+	private static final JavaMethodInfo MAP_KEYS = new JavaMethodInfo(JavaClass.MAP, "keys", "()Ljava/lang/Object;", PUBLIC);
118
+	private static final JavaMethodInfo MAP_VALUES = new JavaMethodInfo(JavaClass.MAP, "values", "()Ljava/lang/Object;", PUBLIC);
119
+	private static final JavaMethodInfo ARRAYS_COPY_OF_RANGE_OBJECTS = new JavaMethodInfo(JavaClass.ARRAYS, "copyOfRange", "([Ljava/lang/Object;II)[Ljava/lang/Object;", PUBLIC_STATIC);
120
+	private static final JavaMethodInfo ARRAYS_COPY_OF_RANGE_BOOLS = new JavaMethodInfo(JavaClass.ARRAYS, "copyOfRange", "([ZII)[Z", PUBLIC_STATIC);
121
+	private static final JavaMethodInfo ARRAYS_COPY_OF_RANGE_BYTES = new JavaMethodInfo(JavaClass.ARRAYS, "copyOfRange", "([BII)[B", PUBLIC_STATIC);
122
+	private static final JavaMethodInfo ARRAYS_COPY_OF_RANGE_SHORTS = new JavaMethodInfo(JavaClass.ARRAYS, "copyOfRange", "([SII)[S", PUBLIC_STATIC);
123
+	private static final JavaMethodInfo ARRAYS_COPY_OF_RANGE_INTS = new JavaMethodInfo(JavaClass.ARRAYS, "copyOfRange", "([III)[I", PUBLIC_STATIC);
124
+	private static final JavaMethodInfo ARRAYS_COPY_OF_RANGE_LONGS = new JavaMethodInfo(JavaClass.ARRAYS, "copyOfRange", "([JII)[J", PUBLIC_STATIC);
125
+	private static final JavaMethodInfo ARRAYS_COPY_OF_RANGE_FLOATS = new JavaMethodInfo(JavaClass.ARRAYS, "copyOfRange", "([FII)[F", PUBLIC_STATIC);
126
+	private static final JavaMethodInfo ARRAYS_COPY_OF_RANGE_DOUBLES = new JavaMethodInfo(JavaClass.ARRAYS, "copyOfRange", "([DII)[D", PUBLIC_STATIC);
127
+	private static final JavaMethodInfo ARRAYS_COPY_OF_RANGE_CHARS = new JavaMethodInfo(JavaClass.ARRAYS, "copyOfRange", "([CII)[C", PUBLIC_STATIC);
128
+	private static final JavaMethodInfo ARRAYS_EQUALS_OBJECTS = new JavaMethodInfo(JavaClass.ARRAYS, "equals", "([Ljava/lang/Object[Ljava/lang/Object)Z", PUBLIC_STATIC);
129
+	private static final JavaMethodInfo ARRAYS_EQUALS_BOOLS = new JavaMethodInfo(JavaClass.ARRAYS, "equals", "([Z[Z)Z", PUBLIC_STATIC);
130
+	private static final JavaMethodInfo ARRAYS_EQUALS_BYTES = new JavaMethodInfo(JavaClass.ARRAYS, "equals", "([B[B)Z", PUBLIC_STATIC);
131
+	private static final JavaMethodInfo ARRAYS_EQUALS_SHORTS = new JavaMethodInfo(JavaClass.ARRAYS, "equals", "([S[S)Z", PUBLIC_STATIC);
132
+	private static final JavaMethodInfo ARRAYS_EQUALS_INTS = new JavaMethodInfo(JavaClass.ARRAYS, "equals", "([I[I)Z", PUBLIC_STATIC);
133
+	private static final JavaMethodInfo ARRAYS_EQUALS_LONGS = new JavaMethodInfo(JavaClass.ARRAYS, "equals", "([L[L)Z", PUBLIC_STATIC);
134
+	private static final JavaMethodInfo ARRAYS_EQUALS_FLOATS = new JavaMethodInfo(JavaClass.ARRAYS, "equals", "([F[F)Z", PUBLIC_STATIC);
135
+	private static final JavaMethodInfo ARRAYS_EQUALS_DOUBLES = new JavaMethodInfo(JavaClass.ARRAYS, "equals", "([D[D)Z", PUBLIC_STATIC);
136
+	private static final JavaMethodInfo ARRAYS_EQUALS_CHARS = new JavaMethodInfo(JavaClass.ARRAYS, "equals", "([C[C)Z", PUBLIC_STATIC);
137
+	private static final JavaMethodInfo ARRAYS_DEEPHASHCODE = new JavaMethodInfo(JavaClass.ARRAYS, "deepHashCode", "([Ljava/lang/Object;)", PUBLIC_STATIC);
138
+	private static final JavaMethodInfo ARRAYS_HASHCODE_BOOLS = new JavaMethodInfo(JavaClass.ARRAYS, "hashCode", "([Z)I", PUBLIC_STATIC);
139
+	private static final JavaMethodInfo ARRAYS_HASHCODE_BYTES = new JavaMethodInfo(JavaClass.ARRAYS, "hashCode", "([B)I", PUBLIC_STATIC);
140
+	private static final JavaMethodInfo ARRAYS_HASHCODE_SHORTS = new JavaMethodInfo(JavaClass.ARRAYS, "hashCode", "([S)I", PUBLIC_STATIC);
141
+	private static final JavaMethodInfo ARRAYS_HASHCODE_INTS = new JavaMethodInfo(JavaClass.ARRAYS, "hashCode", "([I)I", PUBLIC_STATIC);
142
+	private static final JavaMethodInfo ARRAYS_HASHCODE_LONGS = new JavaMethodInfo(JavaClass.ARRAYS, "hashCode", "([L)I", PUBLIC_STATIC);
143
+	private static final JavaMethodInfo ARRAYS_HASHCODE_FLOATS = new JavaMethodInfo(JavaClass.ARRAYS, "hashCode", "([F)I", PUBLIC_STATIC);
144
+	private static final JavaMethodInfo ARRAYS_HASHCODE_DOUBLES = new JavaMethodInfo(JavaClass.ARRAYS, "hashCode", "([D)I", PUBLIC_STATIC);
145
+	private static final JavaMethodInfo ARRAYS_HASHCODE_CHARS = new JavaMethodInfo(JavaClass.ARRAYS, "hashCode", "([C)I", PUBLIC_STATIC);
146
+	private static final JavaMethodInfo OBJECT_HASHCODE = new JavaMethodInfo(JavaClass.OBJECT, "hashCode", "()I", PUBLIC);
147
+	private static final JavaMethodInfo COLLECTION_SIZE = new JavaMethodInfo(JavaClass.COLLECTION, "size", "()I", PUBLIC);
148
+	private static final JavaMethodInfo COLLECTION_TOARRAY = new JavaMethodInfo(JavaClass.COLLECTION, "toArray", "([Ljava/lang/Object;)[Ljava/lang/Object;", PUBLIC);
159 149
 
160 150
 	protected final JavaWriter javaWriter;
161 151
 	private final JavaCapturedExpressionVisitor capturedExpressionVisitor = new JavaCapturedExpressionVisitor(this);
152
+	private final JavaBytecodeContext context;
162 153
 
163
-	public JavaExpressionVisitor(JavaWriter javaWriter) {
164
-		this.javaWriter = javaWriter;
165
-	}
154
+    public JavaExpressionVisitor(JavaBytecodeContext context, JavaWriter javaWriter) {
155
+        this.javaWriter = javaWriter;
156
+		this.context = context;
157
+    }
166 158
 
167
-	@Override
168
-	public Void visitAndAnd(AndAndExpression expression) {
169
-		Label end = new Label();
170
-		Label onFalse = new Label();
159
+    @Override
160
+    public Void visitAndAnd(AndAndExpression expression) {
161
+        Label end = new Label();
162
+        Label onFalse = new Label();
171 163
 
172
-		expression.left.accept(this);
164
+        expression.left.accept(this);
173 165
 
174
-		javaWriter.ifEQ(onFalse);
175
-		expression.right.accept(this);
166
+        javaWriter.ifEQ(onFalse);
167
+        expression.right.accept(this);
176 168
 
177
-		// //these two calls are redundant but make decompiled code look better. Keep?
178
-		// javaWriter.ifEQ(onFalse);
179
-		// javaWriter.iConst1();
169
+        // //these two calls are redundant but make decompiled code look better. Keep?
170
+        // javaWriter.ifEQ(onFalse);
171
+        // javaWriter.iConst1();
180 172
 
181
-		javaWriter.goTo(end);
173
+        javaWriter.goTo(end);
182 174
 
183
-		javaWriter.label(onFalse);
184
-		javaWriter.iConst0();
175
+        javaWriter.label(onFalse);
176
+        javaWriter.iConst0();
185 177
 
186 178
 
187
-		javaWriter.label(end);
179
+        javaWriter.label(end);
188 180
 
189
-		return null;
190
-	}
181
+        return null;
182
+    }
191 183
 
192
-	@Override
193
-	public Void visitArray(ArrayExpression expression) {
194
-		javaWriter.constant(expression.expressions.length);
195
-		Type type = Type.getType(expression.type.accept(JavaTypeClassVisitor.INSTANCE).getComponentType());
196
-		javaWriter.newArray(type);
197
-		for (int i = 0; i < expression.expressions.length; i++) {
198
-			javaWriter.dup();
199
-			javaWriter.constant(i);
200
-			expression.expressions[i].accept(this);
201
-			javaWriter.arrayStore(type);
202
-		}
203
-		return null;
204
-	}
184
+    @Override
185
+    public Void visitArray(ArrayExpression expression) {
186
+        javaWriter.constant(expression.expressions.length);
187
+        Type type = context.getType(((ArrayTypeID)expression.type).elementType);
188
+        javaWriter.newArray(type);
189
+        for (int i = 0; i < expression.expressions.length; i++) {
190
+            javaWriter.dup();
191
+            javaWriter.constant(i);
192
+            expression.expressions[i].accept(this);
193
+            javaWriter.arrayStore(type);
194
+        }
195
+        return null;
196
+    }
205 197
 
206
-	@Override
207
-	public Void visitCompare(CompareExpression expression) {
198
+    @Override
199
+    public Void visitCompare(CompareExpression expression) {
208 200
 		if (expression.operator.getBuiltin() != null) {
209 201
 			switch (expression.operator.getBuiltin()) {
210 202
 				case BYTE_COMPARE:
@@ -365,9 +357,6 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
365 357
 
366 358
 			if (!checkAndExecuteMethodInfo(expression.member))
367 359
 				throw new IllegalStateException("Call target has no method info!");
368
-
369
-			if(expression.instancedHeader.returnType != BasicTypeID.VOID)
370
-				javaWriter.checkCast("java/lang/String");
371 360
 			return null;
372 361
 		}
373 362
 
@@ -678,8 +667,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
678 667
 				javaWriter.invokeVirtual(MAP_GET);
679 668
 
680 669
 				AssocTypeID type = (AssocTypeID) expression.target.type;
681
-				Type cls = type.valueType.accept(JavaTypeVisitor.INSTANCE);
682
-				javaWriter.checkCast(cls.getInternalName());
670
+				javaWriter.checkCast(context.getInternalName(type.valueType));
683 671
 				break;
684 672
 			}
685 673
 			case ASSOC_INDEXSET:
@@ -735,12 +723,12 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
735 723
 				throw new UnsupportedOperationException("Not yet supported!");
736 724
 			case ARRAY_INDEXGET: {
737 725
 				ArrayTypeID type = (ArrayTypeID) expression.target.type;
738
-				javaWriter.arrayLoad(type.elementType.accept(JavaTypeVisitor.INSTANCE));
726
+				javaWriter.arrayLoad(context.getType(type.elementType));
739 727
 				break;
740 728
 			}
741 729
 			case ARRAY_INDEXSET: {
742 730
 				ArrayTypeID type = (ArrayTypeID) expression.target.type;
743
-				javaWriter.arrayStore(type.elementType.accept(JavaTypeVisitor.INSTANCE));
731
+				javaWriter.arrayStore(context.getType(type.elementType));
744 732
 				break;
745 733
 			}
746 734
 			case ARRAY_INDEXGETRANGE: {
@@ -801,7 +789,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
801 789
 					}
802 790
 				} else {
803 791
 					javaWriter.invokeStatic(ARRAYS_COPY_OF_RANGE_OBJECTS);
804
-					javaWriter.checkCast("[" + type.elementType.accept(JavaTypeVisitor.INSTANCE).getDescriptor());
792
+					javaWriter.checkCast(context.getDescriptor(type));
805 793
 				}
806 794
 				break;
807 795
 			}
@@ -859,9 +847,9 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
859 847
 			case FUNCTION_CALL:
860 848
 				javaWriter.invokeInterface(
861 849
 						new JavaMethodInfo(
862
-								JavaClass.fromInternalName(expression.target.type.accept(JavaTypeVisitor.INSTANCE).getInternalName(), JavaClass.Kind.INTERFACE),
850
+								JavaClass.fromInternalName(context.getInternalName(expression.target.type), JavaClass.Kind.INTERFACE),
863 851
 								"accept",
864
-								CompilerUtils.calcSign(expression.instancedHeader, false),
852
+								context.getMethodSignature(expression.instancedHeader),
865 853
 								Opcodes.ACC_PUBLIC));
866 854
 				break;
867 855
 			case AUTOOP_NOTEQUALS:
@@ -1323,19 +1311,19 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1323 1311
 		return null;
1324 1312
 	}
1325 1313
 
1326
-	@Override
1327
-	public Void visitCheckNull(CheckNullExpression expression) {
1328
-		final Label end = new Label();
1329
-		expression.value.accept(this);
1330
-		javaWriter.dup();
1331
-		javaWriter.ifNonNull(end);
1332
-		javaWriter.pop();
1333
-		javaWriter.newObject(NullPointerException.class);
1334
-		javaWriter.dup();
1335
-		javaWriter.constant("Tried to convert a null value to nonnull type " + expression.type.accept(JavaTypeClassVisitor.INSTANCE).getSimpleName());
1336
-		javaWriter.invokeSpecial(NullPointerException.class, "<init>", "(Ljava/lang/String;)V");
1337
-		javaWriter.aThrow();
1338
-		javaWriter.label(end);
1314
+    @Override
1315
+    public Void visitCheckNull(CheckNullExpression expression) {
1316
+        final Label end = new Label();
1317
+        expression.value.accept(this);
1318
+        javaWriter.dup();
1319
+        javaWriter.ifNonNull(end);
1320
+        javaWriter.pop();
1321
+        javaWriter.newObject(NullPointerException.class);
1322
+        javaWriter.dup();
1323
+        javaWriter.constant("Tried to convert a null value to nonnull type " + context.getType(expression.type).getClassName());
1324
+        javaWriter.invokeSpecial(NullPointerException.class, "<init>", "(Ljava/lang/String;)V");
1325
+        javaWriter.aThrow();
1326
+        javaWriter.label(end);
1339 1327
 
1340 1328
 		return null;
1341 1329
 	}
@@ -1537,15 +1525,8 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1537 1525
 		return null;
1538 1526
 	}
1539 1527
 
1540
-	@Override
1541
-	public Void visitConstructorThisCall(ConstructorThisCallExpression expression) {
1542
-		Type type = expression.objectType.accept(JavaTypeVisitor.INSTANCE);
1543
-		try {
1544
-			type.getInternalName();
1545
-		} catch (NullPointerException ex) {
1546
-			ex.printStackTrace();
1547
-		}
1548
-
1528
+    @Override
1529
+    public Void visitConstructorThisCall(ConstructorThisCallExpression expression) {
1549 1530
 		javaWriter.loadObject(0);
1550 1531
 		if (javaWriter.method.javaClass.isEnum()) {
1551 1532
 			javaWriter.loadObject(1);
@@ -1555,49 +1536,51 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1555 1536
 		for (Expression argument : expression.arguments.arguments) {
1556 1537
 			argument.accept(this);
1557 1538
 		}
1558
-		String internalName = type.getInternalName();
1559
-		javaWriter.invokeSpecial(internalName, "<init>", CompilerUtils.calcDesc(expression.constructor.getHeader(), javaWriter.method.javaClass.isEnum()));
1560
-		return null;
1561
-	}
1562
-
1563
-	@Override
1564
-	public Void visitConstructorSuperCall(ConstructorSuperCallExpression expression) {
1565
-		javaWriter.loadObject(0);
1566
-		for (Expression argument : expression.arguments.arguments) {
1567
-			argument.accept(this);
1568
-		}
1569
-		//No super calls in enums possible, and that's already handled in the enum constructor itself.
1570
-		javaWriter.invokeSpecial(expression.objectType.accept(JavaTypeClassVisitor.INSTANCE), "<init>", CompilerUtils.calcDesc(expression.constructor.getHeader(), false));
1571
-
1572
-		CompilerUtils.writeDefaultFieldInitializers(javaWriter, javaWriter.forDefinition, false);
1573
-		return null;
1574
-	}
1575
-
1576
-	@Override
1577
-	public Void visitEnumConstant(EnumConstantExpression expression) {
1578
-		final Type type = expression.type.accept(JavaTypeVisitor.INSTANCE);
1579
-		javaWriter.getStaticField(type.getInternalName(), expression.value.name, type.getDescriptor());
1580
-		return null;
1581
-	}
1539
+		String internalName = context.getInternalName(expression.objectType);
1540
+        javaWriter.invokeSpecial(internalName, "<init>", javaWriter.method.javaClass.isEnum()
1541
+				? context.getEnumConstructorDescriptor(expression.constructor.getHeader())
1542
+				: context.getMethodDescriptor(expression.constructor.getHeader()));
1543
+        return null;
1544
+    }
1545
+
1546
+    @Override
1547
+    public Void visitConstructorSuperCall(ConstructorSuperCallExpression expression) {
1548
+        javaWriter.loadObject(0);
1549
+        for (Expression argument : expression.arguments.arguments) {
1550
+            argument.accept(this);
1551
+        }
1552
+        //No super calls in enums possible, and that's already handled in the enum constructor itself.
1553
+        javaWriter.invokeSpecial(
1554
+				context.getInternalName(expression.objectType),
1555
+				"<init>",
1556
+				context.getMethodDescriptor(expression.constructor.getHeader()));
1557
+
1558
+        CompilerUtils.writeDefaultFieldInitializers(context, javaWriter, javaWriter.forDefinition, false);
1559
+        return null;
1560
+    }
1561
+
1562
+    @Override
1563
+    public Void visitEnumConstant(EnumConstantExpression expression) {
1564
+        javaWriter.getStaticField(context.getInternalName(expression.type), expression.value.name, context.getDescriptor(expression.type));
1565
+        return null;
1566
+    }
1582 1567
 
1583 1568
 	@Override
1584 1569
 	public Void visitFunction(FunctionExpression expression) {
1585
-		CompilerUtils.tagMethodParameters(expression.header, false);
1570
+		CompilerUtils.tagMethodParameters(context, expression.header, false);
1586 1571
 
1587
-		if (expression.header.parameters.length == 0 && expression.body instanceof ReturnStatement && expression.body.hasTag(MatchExpression.class) && expression.closure.captures.isEmpty()) {
1588
-			((ReturnStatement) expression.body).value.accept(this);
1589
-			return null;
1590
-		}
1591
-		final String signature = CompilerUtils.calcSign(expression.header, false);
1592
-		//final String name = CompilerUtils.getLambdaInterface(expression.header);
1572
+        if (expression.header.parameters.length == 0 && expression.body instanceof ReturnStatement && expression.body.hasTag(MatchExpression.class) && expression.closure.captures.isEmpty()) {
1573
+            ((ReturnStatement) expression.body).value.accept(this);
1574
+            return null;
1575
+        }
1576
+        final String signature = context.getMethodSignature(expression.header);
1593 1577
 		final String name = CompilerUtils.getLambdaCounter();
1594 1578
 
1595 1579
 		final JavaMethodInfo methodInfo = new JavaMethodInfo(javaWriter.method.javaClass, "accept", signature, Opcodes.ACC_PUBLIC);
1596 1580
 		final ClassWriter lambdaCW = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
1597
-		lambdaCW.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, name, null, "java/lang/Object", new String[]{CompilerUtils.getLambdaInterface(expression.header)});
1581
+		lambdaCW.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, name, null, "java/lang/Object", new String[]{JavaSynthesizedClassNamer.createFunctionName(new FunctionTypeID(null, expression.header)).cls.internalName});
1598 1582
 		final JavaWriter functionWriter = new JavaWriter(lambdaCW, methodInfo, null, signature, null, "java/lang/Override");
1599 1583
 
1600
-
1601 1584
 		javaWriter.newObject(name);
1602 1585
 		javaWriter.dup();
1603 1586
 
@@ -1613,7 +1596,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1613 1596
 		int i = 0;
1614 1597
 		for (CapturedExpression capture : expression.closure.captures) {
1615 1598
 			constructorWriter.dup();
1616
-			final Type type = capture.type.accept(JavaTypeVisitor.INSTANCE);
1599
+			Type type = context.getType(capture.type);
1617 1600
 			lambdaCW.visitField(Opcodes.ACC_FINAL | Opcodes.ACC_PRIVATE, "captured" + ++i, type.getDescriptor(), null, null).visitEnd();
1618 1601
 
1619 1602
 			capture.accept(this);
@@ -1630,15 +1613,15 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1630 1613
 		constructorWriter.end();
1631 1614
 
1632 1615
 
1633
-		functionWriter.start();
1616
+        functionWriter.start();
1634 1617
 
1635 1618
 
1636
-		final JavaStatementVisitor CSV = new JavaStatementVisitor(new JavaExpressionVisitor(functionWriter) {
1637
-			//@Override
1619
+		final JavaStatementVisitor CSV = new JavaStatementVisitor(context, new JavaExpressionVisitor(context, functionWriter) {
1620
+			@Override
1638 1621
 			public Void visitGetLocalVariable(GetLocalVariableExpression varExpression) {
1639 1622
 				final int position = calculateMemberPosition(varExpression, expression);
1640 1623
 				functionWriter.loadObject(0);
1641
-				functionWriter.getField(name, "captured" + position, varExpression.variable.type.accept(JavaTypeVisitor.INSTANCE).getDescriptor());
1624
+				functionWriter.getField(name, "captured" + position, context.getDescriptor(varExpression.variable.type));
1642 1625
 				return null;
1643 1626
 			}
1644 1627
 
@@ -1646,20 +1629,18 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1646 1629
 			public Void visitCapturedParameter(CapturedParameterExpression varExpression) {
1647 1630
 				final int position = calculateMemberPosition(varExpression, expression);
1648 1631
 				functionWriter.loadObject(0);
1649
-				functionWriter.getField(name, "captured" + position, varExpression.parameter.type.accept(JavaTypeVisitor.INSTANCE).getDescriptor());
1632
+				functionWriter.getField(name, "captured" + position, context.getDescriptor(varExpression.parameter.type));
1650 1633
 				return null;
1651 1634
 			}
1652 1635
 		});
1653 1636
 
1654
-
1655 1637
 		expression.body.accept(CSV);
1656
-		functionWriter.ret();
1657
-
1658 1638
 
1639
+        functionWriter.ret();
1659 1640
 		functionWriter.end();
1660 1641
 		lambdaCW.visitEnd();
1661 1642
 
1662
-		JavaModule.classes.putIfAbsent(name, lambdaCW.toByteArray());
1643
+		context.register(name, lambdaCW.toByteArray());
1663 1644
 
1664 1645
 		try (FileOutputStream out = new FileOutputStream(name + ".class")) {
1665 1646
 			out.write(lambdaCW.toByteArray());
@@ -1685,7 +1666,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1685 1666
 
1686 1667
 	private static int calculateMemberPosition(CapturedParameterExpression functionParameterExpression, FunctionExpression expression) {
1687 1668
 		int h = 1;//expression.header.parameters.length;
1688
-		for (CapturedExpression capture : expression.closure.captures) {
1669
+    	for (CapturedExpression capture : expression.closure.captures) {
1689 1670
 			if (capture instanceof CapturedParameterExpression && ((CapturedParameterExpression) capture).parameter == functionParameterExpression.parameter)
1690 1671
 				return h;
1691 1672
 			h++;
@@ -1693,16 +1674,14 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1693 1674
 		throw new CompileException(functionParameterExpression.position, CompileExceptionCode.INTERNAL_ERROR, "Captured Statement error");
1694 1675
 	}
1695 1676
 
1696
-
1697
-	private String calcFunctionSignature(LambdaClosure closure) {
1698
-		StringJoiner joiner = new StringJoiner("", "(", ")V");
1699
-
1700
-		for (CapturedExpression capture : closure.captures) {
1701
-			String descriptor = capture.type.accept(JavaTypeVisitor.INSTANCE).getDescriptor();
1702
-			joiner.add(descriptor);
1703
-		}
1704
-		return joiner.toString();
1705
-	}
1677
+    private String calcFunctionSignature(LambdaClosure closure) {
1678
+        StringJoiner joiner = new StringJoiner("", "(", ")V");
1679
+	    for (CapturedExpression capture : closure.captures) {
1680
+            String descriptor = context.getDescriptor(capture.type);
1681
+            joiner.add(descriptor);
1682
+        }
1683
+        return joiner.toString();
1684
+    }
1706 1685
 
1707 1686
 	@Override
1708 1687
 	public Void visitGetField(GetFieldExpression expression) {
@@ -1720,9 +1699,9 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1720 1699
 			throw new CompileException(expression.position, CompileExceptionCode.LAMBDA_HEADER_INVALID, "Could not resolve lambda parameter" + expression.parameter);
1721 1700
 		}
1722 1701
 
1723
-		javaWriter.load(expression.parameter.type.accept(JavaTypeVisitor.INSTANCE), parameter.index);
1724
-		return null;
1725
-	}
1702
+        javaWriter.load(context.getType(expression.parameter.type), parameter.index);
1703
+        return null;
1704
+    }
1726 1705
 
1727 1706
 	@Override
1728 1707
 	public Void visitGetLocalVariable(GetLocalVariableExpression expression) {
@@ -1740,7 +1719,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1740 1719
 		final ITypeID type = expression.value.option.getParameterType(expression.index);
1741 1720
 		final JavaClass tag = expression.value.option.getTag(JavaClass.class);
1742 1721
 		javaWriter.checkCast(tag.internalName);
1743
-		javaWriter.getField(new JavaFieldInfo(tag, "Field" + expression.index, type.accept(JavaTypeVisitor.INSTANCE).getDescriptor()));
1722
+		javaWriter.getField(new JavaField(tag, "Field" + expression.index, context.getDescriptor(type)));
1744 1723
 		return null;
1745 1724
 		//throw new UnsupportedOperationException(); // TODO
1746 1725
 	}
@@ -1833,7 +1812,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1833 1812
 			case ASSOC_KEYS: {
1834 1813
 				AssocTypeID type = (AssocTypeID) expression.target.type;
1835 1814
 				ArrayTypeID result = new ArrayTypeID(null, type.keyType, 1);
1836
-				Type resultType = result.accept(JavaTypeVisitor.INSTANCE);
1815
+				Type resultType = context.getType(result);
1837 1816
 
1838 1817
 				javaWriter.invokeVirtual(MAP_KEYS);
1839 1818
 				javaWriter.dup();
@@ -1846,7 +1825,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1846 1825
 			case ASSOC_VALUES: {
1847 1826
 				AssocTypeID type = (AssocTypeID) expression.target.type;
1848 1827
 				ArrayTypeID result = new ArrayTypeID(null, type.valueType, 1);
1849
-				Type resultType = result.accept(JavaTypeVisitor.INSTANCE);
1828
+				Type resultType = context.getType(result);
1850 1829
 
1851 1830
 				javaWriter.invokeVirtual(MAP_VALUES);
1852 1831
 				javaWriter.dup();
@@ -1954,39 +1933,39 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1954 1933
 		return expression.resolution.accept(this);
1955 1934
 	}
1956 1935
 
1957
-	@Override
1958
-	public Void visitInterfaceCast(InterfaceCastExpression expression) {
1959
-		expression.value.accept(this);
1960
-		javaWriter.checkCast(expression.type.accept(JavaTypeVisitor.INSTANCE));
1961
-		return null;
1962
-	}
1936
+    @Override
1937
+    public Void visitInterfaceCast(InterfaceCastExpression expression) {
1938
+        expression.value.accept(this);
1939
+        javaWriter.checkCast(context.getDescriptor(expression.type));
1940
+        return null;
1941
+    }
1963 1942
 
1964
-	@Override
1965
-	public Void visitIs(IsExpression expression) {
1966
-		expression.value.accept(this);
1967
-		javaWriter.instanceOf(expression.isType.accept(JavaTypeVisitor.INSTANCE));
1968
-		return null;
1969
-	}
1943
+    @Override
1944
+    public Void visitIs(IsExpression expression) {
1945
+        expression.value.accept(this);
1946
+        javaWriter.instanceOf(context.getDescriptor(expression.isType));
1947
+        return null;
1948
+    }
1970 1949
 
1971 1950
 	@Override
1972 1951
 	public Void visitMakeConst(MakeConstExpression expression) {
1973 1952
 		return null;
1974 1953
 	}
1975 1954
 
1976
-	@Override
1977
-	public Void visitMap(MapExpression expression) {
1978
-		javaWriter.newObject(expression.type.accept(JavaTypeClassVisitor.INSTANCE));
1979
-		javaWriter.dup();
1980
-		javaWriter.invokeSpecial("java/util/Map", "<init>", "()V");
1981
-		for (int i = 0; i < expression.keys.length; i++) {
1982
-			javaWriter.dup();
1983
-			expression.keys[i].accept(this);
1984
-			expression.values[i].accept(this);
1985
-			javaWriter.invokeInterface(MAP_PUT);
1986
-			javaWriter.pop();
1987
-		}
1988
-		return null;
1989
-	}
1955
+    @Override
1956
+    public Void visitMap(MapExpression expression) {
1957
+        javaWriter.newObject("java/util/HashMap");
1958
+        javaWriter.dup();
1959
+        javaWriter.invokeSpecial("java/util/HashMap", "<init>", "()V");
1960
+        for (int i = 0; i < expression.keys.length; i++) {
1961
+            javaWriter.dup();
1962
+            expression.keys[i].accept(this);
1963
+            expression.values[i].accept(this);
1964
+            javaWriter.invokeInterface(MAP_PUT);
1965
+            javaWriter.pop();
1966
+        }
1967
+        return null;
1968
+    }
1990 1969
 
1991 1970
 	@Override
1992 1971
 	public Void visitMatch(MatchExpression expression) {
@@ -2001,7 +1980,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
2001 1980
 
2002 1981
 		//TODO replace beforeSwitch visitor or similar
2003 1982
 		if (expression.value.type == BasicTypeID.STRING)
2004
-			javaWriter.invokeVirtual(new JavaMethodInfo(OBJECT, "hashCode", "()I", 0));
1983
+			javaWriter.invokeVirtual(new JavaMethodInfo(JavaClass.OBJECT, "hashCode", "()I", 0));
2005 1984
 
2006 1985
 		//TODO replace with beforeSwitch visitor or similar
2007 1986
 		for (MatchExpression.Case aCase : expression.cases) {
@@ -2046,17 +2025,13 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
2046 2025
 
2047 2026
 		if (hasNoDefault) {
2048 2027
 			javaWriter.label(defaultLabel);
2049
-			final Type type = expression.type.accept(JavaTypeVisitor.INSTANCE);
2050
-			if (type == null || type.getOpcode(Opcodes.ISTORE) == Opcodes.ASTORE)
2028
+			if (context.getType(expression.type).getOpcode(Opcodes.ISTORE) == Opcodes.ASTORE)
2051 2029
 				javaWriter.aConstNull();
2052 2030
 			else
2053 2031
 				javaWriter.iConst0();
2054 2032
 		}
2055 2033
 
2056 2034
 		javaWriter.label(end);
2057
-
2058
-
2059
-		//throw new UnsupportedOperationException("Not yet implemented!");
2060 2035
 		return null;
2061 2036
 	}
2062 2037
 
@@ -2066,24 +2041,27 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
2066 2041
 		return true;
2067 2042
 	}
2068 2043
 
2069
-	@Override
2070
-	public Void visitNew(NewExpression expression) {
2071
-		final String type;
2072
-		if (expression.type instanceof DefinitionTypeID)
2073
-			type = ((DefinitionTypeID) expression.type).definition.name;
2074
-		else
2075
-			type = Type.getDescriptor(expression.type.accept(JavaTypeClassVisitor.INSTANCE));
2044
+    @Override
2045
+    public Void visitNew(NewExpression expression) {
2046
+		// TODO: this code is incorrect!
2076 2047
 
2077
-		javaWriter.newObject(type);
2078
-		javaWriter.dup();
2079
-		StringBuilder signatureBuilder = new StringBuilder("(");
2080
-		for (Expression argument : expression.arguments.arguments) {
2081
-			argument.accept(this);
2082
-			signatureBuilder.append(Type.getDescriptor(argument.type.accept(JavaTypeClassVisitor.INSTANCE)));
2083
-		}
2084
-		signatureBuilder.append(")V");
2085
-		javaWriter.invokeSpecial(type, "<init>", signatureBuilder.toString());
2048
+        final String type;
2049
+        if (expression.type instanceof DefinitionTypeID)
2050
+            type = ((DefinitionTypeID) expression.type).definition.name;
2051
+        else
2052
+            type = context.getDescriptor(expression.type);
2053
+
2054
+        javaWriter.newObject(type);
2055
+        javaWriter.dup();
2056
+        StringBuilder signatureBuilder = new StringBuilder("(");
2057
+        for (Expression argument : expression.arguments.arguments) {
2058
+            argument.accept(this);
2059
+            signatureBuilder.append(context.getDescriptor(argument.type));
2060
+        }
2061
+        signatureBuilder.append(")V");
2062
+        javaWriter.invokeSpecial(type, "<init>", signatureBuilder.toString());
2086 2063
 
2064
+		//throw new UnsupportedOperationException("Not yet implemented!");
2087 2065
 		return null;
2088 2066
 	}
2089 2067
 
@@ -2131,18 +2109,18 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
2131 2109
 	@Override
2132 2110
 	public Void visitPostCall(PostCallExpression expression) {
2133 2111
 		expression.target.accept(this);
2134
-		javaWriter.dup(expression.type.accept(new JavaTypeVisitor()));
2112
+		javaWriter.dup(context.getType(expression.type));
2135 2113
 		if (!checkAndExecuteByteCodeImplementation(expression.member) && !checkAndExecuteMethodInfo(expression.member))
2136 2114
 			throw new IllegalStateException("Call target has no method info!");
2137 2115
 
2138 2116
 		return null;
2139 2117
 	}
2140 2118
 
2141
-	@Override
2142
-	public Void visitRange(RangeExpression expression) {
2143
-		// TODO: there are other kinds of ranges also; there should be a Range<T, T> type with creation of synthetic types
2144
-		if (expression.from.type.accept(JavaTypeClassVisitor.INSTANCE) != int.class)
2145
-			throw new CompileException(expression.position, CompileExceptionCode.INTERNAL_ERROR, "Only integer ranges supported");
2119
+    @Override
2120
+    public Void visitRange(RangeExpression expression) {
2121
+        // TODO: there are other kinds of ranges also; there should be a Range<T, T> type with creation of synthetic types
2122
+        if (!context.getDescriptor(expression.from.type).equals("I"))
2123
+            throw new CompileException(expression.position, CompileExceptionCode.INTERNAL_ERROR, "Only integer ranges supported");
2146 2124
 
2147 2125
 		javaWriter.newObject(IntRange.class);
2148 2126
 		javaWriter.dup();
@@ -2184,13 +2162,13 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
2184 2162
 		return null;
2185 2163
 	}
2186 2164
 
2187
-	@Override
2188
-	public Void visitSetFunctionParameter(SetFunctionParameterExpression expression) {
2189
-		expression.value.accept(this);
2190
-		JavaParameterInfo parameter = expression.parameter.getTag(JavaParameterInfo.class);
2191
-		javaWriter.store(expression.type.accept(JavaTypeVisitor.INSTANCE), parameter.index);
2192
-		return null;
2193
-	}
2165
+    @Override
2166
+    public Void visitSetFunctionParameter(SetFunctionParameterExpression expression) {
2167
+        expression.value.accept(this);
2168
+        JavaParameterInfo parameter = expression.parameter.getTag(JavaParameterInfo.class);
2169
+        javaWriter.store(context.getType(expression.type), parameter.index);
2170
+        return null;
2171
+    }
2194 2172
 
2195 2173
 	@Override
2196 2174
 	public Void visitSetLocalVariable(SetLocalVariableExpression expression) {
@@ -2361,15 +2339,12 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
2361 2339
 
2362 2340
 		final StringBuilder builder = new StringBuilder("(");
2363 2341
 		for (ITypeID type : expression.option.getOption().types) {
2364
-			builder.append(type.accept(JavaTypeVisitor.INSTANCE).getDescriptor());
2342
+			builder.append(context.getDescriptor(type));
2365 2343
 		}
2366 2344
 		builder.append(")V");
2367 2345
 
2368 2346
 
2369 2347
 		javaWriter.invokeSpecial(internalName, "<init>", builder.toString());
2370
-
2371
-
2372
-
2373 2348
 		return null;
2374 2349
 	}
2375 2350
 
@@ -2385,52 +2360,51 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
2385 2360
 		return null;
2386 2361
 	}
2387 2362
 
2388
-	public JavaWriter getJavaWriter() {
2389
-		return javaWriter;
2390
-	}
2391
-
2392
-
2393
-	//Will return true if a JavaBytecodeImplementation.class tag exists, and will compile that tag
2394
-	private boolean checkAndExecuteByteCodeImplementation(DefinitionMemberRef member) {
2395
-		final JavaBytecodeImplementation implementation = member.getTag(JavaBytecodeImplementation.class);
2396
-		if (implementation != null) {
2397
-			implementation.compile(getJavaWriter());
2398
-			return true;
2399
-		}
2400
-		return false;
2401
-	}
2402
-
2403
-	//Will return true if a JavaMethodInfo.class tag exists, and will compile that tag
2404
-	private boolean checkAndExecuteMethodInfo(DefinitionMemberRef member) {
2405
-		final JavaMethodInfo methodInfo = member.getTag(JavaMethodInfo.class);
2406
-		if (methodInfo == null)
2407
-			return false;
2408
-
2409
-		if (methodInfo.isStatic()) {
2410
-			getJavaWriter().invokeStatic(methodInfo);
2411
-		} else {
2412
-			getJavaWriter().invokeVirtual(methodInfo);
2413
-		}
2414
-		return true;
2415
-	}
2416
-
2417
-
2418
-	//Will return true if a JavaFieldInfo.class tag exists, and will compile that tag
2419
-	public boolean checkAndPutFieldInfo(FieldMemberRef field, boolean isStatic) {
2420
-		final JavaFieldInfo fieldInfo = field.getTag(JavaFieldInfo.class);
2421
-		if (fieldInfo == null)
2422
-			return false;
2423
-		//TODO Remove isStatic
2424
-		if (field.isStatic() || isStatic) {
2425
-			getJavaWriter().putStaticField(fieldInfo);
2426
-		} else {
2427
-			getJavaWriter().putField(fieldInfo);
2428
-		}
2429
-		return true;
2430
-	}
2363
+    public JavaWriter getJavaWriter() {
2364
+        return javaWriter;
2365
+    }
2366
+
2367
+
2368
+    //Will return true if a JavaBytecodeImplementation.class tag exists, and will compile that tag
2369
+    private boolean checkAndExecuteByteCodeImplementation(DefinitionMemberRef member) {
2370
+        JavaBytecodeImplementation implementation = member.getTag(JavaBytecodeImplementation.class);
2371
+        if (implementation != null) {
2372
+            implementation.compile(getJavaWriter());
2373
+            return true;
2374
+        }
2375
+        return false;
2376
+    }
2377
+
2378
+    //Will return true if a JavaMethodInfo.class tag exists, and will compile that tag
2379
+    private boolean checkAndExecuteMethodInfo(DefinitionMemberRef member) {
2380
+        JavaMethodInfo methodInfo = member.getTag(JavaMethodInfo.class);
2381
+        if (methodInfo == null)
2382
+            return false;
2383
+
2384
+        if (methodInfo.isStatic()) {
2385
+            getJavaWriter().invokeStatic(methodInfo);
2386
+        } else {
2387
+            getJavaWriter().invokeVirtual(methodInfo);
2388
+        }
2389
+        return true;
2390
+    }
2391
+
2392
+    //Will return true if a JavaFieldInfo.class tag exists, and will compile that tag
2393
+    public boolean checkAndPutFieldInfo(FieldMemberRef field, boolean isStatic) {
2394
+		JavaField fieldInfo = field.getTag(JavaField.class);
2395
+        if (fieldInfo == null)
2396
+            return false;
2397
+        //TODO Remove isStatic
2398
+        if (field.isStatic() || isStatic) {
2399
+            getJavaWriter().putStaticField(fieldInfo);
2400
+        } else {
2401
+            getJavaWriter().putField(fieldInfo);
2402
+        }
2403
+        return true;
2404
+    }
2431 2405
 
2432 2406
 	public boolean checkAndGetFieldInfo(ConstMemberRef field, boolean isStatic) {
2433
-		final JavaFieldInfo fieldInfo = field.getTag(JavaFieldInfo.class);
2407
+		final JavaField fieldInfo = field.getTag(JavaField.class);
2434 2408
 		if (fieldInfo == null)
2435 2409
 			return false;
2436 2410
 
@@ -2439,7 +2413,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
2439 2413
 	}
2440 2414
 
2441 2415
 	public boolean checkAndGetFieldInfo(FieldMemberRef field, boolean isStatic) {
2442
-		final JavaFieldInfo fieldInfo = field.getTag(JavaFieldInfo.class);
2416
+		final JavaField fieldInfo = field.getTag(JavaField.class);
2443 2417
 		if (fieldInfo == null)
2444 2418
 			return false;
2445 2419
 
@@ -2451,5 +2425,4 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
2451 2425
 		}
2452 2426
 		return true;
2453 2427
 	}
2454
-
2455 2428
 }

+ 0
- 98
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaOptionalTypeClassVisitor.java View File

@@ -1,98 +0,0 @@
1
-/*
2
- * To change this license header, choose License Headers in Project Properties.
3
- * To change this template file, choose Tools | Templates
4
- * and open the template in the editor.
5
- */
6
-package org.openzen.zenscript.javabytecode.compiler;
7
-
8
-import org.openzen.zenscript.codemodel.type.*;
9
-
10
-/**
11
- * @author Hoofdgebruiker
12
- */
13
-public class JavaOptionalTypeClassVisitor implements ITypeVisitor<Class> {
14
-	private final JavaTypeClassVisitor base;
15
-
16
-	public JavaOptionalTypeClassVisitor(JavaTypeClassVisitor base) {
17
-		this.base = base;
18
-	}
19
-
20
-	@Override
21
-	public Class visitBasic(BasicTypeID basic) {
22
-		switch (basic) {
23
-			case VOID:
24
-				return void.class;
25
-			case NULL:
26
-				return Object.class;
27
-			case BOOL:
28
-				return Boolean.class;
29
-			case BYTE:
30
-			case SBYTE:
31
-				return Byte.class;
32
-			case SHORT:
33
-			case USHORT:
34
-				return Short.class;
35
-			case INT:
36
-			case UINT:
37
-				return Integer.class;
38
-			case LONG:
39
-			case ULONG:
40
-				return Long.class;
41
-			case FLOAT:
42
-				return Float.class;
43
-			case DOUBLE:
44
-				return Double.class;
45
-			case CHAR:
46
-				return Character.class;
47
-			case STRING:
48
-				return String.class;
49
-			default:
50
-				throw new IllegalArgumentException("Invalid type: " + basic);
51
-		}
52
-	}
53
-
54
-	@Override
55
-	public Class visitArray(ArrayTypeID array) {
56
-		return base.visitArray(array);
57
-	}
58
-
59
-	@Override
60
-	public Class visitAssoc(AssocTypeID assoc) {
61
-		return base.visitAssoc(assoc);
62
-	}
63
-
64
-	@Override
65
-	public Class visitIterator(IteratorTypeID iterator) {
66
-		return base.visitIterator(iterator);
67
-	}
68
-
69
-	@Override
70
-	public Class visitFunction(FunctionTypeID function) {
71
-		return base.visitFunction(function);
72
-	}
73
-
74
-	@Override
75
-	public Class visitDefinition(DefinitionTypeID definition) {
76
-		return base.visitDefinition(definition);
77
-	}
78
-
79
-	@Override
80
-	public Class visitGeneric(GenericTypeID generic) {
81
-		return base.visitGeneric(generic);
82
-	}
83
-
84
-	@Override
85
-	public Class visitRange(RangeTypeID range) {
86
-		return base.visitRange(range);
87
-	}
88
-
89
-	@Override
90
-	public Class visitModified(ModifiedTypeID type) {
91
-		return base.visitModified(type);
92
-	}
93
-
94
-	@Override
95
-	public Class visitGenericMap(GenericMapTypeID map) {
96
-		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
97
-	}
98
-}

+ 94
- 23
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaPreDecrementVisitor.java View File

@@ -6,19 +6,90 @@
6 6
 package org.openzen.zenscript.javabytecode.compiler;
7 7
 
8 8
 import org.objectweb.asm.Type;
9
-import org.openzen.zenscript.codemodel.expression.*;
9
+import org.openzen.zenscript.codemodel.expression.AndAndExpression;
10
+import org.openzen.zenscript.codemodel.expression.ArrayExpression;
11
+import org.openzen.zenscript.codemodel.expression.CompareExpression;
12
+import org.openzen.zenscript.codemodel.expression.CallExpression;
13
+import org.openzen.zenscript.codemodel.expression.CallStaticExpression;
14
+import org.openzen.zenscript.codemodel.expression.CapturedClosureExpression;
15
+import org.openzen.zenscript.codemodel.expression.CapturedDirectExpression;
16
+import org.openzen.zenscript.codemodel.expression.CapturedLocalVariableExpression;
17
+import org.openzen.zenscript.codemodel.expression.CapturedParameterExpression;
18
+import org.openzen.zenscript.codemodel.expression.CapturedThisExpression;
19
+import org.openzen.zenscript.codemodel.expression.CastExpression;
20
+import org.openzen.zenscript.codemodel.expression.CheckNullExpression;
21
+import org.openzen.zenscript.codemodel.expression.CoalesceExpression;
22
+import org.openzen.zenscript.codemodel.expression.ConditionalExpression;
23
+import org.openzen.zenscript.codemodel.expression.ConstExpression;
24
+import org.openzen.zenscript.codemodel.expression.ConstantBoolExpression;
25
+import org.openzen.zenscript.codemodel.expression.ConstantByteExpression;
26
+import org.openzen.zenscript.codemodel.expression.ConstantCharExpression;
27
+import org.openzen.zenscript.codemodel.expression.ConstantDoubleExpression;
28
+import org.openzen.zenscript.codemodel.expression.ConstantFloatExpression;
29
+import org.openzen.zenscript.codemodel.expression.ConstantIntExpression;
30
+import org.openzen.zenscript.codemodel.expression.ConstantLongExpression;
31
+import org.openzen.zenscript.codemodel.expression.ConstantSByteExpression;
32
+import org.openzen.zenscript.codemodel.expression.ConstantShortExpression;
33
+import org.openzen.zenscript.codemodel.expression.ConstantStringExpression;
34
+import org.openzen.zenscript.codemodel.expression.ConstantUIntExpression;
35
+import org.openzen.zenscript.codemodel.expression.ConstantULongExpression;
36
+import org.openzen.zenscript.codemodel.expression.ConstantUShortExpression;
37
+import org.openzen.zenscript.codemodel.expression.ConstructorSuperCallExpression;
38
+import org.openzen.zenscript.codemodel.expression.ConstructorThisCallExpression;
39
+import org.openzen.zenscript.codemodel.expression.EnumConstantExpression;
40
+import org.openzen.zenscript.codemodel.expression.ExpressionVisitor;
41
+import org.openzen.zenscript.codemodel.expression.FunctionExpression;
42
+import org.openzen.zenscript.codemodel.expression.GetFieldExpression;
43
+import org.openzen.zenscript.codemodel.expression.GetFunctionParameterExpression;
44
+import org.openzen.zenscript.codemodel.expression.GetLocalVariableExpression;
45
+import org.openzen.zenscript.codemodel.expression.GetMatchingVariantField;
46
+import org.openzen.zenscript.codemodel.expression.GetStaticFieldExpression;
47
+import org.openzen.zenscript.codemodel.expression.GetterExpression;
48
+import org.openzen.zenscript.codemodel.expression.GlobalCallExpression;
49
+import org.openzen.zenscript.codemodel.expression.GlobalExpression;
50
+import org.openzen.zenscript.codemodel.expression.InterfaceCastExpression;
51
+import org.openzen.zenscript.codemodel.expression.IsExpression;
52
+import org.openzen.zenscript.codemodel.expression.MakeConstExpression;
53
+import org.openzen.zenscript.codemodel.expression.MapExpression;
54
+import org.openzen.zenscript.codemodel.expression.MatchExpression;
55
+import org.openzen.zenscript.codemodel.expression.NewExpression;
56
+import org.openzen.zenscript.codemodel.expression.NullExpression;
57
+import org.openzen.zenscript.codemodel.expression.OrOrExpression;
58
+import org.openzen.zenscript.codemodel.expression.PanicExpression;
59
+import org.openzen.zenscript.codemodel.expression.PostCallExpression;
60
+import org.openzen.zenscript.codemodel.expression.RangeExpression;
61
+import org.openzen.zenscript.codemodel.expression.SameObjectExpression;
62
+import org.openzen.zenscript.codemodel.expression.SetFieldExpression;
63
+import org.openzen.zenscript.codemodel.expression.SetFunctionParameterExpression;
64
+import org.openzen.zenscript.codemodel.expression.SetLocalVariableExpression;
65
+import org.openzen.zenscript.codemodel.expression.SetStaticFieldExpression;
66
+import org.openzen.zenscript.codemodel.expression.SetterExpression;
67
+import org.openzen.zenscript.codemodel.expression.StaticGetterExpression;
68
+import org.openzen.zenscript.codemodel.expression.StaticSetterExpression;
69
+import org.openzen.zenscript.codemodel.expression.SupertypeCastExpression;
70
+import org.openzen.zenscript.codemodel.expression.ThisExpression;
71
+import org.openzen.zenscript.codemodel.expression.ThrowExpression;
72
+import org.openzen.zenscript.codemodel.expression.TryConvertExpression;
73
+import org.openzen.zenscript.codemodel.expression.TryRethrowAsExceptionExpression;
74
+import org.openzen.zenscript.codemodel.expression.TryRethrowAsResultExpression;
75
+import org.openzen.zenscript.codemodel.expression.VariantValueExpression;
76
+import org.openzen.zenscript.codemodel.expression.WrapOptionalExpression;
77
+import org.openzen.zenscript.javabytecode.JavaBytecodeContext;
10 78
 import org.openzen.zenscript.javabytecode.JavaLocalVariableInfo;
11 79
 import org.openzen.zenscript.javabytecode.JavaParameterInfo;
12 80
 
13 81
 /**
82
+ *
14 83
  * @author Hoofdgebruiker
15 84
  */
16 85
 public class JavaPreDecrementVisitor implements ExpressionVisitor<Void> {
17 86
 	private final JavaExpressionVisitor expressionCompiler;
18 87
 	private final JavaWriter javaWriter;
19
-
20
-	public JavaPreDecrementVisitor(JavaExpressionVisitor expressionCompiler) {
88
+	private final JavaBytecodeContext context;
89
+	
90
+	public JavaPreDecrementVisitor(JavaBytecodeContext context, JavaExpressionVisitor expressionCompiler) {
21 91
 		this.expressionCompiler = expressionCompiler;
92
+		this.context = context;
22 93
 		javaWriter = expressionCompiler.getJavaWriter();
23 94
 	}
24 95
 
@@ -91,7 +162,7 @@ public class JavaPreDecrementVisitor implements ExpressionVisitor<Void> {
91 162
 	public Void visitConditional(ConditionalExpression expression) {
92 163
 		throw new UnsupportedOperationException("Invalid increment target");
93 164
 	}
94
-
165
+	
95 166
 	@Override
96 167
 	public Void visitConst(ConstExpression expression) {
97 168
 		throw new UnsupportedOperationException("Invalid increment target");
@@ -184,23 +255,23 @@ public class JavaPreDecrementVisitor implements ExpressionVisitor<Void> {
184 255
 
185 256
 	@Override
186 257
 	public Void visitGetField(GetFieldExpression expression) {
187
-		Type objectType = expression.target.type.accept(new JavaTypeVisitor());
188
-
258
+		Type objectType = context.getType(expression.target.type);
259
+		
189 260
 		int local = javaWriter.local(objectType);
190 261
 		expression.target.accept(expressionCompiler);
191 262
 		javaWriter.dup();
192 263
 		javaWriter.store(objectType, local);
193
-
194
-		if (!expressionCompiler.checkAndGetFieldInfo(expression.field, false))
195
-			throw new IllegalStateException("Missing field info on a field member!");
196
-
264
+		
265
+        if (!expressionCompiler.checkAndGetFieldInfo(expression.field, false))
266
+            throw new IllegalStateException("Missing field info on a field member!");
267
+		
197 268
 		javaWriter.iConst1();
198 269
 		javaWriter.iSub();
199
-
270
+		
200 271
 		javaWriter.load(objectType, local);
201
-		if (!expressionCompiler.checkAndPutFieldInfo(expression.field, false))
202
-			throw new IllegalStateException("Missing field info on a field member!");
203
-
272
+        if (!expressionCompiler.checkAndPutFieldInfo(expression.field, false))
273
+            throw new IllegalStateException("Missing field info on a field member!");
274
+		
204 275
 		return null;
205 276
 	}
206 277
 
@@ -209,7 +280,7 @@ public class JavaPreDecrementVisitor implements ExpressionVisitor<Void> {
209 280
 		javaWriter.idec(expression.parameter.getTag(JavaParameterInfo.class).index);
210 281
 		return null;
211 282
 	}
212
-
283
+	
213 284
 	@Override
214 285
 	public Void visitGetLocalVariable(GetLocalVariableExpression expression) {
215 286
 		javaWriter.idec(expression.variable.getTag(JavaLocalVariableInfo.class).local);
@@ -224,14 +295,14 @@ public class JavaPreDecrementVisitor implements ExpressionVisitor<Void> {
224 295
 	@Override
225 296
 	public Void visitGetStaticField(GetStaticFieldExpression expression) {
226 297
 		if (!expressionCompiler.checkAndGetFieldInfo(expression.field, false))
227
-			throw new IllegalStateException("Missing field info on a field member!");
228
-
298
+            throw new IllegalStateException("Missing field info on a field member!");
299
+		
229 300
 		javaWriter.iConst1();
230 301
 		javaWriter.iAdd();
231
-
302
+		
232 303
 		if (!expressionCompiler.checkAndPutFieldInfo(expression.field, false))
233
-			throw new IllegalStateException("Missing field info on a field member!");
234
-
304
+            throw new IllegalStateException("Missing field info on a field member!");
305
+		
235 306
 		return null;
236 307
 	}
237 308
 
@@ -289,7 +360,7 @@ public class JavaPreDecrementVisitor implements ExpressionVisitor<Void> {
289 360
 	public Void visitOrOr(OrOrExpression expression) {
290 361
 		throw new UnsupportedOperationException("Invalid increment target");
291 362
 	}
292
-
363
+	
293 364
 	@Override
294 365
 	public Void visitPanic(PanicExpression expression) {
295 366
 		throw new UnsupportedOperationException("Invalid increment target");
@@ -304,7 +375,7 @@ public class JavaPreDecrementVisitor implements ExpressionVisitor<Void> {
304 375
 	public Void visitRange(RangeExpression expression) {
305 376
 		throw new UnsupportedOperationException("Invalid increment target");
306 377
 	}
307
-
378
+	
308 379
 	@Override
309 380
 	public Void visitSameObject(SameObjectExpression expression) {
310 381
 		throw new UnsupportedOperationException("Invalid increment target");
@@ -344,7 +415,7 @@ public class JavaPreDecrementVisitor implements ExpressionVisitor<Void> {
344 415
 	public Void visitStaticSetter(StaticSetterExpression expression) {
345 416
 		throw new UnsupportedOperationException("Invalid increment target");
346 417
 	}
347
-
418
+	
348 419
 	@Override
349 420
 	public Void visitSupertypeCast(SupertypeCastExpression expression) {
350 421
 		throw new UnsupportedOperationException("Invalid increment target");

+ 93
- 22
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaPreIncrementVisitor.java View File

@@ -6,19 +6,90 @@
6 6
 package org.openzen.zenscript.javabytecode.compiler;
7 7
 
8 8
 import org.objectweb.asm.Type;
9
-import org.openzen.zenscript.codemodel.expression.*;
9
+import org.openzen.zenscript.codemodel.expression.AndAndExpression;
10
+import org.openzen.zenscript.codemodel.expression.ArrayExpression;
11
+import org.openzen.zenscript.codemodel.expression.CompareExpression;
12
+import org.openzen.zenscript.codemodel.expression.CallExpression;
13
+import org.openzen.zenscript.codemodel.expression.CallStaticExpression;
14
+import org.openzen.zenscript.codemodel.expression.CapturedClosureExpression;
15
+import org.openzen.zenscript.codemodel.expression.CapturedDirectExpression;
16
+import org.openzen.zenscript.codemodel.expression.CapturedLocalVariableExpression;
17
+import org.openzen.zenscript.codemodel.expression.CapturedParameterExpression;
18
+import org.openzen.zenscript.codemodel.expression.CapturedThisExpression;
19
+import org.openzen.zenscript.codemodel.expression.CastExpression;
20
+import org.openzen.zenscript.codemodel.expression.CheckNullExpression;
21
+import org.openzen.zenscript.codemodel.expression.CoalesceExpression;
22
+import org.openzen.zenscript.codemodel.expression.ConditionalExpression;
23
+import org.openzen.zenscript.codemodel.expression.ConstExpression;
24
+import org.openzen.zenscript.codemodel.expression.ConstantBoolExpression;
25
+import org.openzen.zenscript.codemodel.expression.ConstantByteExpression;
26
+import org.openzen.zenscript.codemodel.expression.ConstantCharExpression;
27
+import org.openzen.zenscript.codemodel.expression.ConstantDoubleExpression;
28
+import org.openzen.zenscript.codemodel.expression.ConstantFloatExpression;
29
+import org.openzen.zenscript.codemodel.expression.ConstantIntExpression;
30
+import org.openzen.zenscript.codemodel.expression.ConstantLongExpression;
31
+import org.openzen.zenscript.codemodel.expression.ConstantSByteExpression;
32
+import org.openzen.zenscript.codemodel.expression.ConstantShortExpression;
33
+import org.openzen.zenscript.codemodel.expression.ConstantStringExpression;
34
+import org.openzen.zenscript.codemodel.expression.ConstantUIntExpression;
35
+import org.openzen.zenscript.codemodel.expression.ConstantULongExpression;
36
+import org.openzen.zenscript.codemodel.expression.ConstantUShortExpression;
37
+import org.openzen.zenscript.codemodel.expression.ConstructorSuperCallExpression;
38
+import org.openzen.zenscript.codemodel.expression.ConstructorThisCallExpression;
39
+import org.openzen.zenscript.codemodel.expression.EnumConstantExpression;
40
+import org.openzen.zenscript.codemodel.expression.ExpressionVisitor;
41
+import org.openzen.zenscript.codemodel.expression.FunctionExpression;
42
+import org.openzen.zenscript.codemodel.expression.GetFieldExpression;
43
+import org.openzen.zenscript.codemodel.expression.GetFunctionParameterExpression;
44
+import org.openzen.zenscript.codemodel.expression.GetLocalVariableExpression;
45
+import org.openzen.zenscript.codemodel.expression.GetMatchingVariantField;
46
+import org.openzen.zenscript.codemodel.expression.GetStaticFieldExpression;
47
+import org.openzen.zenscript.codemodel.expression.GetterExpression;
48
+import org.openzen.zenscript.codemodel.expression.GlobalCallExpression;
49
+import org.openzen.zenscript.codemodel.expression.GlobalExpression;
50
+import org.openzen.zenscript.codemodel.expression.InterfaceCastExpression;
51
+import org.openzen.zenscript.codemodel.expression.IsExpression;
52
+import org.openzen.zenscript.codemodel.expression.MakeConstExpression;
53
+import org.openzen.zenscript.codemodel.expression.MapExpression;
54
+import org.openzen.zenscript.codemodel.expression.MatchExpression;
55
+import org.openzen.zenscript.codemodel.expression.NewExpression;
56
+import org.openzen.zenscript.codemodel.expression.NullExpression;
57
+import org.openzen.zenscript.codemodel.expression.OrOrExpression;
58
+import org.openzen.zenscript.codemodel.expression.PanicExpression;
59
+import org.openzen.zenscript.codemodel.expression.PostCallExpression;
60
+import org.openzen.zenscript.codemodel.expression.RangeExpression;
61
+import org.openzen.zenscript.codemodel.expression.SameObjectExpression;
62
+import org.openzen.zenscript.codemodel.expression.SetFieldExpression;
63
+import org.openzen.zenscript.codemodel.expression.SetFunctionParameterExpression;
64
+import org.openzen.zenscript.codemodel.expression.SetLocalVariableExpression;
65
+import org.openzen.zenscript.codemodel.expression.SetStaticFieldExpression;
66
+import org.openzen.zenscript.codemodel.expression.SetterExpression;
67
+import org.openzen.zenscript.codemodel.expression.StaticGetterExpression;
68
+import org.openzen.zenscript.codemodel.expression.StaticSetterExpression;
69
+import org.openzen.zenscript.codemodel.expression.SupertypeCastExpression;
70
+import org.openzen.zenscript.codemodel.expression.ThisExpression;
71
+import org.openzen.zenscript.codemodel.expression.ThrowExpression;
72
+import org.openzen.zenscript.codemodel.expression.TryConvertExpression;
73
+import org.openzen.zenscript.codemodel.expression.TryRethrowAsExceptionExpression;
74
+import org.openzen.zenscript.codemodel.expression.TryRethrowAsResultExpression;
75
+import org.openzen.zenscript.codemodel.expression.VariantValueExpression;
76
+import org.openzen.zenscript.codemodel.expression.WrapOptionalExpression;
77
+import org.openzen.zenscript.javabytecode.JavaBytecodeContext;
10 78
 import org.openzen.zenscript.javabytecode.JavaLocalVariableInfo;
11 79
 import org.openzen.zenscript.javabytecode.JavaParameterInfo;
12 80
 
13 81
 /**
82
+ *
14 83
  * @author Hoofdgebruiker
15 84
  */
16 85
 public class JavaPreIncrementVisitor implements ExpressionVisitor<Void> {
17 86
 	private final JavaExpressionVisitor expressionCompiler;
87
+	private final JavaBytecodeContext context;
18 88
 	private final JavaWriter javaWriter;
19
-
20
-	public JavaPreIncrementVisitor(JavaExpressionVisitor expressionCompiler) {
89
+	
90
+	public JavaPreIncrementVisitor(JavaBytecodeContext context, JavaExpressionVisitor expressionCompiler) {
21 91
 		this.expressionCompiler = expressionCompiler;
92
+		this.context = context;
22 93
 		javaWriter = expressionCompiler.getJavaWriter();
23 94
 	}
24 95
 
@@ -91,7 +162,7 @@ public class JavaPreIncrementVisitor implements ExpressionVisitor<Void> {
91 162
 	public Void visitConditional(ConditionalExpression expression) {
92 163
 		throw new UnsupportedOperationException("Invalid increment target");
93 164
 	}
94
-
165
+	
95 166
 	@Override
96 167
 	public Void visitConst(ConstExpression expression) {
97 168
 		throw new UnsupportedOperationException("Invalid increment target");
@@ -184,24 +255,24 @@ public class JavaPreIncrementVisitor implements ExpressionVisitor<Void> {
184 255
 
185 256
 	@Override
186 257
 	public Void visitGetField(GetFieldExpression expression) {
187
-		Type objectType = expression.target.type.accept(new JavaTypeVisitor());
188
-
258
+		Type objectType = context.getType(expression.target.type);
259
+		
189 260
 		int local = javaWriter.local(objectType);
190 261
 		expression.target.accept(expressionCompiler);
191 262
 		javaWriter.dup();
192 263
 		javaWriter.store(objectType, local);
193
-
194
-		if (!expressionCompiler.checkAndGetFieldInfo(expression.field, false))
195
-			throw new IllegalStateException("Missing field info on a field member!");
196
-
264
+		
265
+        if (!expressionCompiler.checkAndGetFieldInfo(expression.field, false))
266
+            throw new IllegalStateException("Missing field info on a field member!");
267
+		
197 268
 		javaWriter.iConst1();
198 269
 		javaWriter.iAdd();
199
-
270
+		
200 271
 		javaWriter.load(objectType, local);
201 272
 		javaWriter.dupX1();
202
-		if (!expressionCompiler.checkAndPutFieldInfo(expression.field, false))
203
-			throw new IllegalStateException("Missing field info on a field member!");
204
-
273
+        if (!expressionCompiler.checkAndPutFieldInfo(expression.field, false))
274
+            throw new IllegalStateException("Missing field info on a field member!");
275
+		
205 276
 		return null;
206 277
 	}
207 278
 
@@ -229,15 +300,15 @@ public class JavaPreIncrementVisitor implements ExpressionVisitor<Void> {
229 300
 	@Override
230 301
 	public Void visitGetStaticField(GetStaticFieldExpression expression) {
231 302
 		if (!expressionCompiler.checkAndGetFieldInfo(expression.field, false))
232
-			throw new IllegalStateException("Missing field info on a field member!");
233
-
303
+            throw new IllegalStateException("Missing field info on a field member!");
304
+		
234 305
 		javaWriter.iConst1();
235 306
 		javaWriter.iAdd();
236 307
 		javaWriter.dup();
237
-
308
+		
238 309
 		if (!expressionCompiler.checkAndPutFieldInfo(expression.field, false))
239
-			throw new IllegalStateException("Missing field info on a field member!");
240
-
310
+            throw new IllegalStateException("Missing field info on a field member!");
311
+		
241 312
 		return null;
242 313
 	}
243 314
 
@@ -295,7 +366,7 @@ public class JavaPreIncrementVisitor implements ExpressionVisitor<Void> {
295 366
 	public Void visitOrOr(OrOrExpression expression) {
296 367
 		throw new UnsupportedOperationException("Invalid increment target");
297 368
 	}
298
-
369
+	
299 370
 	@Override
300 371
 	public Void visitPanic(PanicExpression expression) {
301 372
 		throw new UnsupportedOperationException("Invalid increment target");
@@ -310,7 +381,7 @@ public class JavaPreIncrementVisitor implements ExpressionVisitor<Void> {
310 381
 	public Void visitRange(RangeExpression expression) {
311 382
 		throw new UnsupportedOperationException("Invalid increment target");
312 383
 	}
313
-
384
+	
314 385
 	@Override
315 386
 	public Void visitSameObject(SameObjectExpression expression) {
316 387
 		throw new UnsupportedOperationException("Invalid increment target");
@@ -350,7 +421,7 @@ public class JavaPreIncrementVisitor implements ExpressionVisitor<Void> {
350 421
 	public Void visitStaticSetter(StaticSetterExpression expression) {
351 422
 		throw new UnsupportedOperationException("Invalid increment target");
352 423
 	}
353
-
424
+	
354 425
 	@Override
355 426
 	public Void visitSupertypeCast(SupertypeCastExpression expression) {
356 427
 		throw new UnsupportedOperationException("Invalid increment target");

+ 31
- 28
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaStatementVisitor.java View File

@@ -9,24 +9,28 @@ import org.openzen.zenscript.javabytecode.JavaMethodInfo;
9 9
 
10 10
 import java.util.Arrays;
11 11
 import java.util.List;
12
+import org.openzen.zenscript.javabytecode.JavaBytecodeContext;
12 13
 import org.openzen.zenscript.javashared.JavaClass;
13 14
 
14 15
 public class JavaStatementVisitor implements StatementVisitor<Boolean> {
15
-	private final JavaWriter javaWriter;
16
-	public JavaExpressionVisitor expressionVisitor;
17
-
18
-	/**
19
-	 * @param javaWriter the method writer that compiles the statement
20
-	 */
21
-	public JavaStatementVisitor(JavaWriter javaWriter) {
22
-		this.javaWriter = javaWriter;
23
-		this.expressionVisitor = new JavaExpressionVisitor(javaWriter);
24
-	}
25
-
26
-	public JavaStatementVisitor(JavaExpressionVisitor expressionVisitor) {
27
-		this.javaWriter = expressionVisitor.getJavaWriter();
28
-		this.expressionVisitor = expressionVisitor;
29
-	}
16
+    private final JavaWriter javaWriter;
17
+	private final JavaBytecodeContext context;
18
+    public JavaExpressionVisitor expressionVisitor;
19
+
20
+    /**
21
+     * @param javaWriter the method writer that compiles the statement
22
+     */
23
+    public JavaStatementVisitor(JavaBytecodeContext context, JavaWriter javaWriter) {
24
+        this.javaWriter = javaWriter;
25
+		this.context = context;
26
+        this.expressionVisitor = new JavaExpressionVisitor(context, javaWriter);
27
+    }
28
+
29
+    public JavaStatementVisitor(JavaBytecodeContext context, JavaExpressionVisitor expressionVisitor) {
30
+        this.javaWriter = expressionVisitor.getJavaWriter();
31
+		this.context = context;
32
+        this.expressionVisitor = expressionVisitor;
33
+    }
30 34
 
31 35
 	@Override
32 36
 	public Boolean visitBlock(BlockStatement statement) {
@@ -95,15 +99,15 @@ public class JavaStatementVisitor implements StatementVisitor<Boolean> {
95 99
 		//Compile Array/Collection
96 100
 		statement.list.accept(expressionVisitor);
97 101
 
98
-		//Create local variables
99
-		for (VarStatement variable : statement.loopVariables) {
100
-			final Type type = Type.getType(variable.type.accept(JavaTypeClassVisitor.INSTANCE));
101
-			final Label variableStart = new Label();
102
-			final JavaLocalVariableInfo info = new JavaLocalVariableInfo(type, javaWriter.local(type), variableStart, variable.name);
103
-			info.end = end;
104
-			variable.setTag(JavaLocalVariableInfo.class, info);
105
-			javaWriter.addVariableInfo(info);
106
-		}
102
+        //Create local variables
103
+        for (VarStatement variable : statement.loopVariables) {
104
+            final Type type = context.getType(variable.type);
105
+            final Label variableStart = new Label();
106
+            final JavaLocalVariableInfo info = new JavaLocalVariableInfo(type, javaWriter.local(type), variableStart, variable.name);
107
+            info.end = end;
108
+            variable.setTag(JavaLocalVariableInfo.class, info);
109
+            javaWriter.addVariableInfo(info);
110
+        }
107 111
 
108 112
 		//javaWriter.label(min);
109 113
 		statement.iterator.target.acceptForIterator(new JavaForeachVisitor(this, statement.loopVariables, statement.content, start, end));
@@ -142,7 +146,7 @@ public class JavaStatementVisitor implements StatementVisitor<Boolean> {
142 146
 	@Override
143 147
 	public Boolean visitReturn(ReturnStatement statement) {
144 148
 		statement.value.accept(expressionVisitor);
145
-		javaWriter.returnType(statement.value.type.accept(JavaTypeVisitor.INSTANCE));
149
+		javaWriter.returnType(context.getType(statement.value.type));
146 150
 		return true;
147 151
 	}
148 152
 
@@ -238,7 +242,7 @@ public class JavaStatementVisitor implements StatementVisitor<Boolean> {
238 242
 			javaWriter.label(catchStart);
239 243
 
240 244
 			//final Type exceptionType = Type.getType(RuntimeException.class);
241
-			final Type exceptionType = Type.getType(catchClause.exceptionVariable.type.accept(JavaTypeClassVisitor.INSTANCE));
245
+			final Type exceptionType = context.getType(catchClause.exceptionVariable.type);
242 246
 			final int local = javaWriter.local(exceptionType);
243 247
 			javaWriter.store(exceptionType, local);
244 248
 
@@ -271,12 +275,11 @@ public class JavaStatementVisitor implements StatementVisitor<Boolean> {
271 275
 
272 276
 	@Override
273 277
 	public Boolean visitVar(VarStatement statement) {
274
-
275 278
 		if (statement.initializer != null) {
276 279
 			statement.initializer.accept(expressionVisitor);
277 280
 		}
278 281
 
279
-		Type type = statement.type.accept(JavaTypeVisitor.INSTANCE);
282
+		Type type = context.getType(statement.type);
280 283
 		int local = javaWriter.local(type);
281 284
 		if (statement.initializer != null)
282 285
 			javaWriter.store(type, local);

+ 0
- 98
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaTypeClassVisitor.java View File

@@ -1,98 +0,0 @@
1
-package org.openzen.zenscript.javabytecode.compiler;
2
-
3
-import org.openzen.zenscript.codemodel.type.*;
4
-import org.openzen.zenscript.javabytecode.JavaModule;
5
-
6
-import java.lang.reflect.Array;
7
-import java.util.Iterator;
8
-import java.util.Map;
9
-
10
-public class JavaTypeClassVisitor implements ITypeVisitor<Class> {
11
-
12
-	public static final JavaTypeClassVisitor INSTANCE = new JavaTypeClassVisitor();
13
-	private final JavaOptionalTypeClassVisitor optional = new JavaOptionalTypeClassVisitor(this);
14
-
15
-	@Override
16
-	public Class visitBasic(BasicTypeID basic) {
17
-		switch (basic) {
18
-			case VOID:
19
-				return void.class;
20
-			case NULL:
21
-			case UNDETERMINED:
22
-				return Object.class;
23
-			case BOOL:
24
-				return boolean.class;
25
-			case BYTE:
26
-			case SBYTE:
27
-				return byte.class;
28
-			case SHORT:
29
-			case USHORT:
30
-				return short.class;
31
-			case INT:
32
-			case UINT:
33
-				return int.class;
34
-			case LONG:
35
-			case ULONG:
36
-				return long.class;
37
-			case FLOAT:
38
-				return float.class;
39
-			case DOUBLE:
40
-				return double.class;
41
-			case CHAR:
42
-				return char.class;
43
-			case STRING:
44
-				return String.class;
45
-		}
46
-		return Object.class;
47
-	}
48
-
49
-	@Override
50
-	public Class visitArray(ArrayTypeID array) {
51
-		return Array.newInstance(array.elementType.accept(this), 0).getClass();
52
-	}
53
-
54
-	@Override
55
-	public Class visitAssoc(AssocTypeID assoc) {
56
-		return Map.class;
57
-	}
58
-
59
-	@Override
60
-	public Class visitIterator(IteratorTypeID iterator) {
61
-		return Iterator.class;
62
-	}
63
-
64
-	@Override
65
-	public Class visitFunction(FunctionTypeID function) {
66
-		try {
67
-			return new JavaModule().new ScriptClassLoader().loadClass(CompilerUtils.getLambdaInterface(function.header));
68
-		} catch (ClassNotFoundException e) {
69
-			return null;
70
-		}
71
-		//return function.header.returnType.accept(this);
72
-	}
73
-
74
-	@Override
75
-	public Class visitDefinition(DefinitionTypeID definition) {
76
-		return null;
77
-	}
78
-
79
-	@Override
80
-	public Class visitGeneric(GenericTypeID generic) {
81
-		return Object.class;
82
-	}
83
-
84
-	@Override
85
-	public Class visitRange(RangeTypeID range) {
86
-		return null;
87
-	}
88
-
89
-	@Override
90
-	public Class visitModified(ModifiedTypeID modified) {
91
-		return modified.baseType.accept(this.optional);
92
-	}
93
-
94
-	@Override
95
-	public Class visitGenericMap(GenericMapTypeID map) {
96
-		return Map.class;
97
-	}
98
-}

+ 0
- 61
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaTypeVisitor.java View File

@@ -1,61 +0,0 @@
1
-package org.openzen.zenscript.javabytecode.compiler;
2
-
3
-import java.util.Map;
4
-import org.objectweb.asm.Type;
5
-import org.openzen.zenscript.codemodel.type.*;
6
-
7
-public class JavaTypeVisitor implements ITypeVisitor<Type> {
8
-	public static final JavaTypeVisitor INSTANCE = new JavaTypeVisitor();
9
-
10
-	@Override
11
-	public Type visitBasic(BasicTypeID basic) {
12
-		return Type.getType(basic.accept(JavaTypeClassVisitor.INSTANCE));
13
-	}
14
-
15
-	@Override
16
-	public Type visitArray(ArrayTypeID array) {
17
-		return Type.getType(array.accept(JavaTypeClassVisitor.INSTANCE));
18
-	}
19
-
20
-	@Override
21
-	public Type visitAssoc(AssocTypeID assoc) {
22
-		return Type.getType(assoc.accept(JavaTypeClassVisitor.INSTANCE));
23
-	}
24
-
25
-	@Override
26
-	public Type visitIterator(IteratorTypeID iterator) {
27
-		return Type.getType(iterator.accept(JavaTypeClassVisitor.INSTANCE));
28
-	}
29
-
30
-	@Override
31
-	public Type visitFunction(FunctionTypeID function) {
32
-		Class clazz = function.accept(JavaTypeClassVisitor.INSTANCE);
33
-		return clazz != null ? Type.getType(clazz) : Type.getType("L" + CompilerUtils.getLambdaInterface(function.header) + ";");
34
-	}
35
-
36
-	@Override
37
-	public Type visitDefinition(DefinitionTypeID definition) {
38
-		return Type.getType("L" + definition.definition.name + ";");
39
-	}
40
-
41
-	@Override
42
-	public Type visitGeneric(GenericTypeID generic) {
43
-		final Class<?> clazz = generic.accept(JavaTypeClassVisitor.INSTANCE);
44
-		return Type.getType(clazz == null ? Object.class : clazz);
45
-	}
46
-
47
-	@Override
48
-	public Type visitRange(RangeTypeID range) {
49
-		return Type.getType(range.accept(JavaTypeClassVisitor.INSTANCE));
50
-	}
51
-
52
-	@Override
53
-	public Type visitModified(ModifiedTypeID optional) {
54
-		return Type.getType(optional.accept(JavaTypeClassVisitor.INSTANCE));
55
-	}
56
-
57
-	@Override
58
-	public Type visitGenericMap(GenericMapTypeID map) {
59
-		return Type.getType(Map.class);
60
-	}
61
-}

+ 964
- 965
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaWriter.java
File diff suppressed because it is too large
View File


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

@@ -10,6 +10,7 @@ import org.openzen.zenscript.codemodel.member.IDefinitionMember;
10 10
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
11 11
 import org.openzen.zenscript.codemodel.type.GenericTypeID;
12 12
 import org.openzen.zenscript.codemodel.type.ITypeID;
13
+import org.openzen.zenscript.javabytecode.JavaBytecodeContext;
13 14
 import org.openzen.zenscript.javabytecode.JavaMethodInfo;
14 15
 import org.openzen.zenscript.javabytecode.JavaModule;
15 16
 import org.openzen.zenscript.javabytecode.compiler.*;
@@ -35,9 +36,10 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
35 36
 			Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC);
36 37
 
37 38
 	private final JavaClassWriter outerWriter;
39
+	private final JavaBytecodeContext context;
38 40
 
39
-	public JavaDefinitionVisitor(JavaClassWriter outerWriter) {
40
-
41
+    public JavaDefinitionVisitor(JavaBytecodeContext context, JavaClassWriter outerWriter) {
42
+		this.context = context;
41 43
 		this.outerWriter = outerWriter;
42 44
 	}
43 45
 
@@ -45,25 +47,24 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
45 47
 	public byte[] visitClass(ClassDefinition definition) {
46 48
 		//Classes will always be created in a new File/Class
47 49
 
48
-		final Type superType;
49
-		if (definition.getSuperType() == null)
50
-			superType = Type.getType(Object.class);
51
-		else
52
-			superType = Type.getType(definition.getSuperType().accept(JavaTypeClassVisitor.INSTANCE));
50
+        final Type superType;
51
+        if (definition.getSuperType() == null)
52
+            superType = Type.getType(Object.class);
53
+        else
54
+            superType = context.getType(definition.getSuperType());
53 55
 
54 56
 		JavaClass toClass = new JavaClass(definition.pkg.fullName, definition.name, JavaClass.Kind.CLASS);
55 57
 		JavaClassWriter writer = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
56 58
 
57
-		//TODO: Calculate signature from generic parameters
58
-		//TODO: Interfaces?
59
-		String signature = null;
60
-
59
+        //TODO: Calculate signature from generic parameters
60
+        //TODO: Interfaces?
61
+        String signature = null;
61 62
 
62
-		writer.visit(Opcodes.V1_8, definition.modifiers, definition.name, signature, superType.getInternalName(), null);
63
-		JavaMemberVisitor memberVisitor = new JavaMemberVisitor(writer, toClass, definition);
64
-		for (IDefinitionMember member : definition.members) {
65
-			member.accept(memberVisitor);
66
-		}
63
+        writer.visit(Opcodes.V1_8, definition.modifiers, definition.name, signature, superType.getInternalName(), null);
64
+		JavaMemberVisitor memberVisitor = new JavaMemberVisitor(context, writer, toClass, definition);
65
+        for (IDefinitionMember member : definition.members) {
66
+            member.accept(memberVisitor);
67
+        }
67 68
 		memberVisitor.end();
68 69
 		writer.visitEnd();
69 70
 		return writer.toByteArray();
@@ -78,7 +79,7 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
78 79
 		//TODO: Extending Interfaces?
79 80
 		String signature = null;
80 81
 		writer.visit(Opcodes.V1_8, definition.modifiers | Opcodes.ACC_INTERFACE | Opcodes.ACC_ABSTRACT, definition.name, signature, Type.getInternalName(Object.class), null);
81
-		JavaMemberVisitor memberVisitor = new JavaMemberVisitor(writer, toClass, definition);
82
+		JavaMemberVisitor memberVisitor = new JavaMemberVisitor(context, writer, toClass, definition);
82 83
 		for (IDefinitionMember member : definition.members) {
83 84
 			member.accept(memberVisitor);
84 85
 		}
@@ -91,11 +92,11 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
91 92
 	public byte[] visitEnum(EnumDefinition definition) {
92 93
 		System.out.println("Compiling enum " + definition.name + " in " + definition.position.getFilename());
93 94
 
94
-		final Type superType;
95
-		if (definition.getSuperType() == null)
96
-			superType = Type.getType(Object.class);
97
-		else
98
-			superType = Type.getType(definition.getSuperType().accept(JavaTypeClassVisitor.INSTANCE));
95
+        final Type superType;
96
+        if (definition.getSuperType() == null)
97
+            superType = Type.getType(Object.class);
98
+        else
99
+            superType = context.getType(definition.getSuperType());
99 100
 
100 101
 		ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
101 102
 
@@ -106,10 +107,10 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
106 107
 		//Enum Stuff(required!)
107 108
 		writer.visitField(Opcodes.ACC_STATIC | Opcodes.ACC_PRIVATE | Opcodes.ACC_FINAL | Opcodes.ACC_SYNTHETIC, "$VALUES", "[L" + definition.name + ";", null, null).visitEnd();
108 109
 
109
-		final JavaMemberVisitor visitor = new JavaMemberVisitor(writer, toClass, definition);
110
-		for (IDefinitionMember member : definition.members) {
111
-			member.accept(visitor);
112
-		}
110
+        final JavaMemberVisitor visitor = new JavaMemberVisitor(context, writer, toClass, definition);
111
+        for (IDefinitionMember member : definition.members) {
112
+            member.accept(visitor);
113
+        }
113 114
 
114 115
 		JavaClass arrayClass = JavaClass.fromInternalName("[L" + definition.name + ";", JavaClass.Kind.ARRAY);
115 116
 		JavaMethodInfo arrayClone = new JavaMethodInfo(arrayClass, "clone", "()Ljava/lang/Object;", Opcodes.ACC_PUBLIC);
@@ -145,16 +146,16 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
145 146
 
146 147
 	@Override
147 148
 	public byte[] visitFunction(FunctionDefinition definition) {
148
-		CompilerUtils.tagMethodParameters(definition.header, true);
149
+		CompilerUtils.tagMethodParameters(context, definition.header, true);
149 150
 
150
-		final String signature = CompilerUtils.calcSign(definition.header, false);
151
+        final String signature = context.getMethodSignature(definition.header);
151 152
 
152 153
 		final JavaClass toClass = new JavaClass(definition.pkg.fullName, CompilerUtils.calcClasName(definition.position), JavaClass.Kind.CLASS);
153
-		final JavaMethodInfo methodInfo = new JavaMethodInfo(toClass, definition.name, CompilerUtils.calcDesc(definition.header, false), CompilerUtils.calcAccess(definition.modifiers) | Opcodes.ACC_STATIC);
154
+		final JavaMethodInfo methodInfo = new JavaMethodInfo(toClass, definition.name, context.getMethodDescriptor(definition.header), CompilerUtils.calcAccess(definition.modifiers) | Opcodes.ACC_STATIC);
154 155
 
155 156
 		final JavaWriter writer = new JavaWriter(outerWriter, true, methodInfo, definition, signature, null);
156
-		final JavaStatementVisitor statementVisitor = new JavaStatementVisitor(writer);
157
-		statementVisitor.start();
157
+        final JavaStatementVisitor statementVisitor = new JavaStatementVisitor(context, writer);
158
+        statementVisitor.start();
158 159
 		boolean returns = definition.statement.accept(statementVisitor);
159 160
 		if (!returns) {
160 161
 			ITypeID type = definition.header.returnType;
@@ -162,7 +163,7 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
162 163
 				writer.iConst0();
163 164
 			else if (type != BasicTypeID.VOID)
164 165
 				writer.aConstNull();
165
-			writer.returnType(type.accept(JavaTypeVisitor.INSTANCE));
166
+			writer.returnType(context.getType(type));
166 167
 		}
167 168
 
168 169
 		statementVisitor.end();
@@ -197,7 +198,7 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
197 198
 		writer.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_ABSTRACT, "getDenominator", "()I", null, null).visitEnd();
198 199
 
199 200
 
200
-		final JavaMemberVisitor visitor = new JavaMemberVisitor(writer, toClass, variant);
201
+		final JavaMemberVisitor visitor = new JavaMemberVisitor(context, writer, toClass, variant);
201 202
 
202 203
 		final List<VariantDefinition.Option> options = variant.options;
203 204
 		//Each option is one of the possible child classes
@@ -216,6 +217,7 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
216 217
 			final String signature;
217 218
 			{
218 219
 				StringBuilder builder = new StringBuilder();
220
+				//TODO check if this can be changed to what Stan was up to
219 221
 				builder.append("<");
220 222
 				for (final ITypeID type : option.types) {
221 223
 					builder.append(JavaTypeGenericVisitor.getSignatureWithBound(type));
@@ -243,16 +245,13 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
243 245
 			}
244 246
 
245 247
 			optionWriter.visit(Opcodes.V1_8, Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC, optionClassName, signature, variantName, null);
246
-			final JavaMemberVisitor optionVisitor = new JavaMemberVisitor(optionWriter, optionClass, variant);
247
-
248
-
248
+			final JavaMemberVisitor optionVisitor = new JavaMemberVisitor(context, optionWriter, optionClass, variant);
249 249
 			final StringBuilder optionInitDescBuilder = new StringBuilder("(");
250 250
 			final StringBuilder optionInitSignatureBuilder = new StringBuilder("(");
251 251
 
252 252
 			ITypeID[] types = option.types;
253 253
 			for (int i = 0; i < types.length; ++i) {
254
-				final Type type = types[i].accept(JavaTypeVisitor.INSTANCE);
255
-				final String internalName = type.getDescriptor();
254
+				final String internalName = context.getInternalName(types[i]);
256 255
 				optionInitDescBuilder.append(internalName);
257 256
 				optionInitSignatureBuilder.append("T").append(((GenericTypeID) types[i]).parameter.name).append(";");
258 257
 				optionWriter.visitField(Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL, "Field" + i, internalName, "T" + ((GenericTypeID) types[i]).parameter.name + ";", null).visitEnd();
@@ -270,10 +269,8 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
270 269
 				initWriter.dup();
271 270
 				initWriter.loadObject(i + 1);
272 271
 
273
-				final Type type = types[i].accept(JavaTypeVisitor.INSTANCE);
274
-				final String internalName = type.getDescriptor();
275
-
276
-				initWriter.putField(optionClassName, "Field" + i, internalName);
272
+				final String descriptor = context.getDescriptor(types[i]);
273
+				initWriter.putField(optionClassName, "Field" + i, descriptor);
277 274
 			}
278 275
 			initWriter.pop();
279 276
 			initWriter.ret();
@@ -291,7 +288,7 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
291 288
 			optionVisitor.end();
292 289
 			optionWriter.visitEnd();
293 290
 			final byte[] byteArray = optionWriter.toByteArray();
294
-			JavaModule.classes.put(optionClassName, byteArray);
291
+			context.register(optionClassName, byteArray);
295 292
 
296 293
 			//Print the option files, won't be in production
297 294
 			try (FileOutputStream out = new FileOutputStream(optionClassName + ".class")) {

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

@@ -10,75 +10,78 @@ import org.openzen.zenscript.codemodel.Modifiers;
10 10
 import org.openzen.zenscript.codemodel.definition.EnumDefinition;
11 11
 import org.openzen.zenscript.codemodel.expression.Expression;
12 12
 import org.openzen.zenscript.codemodel.member.*;
13
-import org.openzen.zenscript.javabytecode.JavaFieldInfo;
14 13
 import org.openzen.zenscript.javabytecode.JavaMethodInfo;
15 14
 import org.openzen.zenscript.javabytecode.JavaParameterInfo;
16 15
 import org.openzen.zenscript.javabytecode.compiler.*;
17 16
 
18 17
 import java.util.List;
18
+import org.openzen.zenscript.javabytecode.JavaBytecodeContext;
19 19
 import org.openzen.zenscript.javashared.JavaClass;
20
+import org.openzen.zenscript.javashared.JavaField;
20 21
 
21 22
 public class JavaMemberVisitor implements MemberVisitor<Void> {
22
-	private final ClassWriter writer;
23
-	private final JavaClass toClass;
24
-	private final HighLevelDefinition definition;
25
-	private final JavaStatementVisitor clinitStatementVisitor;
26
-	private EnumDefinition enumDefinition = null;
27
-
28
-	public JavaMemberVisitor(ClassWriter writer, JavaClass toClass, HighLevelDefinition definition) {
29
-		this.writer = writer;
30
-		this.toClass = toClass;
31
-		this.definition = definition;
32
-
33
-		final JavaWriter javaWriter = new JavaWriter(writer, new JavaMethodInfo(toClass, "<clinit>", "()V", 0), definition, null, null);
34
-		this.clinitStatementVisitor = new JavaStatementVisitor(javaWriter);
35
-		this.clinitStatementVisitor.start();
36
-		CompilerUtils.writeDefaultFieldInitializers(javaWriter, definition, true);
37
-	}
23
+    private final ClassWriter writer;
24
+	private final JavaBytecodeContext context;
25
+    private final JavaClass toClass;
26
+    private final HighLevelDefinition definition;
27
+    private final JavaStatementVisitor clinitStatementVisitor;
28
+    private EnumDefinition enumDefinition = null;
29
+
30
+    public JavaMemberVisitor(JavaBytecodeContext context, ClassWriter writer, JavaClass toClass, HighLevelDefinition definition) {
31
+        this.writer = writer;
32
+        this.toClass = toClass;
33
+        this.definition = definition;
34
+		this.context = context;
35
+
36
+        final JavaWriter javaWriter = new JavaWriter(writer, new JavaMethodInfo(toClass, "<clinit>", "()V", 0), definition, null, null);
37
+        this.clinitStatementVisitor = new JavaStatementVisitor(context, javaWriter);
38
+        this.clinitStatementVisitor.start();
39
+        CompilerUtils.writeDefaultFieldInitializers(context, javaWriter, definition, true);
40
+    }
38 41
 
39 42
 	@Override
40 43
 	public Void visitConst(ConstMember member) {
41
-		//TODO calc signature
42
-		String signature = null;
43
-		final String descriptor = Type.getDescriptor(member.type.accept(JavaTypeClassVisitor.INSTANCE));
44
-		writer.visitField(CompilerUtils.calcAccess(member.modifiers), member.name, descriptor, signature, null).visitEnd();
45
-		member.setTag(JavaFieldInfo.class, new JavaFieldInfo(toClass, member.name, descriptor));
46
-		return null;
44
+        //TODO calc signature
45
+        String signature = null;
46
+        final String descriptor = context.getDescriptor(member.type);
47
+        writer.visitField(CompilerUtils.calcAccess(member.modifiers), member.name, descriptor, signature, null).visitEnd();
48
+        member.setTag(JavaField.class, new JavaField(toClass, member.name, descriptor));
49
+        return null;
47 50
 	}
48 51
 
49 52
 	@Override
50 53
 	public Void visitField(FieldMember member) {
51 54
 
52
-		//TODO calc signature
53
-		String signature = null;
54
-		final String descriptor = Type.getDescriptor(member.type.accept(JavaTypeClassVisitor.INSTANCE));
55
-		writer.visitField(CompilerUtils.calcAccess(member.modifiers), member.name, descriptor, signature, null).visitEnd();
56
-		member.setTag(JavaFieldInfo.class, new JavaFieldInfo(toClass, member.name, descriptor));
57
-		return null;
58
-	}
59
-
60
-	@Override
61
-	public Void visitConstructor(ConstructorMember member) {
62
-		final boolean isEnum = definition instanceof EnumDefinition;
63
-		String descriptor = CompilerUtils.calcDesc(member.header, isEnum);
64
-		final JavaMethodInfo method = new JavaMethodInfo(toClass, "<init>", descriptor, isEnum ? Opcodes.ACC_PRIVATE : CompilerUtils.calcAccess(member.modifiers));
65
-
66
-		final Label constructorStart = new Label();
67
-		final Label constructorEnd = new Label();
68
-		final JavaWriter constructorWriter = new JavaWriter(writer, method, definition, CompilerUtils.calcSign(member.header, isEnum), null);
69
-		constructorWriter.label(constructorStart);
70
-		CompilerUtils.tagConstructorParameters(member.header, isEnum);
71
-		for (FunctionParameter parameter : member.header.parameters) {
72
-			constructorWriter.nameVariable(
73
-					parameter.getTag(JavaParameterInfo.class).index,
74
-					parameter.name,
75
-					constructorStart,
76
-					constructorEnd,
77
-					Type.getType(parameter.type.accept(JavaTypeClassVisitor.INSTANCE)));
78
-		}
79
-
80
-		final JavaStatementVisitor statementVisitor = new JavaStatementVisitor(constructorWriter);
81
-		statementVisitor.start();
55
+        //TODO calc signature
56
+        String signature = null;
57
+        final String descriptor = context.getDescriptor(member.type);
58
+        writer.visitField(CompilerUtils.calcAccess(member.modifiers), member.name, descriptor, signature, null).visitEnd();
59
+        member.setTag(JavaField.class, new JavaField(toClass, member.name, descriptor));
60
+        return null;
61
+    }
62
+
63
+    @Override
64
+    public Void visitConstructor(ConstructorMember member) {
65
+        final boolean isEnum = definition instanceof EnumDefinition;
66
+        String descriptor = isEnum ? context.getEnumConstructorDescriptor(member.header) : context.getMethodDescriptor(member.header);
67
+        final JavaMethodInfo method = new JavaMethodInfo(toClass, "<init>", descriptor, isEnum ? Opcodes.ACC_PRIVATE : CompilerUtils.calcAccess(member.modifiers));
68
+
69
+        final Label constructorStart = new Label();
70
+        final Label constructorEnd = new Label();
71
+        final JavaWriter constructorWriter = new JavaWriter(writer, method, definition, context.getMethodSignature(member.header), null);
72
+        constructorWriter.label(constructorStart);
73
+        CompilerUtils.tagConstructorParameters(context, member.header, isEnum);
74
+        for (FunctionParameter parameter : member.header.parameters) {
75
+            constructorWriter.nameVariable(
76
+                    parameter.getTag(JavaParameterInfo.class).index,
77
+                    parameter.name,
78
+                    constructorStart,
79
+                    constructorEnd,
80
+                    context.getType(parameter.type));
81
+        }
82
+
83
+        final JavaStatementVisitor statementVisitor = new JavaStatementVisitor(context, constructorWriter);
84
+        statementVisitor.start();
82 85
 
83 86
 		if (!member.isConstructorForwarded()) {
84 87
 			if (isEnum) {
@@ -95,8 +98,7 @@ public class JavaMemberVisitor implements MemberVisitor<Void> {
95 98
 				constructorWriter.invokeSpecial(Type.getInternalName(Object.class), "<init>", "()V");
96 99
 			}
97 100
 
98
-			CompilerUtils.writeDefaultFieldInitializers(constructorWriter, definition, false);
99
-		}
101
+        }
100 102
 
101 103
 		member.body.accept(statementVisitor);
102 104
 		constructorWriter.label(constructorEnd);
@@ -113,8 +115,8 @@ public class JavaMemberVisitor implements MemberVisitor<Void> {
113 115
 		final JavaWriter destructorWriter = new JavaWriter(writer, method, definition, null, null);
114 116
 		destructorWriter.label(constructorStart);
115 117
 
116
-		final JavaStatementVisitor statementVisitor = new JavaStatementVisitor(destructorWriter);
117
-		statementVisitor.start();
118
+        final JavaStatementVisitor statementVisitor = new JavaStatementVisitor(context, destructorWriter);
119
+        statementVisitor.start();
118 120
 		// TODO: destruction of members (to be done when memory tags are implemented)
119 121
 		member.body.accept(statementVisitor);
120 122
 		destructorWriter.label(constructorEnd);
@@ -122,22 +124,23 @@ public class JavaMemberVisitor implements MemberVisitor<Void> {
122 124
 		return null;
123 125
 	}
124 126
 
125
-	@Override
126
-	public Void visitMethod(MethodMember member) {
127
-		CompilerUtils.tagMethodParameters(member.header, member.isStatic());
128
-
129
-		final boolean isAbstract = member.body == null || Modifiers.isAbstract(member.modifiers);
130
-		int modifiers = (isAbstract ? Opcodes.ACC_ABSTRACT : 0)
131
-				| (member.isStatic() ? Opcodes.ACC_STATIC : 0)
132
-				| CompilerUtils.calcAccess(member.modifiers);
133
-		final JavaMethodInfo method = new JavaMethodInfo(
134
-				toClass,
135
-				member.name,
136
-				CompilerUtils.calcSign(member.header, false),
137
-				modifiers);
127
+    @Override
128
+    public Void visitMethod(MethodMember member) {
129
+        CompilerUtils.tagMethodParameters(context, member.header, member.isStatic());
130
+
131
+        final boolean isAbstract = member.body == null || Modifiers.isAbstract(member.modifiers);
132
+        int modifiers = (isAbstract ? Opcodes.ACC_ABSTRACT : 0)
133
+                | (member.isStatic() ? Opcodes.ACC_STATIC : 0)
134
+                | CompilerUtils.calcAccess(member.modifiers);
135
+        final JavaMethodInfo method = new JavaMethodInfo(
136
+                toClass,
137
+                member.name,
138
+                context.getMethodSignature(member.header),
139
+                modifiers);
138 140
 
139 141
 		final Label methodStart = new Label();
140 142
 		final Label methodEnd = new Label();
143
+		//TODO see if this can be changed to Stan's changes (context call maybe?)
141 144
 		final JavaWriter methodWriter = new JavaWriter(writer, method, definition, JavaTypeGenericVisitor.getGenericMethodSignature(member.header), null);
142 145
 		methodWriter.label(methodStart);
143 146
 		for (final FunctionParameter parameter : member.header.parameters) {
@@ -146,7 +149,7 @@ public class JavaMemberVisitor implements MemberVisitor<Void> {
146 149
 				methodWriter.nameVariable(parameter.getTag(JavaParameterInfo.class).index, parameter.name, methodStart, methodEnd, parameter.type.accept(JavaTypeVisitor.INSTANCE));
147 150
 		}
148 151
 
149
-		final JavaStatementVisitor statementVisitor = new JavaStatementVisitor(methodWriter);
152
+        final JavaStatementVisitor statementVisitor = new JavaStatementVisitor(context, methodWriter);
150 153
 
151 154
 		if (!isAbstract) {
152 155
 			statementVisitor.start();
@@ -210,7 +213,7 @@ public class JavaMemberVisitor implements MemberVisitor<Void> {
210 213
 		if (enumDefinition != null) {
211 214
 			for (EnumConstantMember constant : enumDefinition.enumConstants) {
212 215
 				writer.visitField(Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL | Opcodes.ACC_ENUM, constant.name, "L" + definition.name + ";", null, null).visitEnd();
213
-				final String internalName = constant.constructor.type.accept(JavaTypeVisitor.INSTANCE).getInternalName();
216
+				final String internalName = context.getInternalName(constant.constructor.type);
214 217
 				final JavaWriter clinitWriter = clinitStatementVisitor.getJavaWriter();
215 218
 				clinitWriter.newObject(internalName);
216 219
 				clinitWriter.dup();
@@ -220,7 +223,7 @@ public class JavaMemberVisitor implements MemberVisitor<Void> {
220 223
 					argument.accept(clinitStatementVisitor.expressionVisitor);
221 224
 				}
222 225
 
223
-				clinitWriter.invokeSpecial(internalName, "<init>", CompilerUtils.calcDesc(constant.constructor.constructor.getHeader(), true));
226
+				clinitWriter.invokeSpecial(internalName, "<init>", context.getEnumConstructorDescriptor(constant.constructor.constructor.getHeader()));
224 227
 				clinitWriter.putStaticField(internalName, constant.name, "L" + internalName + ";");
225 228
 
226 229
 				enumDefinition = (EnumDefinition) constant.definition;

+ 12
- 0
JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaClass.java View File

@@ -21,6 +21,17 @@ public class JavaClass implements Comparable<JavaClass> {
21 21
 	public static final JavaClass MAP = new JavaClass("java.util", "Map", JavaClass.Kind.INTERFACE);
22 22
 	public static final JavaClass HASHMAP = new JavaClass("java.util", "HashMap", JavaClass.Kind.CLASS);
23 23
 	public static final JavaClass ITERATOR = new JavaClass("java.util", "Iterator", JavaClass.Kind.INTERFACE);
24
+	public static final JavaClass ARRAYS = new JavaClass("java.util", "Arrays", Kind.CLASS);
25
+	
26
+	public static final JavaClass BOOLEAN = new JavaClass("java.lang", "Boolean", Kind.CLASS);
27
+	public static final JavaClass BYTE = new JavaClass("java.lang", "Byte", Kind.CLASS);
28
+	public static final JavaClass SHORT = new JavaClass("java.lang", "Short", Kind.CLASS);
29
+	public static final JavaClass INTEGER = new JavaClass("java.lang", "Integer", Kind.CLASS);
30
+	public static final JavaClass LONG = new JavaClass("java.lang", "Long", Kind.CLASS);
31
+	public static final JavaClass FLOAT = new JavaClass("java.lang", "Float", Kind.CLASS);
32
+	public static final JavaClass DOUBLE = new JavaClass("java.lang", "Double", Kind.CLASS);
33
+	public static final JavaClass CHARACTER = new JavaClass("java.lang", "Character", Kind.CLASS);
34
+	public static final JavaClass COLLECTION = new JavaClass("java.util", "Collection", Kind.INTERFACE);
24 35
 	
25 36
 	public static JavaClass fromInternalName(String internalName, Kind kind) {
26 37
 		if (kind == Kind.ARRAY)
@@ -45,6 +56,7 @@ public class JavaClass implements Comparable<JavaClass> {
45 56
 	
46 57
 	public boolean empty = false;
47 58
 	public boolean destructible = false;
59
+	public boolean membersPrepared = false;
48 60
 	
49 61
 	private final String[] classNameParts;
50 62
 	

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

@@ -0,0 +1,48 @@
1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.javashared;
7
+
8
+import org.openzen.zenscript.codemodel.FunctionHeader;
9
+import org.openzen.zenscript.codemodel.FunctionParameter;
10
+import org.openzen.zenscript.codemodel.type.ITypeID;
11
+
12
+/**
13
+ *
14
+ * @author Hoofdgebruiker
15
+ */
16
+public abstract class JavaContext {
17
+	public abstract String getDescriptor(ITypeID type);
18
+	
19
+	public String getMethodDescriptor(FunctionHeader header) {
20
+		return getMethodDescriptor(header, false);
21
+	}
22
+	
23
+    public String getMethodSignature(FunctionHeader header) {
24
+        StringBuilder signatureBuilder = new StringBuilder("(");
25
+        for (FunctionParameter parameter : header.parameters) {
26
+            signatureBuilder.append(getDescriptor(parameter.type));
27
+        }
28
+        signatureBuilder.append(")").append(getDescriptor(header.returnType));
29
+        return signatureBuilder.toString();
30
+    }
31
+	
32
+	public String getEnumConstructorDescriptor(FunctionHeader header) {
33
+		return getMethodDescriptor(header, true);
34
+	}
35
+	
36
+	private String getMethodDescriptor(FunctionHeader header, boolean isEnumConstructor) {
37
+        StringBuilder descBuilder = new StringBuilder("(");
38
+        if (isEnumConstructor)
39
+            descBuilder.append("Ljava/lang/String;I");
40
+		
41
+        for (FunctionParameter parameter : header.parameters) {
42
+			descBuilder.append(getDescriptor(parameter.type));
43
+        }
44
+        descBuilder.append(")");
45
+        descBuilder.append(getDescriptor(header.returnType));
46
+        return descBuilder.toString();
47
+    }
48
+}

JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/tags/JavaSourceField.java → JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaField.java View File

@@ -3,20 +3,20 @@
3 3
  * To change this template file, choose Tools | Templates
4 4
  * and open the template in the editor.
5 5
  */
6
-package org.openzen.zenscript.javasource.tags;
7
-
8
-import org.openzen.zenscript.javashared.JavaClass;
6
+package org.openzen.zenscript.javashared;
9 7
 
10 8
 /**
11 9
  *
12 10
  * @author Hoofdgebruiker
13 11
  */
14
-public class JavaSourceField {
12
+public class JavaField {
15 13
 	public final JavaClass cls;
16 14
 	public final String name;
15
+	public final String signature;
17 16
 	
18
-	public JavaSourceField(JavaClass cls, String name) {
17
+	public JavaField(JavaClass cls, String name, String signature) {
19 18
 		this.cls = cls;
20 19
 		this.name = name;
20
+		this.signature = signature;
21 21
 	}
22 22
 }

JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/tags/JavaSourceImplementation.java → JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaImplementation.java View File

@@ -3,19 +3,17 @@
3 3
  * To change this template file, choose Tools | Templates
4 4
  * and open the template in the editor.
5 5
  */
6
-package org.openzen.zenscript.javasource.tags;
7
-
8
-import org.openzen.zenscript.javashared.JavaClass;
6
+package org.openzen.zenscript.javashared;
9 7
 
10 8
 /**
11 9
  *
12 10
  * @author Hoofdgebruiker
13 11
  */
14
-public class JavaSourceImplementation {
12
+public class JavaImplementation {
15 13
 	public final boolean inline;
16 14
 	public final JavaClass implementationClass;
17 15
 	
18
-	public JavaSourceImplementation(boolean inline, JavaClass implementationClass) {
16
+	public JavaImplementation(boolean inline, JavaClass implementationClass) {
19 17
 		this.inline = inline;
20 18
 		this.implementationClass = implementationClass;
21 19
 	}

JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/tags/JavaSourceMethod.java → JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaMethod.java View File

@@ -3,36 +3,41 @@
3 3
  * To change this template file, choose Tools | Templates
4 4
  * and open the template in the editor.
5 5
  */
6
-package org.openzen.zenscript.javasource.tags;
7
-
8
-import org.openzen.zenscript.javashared.JavaClass;
9
-import org.openzen.zenscript.javasource.JavaCallCompiler;
6
+package org.openzen.zenscript.javashared;
10 7
 
11 8
 /**
12 9
  *
13 10
  * @author Hoofdgebruiker
14 11
  */
15
-public class JavaSourceMethod {
12
+public class JavaMethod {
16 13
 	public final JavaClass cls;
17 14
 	public final Kind kind;
18 15
 	public final String name;
19 16
 	public final boolean compile;
20
-	public final JavaCallCompiler compiler;
17
+	public final JavaNativeTranslation translation;
18
+	
19
+	public final String descriptor;
20
+	public final int modifiers;
21 21
 	
22
-	public JavaSourceMethod(JavaClass cls, Kind kind, String name, boolean compile) {
22
+	public JavaMethod(JavaClass cls, Kind kind, String name, boolean compile, String descriptor, int modifiers) {
23 23
 		this.cls = cls;
24 24
 		this.kind = kind;
25 25
 		this.name = name;
26 26
 		this.compile = compile;
27
-		compiler = null;
27
+		translation = null;
28
+		
29
+		this.descriptor = descriptor;
30
+		this.modifiers = modifiers;
28 31
 	}
29 32
 	
30
-	public JavaSourceMethod(JavaCallCompiler compiler) {
33
+	public JavaMethod(JavaNativeTranslation<?> translation) {
31 34
 		this.cls = null;
32 35
 		this.kind = Kind.COMPILED;
33 36
 		this.name = null;
34 37
 		this.compile = false;
35
-		this.compiler = compiler;
38
+		this.translation = translation;
39
+		this.descriptor = "";
40
+		this.modifiers = 0;
36 41
 	}
37 42
 	
38 43
 	public enum Kind {

+ 57
- 0
JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaModifiers.java View File

@@ -0,0 +1,57 @@
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.Modifiers;
9
+
10
+/**
11
+ *
12
+ * @author Hoofdgebruiker
13
+ */
14
+public class JavaModifiers {
15
+	public static final int PUBLIC = 0x0001; // class, field, method
16
+    public static final int PRIVATE = 0x0002; // class, field, method
17
+    public static final int PROTECTED = 0x0004; // class, field, method
18
+    public static final int STATIC = 0x0008; // field, method
19
+    public static final int FINAL = 0x0010; // class, field, method, parameter
20
+    public static final int SUPER = 0x0020; // class
21
+    public static final int SYNCHRONIZED = 0x0020; // method
22
+    public static final int OPEN = 0x0020; // module
23
+    public static final int TRANSITIVE = 0x0020; // module requires
24
+    public static final int VOLATILE = 0x0040; // field
25
+    public static final int BRIDGE = 0x0040; // method
26
+    public static final int STATIC_PHASE = 0x0040; // module requires
27
+    public static final int VARARGS = 0x0080; // method
28
+    public static final int TRANSIENT = 0x0080; // field
29
+    public static final int NATIVE = 0x0100; // method
30
+    public static final int INTERFACE = 0x0200; // class
31
+    public static final int ABSTRACT = 0x0400; // class, method
32
+    public static final int STRICT = 0x0800; // method
33
+    public static final int SYNTHETIC = 0x1000; // class, field, method, parameter, module *
34
+    public static final int ANNOTATION = 0x2000; // class
35
+    public static final int ENUM = 0x4000; // class(?) field inner
36
+    public static final int MANDATED = 0x8000; // parameter, module, module *
37
+    public static final int MODULE = 0x8000; // class
38
+	
39
+	public static int getJavaModifiers(int modifiers) {
40
+		int out = 0;
41
+		if (Modifiers.isStatic(modifiers))
42
+			out |= STATIC;
43
+		if (Modifiers.isFinal(modifiers))
44
+			out |= FINAL;
45
+		if (Modifiers.isPublic(modifiers))
46
+			out |= PUBLIC;
47
+		if (Modifiers.isPrivate(modifiers))
48
+			out |= PRIVATE;
49
+		if (Modifiers.isProtected(modifiers))
50
+			out |= PROTECTED;
51
+		if (Modifiers.isAbstract(modifiers))
52
+			out |= ABSTRACT;
53
+		return out;
54
+	}
55
+	
56
+	private JavaModifiers() {}
57
+}

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

@@ -0,0 +1,44 @@
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.HashMap;
9
+import java.util.Map;
10
+
11
+/**
12
+ *
13
+ * @author Hoofdgebruiker
14
+ */
15
+public class JavaNativeClass {
16
+	public final JavaClass cls;
17
+	private final Map<String, JavaMethod> methods = new HashMap<>();
18
+	public final boolean nonDestructible;
19
+	
20
+	public JavaNativeClass(JavaClass cls) {
21
+		this(cls, false);
22
+	}
23
+	
24
+	public JavaNativeClass(JavaClass cls, boolean nonDestructible) {
25
+		this.cls = cls;
26
+		this.nonDestructible = nonDestructible;
27
+	}
28
+	
29
+	public void addMethod(String key, JavaMethod method) {
30
+		methods.put(key, method);
31
+	}
32
+	
33
+	public void addConstructor(String key, String descriptor) {
34
+		methods.put(key, new JavaMethod(cls, JavaMethod.Kind.CONSTRUCTOR, "<init>", false, descriptor, JavaModifiers.PUBLIC));
35
+	}
36
+	
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));
39
+	}
40
+	
41
+	public JavaMethod getMethod(String name) {
42
+		return methods.get(name);
43
+	}
44
+}

+ 16
- 0
JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaNativeTranslation.java View File

@@ -0,0 +1,16 @@
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.expression.Expression;
9
+
10
+/**
11
+ *
12
+ * @author Hoofdgebruiker
13
+ */
14
+public interface JavaNativeTranslation<T> {
15
+	public T translate(Expression expression, JavaNativeTranslator<T> translator);
16
+}

+ 30
- 0
JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaNativeTranslator.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.expression.CallExpression;
9
+import org.openzen.zenscript.codemodel.expression.CastExpression;
10
+import org.openzen.zenscript.codemodel.expression.Expression;
11
+
12
+/**
13
+ *
14
+ * @author Hoofdgebruiker
15
+ */
16
+public interface JavaNativeTranslator<T> {
17
+	T isEmptyAsLengthZero(Expression value);
18
+	
19
+	T listToArray(CastExpression value);
20
+	
21
+	T containsAsIndexOf(Expression target, Expression value);
22
+	
23
+	T sorted(Expression value);
24
+	
25
+	T sortedWithComparator(Expression value, Expression comparator);
26
+	
27
+	T copy(Expression value);
28
+	
29
+	T copyTo(CallExpression call);
30
+}

JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSynthesizedClass.java → JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaSynthesizedClass.java View File

@@ -3,10 +3,9 @@
3 3
  * To change this template file, choose Tools | Templates
4 4
  * and open the template in the editor.
5 5
  */
6
-package org.openzen.zenscript.javasource;
6
+package org.openzen.zenscript.javashared;
7 7
 
8 8
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
9
-import org.openzen.zenscript.javashared.JavaClass;
10 9
 
11 10
 /**
12 11
  *

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

@@ -0,0 +1,50 @@
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 + "Range";
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
+}

+ 19
- 0
JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaSyntheticClassGenerator.java View File

@@ -0,0 +1,19 @@
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.FunctionTypeID;
9
+import org.openzen.zenscript.codemodel.type.RangeTypeID;
10
+
11
+/**
12
+ *
13
+ * @author Hoofdgebruiker
14
+ */
15
+public interface JavaSyntheticClassGenerator {
16
+	JavaSynthesizedClass synthesizeFunction(FunctionTypeID type);
17
+	
18
+	JavaSynthesizedClass synthesizeRange(RangeTypeID type);
19
+}

JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSyntheticTypeSignatureConverter.java → JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaSyntheticTypeSignatureConverter.java View File

@@ -3,7 +3,7 @@
3 3
  * To change this template file, choose Tools | Templates
4 4
  * and open the template in the editor.
5 5
  */
6
-package org.openzen.zenscript.javasource;
6
+package org.openzen.zenscript.javashared;
7 7
 
8 8
 import java.util.ArrayList;
9 9
 import java.util.HashMap;
@@ -32,7 +32,7 @@ public class JavaSyntheticTypeSignatureConverter implements ITypeVisitor<String>
32 32
 	private static final String[] typeParameterNames = {"T", "U", "V", "W", "X", "Y", "Z"}; // if we have more than this, make it Tx with x the number
33 33
 	private final Map<TypeParameter, String> typeParameters = new HashMap<>();
34 34
 	public final List<TypeParameter> typeParameterList = new ArrayList<>();
35
-
35
+	
36 36
 	@Override
37 37
 	public String visitBasic(BasicTypeID basic) {
38 38
 		switch (basic) {

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

@@ -0,0 +1,121 @@
1
+package org.openzen.zenscript.javashared;
2
+
3
+import org.openzen.zenscript.codemodel.generic.GenericParameterBound;
4
+import org.openzen.zenscript.codemodel.generic.ParameterTypeBound;
5
+import org.openzen.zenscript.codemodel.type.*;
6
+
7
+public class JavaTypeDescriptorVisitor implements ITypeVisitor<String> {
8
+	private final JavaTypeDescriptorVisitor forOptional;
9
+	private final JavaSyntheticClassGenerator generator;
10
+	private final boolean optional;
11
+	
12
+	public JavaTypeDescriptorVisitor(JavaSyntheticClassGenerator generator) {
13
+		this(generator, false);
14
+	}
15
+	
16
+	private JavaTypeDescriptorVisitor(JavaSyntheticClassGenerator generator, boolean optional) {
17
+		this.optional = optional;
18
+		this.generator = generator;
19
+		forOptional = optional ? this : new JavaTypeDescriptorVisitor(generator, true);
20
+	}
21
+	
22
+    @Override
23
+    public String visitBasic(BasicTypeID basic) {
24
+		if (optional) {
25
+			switch (basic) {
26
+				case BOOL: return "Ljava/lang/Boolean;";
27
+				case CHAR: return "Ljava/lang/Character;";
28
+				case BYTE: return "Ljava/lang/Integer;";
29
+				case SBYTE: return "Ljava/lang/Byte;";
30
+				case SHORT: return "Ljava/lang/Short;";
31
+				case USHORT: return "Ljava/lang/Integer;";
32
+				case INT: return "Ljava/lang/Integer;";
33
+				case UINT: return "Ljava/lang/Integer;";
34
+				case LONG: return "Ljava/lang/Long;";
35
+				case ULONG: return "Ljava/lang/Long;";
36
+				case FLOAT: return "Ljava/lang/Float;";
37
+				case DOUBLE: return "Ljava/lang/Double;";
38
+				case STRING: return "Ljava/lang/String;";
39
+				default:
40
+					throw new IllegalArgumentException("Not a valid type: " + basic);
41
+			}
42
+		} else {
43
+			switch (basic) {
44
+				case VOID: return "V";
45
+				case BOOL: return "Z";
46
+				case CHAR: return "C";
47
+				case BYTE: return "I";
48
+				case SBYTE: return "B";
49
+				case SHORT: return "S";
50
+				case USHORT: return "I";
51
+				case INT: return "I";
52
+				case UINT: return "I";
53
+				case LONG: return "J";
54
+				case ULONG: return "J";
55
+				case FLOAT: return "F";
56
+				case DOUBLE: return "D";
57
+				case STRING: return "Ljava/lang/String;";
58
+				default:
59
+					throw new IllegalArgumentException("Not a valid type: " + basic);
60
+			}
61
+		}
62
+    }
63
+
64
+    @Override
65
+    public String visitArray(ArrayTypeID array) {
66
+		return "[" + array.elementType.accept(this);
67
+    }
68
+
69
+    @Override
70
+    public String visitAssoc(AssocTypeID assoc) {
71
+		return "Ljava/util/Map;";
72
+    }
73
+
74
+    @Override
75
+    public String visitIterator(IteratorTypeID iterator) {
76
+		return "Ljava/lang/Iterator;";
77
+    }
78
+
79
+    @Override
80
+    public String visitFunction(FunctionTypeID function) {
81
+        return "L" + generator.synthesizeFunction(function).cls.internalName + ";";
82
+    }
83
+
84
+    @Override
85
+    public String visitDefinition(DefinitionTypeID definition) {
86
+		JavaClass cls = definition.definition.getTag(JavaClass.class);
87
+		if (cls == null)
88
+			throw new IllegalStateException("Class not yet initialized: " + definition.definition.name);
89
+		
90
+		return "L" + cls.internalName + ";";
91
+    }
92
+
93
+    @Override
94
+    public String visitGeneric(GenericTypeID generic) {
95
+		for (GenericParameterBound bound : generic.parameter.bounds) {
96
+			if (bound instanceof ParameterTypeBound) {
97
+				return ((ParameterTypeBound) bound).type.accept(this);
98
+			}
99
+		}
100
+		
101
+		return "Ljava/lang/Object;";
102
+    }
103
+
104
+    @Override
105
+    public String visitRange(RangeTypeID range) {
106
+		return "L" + generator.synthesizeRange(range).cls.internalName + ";";
107
+    }
108
+
109
+    @Override
110
+    public String visitModified(ModifiedTypeID modified) {
111
+		if (modified.isOptional())
112
+			return modified.withoutOptional().accept(forOptional);
113
+		
114
+		return modified.baseType.accept(this);
115
+    }
116
+
117
+	@Override
118
+	public String visitGenericMap(GenericMapTypeID map) {
119
+		return "Ljava/util/Map;";
120
+	}
121
+}

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

@@ -0,0 +1,117 @@
1
+package org.openzen.zenscript.javashared;
2
+
3
+import org.openzen.zenscript.codemodel.generic.GenericParameterBound;
4
+import org.openzen.zenscript.codemodel.generic.ParameterTypeBound;
5
+import org.openzen.zenscript.codemodel.type.*;
6
+
7
+public class JavaTypeInternalNameVisitor implements ITypeVisitor<String> {
8
+	private final JavaTypeInternalNameVisitor forOptional;
9
+	private final JavaSyntheticClassGenerator generator;
10
+	private final boolean optional;
11
+	
12
+	public JavaTypeInternalNameVisitor(JavaSyntheticClassGenerator generator) {
13
+		this(generator, false);
14
+	}
15
+	
16
+	private JavaTypeInternalNameVisitor(JavaSyntheticClassGenerator generator, boolean optional) {
17
+		this.optional = optional;
18
+		this.generator = generator;
19
+		forOptional = optional ? this : new JavaTypeInternalNameVisitor(generator, true);
20
+	}
21
+	
22
+    @Override
23
+    public String visitBasic(BasicTypeID basic) {
24
+		if (optional) {
25
+			switch (basic) {
26
+				case BOOL: return "java/lang/Boolean";
27
+				case CHAR: return "java/lang/Character";
28
+				case BYTE: return "java/lang/Integer";
29
+				case SBYTE: return "java/lang/Byte";
30
+				case SHORT: return "java/lang/Short";
31
+				case USHORT: return "java/lang/Integer";
32
+				case INT: return "java/lang/Integer";
33
+				case UINT: return "java/lang/Integer";
34
+				case LONG: return "java/lang/Long";
35
+				case ULONG: return "java/lang/Long";
36
+				case FLOAT: return "java/lang/Float";
37
+				case DOUBLE: return "java/lang/Double";
38
+				case STRING: return "java/lang/String";
39
+				default:
40
+					throw new IllegalArgumentException("Not a valid type: " + basic);
41
+			}
42
+		} else {
43
+			switch (basic) {
44
+				case VOID: return "V";
45
+				case BOOL: return "Z";
46
+				case CHAR: return "C";
47
+				case BYTE: return "I";
48
+				case SBYTE: return "B";
49
+				case SHORT: return "S";
50
+				case USHORT: return "I";
51
+				case INT: return "I";
52
+				case UINT: return "I";
53
+				case LONG: return "J";
54
+				case ULONG: return "J";
55
+				case FLOAT: return "F";
56
+				case DOUBLE: return "D";
57
+				case STRING: return "java/lang/String";
58
+				default:
59
+					throw new IllegalArgumentException("Not a valid type: " + basic);
60
+			}
61
+		}
62
+    }
63
+
64
+    @Override
65
+    public String visitArray(ArrayTypeID array) {
66
+		return "[" + array.elementType.accept(this);
67
+    }
68
+
69
+    @Override
70
+    public String visitAssoc(AssocTypeID assoc) {
71
+		return "java/util/Map;";
72
+    }
73
+
74
+    @Override
75
+    public String visitIterator(IteratorTypeID iterator) {
76
+		return "java/lang/Iterator;";
77
+    }
78
+
79
+    @Override
80
+    public String visitFunction(FunctionTypeID function) {
81
+        return generator.synthesizeFunction(function).cls.internalName;
82
+    }
83
+
84
+    @Override
85
+    public String visitDefinition(DefinitionTypeID definition) {
86
+		return definition.definition.getTag(JavaClass.class).internalName;
87
+    }
88
+
89
+    @Override
90
+    public String visitGeneric(GenericTypeID generic) {
91
+		for (GenericParameterBound bound : generic.parameter.bounds) {
92
+			if (bound instanceof ParameterTypeBound) {
93
+				return ((ParameterTypeBound) bound).type.accept(this);
94
+			}
95
+		}
96
+		
97
+		return "java/lang/Object";
98
+    }
99
+
100
+    @Override
101
+    public String visitRange(RangeTypeID range) {
102
+		return generator.synthesizeRange(range).cls.internalName;
103
+    }
104
+
105
+    @Override
106
+    public String visitModified(ModifiedTypeID modified) {
107
+		if (modified.isOptional())
108
+			return modified.withoutOptional().accept(forOptional);
109
+		
110
+		return modified.baseType.accept(this);
111
+    }
112
+
113
+	@Override
114
+	public String visitGenericMap(GenericMapTypeID map) {
115
+		return "java/util/Map";
116
+	}
117
+}

JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceTypeNameVisitor.java → JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaTypeNameVisitor.java View File

@@ -3,7 +3,7 @@
3 3
  * To change this template file, choose Tools | Templates
4 4
  * and open the template in the editor.
5 5
  */
6
-package org.openzen.zenscript.javasource;
6
+package org.openzen.zenscript.javashared;
7 7
 
8 8
 import org.openzen.zenscript.codemodel.FunctionParameter;
9 9
 import org.openzen.zenscript.codemodel.type.ArrayTypeID;
@@ -22,8 +22,8 @@ import org.openzen.zenscript.codemodel.type.RangeTypeID;
22 22
  *
23 23
  * @author Hoofdgebruiker
24 24
  */
25
-public class JavaSourceTypeNameVisitor implements ITypeVisitor<String> {
26
-	public JavaSourceTypeNameVisitor() {}
25
+public class JavaTypeNameVisitor implements ITypeVisitor<String> {
26
+	public JavaTypeNameVisitor() {}
27 27
 
28 28
 	@Override
29 29
 	public String visitBasic(BasicTypeID basic) {

JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/tags/JavaSourceVariantOption.java → JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaVariantOption.java View File

@@ -3,19 +3,17 @@
3 3
  * To change this template file, choose Tools | Templates
4 4
  * and open the template in the editor.
5 5
  */
6
-package org.openzen.zenscript.javasource.tags;
7
-
8
-import org.openzen.zenscript.javashared.JavaClass;
6
+package org.openzen.zenscript.javashared;
9 7
 
10 8
 /**
11 9
  *
12 10
  * @author Hoofdgebruiker
13 11
  */
14
-public class JavaSourceVariantOption {
12
+public class JavaVariantOption {
15 13
 	public final JavaClass variantClass;
16 14
 	public final JavaClass variantOptionClass;
17 15
 	
18
-	public JavaSourceVariantOption(JavaClass variantClass, JavaClass variantOptionClass) {
16
+	public JavaVariantOption(JavaClass variantClass, JavaClass variantOptionClass) {
19 17
 		this.variantClass = variantClass;
20 18
 		this.variantOptionClass = variantOptionClass;
21 19
 	}

JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/prepare/JavaSourcePrepareClassMethodVisitor.java → JavaShared/src/main/java/org/openzen/zenscript/javashared/prepare/JavaPrepareClassMethodVisitor.java View File

@@ -3,8 +3,9 @@
3 3
  * To change this template file, choose Tools | Templates
4 4
  * and open the template in the editor.
5 5
  */
6
-package org.openzen.zenscript.javasource.prepare;
6
+package org.openzen.zenscript.javashared.prepare;
7 7
 
8
+import org.openzen.zenscript.javashared.JavaNativeClass;
8 9
 import org.openzen.zencode.shared.StringExpansion;
9 10
 import org.openzen.zenscript.codemodel.OperatorType;
10 11
 import org.openzen.zenscript.codemodel.annotations.NativeTag;
@@ -16,6 +17,7 @@ import org.openzen.zenscript.codemodel.member.CustomIteratorMember;
16 17
 import org.openzen.zenscript.codemodel.member.DefinitionMember;
17 18
 import org.openzen.zenscript.codemodel.member.DestructorMember;
18 19
 import org.openzen.zenscript.codemodel.member.FieldMember;
20
+import org.openzen.zenscript.codemodel.member.FunctionalMember;
19 21
 import org.openzen.zenscript.codemodel.member.GetterMember;
20 22
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
21 23
 import org.openzen.zenscript.codemodel.member.ImplementationMember;
@@ -26,34 +28,39 @@ import org.openzen.zenscript.codemodel.member.OperatorMember;
26 28
 import org.openzen.zenscript.codemodel.member.SetterMember;
27 29
 import org.openzen.zenscript.codemodel.member.StaticInitializerMember;
28 30
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
29
-import org.openzen.zenscript.javasource.JavaSourceTypeNameVisitor;
31
+import org.openzen.zenscript.javashared.JavaTypeNameVisitor;
30 32
 import org.openzen.zenscript.javashared.JavaClass;
31
-import org.openzen.zenscript.javasource.tags.JavaSourceField;
32
-import org.openzen.zenscript.javasource.tags.JavaSourceImplementation;
33
-import org.openzen.zenscript.javasource.tags.JavaSourceMethod;
33
+import org.openzen.zenscript.javashared.JavaField;
34
+import org.openzen.zenscript.javashared.JavaContext;
35
+import org.openzen.zenscript.javashared.JavaImplementation;
36
+import org.openzen.zenscript.javashared.JavaMethod;
37
+import org.openzen.zenscript.javashared.JavaModifiers;
34 38
 
35 39
 /**
36 40
  *
37 41
  * @author Hoofdgebruiker
38 42
  */
39
-public class JavaSourcePrepareClassMethodVisitor implements MemberVisitor<Void> {
43
+public class JavaPrepareClassMethodVisitor implements MemberVisitor<Void> {
40 44
 	private static final boolean DEBUG_EMPTY = true;
41 45
 	
42
-	private final JavaSourcePrepareDefinitionVisitor definitionPreparer;
46
+	private final JavaContext context;
43 47
 	private final String filename;
44 48
 	private final JavaClass cls;
45 49
 	private final JavaNativeClass nativeClass;
50
+	private final JavaPrepareDefinitionMemberVisitor memberPreparer;
46 51
 	
47
-	public JavaSourcePrepareClassMethodVisitor(
48
-			JavaSourcePrepareDefinitionVisitor definitionPreparer,
52
+	public JavaPrepareClassMethodVisitor(
53
+			JavaContext context,
49 54
 			String filename,
50 55
 			JavaClass cls,
51 56
 			JavaNativeClass nativeClass,
57
+			JavaPrepareDefinitionMemberVisitor memberPreparer,
52 58
 			boolean startsEmpty) {
53
-		this.definitionPreparer = definitionPreparer;
59
+		this.context = context;
54 60
 		this.filename = filename;
55 61
 		this.cls = cls;
56 62
 		this.nativeClass = nativeClass;
63
+		this.memberPreparer = memberPreparer;
57 64
 		
58 65
 		cls.empty = startsEmpty;
59 66
 	}
@@ -64,13 +71,13 @@ public class JavaSourcePrepareClassMethodVisitor implements MemberVisitor<Void>
64 71
 			System.out.println("Class " + cls.fullName + " not empty because of const " + member.name);
65 72
 		
66 73
 		cls.empty = false;
67
-		member.setTag(JavaSourceField.class, new JavaSourceField(cls, member.name));
74
+		member.setTag(JavaField.class, new JavaField(cls, member.name, context.getDescriptor(member.type)));
68 75
 		return null;
69 76
 	}
70 77
 	
71 78
 	@Override
72 79
 	public Void visitField(FieldMember member) {
73
-		member.setTag(JavaSourceField.class, new JavaSourceField(cls, member.name));
80
+		member.setTag(JavaField.class, new JavaField(cls, member.name, context.getDescriptor(member.type)));
74 81
 		if (member.hasAutoGetter())
75 82
 			visitGetter(member.autoGetter);
76 83
 		if (member.hasAutoSetter())
@@ -120,7 +127,7 @@ public class JavaSourcePrepareClassMethodVisitor implements MemberVisitor<Void>
120 127
 
121 128
 	@Override
122 129
 	public Void visitCaster(CasterMember member) {
123
-		visitFunctional(member, "to" + member.toType.accept(new JavaSourceTypeNameVisitor()));
130
+		visitFunctional(member, "to" + member.toType.accept(new JavaTypeNameVisitor()));
124 131
 		return null;
125 132
 	}
126 133
 
@@ -138,10 +145,10 @@ public class JavaSourcePrepareClassMethodVisitor implements MemberVisitor<Void>
138 145
 
139 146
 	@Override
140 147
 	public Void visitImplementation(ImplementationMember member) {
141
-		definitionPreparer.prepare(member.type);
148
+		memberPreparer.prepare(member.type);
142 149
 		
143 150
 		if (canMergeImplementation(member)) {
144
-			member.setTag(JavaSourceImplementation.class, new JavaSourceImplementation(true, cls));
151
+			member.setTag(JavaImplementation.class, new JavaImplementation(true, cls));
145 152
 			for (IDefinitionMember m : member.members)
146 153
 				m.accept(this);
147 154
 		} else {
@@ -150,10 +157,10 @@ public class JavaSourcePrepareClassMethodVisitor implements MemberVisitor<Void>
150 157
 			
151 158
 			cls.empty = false;
152 159
 			
153
-			JavaClass implementationClass = new JavaClass(cls, member.type.accept(new JavaSourceTypeNameVisitor()) + "Implementation", JavaClass.Kind.CLASS);
154
-			member.setTag(JavaSourceImplementation.class, new JavaSourceImplementation(false, implementationClass));
160
+			JavaClass implementationClass = new JavaClass(cls, member.type.accept(new JavaTypeNameVisitor()) + "Implementation", JavaClass.Kind.CLASS);
161
+			member.setTag(JavaImplementation.class, new JavaImplementation(false, implementationClass));
155 162
 			
156
-			JavaSourcePrepareClassMethodVisitor visitor = new JavaSourcePrepareClassMethodVisitor(definitionPreparer, filename, implementationClass, null, true);
163
+			JavaPrepareClassMethodVisitor visitor = new JavaPrepareClassMethodVisitor(context, filename, implementationClass, null, memberPreparer, true);
157 164
 			for (IDefinitionMember m : member.members)
158 165
 				m.accept(visitor);
159 166
 		}
@@ -166,7 +173,7 @@ public class JavaSourcePrepareClassMethodVisitor implements MemberVisitor<Void>
166 173
 
167 174
 	@Override
168 175
 	public Void visitInnerDefinition(InnerDefinitionMember member) {
169
-		JavaSourcePrepareDefinitionVisitor innerDefinitionPrepare = new JavaSourcePrepareDefinitionVisitor(filename, cls);
176
+		JavaPrepareDefinitionMemberVisitor innerDefinitionPrepare = new JavaPrepareDefinitionMemberVisitor(context, filename);
170 177
 		member.innerDefinition.accept(innerDefinitionPrepare);
171 178
 		
172 179
 		if (DEBUG_EMPTY && cls.empty)
@@ -184,11 +191,11 @@ public class JavaSourcePrepareClassMethodVisitor implements MemberVisitor<Void>
184 191
 		return null;
185 192
 	}
186 193
 	
187
-	private JavaSourceMethod.Kind getKind(DefinitionMember member) {
194
+	private JavaMethod.Kind getKind(DefinitionMember member) {
188 195
 		if (member instanceof ConstructorMember)
189
-			return JavaSourceMethod.Kind.CONSTRUCTOR;
196
+			return JavaMethod.Kind.CONSTRUCTOR;
190 197
 		
191
-		return member.isStatic() ? JavaSourceMethod.Kind.STATIC : JavaSourceMethod.Kind.INSTANCE;
198
+		return member.isStatic() ? JavaMethod.Kind.STATIC : JavaMethod.Kind.INSTANCE;
192 199
 	}
193 200
 	
194 201
 	private String getOperatorName(OperatorType operator) {
@@ -274,21 +281,21 @@ public class JavaSourcePrepareClassMethodVisitor implements MemberVisitor<Void>
274 281
 		}
275 282
 	}
276 283
 	
277
-	private void visitFunctional(DefinitionMember member, String name) {
284
+	private void visitFunctional(FunctionalMember member, String name) {
278 285
 		NativeTag nativeTag = member.getTag(NativeTag.class);
279
-		JavaSourceMethod method = null;
286
+		JavaMethod method = null;
280 287
 		if (nativeTag != null && nativeClass != null)
281 288
 			method = nativeClass.getMethod(nativeTag.value);
282 289
 		
283 290
 		if (member.getOverrides() != null) {
284 291
 			DefinitionMemberRef base = member.getOverrides();
285
-			JavaSourceMethod baseMethod = base.getTarget().getTag(JavaSourceMethod.class);
292
+			JavaMethod baseMethod = base.getTarget().getTag(JavaMethod.class);
286 293
 			if (baseMethod == null)
287 294
 				throw new IllegalStateException("Base method not yet prepared!");
288 295
 			
289
-			method = new JavaSourceMethod(cls, baseMethod.kind, baseMethod.name, true);
296
+			method = new JavaMethod(cls, baseMethod.kind, baseMethod.name, true, context.getMethodDescriptor(member.header), JavaModifiers.getJavaModifiers(member.modifiers));
290 297
 		} else if (method == null) {
291
-			method = new JavaSourceMethod(cls, getKind(member), name, true);
298
+			method = new JavaMethod(cls, getKind(member), name, true, context.getMethodDescriptor(member.header), JavaModifiers.getJavaModifiers(member.modifiers));
292 299
 		}
293 300
 		
294 301
 		if (method.compile) {
@@ -298,6 +305,6 @@ public class JavaSourcePrepareClassMethodVisitor implements MemberVisitor<Void>
298 305
 			cls.empty = false;
299 306
 		}
300 307
 		
301
-		member.setTag(JavaSourceMethod.class, method);
308
+		member.setTag(JavaMethod.class, method);
302 309
 	}
303 310
 }

+ 156
- 0
JavaShared/src/main/java/org/openzen/zenscript/javashared/prepare/JavaPrepareDefinitionMemberVisitor.java View File

@@ -0,0 +1,156 @@
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.prepare;
7
+
8
+import org.openzen.zenscript.javashared.JavaNativeClass;
9
+import org.openzen.zenscript.codemodel.HighLevelDefinition;
10
+import org.openzen.zenscript.codemodel.definition.AliasDefinition;
11
+import org.openzen.zenscript.codemodel.definition.ClassDefinition;
12
+import org.openzen.zenscript.codemodel.definition.DefinitionVisitor;
13
+import org.openzen.zenscript.codemodel.definition.EnumDefinition;
14
+import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
15
+import org.openzen.zenscript.codemodel.definition.FunctionDefinition;
16
+import org.openzen.zenscript.codemodel.definition.InterfaceDefinition;
17
+import org.openzen.zenscript.codemodel.definition.StructDefinition;
18
+import org.openzen.zenscript.codemodel.definition.VariantDefinition;
19
+import org.openzen.zenscript.codemodel.member.IDefinitionMember;
20
+import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
21
+import org.openzen.zenscript.codemodel.type.ITypeID;
22
+import org.openzen.zenscript.javashared.JavaClass;
23
+import org.openzen.zenscript.javashared.JavaContext;
24
+import org.openzen.zenscript.javashared.JavaMethod;
25
+import org.openzen.zenscript.javashared.JavaModifiers;
26
+
27
+/**
28
+ *
29
+ * @author Hoofdgebruiker
30
+ */
31
+public class JavaPrepareDefinitionMemberVisitor implements DefinitionVisitor<JavaClass> {
32
+	private final JavaContext context;
33
+	private final String filename;
34
+	
35
+	public JavaPrepareDefinitionMemberVisitor(JavaContext context, String filename) {
36
+		this.context = context;
37
+		this.filename = filename;
38
+	}
39
+	
40
+	private boolean isPrepared(HighLevelDefinition definition) {
41
+		return definition.getTag(JavaClass.class).membersPrepared;
42
+	}
43
+	
44
+	public void prepare(ITypeID type) {
45
+		if (!(type instanceof DefinitionTypeID))
46
+			return;
47
+			
48
+		HighLevelDefinition definition = ((DefinitionTypeID)type).definition;
49
+		definition.accept(this);
50
+	}
51
+	
52
+	@Override
53
+	public JavaClass visitClass(ClassDefinition definition) {
54
+		if (isPrepared(definition))
55
+			return definition.getTag(JavaClass.class);
56
+		
57
+		return visitClassCompiled(definition, true, JavaClass.Kind.CLASS);
58
+	}
59
+
60
+	@Override
61
+	public JavaClass visitInterface(InterfaceDefinition definition) {
62
+		if (isPrepared(definition))
63
+			return definition.getTag(JavaClass.class);
64
+		
65
+		for (ITypeID baseType : definition.baseInterfaces)
66
+			prepare(baseType);
67
+		
68
+		return visitClassCompiled(definition, true, JavaClass.Kind.INTERFACE);
69
+	}
70
+
71
+	@Override
72
+	public JavaClass visitEnum(EnumDefinition definition) {
73
+		if (isPrepared(definition))
74
+			return definition.getTag(JavaClass.class);
75
+		
76
+		return visitClassCompiled(definition, false, JavaClass.Kind.ENUM);
77
+	}
78
+
79
+	@Override
80
+	public JavaClass visitStruct(StructDefinition definition) {
81
+		if (isPrepared(definition))
82
+			return definition.getTag(JavaClass.class);
83
+		
84
+		return visitClassCompiled(definition, true, JavaClass.Kind.CLASS);
85
+	}
86
+
87
+	@Override
88
+	public JavaClass visitFunction(FunctionDefinition definition) {
89
+		if (isPrepared(definition))
90
+			return definition.getTag(JavaClass.class);
91
+		
92
+		JavaClass cls = definition.getTag(JavaClass.class);
93
+		JavaMethod method = new JavaMethod(cls, JavaMethod.Kind.STATIC, definition.name, true, context.getMethodDescriptor(definition.header), JavaModifiers.getJavaModifiers(definition.modifiers));
94
+		definition.caller.setTag(JavaMethod.class, method);
95
+		return cls;
96
+	}
97
+
98
+	@Override
99
+	public JavaClass visitExpansion(ExpansionDefinition definition) {
100
+		if (isPrepared(definition))
101
+			return definition.getTag(JavaClass.class);
102
+		
103
+		JavaNativeClass nativeClass = definition.getTag(JavaNativeClass.class);
104
+		JavaClass cls = definition.getTag(JavaClass.class);
105
+		visitExpansionMembers(definition, cls, nativeClass);
106
+		return cls;
107
+	}
108
+
109
+	@Override
110
+	public JavaClass visitAlias(AliasDefinition definition) {
111
+		// nothing to do
112
+		return null;
113
+	}
114
+
115
+	@Override
116
+	public JavaClass visitVariant(VariantDefinition variant) {
117
+		if (isPrepared(variant))
118
+			return variant.getTag(JavaClass.class);
119
+		
120
+		JavaClass cls = variant.getTag(JavaClass.class);
121
+		visitClassMembers(variant, cls, null, false);
122
+		return cls;
123
+	}
124
+	
125
+	private JavaClass visitClassCompiled(HighLevelDefinition definition, boolean startsEmpty, JavaClass.Kind kind) {
126
+		if (definition.getSuperType() != null)
127
+			prepare(definition.getSuperType());
128
+		
129
+		JavaNativeClass nativeClass = definition.getTag(JavaNativeClass.class);
130
+		JavaClass cls = definition.getTag(JavaClass.class);
131
+		if (nativeClass == null) {
132
+			visitClassMembers(definition, cls, null, startsEmpty);
133
+		} else {
134
+			visitExpansionMembers(definition, cls, nativeClass);
135
+		}
136
+		return cls;
137
+	}
138
+	
139
+	private void visitClassMembers(HighLevelDefinition definition, JavaClass cls, JavaNativeClass nativeClass, boolean startsEmpty) {
140
+		System.out.println("Preparing " + cls.internalName);
141
+		JavaPrepareClassMethodVisitor methodVisitor = new JavaPrepareClassMethodVisitor(context, filename, cls, nativeClass, this, startsEmpty);
142
+		for (IDefinitionMember member : definition.members) {
143
+			member.accept(methodVisitor);
144
+		}
145
+		cls.membersPrepared = true;
146
+	}
147
+	
148
+	private void visitExpansionMembers(HighLevelDefinition definition, JavaClass cls, JavaNativeClass nativeClass) {
149
+		System.out.println("Preparing " + cls.internalName);
150
+		JavaPrepareExpansionMethodVisitor methodVisitor = new JavaPrepareExpansionMethodVisitor(context, cls, nativeClass);
151
+		for (IDefinitionMember member : definition.members) {
152
+			member.accept(methodVisitor);
153
+		}
154
+		cls.membersPrepared = true;
155
+	}
156
+}

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

@@ -0,0 +1,324 @@
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.prepare;
7
+
8
+import org.openzen.zenscript.javashared.JavaNativeClass;
9
+import java.util.HashMap;
10
+import java.util.List;
11
+import java.util.Map;
12
+import org.openzen.zenscript.codemodel.HighLevelDefinition;
13
+import org.openzen.zenscript.codemodel.annotations.NativeTag;
14
+import org.openzen.zenscript.codemodel.definition.AliasDefinition;
15
+import org.openzen.zenscript.codemodel.definition.ClassDefinition;
16
+import org.openzen.zenscript.codemodel.definition.DefinitionVisitor;
17
+import org.openzen.zenscript.codemodel.definition.EnumDefinition;
18
+import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
19
+import org.openzen.zenscript.codemodel.definition.FunctionDefinition;
20
+import org.openzen.zenscript.codemodel.definition.InterfaceDefinition;
21
+import org.openzen.zenscript.codemodel.definition.StructDefinition;
22
+import org.openzen.zenscript.codemodel.definition.VariantDefinition;
23
+import org.openzen.zenscript.codemodel.expression.CallExpression;
24
+import org.openzen.zenscript.codemodel.expression.CastExpression;
25
+import org.openzen.zenscript.codemodel.expression.Expression;
26
+import org.openzen.zenscript.codemodel.member.IDefinitionMember;
27
+import org.openzen.zenscript.codemodel.member.InnerDefinitionMember;
28
+import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
29
+import org.openzen.zenscript.codemodel.type.ITypeID;
30
+import org.openzen.zenscript.javashared.JavaClass;
31
+import org.openzen.zenscript.javashared.JavaMethod;
32
+import org.openzen.zenscript.javashared.JavaModifiers;
33
+import org.openzen.zenscript.javashared.JavaVariantOption;
34
+
35
+/**
36
+ *
37
+ * @author Hoofdgebruiker
38
+ */
39
+public class JavaPrepareDefinitionVisitor implements DefinitionVisitor<JavaClass> {
40
+	private static final Map<String, JavaNativeClass> nativeClasses = new HashMap<>();
41
+	
42
+	static {
43
+		{
44
+			JavaNativeClass cls = new JavaNativeClass(new JavaClass("java.lang", "StringBuilder", JavaClass.Kind.CLASS));
45
+			cls.addConstructor("constructor", "()V");
46
+			cls.addConstructor("constructorWithCapacity", "(I)V");
47
+			cls.addConstructor("constructorWithValue", "(Ljava/lang/String;)V");
48
+			cls.addMethod("isEmpty", new JavaMethod((expression, translator) -> translator.isEmptyAsLengthZero(((CallExpression)expression).target)));
49
+			cls.addInstanceMethod("length", "length", "()I");
50
+			cls.addInstanceMethod("appendBool", "append", "(Z)Ljava/lang/StringBuilder;");
51
+			cls.addInstanceMethod("appendByte", "append", "(I)Ljava/lang/StringBuilder;");
52
+			cls.addInstanceMethod("appendSByte", "append", "(B)Ljava/lang/StringBuilder;");
53
+			cls.addInstanceMethod("appendShort", "append", "(S)Ljava/lang/StringBuilder;");
54
+			cls.addInstanceMethod("appendUShort", "append", "(I)Ljava/lang/StringBuilder;");
55
+			cls.addInstanceMethod("appendInt", "append", "(I)Ljava/lang/StringBuilder;");
56
+			cls.addInstanceMethod("appendUInt", "append", "(I)Ljava/lang/StringBuilder;");
57
+			cls.addInstanceMethod("appendLong", "append", "(J)Ljava/lang/StringBuilder;");
58
+			cls.addInstanceMethod("appendULong", "append", "(J)Ljava/lang/StringBuilder;");
59
+			cls.addInstanceMethod("appendFloat", "append", "(F)Ljava/lang/StringBuilder;");
60
+			cls.addInstanceMethod("appendDouble", "append", "(D)Ljava/lang/StringBuilder;");
61
+			cls.addInstanceMethod("appendChar", "append", "(C)Ljava/lang/StringBuilder;");
62
+			cls.addInstanceMethod("appendString", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;");
63
+			cls.addInstanceMethod("asString", "toString", "()Ljava/lang/String;");
64
+			nativeClasses.put("stdlib::StringBuilder", cls);
65
+		}
66
+		
67
+		{
68
+			JavaNativeClass list = new JavaNativeClass(new JavaClass("java.util", "List", JavaClass.Kind.INTERFACE));
69
+			JavaClass arrayList = new JavaClass("java.util", "ArrayList", JavaClass.Kind.CLASS);
70
+			list.addMethod("constructor", new JavaMethod(arrayList, JavaMethod.Kind.CONSTRUCTOR, "", false, "()V", JavaModifiers.PUBLIC));
71
+			list.addInstanceMethod("add", "add", "(Ljava/lang/Object;)Z"); List<?> l;
72
+			list.addInstanceMethod("insert", "add", "(Ljava/lang/Object;I)V");
73
+			list.addInstanceMethod("remove", "remove", "(java/lang/Object;)Z");
74
+			list.addInstanceMethod("indexOf", "indexOf", "(java/lang/Object;)I");
75
+			list.addInstanceMethod("lastIndexOf", "lastIndexOf", "(Ljava/lang/Object;)I");
76
+			list.addInstanceMethod("getAtIndex", "get", "(I)Ljava/lang/Object;");
77
+			list.addInstanceMethod("setAtIndex", "set", "(ILjava/lang/Object;)Ljava/lang/Object;");
78
+			list.addInstanceMethod("contains", "contains", "(Ljava/lang/Object;)Z");
79
+			list.addMethod("toArray", new JavaMethod((expression, translator) -> translator.listToArray((CastExpression)expression)));
80
+			list.addInstanceMethod("length", "size", "()I");
81
+			list.addInstanceMethod("isEmpty", "isEmpty", "()Z");
82
+			list.addInstanceMethod("iterate", "iterator", "()Ljava/util/Iterator;");
83
+			nativeClasses.put("stdlib::List", list);
84
+		}
85
+		
86
+		{
87
+			JavaNativeClass iterable = new JavaNativeClass(new JavaClass("java.lang", "Iterable", JavaClass.Kind.INTERFACE));
88
+			iterable.addInstanceMethod("iterate", "iterator", "()Ljava/util/Iterator;");
89
+			nativeClasses.put("stdlib::Iterable", iterable);
90
+		}
91
+		
92
+		{
93
+			JavaNativeClass iterator = new JavaNativeClass(JavaClass.ITERATOR);
94
+			iterator.addInstanceMethod("hasNext", "hasNext", "()Z");
95
+			iterator.addInstanceMethod("next", "next", "()Ljava/lang/Object;");
96
+			nativeClasses.put("stdlib::Iterator", iterator);
97
+		}
98
+		
99
+		{
100
+			JavaNativeClass comparable = new JavaNativeClass(new JavaClass("java.lang", "Comparable", JavaClass.Kind.INTERFACE));
101
+			comparable.addInstanceMethod("compareTo", "compareTo", "(Ljava/lang/Object;)I");
102
+			nativeClasses.put("stdlib::Comparable", comparable);
103
+		}
104
+		
105
+		{
106
+			JavaClass integer = new JavaClass("java.lang", "Integer", JavaClass.Kind.CLASS);
107
+			JavaClass math = new JavaClass("java.lang", "Math", JavaClass.Kind.CLASS);
108
+			
109
+			JavaNativeClass cls = new JavaNativeClass(integer);
110
+			cls.addMethod("min", new JavaMethod(math, JavaMethod.Kind.STATIC, "min", false, "(II)I", JavaModifiers.PUBLIC | JavaModifiers.STATIC));
111
+			cls.addMethod("max", new JavaMethod(math, JavaMethod.Kind.STATIC, "max", false, "(II)I", JavaModifiers.PUBLIC | JavaModifiers.STATIC));
112
+			cls.addMethod("toHexString", new JavaMethod(integer, JavaMethod.Kind.EXPANSION, "toHexString", false, "()Ljava/lang/String;", JavaModifiers.PUBLIC | JavaModifiers.STATIC));
113
+			nativeClasses.put("stdlib::Integer", cls);
114
+		}
115
+		
116
+		{
117
+			JavaNativeClass cls = new JavaNativeClass(new JavaClass("java.lang", "String", JavaClass.Kind.CLASS));
118
+			cls.addMethod("contains", new JavaMethod((expression, translator) -> {
119
+				CallExpression call = (CallExpression)expression;
120
+				Expression str = call.target;
121
+				Expression character = call.arguments.arguments[0];
122
+				return translator.containsAsIndexOf(str, character);
123
+			}));
124
+			cls.addInstanceMethod("indexOf", "indexOf", "(I)I");
125
+			cls.addInstanceMethod("indexOfFrom", "indexOf", "(II)I");
126
+			cls.addInstanceMethod("lastIndexOf", "lastIndexOf", "(I)I");
127
+			cls.addInstanceMethod("lastIndexOfFrom", "lastIndexOf", "(II)I");
128
+			cls.addInstanceMethod("trim", "trim", "()Ljava/lang/String;");
129
+			nativeClasses.put("stdlib::String", cls);
130
+		}
131
+		
132
+		{
133
+			JavaClass arrays = new JavaClass("java.lang", "Arrays", JavaClass.Kind.CLASS);
134
+			JavaNativeClass cls = new JavaNativeClass(arrays);
135
+			cls.addMethod("sort", new JavaMethod(arrays, JavaMethod.Kind.EXPANSION, "sort", false, "([Ljava/lang/Object;)[Ljava/lang/Object;", JavaModifiers.PUBLIC | JavaModifiers.STATIC));
136
+			cls.addMethod("sorted", new JavaMethod((expression, translator) -> {
137
+				return translator.sorted(((CallExpression)expression).target);
138
+			}));
139
+			cls.addMethod("sortWithComparator", new JavaMethod(arrays, JavaMethod.Kind.EXPANSION, "sort", false, "([Ljava/lang/Object;Ljava/lang/Comparator;)[Ljava/lang/Object;", JavaModifiers.PUBLIC | JavaModifiers.STATIC));
140
+			cls.addMethod("sortedWithComparator", new JavaMethod((expression, translator) -> {
141
+				return translator.sortedWithComparator(
142
+						((CallExpression)expression).target,
143
+						((CallExpression)expression).arguments.arguments[0]);
144
+			}));
145
+			cls.addMethod("copy", new JavaMethod((expression, translator) -> {
146
+				return translator.copy(((CallExpression)expression).target);
147
+			}));
148
+			cls.addMethod("copyResize", new JavaMethod(arrays, JavaMethod.Kind.EXPANSION, "copyOf", false, "([Ljava/lang/Object;I)[Ljava/lang/Object;", JavaModifiers.PUBLIC | JavaModifiers.STATIC));
149
+			cls.addMethod("copyTo", new JavaMethod((expression, translator) -> {
150
+				return translator.copyTo((CallExpression)expression);
151
+			}));
152
+			nativeClasses.put("stdlib::Arrays", cls);
153
+		}
154
+		
155
+		{
156
+			JavaNativeClass cls = new JavaNativeClass(new JavaClass("java.lang", "IllegalArgumentException", JavaClass.Kind.CLASS));
157
+			cls.addConstructor("constructor", "(Ljava/lang/String;)V");
158
+			nativeClasses.put("stdlib::IllegalArgumentException", cls);
159
+		}
160
+		
161
+		{
162
+			JavaNativeClass cls = new JavaNativeClass(new JavaClass("java.lang", "Exception", JavaClass.Kind.CLASS));
163
+			cls.addConstructor("constructor", "(Ljava/lang/String;)V");
164
+			cls.addConstructor("constructorWithCause", "(Ljava/lang/String;Ljava/lang/Throwable;)V");
165
+			nativeClasses.put("stdlib::Exception", cls);
166
+		}
167
+		
168
+		{
169
+			JavaNativeClass cls = new JavaNativeClass(new JavaClass("java.io", "IOException", JavaClass.Kind.CLASS));
170
+			cls.addConstructor("constructor", "(Ljava/lang/String;)V");
171
+			nativeClasses.put("io::IOException", cls);
172
+		}
173
+		
174
+		{
175
+			JavaNativeClass cls = new JavaNativeClass(new JavaClass("java.io", "Reader", JavaClass.Kind.INTERFACE));
176
+			cls.addInstanceMethod("destruct", "close", "()V");
177
+			cls.addInstanceMethod("readCharacter", "read", "()C");
178
+			cls.addInstanceMethod("readArray", "read", "([C)I");
179
+			cls.addInstanceMethod("readArraySlice", "read", "([CII)I");
180
+			nativeClasses.put("io::Reader", cls);
181
+		}
182
+		
183
+		{
184
+			JavaNativeClass cls = new JavaNativeClass(new JavaClass("java.io", "StringReader", JavaClass.Kind.CLASS), true);
185
+			cls.addConstructor("constructor", "(Ljava/lang/String;)V");
186
+			cls.addInstanceMethod("destructor", "close", "()V");
187
+			cls.addInstanceMethod("readCharacter", "read", "()C");
188
+			cls.addInstanceMethod("readArray", "read", "([C)I");
189
+			cls.addInstanceMethod("readSlice", "read", "([CII)I");
190
+			nativeClasses.put("io::StringReader", cls);
191
+		}
192
+	}
193
+	
194
+	private final String filename;
195
+	private final JavaClass outerClass;
196
+	
197
+	public JavaPrepareDefinitionVisitor(String filename, JavaClass outerClass) {
198
+		this.filename = filename;
199
+		this.outerClass = outerClass;
200
+	}
201
+	
202
+	private boolean isPrepared(HighLevelDefinition definition) {
203
+		return definition.hasTag(JavaClass.class);
204
+	}
205
+	
206
+	public void prepare(ITypeID type) {
207
+		if (!(type instanceof DefinitionTypeID))
208
+			return;
209
+			
210
+		HighLevelDefinition definition = ((DefinitionTypeID)type).definition;
211
+		definition.accept(this);
212
+	}
213
+	
214
+	@Override
215
+	public JavaClass visitClass(ClassDefinition definition) {
216
+		if (isPrepared(definition))
217
+			return definition.getTag(JavaClass.class);
218
+		
219
+		return visitClassCompiled(definition, true, JavaClass.Kind.CLASS);
220
+	}
221
+
222
+	@Override
223
+	public JavaClass visitInterface(InterfaceDefinition definition) {
224
+		if (isPrepared(definition))
225
+			return definition.getTag(JavaClass.class);
226
+		
227
+		for (ITypeID baseType : definition.baseInterfaces)
228
+			prepare(baseType);
229
+		
230
+		return visitClassCompiled(definition, true, JavaClass.Kind.INTERFACE);
231
+	}
232
+
233
+	@Override
234
+	public JavaClass visitEnum(EnumDefinition definition) {
235
+		if (isPrepared(definition))
236
+			return definition.getTag(JavaClass.class);
237
+		
238
+		return visitClassCompiled(definition, false, JavaClass.Kind.ENUM);
239
+	}
240
+
241
+	@Override
242
+	public JavaClass visitStruct(StructDefinition definition) {
243
+		if (isPrepared(definition))
244
+			return definition.getTag(JavaClass.class);
245
+		
246
+		return visitClassCompiled(definition, true, JavaClass.Kind.CLASS);
247
+	}
248
+
249
+	@Override
250
+	public JavaClass visitFunction(FunctionDefinition definition) {
251
+		if (isPrepared(definition))
252
+			return definition.getTag(JavaClass.class);
253
+		
254
+		JavaClass cls = new JavaClass(definition.pkg.fullName, filename, JavaClass.Kind.CLASS);
255
+		definition.setTag(JavaClass.class, cls);
256
+		return cls;
257
+	}
258
+
259
+	@Override
260
+	public JavaClass visitExpansion(ExpansionDefinition definition) {
261
+		if (isPrepared(definition))
262
+			return definition.getTag(JavaClass.class);
263
+		
264
+		NativeTag nativeTag = definition.getTag(NativeTag.class);
265
+		if (nativeTag != null) {
266
+			definition.setTag(JavaNativeClass.class, nativeClasses.get(nativeTag.value));
267
+		}
268
+		
269
+		JavaClass cls = new JavaClass(definition.pkg.fullName, filename, JavaClass.Kind.CLASS);
270
+		definition.setTag(JavaClass.class, cls);
271
+		return cls;
272
+	}
273
+
274
+	@Override
275
+	public JavaClass visitAlias(AliasDefinition definition) {
276
+		// nothing to do
277
+		return null;
278
+	}
279
+
280
+	@Override
281
+	public JavaClass visitVariant(VariantDefinition variant) {
282
+		if (isPrepared(variant))
283
+			return variant.getTag(JavaClass.class);
284
+		
285
+		JavaClass cls = new JavaClass(variant.pkg.fullName, variant.name, JavaClass.Kind.CLASS);
286
+		variant.setTag(JavaClass.class, cls);
287
+		
288
+		for (VariantDefinition.Option option : variant.options) {
289
+			JavaClass variantCls = new JavaClass(cls.fullName, option.name, JavaClass.Kind.CLASS);
290
+			option.setTag(JavaVariantOption.class, new JavaVariantOption(cls, variantCls));
291
+		}
292
+		
293
+		return cls;
294
+	}
295
+	
296
+	private JavaClass visitClassCompiled(HighLevelDefinition definition, boolean startsEmpty, JavaClass.Kind kind) {
297
+		if (definition.getSuperType() != null)
298
+			prepare(definition.getSuperType());
299
+		
300
+		NativeTag nativeTag = definition.getTag(NativeTag.class);
301
+		JavaNativeClass nativeClass = nativeTag == null ? null : nativeClasses.get(nativeTag.value);
302
+		JavaClass cls;
303
+		if (nativeClass == null) {
304
+			cls = outerClass == null ? new JavaClass(definition.pkg.fullName, definition.name, kind) : new JavaClass(outerClass, definition.name, kind);
305
+			cls.destructible = definition.isDestructible();
306
+			definition.setTag(JavaClass.class, cls);
307
+		} else {
308
+			cls = outerClass == null ? new JavaClass(definition.pkg.fullName, filename, kind) : new JavaClass(outerClass, filename, kind);
309
+			definition.setTag(JavaClass.class, nativeClass.cls);
310
+			definition.setTag(JavaNativeClass.class, nativeClass);
311
+			
312
+			if (nativeClass.nonDestructible)
313
+				cls.destructible = false;
314
+		}
315
+		
316
+		for (IDefinitionMember member : definition.members) {
317
+			if (member instanceof InnerDefinitionMember) {
318
+				((InnerDefinitionMember) member).innerDefinition.accept(new JavaPrepareDefinitionVisitor(filename, cls));
319
+			}
320
+		}
321
+		
322
+		return cls;
323
+	}
324
+}

JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/prepare/JavaSourcePrepareExpansionMethodVisitor.java → JavaShared/src/main/java/org/openzen/zenscript/javashared/prepare/JavaPrepareExpansionMethodVisitor.java View File

@@ -3,8 +3,9 @@
3 3
  * To change this template file, choose Tools | Templates
4 4
  * and open the template in the editor.
5 5
  */
6
-package org.openzen.zenscript.javasource.prepare;
6
+package org.openzen.zenscript.javashared.prepare;
7 7
 
8
+import org.openzen.zenscript.javashared.JavaNativeClass;
8 9
 import org.openzen.zencode.shared.StringExpansion;
9 10
 import org.openzen.zenscript.codemodel.OperatorType;
10 11
 import org.openzen.zenscript.codemodel.annotations.NativeTag;
@@ -16,6 +17,7 @@ import org.openzen.zenscript.codemodel.member.CustomIteratorMember;
16 17
 import org.openzen.zenscript.codemodel.member.DefinitionMember;
17 18
 import org.openzen.zenscript.codemodel.member.DestructorMember;
18 19
 import org.openzen.zenscript.codemodel.member.FieldMember;
20
+import org.openzen.zenscript.codemodel.member.FunctionalMember;
19 21
 import org.openzen.zenscript.codemodel.member.GetterMember;
20 22
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
21 23
 import org.openzen.zenscript.codemodel.member.ImplementationMember;
@@ -25,31 +27,35 @@ import org.openzen.zenscript.codemodel.member.MethodMember;
25 27
 import org.openzen.zenscript.codemodel.member.OperatorMember;
26 28
 import org.openzen.zenscript.codemodel.member.SetterMember;
27 29
 import org.openzen.zenscript.codemodel.member.StaticInitializerMember;
28
-import org.openzen.zenscript.javasource.JavaSourceTypeNameVisitor;
30
+import org.openzen.zenscript.javashared.JavaTypeNameVisitor;
29 31
 import org.openzen.zenscript.javashared.JavaClass;
30
-import org.openzen.zenscript.javasource.tags.JavaSourceField;
31
-import org.openzen.zenscript.javasource.tags.JavaSourceImplementation;
32
-import org.openzen.zenscript.javasource.tags.JavaSourceMethod;
32
+import org.openzen.zenscript.javashared.JavaField;
33
+import org.openzen.zenscript.javashared.JavaContext;
34
+import org.openzen.zenscript.javashared.JavaImplementation;
35
+import org.openzen.zenscript.javashared.JavaMethod;
36
+import org.openzen.zenscript.javashared.JavaModifiers;
33 37
 
34 38
 /**
35 39
  *
36 40
  * @author Hoofdgebruiker
37 41
  */
38
-public class JavaSourcePrepareExpansionMethodVisitor implements MemberVisitor<Void> {
42
+public class JavaPrepareExpansionMethodVisitor implements MemberVisitor<Void> {
39 43
 	private static final boolean DEBUG_EMPTY = true;
40 44
 	
45
+	private final JavaContext context;
41 46
 	private final JavaClass cls;
42 47
 	private final JavaNativeClass nativeClass;
43 48
 	
44
-	public JavaSourcePrepareExpansionMethodVisitor(JavaClass cls, JavaNativeClass nativeClass) {
49
+	public JavaPrepareExpansionMethodVisitor(JavaContext context, JavaClass cls, JavaNativeClass nativeClass) {
45 50
 		this.cls = cls;
46 51
 		this.nativeClass = nativeClass;
52
+		this.context = context;
47 53
 		cls.empty = true;
48 54
 	}
49 55
 	
50 56
 	@Override
51 57
 	public Void visitConst(ConstMember member) {
52
-		member.setTag(JavaSourceField.class, new JavaSourceField(cls, member.name));
58
+		member.setTag(JavaField.class, new JavaField(cls, member.name, context.getDescriptor(member.type)));
53 59
 		
54 60
 		if (DEBUG_EMPTY && cls.empty)
55 61
 			System.out.println("Class " + cls.fullName + " not empty because of const");
@@ -61,7 +67,7 @@ public class JavaSourcePrepareExpansionMethodVisitor implements MemberVisitor<Vo
61 67
 	@Override
62 68
 	public Void visitField(FieldMember member) {
63 69
 		// TODO: expansion fields
64
-		member.setTag(JavaSourceField.class, new JavaSourceField(cls, member.name));
70
+		member.setTag(JavaField.class, new JavaField(cls, member.name, context.getDescriptor(member.type)));
65 71
 		if (member.hasAutoGetter() || member.hasAutoSetter())
66 72
 			cls.empty = false;
67 73
 		return null;
@@ -108,7 +114,7 @@ public class JavaSourcePrepareExpansionMethodVisitor implements MemberVisitor<Vo
108 114
 
109 115
 	@Override
110 116
 	public Void visitCaster(CasterMember member) {
111
-		visitFunctional(member, "to" + member.toType.accept(new JavaSourceTypeNameVisitor()));
117
+		visitFunctional(member, "to" + member.toType.accept(new JavaTypeNameVisitor()));
112 118
 		return null;
113 119
 	}
114 120
 
@@ -126,8 +132,8 @@ public class JavaSourcePrepareExpansionMethodVisitor implements MemberVisitor<Vo
126 132
 
127 133
 	@Override
128 134
 	public Void visitImplementation(ImplementationMember member) {
129
-		JavaClass implementationClass = new JavaClass(cls, member.type.accept(new JavaSourceTypeNameVisitor()) + "Implementation", JavaClass.Kind.CLASS);
130
-		member.setTag(JavaSourceImplementation.class, new JavaSourceImplementation(false, implementationClass));
135
+		JavaClass implementationClass = new JavaClass(cls, member.type.accept(new JavaTypeNameVisitor()) + "Implementation", JavaClass.Kind.CLASS);
136
+		member.setTag(JavaImplementation.class, new JavaImplementation(false, implementationClass));
131 137
 		for (IDefinitionMember implementedMember : member.members)
132 138
 			implementedMember.accept(this);
133 139
 		
@@ -147,13 +153,13 @@ public class JavaSourcePrepareExpansionMethodVisitor implements MemberVisitor<Vo
147 153
 		return null;
148 154
 	}
149 155
 	
150
-	private void visitFunctional(DefinitionMember member, String name) {
156
+	private void visitFunctional(FunctionalMember member, String name) {
151 157
 		NativeTag nativeTag = member.getTag(NativeTag.class);
152
-		JavaSourceMethod method = null;
158
+		JavaMethod method = null;
153 159
 		if (nativeTag != null && nativeClass != null)
154 160
 			method = nativeClass.getMethod(nativeTag.value);
155 161
 		if (method == null)
156
-			method = new JavaSourceMethod(cls, getKind(member), name, true); 
162
+			method = new JavaMethod(cls, getKind(member), name, true, context.getMethodDescriptor(member.header), JavaModifiers.getJavaModifiers(member.modifiers)); 
157 163
 		
158 164
 		if (method.compile) {
159 165
 			if (DEBUG_EMPTY && cls.empty)
@@ -162,11 +168,11 @@ public class JavaSourcePrepareExpansionMethodVisitor implements MemberVisitor<Vo
162 168
 			cls.empty = false;
163 169
 		}
164 170
 		
165
-		member.setTag(JavaSourceMethod.class, method);
171
+		member.setTag(JavaMethod.class, method);
166 172
 	}
167 173
 	
168
-	private JavaSourceMethod.Kind getKind(DefinitionMember member) {
169
-		return member.isStatic() ? JavaSourceMethod.Kind.STATIC : JavaSourceMethod.Kind.EXPANSION;
174
+	private JavaMethod.Kind getKind(DefinitionMember member) {
175
+		return member.isStatic() ? JavaMethod.Kind.STATIC : JavaMethod.Kind.EXPANSION;
170 176
 	}
171 177
 	
172 178
 	private String getOperatorName(OperatorType operator) {

+ 0
- 27
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/FormattingUtils.java View File

@@ -25,33 +25,6 @@ import org.openzen.zenscript.javasource.scope.JavaSourceStatementScope;
25 25
 public class FormattingUtils {
26 26
 	private FormattingUtils() {}
27 27
 	
28
-	public static void formatModifiers(StringBuilder output, int modifiers) {
29
-		if (Modifiers.isPrivate(modifiers))
30
-			output.append("private ");
31
-		if (Modifiers.isProtected(modifiers))
32
-			output.append("protected ");
33
-		if (Modifiers.isPublic(modifiers))
34
-			output.append("public ");
35
-		if (Modifiers.isExport(modifiers))
36
-			output.append("export ");
37
-		if (Modifiers.isStatic(modifiers))
38
-			output.append("static ");
39
-		if (Modifiers.isAbstract(modifiers))
40
-			output.append("abstract ");
41
-		if (Modifiers.isVirtual(modifiers))
42
-			output.append("virtual ");
43
-		if (Modifiers.isFinal(modifiers))
44
-			output.append("final ");
45
-		if (Modifiers.isExtern(modifiers))
46
-			output.append("extern ");
47
-		if (Modifiers.isImplicit(modifiers))
48
-			output.append("implicit ");
49
-		if (Modifiers.isConst(modifiers))
50
-			output.append("const ");
51
-		if (Modifiers.isConstOptional(modifiers))
52
-			output.append("const? ");
53
-	}
54
-	
55 28
 	public static void formatHeader(StringBuilder result, JavaSourceFormattingSettings settings, FunctionHeader header, JavaSourceTypeVisitor typeFormatter) {
56 29
 		FormattingUtils.formatTypeParameters(result, header.typeParameters, typeFormatter);
57 30
 		result.append("(");

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

@@ -32,7 +32,7 @@ import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
32 32
 import org.openzen.zenscript.codemodel.type.ITypeID;
33 33
 import org.openzen.zenscript.compiler.CompileScope;
34 34
 import org.openzen.zenscript.compiler.SemanticModule;
35
-import org.openzen.zenscript.javasource.prepare.JavaNativeClass;
35
+import org.openzen.zenscript.javashared.JavaNativeClass;
36 36
 import org.openzen.zenscript.javasource.scope.JavaSourceFileScope;
37 37
 import org.openzen.zenscript.javasource.scope.JavaSourceStatementScope;
38 38
 import org.openzen.zenscript.javashared.JavaClass;

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

@@ -31,7 +31,7 @@ import org.openzen.zenscript.codemodel.statement.Statement;
31 31
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
32 32
 import org.openzen.zenscript.codemodel.type.ITypeID;
33 33
 import org.openzen.zenscript.javasource.scope.JavaSourceFileScope;
34
-import org.openzen.zenscript.javasource.tags.JavaSourceMethod;
34
+import org.openzen.zenscript.javashared.JavaMethod;
35 35
 
36 36
 /**
37 37
  *
@@ -56,7 +56,7 @@ public class JavaExpansionMemberCompiler extends BaseMemberCompiler {
56 56
 	}
57 57
 	
58 58
 	private void compileMethod(DefinitionMember member, FunctionHeader header, Statement body) {
59
-		JavaSourceMethod method = member.getTag(JavaSourceMethod.class);
59
+		JavaMethod method = member.getTag(JavaMethod.class);
60 60
 		if (method == null)
61 61
 			throw new AssertionError();
62 62
 		if (!method.compile)

+ 6
- 5
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaMemberCompiler.java View File

@@ -5,6 +5,7 @@
5 5
  */
6 6
 package org.openzen.zenscript.javasource;
7 7
 
8
+import org.openzen.zenscript.javashared.JavaTypeNameVisitor;
8 9
 import java.util.ArrayList;
9 10
 import java.util.Collections;
10 11
 import java.util.List;
@@ -37,8 +38,8 @@ import org.openzen.zenscript.codemodel.type.BasicTypeID;
37 38
 import org.openzen.zenscript.compiler.SemanticModule;
38 39
 import org.openzen.zenscript.javasource.scope.JavaSourceFileScope;
39 40
 import org.openzen.zenscript.javashared.JavaClass;
40
-import org.openzen.zenscript.javasource.tags.JavaSourceImplementation;
41
-import org.openzen.zenscript.javasource.tags.JavaSourceMethod;
41
+import org.openzen.zenscript.javashared.JavaImplementation;
42
+import org.openzen.zenscript.javashared.JavaMethod;
42 43
 
43 44
 /**
44 45
  *
@@ -72,7 +73,7 @@ public class JavaMemberCompiler extends BaseMemberCompiler {
72 73
 	}
73 74
 	
74 75
 	private void compileMethod(DefinitionMember member, FunctionHeader header, Statement body) {
75
-		JavaSourceMethod method = member.getTag(JavaSourceMethod.class);
76
+		JavaMethod method = member.getTag(JavaMethod.class);
76 77
 		if (method == null)
77 78
 			throw new AssertionError();
78 79
 		if (!method.compile)
@@ -221,13 +222,13 @@ public class JavaMemberCompiler extends BaseMemberCompiler {
221 222
 
222 223
 	@Override
223 224
 	public Void visitImplementation(ImplementationMember member) {
224
-		JavaSourceImplementation implementation = member.getTag(JavaSourceImplementation.class);
225
+		JavaImplementation implementation = member.getTag(JavaImplementation.class);
225 226
 		if (implementation.inline) {
226 227
 			for (IDefinitionMember m : member.members) {
227 228
 				m.accept(this);
228 229
 			}
229 230
 		} else {
230
-			String interfaceName = member.type.accept(new JavaSourceTypeNameVisitor());
231
+			String interfaceName = member.type.accept(new JavaTypeNameVisitor());
231 232
 			String implementationName = interfaceName + "Implementation";
232 233
 			
233 234
 			begin(ElementType.FIELD);

+ 11
- 5
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceCompiler.java View File

@@ -5,6 +5,7 @@
5 5
  */
6 6
 package org.openzen.zenscript.javasource;
7 7
 
8
+import org.openzen.zenscript.javashared.JavaContext;
8 9
 import java.io.File;
9 10
 import java.util.HashMap;
10 11
 import java.util.Map;
@@ -15,7 +16,7 @@ import org.openzen.zenscript.codemodel.definition.ZSPackage;
15 16
 import org.openzen.zenscript.compiler.CompilationUnit;
16 17
 import org.openzen.zenscript.compiler.SemanticModule;
17 18
 import org.openzen.zenscript.compiler.ZenCodeCompiler;
18
-import org.openzen.zenscript.javasource.prepare.JavaSourcePrepareDefinitionVisitor;
19
+import org.openzen.zenscript.javashared.prepare.JavaPrepareDefinitionVisitor;
19 20
 import org.openzen.zenscript.javashared.JavaClass;
20 21
 
21 22
 /**
@@ -38,7 +39,9 @@ public class JavaSourceCompiler implements ZenCodeCompiler {
38 39
 		
39 40
 		settings = new JavaSourceFormattingSettings.Builder().build();
40 41
 		typeGenerator = new JavaSourceSyntheticTypeGenerator(directory, settings);
41
-		helperGenerator = new JavaSourceSyntheticHelperGenerator(directory, settings);
42
+		
43
+		JavaSourceContext context = new JavaSourceContext(typeGenerator);
44
+		helperGenerator = new JavaSourceSyntheticHelperGenerator(context, directory, settings);
42 45
 		
43 46
 		this.directory = directory;
44 47
 	}
@@ -46,10 +49,8 @@ public class JavaSourceCompiler implements ZenCodeCompiler {
46 49
 	@Override
47 50
 	public void addDefinition(HighLevelDefinition definition, SemanticModule module) {
48 51
 		String filename = getFilename(definition);
49
-		JavaSourcePrepareDefinitionVisitor prepare = new JavaSourcePrepareDefinitionVisitor(filename, null);
52
+		JavaPrepareDefinitionVisitor prepare = new JavaPrepareDefinitionVisitor(filename, null);
50 53
 		JavaClass cls = definition.accept(prepare);
51
-		if (cls.empty)
52
-			return;
53 54
 		
54 55
 		File file = new File(getDirectory(definition.pkg), cls.getName() + ".java");
55 56
 		System.out.println("Compiling " + definition.name + " as " + cls.fullName);
@@ -67,6 +68,11 @@ public class JavaSourceCompiler implements ZenCodeCompiler {
67 68
 	
68 69
 	@Override
69 70
 	public void finish() {
71
+		JavaSourceContext context = new JavaSourceContext(typeGenerator);
72
+		for (JavaSourceFile sourceFile : sourceFiles.values()) {
73
+			sourceFile.prepare(context);
74
+		}
75
+		
70 76
 		for (JavaSourceFile sourceFile : sourceFiles.values())
71 77
 			sourceFile.write();
72 78
 		

+ 28
- 0
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceContext.java View File

@@ -0,0 +1,28 @@
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.javasource;
7
+
8
+import org.openzen.zenscript.codemodel.type.ITypeID;
9
+import org.openzen.zenscript.javashared.JavaContext;
10
+import org.openzen.zenscript.javashared.JavaSyntheticClassGenerator;
11
+import org.openzen.zenscript.javashared.JavaTypeDescriptorVisitor;
12
+
13
+/**
14
+ *
15
+ * @author Hoofdgebruiker
16
+ */
17
+public class JavaSourceContext extends JavaContext {
18
+	private final JavaTypeDescriptorVisitor typeDescriptorVisitor;
19
+	
20
+	public JavaSourceContext(JavaSyntheticClassGenerator generator) {
21
+		typeDescriptorVisitor = new JavaTypeDescriptorVisitor(generator);
22
+	}
23
+	
24
+	@Override
25
+	public String getDescriptor(ITypeID type) {
26
+		return type.accept(typeDescriptorVisitor);
27
+	}
28
+}

+ 84
- 27
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceExpressionFormatter.java View File

@@ -94,15 +94,17 @@ import org.openzen.zenscript.formattershared.ExpressionString;
94 94
 import org.openzen.zenscript.formattershared.StatementFormattingTarget;
95 95
 import org.openzen.zenscript.javasource.scope.JavaSourceStatementScope;
96 96
 import org.openzen.zenscript.javashared.JavaClass;
97
-import org.openzen.zenscript.javasource.tags.JavaSourceField;
98
-import org.openzen.zenscript.javasource.tags.JavaSourceMethod;
99
-import org.openzen.zenscript.javasource.tags.JavaSourceVariantOption;
97
+import org.openzen.zenscript.javashared.JavaField;
98
+import org.openzen.zenscript.javashared.JavaNativeTranslation;
99
+import org.openzen.zenscript.javashared.JavaNativeTranslator;
100
+import org.openzen.zenscript.javashared.JavaMethod;
101
+import org.openzen.zenscript.javashared.JavaVariantOption;
100 102
 
101 103
 /**
102 104
  *
103 105
  * @author Hoofdgebruiker
104 106
  */
105
-public class JavaSourceExpressionFormatter implements ExpressionVisitor<ExpressionString> {
107
+public class JavaSourceExpressionFormatter implements ExpressionVisitor<ExpressionString>, JavaNativeTranslator<ExpressionString> {
106 108
 	private static final JavaClass RESULT = new JavaClass("stdlib", "Result", JavaClass.Kind.CLASS);
107 109
 	private static final JavaClass RESULT_OK = new JavaClass("stdlib", "Result.Ok", JavaClass.Kind.CLASS);
108 110
 	private static final JavaClass RESULT_ERROR = new JavaClass("stdlib", "Result.Error", JavaClass.Kind.CLASS);
@@ -159,19 +161,19 @@ public class JavaSourceExpressionFormatter implements ExpressionVisitor<Expressi
159 161
 		if (expression.member.getBuiltin() != null) {
160 162
 			return visitBuiltinCall(expression, expression.member.getBuiltin());
161 163
 		} else {
162
-			JavaSourceMethod method = expression.member.getTag(JavaSourceMethod.class);
164
+			JavaMethod method = expression.member.getTag(JavaMethod.class);
163 165
 			if (method == null)
164 166
 				throw new IllegalStateException("No source method tag for " + expression.member.getCanonicalName() + "!");
165 167
 			
166
-			if (method.kind == JavaSourceMethod.Kind.COMPILED) {
167
-				return method.compiler.call(this, expression);
168
+			if (method.kind == JavaMethod.Kind.COMPILED) {
169
+				return (ExpressionString) method.translation.translate(expression, this);
168 170
 			} else {
169 171
 				return compileCall(method, expression.target, expression.arguments);
170 172
 			}
171 173
 		}
172 174
 	}
173 175
 	
174
-	private ExpressionString compileCall(JavaSourceMethod method, Expression target, CallArguments arguments) {
176
+	private ExpressionString compileCall(JavaMethod method, Expression target, CallArguments arguments) {
175 177
 		switch (method.kind) {
176 178
 			case EXPANSION: {
177 179
 				StringBuilder output = new StringBuilder();
@@ -199,7 +201,7 @@ public class JavaSourceExpressionFormatter implements ExpressionVisitor<Expressi
199 201
 		if (expression.member.getBuiltin() != null)
200 202
 			return visitBuiltinCallStatic(expression, expression.member.getBuiltin());
201 203
 		
202
-		JavaSourceMethod method = expression.member.getTag(JavaSourceMethod.class);
204
+		JavaMethod method = expression.member.getTag(JavaMethod.class);
203 205
 		if (method == null)
204 206
 			throw new IllegalStateException("No source method tag for " + expression.member.getCanonicalName() + "!");
205 207
 		
@@ -241,12 +243,12 @@ public class JavaSourceExpressionFormatter implements ExpressionVisitor<Expressi
241 243
 		if (expression.member.member.builtin != null)
242 244
 			return visitBuiltinCast(expression);
243 245
 		
244
-		JavaSourceMethod method = expression.member.getTag(JavaSourceMethod.class);
246
+		JavaMethod method = expression.member.getTag(JavaMethod.class);
245 247
 		if (method == null)
246 248
 			throw new CompileException(expression.position, CompileExceptionCode.INTERNAL_ERROR, "No tag for caster");
247 249
 		
248
-		if (method.kind == JavaSourceMethod.Kind.COMPILED) {
249
-			return method.compiler.call(this, expression);
250
+		if (method.kind == JavaMethod.Kind.COMPILED) {
251
+			return (ExpressionString)method.translation.translate(expression, this);
250 252
 		} else {
251 253
 			return compileCall(method, expression.target, CallArguments.EMPTY);
252 254
 		}
@@ -429,7 +431,7 @@ public class JavaSourceExpressionFormatter implements ExpressionVisitor<Expressi
429 431
 
430 432
 	@Override
431 433
 	public ExpressionString visitGetStaticField(GetStaticFieldExpression expression) {
432
-		JavaSourceField field = expression.field.getTag(JavaSourceField.class);
434
+		JavaField field = expression.field.getTag(JavaField.class);
433 435
 		if (field == null)
434 436
 			throw new CompileException(expression.position, CompileExceptionCode.INTERNAL_ERROR, "Missing field tag");
435 437
 		
@@ -441,7 +443,7 @@ public class JavaSourceExpressionFormatter implements ExpressionVisitor<Expressi
441 443
 		if (expression.getter.member.builtin != null)
442 444
 			return visitBuiltinGetter(expression, expression.getter.member.builtin);
443 445
 		
444
-		JavaSourceMethod method = expression.getter.getTag(JavaSourceMethod.class);
446
+		JavaMethod method = expression.getter.getTag(JavaMethod.class);
445 447
 		StringBuilder result = new StringBuilder();
446 448
 		result.append(expression.target.accept(this));
447 449
 		result.append(".");
@@ -513,7 +515,7 @@ public class JavaSourceExpressionFormatter implements ExpressionVisitor<Expressi
513 515
 		if (expression.constructor.getBuiltin() != null)
514 516
 			return visitBuiltinConstructor(expression);
515 517
 		
516
-		JavaSourceMethod method = expression.constructor.getTag(JavaSourceMethod.class);
518
+		JavaMethod method = expression.constructor.getTag(JavaMethod.class);
517 519
 		switch (method.kind) {
518 520
 			case EXPANSION: {
519 521
 				StringBuilder output = new StringBuilder();
@@ -596,7 +598,7 @@ public class JavaSourceExpressionFormatter implements ExpressionVisitor<Expressi
596 598
 
597 599
 	@Override
598 600
 	public ExpressionString visitSetStaticField(SetStaticFieldExpression expression) {
599
-		JavaSourceField field = expression.field.getTag(JavaSourceField.class);
601
+		JavaField field = expression.field.getTag(JavaField.class);
600 602
 		if (field == null)
601 603
 			throw new CompileException(expression.position, CompileExceptionCode.INTERNAL_ERROR, "Missing field tag");
602 604
 		if (field.cls.fullName.equals(scope.fileScope.cls.fullName) && !scope.hasLocalVariable(field.name)) {
@@ -699,7 +701,7 @@ public class JavaSourceExpressionFormatter implements ExpressionVisitor<Expressi
699 701
 	
700 702
 	@Override
701 703
 	public ExpressionString visitVariantValue(VariantValueExpression expression) {
702
-		JavaSourceVariantOption option = expression.option.getTag(JavaSourceVariantOption.class);
704
+		JavaVariantOption option = expression.option.getTag(JavaVariantOption.class);
703 705
 		
704 706
 		StringBuilder result = new StringBuilder();
705 707
 		result.append("new ").append(scope.type(option.variantOptionClass));
@@ -740,15 +742,6 @@ public class JavaSourceExpressionFormatter implements ExpressionVisitor<Expressi
740 742
 		}
741 743
 	}
742 744
 	
743
-	public ExpressionString listToArray(CastExpression expression) {
744
-		Expression target = duplicable(expression.target);
745
-		ExpressionString targetString = target.accept(this);
746
-		ArrayTypeID resultType = (ArrayTypeID)expression.type;
747
-		return new ExpressionString(
748
-				targetString.value + ".toArray(" + newArray(resultType.elementType, targetString.unaryPostfix(JavaOperator.CALL, ".size()")).value + ")",
749
-				JavaOperator.CALL);
750
-	}
751
-	
752 745
 	public ExpressionString unaryPrefix(Expression value, JavaOperator operator) {
753 746
 		return value.accept(this).unaryPrefix(operator);
754 747
 	}
@@ -1130,7 +1123,7 @@ public class JavaSourceExpressionFormatter implements ExpressionVisitor<Expressi
1130 1123
 				}
1131 1124
 			}
1132 1125
 			case ARRAY_CONTAINS: {
1133
-				JavaSourceMethod method = scope.fileScope.helperGenerator.createArrayContains((ArrayTypeID)call.target.type);
1126
+				JavaMethod method = scope.fileScope.helperGenerator.createArrayContains((ArrayTypeID)call.target.type);
1134 1127
 				return callAsStatic(scope.fileScope.importer.importType(method.cls) + '.' + method.name, call);
1135 1128
 			}
1136 1129
 			case ARRAY_EQUALS: return callAsStatic("Arrays.equals", call);
@@ -1772,4 +1765,68 @@ public class JavaSourceExpressionFormatter implements ExpressionVisitor<Expressi
1772 1765
 		
1773 1766
 		throw new UnsupportedOperationException("Unknown builtin constructor: " + expression.constructor.getBuiltin());
1774 1767
 	}
1768
+
1769
+	@Override
1770
+	public ExpressionString isEmptyAsLengthZero(Expression value) {
1771
+		return value.accept(this).unaryPostfix(JavaOperator.EQUALS, ".length() == 0");
1772
+	}
1773
+
1774
+	@Override
1775
+	public ExpressionString listToArray(CastExpression expression) {
1776
+		Expression target = duplicable(expression.target);
1777
+		ExpressionString targetString = target.accept(this);
1778
+		ArrayTypeID resultType = (ArrayTypeID)expression.type;
1779
+		return new ExpressionString(
1780
+				targetString.value + ".toArray(" + newArray(resultType.elementType, targetString.unaryPostfix(JavaOperator.CALL, ".size()")).value + ")",
1781
+				JavaOperator.CALL);
1782
+	}
1783
+
1784
+	@Override
1785
+	public ExpressionString containsAsIndexOf(Expression target, Expression value) {
1786
+		return target.accept(this)
1787
+				.unaryPostfix(JavaOperator.GREATER_EQUALS, ".indexOf(" + value.accept(this).value + ") >= 0");
1788
+	}
1789
+
1790
+	@Override
1791
+	public ExpressionString sorted(Expression value) {
1792
+		Expression target = duplicable(value);
1793
+		ExpressionString targetString = target.accept(this);
1794
+		ExpressionString copy = new ExpressionString("Arrays.copyOf(" + targetString.value + ", " + targetString.value + ".length).sort()", JavaOperator.CALL);
1795
+		ExpressionString source = hoist(copy, scope.type(target.type));
1796
+		this.target.writeLine("Arrays.sort(" + source.value + ");");
1797
+		return source;
1798
+	}
1799
+
1800
+	@Override
1801
+	public ExpressionString sortedWithComparator(Expression value, Expression comparator) {
1802
+		Expression target = duplicable(value);
1803
+		ExpressionString comparatorString = comparator.accept(this);
1804
+		ExpressionString targetString = target.accept(this);
1805
+		ExpressionString copy = new ExpressionString("Arrays.copyOf(" + targetString.value + ", " + targetString.value + ".length).sort()", JavaOperator.CALL);
1806
+		ExpressionString source = hoist(copy, scope.type(target.type));
1807
+		this.target.writeLine("Arrays.sort(" + source.value + ", " + comparatorString.value + ");");
1808
+		return source;
1809
+	}
1810
+
1811
+	@Override
1812
+	public ExpressionString copy(Expression value) {
1813
+		Expression target = duplicable(value);
1814
+		ExpressionString source = target.accept(this);
1815
+		return new ExpressionString("Arrays.copyOf(" + source.value + ", " + source.value + ".length)", JavaOperator.CALL);
1816
+	}
1817
+
1818
+	@Override
1819
+	public ExpressionString copyTo(CallExpression call) {
1820
+		Expression source = call.target;
1821
+		Expression target = call.arguments.arguments[0];
1822
+		Expression sourceOffset = call.arguments.arguments[1];
1823
+		Expression targetOffset = call.arguments.arguments[2];
1824
+		Expression length = call.arguments.arguments[3];
1825
+		return new ExpressionString("System.arraycopy("
1826
+			+ source.accept(this) + ", "
1827
+			+ sourceOffset.accept(this) + ", "
1828
+			+ target.accept(this) + ", "
1829
+			+ targetOffset.accept(this) + ", "
1830
+			+ length.accept(this) + ")", JavaOperator.CALL);
1831
+	}
1775 1832
 }

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

@@ -5,6 +5,7 @@
5 5
  */
6 6
 package org.openzen.zenscript.javasource;
7 7
 
8
+import org.openzen.zenscript.javashared.JavaContext;
8 9
 import java.io.BufferedOutputStream;
9 10
 import java.io.File;
10 11
 import java.io.FileOutputStream;
@@ -23,6 +24,7 @@ import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
23 24
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
24 25
 import org.openzen.zenscript.compiler.SemanticModule;
25 26
 import org.openzen.zenscript.javashared.JavaClass;
27
+import org.openzen.zenscript.javashared.prepare.JavaPrepareDefinitionMemberVisitor;
26 28
 
27 29
 /**
28 30
  *
@@ -67,11 +69,25 @@ public class JavaSourceFile {
67 69
 		modules.put(definition, module);
68 70
 	}
69 71
 	
72
+	public void prepare(JavaContext context) {
73
+		JavaPrepareDefinitionMemberVisitor visitor = new JavaPrepareDefinitionMemberVisitor(context, file.getName());
74
+		
75
+		if (mainDefinition != null)
76
+			mainDefinition.accept(visitor);
77
+		
78
+		for (ExpansionDefinition expansion : expansions)
79
+			expansion.accept(visitor);
80
+	}
81
+	
70 82
 	public void write() {
71 83
 		System.out.println("Calling write on " + file.getName());
72 84
 		
73
-		if (mainDefinition == null)
85
+		if (mainDefinition == null || mainDefinition.getTag(JavaClass.class).empty) {
86
+			if (expansions.isEmpty())
87
+				return;
88
+			
74 89
 			mainDefinition = expansions.remove(0);
90
+		}
75 91
 		
76 92
 		HighLevelDefinition definition = mainDefinition;
77 93
 		JavaDefinitionVisitor visitor = new JavaDefinitionVisitor(

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

@@ -28,26 +28,30 @@ import org.openzen.zenscript.codemodel.type.ITypeVisitor;
28 28
 import org.openzen.zenscript.codemodel.type.IteratorTypeID;
29 29
 import org.openzen.zenscript.codemodel.type.RangeTypeID;
30 30
 import org.openzen.zenscript.javashared.JavaClass;
31
-import org.openzen.zenscript.javasource.tags.JavaSourceMethod;
31
+import org.openzen.zenscript.javashared.JavaContext;
32
+import org.openzen.zenscript.javashared.JavaMethod;
33
+import org.openzen.zenscript.javashared.JavaModifiers;
32 34
 
33 35
 /**
34 36
  *
35 37
  * @author Hoofdgebruiker
36 38
  */
37 39
 public class JavaSourceSyntheticHelperGenerator {
40
+	private final JavaContext context;
38 41
 	private final File directory;
39 42
 	private final JavaSourceFormattingSettings settings;
40 43
 	private final Map<String, List<String>> members = new HashMap<>();
41 44
 	private final JavaClass arrayHelpers = new JavaClass("zsynthetic", "ArrayHelpers", JavaClass.Kind.CLASS);
42
-	private final Map<ArrayKind, JavaSourceMethod> existingContains = new HashMap<>();
43
-	private final Map<ArrayKind, JavaSourceMethod> existingIndexOf = new HashMap<>();
45
+	private final Map<ArrayKind, JavaMethod> existingContains = new HashMap<>();
46
+	private final Map<ArrayKind, JavaMethod> existingIndexOf = new HashMap<>();
44 47
 	
45
-	public JavaSourceSyntheticHelperGenerator(File directory, JavaSourceFormattingSettings settings) {
48
+	public JavaSourceSyntheticHelperGenerator(JavaContext context, File directory, JavaSourceFormattingSettings settings) {
49
+		this.context = context;
46 50
 		this.directory = new File(directory, "zsynthetic");
47 51
 		this.settings = settings;
48 52
 	}
49 53
 	
50
-	public JavaSourceMethod createArrayContains(ArrayTypeID type) {
54
+	public JavaMethod createArrayContains(ArrayTypeID type) {
51 55
 		ArrayKind kind = type.accept(new ArrayKindVisitor());
52 56
 		if (existingContains.containsKey(kind))
53 57
 			return existingContains.get(kind);
@@ -55,12 +59,13 @@ public class JavaSourceSyntheticHelperGenerator {
55 59
 		String method = generateContains(kind);
56 60
 		addMember(arrayHelpers, method);
57 61
 		
58
-		JavaSourceMethod sourceMethod = new JavaSourceMethod(arrayHelpers, JavaSourceMethod.Kind.EXPANSION, kind.containsName, false);
62
+		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);
59 64
 		existingContains.put(kind, sourceMethod);
60 65
 		return sourceMethod;
61 66
 	}
62 67
 	
63
-	public JavaSourceMethod createArrayIndexOf(ArrayTypeID type) {
68
+	public JavaMethod createArrayIndexOf(ArrayTypeID type) {
64 69
 		ArrayKind kind = type.accept(new ArrayKindVisitor());
65 70
 		if (existingContains.containsKey(kind))
66 71
 			return existingContains.get(kind);
@@ -68,7 +73,8 @@ public class JavaSourceSyntheticHelperGenerator {
68 73
 		String method = generateContains(kind);
69 74
 		addMember(arrayHelpers, method);
70 75
 		
71
-		JavaSourceMethod sourceMethod = new JavaSourceMethod(arrayHelpers, JavaSourceMethod.Kind.EXPANSION, kind.containsName, false);
76
+		String descriptor = "(" + context.getDescriptor(type) + ")I";
77
+		JavaMethod sourceMethod = new JavaMethod(arrayHelpers, JavaMethod.Kind.EXPANSION, kind.containsName, false, descriptor, JavaModifiers.PUBLIC | JavaModifiers.STATIC);
72 78
 		existingContains.put(kind, sourceMethod);
73 79
 		return sourceMethod;
74 80
 	}

+ 54
- 32
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceSyntheticTypeGenerator.java View File

@@ -5,6 +5,7 @@
5 5
  */
6 6
 package org.openzen.zenscript.javasource;
7 7
 
8
+import org.openzen.zenscript.javashared.JavaSynthesizedClass;
8 9
 import java.io.BufferedOutputStream;
9 10
 import java.io.File;
10 11
 import java.io.FileOutputStream;
@@ -12,22 +13,22 @@ import java.io.IOException;
12 13
 import java.io.OutputStreamWriter;
13 14
 import java.io.Writer;
14 15
 import java.nio.charset.StandardCharsets;
15
-import java.util.ArrayList;
16 16
 import java.util.HashMap;
17
-import java.util.List;
18 17
 import java.util.Map;
19 18
 import org.openzen.zenscript.codemodel.FunctionParameter;
20
-import org.openzen.zenscript.codemodel.generic.TypeParameter;
21 19
 import org.openzen.zenscript.codemodel.type.FunctionTypeID;
22
-import org.openzen.zenscript.codemodel.type.ITypeID;
20
+import org.openzen.zenscript.codemodel.type.RangeTypeID;
23 21
 import org.openzen.zenscript.javashared.JavaClass;
22
+import org.openzen.zenscript.javashared.JavaSynthesizedClassNamer;
23
+import org.openzen.zenscript.javashared.JavaSyntheticClassGenerator;
24 24
 
25 25
 /**
26 26
  *
27 27
  * @author Hoofdgebruiker
28 28
  */
29
-public class JavaSourceSyntheticTypeGenerator {
29
+public class JavaSourceSyntheticTypeGenerator implements JavaSyntheticClassGenerator {
30 30
 	private final Map<String, JavaSynthesizedClass> functions = new HashMap<>();
31
+	private final Map<String, JavaSynthesizedClass> ranges = new HashMap<>();
31 32
 	private final File directory;
32 33
 	private final JavaSourceFormattingSettings settings;
33 34
 	
@@ -36,24 +37,23 @@ public class JavaSourceSyntheticTypeGenerator {
36 37
 		this.settings = settings;
37 38
 	}
38 39
 	
39
-	public JavaSynthesizedClass createFunction(JavaSourceTypeVisitor typeFormatter, FunctionTypeID function) {
40
-		String signature = getFunctionSignature(function);
40
+	@Override
41
+	public JavaSynthesizedClass synthesizeFunction(FunctionTypeID function) {
42
+		String signature = JavaSynthesizedClassNamer.getFunctionSignature(function);
41 43
 		if (functions.containsKey(signature))
42
-			return functions.get(signature).withTypeParameters(extractTypeParameters(function));
44
+			return functions.get(signature).withTypeParameters(JavaSynthesizedClassNamer.extractTypeParameters(function));
43 45
 		
44
-		String className = "Function" + signature;
45
-		JavaClass cls = new JavaClass("zsynthetic", className, JavaClass.Kind.INTERFACE);
46
-		JavaSynthesizedClass result = new JavaSynthesizedClass(cls, extractTypeParameters(function));
46
+		JavaSynthesizedClass result = JavaSynthesizedClassNamer.createFunctionName(function);
47 47
 		functions.put(signature, result);
48 48
 		
49
-		JavaSourceImporter importer = new JavaSourceImporter(cls);
49
+		JavaSourceImporter importer = new JavaSourceImporter(result.cls);
50 50
 		JavaSourceTypeVisitor typeVisitor = new JavaSourceTypeVisitor(importer, this);
51 51
 		
52 52
 		StringBuilder contents = new StringBuilder();
53 53
 		contents.append("@FunctionalInterface\n");
54 54
 		contents.append("public interface ");
55
-		contents.append(className);
56
-		JavaSourceUtils.formatTypeParameters(typeFormatter, contents, result.typeParameters, false);
55
+		contents.append(result.cls.getName());
56
+		JavaSourceUtils.formatTypeParameters(typeVisitor, contents, result.typeParameters, false);
57 57
 		contents.append(" {\n");
58 58
 		contents.append(settings.indent);
59 59
 		if (function.header.getNumberOfTypeParameters() > 0) {
@@ -82,10 +82,49 @@ public class JavaSourceSyntheticTypeGenerator {
82 82
 		contents.append(");\n");
83 83
 		contents.append("}\n");
84 84
 		
85
+		writeFile(result, importer, contents);
86
+		return result;
87
+	}
88
+	
89
+	@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);
100
+		
101
+		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.from.accept(typeVisitor)).append(" from;\n");
104
+		contents.append(settings.indent).append("public final ").append(type.to.accept(typeVisitor)).append(" to;\n");
105
+		contents.append(settings.indent).append("\n");
106
+		contents.append(settings.indent)
107
+				.append("public ")
108
+				.append(result.cls.getName())
109
+				.append("(")
110
+				.append(type.from.accept(typeVisitor))
111
+				.append(", ")
112
+				.append(type.to.accept(typeVisitor))
113
+				.append(") {\n");
114
+		contents.append(settings.indent).append(settings.indent).append("this.from = from;\n");
115
+		contents.append(settings.indent).append(settings.indent).append("this.to = top;\n");
116
+		contents.append(settings.indent).append("}\n");
117
+		contents.append("}\n");
118
+		
119
+		writeFile(result, importer, contents);
120
+		return result;
121
+	}
122
+	
123
+	private void writeFile(JavaSynthesizedClass result, JavaSourceImporter importer, StringBuilder contents) {
85 124
 		if (!directory.exists())
86 125
 			directory.mkdirs();
87 126
 		
88
-		File file = new File(directory, className + ".java");
127
+		File file = new File(directory, result.cls.getName() + ".java");
89 128
 		try (Writer writer = new OutputStreamWriter(new BufferedOutputStream(new FileOutputStream(file)), StandardCharsets.UTF_8)) {
90 129
 			writer.write("package zsynthetic;\n");
91 130
 			
@@ -108,22 +147,5 @@ public class JavaSourceSyntheticTypeGenerator {
108 147
 		} catch (IOException ex) {
109 148
 			ex.printStackTrace();
110 149
 		}
111
-		return result;
112
-	}
113
-	
114
-	private TypeParameter[] extractTypeParameters(ITypeID type) {
115
-		List<TypeParameter> result = new ArrayList<>();
116
-		type.extractTypeParameters(result);
117
-		return result.toArray(new TypeParameter[result.size()]);
118
-	}
119
-	
120
-	private static String getFunctionSignature(FunctionTypeID type) {
121
-		return new JavaSyntheticTypeSignatureConverter().visitFunction(type);
122
-	}
123
-	
124
-	private TypeParameter[] getFunctionTypeParameters(FunctionTypeID type) {
125
-		JavaSyntheticTypeSignatureConverter converter = new JavaSyntheticTypeSignatureConverter();
126
-		converter.visitFunction(type);
127
-		return converter.typeParameterList.toArray(new TypeParameter[converter.typeParameterList.size()]);
128 150
 	}
129 151
 }

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

@@ -5,6 +5,7 @@
5 5
  */
6 6
 package org.openzen.zenscript.javasource;
7 7
 
8
+import org.openzen.zenscript.javashared.JavaSynthesizedClass;
8 9
 import org.openzen.zenscript.codemodel.generic.GenericParameterBoundVisitor;
9 10
 import org.openzen.zenscript.codemodel.generic.ParameterSuperBound;
10 11
 import org.openzen.zenscript.codemodel.generic.ParameterTypeBound;
@@ -101,7 +102,7 @@ public class JavaSourceTypeVisitor implements ITypeVisitor<String>, GenericParam
101 102
 
102 103
 	@Override
103 104
 	public String visitFunction(FunctionTypeID function) {
104
-		JavaSynthesizedClass synthetic = typeGenerator.createFunction(this, function);
105
+		JavaSynthesizedClass synthetic = typeGenerator.synthesizeFunction(function);
105 106
 		StringBuilder result = new StringBuilder();
106 107
 		result.append(importer.importType(synthetic.cls));
107 108
 		if (synthetic.typeParameters.length > 0) {

+ 0
- 46
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/prepare/JavaNativeClass.java View File

@@ -1,46 +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.javasource.prepare;
7
-
8
-import java.util.HashMap;
9
-import java.util.Map;
10
-import org.openzen.zenscript.javashared.JavaClass;
11
-import org.openzen.zenscript.javasource.tags.JavaSourceMethod;
12
-
13
-/**
14
- *
15
- * @author Hoofdgebruiker
16
- */
17
-public class JavaNativeClass {
18
-	public final JavaClass cls;
19
-	private final Map<String, JavaSourceMethod> methods = new HashMap<>();
20
-	public final boolean nonDestructible;
21
-	
22
-	public JavaNativeClass(JavaClass cls) {
23
-		this(cls, false);
24
-	}
25
-	
26
-	public JavaNativeClass(JavaClass cls, boolean nonDestructible) {
27
-		this.cls = cls;
28
-		this.nonDestructible = nonDestructible;
29
-	}
30
-	
31
-	public void addMethod(String key, JavaSourceMethod method) {
32
-		methods.put(key, method);
33
-	}
34
-	
35
-	public void addConstructor(String key, String name) {
36
-		methods.put(key, new JavaSourceMethod(cls, JavaSourceMethod.Kind.CONSTRUCTOR, name, false));
37
-	}
38
-	
39
-	public void addInstanceMethod(String key, String name) {
40
-		methods.put(key, new JavaSourceMethod(cls, JavaSourceMethod.Kind.INSTANCE, name, false));
41
-	}
42
-	
43
-	public JavaSourceMethod getMethod(String name) {
44
-		return methods.get(name);
45
-	}
46
-}

+ 0
- 358
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/prepare/JavaSourcePrepareDefinitionVisitor.java View File

@@ -1,358 +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.javasource.prepare;
7
-
8
-import java.util.HashMap;
9
-import java.util.Map;
10
-import org.openzen.zenscript.codemodel.HighLevelDefinition;
11
-import org.openzen.zenscript.codemodel.annotations.NativeTag;
12
-import org.openzen.zenscript.codemodel.definition.AliasDefinition;
13
-import org.openzen.zenscript.codemodel.definition.ClassDefinition;
14
-import org.openzen.zenscript.codemodel.definition.DefinitionVisitor;
15
-import org.openzen.zenscript.codemodel.definition.EnumDefinition;
16
-import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
17
-import org.openzen.zenscript.codemodel.definition.FunctionDefinition;
18
-import org.openzen.zenscript.codemodel.definition.InterfaceDefinition;
19
-import org.openzen.zenscript.codemodel.definition.StructDefinition;
20
-import org.openzen.zenscript.codemodel.definition.VariantDefinition;
21
-import org.openzen.zenscript.codemodel.expression.CallExpression;
22
-import org.openzen.zenscript.codemodel.expression.CastExpression;
23
-import org.openzen.zenscript.codemodel.expression.Expression;
24
-import org.openzen.zenscript.codemodel.member.IDefinitionMember;
25
-import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
26
-import org.openzen.zenscript.codemodel.type.ITypeID;
27
-import org.openzen.zenscript.formattershared.ExpressionString;
28
-import org.openzen.zenscript.javasource.JavaOperator;
29
-import org.openzen.zenscript.javashared.JavaClass;
30
-import org.openzen.zenscript.javasource.tags.JavaSourceMethod;
31
-import org.openzen.zenscript.javasource.tags.JavaSourceVariantOption;
32
-
33
-/**
34
- *
35
- * @author Hoofdgebruiker
36
- */
37
-public class JavaSourcePrepareDefinitionVisitor implements DefinitionVisitor<JavaClass> {
38
-	private static final Map<String, JavaNativeClass> nativeClasses = new HashMap<>();
39
-	
40
-	static {
41
-		{
42
-			JavaNativeClass cls = new JavaNativeClass(new JavaClass("java.lang", "StringBuilder", JavaClass.Kind.CLASS));
43
-			cls.addConstructor("constructor", "");
44
-			cls.addConstructor("constructorWithCapacity", "");
45
-			cls.addConstructor("constructorWithValue", "");
46
-			cls.addMethod("isEmpty", new JavaSourceMethod((formatter, call) -> ((CallExpression)call).accept(formatter).unaryPostfix(JavaOperator.EQUALS, "length() == 0")));
47
-			cls.addInstanceMethod("length", "length");
48
-			cls.addInstanceMethod("appendBool", "append");
49
-			cls.addInstanceMethod("appendByte", "append");
50
-			cls.addInstanceMethod("appendSByte", "append");
51
-			cls.addInstanceMethod("appendShort", "append");
52
-			cls.addInstanceMethod("appendUShort", "append");
53
-			cls.addInstanceMethod("appendInt", "append");
54
-			cls.addInstanceMethod("appendUInt", "append");
55
-			cls.addInstanceMethod("appendLong", "append");
56
-			cls.addInstanceMethod("appendULong", "append");
57
-			cls.addInstanceMethod("appendFloat", "append");
58
-			cls.addInstanceMethod("appendDouble", "append");
59
-			cls.addInstanceMethod("appendChar", "append");
60
-			cls.addInstanceMethod("appendString", "append");
61
-			cls.addInstanceMethod("asString", "toString");
62
-			nativeClasses.put("stdlib::StringBuilder", cls);
63
-		}
64
-		
65
-		{
66
-			JavaNativeClass list = new JavaNativeClass(new JavaClass("java.util", "List", JavaClass.Kind.INTERFACE));
67
-			JavaClass arrayList = new JavaClass("java.util", "ArrayList", JavaClass.Kind.CLASS);
68
-			list.addMethod("constructor", new JavaSourceMethod(arrayList, JavaSourceMethod.Kind.CONSTRUCTOR, "", false));
69
-			list.addInstanceMethod("add", "add");
70
-			list.addInstanceMethod("insert", "add");
71
-			list.addInstanceMethod("remove", "remove");
72
-			list.addInstanceMethod("indexOf", "indexOf");
73
-			list.addInstanceMethod("lastIndexOf", "lastIndexOf");
74
-			list.addInstanceMethod("getAtIndex", "get");
75
-			list.addInstanceMethod("setAtIndex", "set");
76
-			list.addInstanceMethod("contains", "contains");
77
-			list.addMethod("toArray", new JavaSourceMethod((formatter, call) -> formatter.listToArray((CastExpression)call)));
78
-			list.addInstanceMethod("length", "size");
79
-			list.addInstanceMethod("isEmpty", "isEmpty");
80
-			list.addInstanceMethod("iterate", "iterator");
81
-			nativeClasses.put("stdlib::List", list);
82
-		}
83
-		
84
-		{
85
-			JavaNativeClass iterable = new JavaNativeClass(new JavaClass("java.lang", "Iterable", JavaClass.Kind.INTERFACE));
86
-			iterable.addInstanceMethod("iterate", "iterator");
87
-			nativeClasses.put("stdlib::Iterable", iterable);
88
-		}
89
-		
90
-		{
91
-			JavaNativeClass iterator = new JavaNativeClass(JavaClass.ITERATOR);
92
-			iterator.addInstanceMethod("hasNext", "hasNext");
93
-			iterator.addInstanceMethod("next", "next");
94
-			nativeClasses.put("stdlib::Iterator", iterator);
95
-		}
96
-		
97
-		{
98
-			JavaNativeClass comparable = new JavaNativeClass(new JavaClass("java.lang", "Comparable", JavaClass.Kind.INTERFACE));
99
-			comparable.addInstanceMethod("compareTo", "compareTo");
100
-			nativeClasses.put("stdlib::Comparable", comparable);
101
-		}
102
-		
103
-		{
104
-			JavaClass integer = new JavaClass("java.lang", "Integer", JavaClass.Kind.CLASS);
105
-			JavaClass math = new JavaClass("java.lang", "Math", JavaClass.Kind.CLASS);
106
-			
107
-			JavaNativeClass cls = new JavaNativeClass(integer);
108
-			cls.addMethod("min", new JavaSourceMethod(math, JavaSourceMethod.Kind.STATIC, "min", false));
109
-			cls.addMethod("max", new JavaSourceMethod(math, JavaSourceMethod.Kind.STATIC, "max", false));
110
-			cls.addMethod("toHexString", new JavaSourceMethod(integer, JavaSourceMethod.Kind.EXPANSION, "toHexString", false));
111
-			nativeClasses.put("stdlib::Integer", cls);
112
-		}
113
-		
114
-		{
115
-			JavaNativeClass cls = new JavaNativeClass(new JavaClass("java.lang", "String", JavaClass.Kind.CLASS));
116
-			cls.addMethod("contains", new JavaSourceMethod((formatter, calle) -> {
117
-				CallExpression call = (CallExpression)calle;
118
-				ExpressionString str = call.arguments.arguments[0].accept(formatter);
119
-				ExpressionString character = call.arguments.arguments[1].accept(formatter);
120
-				return str.unaryPostfix(JavaOperator.GREATER_EQUALS, ".indexOf(" + character.value + ")");
121
-			}));
122
-			cls.addInstanceMethod("indexOf", "indexOf");
123
-			cls.addInstanceMethod("indexOfFrom", "indexOf");
124
-			cls.addInstanceMethod("lastIndexOf", "lastIndexOf");
125
-			cls.addInstanceMethod("lastIndexOfFrom", "lastIndexOf");
126
-			cls.addInstanceMethod("trim", "trim");
127
-			nativeClasses.put("stdlib::String", cls);
128
-		}
129
-		
130
-		{
131
-			JavaClass arrays = new JavaClass("java.lang", "Arrays", JavaClass.Kind.CLASS);
132
-			JavaNativeClass cls = new JavaNativeClass(arrays);
133
-			cls.addMethod("sort", new JavaSourceMethod(arrays, JavaSourceMethod.Kind.EXPANSION, "sort", false));
134
-			cls.addMethod("sorted", new JavaSourceMethod((formatter, calle) -> {
135
-				Expression target = formatter.duplicable(((CallExpression)calle).target);
136
-				ExpressionString targetString = target.accept(formatter);
137
-				ExpressionString copy = new ExpressionString("Arrays.copyOf(" + targetString.value + ", " + targetString.value + ".length).sort()", JavaOperator.CALL);
138
-				ExpressionString source = formatter.hoist(copy, formatter.scope.type(target.type));
139
-				formatter.target.writeLine("Arrays.sort(" + source.value + ");");
140
-				return source;
141
-			}));
142
-			cls.addMethod("sortWithComparator", new JavaSourceMethod(arrays, JavaSourceMethod.Kind.EXPANSION, "sort", false));
143
-			cls.addMethod("sortedWithComparator", new JavaSourceMethod((formatter, calle) -> {
144
-				Expression target = formatter.duplicable(((CallExpression)calle).target);
145
-				ExpressionString comparator = ((CallExpression)calle).arguments.arguments[0].accept(formatter);
146
-				ExpressionString targetString = target.accept(formatter);
147
-				ExpressionString copy = new ExpressionString("Arrays.copyOf(" + targetString.value + ", " + targetString.value + ".length).sort()", JavaOperator.CALL);
148
-				ExpressionString source = formatter.hoist(copy, formatter.scope.type(target.type));
149
-				formatter.target.writeLine("Arrays.sort(" + source.value + ", " + comparator.value + ");");
150
-				return source;
151
-			}));
152
-			cls.addMethod("copy", new JavaSourceMethod((formatter, calle) -> {
153
-				Expression target = formatter.duplicable(((CallExpression)calle).target);
154
-				ExpressionString source = target.accept(formatter);
155
-				return new ExpressionString("Arrays.copyOf(" + source.value + ", " + source.value + ".length)", JavaOperator.CALL);
156
-			}));
157
-			cls.addMethod("copyResize", new JavaSourceMethod(arrays, JavaSourceMethod.Kind.EXPANSION, "copyOf", false));
158
-			cls.addMethod("copyTo", new JavaSourceMethod((formatter, calle) -> {
159
-				CallExpression call = (CallExpression)calle;
160
-				Expression source = call.target;
161
-				Expression target = call.arguments.arguments[0];
162
-				Expression sourceOffset = call.arguments.arguments[1];
163
-				Expression targetOffset = call.arguments.arguments[2];
164
-				Expression length = call.arguments.arguments[3];
165
-				return new ExpressionString("System.arraycopy("
166
-					+ source.accept(formatter) + ", "
167
-					+ sourceOffset.accept(formatter) + ", "
168
-					+ target.accept(formatter) + ", "
169
-					+ targetOffset.accept(formatter) + ", "
170
-					+ length.accept(formatter) + ")", JavaOperator.CALL);
171
-			}));
172
-			nativeClasses.put("stdlib::Arrays", cls);
173
-		}
174
-		
175
-		{
176
-			JavaNativeClass cls = new JavaNativeClass(new JavaClass("java.lang", "IllegalArgumentException", JavaClass.Kind.CLASS));
177
-			cls.addConstructor("constructor", "");
178
-			nativeClasses.put("stdlib::IllegalArgumentException", cls);
179
-		}
180
-		
181
-		{
182
-			JavaNativeClass cls = new JavaNativeClass(new JavaClass("java.lang", "Exception", JavaClass.Kind.CLASS));
183
-			cls.addConstructor("constructor", "");
184
-			cls.addConstructor("constructorWithCause", "");
185
-			nativeClasses.put("stdlib::Exception", cls);
186
-		}
187
-		
188
-		{
189
-			JavaNativeClass cls = new JavaNativeClass(new JavaClass("java.io", "IOException", JavaClass.Kind.CLASS));
190
-			cls.addConstructor("constructor", "");
191
-			nativeClasses.put("io::IOException", cls);
192
-		}
193
-		
194
-		{
195
-			JavaNativeClass cls = new JavaNativeClass(new JavaClass("java.io", "Reader", JavaClass.Kind.INTERFACE));
196
-			cls.addInstanceMethod("destruct", "close");
197
-			cls.addInstanceMethod("readCharacter", "read");
198
-			cls.addInstanceMethod("readArray", "read");
199
-			cls.addInstanceMethod("readArraySlice", "read");
200
-			nativeClasses.put("io::Reader", cls);
201
-		}
202
-		
203
-		{
204
-			JavaNativeClass cls = new JavaNativeClass(new JavaClass("java.io", "StringReader", JavaClass.Kind.CLASS), true);
205
-			cls.addConstructor("constructor", "");
206
-			cls.addInstanceMethod("destructor", "close");
207
-			cls.addInstanceMethod("readCharacter", "read");
208
-			cls.addInstanceMethod("readSlice", "read");
209
-			nativeClasses.put("io::StringReader", cls);
210
-		}
211
-	}
212
-	
213
-	private final String filename;
214
-	private final JavaClass outerClass;
215
-	
216
-	public JavaSourcePrepareDefinitionVisitor(String filename, JavaClass outerClass) {
217
-		this.filename = filename;
218
-		this.outerClass = outerClass;
219
-	}
220
-	
221
-	private boolean isPrepared(HighLevelDefinition definition) {
222
-		return definition.hasTag(JavaClass.class);
223
-	}
224
-	
225
-	public void prepare(ITypeID type) {
226
-		if (!(type instanceof DefinitionTypeID))
227
-			return;
228
-			
229
-		HighLevelDefinition definition = ((DefinitionTypeID)type).definition;
230
-		definition.accept(this);
231
-	}
232
-	
233
-	@Override
234
-	public JavaClass visitClass(ClassDefinition definition) {
235
-		if (isPrepared(definition))
236
-			return definition.getTag(JavaClass.class);
237
-		
238
-		return visitClassCompiled(definition, true, JavaClass.Kind.CLASS);
239
-	}
240
-
241
-	@Override
242
-	public JavaClass visitInterface(InterfaceDefinition definition) {
243
-		if (isPrepared(definition))
244
-			return definition.getTag(JavaClass.class);
245
-		
246
-		for (ITypeID baseType : definition.baseInterfaces)
247
-			prepare(baseType);
248
-		
249
-		return visitClassCompiled(definition, true, JavaClass.Kind.INTERFACE);
250
-	}
251
-
252
-	@Override
253
-	public JavaClass visitEnum(EnumDefinition definition) {
254
-		if (isPrepared(definition))
255
-			return definition.getTag(JavaClass.class);
256
-		
257
-		return visitClassCompiled(definition, false, JavaClass.Kind.ENUM);
258
-	}
259
-
260
-	@Override
261
-	public JavaClass visitStruct(StructDefinition definition) {
262
-		if (isPrepared(definition))
263
-			return definition.getTag(JavaClass.class);
264
-		
265
-		return visitClassCompiled(definition, true, JavaClass.Kind.CLASS);
266
-	}
267
-
268
-	@Override
269
-	public JavaClass visitFunction(FunctionDefinition definition) {
270
-		if (isPrepared(definition))
271
-			return definition.getTag(JavaClass.class);
272
-		
273
-		JavaClass cls = new JavaClass(definition.pkg.fullName, filename, JavaClass.Kind.CLASS);
274
-		definition.setTag(JavaClass.class, cls);
275
-		JavaSourceMethod method = new JavaSourceMethod(cls, JavaSourceMethod.Kind.STATIC, definition.name, true);
276
-		definition.caller.setTag(JavaSourceMethod.class, method);
277
-		return cls;
278
-	}
279
-
280
-	@Override
281
-	public JavaClass visitExpansion(ExpansionDefinition definition) {
282
-		if (isPrepared(definition))
283
-			return definition.getTag(JavaClass.class);
284
-		
285
-		NativeTag nativeTag = definition.getTag(NativeTag.class);
286
-		JavaNativeClass nativeClass = null;
287
-		if (nativeTag != null) {
288
-			nativeClass = nativeClasses.get(nativeTag.value);
289
-		}
290
-		
291
-		JavaClass cls = new JavaClass(definition.pkg.fullName, filename, JavaClass.Kind.CLASS);
292
-		definition.setTag(JavaClass.class, cls);
293
-		visitExpansionMembers(definition, cls, nativeClass);
294
-		return cls;
295
-	}
296
-
297
-	@Override
298
-	public JavaClass visitAlias(AliasDefinition definition) {
299
-		// nothing to do
300
-		return null;
301
-	}
302
-
303
-	@Override
304
-	public JavaClass visitVariant(VariantDefinition variant) {
305
-		if (isPrepared(variant))
306
-			return variant.getTag(JavaClass.class);
307
-		
308
-		JavaClass cls = new JavaClass(variant.pkg.fullName, variant.name, JavaClass.Kind.CLASS);
309
-		variant.setTag(JavaClass.class, cls);
310
-		
311
-		for (VariantDefinition.Option option : variant.options) {
312
-			JavaClass variantCls = new JavaClass(cls.fullName, option.name, JavaClass.Kind.CLASS);
313
-			option.setTag(JavaSourceVariantOption.class, new JavaSourceVariantOption(cls, variantCls));
314
-		}
315
-		
316
-		visitClassMembers(variant, cls, null, false);
317
-		return cls;
318
-	}
319
-	
320
-	private JavaClass visitClassCompiled(HighLevelDefinition definition, boolean startsEmpty, JavaClass.Kind kind) {
321
-		if (definition.getSuperType() != null)
322
-			prepare(definition.getSuperType());
323
-		
324
-		NativeTag nativeTag = definition.getTag(NativeTag.class);
325
-		JavaNativeClass nativeClass = nativeTag == null ? null : nativeClasses.get(nativeTag.value);
326
-		if (nativeClass == null) {
327
-			JavaClass cls = outerClass == null ? new JavaClass(definition.pkg.fullName, definition.name, kind) : new JavaClass(outerClass, definition.name, kind);
328
-			cls.destructible = definition.isDestructible();
329
-			definition.setTag(JavaClass.class, cls);
330
-			visitClassMembers(definition, cls, null, startsEmpty);
331
-			return cls;
332
-		} else {
333
-			JavaClass cls = outerClass == null ? new JavaClass(definition.pkg.fullName, filename, kind) : new JavaClass(outerClass, filename, kind);
334
-			definition.setTag(JavaClass.class, nativeClass.cls);
335
-			definition.setTag(JavaNativeClass.class, nativeClass);
336
-			visitExpansionMembers(definition, cls, nativeClass);
337
-			
338
-			if (nativeClass.nonDestructible)
339
-				cls.destructible = false;
340
-			
341
-			return cls;
342
-		}
343
-	}
344
-	
345
-	private void visitClassMembers(HighLevelDefinition definition, JavaClass cls, JavaNativeClass nativeClass, boolean startsEmpty) {
346
-		JavaSourcePrepareClassMethodVisitor methodVisitor = new JavaSourcePrepareClassMethodVisitor(this, filename, cls, nativeClass, startsEmpty);
347
-		for (IDefinitionMember member : definition.members) {
348
-			member.accept(methodVisitor);
349
-		}
350
-	}
351
-	
352
-	private void visitExpansionMembers(HighLevelDefinition definition, JavaClass cls, JavaNativeClass nativeClass) {
353
-		JavaSourcePrepareExpansionMethodVisitor methodVisitor = new JavaSourcePrepareExpansionMethodVisitor(cls, nativeClass);
354
-		for (IDefinitionMember member : definition.members) {
355
-			member.accept(methodVisitor);
356
-		}
357
-	}
358
-}

+ 0
- 14
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/prepare/JavaSourceSignatureVisitor.java View File

@@ -1,14 +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.javasource.prepare;
7
-
8
-/**
9
- *
10
- * @author Hoofdgebruiker
11
- */
12
-public class JavaSourceSignatureVisitor {
13
-	
14
-}

+ 2
- 2
ScriptingExample/src/main/java/org/openzen/zenscript/scriptingexample/GlobalRegistry.java View File

@@ -29,10 +29,10 @@ import org.openzen.zenscript.codemodel.scope.BaseScope;
29 29
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
30 30
 import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
31 31
 import org.openzen.zenscript.codemodel.type.ITypeID;
32
-import org.openzen.zenscript.javabytecode.JavaFieldInfo;
33 32
 import org.openzen.zenscript.javabytecode.JavaMethodInfo;
34 33
 import org.openzen.zenscript.codemodel.type.ISymbol;
35 34
 import org.openzen.zenscript.javashared.JavaClass;
35
+import org.openzen.zenscript.javashared.JavaField;
36 36
 
37 37
 /**
38 38
  *
@@ -50,7 +50,7 @@ public class GlobalRegistry {
50 50
 		PRINTSTREAM_PRINTLN.setTag(JavaMethodInfo.class, printstreamPrintln);
51 51
 		
52 52
 		JavaClass jSystem = new JavaClass("java.lang", "System", JavaClass.Kind.CLASS);
53
-		SYSTEM_OUT.setTag(JavaFieldInfo.class, new JavaFieldInfo(jSystem, "out", "Ljava/io/PrintStream;"));
53
+		SYSTEM_OUT.setTag(JavaField.class, new JavaField(jSystem, "out", "Ljava/io/PrintStream;"));
54 54
 	}
55 55
 	
56 56
 	public ZSPackage collectPackages() {

Loading…
Cancel
Save