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