Browse Source

Merge remote-tracking branch 'jared/development' into development

kindlich 5 years ago
parent
commit
bff2b803c9
No known key found for this signature in database

+ 87
- 35
JavaIntegration/src/main/java/org/openzen/zencode/java/JavaNativeModule.java View File

@@ -5,19 +5,6 @@
5 5
  */
6 6
 package org.openzen.zencode.java;
7 7
 
8
-import java.io.IOException;
9
-import java.lang.reflect.AnnotatedType;
10
-import java.lang.reflect.Field;
11
-import java.lang.reflect.Method;
12
-import java.lang.reflect.Member;
13
-import java.lang.reflect.Modifier;
14
-import java.lang.reflect.Parameter;
15
-import java.lang.reflect.ParameterizedType;
16
-import java.lang.reflect.Type;
17
-import java.lang.reflect.TypeVariable;
18
-import java.util.Collections;
19
-import java.util.HashMap;
20
-import java.util.Map;
21 8
 import org.openzen.zencode.shared.CodePosition;
22 9
 import org.openzen.zencode.shared.CompileException;
23 10
 import org.openzen.zencode.shared.LiteralSourceFile;
@@ -35,7 +22,12 @@ import org.openzen.zenscript.codemodel.annotations.AnnotationDefinition;
35 22
 import org.openzen.zenscript.codemodel.context.CompilingPackage;
36 23
 import org.openzen.zenscript.codemodel.context.FileResolutionContext;
37 24
 import org.openzen.zenscript.codemodel.context.ModuleTypeResolutionContext;
38
-import org.openzen.zenscript.codemodel.definition.*;
25
+import org.openzen.zenscript.codemodel.definition.ClassDefinition;
26
+import org.openzen.zenscript.codemodel.definition.EnumDefinition;
27
+import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
28
+import org.openzen.zenscript.codemodel.definition.InterfaceDefinition;
29
+import org.openzen.zenscript.codemodel.definition.StructDefinition;
30
+import org.openzen.zenscript.codemodel.definition.ZSPackage;
39 31
 import org.openzen.zenscript.codemodel.expression.ConstantByteExpression;
40 32
 import org.openzen.zenscript.codemodel.expression.ConstantDoubleExpression;
41 33
 import org.openzen.zenscript.codemodel.expression.ConstantFloatExpression;
@@ -53,7 +45,14 @@ import org.openzen.zenscript.codemodel.expression.StaticGetterExpression;
53 45
 import org.openzen.zenscript.codemodel.expression.StorageCastExpression;
54 46
 import org.openzen.zenscript.codemodel.generic.ParameterTypeBound;
55 47
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
56
-import org.openzen.zenscript.codemodel.member.*;
48
+import org.openzen.zenscript.codemodel.member.CasterMember;
49
+import org.openzen.zenscript.codemodel.member.ConstructorMember;
50
+import org.openzen.zenscript.codemodel.member.FieldMember;
51
+import org.openzen.zenscript.codemodel.member.GetterMember;
52
+import org.openzen.zenscript.codemodel.member.ImplementationMember;
53
+import org.openzen.zenscript.codemodel.member.MethodMember;
54
+import org.openzen.zenscript.codemodel.member.OperatorMember;
55
+import org.openzen.zenscript.codemodel.member.SetterMember;
57 56
 import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
58 57
 import org.openzen.zenscript.codemodel.partial.PartialStaticMemberGroupExpression;
59 58
 import org.openzen.zenscript.codemodel.scope.ExpressionScope;
@@ -78,6 +77,20 @@ import org.openzen.zenscript.parser.BracketExpressionParser;
78 77
 import org.openzen.zenscript.parser.expression.ParsedExpression;
79 78
 import stdlib.Strings;
80 79
 
80
+import java.io.IOException;
81
+import java.lang.reflect.AnnotatedType;
82
+import java.lang.reflect.Field;
83
+import java.lang.reflect.Member;
84
+import java.lang.reflect.Method;
85
+import java.lang.reflect.Modifier;
86
+import java.lang.reflect.Parameter;
87
+import java.lang.reflect.ParameterizedType;
88
+import java.lang.reflect.Type;
89
+import java.lang.reflect.TypeVariable;
90
+import java.util.Collections;
91
+import java.util.HashMap;
92
+import java.util.Map;
93
+
81 94
 /**
82 95
  * @author Stan Hebben
83 96
  */
@@ -438,36 +451,70 @@ public class JavaNativeModule {
438 451
 		expansion.target = expandedType.stored();
439 452
 		definitionByClass.put(cls, expansion);
440 453
 
441
-
454
+        boolean addExpansion = false;
442 455
 		for (Method method : cls.getDeclaredMethods()) {
443 456
 			if(!Modifier.isStatic(method.getModifiers()) || method.getParameterCount() < 1) {
444 457
 				//Log?
445 458
 				continue;
446 459
 			}
447 460
 
448
-			if(!method.isAnnotationPresent(ZenCodeType.Method.class))
449
-				continue;
461
+//			if(!method.isAnnotationPresent(ZenCodeType.Method.class))
462
+//				continue;
450 463
 
451
-			if(!method.getParameterTypes()[0].isAssignableFrom(getClassFromType(expandedType)))
464
+            if(!method.getParameterTypes()[0].isAssignableFrom(getClassFromType(expandedType)))
452 465
 				throw new IllegalArgumentException("Cannot add extension method " + method + " as its first parameter does not match the extended type.");
453 466
 
454 467
 
455
-			final ZenCodeType.Method annotation = method.getAnnotation(ZenCodeType.Method.class);
456
-			String name = !annotation.value().isEmpty() ? annotation.value() : method.getName();
457
-
458
-			TypeVariableContext context = new TypeVariableContext();
459
-
460
-			final Parameter[] parameters = new Parameter[method.getParameterCount() - 1];
461
-			System.arraycopy(method.getParameters(), 1, parameters, 0, method.getParameterCount() - 1);
462
-
463
-			FunctionHeader header = getHeader(context, method.getAnnotatedReturnType(), parameters, method.getTypeParameters(), method.getAnnotatedExceptionTypes());
464
-			final MethodMember member = new MethodMember(CodePosition.NATIVE, expansion, getMethodModifiers(method) ^ Modifiers.STATIC, name, header, null);
465
-
466
-			expansion.addMember(member);
467
-			compiled.setMethodInfo(member, JavaMethod.getStatic(javaClass, name, getMethodDescriptor(method), getMethodModifiers(method)));
468
-		}
469
-
470
-		if(!expansion.members.isEmpty()) {
468
+			final ZenCodeType.Method methodAnnotation = method.getAnnotation(ZenCodeType.Method.class);
469
+            if(methodAnnotation != null) {
470
+                String name = !methodAnnotation.value().isEmpty() ? methodAnnotation.value() : method.getName();
471
+
472
+                TypeVariableContext context = new TypeVariableContext();
473
+
474
+                final Parameter[] parameters = getExpansionParameters(method);
475
+
476
+                FunctionHeader header = getHeader(context, method.getAnnotatedReturnType(), parameters, method.getTypeParameters(), method.getAnnotatedExceptionTypes());
477
+                final MethodMember member = new MethodMember(CodePosition.NATIVE, expansion, getMethodModifiers(method) ^ Modifiers.STATIC, name, header, null);
478
+
479
+                expansion.addMember(member);
480
+                compiled.setMethodInfo(member, JavaMethod.getStatic(javaClass, name, getMethodDescriptor(method), getMethodModifiers(method)));
481
+                addExpansion = true;
482
+            }
483
+
484
+            final ZenCodeType.Caster casterAnnotation = method.getAnnotation(ZenCodeType.Caster.class);
485
+            if(casterAnnotation != null) {
486
+                boolean implicit = casterAnnotation.implicit();
487
+                int modifiers = getMethodModifiers(method) ^ Modifiers.STATIC;
488
+                if (implicit) {
489
+                    modifiers |= Modifiers.IMPLICIT;
490
+                }
491
+                TypeVariableContext context = new TypeVariableContext();
492
+                StoredType toType = loadStoredType(context, method.getAnnotatedReturnType());
493
+                final CasterMember member = new CasterMember(CodePosition.NATIVE, expansion, modifiers, toType,  null);
494
+
495
+                expansion.addMember(member);
496
+                compiled.setMethodInfo(member, getMethod(javaClass, method, member.toType));
497
+                addExpansion = true;
498
+            }
499
+
500
+            //TODO not working, not sure if it *should* work
501
+//            final ZenCodeType.Operator operatorAnnotation = method.getAnnotation(ZenCodeType.Operator.class);
502
+//            if(operatorAnnotation != null) {
503
+//
504
+//                TypeVariableContext context = new TypeVariableContext();
505
+//
506
+//                final Parameter[] parameters = getExpansionParameters(method);
507
+//
508
+//                FunctionHeader header = getHeader(context, method.getAnnotatedReturnType(), parameters, method.getTypeParameters(), method.getAnnotatedExceptionTypes());
509
+//                final OperatorMember member = new OperatorMember(CodePosition.NATIVE, expansion, getMethodModifiers(method) ^ Modifiers.STATIC, OperatorType.valueOf(operatorAnnotation.value().toString()), header, null);
510
+//
511
+//                expansion.addMember(member);
512
+//                compiled.setMethodInfo(member, getMethod(javaClass, method, member.header.getReturnType()));
513
+//                addExpansion = true;
514
+//            }
515
+        }
516
+
517
+		if(addExpansion) {
471 518
 			compiled.setExpansionClassInfo(expansion, javaClass);
472 519
 			definitions.add(expansion);
473 520
 		}
@@ -498,6 +545,11 @@ public class JavaNativeModule {
498 545
 		throw new IllegalArgumentException("Could not find class for type " + type);
499 546
 	}
500 547
 
548
+	private Parameter[] getExpansionParameters(Method method){
549
+        final Parameter[] parameters = new Parameter[method.getParameterCount() - 1];
550
+        System.arraycopy(method.getParameters(), 1, parameters, 0, method.getParameterCount() - 1);
551
+        return parameters;
552
+    }
501 553
 
502 554
 	private TypeID getTypeFromName(String className) {
503 555
 		for (TypeID value : this.typeByClass.values()) {

Loading…
Cancel
Save