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
 	}
115
 	}
116
 	
116
 	
117
 	private SourcePackage loadPackage(String name, File directory) {
117
 	private SourcePackage loadPackage(String name, File directory) {
118
+		if (!directory.exists())
119
+			throw new IllegalArgumentException("Directory does not exist: " + directory.getAbsolutePath());
120
+		
118
 		SourcePackage pkg = new SourcePackage(directory, name);
121
 		SourcePackage pkg = new SourcePackage(directory, name);
119
 		
122
 		
120
 		for (File file : directory.listFiles()) {
123
 		for (File file : directory.listFiles()) {

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

1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.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
 package org.openzen.zenscript.javabytecode;
6
 package org.openzen.zenscript.javabytecode;
7
 
7
 
8
 import java.io.File;
8
 import java.io.File;
9
+import java.util.ArrayList;
9
 import java.util.HashMap;
10
 import java.util.HashMap;
10
 import java.util.Map;
11
 import java.util.Map;
11
 
12
 
24
 import org.openzen.zenscript.javabytecode.compiler.definitions.JavaDefinitionVisitor;
25
 import org.openzen.zenscript.javabytecode.compiler.definitions.JavaDefinitionVisitor;
25
 
26
 
26
 import java.util.HashMap;
27
 import java.util.HashMap;
28
+import java.util.List;
27
 import java.util.Map;
29
 import java.util.Map;
28
 import org.openzen.zenscript.javashared.JavaClass;
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
  * @author Hoofdgebruiker
35
  * @author Hoofdgebruiker
36
 	private final JavaClassWriter scriptsClassWriter;
40
 	private final JavaClassWriter scriptsClassWriter;
37
 	private int generatedScriptBlockCounter = 0;
41
 	private int generatedScriptBlockCounter = 0;
38
 	private boolean finished = false;
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
 	public JavaCompiler(File jarFile) {
49
 	public JavaCompiler(File jarFile) {
43
 		this(false, jarFile);
50
 		this(false, jarFile);
44
 	}
51
 	}
45
 
52
 
46
 	public JavaCompiler(boolean debug, File jarFile) {
53
 	public JavaCompiler(boolean debug, File jarFile) {
47
 		target = new JavaModule();
54
 		target = new JavaModule();
48
-this.jarFile = jarFile;
49
-
55
+		this.jarFile = jarFile;
56
+		this.context = new JavaBytecodeContext(target);
57
+		
50
 		scriptsClassWriter = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
58
 		scriptsClassWriter = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
51
 		scriptsClassWriter.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, "Scripts", null, "java/lang/Object", null);
59
 		scriptsClassWriter.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, "Scripts", null, "java/lang/Object", null);
52
 	}
60
 	}
53
 
61
 
54
 	@Override
62
 	@Override
55
 	public void addDefinition(HighLevelDefinition definition, SemanticModule module) {
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
 	@Override
70
 	@Override
62
 	public void addScriptBlock(ScriptBlock script) {
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
 	private String getClassName(String filename) {
75
 	private String getClassName(String filename) {
112
 
103
 
113
 	@Override
104
 	@Override
114
 	public void run() {
105
 	public void run() {
115
-		if (compiled == null)
106
+		if (!finished)
116
 			throw new IllegalStateException("Not yet built!");
107
 			throw new IllegalStateException("Not yet built!");
117
-
118
-// TODO: execute this
108
+		
109
+		// TODO: execute this
119
 	}
110
 	}
120
 
111
 
121
 	public JavaModule finishAndGetModule() {
112
 	public JavaModule finishAndGetModule() {
122
 		if (finished)
113
 		if (finished)
123
 			throw new IllegalStateException("Already finished!");
114
 			throw new IllegalStateException("Already finished!");
115
+		
124
 		finished = true;
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
 		JavaMethodInfo runMethod = new JavaMethodInfo(new JavaClass("script", "Scripts", JavaClass.Kind.CLASS), "run", "()V", Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC);
151
 		JavaMethodInfo runMethod = new JavaMethodInfo(new JavaClass("script", "Scripts", JavaClass.Kind.CLASS), "run", "()V", Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC);
127
 		final JavaWriter runWriter = new JavaWriter(scriptsClassWriter, runMethod, null, null, null);
152
 		final JavaWriter runWriter = new JavaWriter(scriptsClassWriter, runMethod, null, null, null);
128
 		runWriter.start();
153
 		runWriter.start();
137
 		runWriter.end();
162
 		runWriter.end();
138
 
163
 
139
 		target.register("Scripts", scriptsClassWriter.toByteArray());
164
 		target.register("Scripts", scriptsClassWriter.toByteArray());
140
-
141
 		return target;
165
 		return target;
142
 	}
166
 	}
143
 }
167
 }

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

1
-/*
2
- * To change this license header, choose License Headers in Project Properties.
3
- * To change this template file, choose Tools | Templates
4
- * and open the template in the editor.
5
- */
6
-package org.openzen.zenscript.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
  * @author Hoofdgebruiker
18
  * @author Hoofdgebruiker
19
  */
19
  */
20
 public class JavaModule {
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
 	public JavaModule() {
23
 	public JavaModule() {
24
 
24
 
25
 	}
25
 	}
26
 
26
 
27
 	public void register(String classname, byte[] bytecode) {
27
 	public void register(String classname, byte[] bytecode) {
28
-		if (bytecode == null) return;
28
+		if (bytecode == null)
29
+			return;
30
+		
29
 		classes.put(classname, bytecode);
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
 			writer.write(bytecode);
34
 			writer.write(bytecode);
32
 		} catch (IOException e) {
35
 		} catch (IOException e) {
33
 			e.printStackTrace();
36
 			e.printStackTrace();
49
 
52
 
50
 		@Override
53
 		@Override
51
 		public Class<?> loadClass(String name) throws ClassNotFoundException {
54
 		public Class<?> loadClass(String name) throws ClassNotFoundException {
55
+			//System.out.println("LoadClass " + name);
56
+			
52
 			if (customClasses.containsKey(name))
57
 			if (customClasses.containsKey(name))
53
 				return customClasses.get(name);
58
 				return customClasses.get(name);
54
 			if (classes.containsKey(name)) {
59
 			if (classes.containsKey(name)) {

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

13
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
13
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
14
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
14
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
15
 import org.openzen.zenscript.codemodel.type.ITypeID;
15
 import org.openzen.zenscript.codemodel.type.ITypeID;
16
-import org.openzen.zenscript.javabytecode.JavaModule;
17
 import org.openzen.zenscript.javabytecode.JavaParameterInfo;
16
 import org.openzen.zenscript.javabytecode.JavaParameterInfo;
18
 
17
 
19
 import java.io.FileOutputStream;
18
 import java.io.FileOutputStream;
20
 import java.io.IOException;
19
 import java.io.IOException;
21
 import java.util.HashMap;
20
 import java.util.HashMap;
22
 import java.util.Map;
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
 public class CompilerUtils {
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
 	public static boolean isPrimitive(ITypeID id) {
31
 	public static boolean isPrimitive(ITypeID id) {
48
 		if (id instanceof BasicTypeID) {
32
 		if (id instanceof BasicTypeID) {
86
 		return position.getFilename().substring(0, position.getFilename().lastIndexOf('.')).replace("/", "_");
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
 	private static int lambdaCounter = 0;
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
 	public static int getKeyForSwitch(SwitchValue expression) {
152
 	public static int getKeyForSwitch(SwitchValue expression) {
171
 		return expression.accept(new SwitchKeyVisitor());
153
 		return expression.accept(new SwitchKeyVisitor());

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

1
 package org.openzen.zenscript.javabytecode.compiler;
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
 import org.objectweb.asm.ClassWriter;
6
 import org.objectweb.asm.ClassWriter;
4
 import org.objectweb.asm.Label;
7
 import org.objectweb.asm.Label;
5
 import org.objectweb.asm.Opcodes;
8
 import org.objectweb.asm.Opcodes;
21
 import java.io.FileOutputStream;
24
 import java.io.FileOutputStream;
22
 import java.io.IOException;
25
 import java.io.IOException;
23
 import org.openzen.zenscript.javashared.JavaClass;
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
 public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
30
 public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
27
 	private static final int PUBLIC = Opcodes.ACC_PUBLIC;
31
 	private static final int PUBLIC = Opcodes.ACC_PUBLIC;
28
 	private static final int STATIC = Opcodes.ACC_STATIC;
32
 	private static final int STATIC = Opcodes.ACC_STATIC;
29
 	private static final int PUBLIC_STATIC = PUBLIC | STATIC;
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
 	protected final JavaWriter javaWriter;
150
 	protected final JavaWriter javaWriter;
161
 	private final JavaCapturedExpressionVisitor capturedExpressionVisitor = new JavaCapturedExpressionVisitor(this);
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
 		if (expression.operator.getBuiltin() != null) {
200
 		if (expression.operator.getBuiltin() != null) {
209
 			switch (expression.operator.getBuiltin()) {
201
 			switch (expression.operator.getBuiltin()) {
210
 				case BYTE_COMPARE:
202
 				case BYTE_COMPARE:
365
 
357
 
366
 			if (!checkAndExecuteMethodInfo(expression.member))
358
 			if (!checkAndExecuteMethodInfo(expression.member))
367
 				throw new IllegalStateException("Call target has no method info!");
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
 			return null;
360
 			return null;
372
 		}
361
 		}
373
 
362
 
678
 				javaWriter.invokeVirtual(MAP_GET);
667
 				javaWriter.invokeVirtual(MAP_GET);
679
 
668
 
680
 				AssocTypeID type = (AssocTypeID) expression.target.type;
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
 				break;
671
 				break;
684
 			}
672
 			}
685
 			case ASSOC_INDEXSET:
673
 			case ASSOC_INDEXSET:
735
 				throw new UnsupportedOperationException("Not yet supported!");
723
 				throw new UnsupportedOperationException("Not yet supported!");
736
 			case ARRAY_INDEXGET: {
724
 			case ARRAY_INDEXGET: {
737
 				ArrayTypeID type = (ArrayTypeID) expression.target.type;
725
 				ArrayTypeID type = (ArrayTypeID) expression.target.type;
738
-				javaWriter.arrayLoad(type.elementType.accept(JavaTypeVisitor.INSTANCE));
726
+				javaWriter.arrayLoad(context.getType(type.elementType));
739
 				break;
727
 				break;
740
 			}
728
 			}
741
 			case ARRAY_INDEXSET: {
729
 			case ARRAY_INDEXSET: {
742
 				ArrayTypeID type = (ArrayTypeID) expression.target.type;
730
 				ArrayTypeID type = (ArrayTypeID) expression.target.type;
743
-				javaWriter.arrayStore(type.elementType.accept(JavaTypeVisitor.INSTANCE));
731
+				javaWriter.arrayStore(context.getType(type.elementType));
744
 				break;
732
 				break;
745
 			}
733
 			}
746
 			case ARRAY_INDEXGETRANGE: {
734
 			case ARRAY_INDEXGETRANGE: {
801
 					}
789
 					}
802
 				} else {
790
 				} else {
803
 					javaWriter.invokeStatic(ARRAYS_COPY_OF_RANGE_OBJECTS);
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
 				break;
794
 				break;
807
 			}
795
 			}
859
 			case FUNCTION_CALL:
847
 			case FUNCTION_CALL:
860
 				javaWriter.invokeInterface(
848
 				javaWriter.invokeInterface(
861
 						new JavaMethodInfo(
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
 								"accept",
851
 								"accept",
864
-								CompilerUtils.calcSign(expression.instancedHeader, false),
852
+								context.getMethodSignature(expression.instancedHeader),
865
 								Opcodes.ACC_PUBLIC));
853
 								Opcodes.ACC_PUBLIC));
866
 				break;
854
 				break;
867
 			case AUTOOP_NOTEQUALS:
855
 			case AUTOOP_NOTEQUALS:
1323
 		return null;
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
 		return null;
1328
 		return null;
1341
 	}
1329
 	}
1537
 		return null;
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
 		javaWriter.loadObject(0);
1530
 		javaWriter.loadObject(0);
1550
 		if (javaWriter.method.javaClass.isEnum()) {
1531
 		if (javaWriter.method.javaClass.isEnum()) {
1551
 			javaWriter.loadObject(1);
1532
 			javaWriter.loadObject(1);
1555
 		for (Expression argument : expression.arguments.arguments) {
1536
 		for (Expression argument : expression.arguments.arguments) {
1556
 			argument.accept(this);
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
 	@Override
1568
 	@Override
1584
 	public Void visitFunction(FunctionExpression expression) {
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
 		final String name = CompilerUtils.getLambdaCounter();
1577
 		final String name = CompilerUtils.getLambdaCounter();
1594
 
1578
 
1595
 		final JavaMethodInfo methodInfo = new JavaMethodInfo(javaWriter.method.javaClass, "accept", signature, Opcodes.ACC_PUBLIC);
1579
 		final JavaMethodInfo methodInfo = new JavaMethodInfo(javaWriter.method.javaClass, "accept", signature, Opcodes.ACC_PUBLIC);
1596
 		final ClassWriter lambdaCW = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
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
 		final JavaWriter functionWriter = new JavaWriter(lambdaCW, methodInfo, null, signature, null, "java/lang/Override");
1582
 		final JavaWriter functionWriter = new JavaWriter(lambdaCW, methodInfo, null, signature, null, "java/lang/Override");
1599
 
1583
 
1600
-
1601
 		javaWriter.newObject(name);
1584
 		javaWriter.newObject(name);
1602
 		javaWriter.dup();
1585
 		javaWriter.dup();
1603
 
1586
 
1613
 		int i = 0;
1596
 		int i = 0;
1614
 		for (CapturedExpression capture : expression.closure.captures) {
1597
 		for (CapturedExpression capture : expression.closure.captures) {
1615
 			constructorWriter.dup();
1598
 			constructorWriter.dup();
1616
-			final Type type = capture.type.accept(JavaTypeVisitor.INSTANCE);
1599
+			Type type = context.getType(capture.type);
1617
 			lambdaCW.visitField(Opcodes.ACC_FINAL | Opcodes.ACC_PRIVATE, "captured" + ++i, type.getDescriptor(), null, null).visitEnd();
1600
 			lambdaCW.visitField(Opcodes.ACC_FINAL | Opcodes.ACC_PRIVATE, "captured" + ++i, type.getDescriptor(), null, null).visitEnd();
1618
 
1601
 
1619
 			capture.accept(this);
1602
 			capture.accept(this);
1630
 		constructorWriter.end();
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
 			public Void visitGetLocalVariable(GetLocalVariableExpression varExpression) {
1621
 			public Void visitGetLocalVariable(GetLocalVariableExpression varExpression) {
1639
 				final int position = calculateMemberPosition(varExpression, expression);
1622
 				final int position = calculateMemberPosition(varExpression, expression);
1640
 				functionWriter.loadObject(0);
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
 				return null;
1625
 				return null;
1643
 			}
1626
 			}
1644
 
1627
 
1646
 			public Void visitCapturedParameter(CapturedParameterExpression varExpression) {
1629
 			public Void visitCapturedParameter(CapturedParameterExpression varExpression) {
1647
 				final int position = calculateMemberPosition(varExpression, expression);
1630
 				final int position = calculateMemberPosition(varExpression, expression);
1648
 				functionWriter.loadObject(0);
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
 				return null;
1633
 				return null;
1651
 			}
1634
 			}
1652
 		});
1635
 		});
1653
 
1636
 
1654
-
1655
 		expression.body.accept(CSV);
1637
 		expression.body.accept(CSV);
1656
-		functionWriter.ret();
1657
-
1658
 
1638
 
1639
+        functionWriter.ret();
1659
 		functionWriter.end();
1640
 		functionWriter.end();
1660
 		lambdaCW.visitEnd();
1641
 		lambdaCW.visitEnd();
1661
 
1642
 
1662
-		JavaModule.classes.putIfAbsent(name, lambdaCW.toByteArray());
1643
+		context.register(name, lambdaCW.toByteArray());
1663
 
1644
 
1664
 		try (FileOutputStream out = new FileOutputStream(name + ".class")) {
1645
 		try (FileOutputStream out = new FileOutputStream(name + ".class")) {
1665
 			out.write(lambdaCW.toByteArray());
1646
 			out.write(lambdaCW.toByteArray());
1685
 
1666
 
1686
 	private static int calculateMemberPosition(CapturedParameterExpression functionParameterExpression, FunctionExpression expression) {
1667
 	private static int calculateMemberPosition(CapturedParameterExpression functionParameterExpression, FunctionExpression expression) {
1687
 		int h = 1;//expression.header.parameters.length;
1668
 		int h = 1;//expression.header.parameters.length;
1688
-		for (CapturedExpression capture : expression.closure.captures) {
1669
+    	for (CapturedExpression capture : expression.closure.captures) {
1689
 			if (capture instanceof CapturedParameterExpression && ((CapturedParameterExpression) capture).parameter == functionParameterExpression.parameter)
1670
 			if (capture instanceof CapturedParameterExpression && ((CapturedParameterExpression) capture).parameter == functionParameterExpression.parameter)
1690
 				return h;
1671
 				return h;
1691
 			h++;
1672
 			h++;
1693
 		throw new CompileException(functionParameterExpression.position, CompileExceptionCode.INTERNAL_ERROR, "Captured Statement error");
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
 	@Override
1686
 	@Override
1708
 	public Void visitGetField(GetFieldExpression expression) {
1687
 	public Void visitGetField(GetFieldExpression expression) {
1720
 			throw new CompileException(expression.position, CompileExceptionCode.LAMBDA_HEADER_INVALID, "Could not resolve lambda parameter" + expression.parameter);
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
 	@Override
1706
 	@Override
1728
 	public Void visitGetLocalVariable(GetLocalVariableExpression expression) {
1707
 	public Void visitGetLocalVariable(GetLocalVariableExpression expression) {
1740
 		final ITypeID type = expression.value.option.getParameterType(expression.index);
1719
 		final ITypeID type = expression.value.option.getParameterType(expression.index);
1741
 		final JavaClass tag = expression.value.option.getTag(JavaClass.class);
1720
 		final JavaClass tag = expression.value.option.getTag(JavaClass.class);
1742
 		javaWriter.checkCast(tag.internalName);
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
 		return null;
1723
 		return null;
1745
 		//throw new UnsupportedOperationException(); // TODO
1724
 		//throw new UnsupportedOperationException(); // TODO
1746
 	}
1725
 	}
1833
 			case ASSOC_KEYS: {
1812
 			case ASSOC_KEYS: {
1834
 				AssocTypeID type = (AssocTypeID) expression.target.type;
1813
 				AssocTypeID type = (AssocTypeID) expression.target.type;
1835
 				ArrayTypeID result = new ArrayTypeID(null, type.keyType, 1);
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
 				javaWriter.invokeVirtual(MAP_KEYS);
1817
 				javaWriter.invokeVirtual(MAP_KEYS);
1839
 				javaWriter.dup();
1818
 				javaWriter.dup();
1846
 			case ASSOC_VALUES: {
1825
 			case ASSOC_VALUES: {
1847
 				AssocTypeID type = (AssocTypeID) expression.target.type;
1826
 				AssocTypeID type = (AssocTypeID) expression.target.type;
1848
 				ArrayTypeID result = new ArrayTypeID(null, type.valueType, 1);
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
 				javaWriter.invokeVirtual(MAP_VALUES);
1830
 				javaWriter.invokeVirtual(MAP_VALUES);
1852
 				javaWriter.dup();
1831
 				javaWriter.dup();
1954
 		return expression.resolution.accept(this);
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
 	@Override
1950
 	@Override
1972
 	public Void visitMakeConst(MakeConstExpression expression) {
1951
 	public Void visitMakeConst(MakeConstExpression expression) {
1973
 		return null;
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
 	@Override
1970
 	@Override
1992
 	public Void visitMatch(MatchExpression expression) {
1971
 	public Void visitMatch(MatchExpression expression) {
2001
 
1980
 
2002
 		//TODO replace beforeSwitch visitor or similar
1981
 		//TODO replace beforeSwitch visitor or similar
2003
 		if (expression.value.type == BasicTypeID.STRING)
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
 		//TODO replace with beforeSwitch visitor or similar
1985
 		//TODO replace with beforeSwitch visitor or similar
2007
 		for (MatchExpression.Case aCase : expression.cases) {
1986
 		for (MatchExpression.Case aCase : expression.cases) {
2046
 
2025
 
2047
 		if (hasNoDefault) {
2026
 		if (hasNoDefault) {
2048
 			javaWriter.label(defaultLabel);
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
 				javaWriter.aConstNull();
2029
 				javaWriter.aConstNull();
2052
 			else
2030
 			else
2053
 				javaWriter.iConst0();
2031
 				javaWriter.iConst0();
2054
 		}
2032
 		}
2055
 
2033
 
2056
 		javaWriter.label(end);
2034
 		javaWriter.label(end);
2057
-
2058
-
2059
-		//throw new UnsupportedOperationException("Not yet implemented!");
2060
 		return null;
2035
 		return null;
2061
 	}
2036
 	}
2062
 
2037
 
2066
 		return true;
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
 		return null;
2065
 		return null;
2088
 	}
2066
 	}
2089
 
2067
 
2131
 	@Override
2109
 	@Override
2132
 	public Void visitPostCall(PostCallExpression expression) {
2110
 	public Void visitPostCall(PostCallExpression expression) {
2133
 		expression.target.accept(this);
2111
 		expression.target.accept(this);
2134
-		javaWriter.dup(expression.type.accept(new JavaTypeVisitor()));
2112
+		javaWriter.dup(context.getType(expression.type));
2135
 		if (!checkAndExecuteByteCodeImplementation(expression.member) && !checkAndExecuteMethodInfo(expression.member))
2113
 		if (!checkAndExecuteByteCodeImplementation(expression.member) && !checkAndExecuteMethodInfo(expression.member))
2136
 			throw new IllegalStateException("Call target has no method info!");
2114
 			throw new IllegalStateException("Call target has no method info!");
2137
 
2115
 
2138
 		return null;
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
 		javaWriter.newObject(IntRange.class);
2125
 		javaWriter.newObject(IntRange.class);
2148
 		javaWriter.dup();
2126
 		javaWriter.dup();
2184
 		return null;
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
 	@Override
2173
 	@Override
2196
 	public Void visitSetLocalVariable(SetLocalVariableExpression expression) {
2174
 	public Void visitSetLocalVariable(SetLocalVariableExpression expression) {
2361
 
2339
 
2362
 		final StringBuilder builder = new StringBuilder("(");
2340
 		final StringBuilder builder = new StringBuilder("(");
2363
 		for (ITypeID type : expression.option.getOption().types) {
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
 		builder.append(")V");
2344
 		builder.append(")V");
2367
 
2345
 
2368
 
2346
 
2369
 		javaWriter.invokeSpecial(internalName, "<init>", builder.toString());
2347
 		javaWriter.invokeSpecial(internalName, "<init>", builder.toString());
2370
-
2371
-
2372
-
2373
 		return null;
2348
 		return null;
2374
 	}
2349
 	}
2375
 
2350
 
2385
 		return null;
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
 	public boolean checkAndGetFieldInfo(ConstMemberRef field, boolean isStatic) {
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
 		if (fieldInfo == null)
2408
 		if (fieldInfo == null)
2435
 			return false;
2409
 			return false;
2436
 
2410
 
2439
 	}
2413
 	}
2440
 
2414
 
2441
 	public boolean checkAndGetFieldInfo(FieldMemberRef field, boolean isStatic) {
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
 		if (fieldInfo == null)
2417
 		if (fieldInfo == null)
2444
 			return false;
2418
 			return false;
2445
 
2419
 
2451
 		}
2425
 		}
2452
 		return true;
2426
 		return true;
2453
 	}
2427
 	}
2454
-
2455
 }
2428
 }

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

1
-/*
2
- * To change this license header, choose License Headers in Project Properties.
3
- * To change this template file, choose Tools | Templates
4
- * and open the template in the editor.
5
- */
6
-package org.openzen.zenscript.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
 package org.openzen.zenscript.javabytecode.compiler;
6
 package org.openzen.zenscript.javabytecode.compiler;
7
 
7
 
8
 import org.objectweb.asm.Type;
8
 import org.objectweb.asm.Type;
9
-import org.openzen.zenscript.codemodel.expression.*;
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
 import org.openzen.zenscript.javabytecode.JavaLocalVariableInfo;
78
 import org.openzen.zenscript.javabytecode.JavaLocalVariableInfo;
11
 import org.openzen.zenscript.javabytecode.JavaParameterInfo;
79
 import org.openzen.zenscript.javabytecode.JavaParameterInfo;
12
 
80
 
13
 /**
81
 /**
82
+ *
14
  * @author Hoofdgebruiker
83
  * @author Hoofdgebruiker
15
  */
84
  */
16
 public class JavaPreDecrementVisitor implements ExpressionVisitor<Void> {
85
 public class JavaPreDecrementVisitor implements ExpressionVisitor<Void> {
17
 	private final JavaExpressionVisitor expressionCompiler;
86
 	private final JavaExpressionVisitor expressionCompiler;
18
 	private final JavaWriter javaWriter;
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
 		this.expressionCompiler = expressionCompiler;
91
 		this.expressionCompiler = expressionCompiler;
92
+		this.context = context;
22
 		javaWriter = expressionCompiler.getJavaWriter();
93
 		javaWriter = expressionCompiler.getJavaWriter();
23
 	}
94
 	}
24
 
95
 
91
 	public Void visitConditional(ConditionalExpression expression) {
162
 	public Void visitConditional(ConditionalExpression expression) {
92
 		throw new UnsupportedOperationException("Invalid increment target");
163
 		throw new UnsupportedOperationException("Invalid increment target");
93
 	}
164
 	}
94
-
165
+	
95
 	@Override
166
 	@Override
96
 	public Void visitConst(ConstExpression expression) {
167
 	public Void visitConst(ConstExpression expression) {
97
 		throw new UnsupportedOperationException("Invalid increment target");
168
 		throw new UnsupportedOperationException("Invalid increment target");
184
 
255
 
185
 	@Override
256
 	@Override
186
 	public Void visitGetField(GetFieldExpression expression) {
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
 		int local = javaWriter.local(objectType);
260
 		int local = javaWriter.local(objectType);
190
 		expression.target.accept(expressionCompiler);
261
 		expression.target.accept(expressionCompiler);
191
 		javaWriter.dup();
262
 		javaWriter.dup();
192
 		javaWriter.store(objectType, local);
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
 		javaWriter.iConst1();
268
 		javaWriter.iConst1();
198
 		javaWriter.iSub();
269
 		javaWriter.iSub();
199
-
270
+		
200
 		javaWriter.load(objectType, local);
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
 		return null;
275
 		return null;
205
 	}
276
 	}
206
 
277
 
209
 		javaWriter.idec(expression.parameter.getTag(JavaParameterInfo.class).index);
280
 		javaWriter.idec(expression.parameter.getTag(JavaParameterInfo.class).index);
210
 		return null;
281
 		return null;
211
 	}
282
 	}
212
-
283
+	
213
 	@Override
284
 	@Override
214
 	public Void visitGetLocalVariable(GetLocalVariableExpression expression) {
285
 	public Void visitGetLocalVariable(GetLocalVariableExpression expression) {
215
 		javaWriter.idec(expression.variable.getTag(JavaLocalVariableInfo.class).local);
286
 		javaWriter.idec(expression.variable.getTag(JavaLocalVariableInfo.class).local);
224
 	@Override
295
 	@Override
225
 	public Void visitGetStaticField(GetStaticFieldExpression expression) {
296
 	public Void visitGetStaticField(GetStaticFieldExpression expression) {
226
 		if (!expressionCompiler.checkAndGetFieldInfo(expression.field, false))
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
 		javaWriter.iConst1();
300
 		javaWriter.iConst1();
230
 		javaWriter.iAdd();
301
 		javaWriter.iAdd();
231
-
302
+		
232
 		if (!expressionCompiler.checkAndPutFieldInfo(expression.field, false))
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
 		return null;
306
 		return null;
236
 	}
307
 	}
237
 
308
 
289
 	public Void visitOrOr(OrOrExpression expression) {
360
 	public Void visitOrOr(OrOrExpression expression) {
290
 		throw new UnsupportedOperationException("Invalid increment target");
361
 		throw new UnsupportedOperationException("Invalid increment target");
291
 	}
362
 	}
292
-
363
+	
293
 	@Override
364
 	@Override
294
 	public Void visitPanic(PanicExpression expression) {
365
 	public Void visitPanic(PanicExpression expression) {
295
 		throw new UnsupportedOperationException("Invalid increment target");
366
 		throw new UnsupportedOperationException("Invalid increment target");
304
 	public Void visitRange(RangeExpression expression) {
375
 	public Void visitRange(RangeExpression expression) {
305
 		throw new UnsupportedOperationException("Invalid increment target");
376
 		throw new UnsupportedOperationException("Invalid increment target");
306
 	}
377
 	}
307
-
378
+	
308
 	@Override
379
 	@Override
309
 	public Void visitSameObject(SameObjectExpression expression) {
380
 	public Void visitSameObject(SameObjectExpression expression) {
310
 		throw new UnsupportedOperationException("Invalid increment target");
381
 		throw new UnsupportedOperationException("Invalid increment target");
344
 	public Void visitStaticSetter(StaticSetterExpression expression) {
415
 	public Void visitStaticSetter(StaticSetterExpression expression) {
345
 		throw new UnsupportedOperationException("Invalid increment target");
416
 		throw new UnsupportedOperationException("Invalid increment target");
346
 	}
417
 	}
347
-
418
+	
348
 	@Override
419
 	@Override
349
 	public Void visitSupertypeCast(SupertypeCastExpression expression) {
420
 	public Void visitSupertypeCast(SupertypeCastExpression expression) {
350
 		throw new UnsupportedOperationException("Invalid increment target");
421
 		throw new UnsupportedOperationException("Invalid increment target");

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

6
 package org.openzen.zenscript.javabytecode.compiler;
6
 package org.openzen.zenscript.javabytecode.compiler;
7
 
7
 
8
 import org.objectweb.asm.Type;
8
 import org.objectweb.asm.Type;
9
-import org.openzen.zenscript.codemodel.expression.*;
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
 import org.openzen.zenscript.javabytecode.JavaLocalVariableInfo;
78
 import org.openzen.zenscript.javabytecode.JavaLocalVariableInfo;
11
 import org.openzen.zenscript.javabytecode.JavaParameterInfo;
79
 import org.openzen.zenscript.javabytecode.JavaParameterInfo;
12
 
80
 
13
 /**
81
 /**
82
+ *
14
  * @author Hoofdgebruiker
83
  * @author Hoofdgebruiker
15
  */
84
  */
16
 public class JavaPreIncrementVisitor implements ExpressionVisitor<Void> {
85
 public class JavaPreIncrementVisitor implements ExpressionVisitor<Void> {
17
 	private final JavaExpressionVisitor expressionCompiler;
86
 	private final JavaExpressionVisitor expressionCompiler;
87
+	private final JavaBytecodeContext context;
18
 	private final JavaWriter javaWriter;
88
 	private final JavaWriter javaWriter;
19
-
20
-	public JavaPreIncrementVisitor(JavaExpressionVisitor expressionCompiler) {
89
+	
90
+	public JavaPreIncrementVisitor(JavaBytecodeContext context, JavaExpressionVisitor expressionCompiler) {
21
 		this.expressionCompiler = expressionCompiler;
91
 		this.expressionCompiler = expressionCompiler;
92
+		this.context = context;
22
 		javaWriter = expressionCompiler.getJavaWriter();
93
 		javaWriter = expressionCompiler.getJavaWriter();
23
 	}
94
 	}
24
 
95
 
91
 	public Void visitConditional(ConditionalExpression expression) {
162
 	public Void visitConditional(ConditionalExpression expression) {
92
 		throw new UnsupportedOperationException("Invalid increment target");
163
 		throw new UnsupportedOperationException("Invalid increment target");
93
 	}
164
 	}
94
-
165
+	
95
 	@Override
166
 	@Override
96
 	public Void visitConst(ConstExpression expression) {
167
 	public Void visitConst(ConstExpression expression) {
97
 		throw new UnsupportedOperationException("Invalid increment target");
168
 		throw new UnsupportedOperationException("Invalid increment target");
184
 
255
 
185
 	@Override
256
 	@Override
186
 	public Void visitGetField(GetFieldExpression expression) {
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
 		int local = javaWriter.local(objectType);
260
 		int local = javaWriter.local(objectType);
190
 		expression.target.accept(expressionCompiler);
261
 		expression.target.accept(expressionCompiler);
191
 		javaWriter.dup();
262
 		javaWriter.dup();
192
 		javaWriter.store(objectType, local);
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
 		javaWriter.iConst1();
268
 		javaWriter.iConst1();
198
 		javaWriter.iAdd();
269
 		javaWriter.iAdd();
199
-
270
+		
200
 		javaWriter.load(objectType, local);
271
 		javaWriter.load(objectType, local);
201
 		javaWriter.dupX1();
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
 		return null;
276
 		return null;
206
 	}
277
 	}
207
 
278
 
229
 	@Override
300
 	@Override
230
 	public Void visitGetStaticField(GetStaticFieldExpression expression) {
301
 	public Void visitGetStaticField(GetStaticFieldExpression expression) {
231
 		if (!expressionCompiler.checkAndGetFieldInfo(expression.field, false))
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
 		javaWriter.iConst1();
305
 		javaWriter.iConst1();
235
 		javaWriter.iAdd();
306
 		javaWriter.iAdd();
236
 		javaWriter.dup();
307
 		javaWriter.dup();
237
-
308
+		
238
 		if (!expressionCompiler.checkAndPutFieldInfo(expression.field, false))
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
 		return null;
312
 		return null;
242
 	}
313
 	}
243
 
314
 
295
 	public Void visitOrOr(OrOrExpression expression) {
366
 	public Void visitOrOr(OrOrExpression expression) {
296
 		throw new UnsupportedOperationException("Invalid increment target");
367
 		throw new UnsupportedOperationException("Invalid increment target");
297
 	}
368
 	}
298
-
369
+	
299
 	@Override
370
 	@Override
300
 	public Void visitPanic(PanicExpression expression) {
371
 	public Void visitPanic(PanicExpression expression) {
301
 		throw new UnsupportedOperationException("Invalid increment target");
372
 		throw new UnsupportedOperationException("Invalid increment target");
310
 	public Void visitRange(RangeExpression expression) {
381
 	public Void visitRange(RangeExpression expression) {
311
 		throw new UnsupportedOperationException("Invalid increment target");
382
 		throw new UnsupportedOperationException("Invalid increment target");
312
 	}
383
 	}
313
-
384
+	
314
 	@Override
385
 	@Override
315
 	public Void visitSameObject(SameObjectExpression expression) {
386
 	public Void visitSameObject(SameObjectExpression expression) {
316
 		throw new UnsupportedOperationException("Invalid increment target");
387
 		throw new UnsupportedOperationException("Invalid increment target");
350
 	public Void visitStaticSetter(StaticSetterExpression expression) {
421
 	public Void visitStaticSetter(StaticSetterExpression expression) {
351
 		throw new UnsupportedOperationException("Invalid increment target");
422
 		throw new UnsupportedOperationException("Invalid increment target");
352
 	}
423
 	}
353
-
424
+	
354
 	@Override
425
 	@Override
355
 	public Void visitSupertypeCast(SupertypeCastExpression expression) {
426
 	public Void visitSupertypeCast(SupertypeCastExpression expression) {
356
 		throw new UnsupportedOperationException("Invalid increment target");
427
 		throw new UnsupportedOperationException("Invalid increment target");

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

9
 
9
 
10
 import java.util.Arrays;
10
 import java.util.Arrays;
11
 import java.util.List;
11
 import java.util.List;
12
+import org.openzen.zenscript.javabytecode.JavaBytecodeContext;
12
 import org.openzen.zenscript.javashared.JavaClass;
13
 import org.openzen.zenscript.javashared.JavaClass;
13
 
14
 
14
 public class JavaStatementVisitor implements StatementVisitor<Boolean> {
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
 	@Override
35
 	@Override
32
 	public Boolean visitBlock(BlockStatement statement) {
36
 	public Boolean visitBlock(BlockStatement statement) {
95
 		//Compile Array/Collection
99
 		//Compile Array/Collection
96
 		statement.list.accept(expressionVisitor);
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
 		//javaWriter.label(min);
112
 		//javaWriter.label(min);
109
 		statement.iterator.target.acceptForIterator(new JavaForeachVisitor(this, statement.loopVariables, statement.content, start, end));
113
 		statement.iterator.target.acceptForIterator(new JavaForeachVisitor(this, statement.loopVariables, statement.content, start, end));
142
 	@Override
146
 	@Override
143
 	public Boolean visitReturn(ReturnStatement statement) {
147
 	public Boolean visitReturn(ReturnStatement statement) {
144
 		statement.value.accept(expressionVisitor);
148
 		statement.value.accept(expressionVisitor);
145
-		javaWriter.returnType(statement.value.type.accept(JavaTypeVisitor.INSTANCE));
149
+		javaWriter.returnType(context.getType(statement.value.type));
146
 		return true;
150
 		return true;
147
 	}
151
 	}
148
 
152
 
238
 			javaWriter.label(catchStart);
242
 			javaWriter.label(catchStart);
239
 
243
 
240
 			//final Type exceptionType = Type.getType(RuntimeException.class);
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
 			final int local = javaWriter.local(exceptionType);
246
 			final int local = javaWriter.local(exceptionType);
243
 			javaWriter.store(exceptionType, local);
247
 			javaWriter.store(exceptionType, local);
244
 
248
 
271
 
275
 
272
 	@Override
276
 	@Override
273
 	public Boolean visitVar(VarStatement statement) {
277
 	public Boolean visitVar(VarStatement statement) {
274
-
275
 		if (statement.initializer != null) {
278
 		if (statement.initializer != null) {
276
 			statement.initializer.accept(expressionVisitor);
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
 		int local = javaWriter.local(type);
283
 		int local = javaWriter.local(type);
281
 		if (statement.initializer != null)
284
 		if (statement.initializer != null)
282
 			javaWriter.store(type, local);
285
 			javaWriter.store(type, local);

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

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
-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
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
11
 import org.openzen.zenscript.codemodel.type.GenericTypeID;
11
 import org.openzen.zenscript.codemodel.type.GenericTypeID;
12
 import org.openzen.zenscript.codemodel.type.ITypeID;
12
 import org.openzen.zenscript.codemodel.type.ITypeID;
13
+import org.openzen.zenscript.javabytecode.JavaBytecodeContext;
13
 import org.openzen.zenscript.javabytecode.JavaMethodInfo;
14
 import org.openzen.zenscript.javabytecode.JavaMethodInfo;
14
 import org.openzen.zenscript.javabytecode.JavaModule;
15
 import org.openzen.zenscript.javabytecode.JavaModule;
15
 import org.openzen.zenscript.javabytecode.compiler.*;
16
 import org.openzen.zenscript.javabytecode.compiler.*;
35
 			Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC);
36
 			Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC);
36
 
37
 
37
 	private final JavaClassWriter outerWriter;
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
 		this.outerWriter = outerWriter;
43
 		this.outerWriter = outerWriter;
42
 	}
44
 	}
43
 
45
 
45
 	public byte[] visitClass(ClassDefinition definition) {
47
 	public byte[] visitClass(ClassDefinition definition) {
46
 		//Classes will always be created in a new File/Class
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
 		JavaClass toClass = new JavaClass(definition.pkg.fullName, definition.name, JavaClass.Kind.CLASS);
56
 		JavaClass toClass = new JavaClass(definition.pkg.fullName, definition.name, JavaClass.Kind.CLASS);
55
 		JavaClassWriter writer = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
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
 		memberVisitor.end();
68
 		memberVisitor.end();
68
 		writer.visitEnd();
69
 		writer.visitEnd();
69
 		return writer.toByteArray();
70
 		return writer.toByteArray();
78
 		//TODO: Extending Interfaces?
79
 		//TODO: Extending Interfaces?
79
 		String signature = null;
80
 		String signature = null;
80
 		writer.visit(Opcodes.V1_8, definition.modifiers | Opcodes.ACC_INTERFACE | Opcodes.ACC_ABSTRACT, definition.name, signature, Type.getInternalName(Object.class), null);
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
 		for (IDefinitionMember member : definition.members) {
83
 		for (IDefinitionMember member : definition.members) {
83
 			member.accept(memberVisitor);
84
 			member.accept(memberVisitor);
84
 		}
85
 		}
91
 	public byte[] visitEnum(EnumDefinition definition) {
92
 	public byte[] visitEnum(EnumDefinition definition) {
92
 		System.out.println("Compiling enum " + definition.name + " in " + definition.position.getFilename());
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
 		ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
101
 		ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
101
 
102
 
106
 		//Enum Stuff(required!)
107
 		//Enum Stuff(required!)
107
 		writer.visitField(Opcodes.ACC_STATIC | Opcodes.ACC_PRIVATE | Opcodes.ACC_FINAL | Opcodes.ACC_SYNTHETIC, "$VALUES", "[L" + definition.name + ";", null, null).visitEnd();
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
 		JavaClass arrayClass = JavaClass.fromInternalName("[L" + definition.name + ";", JavaClass.Kind.ARRAY);
115
 		JavaClass arrayClass = JavaClass.fromInternalName("[L" + definition.name + ";", JavaClass.Kind.ARRAY);
115
 		JavaMethodInfo arrayClone = new JavaMethodInfo(arrayClass, "clone", "()Ljava/lang/Object;", Opcodes.ACC_PUBLIC);
116
 		JavaMethodInfo arrayClone = new JavaMethodInfo(arrayClass, "clone", "()Ljava/lang/Object;", Opcodes.ACC_PUBLIC);
145
 
146
 
146
 	@Override
147
 	@Override
147
 	public byte[] visitFunction(FunctionDefinition definition) {
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
 		final JavaClass toClass = new JavaClass(definition.pkg.fullName, CompilerUtils.calcClasName(definition.position), JavaClass.Kind.CLASS);
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
 		final JavaWriter writer = new JavaWriter(outerWriter, true, methodInfo, definition, signature, null);
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
 		boolean returns = definition.statement.accept(statementVisitor);
159
 		boolean returns = definition.statement.accept(statementVisitor);
159
 		if (!returns) {
160
 		if (!returns) {
160
 			ITypeID type = definition.header.returnType;
161
 			ITypeID type = definition.header.returnType;
162
 				writer.iConst0();
163
 				writer.iConst0();
163
 			else if (type != BasicTypeID.VOID)
164
 			else if (type != BasicTypeID.VOID)
164
 				writer.aConstNull();
165
 				writer.aConstNull();
165
-			writer.returnType(type.accept(JavaTypeVisitor.INSTANCE));
166
+			writer.returnType(context.getType(type));
166
 		}
167
 		}
167
 
168
 
168
 		statementVisitor.end();
169
 		statementVisitor.end();
197
 		writer.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_ABSTRACT, "getDenominator", "()I", null, null).visitEnd();
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
 		final List<VariantDefinition.Option> options = variant.options;
203
 		final List<VariantDefinition.Option> options = variant.options;
203
 		//Each option is one of the possible child classes
204
 		//Each option is one of the possible child classes
216
 			final String signature;
217
 			final String signature;
217
 			{
218
 			{
218
 				StringBuilder builder = new StringBuilder();
219
 				StringBuilder builder = new StringBuilder();
220
+				//TODO check if this can be changed to what Stan was up to
219
 				builder.append("<");
221
 				builder.append("<");
220
 				for (final ITypeID type : option.types) {
222
 				for (final ITypeID type : option.types) {
221
 					builder.append(JavaTypeGenericVisitor.getSignatureWithBound(type));
223
 					builder.append(JavaTypeGenericVisitor.getSignatureWithBound(type));
243
 			}
245
 			}
244
 
246
 
245
 			optionWriter.visit(Opcodes.V1_8, Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC, optionClassName, signature, variantName, null);
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
 			final StringBuilder optionInitDescBuilder = new StringBuilder("(");
249
 			final StringBuilder optionInitDescBuilder = new StringBuilder("(");
250
 			final StringBuilder optionInitSignatureBuilder = new StringBuilder("(");
250
 			final StringBuilder optionInitSignatureBuilder = new StringBuilder("(");
251
 
251
 
252
 			ITypeID[] types = option.types;
252
 			ITypeID[] types = option.types;
253
 			for (int i = 0; i < types.length; ++i) {
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
 				optionInitDescBuilder.append(internalName);
255
 				optionInitDescBuilder.append(internalName);
257
 				optionInitSignatureBuilder.append("T").append(((GenericTypeID) types[i]).parameter.name).append(";");
256
 				optionInitSignatureBuilder.append("T").append(((GenericTypeID) types[i]).parameter.name).append(";");
258
 				optionWriter.visitField(Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL, "Field" + i, internalName, "T" + ((GenericTypeID) types[i]).parameter.name + ";", null).visitEnd();
257
 				optionWriter.visitField(Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL, "Field" + i, internalName, "T" + ((GenericTypeID) types[i]).parameter.name + ";", null).visitEnd();
270
 				initWriter.dup();
269
 				initWriter.dup();
271
 				initWriter.loadObject(i + 1);
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
 			initWriter.pop();
275
 			initWriter.pop();
279
 			initWriter.ret();
276
 			initWriter.ret();
291
 			optionVisitor.end();
288
 			optionVisitor.end();
292
 			optionWriter.visitEnd();
289
 			optionWriter.visitEnd();
293
 			final byte[] byteArray = optionWriter.toByteArray();
290
 			final byte[] byteArray = optionWriter.toByteArray();
294
-			JavaModule.classes.put(optionClassName, byteArray);
291
+			context.register(optionClassName, byteArray);
295
 
292
 
296
 			//Print the option files, won't be in production
293
 			//Print the option files, won't be in production
297
 			try (FileOutputStream out = new FileOutputStream(optionClassName + ".class")) {
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
 import org.openzen.zenscript.codemodel.definition.EnumDefinition;
10
 import org.openzen.zenscript.codemodel.definition.EnumDefinition;
11
 import org.openzen.zenscript.codemodel.expression.Expression;
11
 import org.openzen.zenscript.codemodel.expression.Expression;
12
 import org.openzen.zenscript.codemodel.member.*;
12
 import org.openzen.zenscript.codemodel.member.*;
13
-import org.openzen.zenscript.javabytecode.JavaFieldInfo;
14
 import org.openzen.zenscript.javabytecode.JavaMethodInfo;
13
 import org.openzen.zenscript.javabytecode.JavaMethodInfo;
15
 import org.openzen.zenscript.javabytecode.JavaParameterInfo;
14
 import org.openzen.zenscript.javabytecode.JavaParameterInfo;
16
 import org.openzen.zenscript.javabytecode.compiler.*;
15
 import org.openzen.zenscript.javabytecode.compiler.*;
17
 
16
 
18
 import java.util.List;
17
 import java.util.List;
18
+import org.openzen.zenscript.javabytecode.JavaBytecodeContext;
19
 import org.openzen.zenscript.javashared.JavaClass;
19
 import org.openzen.zenscript.javashared.JavaClass;
20
+import org.openzen.zenscript.javashared.JavaField;
20
 
21
 
21
 public class JavaMemberVisitor implements MemberVisitor<Void> {
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
 	@Override
42
 	@Override
40
 	public Void visitConst(ConstMember member) {
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
 	@Override
52
 	@Override
50
 	public Void visitField(FieldMember member) {
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
 		if (!member.isConstructorForwarded()) {
86
 		if (!member.isConstructorForwarded()) {
84
 			if (isEnum) {
87
 			if (isEnum) {
95
 				constructorWriter.invokeSpecial(Type.getInternalName(Object.class), "<init>", "()V");
98
 				constructorWriter.invokeSpecial(Type.getInternalName(Object.class), "<init>", "()V");
96
 			}
99
 			}
97
 
100
 
98
-			CompilerUtils.writeDefaultFieldInitializers(constructorWriter, definition, false);
99
-		}
101
+        }
100
 
102
 
101
 		member.body.accept(statementVisitor);
103
 		member.body.accept(statementVisitor);
102
 		constructorWriter.label(constructorEnd);
104
 		constructorWriter.label(constructorEnd);
113
 		final JavaWriter destructorWriter = new JavaWriter(writer, method, definition, null, null);
115
 		final JavaWriter destructorWriter = new JavaWriter(writer, method, definition, null, null);
114
 		destructorWriter.label(constructorStart);
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
 		// TODO: destruction of members (to be done when memory tags are implemented)
120
 		// TODO: destruction of members (to be done when memory tags are implemented)
119
 		member.body.accept(statementVisitor);
121
 		member.body.accept(statementVisitor);
120
 		destructorWriter.label(constructorEnd);
122
 		destructorWriter.label(constructorEnd);
122
 		return null;
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
 		final Label methodStart = new Label();
141
 		final Label methodStart = new Label();
140
 		final Label methodEnd = new Label();
142
 		final Label methodEnd = new Label();
143
+		//TODO see if this can be changed to Stan's changes (context call maybe?)
141
 		final JavaWriter methodWriter = new JavaWriter(writer, method, definition, JavaTypeGenericVisitor.getGenericMethodSignature(member.header), null);
144
 		final JavaWriter methodWriter = new JavaWriter(writer, method, definition, JavaTypeGenericVisitor.getGenericMethodSignature(member.header), null);
142
 		methodWriter.label(methodStart);
145
 		methodWriter.label(methodStart);
143
 		for (final FunctionParameter parameter : member.header.parameters) {
146
 		for (final FunctionParameter parameter : member.header.parameters) {
146
 				methodWriter.nameVariable(parameter.getTag(JavaParameterInfo.class).index, parameter.name, methodStart, methodEnd, parameter.type.accept(JavaTypeVisitor.INSTANCE));
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
 		if (!isAbstract) {
154
 		if (!isAbstract) {
152
 			statementVisitor.start();
155
 			statementVisitor.start();
210
 		if (enumDefinition != null) {
213
 		if (enumDefinition != null) {
211
 			for (EnumConstantMember constant : enumDefinition.enumConstants) {
214
 			for (EnumConstantMember constant : enumDefinition.enumConstants) {
212
 				writer.visitField(Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL | Opcodes.ACC_ENUM, constant.name, "L" + definition.name + ";", null, null).visitEnd();
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
 				final JavaWriter clinitWriter = clinitStatementVisitor.getJavaWriter();
217
 				final JavaWriter clinitWriter = clinitStatementVisitor.getJavaWriter();
215
 				clinitWriter.newObject(internalName);
218
 				clinitWriter.newObject(internalName);
216
 				clinitWriter.dup();
219
 				clinitWriter.dup();
220
 					argument.accept(clinitStatementVisitor.expressionVisitor);
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
 				clinitWriter.putStaticField(internalName, constant.name, "L" + internalName + ";");
227
 				clinitWriter.putStaticField(internalName, constant.name, "L" + internalName + ";");
225
 
228
 
226
 				enumDefinition = (EnumDefinition) constant.definition;
229
 				enumDefinition = (EnumDefinition) constant.definition;

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

21
 	public static final JavaClass MAP = new JavaClass("java.util", "Map", JavaClass.Kind.INTERFACE);
21
 	public static final JavaClass MAP = new JavaClass("java.util", "Map", JavaClass.Kind.INTERFACE);
22
 	public static final JavaClass HASHMAP = new JavaClass("java.util", "HashMap", JavaClass.Kind.CLASS);
22
 	public static final JavaClass HASHMAP = new JavaClass("java.util", "HashMap", JavaClass.Kind.CLASS);
23
 	public static final JavaClass ITERATOR = new JavaClass("java.util", "Iterator", JavaClass.Kind.INTERFACE);
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
 	public static JavaClass fromInternalName(String internalName, Kind kind) {
36
 	public static JavaClass fromInternalName(String internalName, Kind kind) {
26
 		if (kind == Kind.ARRAY)
37
 		if (kind == Kind.ARRAY)
45
 	
56
 	
46
 	public boolean empty = false;
57
 	public boolean empty = false;
47
 	public boolean destructible = false;
58
 	public boolean destructible = false;
59
+	public boolean membersPrepared = false;
48
 	
60
 	
49
 	private final String[] classNameParts;
61
 	private final String[] classNameParts;
50
 	
62
 	

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

1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.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
  * To change this template file, choose Tools | Templates
3
  * To change this template file, choose Tools | Templates
4
  * and open the template in the editor.
4
  * and open the template in the editor.
5
  */
5
  */
6
-package org.openzen.zenscript.javasource.tags;
7
-
8
-import org.openzen.zenscript.javashared.JavaClass;
6
+package org.openzen.zenscript.javashared;
9
 
7
 
10
 /**
8
 /**
11
  *
9
  *
12
  * @author Hoofdgebruiker
10
  * @author Hoofdgebruiker
13
  */
11
  */
14
-public class JavaSourceField {
12
+public class JavaField {
15
 	public final JavaClass cls;
13
 	public final JavaClass cls;
16
 	public final String name;
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
 		this.cls = cls;
18
 		this.cls = cls;
20
 		this.name = name;
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
  * To change this template file, choose Tools | Templates
3
  * To change this template file, choose Tools | Templates
4
  * and open the template in the editor.
4
  * and open the template in the editor.
5
  */
5
  */
6
-package org.openzen.zenscript.javasource.tags;
7
-
8
-import org.openzen.zenscript.javashared.JavaClass;
6
+package org.openzen.zenscript.javashared;
9
 
7
 
10
 /**
8
 /**
11
  *
9
  *
12
  * @author Hoofdgebruiker
10
  * @author Hoofdgebruiker
13
  */
11
  */
14
-public class JavaSourceImplementation {
12
+public class JavaImplementation {
15
 	public final boolean inline;
13
 	public final boolean inline;
16
 	public final JavaClass implementationClass;
14
 	public final JavaClass implementationClass;
17
 	
15
 	
18
-	public JavaSourceImplementation(boolean inline, JavaClass implementationClass) {
16
+	public JavaImplementation(boolean inline, JavaClass implementationClass) {
19
 		this.inline = inline;
17
 		this.inline = inline;
20
 		this.implementationClass = implementationClass;
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
  * To change this template file, choose Tools | Templates
3
  * To change this template file, choose Tools | Templates
4
  * and open the template in the editor.
4
  * and open the template in the editor.
5
  */
5
  */
6
-package org.openzen.zenscript.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
  * @author Hoofdgebruiker
10
  * @author Hoofdgebruiker
14
  */
11
  */
15
-public class JavaSourceMethod {
12
+public class JavaMethod {
16
 	public final JavaClass cls;
13
 	public final JavaClass cls;
17
 	public final Kind kind;
14
 	public final Kind kind;
18
 	public final String name;
15
 	public final String name;
19
 	public final boolean compile;
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
 		this.cls = cls;
23
 		this.cls = cls;
24
 		this.kind = kind;
24
 		this.kind = kind;
25
 		this.name = name;
25
 		this.name = name;
26
 		this.compile = compile;
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
 		this.cls = null;
34
 		this.cls = null;
32
 		this.kind = Kind.COMPILED;
35
 		this.kind = Kind.COMPILED;
33
 		this.name = null;
36
 		this.name = null;
34
 		this.compile = false;
37
 		this.compile = false;
35
-		this.compiler = compiler;
38
+		this.translation = translation;
39
+		this.descriptor = "";
40
+		this.modifiers = 0;
36
 	}
41
 	}
37
 	
42
 	
38
 	public enum Kind {
43
 	public enum Kind {

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

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

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

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

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
  * To change this template file, choose Tools | Templates
3
  * To change this template file, choose Tools | Templates
4
  * and open the template in the editor.
4
  * and open the template in the editor.
5
  */
5
  */
6
-package org.openzen.zenscript.javasource;
6
+package org.openzen.zenscript.javashared;
7
 
7
 
8
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
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

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

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
  * To change this template file, choose Tools | Templates
3
  * To change this template file, choose Tools | Templates
4
  * and open the template in the editor.
4
  * and open the template in the editor.
5
  */
5
  */
6
-package org.openzen.zenscript.javasource;
6
+package org.openzen.zenscript.javashared;
7
 
7
 
8
 import java.util.ArrayList;
8
 import java.util.ArrayList;
9
 import java.util.HashMap;
9
 import java.util.HashMap;
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
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
 	private final Map<TypeParameter, String> typeParameters = new HashMap<>();
33
 	private final Map<TypeParameter, String> typeParameters = new HashMap<>();
34
 	public final List<TypeParameter> typeParameterList = new ArrayList<>();
34
 	public final List<TypeParameter> typeParameterList = new ArrayList<>();
35
-
35
+	
36
 	@Override
36
 	@Override
37
 	public String visitBasic(BasicTypeID basic) {
37
 	public String visitBasic(BasicTypeID basic) {
38
 		switch (basic) {
38
 		switch (basic) {

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

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

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
  * To change this template file, choose Tools | Templates
3
  * To change this template file, choose Tools | Templates
4
  * and open the template in the editor.
4
  * and open the template in the editor.
5
  */
5
  */
6
-package org.openzen.zenscript.javasource;
6
+package org.openzen.zenscript.javashared;
7
 
7
 
8
 import org.openzen.zenscript.codemodel.FunctionParameter;
8
 import org.openzen.zenscript.codemodel.FunctionParameter;
9
 import org.openzen.zenscript.codemodel.type.ArrayTypeID;
9
 import org.openzen.zenscript.codemodel.type.ArrayTypeID;
22
  *
22
  *
23
  * @author Hoofdgebruiker
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
 	@Override
28
 	@Override
29
 	public String visitBasic(BasicTypeID basic) {
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
  * To change this template file, choose Tools | Templates
3
  * To change this template file, choose Tools | Templates
4
  * and open the template in the editor.
4
  * and open the template in the editor.
5
  */
5
  */
6
-package org.openzen.zenscript.javasource.tags;
7
-
8
-import org.openzen.zenscript.javashared.JavaClass;
6
+package org.openzen.zenscript.javashared;
9
 
7
 
10
 /**
8
 /**
11
  *
9
  *
12
  * @author Hoofdgebruiker
10
  * @author Hoofdgebruiker
13
  */
11
  */
14
-public class JavaSourceVariantOption {
12
+public class JavaVariantOption {
15
 	public final JavaClass variantClass;
13
 	public final JavaClass variantClass;
16
 	public final JavaClass variantOptionClass;
14
 	public final JavaClass variantOptionClass;
17
 	
15
 	
18
-	public JavaSourceVariantOption(JavaClass variantClass, JavaClass variantOptionClass) {
16
+	public JavaVariantOption(JavaClass variantClass, JavaClass variantOptionClass) {
19
 		this.variantClass = variantClass;
17
 		this.variantClass = variantClass;
20
 		this.variantOptionClass = variantOptionClass;
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
  * To change this template file, choose Tools | Templates
3
  * To change this template file, choose Tools | Templates
4
  * and open the template in the editor.
4
  * and open the template in the editor.
5
  */
5
  */
6
-package org.openzen.zenscript.javasource.prepare;
6
+package org.openzen.zenscript.javashared.prepare;
7
 
7
 
8
+import org.openzen.zenscript.javashared.JavaNativeClass;
8
 import org.openzen.zencode.shared.StringExpansion;
9
 import org.openzen.zencode.shared.StringExpansion;
9
 import org.openzen.zenscript.codemodel.OperatorType;
10
 import org.openzen.zenscript.codemodel.OperatorType;
10
 import org.openzen.zenscript.codemodel.annotations.NativeTag;
11
 import org.openzen.zenscript.codemodel.annotations.NativeTag;
16
 import org.openzen.zenscript.codemodel.member.DefinitionMember;
17
 import org.openzen.zenscript.codemodel.member.DefinitionMember;
17
 import org.openzen.zenscript.codemodel.member.DestructorMember;
18
 import org.openzen.zenscript.codemodel.member.DestructorMember;
18
 import org.openzen.zenscript.codemodel.member.FieldMember;
19
 import org.openzen.zenscript.codemodel.member.FieldMember;
20
+import org.openzen.zenscript.codemodel.member.FunctionalMember;
19
 import org.openzen.zenscript.codemodel.member.GetterMember;
21
 import org.openzen.zenscript.codemodel.member.GetterMember;
20
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
22
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
21
 import org.openzen.zenscript.codemodel.member.ImplementationMember;
23
 import org.openzen.zenscript.codemodel.member.ImplementationMember;
26
 import org.openzen.zenscript.codemodel.member.SetterMember;
28
 import org.openzen.zenscript.codemodel.member.SetterMember;
27
 import org.openzen.zenscript.codemodel.member.StaticInitializerMember;
29
 import org.openzen.zenscript.codemodel.member.StaticInitializerMember;
28
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
30
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
29
-import org.openzen.zenscript.javasource.JavaSourceTypeNameVisitor;
31
+import org.openzen.zenscript.javashared.JavaTypeNameVisitor;
30
 import org.openzen.zenscript.javashared.JavaClass;
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
  * @author Hoofdgebruiker
41
  * @author Hoofdgebruiker
38
  */
42
  */
39
-public class JavaSourcePrepareClassMethodVisitor implements MemberVisitor<Void> {
43
+public class JavaPrepareClassMethodVisitor implements MemberVisitor<Void> {
40
 	private static final boolean DEBUG_EMPTY = true;
44
 	private static final boolean DEBUG_EMPTY = true;
41
 	
45
 	
42
-	private final JavaSourcePrepareDefinitionVisitor definitionPreparer;
46
+	private final JavaContext context;
43
 	private final String filename;
47
 	private final String filename;
44
 	private final JavaClass cls;
48
 	private final JavaClass cls;
45
 	private final JavaNativeClass nativeClass;
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
 			String filename,
54
 			String filename,
50
 			JavaClass cls,
55
 			JavaClass cls,
51
 			JavaNativeClass nativeClass,
56
 			JavaNativeClass nativeClass,
57
+			JavaPrepareDefinitionMemberVisitor memberPreparer,
52
 			boolean startsEmpty) {
58
 			boolean startsEmpty) {
53
-		this.definitionPreparer = definitionPreparer;
59
+		this.context = context;
54
 		this.filename = filename;
60
 		this.filename = filename;
55
 		this.cls = cls;
61
 		this.cls = cls;
56
 		this.nativeClass = nativeClass;
62
 		this.nativeClass = nativeClass;
63
+		this.memberPreparer = memberPreparer;
57
 		
64
 		
58
 		cls.empty = startsEmpty;
65
 		cls.empty = startsEmpty;
59
 	}
66
 	}
64
 			System.out.println("Class " + cls.fullName + " not empty because of const " + member.name);
71
 			System.out.println("Class " + cls.fullName + " not empty because of const " + member.name);
65
 		
72
 		
66
 		cls.empty = false;
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
 		return null;
75
 		return null;
69
 	}
76
 	}
70
 	
77
 	
71
 	@Override
78
 	@Override
72
 	public Void visitField(FieldMember member) {
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
 		if (member.hasAutoGetter())
81
 		if (member.hasAutoGetter())
75
 			visitGetter(member.autoGetter);
82
 			visitGetter(member.autoGetter);
76
 		if (member.hasAutoSetter())
83
 		if (member.hasAutoSetter())
120
 
127
 
121
 	@Override
128
 	@Override
122
 	public Void visitCaster(CasterMember member) {
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
 		return null;
131
 		return null;
125
 	}
132
 	}
126
 
133
 
138
 
145
 
139
 	@Override
146
 	@Override
140
 	public Void visitImplementation(ImplementationMember member) {
147
 	public Void visitImplementation(ImplementationMember member) {
141
-		definitionPreparer.prepare(member.type);
148
+		memberPreparer.prepare(member.type);
142
 		
149
 		
143
 		if (canMergeImplementation(member)) {
150
 		if (canMergeImplementation(member)) {
144
-			member.setTag(JavaSourceImplementation.class, new JavaSourceImplementation(true, cls));
151
+			member.setTag(JavaImplementation.class, new JavaImplementation(true, cls));
145
 			for (IDefinitionMember m : member.members)
152
 			for (IDefinitionMember m : member.members)
146
 				m.accept(this);
153
 				m.accept(this);
147
 		} else {
154
 		} else {
150
 			
157
 			
151
 			cls.empty = false;
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
 			for (IDefinitionMember m : member.members)
164
 			for (IDefinitionMember m : member.members)
158
 				m.accept(visitor);
165
 				m.accept(visitor);
159
 		}
166
 		}
166
 
173
 
167
 	@Override
174
 	@Override
168
 	public Void visitInnerDefinition(InnerDefinitionMember member) {
175
 	public Void visitInnerDefinition(InnerDefinitionMember member) {
169
-		JavaSourcePrepareDefinitionVisitor innerDefinitionPrepare = new JavaSourcePrepareDefinitionVisitor(filename, cls);
176
+		JavaPrepareDefinitionMemberVisitor innerDefinitionPrepare = new JavaPrepareDefinitionMemberVisitor(context, filename);
170
 		member.innerDefinition.accept(innerDefinitionPrepare);
177
 		member.innerDefinition.accept(innerDefinitionPrepare);
171
 		
178
 		
172
 		if (DEBUG_EMPTY && cls.empty)
179
 		if (DEBUG_EMPTY && cls.empty)
184
 		return null;
191
 		return null;
185
 	}
192
 	}
186
 	
193
 	
187
-	private JavaSourceMethod.Kind getKind(DefinitionMember member) {
194
+	private JavaMethod.Kind getKind(DefinitionMember member) {
188
 		if (member instanceof ConstructorMember)
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
 	private String getOperatorName(OperatorType operator) {
201
 	private String getOperatorName(OperatorType operator) {
274
 		}
281
 		}
275
 	}
282
 	}
276
 	
283
 	
277
-	private void visitFunctional(DefinitionMember member, String name) {
284
+	private void visitFunctional(FunctionalMember member, String name) {
278
 		NativeTag nativeTag = member.getTag(NativeTag.class);
285
 		NativeTag nativeTag = member.getTag(NativeTag.class);
279
-		JavaSourceMethod method = null;
286
+		JavaMethod method = null;
280
 		if (nativeTag != null && nativeClass != null)
287
 		if (nativeTag != null && nativeClass != null)
281
 			method = nativeClass.getMethod(nativeTag.value);
288
 			method = nativeClass.getMethod(nativeTag.value);
282
 		
289
 		
283
 		if (member.getOverrides() != null) {
290
 		if (member.getOverrides() != null) {
284
 			DefinitionMemberRef base = member.getOverrides();
291
 			DefinitionMemberRef base = member.getOverrides();
285
-			JavaSourceMethod baseMethod = base.getTarget().getTag(JavaSourceMethod.class);
292
+			JavaMethod baseMethod = base.getTarget().getTag(JavaMethod.class);
286
 			if (baseMethod == null)
293
 			if (baseMethod == null)
287
 				throw new IllegalStateException("Base method not yet prepared!");
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
 		} else if (method == null) {
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
 		if (method.compile) {
301
 		if (method.compile) {
298
 			cls.empty = false;
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

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

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
  * To change this template file, choose Tools | Templates
3
  * To change this template file, choose Tools | Templates
4
  * and open the template in the editor.
4
  * and open the template in the editor.
5
  */
5
  */
6
-package org.openzen.zenscript.javasource.prepare;
6
+package org.openzen.zenscript.javashared.prepare;
7
 
7
 
8
+import org.openzen.zenscript.javashared.JavaNativeClass;
8
 import org.openzen.zencode.shared.StringExpansion;
9
 import org.openzen.zencode.shared.StringExpansion;
9
 import org.openzen.zenscript.codemodel.OperatorType;
10
 import org.openzen.zenscript.codemodel.OperatorType;
10
 import org.openzen.zenscript.codemodel.annotations.NativeTag;
11
 import org.openzen.zenscript.codemodel.annotations.NativeTag;
16
 import org.openzen.zenscript.codemodel.member.DefinitionMember;
17
 import org.openzen.zenscript.codemodel.member.DefinitionMember;
17
 import org.openzen.zenscript.codemodel.member.DestructorMember;
18
 import org.openzen.zenscript.codemodel.member.DestructorMember;
18
 import org.openzen.zenscript.codemodel.member.FieldMember;
19
 import org.openzen.zenscript.codemodel.member.FieldMember;
20
+import org.openzen.zenscript.codemodel.member.FunctionalMember;
19
 import org.openzen.zenscript.codemodel.member.GetterMember;
21
 import org.openzen.zenscript.codemodel.member.GetterMember;
20
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
22
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
21
 import org.openzen.zenscript.codemodel.member.ImplementationMember;
23
 import org.openzen.zenscript.codemodel.member.ImplementationMember;
25
 import org.openzen.zenscript.codemodel.member.OperatorMember;
27
 import org.openzen.zenscript.codemodel.member.OperatorMember;
26
 import org.openzen.zenscript.codemodel.member.SetterMember;
28
 import org.openzen.zenscript.codemodel.member.SetterMember;
27
 import org.openzen.zenscript.codemodel.member.StaticInitializerMember;
29
 import org.openzen.zenscript.codemodel.member.StaticInitializerMember;
28
-import org.openzen.zenscript.javasource.JavaSourceTypeNameVisitor;
30
+import org.openzen.zenscript.javashared.JavaTypeNameVisitor;
29
 import org.openzen.zenscript.javashared.JavaClass;
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
  * @author Hoofdgebruiker
40
  * @author Hoofdgebruiker
37
  */
41
  */
38
-public class JavaSourcePrepareExpansionMethodVisitor implements MemberVisitor<Void> {
42
+public class JavaPrepareExpansionMethodVisitor implements MemberVisitor<Void> {
39
 	private static final boolean DEBUG_EMPTY = true;
43
 	private static final boolean DEBUG_EMPTY = true;
40
 	
44
 	
45
+	private final JavaContext context;
41
 	private final JavaClass cls;
46
 	private final JavaClass cls;
42
 	private final JavaNativeClass nativeClass;
47
 	private final JavaNativeClass nativeClass;
43
 	
48
 	
44
-	public JavaSourcePrepareExpansionMethodVisitor(JavaClass cls, JavaNativeClass nativeClass) {
49
+	public JavaPrepareExpansionMethodVisitor(JavaContext context, JavaClass cls, JavaNativeClass nativeClass) {
45
 		this.cls = cls;
50
 		this.cls = cls;
46
 		this.nativeClass = nativeClass;
51
 		this.nativeClass = nativeClass;
52
+		this.context = context;
47
 		cls.empty = true;
53
 		cls.empty = true;
48
 	}
54
 	}
49
 	
55
 	
50
 	@Override
56
 	@Override
51
 	public Void visitConst(ConstMember member) {
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
 		if (DEBUG_EMPTY && cls.empty)
60
 		if (DEBUG_EMPTY && cls.empty)
55
 			System.out.println("Class " + cls.fullName + " not empty because of const");
61
 			System.out.println("Class " + cls.fullName + " not empty because of const");
61
 	@Override
67
 	@Override
62
 	public Void visitField(FieldMember member) {
68
 	public Void visitField(FieldMember member) {
63
 		// TODO: expansion fields
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
 		if (member.hasAutoGetter() || member.hasAutoSetter())
71
 		if (member.hasAutoGetter() || member.hasAutoSetter())
66
 			cls.empty = false;
72
 			cls.empty = false;
67
 		return null;
73
 		return null;
108
 
114
 
109
 	@Override
115
 	@Override
110
 	public Void visitCaster(CasterMember member) {
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
 		return null;
118
 		return null;
113
 	}
119
 	}
114
 
120
 
126
 
132
 
127
 	@Override
133
 	@Override
128
 	public Void visitImplementation(ImplementationMember member) {
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
 		for (IDefinitionMember implementedMember : member.members)
137
 		for (IDefinitionMember implementedMember : member.members)
132
 			implementedMember.accept(this);
138
 			implementedMember.accept(this);
133
 		
139
 		
147
 		return null;
153
 		return null;
148
 	}
154
 	}
149
 	
155
 	
150
-	private void visitFunctional(DefinitionMember member, String name) {
156
+	private void visitFunctional(FunctionalMember member, String name) {
151
 		NativeTag nativeTag = member.getTag(NativeTag.class);
157
 		NativeTag nativeTag = member.getTag(NativeTag.class);
152
-		JavaSourceMethod method = null;
158
+		JavaMethod method = null;
153
 		if (nativeTag != null && nativeClass != null)
159
 		if (nativeTag != null && nativeClass != null)
154
 			method = nativeClass.getMethod(nativeTag.value);
160
 			method = nativeClass.getMethod(nativeTag.value);
155
 		if (method == null)
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
 		if (method.compile) {
164
 		if (method.compile) {
159
 			if (DEBUG_EMPTY && cls.empty)
165
 			if (DEBUG_EMPTY && cls.empty)
162
 			cls.empty = false;
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
 	private String getOperatorName(OperatorType operator) {
178
 	private String getOperatorName(OperatorType operator) {

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

25
 public class FormattingUtils {
25
 public class FormattingUtils {
26
 	private FormattingUtils() {}
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
 	public static void formatHeader(StringBuilder result, JavaSourceFormattingSettings settings, FunctionHeader header, JavaSourceTypeVisitor typeFormatter) {
28
 	public static void formatHeader(StringBuilder result, JavaSourceFormattingSettings settings, FunctionHeader header, JavaSourceTypeVisitor typeFormatter) {
56
 		FormattingUtils.formatTypeParameters(result, header.typeParameters, typeFormatter);
29
 		FormattingUtils.formatTypeParameters(result, header.typeParameters, typeFormatter);
57
 		result.append("(");
30
 		result.append("(");

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

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

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

31
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
31
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
32
 import org.openzen.zenscript.codemodel.type.ITypeID;
32
 import org.openzen.zenscript.codemodel.type.ITypeID;
33
 import org.openzen.zenscript.javasource.scope.JavaSourceFileScope;
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
 	}
56
 	}
57
 	
57
 	
58
 	private void compileMethod(DefinitionMember member, FunctionHeader header, Statement body) {
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
 		if (method == null)
60
 		if (method == null)
61
 			throw new AssertionError();
61
 			throw new AssertionError();
62
 		if (!method.compile)
62
 		if (!method.compile)

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

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

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

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

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

1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.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
 import org.openzen.zenscript.formattershared.StatementFormattingTarget;
94
 import org.openzen.zenscript.formattershared.StatementFormattingTarget;
95
 import org.openzen.zenscript.javasource.scope.JavaSourceStatementScope;
95
 import org.openzen.zenscript.javasource.scope.JavaSourceStatementScope;
96
 import org.openzen.zenscript.javashared.JavaClass;
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
  * @author Hoofdgebruiker
105
  * @author Hoofdgebruiker
104
  */
106
  */
105
-public class JavaSourceExpressionFormatter implements ExpressionVisitor<ExpressionString> {
107
+public class JavaSourceExpressionFormatter implements ExpressionVisitor<ExpressionString>, JavaNativeTranslator<ExpressionString> {
106
 	private static final JavaClass RESULT = new JavaClass("stdlib", "Result", JavaClass.Kind.CLASS);
108
 	private static final JavaClass RESULT = new JavaClass("stdlib", "Result", JavaClass.Kind.CLASS);
107
 	private static final JavaClass RESULT_OK = new JavaClass("stdlib", "Result.Ok", JavaClass.Kind.CLASS);
109
 	private static final JavaClass RESULT_OK = new JavaClass("stdlib", "Result.Ok", JavaClass.Kind.CLASS);
108
 	private static final JavaClass RESULT_ERROR = new JavaClass("stdlib", "Result.Error", JavaClass.Kind.CLASS);
110
 	private static final JavaClass RESULT_ERROR = new JavaClass("stdlib", "Result.Error", JavaClass.Kind.CLASS);
159
 		if (expression.member.getBuiltin() != null) {
161
 		if (expression.member.getBuiltin() != null) {
160
 			return visitBuiltinCall(expression, expression.member.getBuiltin());
162
 			return visitBuiltinCall(expression, expression.member.getBuiltin());
161
 		} else {
163
 		} else {
162
-			JavaSourceMethod method = expression.member.getTag(JavaSourceMethod.class);
164
+			JavaMethod method = expression.member.getTag(JavaMethod.class);
163
 			if (method == null)
165
 			if (method == null)
164
 				throw new IllegalStateException("No source method tag for " + expression.member.getCanonicalName() + "!");
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
 			} else {
170
 			} else {
169
 				return compileCall(method, expression.target, expression.arguments);
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
 		switch (method.kind) {
177
 		switch (method.kind) {
176
 			case EXPANSION: {
178
 			case EXPANSION: {
177
 				StringBuilder output = new StringBuilder();
179
 				StringBuilder output = new StringBuilder();
199
 		if (expression.member.getBuiltin() != null)
201
 		if (expression.member.getBuiltin() != null)
200
 			return visitBuiltinCallStatic(expression, expression.member.getBuiltin());
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
 		if (method == null)
205
 		if (method == null)
204
 			throw new IllegalStateException("No source method tag for " + expression.member.getCanonicalName() + "!");
206
 			throw new IllegalStateException("No source method tag for " + expression.member.getCanonicalName() + "!");
205
 		
207
 		
241
 		if (expression.member.member.builtin != null)
243
 		if (expression.member.member.builtin != null)
242
 			return visitBuiltinCast(expression);
244
 			return visitBuiltinCast(expression);
243
 		
245
 		
244
-		JavaSourceMethod method = expression.member.getTag(JavaSourceMethod.class);
246
+		JavaMethod method = expression.member.getTag(JavaMethod.class);
245
 		if (method == null)
247
 		if (method == null)
246
 			throw new CompileException(expression.position, CompileExceptionCode.INTERNAL_ERROR, "No tag for caster");
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
 		} else {
252
 		} else {
251
 			return compileCall(method, expression.target, CallArguments.EMPTY);
253
 			return compileCall(method, expression.target, CallArguments.EMPTY);
252
 		}
254
 		}
429
 
431
 
430
 	@Override
432
 	@Override
431
 	public ExpressionString visitGetStaticField(GetStaticFieldExpression expression) {
433
 	public ExpressionString visitGetStaticField(GetStaticFieldExpression expression) {
432
-		JavaSourceField field = expression.field.getTag(JavaSourceField.class);
434
+		JavaField field = expression.field.getTag(JavaField.class);
433
 		if (field == null)
435
 		if (field == null)
434
 			throw new CompileException(expression.position, CompileExceptionCode.INTERNAL_ERROR, "Missing field tag");
436
 			throw new CompileException(expression.position, CompileExceptionCode.INTERNAL_ERROR, "Missing field tag");
435
 		
437
 		
441
 		if (expression.getter.member.builtin != null)
443
 		if (expression.getter.member.builtin != null)
442
 			return visitBuiltinGetter(expression, expression.getter.member.builtin);
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
 		StringBuilder result = new StringBuilder();
447
 		StringBuilder result = new StringBuilder();
446
 		result.append(expression.target.accept(this));
448
 		result.append(expression.target.accept(this));
447
 		result.append(".");
449
 		result.append(".");
513
 		if (expression.constructor.getBuiltin() != null)
515
 		if (expression.constructor.getBuiltin() != null)
514
 			return visitBuiltinConstructor(expression);
516
 			return visitBuiltinConstructor(expression);
515
 		
517
 		
516
-		JavaSourceMethod method = expression.constructor.getTag(JavaSourceMethod.class);
518
+		JavaMethod method = expression.constructor.getTag(JavaMethod.class);
517
 		switch (method.kind) {
519
 		switch (method.kind) {
518
 			case EXPANSION: {
520
 			case EXPANSION: {
519
 				StringBuilder output = new StringBuilder();
521
 				StringBuilder output = new StringBuilder();
596
 
598
 
597
 	@Override
599
 	@Override
598
 	public ExpressionString visitSetStaticField(SetStaticFieldExpression expression) {
600
 	public ExpressionString visitSetStaticField(SetStaticFieldExpression expression) {
599
-		JavaSourceField field = expression.field.getTag(JavaSourceField.class);
601
+		JavaField field = expression.field.getTag(JavaField.class);
600
 		if (field == null)
602
 		if (field == null)
601
 			throw new CompileException(expression.position, CompileExceptionCode.INTERNAL_ERROR, "Missing field tag");
603
 			throw new CompileException(expression.position, CompileExceptionCode.INTERNAL_ERROR, "Missing field tag");
602
 		if (field.cls.fullName.equals(scope.fileScope.cls.fullName) && !scope.hasLocalVariable(field.name)) {
604
 		if (field.cls.fullName.equals(scope.fileScope.cls.fullName) && !scope.hasLocalVariable(field.name)) {
699
 	
701
 	
700
 	@Override
702
 	@Override
701
 	public ExpressionString visitVariantValue(VariantValueExpression expression) {
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
 		StringBuilder result = new StringBuilder();
706
 		StringBuilder result = new StringBuilder();
705
 		result.append("new ").append(scope.type(option.variantOptionClass));
707
 		result.append("new ").append(scope.type(option.variantOptionClass));
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
 	public ExpressionString unaryPrefix(Expression value, JavaOperator operator) {
745
 	public ExpressionString unaryPrefix(Expression value, JavaOperator operator) {
753
 		return value.accept(this).unaryPrefix(operator);
746
 		return value.accept(this).unaryPrefix(operator);
754
 	}
747
 	}
1130
 				}
1123
 				}
1131
 			}
1124
 			}
1132
 			case ARRAY_CONTAINS: {
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
 				return callAsStatic(scope.fileScope.importer.importType(method.cls) + '.' + method.name, call);
1127
 				return callAsStatic(scope.fileScope.importer.importType(method.cls) + '.' + method.name, call);
1135
 			}
1128
 			}
1136
 			case ARRAY_EQUALS: return callAsStatic("Arrays.equals", call);
1129
 			case ARRAY_EQUALS: return callAsStatic("Arrays.equals", call);
1772
 		
1765
 		
1773
 		throw new UnsupportedOperationException("Unknown builtin constructor: " + expression.constructor.getBuiltin());
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
  */
5
  */
6
 package org.openzen.zenscript.javasource;
6
 package org.openzen.zenscript.javasource;
7
 
7
 
8
+import org.openzen.zenscript.javashared.JavaContext;
8
 import java.io.BufferedOutputStream;
9
 import java.io.BufferedOutputStream;
9
 import java.io.File;
10
 import java.io.File;
10
 import java.io.FileOutputStream;
11
 import java.io.FileOutputStream;
23
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
24
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
24
 import org.openzen.zenscript.compiler.SemanticModule;
25
 import org.openzen.zenscript.compiler.SemanticModule;
25
 import org.openzen.zenscript.javashared.JavaClass;
26
 import org.openzen.zenscript.javashared.JavaClass;
27
+import org.openzen.zenscript.javashared.prepare.JavaPrepareDefinitionMemberVisitor;
26
 
28
 
27
 /**
29
 /**
28
  *
30
  *
67
 		modules.put(definition, module);
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
 	public void write() {
82
 	public void write() {
71
 		System.out.println("Calling write on " + file.getName());
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
 			mainDefinition = expansions.remove(0);
89
 			mainDefinition = expansions.remove(0);
90
+		}
75
 		
91
 		
76
 		HighLevelDefinition definition = mainDefinition;
92
 		HighLevelDefinition definition = mainDefinition;
77
 		JavaDefinitionVisitor visitor = new JavaDefinitionVisitor(
93
 		JavaDefinitionVisitor visitor = new JavaDefinitionVisitor(

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

28
 import org.openzen.zenscript.codemodel.type.IteratorTypeID;
28
 import org.openzen.zenscript.codemodel.type.IteratorTypeID;
29
 import org.openzen.zenscript.codemodel.type.RangeTypeID;
29
 import org.openzen.zenscript.codemodel.type.RangeTypeID;
30
 import org.openzen.zenscript.javashared.JavaClass;
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
  * @author Hoofdgebruiker
37
  * @author Hoofdgebruiker
36
  */
38
  */
37
 public class JavaSourceSyntheticHelperGenerator {
39
 public class JavaSourceSyntheticHelperGenerator {
40
+	private final JavaContext context;
38
 	private final File directory;
41
 	private final File directory;
39
 	private final JavaSourceFormattingSettings settings;
42
 	private final JavaSourceFormattingSettings settings;
40
 	private final Map<String, List<String>> members = new HashMap<>();
43
 	private final Map<String, List<String>> members = new HashMap<>();
41
 	private final JavaClass arrayHelpers = new JavaClass("zsynthetic", "ArrayHelpers", JavaClass.Kind.CLASS);
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
 		this.directory = new File(directory, "zsynthetic");
50
 		this.directory = new File(directory, "zsynthetic");
47
 		this.settings = settings;
51
 		this.settings = settings;
48
 	}
52
 	}
49
 	
53
 	
50
-	public JavaSourceMethod createArrayContains(ArrayTypeID type) {
54
+	public JavaMethod createArrayContains(ArrayTypeID type) {
51
 		ArrayKind kind = type.accept(new ArrayKindVisitor());
55
 		ArrayKind kind = type.accept(new ArrayKindVisitor());
52
 		if (existingContains.containsKey(kind))
56
 		if (existingContains.containsKey(kind))
53
 			return existingContains.get(kind);
57
 			return existingContains.get(kind);
55
 		String method = generateContains(kind);
59
 		String method = generateContains(kind);
56
 		addMember(arrayHelpers, method);
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
 		existingContains.put(kind, sourceMethod);
64
 		existingContains.put(kind, sourceMethod);
60
 		return sourceMethod;
65
 		return sourceMethod;
61
 	}
66
 	}
62
 	
67
 	
63
-	public JavaSourceMethod createArrayIndexOf(ArrayTypeID type) {
68
+	public JavaMethod createArrayIndexOf(ArrayTypeID type) {
64
 		ArrayKind kind = type.accept(new ArrayKindVisitor());
69
 		ArrayKind kind = type.accept(new ArrayKindVisitor());
65
 		if (existingContains.containsKey(kind))
70
 		if (existingContains.containsKey(kind))
66
 			return existingContains.get(kind);
71
 			return existingContains.get(kind);
68
 		String method = generateContains(kind);
73
 		String method = generateContains(kind);
69
 		addMember(arrayHelpers, method);
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
 		existingContains.put(kind, sourceMethod);
78
 		existingContains.put(kind, sourceMethod);
73
 		return sourceMethod;
79
 		return sourceMethod;
74
 	}
80
 	}

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

5
  */
5
  */
6
 package org.openzen.zenscript.javasource;
6
 package org.openzen.zenscript.javasource;
7
 
7
 
8
+import org.openzen.zenscript.javashared.JavaSynthesizedClass;
8
 import java.io.BufferedOutputStream;
9
 import java.io.BufferedOutputStream;
9
 import java.io.File;
10
 import java.io.File;
10
 import java.io.FileOutputStream;
11
 import java.io.FileOutputStream;
12
 import java.io.OutputStreamWriter;
13
 import java.io.OutputStreamWriter;
13
 import java.io.Writer;
14
 import java.io.Writer;
14
 import java.nio.charset.StandardCharsets;
15
 import java.nio.charset.StandardCharsets;
15
-import java.util.ArrayList;
16
 import java.util.HashMap;
16
 import java.util.HashMap;
17
-import java.util.List;
18
 import java.util.Map;
17
 import java.util.Map;
19
 import org.openzen.zenscript.codemodel.FunctionParameter;
18
 import org.openzen.zenscript.codemodel.FunctionParameter;
20
-import org.openzen.zenscript.codemodel.generic.TypeParameter;
21
 import org.openzen.zenscript.codemodel.type.FunctionTypeID;
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
 import org.openzen.zenscript.javashared.JavaClass;
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
  * @author Hoofdgebruiker
27
  * @author Hoofdgebruiker
28
  */
28
  */
29
-public class JavaSourceSyntheticTypeGenerator {
29
+public class JavaSourceSyntheticTypeGenerator implements JavaSyntheticClassGenerator {
30
 	private final Map<String, JavaSynthesizedClass> functions = new HashMap<>();
30
 	private final Map<String, JavaSynthesizedClass> functions = new HashMap<>();
31
+	private final Map<String, JavaSynthesizedClass> ranges = new HashMap<>();
31
 	private final File directory;
32
 	private final File directory;
32
 	private final JavaSourceFormattingSettings settings;
33
 	private final JavaSourceFormattingSettings settings;
33
 	
34
 	
36
 		this.settings = settings;
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
 		if (functions.containsKey(signature))
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
 		functions.put(signature, result);
47
 		functions.put(signature, result);
48
 		
48
 		
49
-		JavaSourceImporter importer = new JavaSourceImporter(cls);
49
+		JavaSourceImporter importer = new JavaSourceImporter(result.cls);
50
 		JavaSourceTypeVisitor typeVisitor = new JavaSourceTypeVisitor(importer, this);
50
 		JavaSourceTypeVisitor typeVisitor = new JavaSourceTypeVisitor(importer, this);
51
 		
51
 		
52
 		StringBuilder contents = new StringBuilder();
52
 		StringBuilder contents = new StringBuilder();
53
 		contents.append("@FunctionalInterface\n");
53
 		contents.append("@FunctionalInterface\n");
54
 		contents.append("public interface ");
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
 		contents.append(" {\n");
57
 		contents.append(" {\n");
58
 		contents.append(settings.indent);
58
 		contents.append(settings.indent);
59
 		if (function.header.getNumberOfTypeParameters() > 0) {
59
 		if (function.header.getNumberOfTypeParameters() > 0) {
82
 		contents.append(");\n");
82
 		contents.append(");\n");
83
 		contents.append("}\n");
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
 		if (!directory.exists())
124
 		if (!directory.exists())
86
 			directory.mkdirs();
125
 			directory.mkdirs();
87
 		
126
 		
88
-		File file = new File(directory, className + ".java");
127
+		File file = new File(directory, result.cls.getName() + ".java");
89
 		try (Writer writer = new OutputStreamWriter(new BufferedOutputStream(new FileOutputStream(file)), StandardCharsets.UTF_8)) {
128
 		try (Writer writer = new OutputStreamWriter(new BufferedOutputStream(new FileOutputStream(file)), StandardCharsets.UTF_8)) {
90
 			writer.write("package zsynthetic;\n");
129
 			writer.write("package zsynthetic;\n");
91
 			
130
 			
108
 		} catch (IOException ex) {
147
 		} catch (IOException ex) {
109
 			ex.printStackTrace();
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
  */
5
  */
6
 package org.openzen.zenscript.javasource;
6
 package org.openzen.zenscript.javasource;
7
 
7
 
8
+import org.openzen.zenscript.javashared.JavaSynthesizedClass;
8
 import org.openzen.zenscript.codemodel.generic.GenericParameterBoundVisitor;
9
 import org.openzen.zenscript.codemodel.generic.GenericParameterBoundVisitor;
9
 import org.openzen.zenscript.codemodel.generic.ParameterSuperBound;
10
 import org.openzen.zenscript.codemodel.generic.ParameterSuperBound;
10
 import org.openzen.zenscript.codemodel.generic.ParameterTypeBound;
11
 import org.openzen.zenscript.codemodel.generic.ParameterTypeBound;
101
 
102
 
102
 	@Override
103
 	@Override
103
 	public String visitFunction(FunctionTypeID function) {
104
 	public String visitFunction(FunctionTypeID function) {
104
-		JavaSynthesizedClass synthetic = typeGenerator.createFunction(this, function);
105
+		JavaSynthesizedClass synthetic = typeGenerator.synthesizeFunction(function);
105
 		StringBuilder result = new StringBuilder();
106
 		StringBuilder result = new StringBuilder();
106
 		result.append(importer.importType(synthetic.cls));
107
 		result.append(importer.importType(synthetic.cls));
107
 		if (synthetic.typeParameters.length > 0) {
108
 		if (synthetic.typeParameters.length > 0) {

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

1
-/*
2
- * To change this license header, choose License Headers in Project Properties.
3
- * To change this template file, choose Tools | Templates
4
- * and open the template in the editor.
5
- */
6
-package org.openzen.zenscript.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
-/*
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
-/*
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
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
29
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
30
 import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
30
 import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
31
 import org.openzen.zenscript.codemodel.type.ITypeID;
31
 import org.openzen.zenscript.codemodel.type.ITypeID;
32
-import org.openzen.zenscript.javabytecode.JavaFieldInfo;
33
 import org.openzen.zenscript.javabytecode.JavaMethodInfo;
32
 import org.openzen.zenscript.javabytecode.JavaMethodInfo;
34
 import org.openzen.zenscript.codemodel.type.ISymbol;
33
 import org.openzen.zenscript.codemodel.type.ISymbol;
35
 import org.openzen.zenscript.javashared.JavaClass;
34
 import org.openzen.zenscript.javashared.JavaClass;
35
+import org.openzen.zenscript.javashared.JavaField;
36
 
36
 
37
 /**
37
 /**
38
  *
38
  *
50
 		PRINTSTREAM_PRINTLN.setTag(JavaMethodInfo.class, printstreamPrintln);
50
 		PRINTSTREAM_PRINTLN.setTag(JavaMethodInfo.class, printstreamPrintln);
51
 		
51
 		
52
 		JavaClass jSystem = new JavaClass("java.lang", "System", JavaClass.Kind.CLASS);
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
 	public ZSPackage collectPackages() {
56
 	public ZSPackage collectPackages() {

Loading…
Cancel
Save