Browse Source

Allow the use of default expressions in Optional annotation

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

+ 3
- 1
JavaAnnotations/src/main/java/org/openzen/zencode/java/ZenCodeType.java View File

97
 	
97
 	
98
 	@Retention(RetentionPolicy.RUNTIME)
98
 	@Retention(RetentionPolicy.RUNTIME)
99
 	@Target(ElementType.PARAMETER)
99
 	@Target(ElementType.PARAMETER)
100
-	@interface Optional {}
100
+	@interface Optional {
101
+		String value() default "null";
102
+	}
101
 	
103
 	
102
 	@Retention(RetentionPolicy.RUNTIME)
104
 	@Retention(RetentionPolicy.RUNTIME)
103
 	@Target(ElementType.PARAMETER)
105
 	@Target(ElementType.PARAMETER)

+ 113
- 23
JavaIntegration/src/main/java/org/openzen/zencode/java/JavaNativeModule.java View File

5
  */
5
  */
6
 package org.openzen.zencode.java;
6
 package org.openzen.zencode.java;
7
 
7
 
8
-import org.openzen.zencode.shared.*;
9
-import org.openzen.zenscript.codemodel.*;
10
-import org.openzen.zenscript.codemodel.definition.*;
11
-import org.openzen.zenscript.codemodel.expression.*;
12
-import org.openzen.zenscript.codemodel.generic.*;
13
-import org.openzen.zenscript.codemodel.member.*;
14
-import org.openzen.zenscript.codemodel.member.ref.*;
15
-import org.openzen.zenscript.codemodel.partial.*;
16
-import org.openzen.zenscript.codemodel.type.*;
17
-import org.openzen.zenscript.codemodel.type.member.*;
18
-import org.openzen.zenscript.codemodel.type.storage.*;
19
-import org.openzen.zenscript.javashared.*;
20
-import stdlib.*;
21
-
22
-import java.lang.reflect.*;
23
-import java.util.*;
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
+import org.openzen.zencode.shared.CodePosition;
22
+import org.openzen.zencode.shared.CompileException;
23
+import org.openzen.zencode.shared.LiteralSourceFile;
24
+import org.openzen.zenscript.codemodel.FunctionHeader;
25
+import org.openzen.zenscript.codemodel.FunctionParameter;
26
+import org.openzen.zenscript.codemodel.GenericMapper;
27
+import org.openzen.zenscript.codemodel.HighLevelDefinition;
28
+import org.openzen.zenscript.codemodel.Modifiers;
29
+import org.openzen.zenscript.codemodel.Module;
30
+import org.openzen.zenscript.codemodel.ModuleSpace;
31
+import org.openzen.zenscript.codemodel.OperatorType;
32
+import org.openzen.zenscript.codemodel.PackageDefinitions;
33
+import org.openzen.zenscript.codemodel.SemanticModule;
34
+import org.openzen.zenscript.codemodel.annotations.AnnotationDefinition;
35
+import org.openzen.zenscript.codemodel.context.CompilingPackage;
36
+import org.openzen.zenscript.codemodel.context.FileResolutionContext;
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;
43
+import org.openzen.zenscript.codemodel.expression.ConstantByteExpression;
44
+import org.openzen.zenscript.codemodel.expression.ConstantDoubleExpression;
45
+import org.openzen.zenscript.codemodel.expression.ConstantFloatExpression;
46
+import org.openzen.zenscript.codemodel.expression.ConstantIntExpression;
47
+import org.openzen.zenscript.codemodel.expression.ConstantLongExpression;
48
+import org.openzen.zenscript.codemodel.expression.ConstantSByteExpression;
49
+import org.openzen.zenscript.codemodel.expression.ConstantShortExpression;
50
+import org.openzen.zenscript.codemodel.expression.ConstantStringExpression;
51
+import org.openzen.zenscript.codemodel.expression.ConstantUIntExpression;
52
+import org.openzen.zenscript.codemodel.expression.ConstantULongExpression;
53
+import org.openzen.zenscript.codemodel.expression.ConstantUShortExpression;
54
+import org.openzen.zenscript.codemodel.expression.Expression;
55
+import org.openzen.zenscript.codemodel.expression.ExpressionSymbol;
56
+import org.openzen.zenscript.codemodel.expression.StaticGetterExpression;
57
+import org.openzen.zenscript.codemodel.expression.StorageCastExpression;
58
+import org.openzen.zenscript.codemodel.generic.ParameterTypeBound;
59
+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;
68
+import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
69
+import org.openzen.zenscript.codemodel.partial.PartialStaticMemberGroupExpression;
70
+import org.openzen.zenscript.codemodel.scope.ExpressionScope;
71
+import org.openzen.zenscript.codemodel.scope.FileScope;
72
+import org.openzen.zenscript.codemodel.type.BasicTypeID;
73
+import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
74
+import org.openzen.zenscript.codemodel.type.ISymbol;
75
+import org.openzen.zenscript.codemodel.type.StoredType;
76
+import org.openzen.zenscript.codemodel.type.StringTypeID;
77
+import org.openzen.zenscript.codemodel.type.TypeID;
78
+import org.openzen.zenscript.codemodel.type.member.BuiltinID;
79
+import org.openzen.zenscript.codemodel.type.member.TypeMembers;
80
+import org.openzen.zenscript.codemodel.type.storage.AutoStorageTag;
81
+import org.openzen.zenscript.codemodel.type.storage.StaticStorageTag;
82
+import org.openzen.zenscript.codemodel.type.storage.StorageTag;
83
+import org.openzen.zenscript.codemodel.type.storage.StorageType;
84
+import org.openzen.zenscript.javashared.JavaClass;
85
+import org.openzen.zenscript.javashared.JavaCompiledModule;
86
+import org.openzen.zenscript.javashared.JavaField;
87
+import org.openzen.zenscript.javashared.JavaFunctionalInterfaceStorageTag;
88
+import org.openzen.zenscript.javashared.JavaImplementation;
89
+import org.openzen.zenscript.javashared.JavaMethod;
90
+import org.openzen.zenscript.javashared.JavaModifiers;
91
+import org.openzen.zenscript.lexer.ParseException;
92
+import org.openzen.zenscript.lexer.ZSTokenParser;
93
+import org.openzen.zenscript.parser.BracketExpressionParser;
94
+import org.openzen.zenscript.parser.expression.ParsedExpression;
95
+import stdlib.Strings;
24
 
96
 
25
 /**
97
 /**
26
  * @author Stan Hebben
98
  * @author Stan Hebben
38
 	private final Map<Class<?>, TypeID> unsignedByClass = new HashMap<>();
110
 	private final Map<Class<?>, TypeID> unsignedByClass = new HashMap<>();
39
 	
111
 	
40
 	public final Map<String, ISymbol> globals = new HashMap<>();
112
 	public final Map<String, ISymbol> globals = new HashMap<>();
41
-	
113
+	private BracketExpressionParser bep;
114
+
42
 	public JavaNativeModule(
115
 	public JavaNativeModule(
43
 			ZSPackage pkg,
116
 			ZSPackage pkg,
44
 			String name,
117
 			String name,
480
 				method.getAnnotatedExceptionTypes());
553
 				method.getAnnotatedExceptionTypes());
481
 	}
554
 	}
482
 	
555
 	
483
-	private Expression getDefaultValue(Parameter parameter, StoredType type) {
556
+	protected Expression getDefaultValue(Parameter parameter, StoredType type) {
484
 		if (parameter.isAnnotationPresent(ZenCodeType.Optional.class)) {
557
 		if (parameter.isAnnotationPresent(ZenCodeType.Optional.class)) {
485
-			Expression defaultValue = type.type.getDefaultValue();
486
-			if (defaultValue == null)
487
-			    defaultValue = new NullExpression(CodePosition.NATIVE);
488
-			return defaultValue;
558
+				final String s = parameter.getAnnotation(ZenCodeType.Optional.class).value();
559
+				try {
560
+					final String filename = "internal: " + parameter.getDeclaringExecutable().getName();
561
+
562
+					final CompilingPackage rootCompiling = new CompilingPackage(pkg, module);
563
+					final ModuleTypeResolutionContext context = new ModuleTypeResolutionContext(registry, new AnnotationDefinition[0], StorageType.getStandard(), pkg, rootCompiling, globals);
564
+					final FileResolutionContext fContext = new FileResolutionContext(context, pkg, rootCompiling);
565
+					final FileScope fileScope = new FileScope(fContext, Collections.emptyList(), globals, member -> {});
566
+					final ZSTokenParser tokens = ZSTokenParser.create(new LiteralSourceFile(filename, s), bep, 4);
567
+
568
+					return ParsedExpression.parse(tokens).compile(new ExpressionScope(fileScope)).eval().castExplicit(CodePosition.GENERATED, fileScope, type, type.isOptional());
569
+				} catch (IOException | ParseException | CompileException ex) {
570
+					//TODO REMOVE
571
+					ex.printStackTrace();
572
+					return null;
573
+				}
574
+			//}
489
 		} else if (parameter.isAnnotationPresent(ZenCodeType.OptionalInt.class)) {
575
 		} else if (parameter.isAnnotationPresent(ZenCodeType.OptionalInt.class)) {
490
 			ZenCodeType.OptionalInt annotation = parameter.getAnnotation(ZenCodeType.OptionalInt.class);
576
 			ZenCodeType.OptionalInt annotation = parameter.getAnnotation(ZenCodeType.OptionalInt.class);
491
 			if (type.type == BasicTypeID.BYTE)
577
 			if (type.type == BasicTypeID.BYTE)
747
 		
833
 		
748
 		return new JavaMethod(cls, kind, method.getName(), false, getMethodDescriptor(method), method.getModifiers(), result.isGeneric());
834
 		return new JavaMethod(cls, kind, method.getName(), false, getMethodDescriptor(method), method.getModifiers(), result.isGeneric());
749
 	}
835
 	}
750
-	
836
+
837
+	public void registerBEP(BracketExpressionParser bep) {
838
+		this.bep = bep;
839
+	}
840
+
751
 	private static class TypeVariableContext {
841
 	private static class TypeVariableContext {
752
 		private final Map<TypeVariable, TypeParameter> typeVariables = new HashMap<>();
842
 		private final Map<TypeVariable, TypeParameter> typeVariables = new HashMap<>();
753
 		
843
 		

Loading…
Cancel
Save