Browse Source

Added type preparation.

Stan Hebben 6 years ago
parent
commit
a02b2c2369
36 changed files with 589 additions and 420 deletions
  1. 5
    33
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeContext.java
  2. 48
    25
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaCompiler.java
  3. 8
    3
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaModule.java
  4. 10
    8
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/CompilerUtils.java
  5. 3
    3
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaExpressionVisitor.java
  6. 3
    3
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaPreDecrementVisitor.java
  7. 3
    3
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaPreIncrementVisitor.java
  8. 4
    4
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaStatementVisitor.java
  9. 10
    15
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/definitions/JavaDefinitionVisitor.java
  10. 3
    3
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/definitions/JavaMemberVisitor.java
  11. 48
    0
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaContext.java
  12. 3
    5
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaImplementation.java
  13. 15
    10
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaMethod.java
  14. 57
    0
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaModifiers.java
  15. 44
    0
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaNativeClass.java
  16. 16
    0
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaNativeTranslation.java
  17. 30
    0
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaNativeTranslator.java
  18. 4
    2
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaTypeDescriptorVisitor.java
  19. 4
    2
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaTypeInternalNameVisitor.java
  20. 3
    3
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaTypeNameVisitor.java
  21. 3
    5
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaVariantOption.java
  22. 29
    26
      JavaShared/src/main/java/org/openzen/zenscript/javashared/prepare/JavaPrepareClassMethodVisitor.java
  23. 12
    10
      JavaShared/src/main/java/org/openzen/zenscript/javashared/prepare/JavaPrepareDefinitionMemberVisitor.java
  24. 85
    105
      JavaShared/src/main/java/org/openzen/zenscript/javashared/prepare/JavaPrepareDefinitionVisitor.java
  25. 20
    17
      JavaShared/src/main/java/org/openzen/zenscript/javashared/prepare/JavaPrepareExpansionMethodVisitor.java
  26. 0
    27
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/FormattingUtils.java
  27. 1
    1
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaDefinitionVisitor.java
  28. 2
    2
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaExpansionMemberCompiler.java
  29. 6
    5
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaMemberCompiler.java
  30. 6
    3
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceCompiler.java
  31. 5
    2
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceContext.java
  32. 81
    24
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceExpressionFormatter.java
  33. 4
    3
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceFile.java
  34. 14
    8
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceSyntheticHelperGenerator.java
  35. 0
    46
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/prepare/JavaNativeClass.java
  36. 0
    14
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/prepare/JavaSourceSignatureVisitor.java

JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaContext.java → JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeContext.java View File

@@ -12,6 +12,7 @@ import org.openzen.zenscript.codemodel.type.FunctionTypeID;
12 12
 import org.openzen.zenscript.codemodel.type.ITypeID;
13 13
 import org.openzen.zenscript.codemodel.type.RangeTypeID;
14 14
 import org.openzen.zenscript.javabytecode.compiler.CompilerUtils;
15
+import org.openzen.zenscript.javashared.JavaContext;
15 16
 import org.openzen.zenscript.javashared.JavaSynthesizedClass;
16 17
 import org.openzen.zenscript.javashared.JavaSyntheticClassGenerator;
17 18
 import org.openzen.zenscript.javashared.JavaTypeDescriptorVisitor;
@@ -21,13 +22,13 @@ import org.openzen.zenscript.javashared.JavaTypeInternalNameVisitor;
21 22
  *
22 23
  * @author Hoofdgebruiker
23 24
  */
24
-public class JavaContext {
25
+public class JavaBytecodeContext extends JavaContext {
25 26
 	private final JavaModule module;
26 27
 	private final TypeGenerator typeGenerator;
27 28
 	private final JavaTypeInternalNameVisitor internalNameVisitor;
28 29
 	private final JavaTypeDescriptorVisitor descriptorVisitor;
29 30
 	
30
-	public JavaContext(JavaModule module) {
31
+	public JavaBytecodeContext(JavaModule module) {
31 32
 		this.module = module;
32 33
 		
33 34
 		typeGenerator = new TypeGenerator();
@@ -39,6 +40,7 @@ public class JavaContext {
39 40
 		return typeGenerator;
40 41
 	}
41 42
 	
43
+	@Override
42 44
 	public String getDescriptor(ITypeID type) {
43 45
 		return type.accept(descriptorVisitor);
44 46
 	}
@@ -51,36 +53,6 @@ public class JavaContext {
51 53
 		return Type.getType(getDescriptor(type));
52 54
 	}
53 55
 	
54
-	public String getMethodDescriptor(FunctionHeader header) {
55
-		return getMethodDescriptor(header, false);
56
-	}
57
-	
58
-    public String getMethodSignature(FunctionHeader header) {
59
-        StringBuilder signatureBuilder = new StringBuilder("(");
60
-        for (FunctionParameter parameter : header.parameters) {
61
-            signatureBuilder.append(getDescriptor(parameter.type));
62
-        }
63
-        signatureBuilder.append(")").append(getDescriptor(header.returnType));
64
-        return signatureBuilder.toString();
65
-    }
66
-	
67
-	public String getEnumConstructorDescriptor(FunctionHeader header) {
68
-		return getMethodDescriptor(header, true);
69
-	}
70
-	
71
-	private String getMethodDescriptor(FunctionHeader header, boolean isEnumConstructor) {
72
-        StringBuilder descBuilder = new StringBuilder("(");
73
-        if (isEnumConstructor)
74
-            descBuilder.append("Ljava/lang/String;I");
75
-		
76
-        for (FunctionParameter parameter : header.parameters) {
77
-			descBuilder.append(getDescriptor(parameter.type));
78
-        }
79
-        descBuilder.append(")");
80
-        descBuilder.append(getDescriptor(header.returnType));
81
-        return descBuilder.toString();
82
-    }
83
-	
84 56
 	public void register(String name, byte[] bytecode) {
85 57
 		module.register(name, bytecode);
86 58
 	}
@@ -89,7 +61,7 @@ public class JavaContext {
89 61
 
90 62
 		@Override
91 63
 		public JavaSynthesizedClass synthesizeFunction(FunctionTypeID type) {
92
-			return CompilerUtils.getLambdaInterface(JavaContext.this, type);
64
+			return CompilerUtils.getLambdaInterface(JavaBytecodeContext.this, type);
93 65
 		}
94 66
 
95 67
 		@Override

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

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.javabytecode;
7 7
 
8 8
 import java.io.File;
9
+import java.util.ArrayList;
9 10
 import java.util.HashMap;
10 11
 import java.util.Map;
11 12
 
@@ -24,8 +25,11 @@ import org.openzen.zenscript.javabytecode.compiler.JavaWriter;
24 25
 import org.openzen.zenscript.javabytecode.compiler.definitions.JavaDefinitionVisitor;
25 26
 
26 27
 import java.util.HashMap;
28
+import java.util.List;
27 29
 import java.util.Map;
28 30
 import org.openzen.zenscript.javashared.JavaClass;
31
+import org.openzen.zenscript.javashared.prepare.JavaPrepareDefinitionMemberVisitor;
32
+import org.openzen.zenscript.javashared.prepare.JavaPrepareDefinitionVisitor;
29 33
 
30 34
 /**
31 35
  * @author Hoofdgebruiker
@@ -37,7 +41,10 @@ public class JavaCompiler implements ZenCodeCompiler {
37 41
 	private int generatedScriptBlockCounter = 0;
38 42
 	private boolean finished = false;
39 43
 	private final File jarFile;
40
-	private final JavaContext context;
44
+	private final JavaBytecodeContext context;
45
+	
46
+	private final List<HighLevelDefinition> definitions = new ArrayList<>();
47
+	private final List<ScriptBlock> scripts = new ArrayList<>();
41 48
 	
42 49
 	public JavaCompiler(File jarFile) {
43 50
 		this(false, jarFile);
@@ -46,7 +53,7 @@ public class JavaCompiler implements ZenCodeCompiler {
46 53
 	public JavaCompiler(boolean debug, File jarFile) {
47 54
 		target = new JavaModule();
48 55
 		this.jarFile = jarFile;
49
-		this.context = new JavaContext(target);
56
+		this.context = new JavaBytecodeContext(target);
50 57
 		
51 58
 		scriptsClassWriter = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
52 59
 		scriptsClassWriter.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, "Scripts", null, "java/lang/Object", null);
@@ -54,32 +61,15 @@ public class JavaCompiler implements ZenCodeCompiler {
54 61
 
55 62
 	@Override
56 63
 	public void addDefinition(HighLevelDefinition definition, SemanticModule module) {
57
-		String className = getClassName(definition.position.getFilename());
58
-		JavaScriptFile scriptFile = getScriptFile(className);
59
-		target.register(definition.name, definition.accept(new JavaDefinitionVisitor(context, scriptFile.classWriter)));
64
+		JavaPrepareDefinitionVisitor preparer = new JavaPrepareDefinitionVisitor(definition.position.getFilename(), null);
65
+		definition.accept(preparer);
66
+		
67
+		definitions.add(definition);
60 68
 	}
61 69
 
62 70
 	@Override
63 71
 	public void addScriptBlock(ScriptBlock script) {
64
-		final SourceFile sourceFile = script.getTag(SourceFile.class);
65
-		final String className = getClassName(sourceFile == null ? null : sourceFile.getFilename());
66
-		JavaScriptFile scriptFile = getScriptFile(className);
67
-
68
-		String methodName = scriptFile.scriptMethods.isEmpty() ? "run" : "run" + scriptFile.scriptMethods.size();
69
-
70
-		// convert scripts into methods (add them to a Scripts class?)
71
-		// (TODO: can we break very long scripts into smaller methods? for the extreme scripts)
72
-		final JavaClassWriter visitor = scriptFile.classWriter;
73
-		JavaMethodInfo method = new JavaMethodInfo(new JavaClass(script.pkg.fullName, className, JavaClass.Kind.CLASS), methodName, "()V", Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC);
74
-		scriptFile.scriptMethods.add(method);
75
-
76
-		final JavaStatementVisitor statementVisitor = new JavaStatementVisitor(context, new JavaWriter(visitor, method, null, null, null));
77
-		statementVisitor.start();
78
-		for (Statement statement : script.statements) {
79
-			statement.accept(statementVisitor);
80
-		}
81
-		target.register("Scripts", scriptsClassWriter.toByteArray());
82
-		statementVisitor.end();
72
+		scripts.add(script);
83 73
 	}
84 74
 
85 75
 	private String getClassName(String filename) {
@@ -124,7 +114,40 @@ public class JavaCompiler implements ZenCodeCompiler {
124 114
 			throw new IllegalStateException("Already finished!");
125 115
 		
126 116
 		finished = true;
127
-
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
+		
128 151
 		JavaMethodInfo runMethod = new JavaMethodInfo(new JavaClass("script", "Scripts", JavaClass.Kind.CLASS), "run", "()V", Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC);
129 152
 		final JavaWriter runWriter = new JavaWriter(scriptsClassWriter, runMethod, null, null, null);
130 153
 		runWriter.start();

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

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

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

@@ -20,7 +20,7 @@ import java.io.IOException;
20 20
 import java.util.HashMap;
21 21
 import java.util.Map;
22 22
 import org.openzen.zenscript.codemodel.type.FunctionTypeID;
23
-import org.openzen.zenscript.javabytecode.JavaContext;
23
+import org.openzen.zenscript.javabytecode.JavaBytecodeContext;
24 24
 import org.openzen.zenscript.javashared.JavaClass;
25 25
 import org.openzen.zenscript.javashared.JavaSynthesizedClass;
26 26
 import org.openzen.zenscript.javashared.JavaSynthesizedClassNamer;
@@ -70,7 +70,7 @@ public class CompilerUtils {
70 70
 		return position.getFilename().substring(0, position.getFilename().lastIndexOf('.')).replace("/", "_");
71 71
 	}
72 72
 
73
-    public static void tagMethodParameters(JavaContext context, FunctionHeader header, boolean isStatic) {
73
+    public static void tagMethodParameters(JavaBytecodeContext context, FunctionHeader header, boolean isStatic) {
74 74
         for (int i = 0; i < header.parameters.length; i++) {
75 75
             FunctionParameter parameter = header.parameters[i];
76 76
             Type parameterType = context.getType(parameter.type);
@@ -78,7 +78,7 @@ public class CompilerUtils {
78 78
         }
79 79
     }
80 80
 
81
-    public static void tagConstructorParameters(JavaContext context, FunctionHeader header, boolean isEnum) {
81
+    public static void tagConstructorParameters(JavaBytecodeContext context, FunctionHeader header, boolean isEnum) {
82 82
         for (int i = 0; i < header.parameters.length; i++) {
83 83
             FunctionParameter parameter = header.parameters[i];
84 84
             Type parameterType = context.getType(parameter.type);
@@ -86,7 +86,7 @@ public class CompilerUtils {
86 86
         }
87 87
     }
88 88
 
89
-    public static void writeDefaultFieldInitializers(JavaContext context, JavaWriter constructorWriter, HighLevelDefinition definition, boolean staticFields) {
89
+    public static void writeDefaultFieldInitializers(JavaBytecodeContext context, JavaWriter constructorWriter, HighLevelDefinition definition, boolean staticFields) {
90 90
         JavaExpressionVisitor expressionVisitor = new JavaExpressionVisitor(context, constructorWriter);
91 91
         for (final IDefinitionMember definitionMember : definition.members) {
92 92
             if (!(definitionMember instanceof FieldMember))
@@ -107,11 +107,13 @@ public class CompilerUtils {
107 107
 
108 108
 	private static final Map<String, JavaSynthesizedClass> functions = new HashMap<>();
109 109
 	
110
-    public static JavaSynthesizedClass getLambdaInterface(JavaContext context, FunctionTypeID function) {
110
+    public static JavaSynthesizedClass getLambdaInterface(JavaBytecodeContext context, FunctionTypeID function) {
111 111
 		String signature = JavaSynthesizedClassNamer.getFunctionSignature(function);
112 112
 		if (functions.containsKey(signature))
113 113
 			return functions.get(signature).withTypeParameters(JavaSynthesizedClassNamer.extractTypeParameters(function));
114 114
 		
115
+		System.out.println("Generating function " + signature);
116
+		
115 117
 		JavaSynthesizedClass result = JavaSynthesizedClassNamer.createFunctionName(function);
116 118
 		functions.put(signature, result);
117 119
 		
@@ -119,10 +121,10 @@ public class CompilerUtils {
119 121
         return result;
120 122
     }
121 123
 
122
-    private static void createLambdaInterface(JavaContext context, FunctionHeader header, JavaClass cls) {
124
+    private static void createLambdaInterface(JavaBytecodeContext context, FunctionHeader header, JavaClass cls) {
123 125
         ClassWriter ifaceWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
124 126
         ifaceWriter.visitAnnotation("java/lang/FunctionalInterface", true).visitEnd();
125
-        ifaceWriter.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC | Opcodes.ACC_INTERFACE | Opcodes.ACC_ABSTRACT, cls.getClassName(), null, "java/lang/Object", null);
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);
126 128
 
127 129
         ifaceWriter
128 130
 				.visitMethod(
@@ -133,7 +135,7 @@ public class CompilerUtils {
133 135
 					null)
134 136
 				.visitEnd();
135 137
 
136
-        context.register(cls.internalName, ifaceWriter.toByteArray());
138
+        context.register(cls.internalName.replace('/', '.'), ifaceWriter.toByteArray());
137 139
 
138 140
         try (FileOutputStream out = new FileOutputStream(cls.getClassName() + ".class")){
139 141
             out.write(ifaceWriter.toByteArray());

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

@@ -149,9 +149,9 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
149 149
 
150 150
 	protected final JavaWriter javaWriter;
151 151
 	private final JavaCapturedExpressionVisitor capturedExpressionVisitor = new JavaCapturedExpressionVisitor(this);
152
-	private final JavaContext context;
152
+	private final JavaBytecodeContext context;
153 153
 
154
-    public JavaExpressionVisitor(JavaContext context, JavaWriter javaWriter) {
154
+    public JavaExpressionVisitor(JavaBytecodeContext context, JavaWriter javaWriter) {
155 155
         this.javaWriter = javaWriter;
156 156
 		this.context = context;
157 157
     }
@@ -1640,7 +1640,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1640 1640
 		functionWriter.end();
1641 1641
 		lambdaCW.visitEnd();
1642 1642
 
1643
-		JavaModule.classes.putIfAbsent(name, lambdaCW.toByteArray());
1643
+		context.register(name, lambdaCW.toByteArray());
1644 1644
 
1645 1645
 		try (FileOutputStream out = new FileOutputStream(name + ".class")) {
1646 1646
 			out.write(lambdaCW.toByteArray());

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

@@ -74,7 +74,7 @@ import org.openzen.zenscript.codemodel.expression.TryRethrowAsExceptionExpressio
74 74
 import org.openzen.zenscript.codemodel.expression.TryRethrowAsResultExpression;
75 75
 import org.openzen.zenscript.codemodel.expression.VariantValueExpression;
76 76
 import org.openzen.zenscript.codemodel.expression.WrapOptionalExpression;
77
-import org.openzen.zenscript.javabytecode.JavaContext;
77
+import org.openzen.zenscript.javabytecode.JavaBytecodeContext;
78 78
 import org.openzen.zenscript.javabytecode.JavaLocalVariableInfo;
79 79
 import org.openzen.zenscript.javabytecode.JavaParameterInfo;
80 80
 
@@ -85,9 +85,9 @@ import org.openzen.zenscript.javabytecode.JavaParameterInfo;
85 85
 public class JavaPreDecrementVisitor implements ExpressionVisitor<Void> {
86 86
 	private final JavaExpressionVisitor expressionCompiler;
87 87
 	private final JavaWriter javaWriter;
88
-	private final JavaContext context;
88
+	private final JavaBytecodeContext context;
89 89
 	
90
-	public JavaPreDecrementVisitor(JavaContext context, JavaExpressionVisitor expressionCompiler) {
90
+	public JavaPreDecrementVisitor(JavaBytecodeContext context, JavaExpressionVisitor expressionCompiler) {
91 91
 		this.expressionCompiler = expressionCompiler;
92 92
 		this.context = context;
93 93
 		javaWriter = expressionCompiler.getJavaWriter();

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

@@ -74,7 +74,7 @@ import org.openzen.zenscript.codemodel.expression.TryRethrowAsExceptionExpressio
74 74
 import org.openzen.zenscript.codemodel.expression.TryRethrowAsResultExpression;
75 75
 import org.openzen.zenscript.codemodel.expression.VariantValueExpression;
76 76
 import org.openzen.zenscript.codemodel.expression.WrapOptionalExpression;
77
-import org.openzen.zenscript.javabytecode.JavaContext;
77
+import org.openzen.zenscript.javabytecode.JavaBytecodeContext;
78 78
 import org.openzen.zenscript.javabytecode.JavaLocalVariableInfo;
79 79
 import org.openzen.zenscript.javabytecode.JavaParameterInfo;
80 80
 
@@ -84,10 +84,10 @@ import org.openzen.zenscript.javabytecode.JavaParameterInfo;
84 84
  */
85 85
 public class JavaPreIncrementVisitor implements ExpressionVisitor<Void> {
86 86
 	private final JavaExpressionVisitor expressionCompiler;
87
-	private final JavaContext context;
87
+	private final JavaBytecodeContext context;
88 88
 	private final JavaWriter javaWriter;
89 89
 	
90
-	public JavaPreIncrementVisitor(JavaContext context, JavaExpressionVisitor expressionCompiler) {
90
+	public JavaPreIncrementVisitor(JavaBytecodeContext context, JavaExpressionVisitor expressionCompiler) {
91 91
 		this.expressionCompiler = expressionCompiler;
92 92
 		this.context = context;
93 93
 		javaWriter = expressionCompiler.getJavaWriter();

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

@@ -9,24 +9,24 @@ import org.openzen.zenscript.javabytecode.JavaMethodInfo;
9 9
 
10 10
 import java.util.Arrays;
11 11
 import java.util.List;
12
-import org.openzen.zenscript.javabytecode.JavaContext;
12
+import org.openzen.zenscript.javabytecode.JavaBytecodeContext;
13 13
 import org.openzen.zenscript.javashared.JavaClass;
14 14
 
15 15
 public class JavaStatementVisitor implements StatementVisitor<Boolean> {
16 16
     private final JavaWriter javaWriter;
17
-	private final JavaContext context;
17
+	private final JavaBytecodeContext context;
18 18
     public JavaExpressionVisitor expressionVisitor;
19 19
 
20 20
     /**
21 21
      * @param javaWriter the method writer that compiles the statement
22 22
      */
23
-    public JavaStatementVisitor(JavaContext context, JavaWriter javaWriter) {
23
+    public JavaStatementVisitor(JavaBytecodeContext context, JavaWriter javaWriter) {
24 24
         this.javaWriter = javaWriter;
25 25
 		this.context = context;
26 26
         this.expressionVisitor = new JavaExpressionVisitor(context, javaWriter);
27 27
     }
28 28
 
29
-    public JavaStatementVisitor(JavaContext context, JavaExpressionVisitor expressionVisitor) {
29
+    public JavaStatementVisitor(JavaBytecodeContext context, JavaExpressionVisitor expressionVisitor) {
30 30
         this.javaWriter = expressionVisitor.getJavaWriter();
31 31
 		this.context = context;
32 32
         this.expressionVisitor = expressionVisitor;

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

@@ -8,7 +8,7 @@ import org.openzen.zenscript.codemodel.definition.*;
8 8
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
9 9
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10 10
 import org.openzen.zenscript.codemodel.type.ITypeID;
11
-import org.openzen.zenscript.javabytecode.JavaContext;
11
+import org.openzen.zenscript.javabytecode.JavaBytecodeContext;
12 12
 import org.openzen.zenscript.javabytecode.JavaMethodInfo;
13 13
 import org.openzen.zenscript.javabytecode.JavaModule;
14 14
 import org.openzen.zenscript.javabytecode.compiler.*;
@@ -34,9 +34,9 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
34 34
 			Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC);
35 35
 
36 36
 	private final JavaClassWriter outerWriter;
37
-	private final JavaContext context;
37
+	private final JavaBytecodeContext context;
38 38
 
39
-    public JavaDefinitionVisitor(JavaContext context, JavaClassWriter outerWriter) {
39
+    public JavaDefinitionVisitor(JavaBytecodeContext context, JavaClassWriter outerWriter) {
40 40
 		this.context = context;
41 41
 		this.outerWriter = outerWriter;
42 42
 	}
@@ -192,7 +192,7 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
192 192
 		writer.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_ABSTRACT, "getDenominator", "()I", null, null).visitEnd();
193 193
 
194 194
 
195
-		final JavaMemberVisitor visitor = new JavaMemberVisitor(writer, toClass, variant);
195
+		final JavaMemberVisitor visitor = new JavaMemberVisitor(context, writer, toClass, variant);
196 196
 
197 197
 		final List<VariantDefinition.Option> options = variant.options;
198 198
 		//Each option is one of the possible child classes
@@ -213,7 +213,7 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
213 213
 				StringBuilder builder = new StringBuilder();
214 214
 				for (int i = 0; i < option.types.length; ++i) {
215 215
 					builder.append("<T").append(i).append(":");
216
-					builder.append(option.types[i].accept(JavaTypeVisitor.INSTANCE).getDescriptor());
216
+					builder.append(context.getDescriptor(option.types[i]));
217 217
 				}
218 218
 				builder.append(">");
219 219
 				builder.append("L").append(variantName).append(";");
@@ -223,15 +223,12 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
223 223
 			}
224 224
 
225 225
 			optionWriter.visit(Opcodes.V1_8, Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC, optionClassName, signature, variantName, null);
226
-			final JavaMemberVisitor optionVisitor = new JavaMemberVisitor(optionWriter, optionClass, variant);
227
-
228
-
226
+			final JavaMemberVisitor optionVisitor = new JavaMemberVisitor(context, optionWriter, optionClass, variant);
229 227
 			final StringBuilder optionInitDescBuilder = new StringBuilder("(");
230 228
 
231 229
 			ITypeID[] types = option.types;
232 230
 			for (int i = 0; i < types.length; ++i) {
233
-				final Type type = types[i].accept(JavaTypeVisitor.INSTANCE);
234
-				final String internalName = type.getDescriptor();
231
+				final String internalName = context.getInternalName(types[i]);
235 232
 				optionInitDescBuilder.append(internalName);
236 233
 				optionWriter.visitField(Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL, "Field" + i, internalName, "TT" + i + ";", null).visitEnd();
237 234
 			}
@@ -247,10 +244,8 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
247 244
 				initWriter.dup();
248 245
 				initWriter.loadObject(i + 1);
249 246
 
250
-				final Type type = types[i].accept(JavaTypeVisitor.INSTANCE);
251
-				final String internalName = type.getDescriptor();
252
-
253
-				initWriter.putField(optionClassName, "Field" + i, internalName);
247
+				final String descriptor = context.getDescriptor(types[i]);
248
+				initWriter.putField(optionClassName, "Field" + i, descriptor);
254 249
 			}
255 250
 			initWriter.pop();
256 251
 			initWriter.ret();
@@ -268,7 +263,7 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
268 263
 			optionVisitor.end();
269 264
 			optionWriter.visitEnd();
270 265
 			final byte[] byteArray = optionWriter.toByteArray();
271
-			JavaModule.classes.put(optionClassName, byteArray);
266
+			context.register(optionClassName, byteArray);
272 267
 
273 268
 			//Print the option files, won't be in production
274 269
 			try (FileOutputStream out = new FileOutputStream(optionClassName + ".class")) {

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

@@ -15,19 +15,19 @@ import org.openzen.zenscript.javabytecode.JavaParameterInfo;
15 15
 import org.openzen.zenscript.javabytecode.compiler.*;
16 16
 
17 17
 import java.util.List;
18
-import org.openzen.zenscript.javabytecode.JavaContext;
18
+import org.openzen.zenscript.javabytecode.JavaBytecodeContext;
19 19
 import org.openzen.zenscript.javashared.JavaClass;
20 20
 import org.openzen.zenscript.javashared.JavaField;
21 21
 
22 22
 public class JavaMemberVisitor implements MemberVisitor<Void> {
23 23
     private final ClassWriter writer;
24
-	private final JavaContext context;
24
+	private final JavaBytecodeContext context;
25 25
     private final JavaClass toClass;
26 26
     private final HighLevelDefinition definition;
27 27
     private final JavaStatementVisitor clinitStatementVisitor;
28 28
     private EnumDefinition enumDefinition = null;
29 29
 
30
-    public JavaMemberVisitor(JavaContext context, ClassWriter writer, JavaClass toClass, HighLevelDefinition definition) {
30
+    public JavaMemberVisitor(JavaBytecodeContext context, ClassWriter writer, JavaClass toClass, HighLevelDefinition definition) {
31 31
         this.writer = writer;
32 32
         this.toClass = toClass;
33 33
         this.definition = definition;

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

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

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

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

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

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

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

@@ -0,0 +1,57 @@
1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.javashared;
7
+
8
+import org.openzen.zenscript.codemodel.Modifiers;
9
+
10
+/**
11
+ *
12
+ * @author Hoofdgebruiker
13
+ */
14
+public class JavaModifiers {
15
+	public static final int PUBLIC = 0x0001; // class, field, method
16
+    public static final int PRIVATE = 0x0002; // class, field, method
17
+    public static final int PROTECTED = 0x0004; // class, field, method
18
+    public static final int STATIC = 0x0008; // field, method
19
+    public static final int FINAL = 0x0010; // class, field, method, parameter
20
+    public static final int SUPER = 0x0020; // class
21
+    public static final int SYNCHRONIZED = 0x0020; // method
22
+    public static final int OPEN = 0x0020; // module
23
+    public static final int TRANSITIVE = 0x0020; // module requires
24
+    public static final int VOLATILE = 0x0040; // field
25
+    public static final int BRIDGE = 0x0040; // method
26
+    public static final int STATIC_PHASE = 0x0040; // module requires
27
+    public static final int VARARGS = 0x0080; // method
28
+    public static final int TRANSIENT = 0x0080; // field
29
+    public static final int NATIVE = 0x0100; // method
30
+    public static final int INTERFACE = 0x0200; // class
31
+    public static final int ABSTRACT = 0x0400; // class, method
32
+    public static final int STRICT = 0x0800; // method
33
+    public static final int SYNTHETIC = 0x1000; // class, field, method, parameter, module *
34
+    public static final int ANNOTATION = 0x2000; // class
35
+    public static final int ENUM = 0x4000; // class(?) field inner
36
+    public static final int MANDATED = 0x8000; // parameter, module, module *
37
+    public static final int MODULE = 0x8000; // class
38
+	
39
+	public static int getJavaModifiers(int modifiers) {
40
+		int out = 0;
41
+		if (Modifiers.isStatic(modifiers))
42
+			out |= STATIC;
43
+		if (Modifiers.isFinal(modifiers))
44
+			out |= FINAL;
45
+		if (Modifiers.isPublic(modifiers))
46
+			out |= PUBLIC;
47
+		if (Modifiers.isPrivate(modifiers))
48
+			out |= PRIVATE;
49
+		if (Modifiers.isProtected(modifiers))
50
+			out |= PROTECTED;
51
+		if (Modifiers.isAbstract(modifiers))
52
+			out |= ABSTRACT;
53
+		return out;
54
+	}
55
+	
56
+	private JavaModifiers() {}
57
+}

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

@@ -0,0 +1,44 @@
1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.javashared;
7
+
8
+import java.util.HashMap;
9
+import java.util.Map;
10
+
11
+/**
12
+ *
13
+ * @author Hoofdgebruiker
14
+ */
15
+public class JavaNativeClass {
16
+	public final JavaClass cls;
17
+	private final Map<String, JavaMethod> methods = new HashMap<>();
18
+	public final boolean nonDestructible;
19
+	
20
+	public JavaNativeClass(JavaClass cls) {
21
+		this(cls, false);
22
+	}
23
+	
24
+	public JavaNativeClass(JavaClass cls, boolean nonDestructible) {
25
+		this.cls = cls;
26
+		this.nonDestructible = nonDestructible;
27
+	}
28
+	
29
+	public void addMethod(String key, JavaMethod method) {
30
+		methods.put(key, method);
31
+	}
32
+	
33
+	public void addConstructor(String key, String descriptor) {
34
+		methods.put(key, new JavaMethod(cls, JavaMethod.Kind.CONSTRUCTOR, "<init>", false, descriptor, JavaModifiers.PUBLIC));
35
+	}
36
+	
37
+	public void addInstanceMethod(String key, String name, String descriptor) {
38
+		methods.put(key, new JavaMethod(cls, JavaMethod.Kind.INSTANCE, name, false, descriptor, JavaModifiers.PUBLIC));
39
+	}
40
+	
41
+	public JavaMethod getMethod(String name) {
42
+		return methods.get(name);
43
+	}
44
+}

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

@@ -0,0 +1,16 @@
1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.javashared;
7
+
8
+import org.openzen.zenscript.codemodel.expression.Expression;
9
+
10
+/**
11
+ *
12
+ * @author Hoofdgebruiker
13
+ */
14
+public interface JavaNativeTranslation<T> {
15
+	public T translate(Expression expression, JavaNativeTranslator<T> translator);
16
+}

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

@@ -0,0 +1,30 @@
1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.javashared;
7
+
8
+import org.openzen.zenscript.codemodel.expression.CallExpression;
9
+import org.openzen.zenscript.codemodel.expression.CastExpression;
10
+import org.openzen.zenscript.codemodel.expression.Expression;
11
+
12
+/**
13
+ *
14
+ * @author Hoofdgebruiker
15
+ */
16
+public interface JavaNativeTranslator<T> {
17
+	T isEmptyAsLengthZero(Expression value);
18
+	
19
+	T listToArray(CastExpression value);
20
+	
21
+	T containsAsIndexOf(Expression target, Expression value);
22
+	
23
+	T sorted(Expression value);
24
+	
25
+	T sortedWithComparator(Expression value, Expression comparator);
26
+	
27
+	T copy(Expression value);
28
+	
29
+	T copyTo(CallExpression call);
30
+}

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

@@ -6,6 +6,7 @@ import org.openzen.zenscript.codemodel.type.*;
6 6
 
7 7
 public class JavaTypeDescriptorVisitor implements ITypeVisitor<String> {
8 8
 	private final JavaTypeDescriptorVisitor forOptional;
9
+	private final JavaSyntheticClassGenerator generator;
9 10
 	private final boolean optional;
10 11
 	
11 12
 	public JavaTypeDescriptorVisitor(JavaSyntheticClassGenerator generator) {
@@ -14,6 +15,7 @@ public class JavaTypeDescriptorVisitor implements ITypeVisitor<String> {
14 15
 	
15 16
 	private JavaTypeDescriptorVisitor(JavaSyntheticClassGenerator generator, boolean optional) {
16 17
 		this.optional = optional;
18
+		this.generator = generator;
17 19
 		forOptional = optional ? this : new JavaTypeDescriptorVisitor(generator, true);
18 20
 	}
19 21
 	
@@ -76,7 +78,7 @@ public class JavaTypeDescriptorVisitor implements ITypeVisitor<String> {
76 78
 
77 79
     @Override
78 80
     public String visitFunction(FunctionTypeID function) {
79
-        return "L" + JavaSynthesizedClassNamer.createFunctionName(function).cls.internalName + ";";
81
+        return "L" + generator.synthesizeFunction(function).cls.internalName + ";";
80 82
     }
81 83
 
82 84
     @Override
@@ -101,7 +103,7 @@ public class JavaTypeDescriptorVisitor implements ITypeVisitor<String> {
101 103
 
102 104
     @Override
103 105
     public String visitRange(RangeTypeID range) {
104
-		return "L" + JavaSynthesizedClassNamer.createRangeName(range).cls.internalName + ";";
106
+		return "L" + generator.synthesizeRange(range).cls.internalName + ";";
105 107
     }
106 108
 
107 109
     @Override

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

@@ -6,6 +6,7 @@ import org.openzen.zenscript.codemodel.type.*;
6 6
 
7 7
 public class JavaTypeInternalNameVisitor implements ITypeVisitor<String> {
8 8
 	private final JavaTypeInternalNameVisitor forOptional;
9
+	private final JavaSyntheticClassGenerator generator;
9 10
 	private final boolean optional;
10 11
 	
11 12
 	public JavaTypeInternalNameVisitor(JavaSyntheticClassGenerator generator) {
@@ -14,6 +15,7 @@ public class JavaTypeInternalNameVisitor implements ITypeVisitor<String> {
14 15
 	
15 16
 	private JavaTypeInternalNameVisitor(JavaSyntheticClassGenerator generator, boolean optional) {
16 17
 		this.optional = optional;
18
+		this.generator = generator;
17 19
 		forOptional = optional ? this : new JavaTypeInternalNameVisitor(generator, true);
18 20
 	}
19 21
 	
@@ -76,7 +78,7 @@ public class JavaTypeInternalNameVisitor implements ITypeVisitor<String> {
76 78
 
77 79
     @Override
78 80
     public String visitFunction(FunctionTypeID function) {
79
-        return JavaSynthesizedClassNamer.createFunctionName(function).cls.internalName;
81
+        return generator.synthesizeFunction(function).cls.internalName;
80 82
     }
81 83
 
82 84
     @Override
@@ -97,7 +99,7 @@ public class JavaTypeInternalNameVisitor implements ITypeVisitor<String> {
97 99
 
98 100
     @Override
99 101
     public String visitRange(RangeTypeID range) {
100
-		return JavaSynthesizedClassNamer.createRangeName(range).cls.internalName;
102
+		return generator.synthesizeRange(range).cls.internalName;
101 103
     }
102 104
 
103 105
     @Override

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

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

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

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

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

@@ -3,8 +3,9 @@
3 3
  * To change this template file, choose Tools | Templates
4 4
  * and open the template in the editor.
5 5
  */
6
-package org.openzen.zenscript.javasource.prepare;
6
+package org.openzen.zenscript.javashared.prepare;
7 7
 
8
+import org.openzen.zenscript.javashared.JavaNativeClass;
8 9
 import org.openzen.zencode.shared.StringExpansion;
9 10
 import org.openzen.zenscript.codemodel.OperatorType;
10 11
 import org.openzen.zenscript.codemodel.annotations.NativeTag;
@@ -16,6 +17,7 @@ import org.openzen.zenscript.codemodel.member.CustomIteratorMember;
16 17
 import org.openzen.zenscript.codemodel.member.DefinitionMember;
17 18
 import org.openzen.zenscript.codemodel.member.DestructorMember;
18 19
 import org.openzen.zenscript.codemodel.member.FieldMember;
20
+import org.openzen.zenscript.codemodel.member.FunctionalMember;
19 21
 import org.openzen.zenscript.codemodel.member.GetterMember;
20 22
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
21 23
 import org.openzen.zenscript.codemodel.member.ImplementationMember;
@@ -26,32 +28,33 @@ import org.openzen.zenscript.codemodel.member.OperatorMember;
26 28
 import org.openzen.zenscript.codemodel.member.SetterMember;
27 29
 import org.openzen.zenscript.codemodel.member.StaticInitializerMember;
28 30
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
29
-import org.openzen.zenscript.javasource.JavaSourceTypeNameVisitor;
31
+import org.openzen.zenscript.javashared.JavaTypeNameVisitor;
30 32
 import org.openzen.zenscript.javashared.JavaClass;
31 33
 import org.openzen.zenscript.javashared.JavaField;
32
-import org.openzen.zenscript.javasource.JavaSourceContext;
33
-import org.openzen.zenscript.javasource.tags.JavaSourceImplementation;
34
-import org.openzen.zenscript.javasource.tags.JavaSourceMethod;
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;
35 38
 
36 39
 /**
37 40
  *
38 41
  * @author Hoofdgebruiker
39 42
  */
40
-public class JavaSourcePrepareClassMethodVisitor implements MemberVisitor<Void> {
43
+public class JavaPrepareClassMethodVisitor implements MemberVisitor<Void> {
41 44
 	private static final boolean DEBUG_EMPTY = true;
42 45
 	
43
-	private final JavaSourceContext context;
46
+	private final JavaContext context;
44 47
 	private final String filename;
45 48
 	private final JavaClass cls;
46 49
 	private final JavaNativeClass nativeClass;
47
-	private final JavaSourcePrepareDefinitionMemberVisitor memberPreparer;
50
+	private final JavaPrepareDefinitionMemberVisitor memberPreparer;
48 51
 	
49
-	public JavaSourcePrepareClassMethodVisitor(
50
-			JavaSourceContext context,
52
+	public JavaPrepareClassMethodVisitor(
53
+			JavaContext context,
51 54
 			String filename,
52 55
 			JavaClass cls,
53 56
 			JavaNativeClass nativeClass,
54
-			JavaSourcePrepareDefinitionMemberVisitor memberPreparer,
57
+			JavaPrepareDefinitionMemberVisitor memberPreparer,
55 58
 			boolean startsEmpty) {
56 59
 		this.context = context;
57 60
 		this.filename = filename;
@@ -124,7 +127,7 @@ public class JavaSourcePrepareClassMethodVisitor implements MemberVisitor<Void>
124 127
 
125 128
 	@Override
126 129
 	public Void visitCaster(CasterMember member) {
127
-		visitFunctional(member, "to" + member.toType.accept(new JavaSourceTypeNameVisitor()));
130
+		visitFunctional(member, "to" + member.toType.accept(new JavaTypeNameVisitor()));
128 131
 		return null;
129 132
 	}
130 133
 
@@ -145,7 +148,7 @@ public class JavaSourcePrepareClassMethodVisitor implements MemberVisitor<Void>
145 148
 		memberPreparer.prepare(member.type);
146 149
 		
147 150
 		if (canMergeImplementation(member)) {
148
-			member.setTag(JavaSourceImplementation.class, new JavaSourceImplementation(true, cls));
151
+			member.setTag(JavaImplementation.class, new JavaImplementation(true, cls));
149 152
 			for (IDefinitionMember m : member.members)
150 153
 				m.accept(this);
151 154
 		} else {
@@ -154,10 +157,10 @@ public class JavaSourcePrepareClassMethodVisitor implements MemberVisitor<Void>
154 157
 			
155 158
 			cls.empty = false;
156 159
 			
157
-			JavaClass implementationClass = new JavaClass(cls, member.type.accept(new JavaSourceTypeNameVisitor()) + "Implementation", JavaClass.Kind.CLASS);
158
-			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));
159 162
 			
160
-			JavaSourcePrepareClassMethodVisitor visitor = new JavaSourcePrepareClassMethodVisitor(context, filename, implementationClass, null, memberPreparer, true);
163
+			JavaPrepareClassMethodVisitor visitor = new JavaPrepareClassMethodVisitor(context, filename, implementationClass, null, memberPreparer, true);
161 164
 			for (IDefinitionMember m : member.members)
162 165
 				m.accept(visitor);
163 166
 		}
@@ -170,7 +173,7 @@ public class JavaSourcePrepareClassMethodVisitor implements MemberVisitor<Void>
170 173
 
171 174
 	@Override
172 175
 	public Void visitInnerDefinition(InnerDefinitionMember member) {
173
-		JavaSourcePrepareDefinitionMemberVisitor innerDefinitionPrepare = new JavaSourcePrepareDefinitionMemberVisitor(context, filename);
176
+		JavaPrepareDefinitionMemberVisitor innerDefinitionPrepare = new JavaPrepareDefinitionMemberVisitor(context, filename);
174 177
 		member.innerDefinition.accept(innerDefinitionPrepare);
175 178
 		
176 179
 		if (DEBUG_EMPTY && cls.empty)
@@ -188,11 +191,11 @@ public class JavaSourcePrepareClassMethodVisitor implements MemberVisitor<Void>
188 191
 		return null;
189 192
 	}
190 193
 	
191
-	private JavaSourceMethod.Kind getKind(DefinitionMember member) {
194
+	private JavaMethod.Kind getKind(DefinitionMember member) {
192 195
 		if (member instanceof ConstructorMember)
193
-			return JavaSourceMethod.Kind.CONSTRUCTOR;
196
+			return JavaMethod.Kind.CONSTRUCTOR;
194 197
 		
195
-		return member.isStatic() ? JavaSourceMethod.Kind.STATIC : JavaSourceMethod.Kind.INSTANCE;
198
+		return member.isStatic() ? JavaMethod.Kind.STATIC : JavaMethod.Kind.INSTANCE;
196 199
 	}
197 200
 	
198 201
 	private String getOperatorName(OperatorType operator) {
@@ -278,21 +281,21 @@ public class JavaSourcePrepareClassMethodVisitor implements MemberVisitor<Void>
278 281
 		}
279 282
 	}
280 283
 	
281
-	private void visitFunctional(DefinitionMember member, String name) {
284
+	private void visitFunctional(FunctionalMember member, String name) {
282 285
 		NativeTag nativeTag = member.getTag(NativeTag.class);
283
-		JavaSourceMethod method = null;
286
+		JavaMethod method = null;
284 287
 		if (nativeTag != null && nativeClass != null)
285 288
 			method = nativeClass.getMethod(nativeTag.value);
286 289
 		
287 290
 		if (member.getOverrides() != null) {
288 291
 			DefinitionMemberRef base = member.getOverrides();
289
-			JavaSourceMethod baseMethod = base.getTarget().getTag(JavaSourceMethod.class);
292
+			JavaMethod baseMethod = base.getTarget().getTag(JavaMethod.class);
290 293
 			if (baseMethod == null)
291 294
 				throw new IllegalStateException("Base method not yet prepared!");
292 295
 			
293
-			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));
294 297
 		} else if (method == null) {
295
-			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));
296 299
 		}
297 300
 		
298 301
 		if (method.compile) {
@@ -302,6 +305,6 @@ public class JavaSourcePrepareClassMethodVisitor implements MemberVisitor<Void>
302 305
 			cls.empty = false;
303 306
 		}
304 307
 		
305
-		member.setTag(JavaSourceMethod.class, method);
308
+		member.setTag(JavaMethod.class, method);
306 309
 	}
307 310
 }

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

@@ -3,8 +3,9 @@
3 3
  * To change this template file, choose Tools | Templates
4 4
  * and open the template in the editor.
5 5
  */
6
-package org.openzen.zenscript.javasource.prepare;
6
+package org.openzen.zenscript.javashared.prepare;
7 7
 
8
+import org.openzen.zenscript.javashared.JavaNativeClass;
8 9
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
9 10
 import org.openzen.zenscript.codemodel.definition.AliasDefinition;
10 11
 import org.openzen.zenscript.codemodel.definition.ClassDefinition;
@@ -19,18 +20,19 @@ import org.openzen.zenscript.codemodel.member.IDefinitionMember;
19 20
 import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
20 21
 import org.openzen.zenscript.codemodel.type.ITypeID;
21 22
 import org.openzen.zenscript.javashared.JavaClass;
22
-import org.openzen.zenscript.javasource.JavaSourceContext;
23
-import org.openzen.zenscript.javasource.tags.JavaSourceMethod;
23
+import org.openzen.zenscript.javashared.JavaContext;
24
+import org.openzen.zenscript.javashared.JavaMethod;
25
+import org.openzen.zenscript.javashared.JavaModifiers;
24 26
 
25 27
 /**
26 28
  *
27 29
  * @author Hoofdgebruiker
28 30
  */
29
-public class JavaSourcePrepareDefinitionMemberVisitor implements DefinitionVisitor<JavaClass> {
30
-	private final JavaSourceContext context;
31
+public class JavaPrepareDefinitionMemberVisitor implements DefinitionVisitor<JavaClass> {
32
+	private final JavaContext context;
31 33
 	private final String filename;
32 34
 	
33
-	public JavaSourcePrepareDefinitionMemberVisitor(JavaSourceContext context, String filename) {
35
+	public JavaPrepareDefinitionMemberVisitor(JavaContext context, String filename) {
34 36
 		this.context = context;
35 37
 		this.filename = filename;
36 38
 	}
@@ -88,8 +90,8 @@ public class JavaSourcePrepareDefinitionMemberVisitor implements DefinitionVisit
88 90
 			return definition.getTag(JavaClass.class);
89 91
 		
90 92
 		JavaClass cls = definition.getTag(JavaClass.class);
91
-		JavaSourceMethod method = new JavaSourceMethod(cls, JavaSourceMethod.Kind.STATIC, definition.name, true);
92
-		definition.caller.setTag(JavaSourceMethod.class, method);
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);
93 95
 		return cls;
94 96
 	}
95 97
 
@@ -136,7 +138,7 @@ public class JavaSourcePrepareDefinitionMemberVisitor implements DefinitionVisit
136 138
 	
137 139
 	private void visitClassMembers(HighLevelDefinition definition, JavaClass cls, JavaNativeClass nativeClass, boolean startsEmpty) {
138 140
 		System.out.println("Preparing " + cls.internalName);
139
-		JavaSourcePrepareClassMethodVisitor methodVisitor = new JavaSourcePrepareClassMethodVisitor(context, filename, cls, nativeClass, this, startsEmpty);
141
+		JavaPrepareClassMethodVisitor methodVisitor = new JavaPrepareClassMethodVisitor(context, filename, cls, nativeClass, this, startsEmpty);
140 142
 		for (IDefinitionMember member : definition.members) {
141 143
 			member.accept(methodVisitor);
142 144
 		}
@@ -145,7 +147,7 @@ public class JavaSourcePrepareDefinitionMemberVisitor implements DefinitionVisit
145 147
 	
146 148
 	private void visitExpansionMembers(HighLevelDefinition definition, JavaClass cls, JavaNativeClass nativeClass) {
147 149
 		System.out.println("Preparing " + cls.internalName);
148
-		JavaSourcePrepareExpansionMethodVisitor methodVisitor = new JavaSourcePrepareExpansionMethodVisitor(context, cls, nativeClass);
150
+		JavaPrepareExpansionMethodVisitor methodVisitor = new JavaPrepareExpansionMethodVisitor(context, cls, nativeClass);
149 151
 		for (IDefinitionMember member : definition.members) {
150 152
 			member.accept(methodVisitor);
151 153
 		}

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

@@ -3,9 +3,11 @@
3 3
  * To change this template file, choose Tools | Templates
4 4
  * and open the template in the editor.
5 5
  */
6
-package org.openzen.zenscript.javasource.prepare;
6
+package org.openzen.zenscript.javashared.prepare;
7 7
 
8
+import org.openzen.zenscript.javashared.JavaNativeClass;
8 9
 import java.util.HashMap;
10
+import java.util.List;
9 11
 import java.util.Map;
10 12
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
11 13
 import org.openzen.zenscript.codemodel.annotations.NativeTag;
@@ -25,79 +27,78 @@ import org.openzen.zenscript.codemodel.member.IDefinitionMember;
25 27
 import org.openzen.zenscript.codemodel.member.InnerDefinitionMember;
26 28
 import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
27 29
 import org.openzen.zenscript.codemodel.type.ITypeID;
28
-import org.openzen.zenscript.formattershared.ExpressionString;
29
-import org.openzen.zenscript.javasource.JavaOperator;
30 30
 import org.openzen.zenscript.javashared.JavaClass;
31
-import org.openzen.zenscript.javasource.tags.JavaSourceMethod;
32
-import org.openzen.zenscript.javasource.tags.JavaSourceVariantOption;
31
+import org.openzen.zenscript.javashared.JavaMethod;
32
+import org.openzen.zenscript.javashared.JavaModifiers;
33
+import org.openzen.zenscript.javashared.JavaVariantOption;
33 34
 
34 35
 /**
35 36
  *
36 37
  * @author Hoofdgebruiker
37 38
  */
38
-public class JavaSourcePrepareDefinitionVisitor implements DefinitionVisitor<JavaClass> {
39
+public class JavaPrepareDefinitionVisitor implements DefinitionVisitor<JavaClass> {
39 40
 	private static final Map<String, JavaNativeClass> nativeClasses = new HashMap<>();
40 41
 	
41 42
 	static {
42 43
 		{
43 44
 			JavaNativeClass cls = new JavaNativeClass(new JavaClass("java.lang", "StringBuilder", JavaClass.Kind.CLASS));
44
-			cls.addConstructor("constructor", "");
45
-			cls.addConstructor("constructorWithCapacity", "");
46
-			cls.addConstructor("constructorWithValue", "");
47
-			cls.addMethod("isEmpty", new JavaSourceMethod((formatter, call) -> ((CallExpression)call).accept(formatter).unaryPostfix(JavaOperator.EQUALS, "length() == 0")));
48
-			cls.addInstanceMethod("length", "length");
49
-			cls.addInstanceMethod("appendBool", "append");
50
-			cls.addInstanceMethod("appendByte", "append");
51
-			cls.addInstanceMethod("appendSByte", "append");
52
-			cls.addInstanceMethod("appendShort", "append");
53
-			cls.addInstanceMethod("appendUShort", "append");
54
-			cls.addInstanceMethod("appendInt", "append");
55
-			cls.addInstanceMethod("appendUInt", "append");
56
-			cls.addInstanceMethod("appendLong", "append");
57
-			cls.addInstanceMethod("appendULong", "append");
58
-			cls.addInstanceMethod("appendFloat", "append");
59
-			cls.addInstanceMethod("appendDouble", "append");
60
-			cls.addInstanceMethod("appendChar", "append");
61
-			cls.addInstanceMethod("appendString", "append");
62
-			cls.addInstanceMethod("asString", "toString");
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;");
63 64
 			nativeClasses.put("stdlib::StringBuilder", cls);
64 65
 		}
65 66
 		
66 67
 		{
67 68
 			JavaNativeClass list = new JavaNativeClass(new JavaClass("java.util", "List", JavaClass.Kind.INTERFACE));
68 69
 			JavaClass arrayList = new JavaClass("java.util", "ArrayList", JavaClass.Kind.CLASS);
69
-			list.addMethod("constructor", new JavaSourceMethod(arrayList, JavaSourceMethod.Kind.CONSTRUCTOR, "", false));
70
-			list.addInstanceMethod("add", "add");
71
-			list.addInstanceMethod("insert", "add");
72
-			list.addInstanceMethod("remove", "remove");
73
-			list.addInstanceMethod("indexOf", "indexOf");
74
-			list.addInstanceMethod("lastIndexOf", "lastIndexOf");
75
-			list.addInstanceMethod("getAtIndex", "get");
76
-			list.addInstanceMethod("setAtIndex", "set");
77
-			list.addInstanceMethod("contains", "contains");
78
-			list.addMethod("toArray", new JavaSourceMethod((formatter, call) -> formatter.listToArray((CastExpression)call)));
79
-			list.addInstanceMethod("length", "size");
80
-			list.addInstanceMethod("isEmpty", "isEmpty");
81
-			list.addInstanceMethod("iterate", "iterator");
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;");
82 83
 			nativeClasses.put("stdlib::List", list);
83 84
 		}
84 85
 		
85 86
 		{
86 87
 			JavaNativeClass iterable = new JavaNativeClass(new JavaClass("java.lang", "Iterable", JavaClass.Kind.INTERFACE));
87
-			iterable.addInstanceMethod("iterate", "iterator");
88
+			iterable.addInstanceMethod("iterate", "iterator", "()Ljava/util/Iterator;");
88 89
 			nativeClasses.put("stdlib::Iterable", iterable);
89 90
 		}
90 91
 		
91 92
 		{
92 93
 			JavaNativeClass iterator = new JavaNativeClass(JavaClass.ITERATOR);
93
-			iterator.addInstanceMethod("hasNext", "hasNext");
94
-			iterator.addInstanceMethod("next", "next");
94
+			iterator.addInstanceMethod("hasNext", "hasNext", "()Z");
95
+			iterator.addInstanceMethod("next", "next", "()Ljava/lang/Object;");
95 96
 			nativeClasses.put("stdlib::Iterator", iterator);
96 97
 		}
97 98
 		
98 99
 		{
99 100
 			JavaNativeClass comparable = new JavaNativeClass(new JavaClass("java.lang", "Comparable", JavaClass.Kind.INTERFACE));
100
-			comparable.addInstanceMethod("compareTo", "compareTo");
101
+			comparable.addInstanceMethod("compareTo", "compareTo", "(Ljava/lang/Object;)I");
101 102
 			nativeClasses.put("stdlib::Comparable", comparable);
102 103
 		}
103 104
 		
@@ -106,107 +107,86 @@ public class JavaSourcePrepareDefinitionVisitor implements DefinitionVisitor<Jav
106 107
 			JavaClass math = new JavaClass("java.lang", "Math", JavaClass.Kind.CLASS);
107 108
 			
108 109
 			JavaNativeClass cls = new JavaNativeClass(integer);
109
-			cls.addMethod("min", new JavaSourceMethod(math, JavaSourceMethod.Kind.STATIC, "min", false));
110
-			cls.addMethod("max", new JavaSourceMethod(math, JavaSourceMethod.Kind.STATIC, "max", false));
111
-			cls.addMethod("toHexString", new JavaSourceMethod(integer, JavaSourceMethod.Kind.EXPANSION, "toHexString", false));
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));
112 113
 			nativeClasses.put("stdlib::Integer", cls);
113 114
 		}
114 115
 		
115 116
 		{
116 117
 			JavaNativeClass cls = new JavaNativeClass(new JavaClass("java.lang", "String", JavaClass.Kind.CLASS));
117
-			cls.addMethod("contains", new JavaSourceMethod((formatter, calle) -> {
118
-				CallExpression call = (CallExpression)calle;
119
-				ExpressionString str = call.arguments.arguments[0].accept(formatter);
120
-				ExpressionString character = call.arguments.arguments[1].accept(formatter);
121
-				return str.unaryPostfix(JavaOperator.GREATER_EQUALS, ".indexOf(" + character.value + ")");
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);
122 123
 			}));
123
-			cls.addInstanceMethod("indexOf", "indexOf");
124
-			cls.addInstanceMethod("indexOfFrom", "indexOf");
125
-			cls.addInstanceMethod("lastIndexOf", "lastIndexOf");
126
-			cls.addInstanceMethod("lastIndexOfFrom", "lastIndexOf");
127
-			cls.addInstanceMethod("trim", "trim");
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;");
128 129
 			nativeClasses.put("stdlib::String", cls);
129 130
 		}
130 131
 		
131 132
 		{
132 133
 			JavaClass arrays = new JavaClass("java.lang", "Arrays", JavaClass.Kind.CLASS);
133 134
 			JavaNativeClass cls = new JavaNativeClass(arrays);
134
-			cls.addMethod("sort", new JavaSourceMethod(arrays, JavaSourceMethod.Kind.EXPANSION, "sort", false));
135
-			cls.addMethod("sorted", new JavaSourceMethod((formatter, calle) -> {
136
-				Expression target = formatter.duplicable(((CallExpression)calle).target);
137
-				ExpressionString targetString = target.accept(formatter);
138
-				ExpressionString copy = new ExpressionString("Arrays.copyOf(" + targetString.value + ", " + targetString.value + ".length).sort()", JavaOperator.CALL);
139
-				ExpressionString source = formatter.hoist(copy, formatter.scope.type(target.type));
140
-				formatter.target.writeLine("Arrays.sort(" + source.value + ");");
141
-				return source;
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);
142 138
 			}));
143
-			cls.addMethod("sortWithComparator", new JavaSourceMethod(arrays, JavaSourceMethod.Kind.EXPANSION, "sort", false));
144
-			cls.addMethod("sortedWithComparator", new JavaSourceMethod((formatter, calle) -> {
145
-				Expression target = formatter.duplicable(((CallExpression)calle).target);
146
-				ExpressionString comparator = ((CallExpression)calle).arguments.arguments[0].accept(formatter);
147
-				ExpressionString targetString = target.accept(formatter);
148
-				ExpressionString copy = new ExpressionString("Arrays.copyOf(" + targetString.value + ", " + targetString.value + ".length).sort()", JavaOperator.CALL);
149
-				ExpressionString source = formatter.hoist(copy, formatter.scope.type(target.type));
150
-				formatter.target.writeLine("Arrays.sort(" + source.value + ", " + comparator.value + ");");
151
-				return source;
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]);
152 144
 			}));
153
-			cls.addMethod("copy", new JavaSourceMethod((formatter, calle) -> {
154
-				Expression target = formatter.duplicable(((CallExpression)calle).target);
155
-				ExpressionString source = target.accept(formatter);
156
-				return new ExpressionString("Arrays.copyOf(" + source.value + ", " + source.value + ".length)", JavaOperator.CALL);
145
+			cls.addMethod("copy", new JavaMethod((expression, translator) -> {
146
+				return translator.copy(((CallExpression)expression).target);
157 147
 			}));
158
-			cls.addMethod("copyResize", new JavaSourceMethod(arrays, JavaSourceMethod.Kind.EXPANSION, "copyOf", false));
159
-			cls.addMethod("copyTo", new JavaSourceMethod((formatter, calle) -> {
160
-				CallExpression call = (CallExpression)calle;
161
-				Expression source = call.target;
162
-				Expression target = call.arguments.arguments[0];
163
-				Expression sourceOffset = call.arguments.arguments[1];
164
-				Expression targetOffset = call.arguments.arguments[2];
165
-				Expression length = call.arguments.arguments[3];
166
-				return new ExpressionString("System.arraycopy("
167
-					+ source.accept(formatter) + ", "
168
-					+ sourceOffset.accept(formatter) + ", "
169
-					+ target.accept(formatter) + ", "
170
-					+ targetOffset.accept(formatter) + ", "
171
-					+ length.accept(formatter) + ")", JavaOperator.CALL);
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);
172 151
 			}));
173 152
 			nativeClasses.put("stdlib::Arrays", cls);
174 153
 		}
175 154
 		
176 155
 		{
177 156
 			JavaNativeClass cls = new JavaNativeClass(new JavaClass("java.lang", "IllegalArgumentException", JavaClass.Kind.CLASS));
178
-			cls.addConstructor("constructor", "");
157
+			cls.addConstructor("constructor", "(Ljava/lang/String;)V");
179 158
 			nativeClasses.put("stdlib::IllegalArgumentException", cls);
180 159
 		}
181 160
 		
182 161
 		{
183 162
 			JavaNativeClass cls = new JavaNativeClass(new JavaClass("java.lang", "Exception", JavaClass.Kind.CLASS));
184
-			cls.addConstructor("constructor", "");
185
-			cls.addConstructor("constructorWithCause", "");
163
+			cls.addConstructor("constructor", "(Ljava/lang/String;)V");
164
+			cls.addConstructor("constructorWithCause", "(Ljava/lang/String;Ljava/lang/Throwable;)V");
186 165
 			nativeClasses.put("stdlib::Exception", cls);
187 166
 		}
188 167
 		
189 168
 		{
190 169
 			JavaNativeClass cls = new JavaNativeClass(new JavaClass("java.io", "IOException", JavaClass.Kind.CLASS));
191
-			cls.addConstructor("constructor", "");
170
+			cls.addConstructor("constructor", "(Ljava/lang/String;)V");
192 171
 			nativeClasses.put("io::IOException", cls);
193 172
 		}
194 173
 		
195 174
 		{
196 175
 			JavaNativeClass cls = new JavaNativeClass(new JavaClass("java.io", "Reader", JavaClass.Kind.INTERFACE));
197
-			cls.addInstanceMethod("destruct", "close");
198
-			cls.addInstanceMethod("readCharacter", "read");
199
-			cls.addInstanceMethod("readArray", "read");
200
-			cls.addInstanceMethod("readArraySlice", "read");
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");
201 180
 			nativeClasses.put("io::Reader", cls);
202 181
 		}
203 182
 		
204 183
 		{
205 184
 			JavaNativeClass cls = new JavaNativeClass(new JavaClass("java.io", "StringReader", JavaClass.Kind.CLASS), true);
206
-			cls.addConstructor("constructor", "");
207
-			cls.addInstanceMethod("destructor", "close");
208
-			cls.addInstanceMethod("readCharacter", "read");
209
-			cls.addInstanceMethod("readSlice", "read");
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");
210 190
 			nativeClasses.put("io::StringReader", cls);
211 191
 		}
212 192
 	}
@@ -214,7 +194,7 @@ public class JavaSourcePrepareDefinitionVisitor implements DefinitionVisitor<Jav
214 194
 	private final String filename;
215 195
 	private final JavaClass outerClass;
216 196
 	
217
-	public JavaSourcePrepareDefinitionVisitor(String filename, JavaClass outerClass) {
197
+	public JavaPrepareDefinitionVisitor(String filename, JavaClass outerClass) {
218 198
 		this.filename = filename;
219 199
 		this.outerClass = outerClass;
220 200
 	}
@@ -307,7 +287,7 @@ public class JavaSourcePrepareDefinitionVisitor implements DefinitionVisitor<Jav
307 287
 		
308 288
 		for (VariantDefinition.Option option : variant.options) {
309 289
 			JavaClass variantCls = new JavaClass(cls.fullName, option.name, JavaClass.Kind.CLASS);
310
-			option.setTag(JavaSourceVariantOption.class, new JavaSourceVariantOption(cls, variantCls));
290
+			option.setTag(JavaVariantOption.class, new JavaVariantOption(cls, variantCls));
311 291
 		}
312 292
 		
313 293
 		return cls;
@@ -335,7 +315,7 @@ public class JavaSourcePrepareDefinitionVisitor implements DefinitionVisitor<Jav
335 315
 		
336 316
 		for (IDefinitionMember member : definition.members) {
337 317
 			if (member instanceof InnerDefinitionMember) {
338
-				((InnerDefinitionMember) member).innerDefinition.accept(new JavaSourcePrepareDefinitionVisitor(filename, cls));
318
+				((InnerDefinitionMember) member).innerDefinition.accept(new JavaPrepareDefinitionVisitor(filename, cls));
339 319
 			}
340 320
 		}
341 321
 		

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

@@ -3,8 +3,9 @@
3 3
  * To change this template file, choose Tools | Templates
4 4
  * and open the template in the editor.
5 5
  */
6
-package org.openzen.zenscript.javasource.prepare;
6
+package org.openzen.zenscript.javashared.prepare;
7 7
 
8
+import org.openzen.zenscript.javashared.JavaNativeClass;
8 9
 import org.openzen.zencode.shared.StringExpansion;
9 10
 import org.openzen.zenscript.codemodel.OperatorType;
10 11
 import org.openzen.zenscript.codemodel.annotations.NativeTag;
@@ -16,6 +17,7 @@ import org.openzen.zenscript.codemodel.member.CustomIteratorMember;
16 17
 import org.openzen.zenscript.codemodel.member.DefinitionMember;
17 18
 import org.openzen.zenscript.codemodel.member.DestructorMember;
18 19
 import org.openzen.zenscript.codemodel.member.FieldMember;
20
+import org.openzen.zenscript.codemodel.member.FunctionalMember;
19 21
 import org.openzen.zenscript.codemodel.member.GetterMember;
20 22
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
21 23
 import org.openzen.zenscript.codemodel.member.ImplementationMember;
@@ -25,25 +27,26 @@ import org.openzen.zenscript.codemodel.member.MethodMember;
25 27
 import org.openzen.zenscript.codemodel.member.OperatorMember;
26 28
 import org.openzen.zenscript.codemodel.member.SetterMember;
27 29
 import org.openzen.zenscript.codemodel.member.StaticInitializerMember;
28
-import org.openzen.zenscript.javasource.JavaSourceTypeNameVisitor;
30
+import org.openzen.zenscript.javashared.JavaTypeNameVisitor;
29 31
 import org.openzen.zenscript.javashared.JavaClass;
30 32
 import org.openzen.zenscript.javashared.JavaField;
31
-import org.openzen.zenscript.javasource.JavaSourceContext;
32
-import org.openzen.zenscript.javasource.tags.JavaSourceImplementation;
33
-import org.openzen.zenscript.javasource.tags.JavaSourceMethod;
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;
34 37
 
35 38
 /**
36 39
  *
37 40
  * @author Hoofdgebruiker
38 41
  */
39
-public class JavaSourcePrepareExpansionMethodVisitor implements MemberVisitor<Void> {
42
+public class JavaPrepareExpansionMethodVisitor implements MemberVisitor<Void> {
40 43
 	private static final boolean DEBUG_EMPTY = true;
41 44
 	
42
-	private final JavaSourceContext context;
45
+	private final JavaContext context;
43 46
 	private final JavaClass cls;
44 47
 	private final JavaNativeClass nativeClass;
45 48
 	
46
-	public JavaSourcePrepareExpansionMethodVisitor(JavaSourceContext context, JavaClass cls, JavaNativeClass nativeClass) {
49
+	public JavaPrepareExpansionMethodVisitor(JavaContext context, JavaClass cls, JavaNativeClass nativeClass) {
47 50
 		this.cls = cls;
48 51
 		this.nativeClass = nativeClass;
49 52
 		this.context = context;
@@ -111,7 +114,7 @@ public class JavaSourcePrepareExpansionMethodVisitor implements MemberVisitor<Vo
111 114
 
112 115
 	@Override
113 116
 	public Void visitCaster(CasterMember member) {
114
-		visitFunctional(member, "to" + member.toType.accept(new JavaSourceTypeNameVisitor()));
117
+		visitFunctional(member, "to" + member.toType.accept(new JavaTypeNameVisitor()));
115 118
 		return null;
116 119
 	}
117 120
 
@@ -129,8 +132,8 @@ public class JavaSourcePrepareExpansionMethodVisitor implements MemberVisitor<Vo
129 132
 
130 133
 	@Override
131 134
 	public Void visitImplementation(ImplementationMember member) {
132
-		JavaClass implementationClass = new JavaClass(cls, member.type.accept(new JavaSourceTypeNameVisitor()) + "Implementation", JavaClass.Kind.CLASS);
133
-		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));
134 137
 		for (IDefinitionMember implementedMember : member.members)
135 138
 			implementedMember.accept(this);
136 139
 		
@@ -150,13 +153,13 @@ public class JavaSourcePrepareExpansionMethodVisitor implements MemberVisitor<Vo
150 153
 		return null;
151 154
 	}
152 155
 	
153
-	private void visitFunctional(DefinitionMember member, String name) {
156
+	private void visitFunctional(FunctionalMember member, String name) {
154 157
 		NativeTag nativeTag = member.getTag(NativeTag.class);
155
-		JavaSourceMethod method = null;
158
+		JavaMethod method = null;
156 159
 		if (nativeTag != null && nativeClass != null)
157 160
 			method = nativeClass.getMethod(nativeTag.value);
158 161
 		if (method == null)
159
-			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)); 
160 163
 		
161 164
 		if (method.compile) {
162 165
 			if (DEBUG_EMPTY && cls.empty)
@@ -165,11 +168,11 @@ public class JavaSourcePrepareExpansionMethodVisitor implements MemberVisitor<Vo
165 168
 			cls.empty = false;
166 169
 		}
167 170
 		
168
-		member.setTag(JavaSourceMethod.class, method);
171
+		member.setTag(JavaMethod.class, method);
169 172
 	}
170 173
 	
171
-	private JavaSourceMethod.Kind getKind(DefinitionMember member) {
172
-		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;
173 176
 	}
174 177
 	
175 178
 	private String getOperatorName(OperatorType operator) {

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

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

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

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

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

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

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

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

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

@@ -5,6 +5,7 @@
5 5
  */
6 6
 package org.openzen.zenscript.javasource;
7 7
 
8
+import org.openzen.zenscript.javashared.JavaContext;
8 9
 import java.io.File;
9 10
 import java.util.HashMap;
10 11
 import java.util.Map;
@@ -15,7 +16,7 @@ import org.openzen.zenscript.codemodel.definition.ZSPackage;
15 16
 import org.openzen.zenscript.compiler.CompilationUnit;
16 17
 import org.openzen.zenscript.compiler.SemanticModule;
17 18
 import org.openzen.zenscript.compiler.ZenCodeCompiler;
18
-import org.openzen.zenscript.javasource.prepare.JavaSourcePrepareDefinitionVisitor;
19
+import org.openzen.zenscript.javashared.prepare.JavaPrepareDefinitionVisitor;
19 20
 import org.openzen.zenscript.javashared.JavaClass;
20 21
 
21 22
 /**
@@ -38,7 +39,9 @@ public class JavaSourceCompiler implements ZenCodeCompiler {
38 39
 		
39 40
 		settings = new JavaSourceFormattingSettings.Builder().build();
40 41
 		typeGenerator = new JavaSourceSyntheticTypeGenerator(directory, settings);
41
-		helperGenerator = new JavaSourceSyntheticHelperGenerator(directory, settings);
42
+		
43
+		JavaSourceContext context = new JavaSourceContext(typeGenerator);
44
+		helperGenerator = new JavaSourceSyntheticHelperGenerator(context, directory, settings);
42 45
 		
43 46
 		this.directory = directory;
44 47
 	}
@@ -46,7 +49,7 @@ public class JavaSourceCompiler implements ZenCodeCompiler {
46 49
 	@Override
47 50
 	public void addDefinition(HighLevelDefinition definition, SemanticModule module) {
48 51
 		String filename = getFilename(definition);
49
-		JavaSourcePrepareDefinitionVisitor prepare = new JavaSourcePrepareDefinitionVisitor(filename, null);
52
+		JavaPrepareDefinitionVisitor prepare = new JavaPrepareDefinitionVisitor(filename, null);
50 53
 		JavaClass cls = definition.accept(prepare);
51 54
 		
52 55
 		File file = new File(getDirectory(definition.pkg), cls.getName() + ".java");

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

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

+ 81
- 24
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceExpressionFormatter.java View File

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

+ 4
- 3
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceFile.java View File

@@ -5,6 +5,7 @@
5 5
  */
6 6
 package org.openzen.zenscript.javasource;
7 7
 
8
+import org.openzen.zenscript.javashared.JavaContext;
8 9
 import java.io.BufferedOutputStream;
9 10
 import java.io.File;
10 11
 import java.io.FileOutputStream;
@@ -23,7 +24,7 @@ import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
23 24
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
24 25
 import org.openzen.zenscript.compiler.SemanticModule;
25 26
 import org.openzen.zenscript.javashared.JavaClass;
26
-import org.openzen.zenscript.javasource.prepare.JavaSourcePrepareDefinitionMemberVisitor;
27
+import org.openzen.zenscript.javashared.prepare.JavaPrepareDefinitionMemberVisitor;
27 28
 
28 29
 /**
29 30
  *
@@ -68,8 +69,8 @@ public class JavaSourceFile {
68 69
 		modules.put(definition, module);
69 70
 	}
70 71
 	
71
-	public void prepare(JavaSourceContext context) {
72
-		JavaSourcePrepareDefinitionMemberVisitor visitor = new JavaSourcePrepareDefinitionMemberVisitor(context, file.getName());
72
+	public void prepare(JavaContext context) {
73
+		JavaPrepareDefinitionMemberVisitor visitor = new JavaPrepareDefinitionMemberVisitor(context, file.getName());
73 74
 		
74 75
 		if (mainDefinition != null)
75 76
 			mainDefinition.accept(visitor);

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

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

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

@@ -1,46 +0,0 @@
1
-/*
2
- * To change this license header, choose License Headers in Project Properties.
3
- * To change this template file, choose Tools | Templates
4
- * and open the template in the editor.
5
- */
6
-package org.openzen.zenscript.javasource.prepare;
7
-
8
-import java.util.HashMap;
9
-import java.util.Map;
10
-import org.openzen.zenscript.javashared.JavaClass;
11
-import org.openzen.zenscript.javasource.tags.JavaSourceMethod;
12
-
13
-/**
14
- *
15
- * @author Hoofdgebruiker
16
- */
17
-public class JavaNativeClass {
18
-	public final JavaClass cls;
19
-	private final Map<String, JavaSourceMethod> methods = new HashMap<>();
20
-	public final boolean nonDestructible;
21
-	
22
-	public JavaNativeClass(JavaClass cls) {
23
-		this(cls, false);
24
-	}
25
-	
26
-	public JavaNativeClass(JavaClass cls, boolean nonDestructible) {
27
-		this.cls = cls;
28
-		this.nonDestructible = nonDestructible;
29
-	}
30
-	
31
-	public void addMethod(String key, JavaSourceMethod method) {
32
-		methods.put(key, method);
33
-	}
34
-	
35
-	public void addConstructor(String key, String name) {
36
-		methods.put(key, new JavaSourceMethod(cls, JavaSourceMethod.Kind.CONSTRUCTOR, name, false));
37
-	}
38
-	
39
-	public void addInstanceMethod(String key, String name) {
40
-		methods.put(key, new JavaSourceMethod(cls, JavaSourceMethod.Kind.INSTANCE, name, false));
41
-	}
42
-	
43
-	public JavaSourceMethod getMethod(String name) {
44
-		return methods.get(name);
45
-	}
46
-}

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

@@ -1,14 +0,0 @@
1
-/*
2
- * To change this license header, choose License Headers in Project Properties.
3
- * To change this template file, choose Tools | Templates
4
- * and open the template in the editor.
5
- */
6
-package org.openzen.zenscript.javasource.prepare;
7
-
8
-/**
9
- *
10
- * @author Hoofdgebruiker
11
- */
12
-public class JavaSourceSignatureVisitor {
13
-	
14
-}

Loading…
Cancel
Save