Browse Source

First step towards ZenExpansions

They worked in my simple, void test example
kindlich 5 years ago
parent
commit
b1a2691cbf
No known key found for this signature in database

+ 75
- 14
JavaIntegration/src/main/java/org/openzen/zencode/java/JavaNativeModule.java View File

@@ -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)

Loading…
Cancel
Save