Skip to content

Commit e1bf706

Browse files
committed
Allow constructing a JavaClass from a Class reference
Signed-off-by: TheSilkMiner <thesilkminer@outlook.com>
1 parent c66aad9 commit e1bf706

2 files changed

Lines changed: 41 additions & 25 deletions

File tree

JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaMethodBytecodeCompiler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ public class JavaMethodBytecodeCompiler implements JavaMethodCompiler<Void> {
124124

125125
private static final JavaNativeMethod OBJECTS_EQUALS = new JavaNativeMethod(JavaClass.fromInternalName("java/util/Objects", JavaClass.Kind.CLASS), JavaNativeMethod.Kind.STATIC, "equals", false, "(Ljava/lang/Object;Ljava/lang/Object;)Z", 0, false);
126126

127-
private static final JavaNativeMethod STRINGBUILDER_LENGTH = JavaNativeMethod.getNativeVirtual(JavaClass.STRINGBUILDER, "length", "()I");
127+
private static final JavaNativeMethod STRINGBUILDER_LENGTH = JavaNativeMethod.getNativeVirtual(JavaClass.STRING_BUILDER, "length", "()I");
128128

129129
private final JavaWriter javaWriter;
130130
private final JavaExpressionVisitor expressionVisitor;

JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaClass.java

Lines changed: 40 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -7,35 +7,38 @@
77

88
import stdlib.Strings;
99

10-
import java.util.Arrays;
10+
import java.io.Closeable;
11+
import java.lang.reflect.Array;
12+
import java.util.*;
1113

1214
/**
1315
* @author Hoofdgebruiker
1416
*/
1517
public class JavaClass implements Comparable<JavaClass> {
16-
public static final JavaClass CLASS = new JavaClass("java.lang", "Class", Kind.CLASS);
17-
public static final JavaClass ENUM = new JavaClass("java.lang", "Enum", Kind.CLASS);
18-
public static final JavaClass OBJECT = new JavaClass("java.lang", "Object", Kind.CLASS);
19-
public static final JavaClass STRING = new JavaClass("java.lang", "String", Kind.CLASS);
20-
public static final JavaClass CLOSEABLE = new JavaClass("java.lang", "AutoCloseable", Kind.INTERFACE);
21-
public static final JavaClass MAP = new JavaClass("java.util", "Map", JavaClass.Kind.INTERFACE);
22-
public static final JavaClass HASHMAP = new JavaClass("java.util", "HashMap", JavaClass.Kind.CLASS);
23-
public static final JavaClass ITERATOR = new JavaClass("java.util", "Iterator", JavaClass.Kind.INTERFACE);
24-
public static final JavaClass ITERABLE = new JavaClass("java.lang", "Iterable", Kind.INTERFACE);
25-
public static final JavaClass ARRAYS = new JavaClass("java.util", "Arrays", Kind.CLASS);
26-
27-
public static final JavaClass BOOLEAN = new JavaClass("java.lang", "Boolean", Kind.CLASS);
28-
public static final JavaClass BYTE = new JavaClass("java.lang", "Byte", Kind.CLASS);
29-
public static final JavaClass SHORT = new JavaClass("java.lang", "Short", Kind.CLASS);
30-
public static final JavaClass INTEGER = new JavaClass("java.lang", "Integer", Kind.CLASS);
31-
public static final JavaClass LONG = new JavaClass("java.lang", "Long", Kind.CLASS);
32-
public static final JavaClass FLOAT = new JavaClass("java.lang", "Float", Kind.CLASS);
33-
public static final JavaClass DOUBLE = new JavaClass("java.lang", "Double", Kind.CLASS);
34-
public static final JavaClass CHARACTER = new JavaClass("java.lang", "Character", Kind.CLASS);
35-
public static final JavaClass COLLECTION = new JavaClass("java.util", "Collection", Kind.INTERFACE);
36-
public static final JavaClass COLLECTIONS = new JavaClass("java.util", "Collections", Kind.CLASS);
37-
public static final JavaClass STRINGBUILDER = new JavaClass("java.lang", "StringBuilder", Kind.CLASS);
38-
public static final JavaClass ARRAY = new JavaClass("java.lang.reflect", "Array", Kind.CLASS);
18+
public static final JavaClass CLASS = fromJavaClass(Class.class);
19+
public static final JavaClass ENUM = fromJavaClass(Enum.class);
20+
public static final JavaClass OBJECT = fromJavaClass(Object.class);
21+
public static final JavaClass STRING = fromJavaClass(String.class);
22+
public static final JavaClass AUTO_CLOSEABLE = fromJavaClass(AutoCloseable.class);
23+
public static final JavaClass CLOSEABLE = fromJavaClass(Closeable.class);
24+
public static final JavaClass MAP = fromJavaClass(Map.class);
25+
public static final JavaClass HASHMAP = fromJavaClass(HashMap.class);
26+
public static final JavaClass ITERATOR = fromJavaClass(Iterator.class);
27+
public static final JavaClass ITERABLE = fromJavaClass(Iterable.class);
28+
public static final JavaClass ARRAYS = fromJavaClass(Arrays.class);
29+
30+
public static final JavaClass BOOLEAN = fromJavaClass(Boolean.class);
31+
public static final JavaClass BYTE = fromJavaClass(Byte.class);
32+
public static final JavaClass SHORT = fromJavaClass(Short.class);
33+
public static final JavaClass INTEGER = fromJavaClass(Integer.class);
34+
public static final JavaClass LONG = fromJavaClass(Long.class);
35+
public static final JavaClass FLOAT = fromJavaClass(Float.class);
36+
public static final JavaClass DOUBLE = fromJavaClass(Double.class);
37+
public static final JavaClass CHARACTER = fromJavaClass(Character.class);
38+
public static final JavaClass COLLECTION = fromJavaClass(Collection.class);
39+
public static final JavaClass COLLECTIONS = fromJavaClass(Collections.class);
40+
public static final JavaClass STRING_BUILDER = fromJavaClass(StringBuilder.class);
41+
public static final JavaClass ARRAY = fromJavaClass(Array.class);
3942

4043
public static final JavaClass SHARED = new JavaClass("zsynthetic", "Shared", Kind.CLASS);
4144
public final JavaClass outer;
@@ -97,6 +100,19 @@ public static JavaClass fromInternalName(String internalName, Kind kind) {
97100
return new JavaClass(pkg, internalName, kind, nameParts);
98101
}
99102

103+
public static JavaClass fromJavaClass(final Class<?> clazz) {
104+
if (clazz.isArray()) {
105+
return JavaClass.fromInternalName(clazz.getName(), Kind.ARRAY);
106+
}
107+
if (clazz.isPrimitive()) {
108+
throw new IllegalStateException("JavaClass cannot represent primitive types");
109+
}
110+
111+
final String internalName = clazz.getName().replace('.', '/');
112+
final Kind kind = clazz.isInterface()? Kind.INTERFACE : clazz.isEnum()? Kind.ENUM : Kind.CLASS;
113+
return JavaClass.fromInternalName(internalName, kind);
114+
}
115+
100116
public static String getNameFromFile(String filename) {
101117
if (filename.indexOf('.') > 0)
102118
return filename.substring(0, filename.lastIndexOf('.'));

0 commit comments

Comments
 (0)