|
@@ -35,11 +35,7 @@ import org.openzen.zenscript.codemodel.annotations.AnnotationDefinition;
|
35
|
35
|
import org.openzen.zenscript.codemodel.context.CompilingPackage;
|
36
|
36
|
import org.openzen.zenscript.codemodel.context.FileResolutionContext;
|
37
|
37
|
import org.openzen.zenscript.codemodel.context.ModuleTypeResolutionContext;
|
38
|
|
-import org.openzen.zenscript.codemodel.definition.ClassDefinition;
|
39
|
|
-import org.openzen.zenscript.codemodel.definition.EnumDefinition;
|
40
|
|
-import org.openzen.zenscript.codemodel.definition.InterfaceDefinition;
|
41
|
|
-import org.openzen.zenscript.codemodel.definition.StructDefinition;
|
42
|
|
-import org.openzen.zenscript.codemodel.definition.ZSPackage;
|
|
38
|
+import org.openzen.zenscript.codemodel.definition.*;
|
43
|
39
|
import org.openzen.zenscript.codemodel.expression.ConstantByteExpression;
|
44
|
40
|
import org.openzen.zenscript.codemodel.expression.ConstantDoubleExpression;
|
45
|
41
|
import org.openzen.zenscript.codemodel.expression.ConstantFloatExpression;
|
|
@@ -57,14 +53,7 @@ import org.openzen.zenscript.codemodel.expression.StaticGetterExpression;
|
57
|
53
|
import org.openzen.zenscript.codemodel.expression.StorageCastExpression;
|
58
|
54
|
import org.openzen.zenscript.codemodel.generic.ParameterTypeBound;
|
59
|
55
|
import org.openzen.zenscript.codemodel.generic.TypeParameter;
|
60
|
|
-import org.openzen.zenscript.codemodel.member.CasterMember;
|
61
|
|
-import org.openzen.zenscript.codemodel.member.ConstructorMember;
|
62
|
|
-import org.openzen.zenscript.codemodel.member.FieldMember;
|
63
|
|
-import org.openzen.zenscript.codemodel.member.GetterMember;
|
64
|
|
-import org.openzen.zenscript.codemodel.member.ImplementationMember;
|
65
|
|
-import org.openzen.zenscript.codemodel.member.MethodMember;
|
66
|
|
-import org.openzen.zenscript.codemodel.member.OperatorMember;
|
67
|
|
-import org.openzen.zenscript.codemodel.member.SetterMember;
|
|
56
|
+import org.openzen.zenscript.codemodel.member.*;
|
68
|
57
|
import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
|
69
|
58
|
import org.openzen.zenscript.codemodel.partial.PartialStaticMemberGroupExpression;
|
70
|
59
|
import org.openzen.zenscript.codemodel.scope.ExpressionScope;
|
|
@@ -272,7 +261,11 @@ public class JavaNativeModule {
|
272
|
261
|
private <T> HighLevelDefinition convertClass(Class<T> cls) {
|
273
|
262
|
if ((cls.getModifiers() & Modifier.PUBLIC) == 0)
|
274
|
263
|
throw new IllegalArgumentException("Class \" " + cls.getName() + "\" must be public");
|
275
|
|
-
|
|
264
|
+
|
|
265
|
+ if(cls.isAnnotationPresent(ZenCodeType.Expansion.class)) {
|
|
266
|
+ return convertExpansion(cls);
|
|
267
|
+ }
|
|
268
|
+
|
276
|
269
|
String className = cls.getName();
|
277
|
270
|
boolean isStruct = cls.isAnnotationPresent(ZenCodeType.Struct.class);
|
278
|
271
|
|
|
@@ -434,6 +427,74 @@ public class JavaNativeModule {
|
434
|
427
|
|
435
|
428
|
return definition;
|
436
|
429
|
}
|
|
430
|
+
|
|
431
|
+ private <T> ExpansionDefinition convertExpansion(Class<T> cls) {
|
|
432
|
+ if (!cls.isAnnotationPresent(ZenCodeType.Expansion.class)) {
|
|
433
|
+ throw new IllegalArgumentException("Cannot convert class " + cls + " as it does not have an Expansion annotation");
|
|
434
|
+ }
|
|
435
|
+
|
|
436
|
+ final String expandedName = cls.getAnnotation(ZenCodeType.Expansion.class).value();
|
|
437
|
+ final TypeID expandedType = getTypeFromName(expandedName);
|
|
438
|
+ if(expandedType == null)
|
|
439
|
+ throw new IllegalArgumentException("Could not find definition for name " + expandedName);
|
|
440
|
+
|
|
441
|
+ final ExpansionDefinition expansion = new ExpansionDefinition(CodePosition.NATIVE, module, pkg, Modifiers.PUBLIC, null);
|
|
442
|
+ final JavaClass javaClass = JavaClass.fromInternalName(getInternalName(cls), JavaClass.Kind.CLASS);
|
|
443
|
+ expansion.target = expandedType.stored();
|
|
444
|
+ definitionByClass.put(cls, expansion);
|
|
445
|
+
|
|
446
|
+
|
|
447
|
+ for (Method method : cls.getDeclaredMethods()) {
|
|
448
|
+ if(!Modifier.isStatic(method.getModifiers()) || method.getParameterCount() < 1) {
|
|
449
|
+ //Log?
|
|
450
|
+ continue;
|
|
451
|
+ }
|
|
452
|
+
|
|
453
|
+ if(!method.isAnnotationPresent(ZenCodeType.Method.class))
|
|
454
|
+ continue;
|
|
455
|
+
|
|
456
|
+ final ZenCodeType.Method annotation = method.getAnnotation(ZenCodeType.Method.class);
|
|
457
|
+ String name = !annotation.value().isEmpty() ? annotation.value() : method.getName();
|
|
458
|
+
|
|
459
|
+ TypeVariableContext context = new TypeVariableContext();
|
|
460
|
+
|
|
461
|
+ final Parameter[] parameters = new Parameter[method.getParameterCount() - 1];
|
|
462
|
+ System.arraycopy(method.getParameters(), 1, parameters, 0, method.getParameterCount() - 1);
|
|
463
|
+
|
|
464
|
+ FunctionHeader header = getHeader(context, method.getAnnotatedReturnType(), parameters, method.getTypeParameters(), method.getAnnotatedExceptionTypes());
|
|
465
|
+ final MethodMember member = new MethodMember(CodePosition.NATIVE, expansion, getMethodModifiers(method) ^ Modifiers.STATIC, name, header, null);
|
|
466
|
+
|
|
467
|
+ expansion.addMember(member);
|
|
468
|
+ compiled.setMethodInfo(member, JavaMethod.getStatic(javaClass, name, getMethodDescriptor(method), getMethodModifiers(method)));
|
|
469
|
+ }
|
|
470
|
+
|
|
471
|
+ if(!expansion.members.isEmpty()) {
|
|
472
|
+ compiled.setExpansionClassInfo(expansion, javaClass);
|
|
473
|
+ definitions.add(expansion);
|
|
474
|
+ }
|
|
475
|
+
|
|
476
|
+ return expansion;
|
|
477
|
+ }
|
|
478
|
+
|
|
479
|
+
|
|
480
|
+ private TypeID getTypeFromName(String className) {
|
|
481
|
+ for (TypeID value : this.typeByClass.values()) {
|
|
482
|
+ if(value.toString().equals(className))
|
|
483
|
+ return value;
|
|
484
|
+ }
|
|
485
|
+
|
|
486
|
+ final ZSPackage zsPackage = getPackage(className);
|
|
487
|
+ final String[] split = className.split("\\.");
|
|
488
|
+ final String actualName = split[split.length-1];
|
|
489
|
+
|
|
490
|
+ for (HighLevelDefinition value : this.definitionByClass.values()) {
|
|
491
|
+ if(value.name.equals(actualName) && value.pkg.equals(zsPackage))
|
|
492
|
+ return registry.getForMyDefinition(value);
|
|
493
|
+ }
|
|
494
|
+
|
|
495
|
+ return null;
|
|
496
|
+ }
|
|
497
|
+
|
437
|
498
|
|
438
|
499
|
private boolean shouldLoadType(Type type) {
|
439
|
500
|
if (type instanceof Class)
|