Sfoglia il codice sorgente

- Fixed numerous issues with undetermined types, type inference, type aliases, inner types and generic types

- Distinguished between type resolution and code compilation stages, both have a different context now
- Added new concepts: "compiling type" and "compiling package", which is able to precompile correctly now
- Rewrote the way precompilation works; precompilation no longer exists, instead, compilation order of methods is changed. This reduces the amount of code needed and improves quality of the system.
- Fixed members of base interfaces not being available to implementation code
- Changed the way type modifiers are coded
Stan Hebben 6 anni fa
parent
commit
7bf2e9bfae
100 ha cambiato i file con 1352 aggiunte e 797 eliminazioni
  1. 3
    4
      CodeFormatter/src/main/java/org/openzen/zenscript/formatter/TypeFormatter.java
  2. 12
    6
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/FunctionHeader.java
  3. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/FunctionParameter.java
  4. 3
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/GenericMapper.java
  5. 13
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/HighLevelDefinition.java
  6. 6
    20
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/AnnotationProcessor.java
  7. 83
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/CompilingPackage.java
  8. 34
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/CompilingType.java
  9. 61
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/FileResolutionContext.java
  10. 65
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/LocalTypeResolutionContext.java
  11. 75
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/ModuleTypeResolutionContext.java
  12. 27
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/TypeResolutionContext.java
  13. 3
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/definition/AliasDefinition.java
  14. 2
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/definition/FunctionDefinition.java
  15. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/definition/InterfaceDefinition.java
  16. 10
    17
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/definition/ZSPackage.java
  17. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CheckNullExpression.java
  18. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CompareExpression.java
  19. 2
    2
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstructorSuperCallExpression.java
  20. 6
    3
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstructorThisCallExpression.java
  21. 3
    3
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/Expression.java
  22. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ExpressionBuilder.java
  23. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/GetFieldExpression.java
  24. 2
    2
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/GetStaticFieldExpression.java
  25. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/GetterExpression.java
  26. 2
    2
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/NewExpression.java
  27. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/SetFieldExpression.java
  28. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/SetStaticFieldExpression.java
  29. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/SetterExpression.java
  30. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/StaticGetterExpression.java
  31. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/StaticSetterExpression.java
  32. 3
    5
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ConstMember.java
  33. 4
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/DefinitionMember.java
  34. 6
    13
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/FieldMember.java
  35. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/FunctionalMember.java
  36. 8
    4
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/GetterMember.java
  37. 31
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/IPropertyMember.java
  38. 1
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/InnerDefinitionMember.java
  39. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/MethodMember.java
  40. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/OperatorMember.java
  41. 32
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/PropertyMember.java
  42. 17
    3
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/SetterMember.java
  43. 3
    45
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/ConstMemberRef.java
  44. 4
    41
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/FieldMemberRef.java
  45. 30
    8
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/FunctionalMemberRef.java
  46. 5
    34
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/GetterMemberRef.java
  47. 82
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/PropertyRef.java
  48. 5
    37
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/SetterMemberRef.java
  49. 3
    2
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/TranslatedOperatorMemberRef.java
  50. 29
    8
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/partial/PartialMemberGroupExpression.java
  51. 10
    8
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/partial/PartialStaticMemberGroupExpression.java
  52. 3
    3
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/partial/PartialTypeExpression.java
  53. 1
    4
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/scope/BaseScope.java
  54. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/scope/BlockScope.java
  55. 97
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/scope/CompileTypeScope.java
  56. 7
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/scope/DefinitionScope.java
  57. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/scope/ExpressionScope.java
  58. 30
    64
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/scope/FileScope.java
  59. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/scope/ForeachScope.java
  60. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/scope/FunctionScope.java
  61. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/scope/GenericFunctionScope.java
  62. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/scope/GlobalScriptScope.java
  63. 10
    4
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/scope/ImplementationScope.java
  64. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/scope/LambdaScope.java
  65. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/scope/LoopScope.java
  66. 1
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/scope/StatementScope.java
  67. 5
    3
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/scope/TypeScope.java
  68. 25
    53
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/DefinitionTypeID.java
  69. 13
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/GenericName.java
  70. 1
    4
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/GlobalTypeRegistry.java
  71. 4
    2
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/ISymbol.java
  72. 18
    6
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/ITypeID.java
  73. 38
    9
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/ModifiedTypeID.java
  74. 6
    4
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/TypeSymbol.java
  75. 40
    24
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/member/DefinitionMemberGroup.java
  76. 11
    4
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/member/TypeMemberBuilder.java
  77. 16
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/member/TypeMemberPreparer.java
  78. 19
    27
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/member/TypeMembers.java
  79. 19
    1
      CompilerShared/src/main/java/org/openzen/zenscript/compiler/CompileScope.java
  80. 6
    4
      CompilerShared/src/main/java/org/openzen/zenscript/compiler/SemanticModule.java
  81. 26
    24
      Constructor/src/main/java/org/openzen/zenscript/constructor/Module.java
  82. 7
    4
      Constructor/src/main/java/org/openzen/zenscript/constructor/module/DirectoryModuleReference.java
  83. 10
    9
      Constructor/src/main/java/org/openzen/zenscript/constructor/module/ModuleSpace.java
  84. 8
    5
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaExpressionVisitor.java
  85. 1
    1
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/definitions/JavaMemberVisitor.java
  86. 1
    0
      Parser/src/main/java/org/openzen/zenscript/lexer/ZSTokenType.java
  87. 11
    12
      Parser/src/main/java/org/openzen/zenscript/parser/ParsedDefinition.java
  88. 40
    46
      Parser/src/main/java/org/openzen/zenscript/parser/ParsedFile.java
  89. 8
    4
      Parser/src/main/java/org/openzen/zenscript/parser/PrecompilationState.java
  90. 2
    7
      Parser/src/main/java/org/openzen/zenscript/parser/SimpleBracketSubParser.java
  91. 36
    41
      Parser/src/main/java/org/openzen/zenscript/parser/definitions/BaseParsedDefinition.java
  92. 24
    95
      Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedAlias.java
  93. 4
    6
      Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedClass.java
  94. 6
    5
      Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedEnum.java
  95. 7
    3
      Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedExpansion.java
  96. 18
    20
      Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedFunction.java
  97. 8
    8
      Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedFunctionHeader.java
  98. 15
    5
      Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedFunctionParameter.java
  99. 2
    2
      Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedGenericBound.java
  100. 0
    0
      Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedInterface.java

+ 3
- 4
CodeFormatter/src/main/java/org/openzen/zenscript/formatter/TypeFormatter.java Vedi File

@@ -22,7 +22,6 @@ import org.openzen.zenscript.codemodel.type.ITypeID;
22 22
 import org.openzen.zenscript.codemodel.type.ITypeVisitor;
23 23
 import org.openzen.zenscript.codemodel.type.IteratorTypeID;
24 24
 import org.openzen.zenscript.codemodel.type.RangeTypeID;
25
-import org.openzen.zenscript.codemodel.type.member.TypeMembers;
26 25
 import stdlib.Chars;
27 26
 
28 27
 /**
@@ -104,12 +103,12 @@ public class TypeFormatter implements ITypeVisitor<String>, GenericParameterBoun
104 103
 	@Override
105 104
 	public String visitModified(ModifiedTypeID type) {
106 105
 		StringBuilder result = new StringBuilder();
107
-		if ((type.modifiers & TypeMembers.MODIFIER_CONST) > 0)
106
+		if (type.isConst())
108 107
 			result.append("const ");
109
-		if ((type.modifiers & TypeMembers.MODIFIER_IMMUTABLE) > 0)
108
+		if (type.isImmutable())
110 109
 			result.append("immutable ");
111 110
 		result.append(type.accept(this));
112
-		if ((type.modifiers & TypeMembers.MODIFIER_OPTIONAL) > 0)
111
+		if (type.isOptional())
113 112
 			result.append("?");
114 113
 		
115 114
 		return result.toString();

+ 12
- 6
CodeModel/src/main/java/org/openzen/zenscript/codemodel/FunctionHeader.java Vedi File

@@ -27,7 +27,7 @@ public class FunctionHeader {
27 27
 	private static final FunctionParameter[] NO_PARAMETERS = new FunctionParameter[0];
28 28
 	
29 29
 	public final TypeParameter[] typeParameters;
30
-	public final ITypeID returnType;
30
+	public ITypeID returnType;
31 31
 	public final FunctionParameter[] parameters;
32 32
 	public final ITypeID thrownType;
33 33
 	
@@ -63,7 +63,7 @@ public class FunctionHeader {
63 63
 		
64 64
 		minParameters = parameterTypes.length;
65 65
 		maxParameters = parameterTypes.length;
66
-		hasUnknowns = hasUnknowns(parameterTypes);
66
+		hasUnknowns = hasUnknowns(parameterTypes, returnType);
67 67
 	}
68 68
 	
69 69
 	public FunctionHeader(ITypeID returnType, FunctionParameter... parameters) {
@@ -77,7 +77,7 @@ public class FunctionHeader {
77 77
 		
78 78
 		minParameters = getMinParameters(parameters);
79 79
 		maxParameters = getMaxParameters(parameters);
80
-		hasUnknowns = hasUnknowns(parameters);
80
+		hasUnknowns = hasUnknowns(parameters, returnType);
81 81
 	}
82 82
 	
83 83
 	public FunctionHeader(TypeParameter[] genericParameters, ITypeID returnType, ITypeID thrownType, FunctionParameter... parameters) {
@@ -93,7 +93,7 @@ public class FunctionHeader {
93 93
 		
94 94
 		minParameters = getMinParameters(parameters);
95 95
 		maxParameters = getMaxParameters(parameters);
96
-		hasUnknowns = hasUnknowns(parameters);
96
+		hasUnknowns = hasUnknowns(parameters, returnType);
97 97
 	}
98 98
 	
99 99
 	public boolean isDenormalized() {
@@ -430,7 +430,10 @@ public class FunctionHeader {
430 430
 		return parameters[parameters.length - 1].variadic ? Integer.MAX_VALUE : parameters.length;
431 431
 	}
432 432
 	
433
-	private static boolean hasUnknowns(ITypeID[] types) {
433
+	private static boolean hasUnknowns(ITypeID[] types, ITypeID returnType) {
434
+		if (returnType == BasicTypeID.UNDETERMINED)
435
+			return true;
436
+		
434 437
 		for (ITypeID type : types)
435 438
 			if (type == BasicTypeID.UNDETERMINED)
436 439
 				return true;
@@ -438,7 +441,10 @@ public class FunctionHeader {
438 441
 		return false;
439 442
 	}
440 443
 	
441
-	private static boolean hasUnknowns(FunctionParameter[] parameters) {
444
+	private static boolean hasUnknowns(FunctionParameter[] parameters, ITypeID returnType) {
445
+		if (returnType == BasicTypeID.UNDETERMINED)
446
+			return true;
447
+		
442 448
 		for (FunctionParameter parameter : parameters)
443 449
 			if (parameter.type == BasicTypeID.UNDETERMINED)
444 450
 				return true;

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/FunctionParameter.java Vedi File

@@ -22,7 +22,7 @@ public class FunctionParameter extends Taggable {
22 22
 	public Annotation[] annotations;
23 23
 	public final ITypeID type;
24 24
 	public final String name;
25
-	public final Expression defaultValue;
25
+	public Expression defaultValue;
26 26
 	public final boolean variadic;
27 27
 	
28 28
 	public FunctionParameter(ITypeID type) {

+ 3
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/GenericMapper.java Vedi File

@@ -5,6 +5,7 @@
5 5
  */
6 6
 package org.openzen.zenscript.codemodel;
7 7
 
8
+import java.util.Collections;
8 9
 import java.util.Map;
9 10
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
10 11
 import org.openzen.zenscript.codemodel.type.GenericTypeID;
@@ -16,6 +17,8 @@ import org.openzen.zenscript.codemodel.type.ITypeID;
16 17
  * @author Hoofdgebruiker
17 18
  */
18 19
 public class GenericMapper {
20
+	public static final GenericMapper EMPTY = new GenericMapper(null, Collections.emptyMap());
21
+	
19 22
 	public final GlobalTypeRegistry registry;
20 23
 	private final Map<TypeParameter, ITypeID> mapping;
21 24
 	

+ 13
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/HighLevelDefinition.java Vedi File

@@ -20,6 +20,7 @@ import org.openzen.zenscript.codemodel.member.DestructorMember;
20 20
 import org.openzen.zenscript.codemodel.member.FieldMember;
21 21
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
22 22
 import org.openzen.zenscript.codemodel.member.ImplementationMember;
23
+import org.openzen.zenscript.codemodel.member.InnerDefinitionMember;
23 24
 import org.openzen.zenscript.codemodel.scope.TypeScope;
24 25
 import org.openzen.zenscript.codemodel.type.ITypeID;
25 26
 
@@ -146,4 +147,16 @@ public abstract class HighLevelDefinition extends Taggable {
146 147
 	}
147 148
 	
148 149
 	public abstract <T> T accept(DefinitionVisitor<T> visitor);
150
+
151
+	public HighLevelDefinition getInnerType(String name) {
152
+		for (IDefinitionMember member : members) {
153
+			if (member instanceof InnerDefinitionMember) {
154
+				InnerDefinitionMember inner = (InnerDefinitionMember)member;
155
+				if (inner.innerDefinition.name.equals(name))
156
+					return inner.innerDefinition;
157
+			}
158
+		}
159
+		
160
+		return null;
161
+	}
149 162
 }

+ 6
- 20
CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/AnnotationProcessor.java Vedi File

@@ -11,10 +11,9 @@ import java.util.List;
11 11
 import org.openzen.zenscript.codemodel.FunctionHeader;
12 12
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
13 13
 import org.openzen.zenscript.codemodel.ModuleProcessor;
14
-import org.openzen.zenscript.codemodel.PackageDefinitions;
15 14
 import org.openzen.zenscript.codemodel.ScriptBlock;
15
+import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
16 16
 import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
17
-import org.openzen.zenscript.codemodel.definition.ZSPackage;
18 17
 import org.openzen.zenscript.codemodel.member.CallerMember;
19 18
 import org.openzen.zenscript.codemodel.member.CasterMember;
20 19
 import org.openzen.zenscript.codemodel.member.ConstMember;
@@ -33,7 +32,6 @@ import org.openzen.zenscript.codemodel.member.OperatorMember;
33 32
 import org.openzen.zenscript.codemodel.member.SetterMember;
34 33
 import org.openzen.zenscript.codemodel.member.StaticInitializerMember;
35 34
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
36
-import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
37 35
 import org.openzen.zenscript.codemodel.scope.DefinitionScope;
38 36
 import org.openzen.zenscript.codemodel.scope.FileScope;
39 37
 import org.openzen.zenscript.codemodel.scope.FunctionScope;
@@ -41,35 +39,23 @@ import org.openzen.zenscript.codemodel.scope.GlobalScriptScope;
41 39
 import org.openzen.zenscript.codemodel.scope.StatementScope;
42 40
 import org.openzen.zenscript.codemodel.statement.Statement;
43 41
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
44
-import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
45 42
 
46 43
 /**
47 44
  *
48 45
  * @author Hoofdgebruiker
49 46
  */
50 47
 public class AnnotationProcessor implements ModuleProcessor {
51
-	private final ZSPackage rootPackage;
52
-	private final PackageDefinitions packageDefinitions;
53
-	private final GlobalTypeRegistry globalRegistry;
48
+	private final TypeResolutionContext context;
54 49
 	private final List<ExpansionDefinition> expansions;
55
-	private final List<AnnotationDefinition> annotations;
56 50
 	
57
-	public AnnotationProcessor(
58
-			ZSPackage rootPackage,
59
-			PackageDefinitions packageDefinitions,
60
-			GlobalTypeRegistry globalRegistry,
61
-			List<ExpansionDefinition> expansions,
62
-			List<AnnotationDefinition> annotations) {
63
-		this.rootPackage = rootPackage;
64
-		this.packageDefinitions = packageDefinitions;
65
-		this.globalRegistry = globalRegistry;
51
+	public AnnotationProcessor(TypeResolutionContext context, List<ExpansionDefinition> expansions) {
52
+		this.context = context;
66 53
 		this.expansions = expansions;
67
-		this.annotations = annotations;
68 54
 	}
69 55
 	
70 56
 	@Override
71 57
 	public ScriptBlock process(ScriptBlock block) {
72
-		FileScope fileScope = new FileScope(rootPackage, packageDefinitions, globalRegistry, expansions, new HashMap<>(), annotations);
58
+		FileScope fileScope = new FileScope(context, expansions, new HashMap<>(), member -> {});
73 59
 		StatementScope scope = new GlobalScriptScope(fileScope);
74 60
 		List<Statement> transformed = new ArrayList<>();
75 61
 		boolean unchanged = true;
@@ -83,7 +69,7 @@ public class AnnotationProcessor implements ModuleProcessor {
83 69
 	
84 70
 	@Override
85 71
 	public void process(HighLevelDefinition definition) {
86
-		FileScope fileScope = new FileScope(rootPackage, packageDefinitions, globalRegistry, expansions, new HashMap<>(), annotations);
72
+		FileScope fileScope = new FileScope(context, expansions, new HashMap<>(), member -> {});
87 73
 		DefinitionScope scope = new DefinitionScope(fileScope, definition);
88 74
 		for (DefinitionAnnotation annotation : definition.annotations) {
89 75
 			annotation.apply(definition, scope);

+ 83
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/CompilingPackage.java Vedi File

@@ -0,0 +1,83 @@
1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.codemodel.context;
7
+
8
+import java.util.HashMap;
9
+import java.util.List;
10
+import java.util.Map;
11
+import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
+import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
13
+import org.openzen.zenscript.codemodel.type.GenericName;
14
+import org.openzen.zenscript.codemodel.type.ITypeID;
15
+
16
+/**
17
+ *
18
+ * @author Hoofdgebruiker
19
+ */
20
+public class CompilingPackage {
21
+	private final Map<String, CompilingPackage> packages = new HashMap<>();
22
+	private final Map<String, CompilingType> types = new HashMap<>();
23
+	
24
+	public void addPackage(String name, CompilingPackage package_) {
25
+		packages.put(name, package_);
26
+	}
27
+	
28
+	public void addType(String name, CompilingType type) {
29
+		types.put(name, type);
30
+	}
31
+	
32
+	public HighLevelDefinition getImport(TypeResolutionContext context, List<String> name) {
33
+		return getImport(context, name, 0);
34
+	}
35
+	
36
+	private HighLevelDefinition getImport(TypeResolutionContext context, List<String> name, int index) {
37
+		if (packages.containsKey(name.get(index)))
38
+			return packages.get(name.get(index)).getImport(context, name, index + 1);
39
+		if (types.containsKey(name.get(index)))
40
+			return getImportType(context, types.get(name.get(index)), name, index + 1);
41
+		
42
+		return null;
43
+	}
44
+	
45
+	private HighLevelDefinition getImportType(TypeResolutionContext context, CompilingType type, List<String> name, int index) {
46
+		if (index == name.size())
47
+			return type.load(context);
48
+		
49
+		return getImportType(context, type.getInner(name.get(index)), name, index + 1);
50
+	}
51
+	
52
+	public ITypeID getType(TypeResolutionContext context, List<GenericName> name) {
53
+		return getType(context, name, 0);
54
+	}
55
+	
56
+	private ITypeID getType(TypeResolutionContext context, List<GenericName> name, int index) {
57
+		if (index == name.size())
58
+			return null;
59
+		
60
+		if (packages.containsKey(name.get(index).name))
61
+			return packages.get(name.get(index)).getType(context, name, index + 1);
62
+		
63
+		if (types.containsKey(name.get(index).name)) {
64
+			CompilingType type = types.get(name.get(index).name);
65
+			DefinitionTypeID result = context.getTypeRegistry().getForDefinition(type.load(context), name.get(index).arguments);
66
+			return getInner(context, name, index + 1, type, result);
67
+		}
68
+		
69
+		return null;
70
+	}
71
+	
72
+	private ITypeID getInner(TypeResolutionContext context, List<GenericName> name, int index, CompilingType type, DefinitionTypeID result) {
73
+		if (index == name.size())
74
+			return result;
75
+		
76
+		CompilingType innerType = type.getInner(name.get(index).name);
77
+		if (innerType == null)
78
+			return null;
79
+		
80
+		DefinitionTypeID innerResult = context.getTypeRegistry().getForDefinition(innerType.load(context), name.get(index).arguments, result);
81
+		return getInner(context, name, index + 1, innerType, innerResult);
82
+	}
83
+}

+ 34
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/CompilingType.java Vedi File

@@ -0,0 +1,34 @@
1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.codemodel.context;
7
+
8
+import java.util.List;
9
+import org.openzen.zenscript.codemodel.HighLevelDefinition;
10
+import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
11
+import org.openzen.zenscript.codemodel.type.GenericName;
12
+
13
+/**
14
+ *
15
+ * @author Hoofdgebruiker
16
+ */
17
+public interface CompilingType {
18
+	CompilingType getInner(String name);
19
+	
20
+	HighLevelDefinition load(TypeResolutionContext context);
21
+	
22
+	default DefinitionTypeID getInnerType(TypeResolutionContext context, List<GenericName> name, int index, DefinitionTypeID outer) {
23
+		DefinitionTypeID type = context.getTypeRegistry().getForDefinition(load(context), name.get(index).arguments, outer);
24
+		index++;
25
+		if (index == name.size())
26
+			return type;
27
+		
28
+		CompilingType innerType = getInner(name.get(index).name);
29
+		if (innerType == null)
30
+			return null;
31
+		
32
+		return innerType.getInnerType(context, name, index, type);
33
+	}
34
+}

+ 61
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/FileResolutionContext.java Vedi File

@@ -0,0 +1,61 @@
1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.codemodel.context;
7
+
8
+import java.util.HashMap;
9
+import java.util.List;
10
+import java.util.Map;
11
+import org.openzen.zencode.shared.CodePosition;
12
+import org.openzen.zenscript.codemodel.HighLevelDefinition;
13
+import org.openzen.zenscript.codemodel.annotations.AnnotationDefinition;
14
+import org.openzen.zenscript.codemodel.type.GenericName;
15
+import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
16
+import org.openzen.zenscript.codemodel.type.ITypeID;
17
+
18
+/**
19
+ *
20
+ * @author Hoofdgebruiker
21
+ */
22
+public class FileResolutionContext implements TypeResolutionContext {
23
+	private final ModuleTypeResolutionContext module;
24
+	private final Map<String, HighLevelDefinition> imports = new HashMap<>();
25
+	
26
+	public FileResolutionContext(ModuleTypeResolutionContext module) {
27
+		this.module = module;
28
+	}
29
+	
30
+	public void addImport(String name, HighLevelDefinition definition) {
31
+		imports.put(name, definition);
32
+	}
33
+
34
+	@Override
35
+	public GlobalTypeRegistry getTypeRegistry() {
36
+		return module.getTypeRegistry();
37
+	}
38
+
39
+	@Override
40
+	public AnnotationDefinition getAnnotation(String name) {
41
+		return module.getAnnotation(name);
42
+	}
43
+
44
+	@Override
45
+	public ITypeID getType(CodePosition position, List<GenericName> name) {
46
+		if (imports.containsKey(name.get(0).name)) {
47
+			return GenericName.getInnerType(
48
+					getTypeRegistry(),
49
+					getTypeRegistry().getForDefinition(imports.get(name.get(0).name), name.get(0).arguments),
50
+					name,
51
+					1);
52
+		}
53
+		
54
+		return module.getType(position, name);
55
+	}
56
+
57
+	@Override
58
+	public ITypeID getThisType() {
59
+		return null;
60
+	}
61
+}

+ 65
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/LocalTypeResolutionContext.java Vedi File

@@ -0,0 +1,65 @@
1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.codemodel.context;
7
+
8
+import java.util.List;
9
+import org.openzen.zencode.shared.CodePosition;
10
+import org.openzen.zenscript.codemodel.annotations.AnnotationDefinition;
11
+import org.openzen.zenscript.codemodel.generic.TypeParameter;
12
+import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
13
+import org.openzen.zenscript.codemodel.type.GenericName;
14
+import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
15
+import org.openzen.zenscript.codemodel.type.ITypeID;
16
+
17
+/**
18
+ *
19
+ * @author Hoofdgebruiker
20
+ */
21
+public class LocalTypeResolutionContext implements TypeResolutionContext {
22
+	private final TypeResolutionContext outer;
23
+	private final CompilingType type;
24
+	private final TypeParameter[] parameters;
25
+	
26
+	public LocalTypeResolutionContext(TypeResolutionContext outer, CompilingType type, TypeParameter[] parameters) {
27
+		this.outer = outer;
28
+		this.type = type;
29
+		this.parameters = parameters;
30
+	}
31
+
32
+	@Override
33
+	public GlobalTypeRegistry getTypeRegistry() {
34
+		return outer.getTypeRegistry();
35
+	}
36
+
37
+	@Override
38
+	public AnnotationDefinition getAnnotation(String name) {
39
+		return outer.getAnnotation(name);
40
+	}
41
+
42
+	@Override
43
+	public ITypeID getType(CodePosition position, List<GenericName> name) {
44
+		if (type != null) {
45
+			CompilingType compiling = type.getInner(name.get(0).name);
46
+			if (compiling != null) {
47
+				DefinitionTypeID outer = getTypeRegistry().getForMyDefinition(type.load(this));
48
+				return compiling.getInnerType(this, name, 0, outer);
49
+			}
50
+		}
51
+		
52
+		if (name.size() == 1 && name.get(0).hasNoArguments()) {
53
+			for (TypeParameter parameter : parameters)
54
+				if (parameter.name.equals(name.get(0).name))
55
+					return getTypeRegistry().getGeneric(parameter);
56
+		}
57
+		
58
+		return outer.getType(position, name);
59
+	}
60
+	
61
+	@Override
62
+	public ITypeID getThisType() {
63
+		return type == null ? null : getTypeRegistry().getForMyDefinition(type.load(this));
64
+	}
65
+}

+ 75
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/ModuleTypeResolutionContext.java Vedi File

@@ -0,0 +1,75 @@
1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.codemodel.context;
7
+
8
+import java.util.HashMap;
9
+import java.util.List;
10
+import java.util.Map;
11
+import org.openzen.zencode.shared.CodePosition;
12
+import org.openzen.zenscript.codemodel.annotations.AnnotationDefinition;
13
+import org.openzen.zenscript.codemodel.definition.ZSPackage;
14
+import org.openzen.zenscript.codemodel.type.GenericName;
15
+import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
16
+import org.openzen.zenscript.codemodel.type.ISymbol;
17
+import org.openzen.zenscript.codemodel.type.ITypeID;
18
+
19
+/**
20
+ *
21
+ * @author Hoofdgebruiker
22
+ */
23
+public class ModuleTypeResolutionContext implements TypeResolutionContext {
24
+	private final GlobalTypeRegistry registry;
25
+	private final Map<String, AnnotationDefinition> annotations = new HashMap<>();
26
+	private final Map<String, ISymbol> globals;
27
+	private final ZSPackage rootPackage;
28
+	
29
+	private final CompilingPackage rootCompiling;
30
+	
31
+	public ModuleTypeResolutionContext(
32
+			GlobalTypeRegistry registry,
33
+			AnnotationDefinition[] annotations,
34
+			ZSPackage rootPackage,
35
+			CompilingPackage rootCompiling,
36
+			Map<String, ISymbol> globals)
37
+	{
38
+		this.registry = registry;
39
+		this.rootPackage = rootPackage;
40
+		this.rootCompiling = rootCompiling;
41
+		this.globals = globals;
42
+		
43
+		for (AnnotationDefinition annotation : annotations)
44
+			this.annotations.put(annotation.getAnnotationName(), annotation);
45
+	}
46
+	
47
+	@Override
48
+	public GlobalTypeRegistry getTypeRegistry() {
49
+		return registry;
50
+	}
51
+	
52
+	@Override
53
+	public AnnotationDefinition getAnnotation(String name) {
54
+		return annotations.get(name);
55
+	}
56
+
57
+	@Override
58
+	public ITypeID getType(CodePosition position, List<GenericName> name) {
59
+		if (rootCompiling != null) {
60
+			ITypeID compiling = rootCompiling.getType(this, name);
61
+			if (compiling != null)
62
+				return compiling;
63
+		}
64
+		
65
+		if (name.size() == 1 && globals.containsKey(name.get(0).name))
66
+			return globals.get(name.get(0).name).getType(position, this, name.get(0).arguments);
67
+		
68
+		return rootPackage.getType(position, this, name);
69
+	}
70
+	
71
+	@Override
72
+	public ITypeID getThisType() {
73
+		return null;
74
+	}
75
+}

+ 27
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/TypeResolutionContext.java Vedi File

@@ -0,0 +1,27 @@
1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.codemodel.context;
7
+
8
+import java.util.List;
9
+import org.openzen.zencode.shared.CodePosition;
10
+import org.openzen.zenscript.codemodel.annotations.AnnotationDefinition;
11
+import org.openzen.zenscript.codemodel.type.GenericName;
12
+import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
13
+import org.openzen.zenscript.codemodel.type.ITypeID;
14
+
15
+/**
16
+ *
17
+ * @author Hoofdgebruiker
18
+ */
19
+public interface TypeResolutionContext {
20
+	GlobalTypeRegistry getTypeRegistry();
21
+	
22
+	AnnotationDefinition getAnnotation(String name);
23
+	
24
+	ITypeID getType(CodePosition position, List<GenericName> name);
25
+	
26
+	ITypeID getThisType();
27
+}

+ 3
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/definition/AliasDefinition.java Vedi File

@@ -22,6 +22,9 @@ public class AliasDefinition extends HighLevelDefinition {
22 22
 	}
23 23
 	
24 24
 	public void setType(ITypeID type) {
25
+		if (type == null)
26
+			throw new NullPointerException("type cannot be null!");
27
+		
25 28
 		this.type = type;
26 29
 	}
27 30
 

+ 2
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/definition/FunctionDefinition.java Vedi File

@@ -7,6 +7,7 @@ package org.openzen.zenscript.codemodel.definition;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.FunctionHeader;
10
+import org.openzen.zenscript.codemodel.GenericMapper;
10 11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
11 12
 import org.openzen.zenscript.codemodel.Modifiers;
12 13
 import org.openzen.zenscript.codemodel.member.CallerMember;
@@ -38,7 +39,7 @@ public class FunctionDefinition extends HighLevelDefinition {
38 39
 	public void setHeader(FunctionHeader header) {
39 40
 		this.header = header;
40 41
 		addMember(caller = new CallerMember(position, this, modifiers | Modifiers.STATIC, header, null));
41
-		callerGroup.addMethod(new FunctionalMemberRef(caller, caller.header), TypeMemberPriority.SPECIFIED);
42
+		callerGroup.addMethod(new FunctionalMemberRef(caller, GenericMapper.EMPTY), TypeMemberPriority.SPECIFIED);
42 43
 	}
43 44
 	
44 45
 	public void setCode(Statement statement) {

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/definition/InterfaceDefinition.java Vedi File

@@ -17,7 +17,7 @@ import org.openzen.zenscript.codemodel.type.ITypeID;
17 17
  * @author Hoofdgebruiker
18 18
  */
19 19
 public class InterfaceDefinition extends HighLevelDefinition {
20
-	private final List<ITypeID> baseInterfaces = new ArrayList<>();
20
+	public final List<ITypeID> baseInterfaces = new ArrayList<>();
21 21
 	
22 22
 	public InterfaceDefinition(CodePosition position, ZSPackage pkg, String name, int modifiers, HighLevelDefinition outerDefinition) {
23 23
 		super(position, pkg, name, modifiers, outerDefinition);

+ 10
- 17
CodeModel/src/main/java/org/openzen/zenscript/codemodel/definition/ZSPackage.java Vedi File

@@ -12,13 +12,14 @@ import org.openzen.zencode.shared.CodePosition;
12 12
 import org.openzen.zencode.shared.CompileException;
13 13
 import org.openzen.zencode.shared.CompileExceptionCode;
14 14
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
15
+import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
15 16
 import org.openzen.zenscript.codemodel.partial.IPartialExpression;
16 17
 import org.openzen.zenscript.codemodel.partial.PartialPackageExpression;
17 18
 import org.openzen.zenscript.codemodel.partial.PartialTypeExpression;
19
+import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
18 20
 import org.openzen.zenscript.codemodel.type.GenericName;
19 21
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
20 22
 import org.openzen.zenscript.codemodel.type.ITypeID;
21
-import org.openzen.zenscript.codemodel.scope.TypeScope;
22 23
 
23 24
 /**
24 25
  *
@@ -80,37 +81,29 @@ public class ZSPackage {
80 81
 		return null;
81 82
 	}
82 83
 	
83
-	public ITypeID getType(CodePosition position, TypeScope scope, List<GenericName> nameParts) {
84
-		return getType(position, scope, nameParts, 0);
84
+	public ITypeID getType(CodePosition position, TypeResolutionContext context, List<GenericName> nameParts) {
85
+		return getType(position, context, nameParts, 0);
85 86
 	}
86 87
 	
87
-	public ITypeID getType(CodePosition position, TypeScope scope, GenericName name) {
88
+	public ITypeID getType(CodePosition position, TypeResolutionContext context, GenericName name) {
88 89
 		if (types.containsKey(name.name)) {
89
-			return scope.getTypeRegistry().getForDefinition(types.get(name.name), name.arguments);
90
+			return context.getTypeRegistry().getForDefinition(types.get(name.name), name.arguments);
90 91
 		}
91 92
 		
92 93
 		return null;
93 94
 	}
94 95
 	
95
-	private ITypeID getType(CodePosition position, TypeScope scope, List<GenericName> nameParts, int depth) {
96
+	private ITypeID getType(CodePosition position, TypeResolutionContext context, List<GenericName> nameParts, int depth) {
96 97
 		if (depth >= nameParts.size())
97 98
 			return null;
98 99
 		
99 100
 		GenericName name = nameParts.get(depth);
100 101
 		if (subPackages.containsKey(name.name) && name.hasNoArguments())
101
-			return subPackages.get(name.name).getType(position, scope, nameParts, depth + 1);
102
+			return subPackages.get(name.name).getType(position, context, nameParts, depth + 1);
102 103
 		
103 104
 		if (types.containsKey(name.name)) {
104
-			ITypeID type = scope.getTypeRegistry().getForDefinition(types.get(name.name), name.arguments);
105
-			depth++;
106
-			while (depth < nameParts.size()) {
107
-				GenericName innerName = nameParts.get(depth++);
108
-				type = scope.getTypeMembers(type).getInnerType(position, innerName);
109
-				if (type == null)
110
-					return null;
111
-			}
112
-			
113
-			return type;
105
+			DefinitionTypeID type = context.getTypeRegistry().getForDefinition(types.get(name.name), name.arguments);
106
+			return GenericName.getInnerType(context.getTypeRegistry(), type, nameParts, depth + 1);
114 107
 		}
115 108
 		
116 109
 		return null;

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CheckNullExpression.java Vedi File

@@ -17,7 +17,7 @@ public class CheckNullExpression extends Expression {
17 17
 	public final Expression value;
18 18
 	
19 19
 	public CheckNullExpression(CodePosition position, Expression value) {
20
-		super(position, value.type.unwrap(), value.thrownType);
20
+		super(position, value.type.withoutOptional(), value.thrownType);
21 21
 		
22 22
 		this.value = value;
23 23
 	}

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CompareExpression.java Vedi File

@@ -27,7 +27,7 @@ public class CompareExpression extends Expression {
27 27
 		super(position, BasicTypeID.BOOL, binaryThrow(position, left.thrownType, right.thrownType));
28 28
 		
29 29
 		this.left = left;
30
-		this.right = scope == null ? right : right.castImplicit(position, scope, operator.header.parameters[0].type);
30
+		this.right = scope == null ? right : right.castImplicit(position, scope, operator.getHeader().parameters[0].type);
31 31
 		this.operator = operator;
32 32
 		this.comparison = comparison;
33 33
 	}

+ 2
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstructorSuperCallExpression.java Vedi File

@@ -21,7 +21,7 @@ public class ConstructorSuperCallExpression extends Expression {
21 21
 	public final CallArguments arguments;
22 22
 	
23 23
 	public ConstructorSuperCallExpression(CodePosition position, ITypeID type, FunctionalMemberRef constructor, CallArguments arguments) {
24
-		super(position, BasicTypeID.VOID, binaryThrow(position, constructor.header.thrownType, multiThrow(position, arguments.arguments)));
24
+		super(position, BasicTypeID.VOID, binaryThrow(position, constructor.getHeader().thrownType, multiThrow(position, arguments.arguments)));
25 25
 		
26 26
 		this.objectType = type;
27 27
 		this.constructor = constructor;
@@ -41,6 +41,6 @@ public class ConstructorSuperCallExpression extends Expression {
41 41
 
42 42
 	@Override
43 43
 	public Expression normalize(TypeScope scope) {
44
-		return new ConstructorSuperCallExpression(position, type.getNormalized(), constructor, arguments.normalize(position, scope, constructor.header));
44
+		return new ConstructorSuperCallExpression(position, type.getNormalized(), constructor, arguments.normalize(position, scope, constructor.getHeader()));
45 45
 	}
46 46
 }

+ 6
- 3
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstructorThisCallExpression.java Vedi File

@@ -21,7 +21,10 @@ public class ConstructorThisCallExpression extends Expression {
21 21
 	public final CallArguments arguments;
22 22
 	
23 23
 	public ConstructorThisCallExpression(CodePosition position, ITypeID type, FunctionalMemberRef constructor, CallArguments arguments) {
24
-		super(position, BasicTypeID.VOID, binaryThrow(position, constructor.header.thrownType, multiThrow(position, arguments.arguments)));
24
+		super(position, BasicTypeID.VOID, binaryThrow(position, constructor.getHeader().thrownType, multiThrow(position, arguments.arguments)));
25
+		
26
+		if (type instanceof BasicTypeID)
27
+			throw new IllegalArgumentException("Type cannot be basic type");
25 28
 		
26 29
 		this.objectType = type;
27 30
 		this.constructor = constructor;
@@ -36,11 +39,11 @@ public class ConstructorThisCallExpression extends Expression {
36 39
 	@Override
37 40
 	public Expression transform(ExpressionTransformer transformer) {
38 41
 		CallArguments tArguments = arguments.transform(transformer);
39
-		return tArguments == arguments ? this : new ConstructorThisCallExpression(position, type, constructor, tArguments);
42
+		return tArguments == arguments ? this : new ConstructorThisCallExpression(position, objectType, constructor, tArguments);
40 43
 	}
41 44
 
42 45
 	@Override
43 46
 	public Expression normalize(TypeScope scope) {
44
-		return new ConstructorThisCallExpression(position, type, constructor, arguments.normalize(position, scope, constructor.header));
47
+		return new ConstructorThisCallExpression(position, objectType, constructor, arguments.normalize(position, scope, constructor.getHeader()));
45 48
 	}
46 49
 }

+ 3
- 3
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/Expression.java Vedi File

@@ -106,8 +106,8 @@ public abstract class Expression implements IPartialExpression {
106 106
 		return scope.getTypeMembers(type)
107 107
 				.getOrCreateGroup(OperatorType.CALL)
108 108
 				.getMethodMembers().stream()
109
-				.filter(method -> method.member.header.parameters.length == arguments && !method.member.isStatic())
110
-				.map(method -> method.member.header)
109
+				.filter(method -> method.member.getHeader().parameters.length == arguments && !method.member.isStatic())
110
+				.map(method -> method.member.getHeader())
111 111
 				.collect(Collectors.toList());
112 112
 	}
113 113
 	
@@ -119,7 +119,7 @@ public abstract class Expression implements IPartialExpression {
119 119
 	@Override
120 120
 	public IPartialExpression getMember(CodePosition position, TypeScope scope, List<ITypeID> hints, GenericName name) {
121 121
 		TypeMembers members = scope.getTypeMembers(type);
122
-		IPartialExpression result = members.getMemberExpression(position, this, name, false);
122
+		IPartialExpression result = members.getMemberExpression(position, scope, this, name, false);
123 123
 		if (result == null)
124 124
 			System.out.println("No such member: " + name.name);
125 125
 		return result;

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ExpressionBuilder.java Vedi File

@@ -59,7 +59,7 @@ public class ExpressionBuilder {
59 59
 				type,
60 60
 				member,
61 61
 				compiledArguments,
62
-				compiledArguments.getNumberOfTypeArguments() == 0 ? member.header : member.header.fillGenericArguments(scope.getTypeRegistry(), compiledArguments.typeArguments));
62
+				compiledArguments.getNumberOfTypeArguments() == 0 ? member.getHeader() : member.getHeader().fillGenericArguments(scope.getTypeRegistry(), compiledArguments.typeArguments));
63 63
 	}
64 64
 	
65 65
 	public Expression not(Expression value) {

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/GetFieldExpression.java Vedi File

@@ -22,7 +22,7 @@ public class GetFieldExpression extends Expression {
22 22
 	public final FieldMemberRef field;
23 23
 	
24 24
 	public GetFieldExpression(CodePosition position, Expression target, FieldMemberRef field) {
25
-		super(position, field.type, target.thrownType);
25
+		super(position, field.getType(), target.thrownType);
26 26
 		
27 27
 		this.target = target;
28 28
 		this.field = field;

+ 2
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/GetStaticFieldExpression.java Vedi File

@@ -21,14 +21,14 @@ public class GetStaticFieldExpression extends Expression {
21 21
 	public final FieldMemberRef field;
22 22
 	
23 23
 	public GetStaticFieldExpression(CodePosition position, FieldMemberRef field) {
24
-		super(position, field.type, null);
24
+		super(position, field.getType(), null);
25 25
 		
26 26
 		this.field = field;
27 27
 	}
28 28
 	
29 29
 	@Override
30 30
 	public List<ITypeID> getAssignHints() {
31
-		return Collections.singletonList(field.type);
31
+		return Collections.singletonList(field.getType());
32 32
 	}
33 33
 	
34 34
 	@Override

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/GetterExpression.java Vedi File

@@ -18,7 +18,7 @@ public class GetterExpression extends Expression {
18 18
 	public final GetterMemberRef getter;
19 19
 	
20 20
 	public GetterExpression(CodePosition position, Expression target, GetterMemberRef getter) {
21
-		super(position, getter.type, target.thrownType);
21
+		super(position, getter.getType(), target.thrownType);
22 22
 		
23 23
 		this.target = target;
24 24
 		this.getter = getter;

+ 2
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/NewExpression.java Vedi File

@@ -26,7 +26,7 @@ public class NewExpression extends Expression {
26 26
 			FunctionalMemberRef constructor,
27 27
 			CallArguments arguments)
28 28
 	{
29
-		this(position, type, constructor, arguments, constructor.header);
29
+		this(position, type, constructor, arguments, constructor.getHeader());
30 30
 	}
31 31
 	
32 32
 	public NewExpression(
@@ -36,7 +36,7 @@ public class NewExpression extends Expression {
36 36
 			CallArguments arguments,
37 37
 			FunctionHeader instancedHeader)
38 38
 	{
39
-		super(position, type, binaryThrow(position, constructor.header.thrownType, multiThrow(position, arguments.arguments)));
39
+		super(position, type, binaryThrow(position, constructor.getHeader().thrownType, multiThrow(position, arguments.arguments)));
40 40
 		
41 41
 		this.constructor = constructor;
42 42
 		this.arguments = arguments;

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/SetFieldExpression.java Vedi File

@@ -19,7 +19,7 @@ public class SetFieldExpression extends Expression {
19 19
 	public final Expression value;
20 20
 	
21 21
 	public SetFieldExpression(CodePosition position, Expression target, FieldMemberRef field, Expression value) {
22
-		super(position, field.type, binaryThrow(position, target.thrownType, value.thrownType));
22
+		super(position, field.getType(), binaryThrow(position, target.thrownType, value.thrownType));
23 23
 		
24 24
 		this.target = target;
25 25
 		this.field = field;

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/SetStaticFieldExpression.java Vedi File

@@ -18,7 +18,7 @@ public class SetStaticFieldExpression extends Expression {
18 18
 	public final Expression value;
19 19
 	
20 20
 	public SetStaticFieldExpression(CodePosition position, FieldMemberRef field, Expression value) {
21
-		super(position, field.type, value.thrownType);
21
+		super(position, field.getType(), value.thrownType);
22 22
 		
23 23
 		this.field = field;
24 24
 		this.value = value;

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/SetterExpression.java Vedi File

@@ -19,7 +19,7 @@ public class SetterExpression extends Expression {
19 19
 	public final Expression value;
20 20
 	
21 21
 	public SetterExpression(CodePosition position, Expression target, SetterMemberRef setter, Expression value) {
22
-		super(position, setter.type, value.thrownType);
22
+		super(position, setter.getType(), value.thrownType);
23 23
 		
24 24
 		this.target = target;
25 25
 		this.setter = setter;

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/StaticGetterExpression.java Vedi File

@@ -17,7 +17,7 @@ public class StaticGetterExpression extends Expression {
17 17
 	public final GetterMemberRef getter;
18 18
 	
19 19
 	public StaticGetterExpression(CodePosition position, GetterMemberRef getter) {
20
-		super(position, getter.type, null);
20
+		super(position, getter.getType(), null);
21 21
 		
22 22
 		this.getter = getter;
23 23
 	}

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/StaticSetterExpression.java Vedi File

@@ -18,7 +18,7 @@ public class StaticSetterExpression extends Expression {
18 18
 	public final Expression value;
19 19
 	
20 20
 	public StaticSetterExpression(CodePosition position, SetterMemberRef setter, Expression value) {
21
-		super(position, setter.type, value.thrownType);
21
+		super(position, setter.getType(), value.thrownType);
22 22
 		
23 23
 		this.setter = setter;
24 24
 		this.value = value;

+ 3
- 5
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ConstMember.java Vedi File

@@ -21,17 +21,15 @@ import org.openzen.zenscript.codemodel.type.member.TypeMembers;
21 21
  *
22 22
  * @author Hoofdgebruiker
23 23
  */
24
-public class ConstMember extends DefinitionMember {
24
+public class ConstMember extends PropertyMember {
25 25
 	public final String name;
26
-	public ITypeID type;
27 26
 	public Expression value;
28 27
 	public final BuiltinID builtin;
29 28
 	
30 29
 	public ConstMember(CodePosition position, HighLevelDefinition definition, int modifiers, String name, ITypeID type, BuiltinID builtin) {
31
-		super(position, definition, modifiers);
30
+		super(position, definition, modifiers, type, null);
32 31
 		
33 32
 		this.name = name;
34
-		this.type = type;
35 33
 		this.builtin = builtin;
36 34
 	}
37 35
 
@@ -47,7 +45,7 @@ public class ConstMember extends DefinitionMember {
47 45
 
48 46
 	@Override
49 47
 	public void registerTo(TypeMembers members, TypeMemberPriority priority, GenericMapper mapper) {
50
-		members.addConst(new ConstMemberRef(this, type, mapper));
48
+		members.addConst(new ConstMemberRef(this, mapper));
51 49
 	}
52 50
 
53 51
 	@Override

+ 4
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/DefinitionMember.java Vedi File

@@ -32,6 +32,10 @@ public abstract class DefinitionMember extends Taggable implements IDefinitionMe
32 32
 		return position;
33 33
 	}
34 34
 	
35
+	public MemberAnnotation[] getAnnotations() {
36
+		return annotations;
37
+	}
38
+	
35 39
 	public boolean isStatic() {
36 40
 		return Modifiers.isStatic(modifiers);
37 41
 	}

+ 6
- 13
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/FieldMember.java Vedi File

@@ -18,7 +18,6 @@ import org.openzen.zenscript.codemodel.member.ref.FieldMemberRef;
18 18
 import org.openzen.zenscript.codemodel.scope.TypeScope;
19 19
 import org.openzen.zenscript.codemodel.statement.ExpressionStatement;
20 20
 import org.openzen.zenscript.codemodel.statement.ReturnStatement;
21
-import org.openzen.zenscript.codemodel.type.GenericTypeID;
22 21
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
23 22
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
24 23
 import org.openzen.zenscript.codemodel.type.ITypeID;
@@ -29,13 +28,11 @@ import org.openzen.zenscript.codemodel.type.member.TypeMemberPriority;
29 28
  *
30 29
  * @author Hoofdgebruiker
31 30
  */
32
-public class FieldMember extends DefinitionMember {
31
+public class FieldMember extends PropertyMember {
33 32
 	public final String name;
34
-	public ITypeID type;
35 33
 	public Expression initializer;
36 34
 	public final int autoGetterAccess;
37 35
 	public final int autoSetterAccess;
38
-	public final BuiltinID builtin;
39 36
 	
40 37
 	public final GetterMember autoGetter;
41 38
 	public final SetterMember autoSetter;
@@ -52,13 +49,11 @@ public class FieldMember extends DefinitionMember {
52 49
 			int autoSetterAccess,
53 50
 			BuiltinID builtin)
54 51
 	{
55
-		super(position, definition, modifiers);
52
+		super(position, definition, modifiers, type, builtin);
56 53
 		
57 54
 		this.name = name;
58
-		this.type = type;
59 55
 		this.autoGetterAccess = autoGetterAccess;
60 56
 		this.autoSetterAccess = autoSetterAccess;
61
-		this.builtin = builtin;
62 57
 		
63 58
 		ITypeID[] parameters = null;
64 59
 		if (definition.genericParameters != null) {
@@ -69,7 +64,7 @@ public class FieldMember extends DefinitionMember {
69 64
 		
70 65
 		if (autoGetterAccess != 0) {
71 66
 			this.autoGetter = new GetterMember(position, definition, autoGetterAccess, name, type, null);
72
-			this.autoGetter.setBody(new ReturnStatement(position, new GetFieldExpression(position, new ThisExpression(position, thisType), new FieldMemberRef(this, thisType))));
67
+			this.autoGetter.setBody(new ReturnStatement(position, new GetFieldExpression(position, new ThisExpression(position, thisType), new FieldMemberRef(this, GenericMapper.EMPTY))));
73 68
 		} else {
74 69
 			this.autoGetter = null;
75 70
 		}
@@ -78,7 +73,7 @@ public class FieldMember extends DefinitionMember {
78 73
 			this.autoSetter.setBody(new ExpressionStatement(position, new SetFieldExpression(
79 74
 					position,
80 75
 					new ThisExpression(position, thisType),
81
-					new FieldMemberRef(this, thisType),
76
+					new FieldMemberRef(this, GenericMapper.EMPTY),
82 77
 					new GetFunctionParameterExpression(position, this.autoSetter.header.parameters[0]))));
83 78
 		} else {
84 79
 			this.autoSetter = null;
@@ -97,15 +92,13 @@ public class FieldMember extends DefinitionMember {
97 92
 			SetterMember autoSetter,
98 93
 			BuiltinID builtin)
99 94
 	{
100
-		super(position, definition, modifiers);
95
+		super(position, definition, modifiers, type, builtin);
101 96
 		
102 97
 		this.name = name;
103
-		this.type = type;
104 98
 		this.autoGetterAccess = autoGetterAccess;
105 99
 		this.autoSetterAccess = autoSetterAccess;
106 100
 		this.autoGetter = autoGetter;
107 101
 		this.autoSetter = autoSetter;
108
-		this.builtin = builtin;
109 102
 	}
110 103
 	
111 104
 	public boolean hasAutoGetter() {
@@ -122,7 +115,7 @@ public class FieldMember extends DefinitionMember {
122 115
 
123 116
 	@Override
124 117
 	public void registerTo(TypeMembers members, TypeMemberPriority priority, GenericMapper mapper) {
125
-		members.addField(new FieldMemberRef(this, mapper.map(type)), priority);
118
+		members.addField(new FieldMemberRef(this, mapper), priority);
126 119
 	}
127 120
 	
128 121
 	@Override

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/FunctionalMember.java Vedi File

@@ -46,7 +46,7 @@ public abstract class FunctionalMember extends DefinitionMember {
46 46
 	public abstract FunctionalKind getKind();
47 47
 	
48 48
 	public FunctionalMemberRef ref(GenericMapper mapper) {
49
-		return new FunctionalMemberRef(this, mapper.map(header));
49
+		return new FunctionalMemberRef(this, mapper);
50 50
 	}
51 51
 	
52 52
 	@Override

+ 8
- 4
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/GetterMember.java Vedi File

@@ -9,7 +9,6 @@ import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.FunctionHeader;
10 10
 import org.openzen.zenscript.codemodel.GenericMapper;
11 11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
-import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
13 12
 import org.openzen.zenscript.codemodel.member.ref.GetterMemberRef;
14 13
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
15 14
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
@@ -21,7 +20,7 @@ import org.openzen.zenscript.codemodel.type.member.TypeMemberPriority;
21 20
  *
22 21
  * @author Hoofdgebruiker
23 22
  */
24
-public class GetterMember extends FunctionalMember {
23
+public class GetterMember extends FunctionalMember implements IPropertyMember {
25 24
 	public final String name;
26 25
 	public ITypeID type;
27 26
 	private GetterMemberRef overrides;
@@ -39,6 +38,11 @@ public class GetterMember extends FunctionalMember {
39 38
 		this.type = type;
40 39
 	}
41 40
 	
41
+	@Override
42
+	public ITypeID getType() {
43
+		return type;
44
+	}
45
+	
42 46
 	@Override
43 47
 	public String getCanonicalName() {
44 48
 		return definition.getFullName() + ":getter:" + name;
@@ -51,7 +55,7 @@ public class GetterMember extends FunctionalMember {
51 55
 	
52 56
 	@Override
53 57
 	public void registerTo(TypeMembers members, TypeMemberPriority priority, GenericMapper mapper) {
54
-		members.addGetter(new GetterMemberRef(this, mapper.map(type)), priority);
58
+		members.addGetter(new GetterMemberRef(this, mapper), priority);
55 59
 	}
56 60
 
57 61
 	@Override
@@ -73,6 +77,6 @@ public class GetterMember extends FunctionalMember {
73 77
 		this.overrides = override;
74 78
 		
75 79
 		if (type == BasicTypeID.UNDETERMINED)
76
-			type = override.type;
80
+			type = override.getType();
77 81
 	}
78 82
 }

+ 31
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/IPropertyMember.java Vedi File

@@ -0,0 +1,31 @@
1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.codemodel.member;
7
+
8
+import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.FunctionHeader;
10
+import org.openzen.zenscript.codemodel.annotations.MemberAnnotation;
11
+import org.openzen.zenscript.codemodel.type.ITypeID;
12
+
13
+/**
14
+ *
15
+ * @author Hoofdgebruiker
16
+ */
17
+public interface IPropertyMember {
18
+	ITypeID getType();
19
+	
20
+	CodePosition getPosition();
21
+	
22
+	String describe();
23
+
24
+	<T> T getTag(Class<T> type);
25
+	
26
+	boolean isStatic();
27
+	
28
+	boolean isFinal();
29
+	
30
+	MemberAnnotation[] getAnnotations();
31
+}

+ 1
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/InnerDefinitionMember.java Vedi File

@@ -9,6 +9,7 @@ import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.GenericMapper;
10 10
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
11 11
 import org.openzen.zenscript.codemodel.Modifiers;
12
+import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
12 13
 import org.openzen.zenscript.codemodel.definition.InterfaceDefinition;
13 14
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
14 15
 import org.openzen.zenscript.codemodel.scope.TypeScope;

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/MethodMember.java Vedi File

@@ -62,7 +62,7 @@ public class MethodMember extends FunctionalMember {
62 62
 	
63 63
 	public void setOverrides(GlobalTypeRegistry registry, FunctionalMemberRef overrides) {
64 64
 		this.overrides = overrides;
65
-		header = header.inferFromOverride(registry, overrides.header);
65
+		header = header.inferFromOverride(registry, overrides.getHeader());
66 66
 		
67 67
 		if (overrides.getTarget().isPublic())
68 68
 			modifiers |= Modifiers.PUBLIC;

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/OperatorMember.java Vedi File

@@ -69,6 +69,6 @@ public class OperatorMember extends FunctionalMember {
69 69
 	
70 70
 	public void setOverrides(GlobalTypeRegistry registry, FunctionalMemberRef overrides) {
71 71
 		this.overrides = overrides;
72
-		header = header.inferFromOverride(registry, overrides.header);
72
+		header = header.inferFromOverride(registry, overrides.getHeader());
73 73
 	}
74 74
 }

+ 32
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/PropertyMember.java Vedi File

@@ -0,0 +1,32 @@
1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.codemodel.member;
7
+
8
+import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.HighLevelDefinition;
10
+import org.openzen.zenscript.codemodel.type.ITypeID;
11
+import org.openzen.zenscript.codemodel.type.member.BuiltinID;
12
+
13
+/**
14
+ *
15
+ * @author Hoofdgebruiker
16
+ */
17
+public abstract class PropertyMember extends DefinitionMember implements IPropertyMember {
18
+	public ITypeID type;
19
+	public final BuiltinID builtin;
20
+	
21
+	public PropertyMember(CodePosition position, HighLevelDefinition definition, int modifiers, ITypeID type, BuiltinID builtin) {
22
+		super(position, definition, modifiers);
23
+		
24
+		this.type = type;
25
+		this.builtin = builtin;
26
+	}
27
+	
28
+	@Override
29
+	public ITypeID getType() {
30
+		return type;
31
+	}
32
+}

+ 17
- 3
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/SetterMember.java Vedi File

@@ -6,11 +6,14 @@
6 6
 package org.openzen.zenscript.codemodel.member;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zencode.shared.ConcatMap;
9 10
 import org.openzen.zenscript.codemodel.FunctionHeader;
10 11
 import org.openzen.zenscript.codemodel.FunctionParameter;
11 12
 import org.openzen.zenscript.codemodel.GenericMapper;
12 13
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
13 14
 import org.openzen.zenscript.codemodel.member.ref.SetterMemberRef;
15
+import org.openzen.zenscript.codemodel.scope.TypeScope;
16
+import org.openzen.zenscript.codemodel.statement.LoopStatement;
14 17
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
15 18
 import org.openzen.zenscript.codemodel.type.ITypeID;
16 19
 import org.openzen.zenscript.codemodel.type.member.BuiltinID;
@@ -21,7 +24,7 @@ import org.openzen.zenscript.codemodel.type.member.TypeMembers;
21 24
  *
22 25
  * @author Hoofdgebruiker
23 26
  */
24
-public class SetterMember extends FunctionalMember {
27
+public class SetterMember extends FunctionalMember implements IPropertyMember {
25 28
 	public ITypeID type;
26 29
 	public final String name;
27 30
 	private SetterMemberRef overrides;
@@ -44,6 +47,11 @@ public class SetterMember extends FunctionalMember {
44 47
 		this.name = name;
45 48
 	}
46 49
 	
50
+	@Override
51
+	public ITypeID getType() {
52
+		return type;
53
+	}
54
+	
47 55
 	@Override
48 56
 	public String getCanonicalName() {
49 57
 		return definition.getFullName() + ":setter:" + name;
@@ -56,7 +64,7 @@ public class SetterMember extends FunctionalMember {
56 64
 
57 65
 	@Override
58 66
 	public void registerTo(TypeMembers members, TypeMemberPriority priority, GenericMapper mapper) {
59
-		members.addSetter(new SetterMemberRef(this, mapper.map(type)), priority);
67
+		members.addSetter(new SetterMemberRef(this, mapper), priority);
60 68
 	}
61 69
 
62 70
 	@Override
@@ -73,11 +81,17 @@ public class SetterMember extends FunctionalMember {
73 81
 	public SetterMemberRef getOverrides() {
74 82
 		return overrides;
75 83
 	}
84
+
85
+	@Override
86
+	public void normalize(TypeScope scope) {
87
+		if (body != null)
88
+			body = body.normalize(scope, ConcatMap.empty(LoopStatement.class, LoopStatement.class));
89
+	}
76 90
 	
77 91
 	public void setOverrides(SetterMemberRef overrides) {
78 92
 		this.overrides = overrides;
79 93
 		
80 94
 		if (type == BasicTypeID.UNDETERMINED)
81
-			type = overrides.type;
95
+			type = overrides.getType();
82 96
 	}
83 97
 }

+ 3
- 45
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/ConstMemberRef.java Vedi File

@@ -5,65 +5,23 @@
5 5
  */
6 6
 package org.openzen.zenscript.codemodel.member.ref;
7 7
 
8
-import org.openzen.zencode.shared.CodePosition;
9
-import org.openzen.zenscript.codemodel.FunctionHeader;
10 8
 import org.openzen.zenscript.codemodel.GenericMapper;
11
-import org.openzen.zenscript.codemodel.annotations.MemberAnnotation;
12 9
 import org.openzen.zenscript.codemodel.member.ConstMember;
13
-import org.openzen.zenscript.codemodel.type.ITypeID;
14 10
 
15 11
 /**
16 12
  *
17 13
  * @author Hoofdgebruiker
18 14
  */
19
-public class ConstMemberRef implements DefinitionMemberRef {
15
+public class ConstMemberRef extends PropertyRef {
20 16
 	public final ConstMember member;
21
-	private ITypeID type;
22
-	private ITypeID originalType;
23
-	private final GenericMapper mapper;
24 17
 	
25
-	public ConstMemberRef(ConstMember member, ITypeID originalType, GenericMapper mapper) {
18
+	public ConstMemberRef(ConstMember member, GenericMapper mapper) {
19
+		super(member, mapper);
26 20
 		this.member = member;
27
-		this.type = originalType.instance(mapper);
28
-		this.originalType = originalType;
29
-		this.mapper = mapper;
30
-	}
31
-	
32
-	public ITypeID getType() {
33
-		if (originalType != member.type) {
34
-			originalType = member.type;
35
-			type = originalType.instance(mapper);
36
-		}
37
-		return type;
38
-	}
39
-
40
-	@Override
41
-	public CodePosition getPosition() {
42
-		return member.position;
43
-	}
44
-
45
-	@Override
46
-	public String describe() {
47
-		return member.describe();
48
-	}
49
-
50
-	@Override
51
-	public <T> T getTag(Class<T> type) {
52
-		return member.getTag(type);
53 21
 	}
54 22
 
55 23
 	@Override
56 24
 	public DefinitionMemberRef getOverrides() {
57 25
 		return null;
58 26
 	}
59
-
60
-	@Override
61
-	public FunctionHeader getHeader() {
62
-		return null;
63
-	}
64
-
65
-	@Override
66
-	public MemberAnnotation[] getAnnotations() {
67
-		return member.annotations;
68
-	}
69 27
 }

+ 4
- 41
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/FieldMemberRef.java Vedi File

@@ -5,60 +5,23 @@
5 5
  */
6 6
 package org.openzen.zenscript.codemodel.member.ref;
7 7
 
8
-import org.openzen.zencode.shared.CodePosition;
9
-import org.openzen.zenscript.codemodel.FunctionHeader;
10
-import org.openzen.zenscript.codemodel.annotations.MemberAnnotation;
8
+import org.openzen.zenscript.codemodel.GenericMapper;
11 9
 import org.openzen.zenscript.codemodel.member.FieldMember;
12
-import org.openzen.zenscript.codemodel.type.ITypeID;
13 10
 
14 11
 /**
15 12
  *
16 13
  * @author Hoofdgebruiker
17 14
  */
18
-public class FieldMemberRef implements DefinitionMemberRef {
15
+public class FieldMemberRef extends PropertyRef {
19 16
 	public final FieldMember member;
20
-	public final ITypeID type;
21 17
 	
22
-	public FieldMemberRef(FieldMember member, ITypeID type) {
18
+	public FieldMemberRef(FieldMember member, GenericMapper mapper) {
19
+		super(member, mapper);
23 20
 		this.member = member;
24
-		this.type = type;
25
-	}
26
-
27
-	@Override
28
-	public CodePosition getPosition() {
29
-		return member.position;
30
-	}
31
-
32
-	@Override
33
-	public String describe() {
34
-		return member.describe();
35
-	}
36
-
37
-	@Override
38
-	public <T> T getTag(Class<T> type) {
39
-		return member.getTag(type);
40
-	}
41
-	
42
-	public boolean isStatic() {
43
-		return member.isStatic();
44
-	}
45
-	
46
-	public boolean isFinal() {
47
-		return member.isFinal();
48 21
 	}
49 22
 
50 23
 	@Override
51 24
 	public DefinitionMemberRef getOverrides() {
52 25
 		return null;
53 26
 	}
54
-
55
-	@Override
56
-	public FunctionHeader getHeader() {
57
-		return null;
58
-	}
59
-
60
-	@Override
61
-	public MemberAnnotation[] getAnnotations() {
62
-		return member.annotations;
63
-	}
64 27
 }

+ 30
- 8
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/FunctionalMemberRef.java Vedi File

@@ -8,6 +8,7 @@ package org.openzen.zenscript.codemodel.member.ref;
8 8
 import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.CompareType;
10 10
 import org.openzen.zenscript.codemodel.FunctionHeader;
11
+import org.openzen.zenscript.codemodel.GenericMapper;
11 12
 import org.openzen.zenscript.codemodel.OperatorType;
12 13
 import org.openzen.zenscript.codemodel.annotations.MemberAnnotation;
13 14
 import org.openzen.zenscript.codemodel.expression.CallArguments;
@@ -29,11 +30,37 @@ import org.openzen.zenscript.codemodel.type.member.BuiltinID;
29 30
  */
30 31
 public class FunctionalMemberRef implements DefinitionMemberRef {
31 32
 	private final FunctionalMember target;
32
-	public final FunctionHeader header;
33 33
 	
34
-	public FunctionalMemberRef(FunctionalMember target, FunctionHeader header) {
34
+	private FunctionHeader header;
35
+	private GenericMapper mapper;
36
+	
37
+	public FunctionalMemberRef(FunctionalMember target, GenericMapper mapper) {
35 38
 		this.target = target;
36
-		this.header = header;
39
+		
40
+		if (target.header.hasUnknowns) {
41
+			header = null;
42
+			this.mapper = mapper;
43
+		} else {
44
+			header = mapper.map(target.header);
45
+			this.mapper = null;
46
+		}
47
+	}
48
+	
49
+	public boolean accepts(int arguments) {
50
+		return arguments >= target.header.minParameters && arguments <= target.header.maxParameters;
51
+	}
52
+	
53
+	@Override
54
+	public FunctionHeader getHeader() {
55
+		if (header == null) {
56
+			if (target.header.hasUnknowns)
57
+				throw new IllegalStateException("member is not yet resolved!");
58
+			
59
+			header = mapper.map(target.header);
60
+			this.mapper = null;
61
+		}
62
+		
63
+		return header;
37 64
 	}
38 65
 	
39 66
 	@Override
@@ -68,11 +95,6 @@ public class FunctionalMemberRef implements DefinitionMemberRef {
68 95
 	public DefinitionMemberRef getOverrides() {
69 96
 		return target.getOverrides();
70 97
 	}
71
-
72
-	@Override
73
-	public FunctionHeader getHeader() {
74
-		return header;
75
-	}
76 98
 	
77 99
 	public BuiltinID getBuiltin() {
78 100
 		return target.builtin;

+ 5
- 34
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/GetterMemberRef.java Vedi File

@@ -7,43 +7,24 @@ package org.openzen.zenscript.codemodel.member.ref;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.FunctionHeader;
10
+import org.openzen.zenscript.codemodel.GenericMapper;
10 11
 import org.openzen.zenscript.codemodel.annotations.MemberAnnotation;
11 12
 import org.openzen.zenscript.codemodel.expression.Expression;
12 13
 import org.openzen.zenscript.codemodel.expression.GetterExpression;
13 14
 import org.openzen.zenscript.codemodel.expression.StaticGetterExpression;
14 15
 import org.openzen.zenscript.codemodel.member.GetterMember;
15
-import org.openzen.zenscript.codemodel.type.ITypeID;
16 16
 
17 17
 /**
18 18
  *
19 19
  * @author Hoofdgebruiker
20 20
  */
21
-public class GetterMemberRef implements DefinitionMemberRef {
21
+public class GetterMemberRef extends PropertyRef {
22 22
 	public final GetterMember member;
23
-	public final ITypeID type;
24 23
 	
25
-	public GetterMemberRef(GetterMember member, ITypeID type) {
24
+	public GetterMemberRef(GetterMember member, GenericMapper mapper) {
25
+		super(member, mapper);
26
+		
26 27
 		this.member = member;
27
-		this.type = type;
28
-	}
29
-
30
-	@Override
31
-	public CodePosition getPosition() {
32
-		return member.position;
33
-	}
34
-
35
-	@Override
36
-	public String describe() {
37
-		return member.describe();
38
-	}
39
-
40
-	@Override
41
-	public <T> T getTag(Class<T> type) {
42
-		return member.getTag(type);
43
-	}
44
-	
45
-	public boolean isStatic() {
46
-		return member.isStatic();
47 28
 	}
48 29
 	
49 30
 	public Expression get(CodePosition position, Expression target) {
@@ -58,14 +39,4 @@ public class GetterMemberRef implements DefinitionMemberRef {
58 39
 	public DefinitionMemberRef getOverrides() {
59 40
 		return member.getOverrides();
60 41
 	}
61
-
62
-	@Override
63
-	public FunctionHeader getHeader() {
64
-		return member.header;
65
-	}
66
-
67
-	@Override
68
-	public MemberAnnotation[] getAnnotations() {
69
-		return member.annotations;
70
-	}
71 42
 }

+ 82
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/PropertyRef.java Vedi File

@@ -0,0 +1,82 @@
1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.codemodel.member.ref;
7
+
8
+import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.FunctionHeader;
10
+import org.openzen.zenscript.codemodel.GenericMapper;
11
+import org.openzen.zenscript.codemodel.annotations.MemberAnnotation;
12
+import org.openzen.zenscript.codemodel.member.IPropertyMember;
13
+import org.openzen.zenscript.codemodel.type.BasicTypeID;
14
+import org.openzen.zenscript.codemodel.type.ITypeID;
15
+
16
+/**
17
+ *
18
+ * @author Hoofdgebruiker
19
+ */
20
+public abstract class PropertyRef implements DefinitionMemberRef {
21
+	private final IPropertyMember member;
22
+	
23
+	private ITypeID type;
24
+	private GenericMapper mapper;
25
+	
26
+	public PropertyRef(IPropertyMember member, GenericMapper mapper) {
27
+		this.member = member;
28
+		
29
+		if (member.getType() == BasicTypeID.UNDETERMINED) {
30
+			type = null;
31
+			this.mapper = mapper;
32
+		} else {
33
+			type = member.getType().instance(mapper);
34
+			this.mapper = null;
35
+		}
36
+	}
37
+	
38
+	public final ITypeID getType() {
39
+		if (type == null) {
40
+			if (member.getType() == BasicTypeID.UNDETERMINED)
41
+				throw new IllegalStateException("Property is not yet resolved!");
42
+			
43
+			type = member.getType().instance(mapper);
44
+			mapper = null;
45
+		}
46
+		
47
+		return type;
48
+	}
49
+
50
+	@Override
51
+	public final CodePosition getPosition() {
52
+		return member.getPosition();
53
+	}
54
+
55
+	@Override
56
+	public final String describe() {
57
+		return member.describe();
58
+	}
59
+
60
+	@Override
61
+	public final <T> T getTag(Class<T> type) {
62
+		return member.getTag(type);
63
+	}
64
+	
65
+	public final boolean isStatic() {
66
+		return member.isStatic();
67
+	}
68
+	
69
+	public final boolean isFinal() {
70
+		return member.isFinal();
71
+	}
72
+
73
+	@Override
74
+	public final FunctionHeader getHeader() {
75
+		return null;
76
+	}
77
+
78
+	@Override
79
+	public final MemberAnnotation[] getAnnotations() {
80
+		return member.getAnnotations();
81
+	}
82
+}

+ 5
- 37
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/SetterMemberRef.java Vedi File

@@ -5,56 +5,24 @@
5 5
  */
6 6
 package org.openzen.zenscript.codemodel.member.ref;
7 7
 
8
-import org.openzen.zencode.shared.CodePosition;
9
-import org.openzen.zenscript.codemodel.FunctionHeader;
10
-import org.openzen.zenscript.codemodel.annotations.MemberAnnotation;
8
+import org.openzen.zenscript.codemodel.GenericMapper;
11 9
 import org.openzen.zenscript.codemodel.member.SetterMember;
12
-import org.openzen.zenscript.codemodel.type.ITypeID;
13 10
 
14 11
 /**
15 12
  *
16 13
  * @author Hoofdgebruiker
17 14
  */
18
-public class SetterMemberRef implements DefinitionMemberRef {
15
+public class SetterMemberRef extends PropertyRef {
19 16
 	public final SetterMember member;
20
-	public final ITypeID type;
21 17
 	
22
-	public SetterMemberRef(SetterMember member, ITypeID type) {
18
+	public SetterMemberRef(SetterMember member, GenericMapper mapper) {
19
+		super(member, mapper);
20
+		
23 21
 		this.member = member;
24
-		this.type = type;
25
-	}
26
-
27
-	@Override
28
-	public CodePosition getPosition() {
29
-		return member.position;
30
-	}
31
-
32
-	@Override
33
-	public String describe() {
34
-		return member.describe();
35
-	}
36
-
37
-	@Override
38
-	public <T> T getTag(Class<T> type) {
39
-		return member.getTag(type);
40
-	}
41
-	
42
-	public boolean isStatic() {
43
-		return member.isStatic();
44 22
 	}
45 23
 
46 24
 	@Override
47 25
 	public DefinitionMemberRef getOverrides() {
48 26
 		return member.getOverrides();
49 27
 	}
50
-
51
-	@Override
52
-	public FunctionHeader getHeader() {
53
-		return member.header;
54
-	}
55
-
56
-	@Override
57
-	public MemberAnnotation[] getAnnotations() {
58
-		return member.annotations;
59
-	}
60 28
 }

+ 3
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/TranslatedOperatorMemberRef.java Vedi File

@@ -7,6 +7,7 @@ package org.openzen.zenscript.codemodel.member.ref;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.FunctionHeader;
10
+import org.openzen.zenscript.codemodel.GenericMapper;
10 11
 import org.openzen.zenscript.codemodel.expression.CallArguments;
11 12
 import org.openzen.zenscript.codemodel.expression.CallTranslator;
12 13
 import org.openzen.zenscript.codemodel.expression.Expression;
@@ -20,8 +21,8 @@ import org.openzen.zenscript.codemodel.scope.TypeScope;
20 21
 public class TranslatedOperatorMemberRef extends FunctionalMemberRef {
21 22
 	private final CallTranslator translator;
22 23
 	
23
-	public TranslatedOperatorMemberRef(OperatorMember member, FunctionHeader header, CallTranslator translator) {
24
-		super(member, header);
24
+	public TranslatedOperatorMemberRef(OperatorMember member, GenericMapper mapper, CallTranslator translator) {
25
+		super(member, mapper);
25 26
 		
26 27
 		this.translator = translator;
27 28
 	}

+ 29
- 8
CodeModel/src/main/java/org/openzen/zenscript/codemodel/partial/PartialMemberGroupExpression.java Vedi File

@@ -29,17 +29,35 @@ public class PartialMemberGroupExpression implements IPartialExpression {
29 29
 	private final DefinitionMemberGroup group;
30 30
 	private final ITypeID[] typeArguments;
31 31
 	private final boolean allowStaticUsage;
32
+	private final TypeScope scope;
32 33
 	
33
-	public PartialMemberGroupExpression(CodePosition position, Expression target, DefinitionMemberGroup group, ITypeID[] typeArguments, boolean allowStaticMembers) {
34
+	public PartialMemberGroupExpression(
35
+			CodePosition position,
36
+			TypeScope scope,
37
+			Expression target,
38
+			DefinitionMemberGroup group,
39
+			ITypeID[] typeArguments,
40
+			boolean allowStaticMembers)
41
+	{
34 42
 		this.position = position;
43
+		this.scope = scope;
35 44
 		this.target = target;
36 45
 		this.group = group;
37 46
 		this.typeArguments = typeArguments;
38 47
 		this.allowStaticUsage = allowStaticMembers;
39 48
 	}
40 49
 	
41
-	public PartialMemberGroupExpression(CodePosition position, Expression target, String name, FunctionalMemberRef member, ITypeID[] typeArguments, boolean allowStaticMembers) {
50
+	public PartialMemberGroupExpression(
51
+			CodePosition position,
52
+			TypeScope scope,
53
+			Expression target,
54
+			String name,
55
+			FunctionalMemberRef member,
56
+			ITypeID[] typeArguments,
57
+			boolean allowStaticMembers)
58
+	{
42 59
 		this.position = position;
60
+		this.scope = scope;
43 61
 		this.target = target;
44 62
 		this.group = DefinitionMemberGroup.forMethod(name, member);
45 63
 		this.typeArguments = typeArguments;
@@ -48,15 +66,15 @@ public class PartialMemberGroupExpression implements IPartialExpression {
48 66
 
49 67
 	@Override
50 68
 	public Expression eval() {
51
-		return group.getter(position, target, allowStaticUsage);
69
+		return group.getter(position, scope, target, allowStaticUsage);
52 70
 	}
53 71
 	
54 72
 	@Override
55 73
 	public List<ITypeID> getAssignHints() {
56 74
 		if (group.getSetter() != null)
57
-			return Collections.singletonList(group.getSetter().type);
75
+			return Collections.singletonList(group.getSetter().getType());
58 76
 		if (group.getField() != null)
59
-			return Collections.singletonList(group.getField().type);
77
+			return Collections.singletonList(group.getField().getType());
60 78
 		
61 79
 		return Collections.emptyList();
62 80
 	}
@@ -69,8 +87,11 @@ public class PartialMemberGroupExpression implements IPartialExpression {
69 87
 	@Override
70 88
 	public List<FunctionHeader> getPossibleFunctionHeaders(TypeScope scope, List<ITypeID> hints, int arguments) {
71 89
 		List<FunctionHeader> results = group.getMethodMembers().stream()
72
-				.filter(method -> method.member.header.parameters.length == arguments && !method.member.isStatic())
73
-				.map(method -> method.member.header)
90
+				.filter(method -> method.member.accepts(arguments) && !method.member.isStatic())
91
+				.map(method -> {
92
+					scope.getPreparer().prepare(method.member.getTarget());
93
+					return method.member.getHeader();
94
+				})
74 95
 				.collect(Collectors.toList());
75 96
 		if (results.isEmpty())
76 97
 			System.out.println("!");
@@ -94,7 +115,7 @@ public class PartialMemberGroupExpression implements IPartialExpression {
94 115
 	
95 116
 	@Override
96 117
 	public IPartialExpression capture(CodePosition position, LambdaClosure closure) {
97
-		return new PartialMemberGroupExpression(position, target.capture(position, closure).eval(), group, typeArguments, allowStaticUsage);
118
+		return new PartialMemberGroupExpression(position, scope, target.capture(position, closure).eval(), group, typeArguments, allowStaticUsage);
98 119
 	}
99 120
 
100 121
 	@Override

+ 10
- 8
CodeModel/src/main/java/org/openzen/zenscript/codemodel/partial/PartialStaticMemberGroupExpression.java Vedi File

@@ -24,19 +24,21 @@ import org.openzen.zenscript.codemodel.type.member.TypeMemberPriority;
24 24
  * @author Hoofdgebruiker
25 25
  */
26 26
 public class PartialStaticMemberGroupExpression implements IPartialExpression {
27
-	public static PartialStaticMemberGroupExpression forMethod(CodePosition position, String name, ITypeID target, FunctionalMemberRef method, ITypeID[] typeArguments) {
27
+	public static PartialStaticMemberGroupExpression forMethod(CodePosition position, TypeScope scope, String name, ITypeID target, FunctionalMemberRef method, ITypeID[] typeArguments) {
28 28
 		DefinitionMemberGroup group = new DefinitionMemberGroup(true, name);
29 29
 		group.addMethod(method, TypeMemberPriority.SPECIFIED);
30
-		return new PartialStaticMemberGroupExpression(position, target, group, typeArguments);
30
+		return new PartialStaticMemberGroupExpression(position, scope, target, group, typeArguments);
31 31
 	}
32 32
 	
33 33
 	private final CodePosition position;
34
+	private final TypeScope scope;
34 35
 	private final ITypeID target;
35 36
 	private final DefinitionMemberGroup group;
36 37
 	private final ITypeID[] typeArguments;
37 38
 	
38
-	public PartialStaticMemberGroupExpression(CodePosition position, ITypeID target, DefinitionMemberGroup group, ITypeID[] typeArguments) {
39
+	public PartialStaticMemberGroupExpression(CodePosition position, TypeScope scope, ITypeID target, DefinitionMemberGroup group, ITypeID[] typeArguments) {
39 40
 		this.position = position;
41
+		this.scope = scope;
40 42
 		this.group = group;
41 43
 		this.target = target;
42 44
 		this.typeArguments = typeArguments;
@@ -44,7 +46,7 @@ public class PartialStaticMemberGroupExpression implements IPartialExpression {
44 46
 	
45 47
 	@Override
46 48
 	public Expression eval() {
47
-		return group.staticGetter(position);
49
+		return group.staticGetter(position, scope);
48 50
 	}
49 51
 
50 52
 	@Override
@@ -55,8 +57,8 @@ public class PartialStaticMemberGroupExpression implements IPartialExpression {
55 57
 	@Override
56 58
 	public List<FunctionHeader> getPossibleFunctionHeaders(TypeScope scope, List<ITypeID> hints, int arguments) {
57 59
 		return group.getMethodMembers().stream()
58
-				.filter(method -> method.member.header.parameters.length == arguments && method.member.isStatic())
59
-				.map(method -> method.member.header)
60
+				.filter(method -> method.member.getHeader().parameters.length == arguments && method.member.isStatic())
61
+				.map(method -> method.member.getHeader())
60 62
 				.collect(Collectors.toList());
61 63
 	}
62 64
 
@@ -83,9 +85,9 @@ public class PartialStaticMemberGroupExpression implements IPartialExpression {
83 85
 	@Override
84 86
 	public List<ITypeID> getAssignHints() {
85 87
 		if (group.getSetter() != null)
86
-			return Collections.singletonList(group.getSetter().type);
88
+			return Collections.singletonList(group.getSetter().getType());
87 89
 		if (group.getField() != null)
88
-			return Collections.singletonList(group.getField().type);
90
+			return Collections.singletonList(group.getField().getType());
89 91
 		
90 92
 		return Collections.emptyList();
91 93
 	}

+ 3
- 3
CodeModel/src/main/java/org/openzen/zenscript/codemodel/partial/PartialTypeExpression.java Vedi File

@@ -49,14 +49,14 @@ public class PartialTypeExpression implements IPartialExpression {
49 49
 		return scope.getTypeMembers(type)
50 50
 				.getOrCreateGroup(OperatorType.CALL)
51 51
 				.getMethodMembers().stream()
52
-				.filter(method -> method.member.header.parameters.length == arguments && method.member.isStatic())
53
-				.map(method -> method.member.header)
52
+				.filter(method -> method.member.getHeader().parameters.length == arguments && method.member.isStatic())
53
+				.map(method -> method.member.getHeader())
54 54
 				.collect(Collectors.toList());
55 55
 	}
56 56
 
57 57
 	@Override
58 58
 	public IPartialExpression getMember(CodePosition position, TypeScope scope, List<ITypeID> hints, GenericName name) {
59
-		return scope.getTypeMembers(type).getStaticMemberExpression(position, name);
59
+		return scope.getTypeMembers(type).getStaticMemberExpression(position, scope, name);
60 60
 	}
61 61
 
62 62
 	@Override

+ 1
- 4
CodeModel/src/main/java/org/openzen/zenscript/codemodel/scope/BaseScope.java Vedi File

@@ -15,6 +15,7 @@ import org.openzen.zenscript.codemodel.statement.LoopStatement;
15 15
 import org.openzen.zenscript.codemodel.type.GenericName;
16 16
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
17 17
 import org.openzen.zenscript.codemodel.type.ITypeID;
18
+import org.openzen.zenscript.codemodel.type.member.TypeMemberPreparer;
18 19
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
19 20
 
20 21
 /**
@@ -24,14 +25,10 @@ import org.openzen.zenscript.codemodel.type.member.TypeMembers;
24 25
 public abstract class BaseScope implements TypeScope {
25 26
 	public abstract IPartialExpression get(CodePosition position, GenericName name);
26 27
 	
27
-	public abstract ITypeID getType(CodePosition position, List<GenericName> name);
28
-	
29 28
 	public abstract LoopStatement getLoop(String name);
30 29
 	
31 30
 	public abstract FunctionHeader getFunctionHeader();
32 31
 	
33
-	public abstract ITypeID getThisType();
34
-	
35 32
 	@Override
36 33
 	public TypeMembers getTypeMembers(ITypeID type) {
37 34
 		return getMemberCache().get(type);

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/scope/BlockScope.java Vedi File

@@ -16,6 +16,7 @@ import org.openzen.zenscript.codemodel.statement.LoopStatement;
16 16
 import org.openzen.zenscript.codemodel.type.GenericName;
17 17
 import org.openzen.zenscript.codemodel.type.ITypeID;
18 18
 import org.openzen.zenscript.codemodel.type.member.LocalMemberCache;
19
+import org.openzen.zenscript.codemodel.type.member.TypeMemberPreparer;
19 20
 
20 21
 /**
21 22
  *
@@ -76,4 +77,9 @@ public class BlockScope extends StatementScope {
76 77
 	public AnnotationDefinition getAnnotation(String name) {
77 78
 		return parent.getAnnotation(name);
78 79
 	}
80
+
81
+	@Override
82
+	public TypeMemberPreparer getPreparer() {
83
+		return parent.getPreparer();
84
+	}
79 85
 }

+ 97
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/scope/CompileTypeScope.java Vedi File

@@ -0,0 +1,97 @@
1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.codemodel.scope;
7
+
8
+import java.util.HashMap;
9
+import java.util.List;
10
+import java.util.Map;
11
+import java.util.function.Function;
12
+import org.openzen.zencode.shared.CodePosition;
13
+import org.openzen.zenscript.codemodel.FunctionHeader;
14
+import org.openzen.zenscript.codemodel.annotations.AnnotationDefinition;
15
+import org.openzen.zenscript.codemodel.expression.Expression;
16
+import org.openzen.zenscript.codemodel.generic.TypeParameter;
17
+import org.openzen.zenscript.codemodel.partial.IPartialExpression;
18
+import org.openzen.zenscript.codemodel.partial.PartialTypeExpression;
19
+import org.openzen.zenscript.codemodel.statement.LoopStatement;
20
+import org.openzen.zenscript.codemodel.type.GenericName;
21
+import org.openzen.zenscript.codemodel.type.ITypeID;
22
+import org.openzen.zenscript.codemodel.type.member.LocalMemberCache;
23
+import org.openzen.zenscript.codemodel.type.member.TypeMemberPreparer;
24
+
25
+/**
26
+ *
27
+ * @author Hoofdgebruiker
28
+ */
29
+public class CompileTypeScope extends BaseScope {
30
+	private final BaseScope outer;
31
+	private final Map<String, TypeParameter> typeParameters = new HashMap<>();
32
+
33
+	public CompileTypeScope(BaseScope outer, TypeParameter[] parameters) {
34
+		this.outer = outer;
35
+
36
+		if (parameters != null)
37
+			for (TypeParameter parameter : parameters)
38
+				typeParameters.put(parameter.name, parameter);
39
+	}
40
+
41
+	@Override
42
+	public LocalMemberCache getMemberCache() {
43
+		return outer.getMemberCache();
44
+	}
45
+
46
+	@Override
47
+	public IPartialExpression get(CodePosition position, GenericName name) {
48
+		if (typeParameters.containsKey(name.name) && !name.hasArguments())
49
+			return new PartialTypeExpression(position, getTypeRegistry().getGeneric(typeParameters.get(name.name)), name.arguments);
50
+
51
+		return outer.get(position, name);
52
+	}
53
+
54
+	@Override
55
+	public ITypeID getType(CodePosition position, List<GenericName> name) {
56
+		if (typeParameters.containsKey(name.get(0).name) && name.size() == 1 && !name.get(0).hasArguments()) {
57
+			return getTypeRegistry().getGeneric(typeParameters.get(name.get(0).name));
58
+		}
59
+
60
+		return outer.getType(position, name);
61
+	}
62
+
63
+	@Override
64
+	public LoopStatement getLoop(String name) {
65
+		return null;
66
+	}
67
+
68
+	@Override
69
+	public FunctionHeader getFunctionHeader() {
70
+		return null;
71
+	}
72
+
73
+	@Override
74
+	public ITypeID getThisType() {
75
+		throw new UnsupportedOperationException("Not available at this stage");
76
+	}
77
+
78
+	@Override
79
+	public Function<CodePosition, Expression> getDollar() {
80
+		return outer.getDollar();
81
+	}
82
+
83
+	@Override
84
+	public IPartialExpression getOuterInstance(CodePosition position) {
85
+		return null;
86
+	}
87
+
88
+	@Override
89
+	public AnnotationDefinition getAnnotation(String name) {
90
+		return outer.getAnnotation(name);
91
+	}
92
+
93
+	@Override
94
+	public TypeMemberPreparer getPreparer() {
95
+		return outer.getPreparer();
96
+	}
97
+}

+ 7
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/scope/DefinitionScope.java Vedi File

@@ -28,6 +28,7 @@ import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
28 28
 import org.openzen.zenscript.codemodel.type.GenericName;
29 29
 import org.openzen.zenscript.codemodel.type.ITypeID;
30 30
 import org.openzen.zenscript.codemodel.type.member.LocalMemberCache;
31
+import org.openzen.zenscript.codemodel.type.member.TypeMemberPreparer;
31 32
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
32 33
 
33 34
 /**
@@ -87,7 +88,7 @@ public class DefinitionScope extends BaseScope {
87 88
 			if (members.hasInnerType(name.name))
88 89
 				return new PartialTypeExpression(position, members.getInnerType(position, name), name.arguments);
89 90
 			if (members.hasMember(name.name) && !name.hasArguments())
90
-				return members.getMemberExpression(position, new ThisExpression(position, type), name, true);
91
+				return members.getMemberExpression(position, this, new ThisExpression(position, type), name, true);
91 92
 		} else if (innerTypes.containsKey(name.name)) {
92 93
 			return new PartialTypeExpression(position, getTypeRegistry().getForDefinition(innerTypes.get(name).get(), name.arguments), name.arguments);
93 94
 		}
@@ -154,4 +155,9 @@ public class DefinitionScope extends BaseScope {
154 155
 	public AnnotationDefinition getAnnotation(String name) {
155 156
 		return outer.getAnnotation(name);
156 157
 	}
158
+
159
+	@Override
160
+	public TypeMemberPreparer getPreparer() {
161
+		return outer.getPreparer();
162
+	}
157 163
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/scope/ExpressionScope.java Vedi File

@@ -22,6 +22,7 @@ import org.openzen.zenscript.codemodel.statement.VarStatement;
22 22
 import org.openzen.zenscript.codemodel.type.GenericName;
23 23
 import org.openzen.zenscript.codemodel.type.ITypeID;
24 24
 import org.openzen.zenscript.codemodel.type.member.LocalMemberCache;
25
+import org.openzen.zenscript.codemodel.type.member.TypeMemberPreparer;
25 26
 
26 27
 /**
27 28
  *
@@ -158,4 +159,9 @@ public class ExpressionScope extends BaseScope {
158 159
 	public AnnotationDefinition getAnnotation(String name) {
159 160
 		return outer.getAnnotation(name);
160 161
 	}
162
+
163
+	@Override
164
+	public TypeMemberPreparer getPreparer() {
165
+		return outer.getPreparer();
166
+	}
161 167
 }

+ 30
- 64
CodeModel/src/main/java/org/openzen/zenscript/codemodel/scope/FileScope.java Vedi File

@@ -5,7 +5,7 @@
5 5
  */
6 6
 package org.openzen.zenscript.codemodel.scope;
7 7
 
8
-import java.util.HashMap;
8
+import java.util.Collections;
9 9
 import java.util.List;
10 10
 import java.util.Map;
11 11
 import java.util.function.Function;
@@ -14,107 +14,68 @@ import org.openzen.zencode.shared.CompileException;
14 14
 import org.openzen.zencode.shared.CompileExceptionCode;
15 15
 import org.openzen.zenscript.codemodel.annotations.AnnotationDefinition;
16 16
 import org.openzen.zenscript.codemodel.FunctionHeader;
17
-import org.openzen.zenscript.codemodel.HighLevelDefinition;
18
-import org.openzen.zenscript.codemodel.PackageDefinitions;
17
+import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
19 18
 import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
20
-import org.openzen.zenscript.codemodel.definition.ZSPackage;
21 19
 import org.openzen.zenscript.codemodel.expression.Expression;
22 20
 import org.openzen.zenscript.codemodel.partial.IPartialExpression;
23 21
 import org.openzen.zenscript.codemodel.partial.PartialGlobalExpression;
24 22
 import org.openzen.zenscript.codemodel.partial.PartialTypeExpression;
25 23
 import org.openzen.zenscript.codemodel.statement.LoopStatement;
26
-import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
27 24
 import org.openzen.zenscript.codemodel.type.GenericName;
28
-import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
29 25
 import org.openzen.zenscript.codemodel.type.ISymbol;
30 26
 import org.openzen.zenscript.codemodel.type.ITypeID;
31 27
 import org.openzen.zenscript.codemodel.type.member.LocalMemberCache;
28
+import org.openzen.zenscript.codemodel.type.member.TypeMemberPreparer;
32 29
 
33 30
 /**
34 31
  *
35 32
  * @author Hoofdgebruiker
36 33
  */
37 34
 public class FileScope extends BaseScope {
35
+	private final TypeResolutionContext context;
38 36
 	private final LocalMemberCache memberCache;
39
-	private final ZSPackage rootPackage;
40
-	private final PackageDefinitions packageDefinitions;
41
-	private final GlobalTypeRegistry globalRegistry;
42
-	private final Map<String, HighLevelDefinition> importedTypes = new HashMap<>();
43
-	private final Map<String, ISymbol> globalSymbols;
44
-	private final Map<String, AnnotationDefinition> annotations = new HashMap<>();
37
+	private final Map<String, ISymbol> globals;
38
+	private final TypeMemberPreparer preparer;
45 39
 	
46 40
 	public FileScope(
47
-			ZSPackage rootPackage,
48
-			PackageDefinitions packageDefinitions,
49
-			GlobalTypeRegistry globalRegistry,
41
+			TypeResolutionContext context,
50 42
 			List<ExpansionDefinition> expansions,
51
-			Map<String, ISymbol> globalSymbols,
52
-			List<AnnotationDefinition> annotations) {
53
-		this.rootPackage = rootPackage;
54
-		this.packageDefinitions = packageDefinitions;
55
-		this.globalRegistry = globalRegistry;
56
-		this.globalSymbols = globalSymbols;
43
+			Map<String, ISymbol> globals,
44
+			TypeMemberPreparer preparer) {
45
+		this.context = context;
46
+		this.globals = globals;
47
+		this.preparer = preparer;
57 48
 		
58
-		memberCache = new LocalMemberCache(globalRegistry, expansions);
59
-		
60
-		for (AnnotationDefinition annotation : annotations) {
61
-			this.annotations.put(annotation.getAnnotationName(), annotation);
62
-		}
49
+		memberCache = new LocalMemberCache(context.getTypeRegistry(), expansions);
63 50
 	}
64 51
 	
65 52
 	@Override
66 53
 	public LocalMemberCache getMemberCache() {
67 54
 		return memberCache;
68 55
 	}
69
-	
70
-	public void register(String name, HighLevelDefinition type) {
71
-		importedTypes.put(name, type);
72
-	}
73 56
 
74 57
 	@Override
75 58
 	public IPartialExpression get(CodePosition position, GenericName name) {
76
-		if (importedTypes.containsKey(name.name))
77
-			return new PartialTypeExpression(position, getTypeRegistry().getForDefinition(importedTypes.get(name.name), name.arguments), name.arguments);
78
-		
79
-		HighLevelDefinition localDefinition = packageDefinitions.getDefinition(name.name);
80
-		if (localDefinition != null)
81
-			return new PartialTypeExpression(position, globalRegistry.getForDefinition(localDefinition, name.arguments), name.arguments);
59
+		ITypeID type = context.getType(position, Collections.singletonList(name));
60
+		if (type != null)
61
+			return new PartialTypeExpression(position, type, name.arguments);
82 62
 		
83
-		if (globalSymbols.containsKey(name.name)) {
84
-			IPartialExpression resolution = globalSymbols.get(name.name).getExpression(position, globalRegistry, name.arguments);
63
+		if (globals.containsKey(name.name)) {
64
+			IPartialExpression resolution = globals.get(name.name).getExpression(position, this, name.arguments);
85 65
 			return new PartialGlobalExpression(position, name.name, resolution, name.arguments);
86 66
 		}
87 67
 		
88
-		return rootPackage.getMember(position, globalRegistry, name);
68
+		return null;
89 69
 	}
90 70
 
91 71
 	@Override
92 72
 	public ITypeID getType(CodePosition position, List<GenericName> name) {
93
-		if (importedTypes.containsKey(name.get(0).name)) {
94
-			HighLevelDefinition definition = importedTypes.get(name.get(0).name);
95
-			ITypeID type = getTypeRegistry().getForDefinition(definition, name.get(0).arguments);
96
-			for (int i = 1; i < name.size(); i++)
97
-				type = getTypeMembers(type).getInnerType(position, name.get(i));
73
+		ITypeID type = context.getType(position, name);
74
+		if (type != null)
98 75
 			return type;
99
-		}
100 76
 		
101
-		HighLevelDefinition localDefinition = packageDefinitions.getDefinition(name.get(0).name);
102
-		if (localDefinition != null) {
103
-			DefinitionTypeID type = globalRegistry.getForDefinition(localDefinition, name.get(0).arguments);
104
-			for (int i = 1; i < name.size(); i++) {
105
-				type = getTypeMembers(type).getInnerType(position, name.get(i));
106
-				if (type == null)
107
-					break;
108
-			}
109
-			
110
-			// TODO: take care of non-static inner classes in generic classes!
111
-			if (type != null && name.get(name.size() - 1).getNumberOfArguments() != type.definition.getNumberOfGenericParameters())
112
-				throw new CompileException(position, CompileExceptionCode.TYPE_ARGUMENTS_INVALID_NUMBER, "Invalid number of type arguments");
113
-			
114
-			if (type != null)
115
-				return type;
116
-		} else if (globalSymbols.containsKey(name.get(0).name)) {
117
-			ITypeID type = globalSymbols.get(name.get(0).name).getType(position, globalRegistry, name.get(0).arguments);
77
+		if (globals.containsKey(name.get(0).name)) {
78
+			type = globals.get(name.get(0).name).getType(position, context, name.get(0).arguments);
118 79
 			for (int i = 1; i < name.size(); i++) {
119 80
 				type = getTypeMembers(type).getInnerType(position, name.get(i));
120 81
 				if (type == null)
@@ -125,7 +86,7 @@ public class FileScope extends BaseScope {
125 86
 				return type;
126 87
 		}
127 88
 		
128
-		return rootPackage.getType(position, this, name);
89
+		return null;
129 90
 	}
130 91
 
131 92
 	@Override
@@ -155,6 +116,11 @@ public class FileScope extends BaseScope {
155 116
 
156 117
 	@Override
157 118
 	public AnnotationDefinition getAnnotation(String name) {
158
-		return annotations.get(name);
119
+		return context.getAnnotation(name);
120
+	}
121
+
122
+	@Override
123
+	public TypeMemberPreparer getPreparer() {
124
+		return preparer;
159 125
 	}
160 126
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/scope/ForeachScope.java Vedi File

@@ -19,6 +19,7 @@ import org.openzen.zenscript.codemodel.statement.VarStatement;
19 19
 import org.openzen.zenscript.codemodel.type.GenericName;
20 20
 import org.openzen.zenscript.codemodel.type.ITypeID;
21 21
 import org.openzen.zenscript.codemodel.type.member.LocalMemberCache;
22
+import org.openzen.zenscript.codemodel.type.member.TypeMemberPreparer;
22 23
 
23 24
 /**
24 25
  *
@@ -96,4 +97,9 @@ public class ForeachScope extends StatementScope {
96 97
 	public AnnotationDefinition getAnnotation(String name) {
97 98
 		return outer.getAnnotation(name);
98 99
 	}
100
+
101
+	@Override
102
+	public TypeMemberPreparer getPreparer() {
103
+		return outer.getPreparer();
104
+	}
99 105
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/scope/FunctionScope.java Vedi File

@@ -20,6 +20,7 @@ import org.openzen.zenscript.codemodel.statement.LoopStatement;
20 20
 import org.openzen.zenscript.codemodel.type.GenericName;
21 21
 import org.openzen.zenscript.codemodel.type.ITypeID;
22 22
 import org.openzen.zenscript.codemodel.type.member.LocalMemberCache;
23
+import org.openzen.zenscript.codemodel.type.member.TypeMemberPreparer;
23 24
 
24 25
 /**
25 26
  *
@@ -110,4 +111,9 @@ public class FunctionScope extends StatementScope {
110 111
 	public AnnotationDefinition getAnnotation(String name) {
111 112
 		return outer.getAnnotation(name);
112 113
 	}
114
+
115
+	@Override
116
+	public TypeMemberPreparer getPreparer() {
117
+		return outer.getPreparer();
118
+	}
113 119
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/scope/GenericFunctionScope.java Vedi File

@@ -20,6 +20,7 @@ import org.openzen.zenscript.codemodel.statement.LoopStatement;
20 20
 import org.openzen.zenscript.codemodel.type.GenericName;
21 21
 import org.openzen.zenscript.codemodel.type.ITypeID;
22 22
 import org.openzen.zenscript.codemodel.type.member.LocalMemberCache;
23
+import org.openzen.zenscript.codemodel.type.member.TypeMemberPreparer;
23 24
 
24 25
 /**
25 26
  *
@@ -87,4 +88,9 @@ public class GenericFunctionScope extends BaseScope {
87 88
 	public AnnotationDefinition getAnnotation(String name) {
88 89
 		return outer.getAnnotation(name);
89 90
 	}
91
+
92
+	@Override
93
+	public TypeMemberPreparer getPreparer() {
94
+		return outer.getPreparer();
95
+	}
90 96
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/scope/GlobalScriptScope.java Vedi File

@@ -16,6 +16,7 @@ import org.openzen.zenscript.codemodel.statement.LoopStatement;
16 16
 import org.openzen.zenscript.codemodel.type.GenericName;
17 17
 import org.openzen.zenscript.codemodel.type.ITypeID;
18 18
 import org.openzen.zenscript.codemodel.type.member.LocalMemberCache;
19
+import org.openzen.zenscript.codemodel.type.member.TypeMemberPreparer;
19 20
 
20 21
 /**
21 22
  *
@@ -76,4 +77,9 @@ public class GlobalScriptScope extends StatementScope {
76 77
 	public AnnotationDefinition getAnnotation(String name) {
77 78
 		return file.getAnnotation(name);
78 79
 	}
80
+
81
+	@Override
82
+	public TypeMemberPreparer getPreparer() {
83
+		return file.getPreparer();
84
+	}
79 85
 }

+ 10
- 4
CodeModel/src/main/java/org/openzen/zenscript/codemodel/scope/ImplementationScope.java Vedi File

@@ -22,6 +22,7 @@ import org.openzen.zenscript.codemodel.statement.LoopStatement;
22 22
 import org.openzen.zenscript.codemodel.type.GenericName;
23 23
 import org.openzen.zenscript.codemodel.type.ITypeID;
24 24
 import org.openzen.zenscript.codemodel.type.member.LocalMemberCache;
25
+import org.openzen.zenscript.codemodel.type.member.TypeMemberPreparer;
25 26
 import org.openzen.zenscript.codemodel.type.member.TypeMemberPriority;
26 27
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
27 28
 
@@ -38,13 +39,13 @@ public class ImplementationScope extends BaseScope {
38 39
 		this.outer = outer;
39 40
 		this.implementation = implementation;
40 41
 		
41
-		TypeMembers interfaceMembers = outer.getMemberCache().get(implementation.type);
42
-		members = new TypeMembers(outer.getMemberCache(), implementation.type);
42
+		members = outer.getTypeMembers(implementation.type);
43
+		/*members = new TypeMembers(outer.getMemberCache(), implementation.type);
43 44
 		interfaceMembers.copyMembersTo(implementation.position, interfaceMembers, TypeMemberPriority.INHERITED);
44 45
 		
45 46
 		for (IDefinitionMember member : implementation.members) {
46 47
 			member.registerTo(members, TypeMemberPriority.SPECIFIED, new GenericMapper(outer.getTypeRegistry(), Collections.emptyMap()));
47
-		}
48
+		}*/
48 49
 	}
49 50
 
50 51
 	@Override
@@ -57,7 +58,7 @@ public class ImplementationScope extends BaseScope {
57 58
 		if (members.hasInnerType(name.name))
58 59
 			return new PartialTypeExpression(position, members.getInnerType(position, name), name.arguments);
59 60
 		if (members.hasMember(name.name))
60
-			return members.getMemberExpression(position, new ThisExpression(position, outer.getThisType()), name, true);
61
+			return members.getMemberExpression(position, this, new ThisExpression(position, outer.getThisType()), name, true);
61 62
 		
62 63
 		return outer.get(position, name);
63 64
 	}
@@ -104,4 +105,9 @@ public class ImplementationScope extends BaseScope {
104 105
 	public AnnotationDefinition getAnnotation(String name) {
105 106
 		return outer.getAnnotation(name);
106 107
 	}
108
+
109
+	@Override
110
+	public TypeMemberPreparer getPreparer() {
111
+		return outer.getPreparer();
112
+	}
107 113
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/scope/LambdaScope.java Vedi File

@@ -19,6 +19,7 @@ import org.openzen.zenscript.codemodel.statement.LoopStatement;
19 19
 import org.openzen.zenscript.codemodel.type.GenericName;
20 20
 import org.openzen.zenscript.codemodel.type.ITypeID;
21 21
 import org.openzen.zenscript.codemodel.type.member.LocalMemberCache;
22
+import org.openzen.zenscript.codemodel.type.member.TypeMemberPreparer;
22 23
 
23 24
 /**
24 25
  *
@@ -95,4 +96,9 @@ public class LambdaScope extends StatementScope {
95 96
 	public AnnotationDefinition getAnnotation(String name) {
96 97
 		return outer.getAnnotation(name);
97 98
 	}
99
+
100
+	@Override
101
+	public TypeMemberPreparer getPreparer() {
102
+		return outer.getPreparer();
103
+	}
98 104
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/scope/LoopScope.java Vedi File

@@ -16,6 +16,7 @@ import org.openzen.zenscript.codemodel.statement.LoopStatement;
16 16
 import org.openzen.zenscript.codemodel.type.GenericName;
17 17
 import org.openzen.zenscript.codemodel.type.ITypeID;
18 18
 import org.openzen.zenscript.codemodel.type.member.LocalMemberCache;
19
+import org.openzen.zenscript.codemodel.type.member.TypeMemberPreparer;
19 20
 
20 21
 /**
21 22
  *
@@ -84,4 +85,9 @@ public class LoopScope extends StatementScope {
84 85
 	public AnnotationDefinition getAnnotation(String name) {
85 86
 		return outer.getAnnotation(name);
86 87
 	}
88
+
89
+	@Override
90
+	public TypeMemberPreparer getPreparer() {
91
+		return outer.getPreparer();
92
+	}
87 93
 }

+ 1
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/scope/StatementScope.java Vedi File

@@ -12,6 +12,7 @@ import org.openzen.zenscript.codemodel.expression.GetLocalVariableExpression;
12 12
 import org.openzen.zenscript.codemodel.partial.IPartialExpression;
13 13
 import org.openzen.zenscript.codemodel.statement.VarStatement;
14 14
 import org.openzen.zenscript.codemodel.type.GenericName;
15
+import org.openzen.zenscript.codemodel.type.member.TypeMemberPreparer;
15 16
 
16 17
 /**
17 18
  *

+ 5
- 3
CodeModel/src/main/java/org/openzen/zenscript/codemodel/scope/TypeScope.java Vedi File

@@ -5,26 +5,28 @@
5 5
  */
6 6
 package org.openzen.zenscript.codemodel.scope;
7 7
 
8
-import org.openzen.zenscript.codemodel.annotations.AnnotationDefinition;
8
+import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
9 9
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
10 10
 import org.openzen.zenscript.codemodel.type.ITypeID;
11 11
 import org.openzen.zenscript.codemodel.type.member.LocalMemberCache;
12
+import org.openzen.zenscript.codemodel.type.member.TypeMemberPreparer;
12 13
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
13 14
 
14 15
 /**
15 16
  *
16 17
  * @author Hoofdgebruiker
17 18
  */
18
-public interface TypeScope {
19
+public interface TypeScope extends TypeResolutionContext {
19 20
 	public LocalMemberCache getMemberCache();
20 21
 	
21 22
 	default TypeMembers getTypeMembers(ITypeID type) {
22 23
 		return getMemberCache().get(type);
23 24
 	}
24 25
 	
26
+	@Override
25 27
 	default GlobalTypeRegistry getTypeRegistry() {
26 28
 		return getMemberCache().getRegistry();
27 29
 	}
28 30
 	
29
-	public AnnotationDefinition getAnnotation(String name);
31
+	TypeMemberPreparer getPreparer();
30 32
 }

+ 25
- 53
CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/DefinitionTypeID.java Vedi File

@@ -23,14 +23,12 @@ import org.openzen.zenscript.codemodel.generic.TypeParameter;
23 23
  */
24 24
 public class DefinitionTypeID implements ITypeID {
25 25
 	public static DefinitionTypeID forType(HighLevelDefinition definition) {
26
-		if (definition.genericParameters != null)
26
+		if (definition.genericParameters != null && definition.genericParameters.length > 0)
27 27
 			throw new IllegalArgumentException("Definition has type arguments!");
28 28
 		
29 29
 		return new DefinitionTypeID(null, definition, ITypeID.NONE);
30 30
 	}
31 31
 	
32
-	private static final OuterTypeEntry[] NO_OUTER_ENTRIES = new OuterTypeEntry[0];
33
-	
34 32
 	public final HighLevelDefinition definition;
35 33
 	public final ITypeID[] typeParameters;
36 34
 	public final DefinitionTypeID outer;
@@ -48,6 +46,10 @@ public class DefinitionTypeID implements ITypeID {
48 46
 			throw new NullPointerException("typeParameters cannot be null");
49 47
 		if (typeParameters.length != definition.getNumberOfGenericParameters())
50 48
 			throw new IllegalArgumentException("Wrong number of type parameters!");
49
+		if (definition.isInnerDefinition() && !definition.isStatic() && outer == null)
50
+			throw new IllegalArgumentException("Inner definition requires outer instance");
51
+		if ((!definition.isInnerDefinition() || definition.isStatic()) && outer != null)
52
+			throw new IllegalArgumentException("Static inner definition must not have outer instance");
51 53
 		
52 54
 		this.definition = definition;
53 55
 		this.typeParameters = typeParameters;
@@ -129,6 +131,8 @@ public class DefinitionTypeID implements ITypeID {
129 131
 	public DefinitionTypeID instance(GenericMapper mapper) {
130 132
 		if (!hasTypeParameters() && outer == null)
131 133
 			return this;
134
+		if (mapper.getMapping().isEmpty())
135
+			return this;
132 136
 		
133 137
 		ITypeID[] instancedArguments = ITypeID.NONE;
134 138
 		if (hasTypeParameters()) {
@@ -221,25 +225,27 @@ public class DefinitionTypeID implements ITypeID {
221 225
 		final DefinitionTypeID other = (DefinitionTypeID) obj;
222 226
 		return this.definition == other.definition
223 227
 				&& Arrays.deepEquals(this.typeParameters, other.typeParameters)
224
-				&& outer == this.outer;
228
+				&& Objects.equals(outer, this.outer);
225 229
 	}
226 230
 	
227 231
 	@Override
228 232
 	public String toString() {
229
-		if (!hasTypeParameters()) {
233
+		if (!hasTypeParameters() && outer == null)
230 234
 			return definition.name;
231
-		} else {
232
-			StringBuilder result = new StringBuilder();
233
-			result.append(definition.name);
234
-			result.append('<');
235
-			for (int i = 0; i < typeParameters.length; i++) { 
236
-				if (i > 0)
237
-					result.append(", ");
238
-				result.append(typeParameters[i].toString());
239
-			}
240
-			result.append('>');
241
-			return result.toString();
235
+		
236
+		StringBuilder result = new StringBuilder();
237
+		if (outer != null)
238
+			result.append(outer.toString()).append('.');
239
+		
240
+		result.append(definition.name);
241
+		result.append('<');
242
+		for (int i = 0; i < typeParameters.length; i++) { 
243
+			if (i > 0)
244
+				result.append(", ");
245
+			result.append(typeParameters[i].toString());
242 246
 		}
247
+		result.append('>');
248
+		return result.toString();
243 249
 	}
244 250
 
245 251
 	@Override
@@ -257,43 +263,9 @@ public class DefinitionTypeID implements ITypeID {
257 263
 	public boolean isDestructible() {
258 264
 		return definition.isDestructible();
259 265
 	}
260
-	
261
-	private class OuterTypeEntry {
262
-		private final TypeParameter parameter;
263
-		private final ITypeID type;
264
-		
265
-		public OuterTypeEntry(TypeParameter parameter, ITypeID type) {
266
-			this.parameter = parameter;
267
-			this.type = type;
268
-		}
269 266
 
270
-		@Override
271
-		public int hashCode() {
272
-			int hash = 3;
273
-			hash = 11 * hash + Objects.hashCode(this.parameter);
274
-			hash = 11 * hash + Objects.hashCode(this.type);
275
-			return hash;
276
-		}
277
-
278
-		@Override
279
-		public boolean equals(Object obj) {
280
-			if (this == obj) {
281
-				return true;
282
-			}
283
-			if (obj == null) {
284
-				return false;
285
-			}
286
-			if (getClass() != obj.getClass()) {
287
-				return false;
288
-			}
289
-			final OuterTypeEntry other = (OuterTypeEntry) obj;
290
-			if (!Objects.equals(this.parameter, other.parameter)) {
291
-				return false;
292
-			}
293
-			if (!Objects.equals(this.type, other.type)) {
294
-				return false;
295
-			}
296
-			return true;
297
-		}
267
+	public DefinitionTypeID getInnerType(GenericName name, GlobalTypeRegistry registry) {
268
+		HighLevelDefinition type = definition.getInnerType(name.name);
269
+		return registry.getForDefinition(type, name.arguments, this);
298 270
 	}
299 271
 }

+ 13
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/GenericName.java Vedi File

@@ -5,6 +5,8 @@
5 5
  */
6 6
 package org.openzen.zenscript.codemodel.type;
7 7
 
8
+import java.util.List;
9
+
8 10
 /**
9 11
  *
10 12
  * @author Hoofdgebruiker
@@ -37,6 +39,17 @@ public class GenericName {
37 39
 		return arguments.length == 0;
38 40
 	}
39 41
 	
42
+	public static ITypeID getInnerType(GlobalTypeRegistry registry, DefinitionTypeID type, List<GenericName> name, int index) {
43
+		while (index < name.size()) {
44
+			GenericName innerName = name.get(index++);
45
+			type = type.getInnerType(innerName, registry);
46
+			if (type == null)
47
+				return null;
48
+		}
49
+
50
+		return type;
51
+	}
52
+	
40 53
 	@Override
41 54
 	public String toString() {
42 55
 		StringBuilder result = new StringBuilder(name);

+ 1
- 4
CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/GlobalTypeRegistry.java Vedi File

@@ -5,15 +5,12 @@
5 5
  */
6 6
 package org.openzen.zenscript.codemodel.type;
7 7
 
8
-import java.util.Collections;
9 8
 import java.util.HashMap;
10 9
 import java.util.Map;
11 10
 import org.openzen.zenscript.codemodel.FunctionHeader;
12 11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
13
-import org.openzen.zenscript.codemodel.definition.FunctionDefinition;
14 12
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
15 13
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
16
-import org.openzen.zenscript.codemodel.type.member.TypeMembers;
17 14
 
18 15
 /**
19 16
  *
@@ -142,7 +139,7 @@ public class GlobalTypeRegistry {
142 139
 	}
143 140
 	
144 141
 	public ITypeID getOptional(ITypeID original) {
145
-		return getModified(TypeMembers.MODIFIER_OPTIONAL, original);
142
+		return getModified(ModifiedTypeID.MODIFIER_OPTIONAL, original);
146 143
 	}
147 144
 	
148 145
 	public ITypeID getModified(int modifiers, ITypeID type) {

+ 4
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/ISymbol.java Vedi File

@@ -6,14 +6,16 @@
6 6
 package org.openzen.zenscript.codemodel.type;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
9 10
 import org.openzen.zenscript.codemodel.partial.IPartialExpression;
11
+import org.openzen.zenscript.codemodel.scope.BaseScope;
10 12
 
11 13
 /**
12 14
  *
13 15
  * @author Hoofdgebruiker
14 16
  */
15 17
 public interface ISymbol {
16
-	public IPartialExpression getExpression(CodePosition position, GlobalTypeRegistry types, ITypeID[] typeArguments);
18
+	public IPartialExpression getExpression(CodePosition position, BaseScope scope, ITypeID[] typeArguments);
17 19
 	
18
-	public ITypeID getType(CodePosition position, GlobalTypeRegistry types, ITypeID[] typeArguments);
20
+	public ITypeID getType(CodePosition position, TypeResolutionContext context, ITypeID[] typeArguments);
19 21
 }

+ 18
- 6
CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/ITypeID.java Vedi File

@@ -29,16 +29,28 @@ public interface ITypeID {
29 29
 		return null;
30 30
 	}
31 31
 	
32
-	public boolean isOptional();
32
+	public default boolean isOptional() {
33
+		return false;
34
+	}
33 35
 	
34
-	public default ITypeID getOptionalBase() {
35
-		return this;
36
+	public default boolean isConst() {
37
+		return false;
36 38
 	}
37 39
 	
38
-	public boolean isConst();
40
+	public default boolean isImmutable() {
41
+		return false;
42
+	}
43
+	
44
+	public default ITypeID withoutOptional() {
45
+		throw new UnsupportedOperationException("Not an optional type");
46
+	}
47
+	
48
+	public default ITypeID withoutConst() {
49
+		throw new UnsupportedOperationException("Not a const type");
50
+	}
39 51
 	
40
-	public default ITypeID unwrap() {
41
-		return this;
52
+	public default ITypeID withoutImmutable() {
53
+		throw new UnsupportedOperationException("Not an immutable type");
42 54
 	}
43 55
 	
44 56
 	public boolean hasDefaultValue();

+ 38
- 9
CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/ModifiedTypeID.java Vedi File

@@ -10,20 +10,25 @@ import java.util.Objects;
10 10
 import org.openzen.zenscript.codemodel.GenericMapper;
11 11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12 12
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
13
-import org.openzen.zenscript.codemodel.type.member.TypeMembers;
14 13
 
15 14
 /**
16 15
  *
17 16
  * @author Hoofdgebruiker
18 17
  */
19 18
 public class ModifiedTypeID implements ITypeID {
19
+	public static final int MODIFIER_OPTIONAL = 1;
20
+	public static final int MODIFIER_CONST = 2;
21
+	public static final int MODIFIER_IMMUTABLE = 4;
22
+	
20 23
 	public final int modifiers;
21 24
 	public final ITypeID baseType;
22 25
 	private final ITypeID normalized;
26
+	private final GlobalTypeRegistry registry;
23 27
 	
24 28
 	public ModifiedTypeID(GlobalTypeRegistry registry, int modifiers, ITypeID baseType) {
25 29
 		this.modifiers = modifiers;
26 30
 		this.baseType = baseType;
31
+		this.registry = registry;
27 32
 		
28 33
 		normalized = baseType.getNormalized() == baseType ? this : registry.getModified(modifiers, baseType.getNormalized());
29 34
 	}
@@ -50,16 +55,32 @@ public class ModifiedTypeID implements ITypeID {
50 55
 
51 56
 	@Override
52 57
 	public boolean isOptional() {
53
-		return (modifiers & TypeMembers.MODIFIER_OPTIONAL) > 0;
58
+		return (modifiers & MODIFIER_OPTIONAL) > 0;
54 59
 	}
55 60
 	
61
+	@Override
56 62
 	public boolean isImmutable() {
57
-		return (modifiers & TypeMembers.MODIFIER_IMMUTABLE) > 0;
63
+		return (modifiers & MODIFIER_IMMUTABLE) > 0;
58 64
 	}
59 65
 
60 66
 	@Override
61 67
 	public boolean isConst() {
62
-		return (modifiers & TypeMembers.MODIFIER_CONST) > 0;
68
+		return (modifiers & MODIFIER_CONST) > 0;
69
+	}
70
+	
71
+	@Override
72
+	public ITypeID withoutOptional() {
73
+		return without(MODIFIER_OPTIONAL);
74
+	}
75
+	
76
+	@Override
77
+	public ITypeID withoutImmutable() {
78
+		return without(MODIFIER_IMMUTABLE);
79
+	}
80
+	
81
+	@Override
82
+	public ITypeID withoutConst() {
83
+		return without(MODIFIER_CONST);
63 84
 	}
64 85
 	
65 86
 	@Override
@@ -67,9 +88,9 @@ public class ModifiedTypeID implements ITypeID {
67 88
 		return baseType.isDefinition(definition);
68 89
 	}
69 90
 	
70
-	@Override
71
-	public ITypeID unwrap() {
72
-		return baseType;
91
+	private ITypeID without(int modifiers) {
92
+		int newModifiers = this.modifiers & ~modifiers;
93
+		return newModifiers == 0 ? baseType : registry.getModified(newModifiers, baseType);
73 94
 	}
74 95
 
75 96
 	@Override
@@ -84,7 +105,7 @@ public class ModifiedTypeID implements ITypeID {
84 105
 
85 106
 	@Override
86 107
 	public boolean hasDefaultValue() {
87
-		return baseType.hasDefaultValue();
108
+		return isOptional() || baseType.hasDefaultValue();
88 109
 	}
89 110
 
90 111
 	@Override
@@ -116,6 +137,14 @@ public class ModifiedTypeID implements ITypeID {
116 137
 	
117 138
 	@Override
118 139
 	public String toString() {
119
-		return "const " + baseType.toString();
140
+		StringBuilder result = new StringBuilder();
141
+		if ((modifiers & MODIFIER_IMMUTABLE) > 0)
142
+			result.append("immutable ");
143
+		if ((modifiers & MODIFIER_CONST) > 0)
144
+			result.append("const ");
145
+		result.append(baseType.toString());
146
+		if ((modifiers & MODIFIER_OPTIONAL) > 0)
147
+			result.append("?");
148
+		return result.toString();
120 149
 	}
121 150
 }

+ 6
- 4
CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/TypeSymbol.java Vedi File

@@ -7,8 +7,10 @@ package org.openzen.zenscript.codemodel.type;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
10
+import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
10 11
 import org.openzen.zenscript.codemodel.partial.IPartialExpression;
11 12
 import org.openzen.zenscript.codemodel.partial.PartialTypeExpression;
13
+import org.openzen.zenscript.codemodel.scope.BaseScope;
12 14
 
13 15
 /**
14 16
  *
@@ -22,12 +24,12 @@ public class TypeSymbol implements ISymbol {
22 24
 	}
23 25
 	
24 26
 	@Override
25
-	public IPartialExpression getExpression(CodePosition position, GlobalTypeRegistry types, ITypeID[] typeArguments) {
26
-		return new PartialTypeExpression(position, types.getForDefinition(definition, typeArguments), typeArguments);
27
+	public IPartialExpression getExpression(CodePosition position, BaseScope scope, ITypeID[] typeArguments) {
28
+		return new PartialTypeExpression(position, scope.getTypeRegistry().getForDefinition(definition, typeArguments), typeArguments);
27 29
 	}
28 30
 
29 31
 	@Override
30
-	public ITypeID getType(CodePosition position, GlobalTypeRegistry types, ITypeID[] typeArguments) {
31
-		return types.getForDefinition(definition, typeArguments);
32
+	public ITypeID getType(CodePosition position, TypeResolutionContext context, ITypeID[] typeArguments) {
33
+		return context.getTypeRegistry().getForDefinition(definition, typeArguments);
32 34
 	}
33 35
 }

+ 40
- 24
CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/member/DefinitionMemberGroup.java Vedi File

@@ -87,7 +87,7 @@ public class DefinitionMemberGroup {
87 87
 	
88 88
 	public FunctionalMemberRef getUnaryMethod() {
89 89
 		for (TypeMember<FunctionalMemberRef> method : methods)
90
-			if (method.member.header.parameters.length == 0)
90
+			if (method.member.getHeader().parameters.length == 0)
91 91
 				return method.member;
92 92
 		
93 93
 		return null;
@@ -99,7 +99,7 @@ public class DefinitionMemberGroup {
99 99
 	
100 100
 	public boolean hasMethod(FunctionHeader header) {
101 101
 		for (TypeMember<FunctionalMemberRef> method : methods) {
102
-			if (method.member.header.isEquivalentTo(header))
102
+			if (method.member.getHeader().isEquivalentTo(header))
103 103
 				return true;
104 104
 		}
105 105
 		
@@ -143,17 +143,17 @@ public class DefinitionMemberGroup {
143 143
 	}
144 144
 	
145 145
 	public void addMethod(FunctionalMemberRef method, TypeMemberPriority priority) {
146
-		for (int i = 0; i < methods.size(); i++) {
147
-			if (methods.get(i).member.header.isEquivalentTo(method.header)) {
146
+		/*for (int i = 0; i < methods.size(); i++) {
147
+			if (methods.get(i).member.getHeader().isEquivalentTo(method.getHeader())) {
148 148
 				methods.set(i, methods.get(i).resolve(new TypeMember<>(priority, method)));
149 149
 				return;
150 150
 			}
151
-		}
151
+		}*/
152 152
 		
153 153
 		methods.add(new TypeMember<>(priority, method));
154 154
 	}
155 155
 	
156
-	public Expression getter(CodePosition position, Expression target, boolean allowStaticUsage) {
156
+	public Expression getter(CodePosition position, TypeScope scope, Expression target, boolean allowStaticUsage) {
157 157
 		if (getter != null) {
158 158
 			if (getter.member.isStatic()) {
159 159
 				if (!allowStaticUsage)
@@ -162,6 +162,7 @@ public class DefinitionMemberGroup {
162 162
 				return getter.member.getStatic(position);
163 163
 			}
164 164
 			
165
+			scope.getPreparer().prepare(getter.member.member);
165 166
 			return getter.member.get(position, target);
166 167
 		} else if (field != null) {
167 168
 			if (field.member.isStatic()) {
@@ -171,6 +172,7 @@ public class DefinitionMemberGroup {
171 172
 				return new GetStaticFieldExpression(position, field.member);
172 173
 			}
173 174
 			
175
+			scope.getPreparer().prepare(field.member.member);
174 176
 			return new GetFieldExpression(position, target, field.member);
175 177
 		} else {
176 178
 			throw new CompileException(position, CompileExceptionCode.MEMBER_NO_GETTER, "Value is not a property");
@@ -183,10 +185,12 @@ public class DefinitionMemberGroup {
183 185
 				if (!allowStaticUsage)
184 186
 					throw new CompileException(position, CompileExceptionCode.USING_STATIC_ON_INSTANCE, "This field is static");
185 187
 				
186
-				return new StaticSetterExpression(position, setter.member, value.castImplicit(position, scope, setter.member.type));
188
+				scope.getPreparer().prepare(setter.member.member);
189
+				return new StaticSetterExpression(position, setter.member, value.castImplicit(position, scope, setter.member.getType()));
187 190
 			}
188 191
 			
189
-			return new SetterExpression(position, target, setter.member, value.castImplicit(position, scope, setter.member.type));
192
+			scope.getPreparer().prepare(setter.member.member);
193
+			return new SetterExpression(position, target, setter.member, value.castImplicit(position, scope, setter.member.getType()));
190 194
 		} else if (field != null) {
191 195
 			// TODO: perform proper checks on val fields
192 196
 			//if (field.isFinal)
@@ -195,27 +199,31 @@ public class DefinitionMemberGroup {
195 199
 				if (!allowStaticUsage)
196 200
 					throw new CompileException(position, CompileExceptionCode.USING_STATIC_ON_INSTANCE, "This field is static");
197 201
 				
198
-				return new SetStaticFieldExpression(position, field.member, value.castImplicit(position, scope, field.member.type));
202
+				scope.getPreparer().prepare(field.member.member);
203
+				return new SetStaticFieldExpression(position, field.member, value.castImplicit(position, scope, field.member.getType()));
199 204
 			}
200 205
 			
201
-			return new SetFieldExpression(position, target, field.member, value.castImplicit(position, scope, field.member.type));
206
+			scope.getPreparer().prepare(field.member.member);
207
+			return new SetFieldExpression(position, target, field.member, value.castImplicit(position, scope, field.member.getType()));
202 208
 		} else {
203 209
 			throw new CompileException(position, CompileExceptionCode.MEMBER_NO_SETTER, "Value is not settable");
204 210
 		}
205 211
 	}
206 212
 	
207
-	public Expression staticGetter(CodePosition position) {
213
+	public Expression staticGetter(CodePosition position, TypeScope scope) {
208 214
 		if (constant != null) {
209 215
 			return new ConstExpression(position, constant.member);
210 216
 		} else if (getter != null) {
211 217
 			if (!getter.member.isStatic())
212 218
 				throw new CompileException(position, CompileExceptionCode.MEMBER_NOT_STATIC, "This getter is not static");
213 219
 			
220
+			scope.getPreparer().prepare(getter.member.member);
214 221
 			return getter.member.getStatic(position);
215 222
 		} else if (field != null) {
216 223
 			if (!field.member.isStatic())
217 224
 				throw new CompileException(position, CompileExceptionCode.MEMBER_NOT_STATIC, "This field is not static");
218 225
 			
226
+			scope.getPreparer().prepare(field.member.member);
219 227
 			return new GetStaticFieldExpression(position, field.member);
220 228
 		} else {
221 229
 			throw new CompileException(position, CompileExceptionCode.MEMBER_NO_GETTER, "Member is not gettable");
@@ -227,14 +235,16 @@ public class DefinitionMemberGroup {
227 235
 			if (!getter.member.isStatic())
228 236
 				throw new CompileException(position, CompileExceptionCode.MEMBER_NOT_STATIC, "This getter is not static");
229 237
 			
230
-			return new StaticSetterExpression(position, setter.member, value.castImplicit(position, scope, setter.member.type));
238
+			scope.getPreparer().prepare(setter.member.member);
239
+			return new StaticSetterExpression(position, setter.member, value.castImplicit(position, scope, setter.member.getType()));
231 240
 		} else if (field != null) {
232 241
 			//if (field.member.isFinal)
233 242
 			//	throw new CompileException(position, CompileExceptionCode.MEMBER_IS_FINAL, "This field cannot be modified");
234 243
 			if (!field.member.isStatic())
235 244
 				throw new CompileException(position, CompileExceptionCode.MEMBER_NOT_STATIC, "This field is not static");
236 245
 			
237
-			return new SetStaticFieldExpression(position, field.member, value.castImplicit(position, scope, field.member.type));
246
+			scope.getPreparer().prepare(field.member.member);
247
+			return new SetStaticFieldExpression(position, field.member, value.castImplicit(position, scope, field.member.getType()));
238 248
 		} else {
239 249
 			throw new CompileException(position, CompileExceptionCode.MEMBER_NO_SETTER, "Member is not settable");
240 250
 		}
@@ -246,7 +256,7 @@ public class DefinitionMemberGroup {
246 256
 			result[i] = new ArrayList<>();
247 257
 		
248 258
 		for (TypeMember<FunctionalMemberRef> method : methods) {
249
-			FunctionHeader header = method.member.header;
259
+			FunctionHeader header = method.member.getHeader();
250 260
 			if (header.parameters.length != arguments)
251 261
 				continue;
252 262
 			
@@ -271,11 +281,12 @@ public class DefinitionMemberGroup {
271 281
 	
272 282
 	public Expression call(CodePosition position, TypeScope scope, Expression target, CallArguments arguments, boolean allowStaticUsage) {
273 283
 		FunctionalMemberRef method = selectMethod(position, scope, arguments, true, allowStaticUsage);
274
-		FunctionHeader instancedHeader = method.header.fillGenericArguments(scope.getTypeRegistry(), arguments.typeArguments);
284
+		FunctionHeader instancedHeader = method.getHeader().fillGenericArguments(scope.getTypeRegistry(), arguments.typeArguments);
275 285
 		for (int i = 0; i < arguments.arguments.length; i++) {
276 286
 			arguments.arguments[i] = arguments.arguments[i].castImplicit(position, scope, instancedHeader.parameters[i].type);
277 287
 		}
278 288
 		
289
+		scope.getPreparer().prepare(method.getTarget());
279 290
 		return method.call(position, target, instancedHeader, arguments, scope);
280 291
 	}
281 292
 	
@@ -287,7 +298,8 @@ public class DefinitionMemberGroup {
287 298
 		if (!method.isOperator()) {
288 299
 			throw new CompileException(position, CompileExceptionCode.NO_SUCH_MEMBER, "Member is not an operator");
289 300
 		}
290
-		return new PostCallExpression(position, target, method, method.header);
301
+		scope.getPreparer().prepare(method.getTarget());
302
+		return new PostCallExpression(position, target, method, method.getHeader());
291 303
 	}
292 304
 	
293 305
 	public Expression callWithComparator(
@@ -297,13 +309,13 @@ public class DefinitionMemberGroup {
297 309
 			CallArguments arguments,
298 310
 			CompareType compareType) {
299 311
 		FunctionalMemberRef method = selectMethod(position, scope, arguments, true, false);
300
-		FunctionHeader instancedHeader = method.header.fillGenericArguments(scope.getTypeRegistry(), arguments.typeArguments);
312
+		FunctionHeader instancedHeader = method.getHeader().fillGenericArguments(scope.getTypeRegistry(), arguments.typeArguments);
301 313
 		return method.callWithComparator(position, compareType, target, instancedHeader, arguments, scope);
302 314
 	}
303 315
 	
304 316
 	public Expression callStatic(CodePosition position, ITypeID target, TypeScope scope, CallArguments arguments) {
305 317
 		FunctionalMemberRef method = selectMethod(position, scope, arguments, false, true);
306
-		FunctionHeader instancedHeader = method.header.fillGenericArguments(scope.getTypeRegistry(), arguments.typeArguments);
318
+		FunctionHeader instancedHeader = method.getHeader().fillGenericArguments(scope.getTypeRegistry(), arguments.typeArguments);
307 319
 		return method.callStatic(position, target, instancedHeader, arguments, scope);
308 320
 	}
309 321
 	
@@ -313,7 +325,7 @@ public class DefinitionMemberGroup {
313 325
 			if (!(method.member.isStatic() ? allowStatic : allowNonStatic))
314 326
 				continue;
315 327
 			
316
-			FunctionHeader header = method.member.header;
328
+			FunctionHeader header = method.member.getHeader();
317 329
 			if (header.matchesExactly(arguments, scope))
318 330
 				return method.member;
319 331
 		}
@@ -323,15 +335,19 @@ public class DefinitionMemberGroup {
323 335
 		for (TypeMember<FunctionalMemberRef> method : methods) {
324 336
 			if (!(method.member.isStatic() ? allowStatic : allowNonStatic))
325 337
 				continue;
338
+			if (arguments.arguments.length < method.member.getHeader().minParameters || arguments.arguments.length > method.member.getHeader().maxParameters)
339
+				continue;
340
+			
341
+			scope.getPreparer().prepare(method.member.getTarget());
326 342
 			
327
-			FunctionHeader header = method.member.header;
343
+			FunctionHeader header = method.member.getHeader();
328 344
 			if (!header.matchesImplicitly(arguments, scope))
329 345
 				continue;
330 346
 			
331 347
 			if (selected != null) {
332 348
 				StringBuilder explanation = new StringBuilder();
333
-				explanation.append("Function A: ").append(selected.header.toString()).append("\n");
334
-				explanation.append("Function B: ").append(method.member.header.toString());
349
+				explanation.append("Function A: ").append(selected.getHeader().toString()).append("\n");
350
+				explanation.append("Function B: ").append(method.member.getHeader().toString());
335 351
 				throw new CompileException(position, CompileExceptionCode.CALL_AMBIGUOUS, "Ambiguous call; multiple methods match:\n" + explanation.toString());
336 352
 			}
337 353
 			
@@ -351,7 +367,7 @@ public class DefinitionMemberGroup {
351 367
 					continue;
352 368
 				}
353 369
 				
354
-				message.append(method.member.header.explainWhyIncompatible(scope, arguments)).append("\n");
370
+				message.append(method.member.getHeader().explainWhyIncompatible(scope, arguments)).append("\n");
355 371
 			}
356 372
 			
357 373
 			throw new CompileException(position, CompileExceptionCode.CALL_NO_VALID_METHOD, "No matching method found for " + name + ":\n" + message.toString());
@@ -363,7 +379,7 @@ public class DefinitionMemberGroup {
363 379
 	public FunctionalMemberRef getOverride(CodePosition position, TypeScope scope, FunctionalMember member) {
364 380
 		List<FunctionalMemberRef> candidates = new ArrayList<>();
365 381
 		for (TypeMember<FunctionalMemberRef> method : methods) {
366
-			if (member.header.canOverride(scope, method.member.header))
382
+			if (member.header.canOverride(scope, method.member.getHeader()))
367 383
 				candidates.add(method.member);
368 384
 		}
369 385
 		

+ 11
- 4
CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/member/TypeMemberBuilder.java Vedi File

@@ -73,6 +73,7 @@ import static org.openzen.zenscript.codemodel.type.member.BuiltinID.*;
73 73
 import static org.openzen.zencode.shared.CodePosition.BUILTIN;
74 74
 import org.openzen.zencode.shared.CompileException;
75 75
 import org.openzen.zencode.shared.CompileExceptionCode;
76
+import org.openzen.zenscript.codemodel.definition.InterfaceDefinition;
76 77
 
77 78
 /**
78 79
  *
@@ -108,8 +109,8 @@ public class TypeMemberBuilder implements ITypeVisitor<Void> {
108 109
 			DefinitionMemberGroup group = members.getOrCreateGroup(OperatorType.EQUALS);
109 110
 			DefinitionMemberGroup inverse = members.getOrCreateGroup(OperatorType.NOTEQUALS);
110 111
 			for (TypeMember<FunctionalMemberRef> method : group.getMethodMembers()) {
111
-				if (!inverse.hasMethod(method.member.header)) {
112
-					notequals(definition, BuiltinID.AUTOOP_NOTEQUALS, method.member.header.parameters[0].type);
112
+				if (!inverse.hasMethod(method.member.getHeader())) {
113
+					notequals(definition, BuiltinID.AUTOOP_NOTEQUALS, method.member.getHeader().parameters[0].type);
113 114
 				}
114 115
 			}
115 116
 		}
@@ -464,8 +465,14 @@ public class TypeMemberBuilder implements ITypeVisitor<Void> {
464 465
 			}
465 466
 		}
466 467
 		
468
+		if (definition instanceof InterfaceDefinition) {
469
+			InterfaceDefinition interfaceDefinition = (InterfaceDefinition)definition;
470
+			for (ITypeID baseType : interfaceDefinition.baseInterfaces)
471
+				cache.get(baseType.instance(mapper)).copyMembersTo(type.definition.position, members, TypeMemberPriority.INHERITED);
472
+		}
473
+		
467 474
 		if (type.superType != null) {
468
-			cache.get(type.superType).copyMembersTo(type.definition.position, members, TypeMemberPriority.INHERITED);
475
+			cache.get(type.superType.instance(mapper)).copyMembersTo(type.definition.position, members, TypeMemberPriority.INHERITED);
469 476
 		} else {
470 477
 			getter(definition, OBJECT_HASHCODE, "objectHashCode", BasicTypeID.INT);
471 478
 		}
@@ -1120,7 +1127,7 @@ public class TypeMemberBuilder implements ITypeVisitor<Void> {
1120 1127
 	
1121 1128
 	private void castedTargetCall(OperatorMember member, BuiltinID casterBuiltin) {
1122 1129
 		CasterMemberRef caster = castImplicitRef(member.definition, casterBuiltin, member.header.parameters[0].type);
1123
-		TranslatedOperatorMemberRef method = new TranslatedOperatorMemberRef(member, member.header, call -> member.ref(emptyMapper).call(call.position, caster.cast(call.position, call.target, true), call.arguments, call.scope));
1130
+		TranslatedOperatorMemberRef method = new TranslatedOperatorMemberRef(member, GenericMapper.EMPTY, call -> member.ref(emptyMapper).call(call.position, caster.cast(call.position, call.target, true), call.arguments, call.scope));
1124 1131
 		members.getOrCreateGroup(member.operator).addMethod(method, TypeMemberPriority.SPECIFIED);
1125 1132
 	}
1126 1133
 	

+ 16
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/member/TypeMemberPreparer.java Vedi File

@@ -0,0 +1,16 @@
1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.codemodel.type.member;
7
+
8
+import org.openzen.zenscript.codemodel.member.IDefinitionMember;
9
+
10
+/**
11
+ *
12
+ * @author Hoofdgebruiker
13
+ */
14
+public interface TypeMemberPreparer {
15
+	void prepare(IDefinitionMember member);
16
+}

+ 19
- 27
CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/member/TypeMembers.java Vedi File

@@ -23,10 +23,7 @@ import org.openzen.zenscript.codemodel.expression.NullExpression;
23 23
 import org.openzen.zenscript.codemodel.expression.SupertypeCastExpression;
24 24
 import org.openzen.zenscript.codemodel.expression.WrapOptionalExpression;
25 25
 import org.openzen.zenscript.codemodel.member.EnumConstantMember;
26
-import org.openzen.zenscript.codemodel.member.FunctionalMember;
27 26
 import org.openzen.zenscript.codemodel.member.InnerDefinition;
28
-import org.openzen.zenscript.codemodel.member.MethodMember;
29
-import org.openzen.zenscript.codemodel.member.OperatorMember;
30 27
 import org.openzen.zenscript.codemodel.member.ref.CasterMemberRef;
31 28
 import org.openzen.zenscript.codemodel.member.ref.ConstMemberRef;
32 29
 import org.openzen.zenscript.codemodel.member.ref.FieldMemberRef;
@@ -52,10 +49,6 @@ import org.openzen.zenscript.codemodel.scope.TypeScope;
52 49
  * @author Hoofdgebruiker
53 50
  */
54 51
 public final class TypeMembers {
55
-	public static final int MODIFIER_OPTIONAL = 1;
56
-	public static final int MODIFIER_CONST = 2;
57
-	public static final int MODIFIER_IMMUTABLE = 4;
58
-	
59 52
 	private final LocalMemberCache cache;
60 53
 	public final ITypeID type;
61 54
 	
@@ -72,6 +65,8 @@ public final class TypeMembers {
72 65
 	public TypeMembers(LocalMemberCache cache, ITypeID type) {
73 66
 		if (type == null)
74 67
 			throw new NullPointerException("Type must not be null!");
68
+		if (type == BasicTypeID.UNDETERMINED)
69
+			throw new IllegalArgumentException("Cannot retrieve members of undetermined type");
75 70
 		
76 71
 		this.cache = cache;
77 72
 		this.type = type;
@@ -295,13 +290,13 @@ public final class TypeMembers {
295 290
 		if (operator == CompareType.EQ) {
296 291
 			DefinitionMemberGroup equal = getOrCreateGroup(OperatorType.EQUALS);
297 292
 			for (TypeMember<FunctionalMemberRef> member : equal.getMethodMembers()) {
298
-				if (member.member.header.accepts(scope, right))
293
+				if (member.member.getHeader().accepts(scope, right))
299 294
 					return equal.call(position, scope, left, new CallArguments(right), false);
300 295
 			}
301 296
 		} else if (operator == CompareType.NE) {
302 297
 			DefinitionMemberGroup equal = getOrCreateGroup(OperatorType.NOTEQUALS);
303 298
 			for (TypeMember<FunctionalMemberRef> member : equal.getMethodMembers()) {
304
-				if (member.member.header.accepts(scope, right)) {
299
+				if (member.member.getHeader().accepts(scope, right)) {
305 300
 					return equal.call(position, scope, left, new CallArguments(right), false);
306 301
 				}
307 302
 			}
@@ -316,11 +311,6 @@ public final class TypeMembers {
316 311
 		return members.call(position, scope, value, new CallArguments(Expression.NONE), false);
317 312
 	}
318 313
 	
319
-	public Expression ternary(CodePosition position, TypeScope scope, OperatorType operator, Expression a, Expression b, Expression c) {
320
-		DefinitionMemberGroup members = getOrCreateGroup(operator);
321
-		return members.call(position, scope, a, new CallArguments(b, c), false);
322
-	}
323
-	
324 314
 	public IteratorMemberRef getIterator(int variables) {
325 315
 		for (TypeMember<IteratorMemberRef> iterator : iterators)
326 316
 			if (iterator.member.getLoopVariableCount() == variables)
@@ -343,14 +333,16 @@ public final class TypeMembers {
343 333
 			return true;
344 334
 		if (toType == null)
345 335
 			throw new NullPointerException();
336
+		if (toType == BasicTypeID.UNDETERMINED)
337
+			throw new IllegalArgumentException("Cannot cast to undetermined type!");
346 338
 		
347 339
 		if (type == BasicTypeID.NULL && toType.isOptional())
348 340
 			return true;
349
-		if (toType.isOptional() && canCastImplicit(toType.unwrap()))
341
+		if (toType.isOptional() && canCastImplicit(toType.withoutOptional()))
350 342
 			return true;
351
-		if (toType.isConst() && canCastImplicit(toType.unwrap()))
343
+		if (toType.isConst() && canCastImplicit(toType.withoutConst()))
352 344
 			return true;
353
-		if (type.isOptional() && type.unwrap() == toType)
345
+		if (type.isOptional() && type.withoutOptional() == toType)
354 346
 			return true;
355 347
 		
356 348
 		return getImplicitCaster(toType) != null || extendsOrImplements(toType);
@@ -398,11 +390,11 @@ public final class TypeMembers {
398 390
 		
399 391
 		if (type == BasicTypeID.NULL && toType.isOptional())
400 392
 			return new NullExpression(position, toType);
401
-		if (toType.isOptional() && canCastImplicit(toType.unwrap()))
402
-			return new WrapOptionalExpression(position, castImplicit(position, value, toType.unwrap(), implicit), toType);
403
-		if (toType.isConst() && canCastImplicit(toType.unwrap()))
404
-			return new MakeConstExpression(position, castImplicit(position, value, toType.unwrap(), implicit), toType);
405
-		if (type.isOptional() && type.unwrap() == toType)
393
+		if (toType.isOptional() && canCastImplicit(toType.withoutOptional()))
394
+			return new WrapOptionalExpression(position, castImplicit(position, value, toType.withoutOptional(), implicit), toType);
395
+		if (toType.isConst() && canCastImplicit(toType.withoutConst()))
396
+			return new MakeConstExpression(position, castImplicit(position, value, toType.withoutConst(), implicit), toType);
397
+		if (type.isOptional() && type.withoutOptional() == toType)
406 398
 			return new CheckNullExpression(position, value);
407 399
 		
408 400
 		for (TypeMember<CasterMemberRef> caster : casters) {
@@ -435,22 +427,22 @@ public final class TypeMembers {
435 427
 		return members.containsKey(name);
436 428
 	}
437 429
 	
438
-	public IPartialExpression getMemberExpression(CodePosition position, Expression target, GenericName name, boolean allowStatic) {
430
+	public IPartialExpression getMemberExpression(CodePosition position, TypeScope scope, Expression target, GenericName name, boolean allowStatic) {
439 431
 		if (members.containsKey(name.name)) {
440 432
 			DefinitionMemberGroup group = members.get(name.name);
441 433
 			
442 434
 			if (group.isStatic)
443
-				return new PartialStaticMemberGroupExpression(position, type, group, name.arguments);
435
+				return new PartialStaticMemberGroupExpression(position, scope, type, group, name.arguments);
444 436
 			else
445
-				return new PartialMemberGroupExpression(position, target, group, name.arguments, allowStatic);
437
+				return new PartialMemberGroupExpression(position, scope, target, group, name.arguments, allowStatic);
446 438
 		}
447 439
 		
448 440
 		return null;
449 441
 	}
450 442
 	
451
-	public IPartialExpression getStaticMemberExpression(CodePosition position, GenericName name) {
443
+	public IPartialExpression getStaticMemberExpression(CodePosition position, TypeScope scope, GenericName name) {
452 444
 		if (members.containsKey(name.name))
453
-			return new PartialStaticMemberGroupExpression(position, type, members.get(name.name), name.arguments);
445
+			return new PartialStaticMemberGroupExpression(position, scope, type, members.get(name.name), name.arguments);
454 446
 		if (innerTypes.containsKey(name.name))
455 447
 			return new PartialTypeExpression(position, innerTypes.get(name.name).instance(cache.getRegistry(), name.arguments, (DefinitionTypeID)type), name.arguments);
456 448
 		

+ 19
- 1
CompilerShared/src/main/java/org/openzen/zenscript/compiler/CompileScope.java Vedi File

@@ -8,12 +8,15 @@ package org.openzen.zenscript.compiler;
8 8
 import java.util.HashMap;
9 9
 import java.util.List;
10 10
 import java.util.Map;
11
+import org.openzen.zencode.shared.CodePosition;
11 12
 import org.openzen.zenscript.codemodel.annotations.AnnotationDefinition;
12 13
 import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
13 14
 import org.openzen.zenscript.codemodel.scope.TypeScope;
15
+import org.openzen.zenscript.codemodel.type.GenericName;
14 16
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
15 17
 import org.openzen.zenscript.codemodel.type.ITypeID;
16 18
 import org.openzen.zenscript.codemodel.type.member.LocalMemberCache;
19
+import org.openzen.zenscript.codemodel.type.member.TypeMemberPreparer;
17 20
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
18 21
 
19 22
 /**
@@ -26,7 +29,7 @@ public class CompileScope implements TypeScope {
26 29
 	private final LocalMemberCache cache;
27 30
 	private final Map<String, AnnotationDefinition> annotations = new HashMap<>();
28 31
 	
29
-	public CompileScope(GlobalTypeRegistry globalRegistry, List<ExpansionDefinition> expansions, List<AnnotationDefinition> annotations) {
32
+	public CompileScope(GlobalTypeRegistry globalRegistry, List<ExpansionDefinition> expansions, AnnotationDefinition[] annotations) {
30 33
 		this.globalRegistry = globalRegistry;
31 34
 		this.expansions = expansions;
32 35
 		this.cache = new LocalMemberCache(globalRegistry, expansions);
@@ -55,4 +58,19 @@ public class CompileScope implements TypeScope {
55 58
 	public AnnotationDefinition getAnnotation(String name) {
56 59
 		return annotations.get(name);
57 60
 	}
61
+
62
+	@Override
63
+	public ITypeID getType(CodePosition position, List<GenericName> name) {
64
+		throw new UnsupportedOperationException("Not supported yet.");
65
+	}
66
+	
67
+	@Override
68
+	public ITypeID getThisType() {
69
+		return null;
70
+	}
71
+
72
+	@Override
73
+	public TypeMemberPreparer getPreparer() {
74
+		return member -> {};
75
+	}
58 76
 }

+ 6
- 4
CompilerShared/src/main/java/org/openzen/zenscript/compiler/SemanticModule.java Vedi File

@@ -15,6 +15,7 @@ import org.openzen.zenscript.codemodel.HighLevelDefinition;
15 15
 import org.openzen.zenscript.codemodel.PackageDefinitions;
16 16
 import org.openzen.zenscript.codemodel.ScriptBlock;
17 17
 import org.openzen.zenscript.codemodel.annotations.AnnotationProcessor;
18
+import org.openzen.zenscript.codemodel.context.ModuleTypeResolutionContext;
18 19
 import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
19 20
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
20 21
 import org.openzen.zenscript.codemodel.scope.FileScope;
@@ -39,7 +40,7 @@ public class SemanticModule {
39 40
 	
40 41
 	public final CompilationUnit compilationUnit;
41 42
 	public final List<ExpansionDefinition> expansions;
42
-	public final List<AnnotationDefinition> annotations;
43
+	public final AnnotationDefinition[] annotations;
43 44
 	
44 45
 	public SemanticModule(
45 46
 			String name,
@@ -51,7 +52,7 @@ public class SemanticModule {
51 52
 			List<ScriptBlock> scripts,
52 53
 			CompilationUnit compilationUnit,
53 54
 			List<ExpansionDefinition> expansions,
54
-			List<AnnotationDefinition> annotations)
55
+			AnnotationDefinition[] annotations)
55 56
 	{
56 57
 		this.name = name;
57 58
 		this.dependencies = dependencies;
@@ -75,14 +76,15 @@ public class SemanticModule {
75 76
 		if (state != State.ASSEMBLED)
76 77
 			throw new IllegalStateException("Module is invalid");
77 78
 		
78
-		AnnotationProcessor annotationProcessor = new AnnotationProcessor(rootPackage, definitions, compilationUnit.globalTypeRegistry, expansions, annotations);
79
+		ModuleTypeResolutionContext context = new ModuleTypeResolutionContext(compilationUnit.globalTypeRegistry, annotations, rootPackage, null, globals);
80
+		AnnotationProcessor annotationProcessor = new AnnotationProcessor(context, expansions);
79 81
 		List<ScriptBlock> processedScripts = new ArrayList<>();
80 82
 		for (ScriptBlock block : scripts)
81 83
 			processedScripts.add(annotationProcessor.process(block));
82 84
 		for (HighLevelDefinition definition : definitions.getAll()) {
83 85
 			annotationProcessor.process(definition);
84 86
 			
85
-			FileScope fileScope = new FileScope(rootPackage, definitions, compilationUnit.globalTypeRegistry, expansions, new HashMap<>(), annotations);
87
+			FileScope fileScope = new FileScope(context, expansions, globals, member -> {});
86 88
 			definition.normalize(fileScope);
87 89
 		}
88 90
 		

+ 26
- 24
Constructor/src/main/java/org/openzen/zenscript/constructor/Module.java Vedi File

@@ -20,6 +20,8 @@ import org.json.JSONTokener;
20 20
 import org.openzen.zencode.shared.CompileException;
21 21
 import org.openzen.zenscript.codemodel.PackageDefinitions;
22 22
 import org.openzen.zenscript.codemodel.ScriptBlock;
23
+import org.openzen.zenscript.codemodel.context.CompilingPackage;
24
+import org.openzen.zenscript.codemodel.context.ModuleTypeResolutionContext;
23 25
 import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
24 26
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
25 27
 import org.openzen.zenscript.constructor.module.ModuleSpace;
@@ -27,6 +29,7 @@ import org.openzen.zenscript.compiler.SemanticModule;
27 29
 import org.openzen.zenscript.codemodel.type.ISymbol;
28 30
 import org.openzen.zenscript.parser.BracketExpressionParser;
29 31
 import org.openzen.zenscript.parser.ParsedFile;
32
+import org.openzen.zenscript.parser.PrecompilationState;
30 33
 
31 34
 /**
32 35
  *
@@ -37,6 +40,7 @@ public class Module {
37 40
 	public final String[] dependencies;
38 41
 	public final File sourceDirectory;
39 42
 	public final String packageName;
43
+	public final String javaPackageName;
40 44
 	public final String host;
41 45
 	private final Consumer<CompileException> exceptionLogger;
42 46
 	
@@ -48,6 +52,7 @@ public class Module {
48 52
 		BufferedInputStream input = new BufferedInputStream(new FileInputStream(moduleFile));
49 53
 		JSONObject json = new JSONObject(new JSONTokener(input));
50 54
 		packageName = json.getString("package");
55
+		javaPackageName = json.optString("javaPackageName", packageName);
51 56
 		host = json.getString("host");
52 57
 		JSONArray dependencies = json.optJSONArray("dependencies");
53 58
 		if (dependencies == null) {
@@ -59,23 +64,25 @@ public class Module {
59 64
 		}
60 65
 	}
61 66
 	
62
-	public ParsedFile[] parse(ZSPackage pkg) throws IOException {
67
+	public ParsedFile[] parse(ZSPackage pkg, CompilingPackage compilingPackage) throws IOException {
63 68
 		// TODO: load bracket parsers from host plugins
64 69
 		List<ParsedFile> files = new ArrayList<>();
65
-		parse(files, pkg, null, sourceDirectory);
70
+		parse(files, pkg, compilingPackage, null, sourceDirectory);
66 71
 		return files.toArray(new ParsedFile[files.size()]);
67 72
 	}
68 73
 	
69
-	private void parse(List<ParsedFile> files, ZSPackage pkg, BracketExpressionParser bracketParser, File directory) throws IOException {
74
+	private void parse(List<ParsedFile> files, ZSPackage pkg, CompilingPackage compilingPackage, BracketExpressionParser bracketParser, File directory) throws IOException {
70 75
 		for (File file : directory.listFiles()) {
71 76
 			if (file.getName().endsWith(".zs")) {
72 77
 				try {
73
-					files.add(ParsedFile.parse(pkg, bracketParser, file));
78
+					files.add(ParsedFile.parse(pkg, compilingPackage, bracketParser, file));
74 79
 				} catch (CompileException ex) {
75 80
 					exceptionLogger.accept(ex);
76 81
 				}
77 82
 			} else if (file.isDirectory()) {
78
-				parse(files, pkg.getOrCreatePackage(file.getName()), bracketParser, file);
83
+				CompilingPackage innerPackage = new CompilingPackage();
84
+				compilingPackage.addPackage(file.getName(), innerPackage);
85
+				parse(files, pkg.getOrCreatePackage(file.getName()), innerPackage, bracketParser, file);
79 86
 			}
80 87
 		}
81 88
 	}
@@ -84,6 +91,7 @@ public class Module {
84 91
 			String name,
85 92
 			String[] dependencies,
86 93
 			ZSPackage pkg,
94
+			CompilingPackage compilingPkg,
87 95
 			ParsedFile[] files,
88 96
 			ModuleSpace registry,
89 97
 			Consumer<CompileException> exceptionLogger) {
@@ -105,12 +113,19 @@ public class Module {
105 113
 		Map<String, ISymbol> globals = registry.collectGlobals();
106 114
 		boolean failed = false;
107 115
 		
116
+		ModuleTypeResolutionContext moduleContext = new ModuleTypeResolutionContext(
117
+				registry.compilationUnit.globalTypeRegistry,
118
+				registry.getAnnotations(),
119
+				rootPackage,
120
+				compilingPkg,
121
+				globals);
122
+		
108 123
 		for (ParsedFile file : files) {
109 124
 			// compileMembers will register all definition members to their
110 125
 			// respective definitions, such as fields, constructors, methods...
111 126
 			// It doesn't yet compile the method contents.
112 127
 			try {
113
-				file.compileTypes(rootPackage, pkg, definitions, registry.compilationUnit.globalTypeRegistry, expansions, globals, registry.getAnnotations());
128
+				file.compileTypes(moduleContext, rootPackage, compilingPkg);
114 129
 			} catch (CompileException ex) {
115 130
 				exceptionLogger.accept(ex);
116 131
 				failed = true;
@@ -120,38 +135,25 @@ public class Module {
120 135
 		if (failed)
121 136
 			return new SemanticModule(name, dependencies, SemanticModule.State.INVALID, rootPackage, pkg, definitions, Collections.emptyList(), registry.compilationUnit, expansions, registry.getAnnotations());
122 137
 		
138
+		// scripts will store all the script blocks encountered in the files
139
+		PrecompilationState precompiler = new PrecompilationState();
123 140
 		for (ParsedFile file : files) {
124
-			// compileMembers will register all definition members to their
125
-			// respective definitions, such as fields, constructors, methods...
126
-			// It doesn't yet compile the method contents.
127
-			try {
128
-				file.compileMembers(rootPackage, pkg, definitions, registry.compilationUnit.globalTypeRegistry, expansions, globals, registry.getAnnotations());
129
-			} catch (CompileException ex) {
130
-				exceptionLogger.accept(ex);
131
-				failed = true;
132
-			}
141
+			file.registerMembers(moduleContext, precompiler, rootPackage, compilingPkg, expansions, globals);
133 142
 		}
134 143
 		
135
-		if (failed)
136
-			return new SemanticModule(name, dependencies, SemanticModule.State.INVALID, rootPackage, pkg, definitions, Collections.emptyList(), registry.compilationUnit, expansions, registry.getAnnotations());
137
-		
138
-		if (failed)
139
-			return new SemanticModule(name, dependencies, SemanticModule.State.INVALID, rootPackage, pkg, definitions, Collections.emptyList(), registry.compilationUnit, expansions, registry.getAnnotations());
140
-		
141
-		// scripts will store all the script blocks encountered in the files
142 144
 		List<ScriptBlock> scripts = new ArrayList<>();
143 145
 		for (ParsedFile file : files) {
144 146
 			// compileCode will convert the parsed statements and expressions
145 147
 			// into semantic code. This semantic code can then be compiled
146 148
 			// to various targets.
147 149
 			try {
148
-				file.compileCode(rootPackage, pkg, definitions, registry.compilationUnit.globalTypeRegistry, expansions, scripts, globals, registry.getAnnotations());
150
+				file.compileCode(moduleContext, precompiler, rootPackage, compilingPkg, expansions, scripts, globals);
149 151
 			} catch (CompileException ex) {
150 152
 				exceptionLogger.accept(ex);
151 153
 				failed = true;
152 154
 			}
153 155
 		}
154 156
 		
155
-		return new SemanticModule(name, dependencies, SemanticModule.State.ASSEMBLED, rootPackage, pkg, definitions, Collections.emptyList(), registry.compilationUnit, expansions, registry.getAnnotations());
157
+		return new SemanticModule(name, dependencies, SemanticModule.State.ASSEMBLED, rootPackage, pkg, definitions, scripts, registry.compilationUnit, expansions, registry.getAnnotations());
156 158
 	}
157 159
 }

+ 7
- 4
Constructor/src/main/java/org/openzen/zenscript/constructor/module/DirectoryModuleReference.java Vedi File

@@ -15,6 +15,7 @@ import org.json.JSONArray;
15 15
 import org.json.JSONObject;
16 16
 import org.openzen.zencode.shared.CompileException;
17 17
 import org.openzen.zencode.shared.FileSourceFile;
18
+import org.openzen.zenscript.codemodel.context.CompilingPackage;
18 19
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
19 20
 import org.openzen.zenscript.compiler.CompilationUnit;
20 21
 import org.openzen.zenscript.constructor.ConstructorException;
@@ -68,15 +69,17 @@ public class DirectoryModuleReference implements ModuleReference {
68 69
 				}
69 70
 			}
70 71
 
71
-			ModuleSpace space = new ModuleSpace(unit);
72
+			// TODO: annotation type registration
73
+			ModuleSpace space = new ModuleSpace(unit, new ArrayList<>());
72 74
 			for (String dependencyName : dependencyNames)
73 75
 				space.addModule(dependencyName, loader.getModule(dependencyName));
74 76
 
75 77
 			Module module = new Module(moduleName, directory, jsonFile, exceptionLogger);
76 78
 			ZSPackage pkg = isStdlib ? unit.globalTypeRegistry.stdlib : new ZSPackage(null, module.packageName);
77
-
78
-			ParsedFile[] parsedFiles = module.parse(pkg);
79
-			SemanticModule result = Module.compileSyntaxToSemantic(module.name, module.dependencies, pkg, parsedFiles, space, exceptionLogger);
79
+			CompilingPackage compilingPackage = new CompilingPackage();
80
+			
81
+			ParsedFile[] parsedFiles = module.parse(pkg, compilingPackage);
82
+			SemanticModule result = Module.compileSyntaxToSemantic(module.name, module.dependencies, pkg, compilingPackage, parsedFiles, space, exceptionLogger);
80 83
 			
81 84
 			JSONObject globals = json.optJSONObject("globals");
82 85
 			if (globals != null) {

+ 10
- 9
Constructor/src/main/java/org/openzen/zenscript/constructor/module/ModuleSpace.java Vedi File

@@ -29,17 +29,14 @@ public final class ModuleSpace {
29 29
 	public final ZSPackage globalsPackage = new ZSPackage(null, "");
30 30
 	private final List<ExpansionDefinition> expansions = new ArrayList<>();
31 31
 	private final Map<String, ISymbol> globals = new HashMap<>();
32
-	private final List<AnnotationDefinition> annotations = new ArrayList<>();
32
+	private final AnnotationDefinition[] annotations;
33 33
 	
34
-	public ModuleSpace(CompilationUnit compilationUnit) {
34
+	public ModuleSpace(CompilationUnit compilationUnit, List<AnnotationDefinition> annotations) {
35 35
 		this.compilationUnit = compilationUnit;
36 36
 		
37
-		addAnnotation(NativeAnnotationDefinition.INSTANCE);
38
-		addAnnotation(PreconditionAnnotationDefinition.INSTANCE);
39
-	}
40
-	
41
-	public void addAnnotation(AnnotationDefinition annotation) {
42
-		annotations.add(annotation);
37
+		annotations.add(NativeAnnotationDefinition.INSTANCE);
38
+		annotations.add(PreconditionAnnotationDefinition.INSTANCE);
39
+		this.annotations = annotations.toArray(new AnnotationDefinition[annotations.size()]);
43 40
 	}
44 41
 	
45 42
 	public void addModule(String name, SemanticModule dependency) {
@@ -54,6 +51,10 @@ public final class ModuleSpace {
54 51
 		}
55 52
 	}
56 53
 	
54
+	public void addGlobal(String name, ISymbol global) {
55
+		globals.put(name, global);
56
+	}
57
+	
57 58
 	public ZSPackage collectPackages() {
58 59
 		return rootPackage;
59 60
 	}
@@ -66,7 +67,7 @@ public final class ModuleSpace {
66 67
 		return globals;
67 68
 	}
68 69
 	
69
-	public List<AnnotationDefinition> getAnnotations() {
70
+	public AnnotationDefinition[] getAnnotations() {
70 71
 		return annotations;
71 72
 	}
72 73
 }

+ 8
- 5
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaExpressionVisitor.java Vedi File

@@ -12,8 +12,6 @@ import org.objectweb.asm.Type;
12 12
 import org.openzen.zencode.shared.CompileException;
13 13
 import org.openzen.zencode.shared.CompileExceptionCode;
14 14
 import org.openzen.zenscript.codemodel.CompareType;
15
-import org.openzen.zenscript.codemodel.FunctionHeader;
16
-import org.openzen.zenscript.codemodel.FunctionParameter;
17 15
 import org.openzen.zenscript.codemodel.expression.*;
18 16
 import org.openzen.zenscript.codemodel.member.ref.ConstMemberRef;
19 17
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
@@ -26,7 +24,6 @@ import org.openzen.zenscript.javabytecode.*;
26 24
 
27 25
 import java.io.FileOutputStream;
28 26
 import java.io.IOException;
29
-import java.util.*;
30 27
 
31 28
 public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
32 29
 	private static final int PUBLIC = Opcodes.ACC_PUBLIC;
@@ -1523,6 +1520,11 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1523 1520
     @Override
1524 1521
     public Void visitConstructorThisCall(ConstructorThisCallExpression expression) {
1525 1522
         Type type = expression.objectType.accept(JavaTypeVisitor.INSTANCE);
1523
+		try {
1524
+			type.getInternalName();
1525
+		} catch (NullPointerException ex) {
1526
+			ex.printStackTrace();
1527
+		}
1526 1528
 
1527 1529
         javaWriter.loadObject(0);
1528 1530
         if (javaWriter.method.javaClass.isEnum) {
@@ -1533,7 +1535,8 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1533 1535
         for (Expression argument : expression.arguments.arguments) {
1534 1536
             argument.accept(this);
1535 1537
         }
1536
-        javaWriter.invokeSpecial(type.getInternalName(), "<init>", CompilerUtils.calcDesc(expression.constructor.header, javaWriter.method.javaClass.isEnum));
1538
+		String internalName = type.getInternalName();
1539
+        javaWriter.invokeSpecial(internalName, "<init>", CompilerUtils.calcDesc(expression.constructor.getHeader(), javaWriter.method.javaClass.isEnum));
1537 1540
         return null;
1538 1541
     }
1539 1542
 
@@ -1544,7 +1547,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1544 1547
             argument.accept(this);
1545 1548
         }
1546 1549
         //No super calls in enums possible, and that's already handled in the enum constructor itself.
1547
-        javaWriter.invokeSpecial(expression.objectType.accept(JavaTypeClassVisitor.INSTANCE), "<init>", CompilerUtils.calcDesc(expression.constructor.header, false));
1550
+        javaWriter.invokeSpecial(expression.objectType.accept(JavaTypeClassVisitor.INSTANCE), "<init>", CompilerUtils.calcDesc(expression.constructor.getHeader(), false));
1548 1551
 
1549 1552
         CompilerUtils.writeDefaultFieldInitializers(javaWriter, javaWriter.forDefinition, false);
1550 1553
         return null;

+ 1
- 1
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/definitions/JavaMemberVisitor.java Vedi File

@@ -220,7 +220,7 @@ public class JavaMemberVisitor implements MemberVisitor<Void> {
220 220
 					argument.accept(clinitStatementVisitor.expressionVisitor);
221 221
 				}
222 222
 
223
-				clinitWriter.invokeSpecial(internalName, "<init>", CompilerUtils.calcDesc(constant.constructor.constructor.header, true));
223
+				clinitWriter.invokeSpecial(internalName, "<init>", CompilerUtils.calcDesc(constant.constructor.constructor.getHeader(), true));
224 224
 				clinitWriter.putStaticField(internalName, constant.name, "L" + internalName + ";");
225 225
 				
226 226
 				enumDefinition = (EnumDefinition) constant.definition;

+ 1
- 0
Parser/src/main/java/org/openzen/zenscript/lexer/ZSTokenType.java Vedi File

@@ -99,6 +99,7 @@ public enum ZSTokenType implements TokenType {
99 99
 	K_IMPLICIT(true, "implicit"),
100 100
 	K_VIRTUAL(true, "virtual"),
101 101
 	K_EXTERN(true, "extern"),
102
+	K_IMMUTABLE(true, "immutable"),
102 103
 	
103 104
 	K_VAL(true, "val"),
104 105
 	K_VAR(true, "var"),

+ 11
- 12
Parser/src/main/java/org/openzen/zenscript/parser/ParsedDefinition.java Vedi File

@@ -5,8 +5,11 @@
5 5
  */
6 6
 package org.openzen.zenscript.parser;
7 7
 
8
+import java.util.Map;
8 9
 import org.openzen.zencode.shared.CodePosition;
9 10
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
11
+import org.openzen.zenscript.codemodel.context.CompilingType;
12
+import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
10 13
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
11 14
 import org.openzen.zenscript.lexer.ZSTokenParser;
12 15
 import static org.openzen.zenscript.lexer.ZSTokenType.*;
@@ -24,7 +27,7 @@ import org.openzen.zenscript.parser.definitions.ParsedVariant;
24 27
  *
25 28
  * @author Hoofdgebruiker
26 29
  */
27
-public abstract class ParsedDefinition {
30
+public abstract class ParsedDefinition implements CompilingType {
28 31
 	public static ParsedDefinition parse(ZSPackage pkg, CodePosition position, int modifiers, ParsedAnnotation[] annotations, ZSTokenParser tokens, HighLevelDefinition outerDefinition) {
29 32
 		if (tokens.optional(K_CLASS) != null) {
30 33
 			return ParsedClass.parseClass(pkg, position, modifiers, annotations, tokens, outerDefinition);
@@ -58,6 +61,10 @@ public abstract class ParsedDefinition {
58 61
 		this.annotations = annotations;
59 62
 	}
60 63
 	
64
+	public String getName() {
65
+		return getCompiled().name;
66
+	}
67
+	
61 68
 	public final CodePosition getPosition() {
62 69
 		return position;
63 70
 	}
@@ -68,17 +75,9 @@ public abstract class ParsedDefinition {
68 75
 	
69 76
 	public abstract HighLevelDefinition getCompiled();
70 77
 	
71
-	public abstract void linkInnerTypes();
72
-	
73
-	public void compileTypes(BaseScope scope) {
74
-		
75
-	}
76
-	
77
-	public abstract void compileMembers(BaseScope scope);
78
-	
79
-	public abstract void listMembers(BaseScope scope, PrecompilationState state);
78
+	public abstract void linkTypes(TypeResolutionContext context);
80 79
 	
81
-	public abstract void precompile(BaseScope scope, PrecompilationState state);
80
+	public abstract void registerMembers(BaseScope scope, PrecompilationState state);
82 81
 	
83
-	public abstract void compileCode(BaseScope scope, PrecompilationState state);
82
+	public abstract void compile(BaseScope scope);
84 83
 }

+ 40
- 46
Parser/src/main/java/org/openzen/zenscript/parser/ParsedFile.java Vedi File

@@ -22,11 +22,13 @@ import org.openzen.zenscript.codemodel.Modifiers;
22 22
 import org.openzen.zenscript.codemodel.PackageDefinitions;
23 23
 import org.openzen.zenscript.codemodel.ScriptBlock;
24 24
 import org.openzen.zenscript.codemodel.WhitespacePostComment;
25
+import org.openzen.zenscript.codemodel.context.CompilingPackage;
26
+import org.openzen.zenscript.codemodel.context.FileResolutionContext;
27
+import org.openzen.zenscript.codemodel.context.ModuleTypeResolutionContext;
25 28
 import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
26 29
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
27 30
 import org.openzen.zenscript.codemodel.statement.Statement;
28 31
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
29
-import org.openzen.zenscript.lexer.ZSToken;
30 32
 import org.openzen.zenscript.lexer.ZSTokenParser;
31 33
 import static org.openzen.zenscript.lexer.ZSTokenType.*;
32 34
 import org.openzen.zenscript.codemodel.scope.FileScope;
@@ -40,24 +42,24 @@ import org.openzen.zenscript.parser.statements.ParsedStatement;
40 42
  * @author Hoofdgebruiker
41 43
  */
42 44
 public class ParsedFile {
43
-	public static ParsedFile parse(ZSPackage pkg, BracketExpressionParser bracketParser, File file) throws IOException {
44
-		return parse(pkg, bracketParser, new FileSourceFile(file.getName(), file));
45
+	public static ParsedFile parse(ZSPackage pkg, CompilingPackage compilingPackage, BracketExpressionParser bracketParser, File file) throws IOException {
46
+		return parse(pkg, compilingPackage, bracketParser, new FileSourceFile(file.getName(), file));
45 47
 	}
46 48
 	
47
-	public static ParsedFile parse(ZSPackage pkg, BracketExpressionParser bracketParser, String filename, String content) {
49
+	public static ParsedFile parse(ZSPackage pkg, CompilingPackage compilingPackage, BracketExpressionParser bracketParser, String filename, String content) {
48 50
 		try {
49
-			return parse(pkg, bracketParser, new LiteralSourceFile(filename, content));
51
+			return parse(pkg, compilingPackage, bracketParser, new LiteralSourceFile(filename, content));
50 52
 		} catch (IOException ex) {
51 53
 			throw new AssertionError(); // shouldn't happen
52 54
 		}
53 55
 	}
54 56
 	
55
-	public static ParsedFile parse(ZSPackage pkg, BracketExpressionParser bracketParser, SourceFile file) throws IOException {
57
+	public static ParsedFile parse(ZSPackage pkg, CompilingPackage compilingPackage, BracketExpressionParser bracketParser, SourceFile file) throws IOException {
56 58
 		ZSTokenParser tokens = ZSTokenParser.create(file, bracketParser, 4);
57
-		return parse(pkg, tokens);
59
+		return parse(pkg, compilingPackage, tokens);
58 60
 	}
59 61
 	
60
-	public static ParsedFile parse(ZSPackage pkg, ZSTokenParser tokens) {
62
+	public static ParsedFile parse(ZSPackage pkg, CompilingPackage compilingPackage, ZSTokenParser tokens) {
61 63
 		ParsedFile result = new ParsedFile(tokens.getFile());
62 64
 
63 65
 		while (true) {
@@ -109,6 +111,10 @@ public class ParsedFile {
109 111
 					result.statements.add(ParsedStatement.parse(tokens, annotations));
110 112
 				} else {
111 113
 					result.definitions.add(definition);
114
+					definition.getCompiled().setTag(SourceFile.class, tokens.getFile());
115
+					
116
+					if (definition.getName() != null)
117
+						compilingPackage.addType(definition.getName(), definition);
112 118
 				}
113 119
 			}
114 120
 		}
@@ -138,63 +144,51 @@ public class ParsedFile {
138 144
 	
139 145
 	public void listDefinitions(PackageDefinitions definitions) {
140 146
 		for (ParsedDefinition definition : this.definitions) {
141
-			definition.getCompiled().setTag(SourceFile.class, file);
142 147
 			definitions.add(definition.getCompiled());
143
-			definition.linkInnerTypes();
144 148
 		}
145 149
 	}
146 150
 	
147 151
 	public void compileTypes(
152
+			ModuleTypeResolutionContext moduleContext,
148 153
 			ZSPackage rootPackage,
149
-			ZSPackage modulePackage,
150
-			PackageDefinitions packageDefinitions,
151
-			GlobalTypeRegistry globalRegistry,
152
-			List<ExpansionDefinition> expansions,
153
-			Map<String, ISymbol> globalSymbols,
154
-			List<AnnotationDefinition> annotations) {
155
-		FileScope scope = new FileScope(rootPackage, packageDefinitions, globalRegistry, expansions, globalSymbols, annotations);
156
-		loadImports(scope, rootPackage, modulePackage);
154
+			CompilingPackage modulePackage) {
155
+		FileResolutionContext context = new FileResolutionContext(moduleContext);
156
+		loadImports(context, rootPackage, modulePackage);
157 157
 		for (ParsedDefinition definition : this.definitions) {
158
-			definition.compileTypes(scope);
158
+			definition.linkTypes(context);
159 159
 		}
160 160
 	}
161 161
 	
162
-	public void compileMembers(
162
+	public void registerMembers(
163
+			ModuleTypeResolutionContext moduleContext,
164
+			PrecompilationState precompiler,
163 165
 			ZSPackage rootPackage,
164
-			ZSPackage modulePackage,
165
-			PackageDefinitions packageDefinitions,
166
-			GlobalTypeRegistry globalRegistry,
166
+			CompilingPackage modulePackage,
167 167
 			List<ExpansionDefinition> expansions,
168
-			Map<String, ISymbol> globalSymbols,
169
-			List<AnnotationDefinition> annotations) {
170
-		FileScope scope = new FileScope(rootPackage, packageDefinitions, globalRegistry, expansions, globalSymbols, annotations);
171
-		loadImports(scope, rootPackage, modulePackage);
168
+			Map<String, ISymbol> globals) {
169
+		FileResolutionContext context = new FileResolutionContext(moduleContext);
170
+		loadImports(context, rootPackage, modulePackage);
171
+		
172
+		FileScope scope = new FileScope(context, expansions, globals, precompiler);
172 173
 		for (ParsedDefinition definition : this.definitions) {
173
-			definition.compileMembers(scope);
174
+			definition.registerMembers(scope, precompiler);
174 175
 		}
175 176
 	}
176 177
 	
177 178
 	public void compileCode(
179
+			ModuleTypeResolutionContext moduleContext,
180
+			PrecompilationState precompiler,
178 181
 			ZSPackage rootPackage,
179
-			ZSPackage modulePackage,
180
-			PackageDefinitions packageDefinitions,
181
-			GlobalTypeRegistry globalRegistry,
182
+			CompilingPackage modulePackage,
182 183
 			List<ExpansionDefinition> expansions,
183 184
 			List<ScriptBlock> scripts,
184
-			Map<String, ISymbol> globalSymbols,
185
-			List<AnnotationDefinition> annotations) {
186
-		FileScope scope = new FileScope(rootPackage, packageDefinitions, globalRegistry, expansions, globalSymbols, annotations);
187
-		loadImports(scope, rootPackage, modulePackage);
185
+			Map<String, ISymbol> globals) {
186
+		FileResolutionContext context = new FileResolutionContext(moduleContext);
187
+		loadImports(context, rootPackage, modulePackage);
188 188
 		
189
-		PrecompilationState state = new PrecompilationState();
190
-		for (ParsedDefinition definition : this.definitions) {
191
-			definition.listMembers(scope, state);
192
-		}
193
-		for (ParsedDefinition definition : this.definitions) {
194
-			definition.precompile(scope, state);
195
-		}
189
+		FileScope scope = new FileScope(context, expansions, globals, precompiler);
196 190
 		for (ParsedDefinition definition : this.definitions) {
197
-			definition.compileCode(scope, state);
191
+			definition.compile(scope);
198 192
 		}
199 193
 		
200 194
 		if (!statements.isEmpty() || postComment != null) {
@@ -211,11 +205,11 @@ public class ParsedFile {
211 205
 		}
212 206
 	}
213 207
 	
214
-	private void loadImports(FileScope scope, ZSPackage rootPackage, ZSPackage modulePackage) {
208
+	private void loadImports(FileResolutionContext context, ZSPackage rootPackage, CompilingPackage modulePackage) {
215 209
 		for (ParsedImport importEntry : imports) {
216 210
 			HighLevelDefinition definition;
217 211
 			if (importEntry.isRelative()) {
218
-				definition = modulePackage.getImport(importEntry.getPath(), 0);
212
+				definition = modulePackage.getImport(context, importEntry.getPath());
219 213
 			} else {
220 214
 				definition = rootPackage.getImport(importEntry.getPath(), 0);
221 215
 			}
@@ -223,7 +217,7 @@ public class ParsedFile {
223 217
 			if (definition == null)
224 218
 				throw new CompileException(importEntry.position, CompileExceptionCode.IMPORT_NOT_FOUND, "Could not find type " + importEntry.toString());
225 219
 			
226
-			scope.register(importEntry.getName(), definition);
220
+			context.addImport(importEntry.getName(), definition);
227 221
 		}
228 222
 	}
229 223
 }

+ 8
- 4
Parser/src/main/java/org/openzen/zenscript/parser/PrecompilationState.java Vedi File

@@ -11,13 +11,14 @@ import java.util.Map;
11 11
 import java.util.Set;
12 12
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
13 13
 import org.openzen.zenscript.codemodel.scope.BaseScope;
14
+import org.openzen.zenscript.codemodel.type.member.TypeMemberPreparer;
14 15
 import org.openzen.zenscript.parser.member.ParsedDefinitionMember;
15 16
 
16 17
 /**
17 18
  *
18 19
  * @author Hoofdgebruiker
19 20
  */
20
-public class PrecompilationState {
21
+public class PrecompilationState implements TypeMemberPreparer {
21 22
 	private final Map<IDefinitionMember, CompilableMember> members = new HashMap<>();
22 23
 	private final Set<ParsedDefinitionMember> compilingMembers = new HashSet<>();
23 24
 	
@@ -38,9 +39,7 @@ public class PrecompilationState {
38 39
 			return false;
39 40
 		
40 41
 		compilingMembers.add(cMember.member);
41
-		if (!cMember.member.inferHeaders(cMember.definitionScope, this))
42
-			return false;
43
-		
42
+		cMember.member.compile(cMember.definitionScope);
44 43
 		compilingMembers.remove(cMember.member);
45 44
 		return true;
46 45
 	}
@@ -48,6 +47,11 @@ public class PrecompilationState {
48 47
 	public void end(ParsedDefinitionMember member) {
49 48
 		compilingMembers.remove(member);
50 49
 	}
50
+
51
+	@Override
52
+	public void prepare(IDefinitionMember member) {
53
+		precompile(member);
54
+	}
51 55
 	
52 56
 	private class CompilableMember {
53 57
 		private final ParsedDefinitionMember member;

+ 2
- 7
Parser/src/main/java/org/openzen/zenscript/parser/SimpleBracketSubParser.java Vedi File

@@ -29,7 +29,7 @@ public class SimpleBracketSubParser implements BracketExpressionParser {
29 29
 	public SimpleBracketSubParser(GlobalTypeRegistry registry, FunctionalMemberRef method) {
30 30
 		if (!method.isStatic())
31 31
 			throw new IllegalArgumentException("Method must be static");
32
-		if (method.header.getNumberOfTypeParameters() > 0)
32
+		if (method.getHeader().getNumberOfTypeParameters() > 0)
33 33
 			throw new IllegalArgumentException("Method cannot have type parameters");
34 34
 		
35 35
 		this.method = method;
@@ -57,17 +57,12 @@ public class SimpleBracketSubParser implements BracketExpressionParser {
57 57
 
58 58
 		@Override
59 59
 		public IPartialExpression compile(ExpressionScope scope) {
60
-			return new CallStaticExpression(position, targetType, method, method.header, new CallArguments(new ConstantStringExpression(position, value)));
60
+			return new CallStaticExpression(position, targetType, method, method.getHeader(), new CallArguments(new ConstantStringExpression(position, value)));
61 61
 		}
62 62
 
63 63
 		@Override
64 64
 		public boolean hasStrongType() {
65 65
 			return true;
66 66
 		}
67
-
68
-		@Override
69
-		public ITypeID precompileForType(ExpressionScope scope, PrecompilationState state) {
70
-			return method.header.returnType;
71
-		}
72 67
 	}
73 68
 }

+ 36
- 41
Parser/src/main/java/org/openzen/zenscript/parser/definitions/BaseParsedDefinition.java Vedi File

@@ -6,16 +6,20 @@
6 6
 package org.openzen.zenscript.parser.definitions;
7 7
 
8 8
 import java.util.ArrayList;
9
+import java.util.HashMap;
9 10
 import java.util.List;
11
+import java.util.Map;
10 12
 import org.openzen.zencode.shared.CodePosition;
11 13
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
14
+import org.openzen.zenscript.codemodel.context.CompilingType;
15
+import org.openzen.zenscript.codemodel.context.LocalTypeResolutionContext;
16
+import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
12 17
 import org.openzen.zenscript.codemodel.scope.BaseScope;
13 18
 import org.openzen.zenscript.codemodel.scope.DefinitionScope;
14 19
 import org.openzen.zenscript.parser.ParsedAnnotation;
15 20
 import org.openzen.zenscript.parser.ParsedDefinition;
16 21
 import org.openzen.zenscript.parser.PrecompilationState;
17 22
 import org.openzen.zenscript.parser.member.ParsedDefinitionMember;
18
-import org.openzen.zenscript.parser.member.ParsedInnerDefinition;
19 23
 
20 24
 /**
21 25
  *
@@ -24,6 +28,8 @@ import org.openzen.zenscript.parser.member.ParsedInnerDefinition;
24 28
 public abstract class BaseParsedDefinition extends ParsedDefinition {
25 29
 	protected final List<ParsedDefinitionMember> members = new ArrayList<>();
26 30
 	private boolean typesCompiled = false;
31
+	private final Map<String, CompilingType> innerTypes = new HashMap<>();
32
+	private boolean isCompiled = false;
27 33
 	
28 34
 	public BaseParsedDefinition(CodePosition position, int modifiers, ParsedAnnotation[] annotations) {
29 35
 		super(position, modifiers, annotations);
@@ -31,68 +37,57 @@ public abstract class BaseParsedDefinition extends ParsedDefinition {
31 37
 	
32 38
 	public void addMember(ParsedDefinitionMember member) {
33 39
 		members.add(member);
40
+		member.registerInnerTypes(innerTypes);
34 41
 	}
35 42
 	
36 43
 	@Override
37
-	public void compileTypes(BaseScope scope) {
38
-		DefinitionScope innerScope = new DefinitionScope(scope, getCompiled(), false);
39
-		for (ParsedDefinitionMember member : members) {
40
-			if (member instanceof ParsedInnerDefinition) {
41
-				ParsedInnerDefinition inner = (ParsedInnerDefinition)member;
42
-				innerScope.addInnerType(inner.getCompiled().innerDefinition.name, () -> loadInnerType(innerScope, inner));
43
-			}
44
-		}
45
-		
46
-		doCompileTypes(innerScope);
47
-	}
48
-	
49
-	private void doCompileTypes(DefinitionScope innerScope) {
44
+	public void linkTypes(TypeResolutionContext context) {
50 45
 		if (typesCompiled)
51 46
 			return;
47
+		typesCompiled = true;
52 48
 		
53
-		for (ParsedDefinitionMember member : members)
54
-			member.compileTypes(innerScope);
49
+		System.out.println("compileTypes " + getCompiled().name);
50
+		LocalTypeResolutionContext localContext = new LocalTypeResolutionContext(context, this, getCompiled().genericParameters);
51
+		linkTypesLocal(localContext);
55 52
 	}
56 53
 	
57
-	private HighLevelDefinition loadInnerType(DefinitionScope scope, ParsedInnerDefinition member) {
58
-		member.compileTypes(scope);
59
-		return member.getCompiled().innerDefinition;
54
+	protected void linkTypesLocal(TypeResolutionContext localContext) {
55
+		for (ParsedDefinitionMember member : members) {
56
+			member.linkTypes(localContext);
57
+			getCompiled().addMember(member.getCompiled());
58
+		}
60 59
 	}
61 60
 	
62 61
 	@Override
63
-	public void linkInnerTypes() {
64
-		for (ParsedDefinitionMember member : members)
65
-			member.linkInnerTypes();
66
-	}
67
-
68
-	@Override
69
-	public void compileMembers(BaseScope scope) {
70
-		getCompiled().annotations = ParsedAnnotation.compileForDefinition(annotations, getCompiled(), scope);
71
-		
62
+	public void registerMembers(BaseScope scope, PrecompilationState state) {
72 63
 		DefinitionScope innerScope = new DefinitionScope(scope, getCompiled());
73 64
 		for (ParsedDefinitionMember member : members) {
74
-			member.linkTypes(innerScope);
75
-			getCompiled().addMember(member.getCompiled());
65
+			state.register(innerScope, member);
66
+			member.registerMembers(innerScope, state);
76 67
 		}
77 68
 	}
78
-	
69
+
79 70
 	@Override
80
-	public void listMembers(BaseScope scope, PrecompilationState state) {
71
+	public void compile(BaseScope scope) {
72
+		if (isCompiled)
73
+			return;
74
+		isCompiled = true;
75
+		
76
+		getCompiled().annotations = ParsedAnnotation.compileForDefinition(annotations, getCompiled(), scope);
77
+		
81 78
 		DefinitionScope innerScope = new DefinitionScope(scope, getCompiled());
82 79
 		for (ParsedDefinitionMember member : members)
83
-			state.register(innerScope, member);
80
+			member.compile(innerScope);
84 81
 	}
85 82
 	
86 83
 	@Override
87
-	public void precompile(BaseScope scope, PrecompilationState state) {
88
-		for (ParsedDefinitionMember member : members)
89
-			state.precompile(member.getCompiled());
84
+	public HighLevelDefinition load(TypeResolutionContext context) {
85
+		linkTypes(context);
86
+		return getCompiled();
90 87
 	}
91
-
88
+	
92 89
 	@Override
93
-	public void compileCode(BaseScope scope, PrecompilationState state) {
94
-		DefinitionScope innerScope = new DefinitionScope(scope, getCompiled());
95
-		for (ParsedDefinitionMember member : members)
96
-			member.compile(innerScope, state);
90
+	public CompilingType getInner(String name) {
91
+		return innerTypes.get(name);
97 92
 	}
98 93
 }

+ 24
- 95
Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedAlias.java Vedi File

@@ -5,28 +5,18 @@
5 5
  */
6 6
 package org.openzen.zenscript.parser.definitions;
7 7
 
8
-import java.util.HashMap;
9 8
 import java.util.List;
10
-import java.util.Map;
11
-import java.util.function.Function;
12 9
 import org.openzen.zencode.shared.CodePosition;
13
-import org.openzen.zenscript.codemodel.FunctionHeader;
14 10
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
15
-import org.openzen.zenscript.codemodel.annotations.AnnotationDefinition;
11
+import org.openzen.zenscript.codemodel.context.CompilingType;
12
+import org.openzen.zenscript.codemodel.context.LocalTypeResolutionContext;
13
+import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
16 14
 import org.openzen.zenscript.codemodel.definition.AliasDefinition;
17 15
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
18
-import org.openzen.zenscript.codemodel.expression.Expression;
19 16
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
20
-import org.openzen.zenscript.codemodel.partial.IPartialExpression;
21
-import org.openzen.zenscript.codemodel.partial.PartialTypeExpression;
22 17
 import org.openzen.zenscript.lexer.ZSTokenParser;
23 18
 import org.openzen.zenscript.lexer.ZSTokenType;
24 19
 import org.openzen.zenscript.codemodel.scope.BaseScope;
25
-import org.openzen.zenscript.codemodel.scope.DefinitionScope;
26
-import org.openzen.zenscript.codemodel.statement.LoopStatement;
27
-import org.openzen.zenscript.codemodel.type.GenericName;
28
-import org.openzen.zenscript.codemodel.type.ITypeID;
29
-import org.openzen.zenscript.codemodel.type.member.LocalMemberCache;
30 20
 import org.openzen.zenscript.parser.ParsedAnnotation;
31 21
 import org.openzen.zenscript.parser.ParsedDefinition;
32 22
 import org.openzen.zenscript.parser.PrecompilationState;
@@ -51,6 +41,7 @@ public class ParsedAlias extends ParsedDefinition {
51 41
 	private final IParsedType type;
52 42
 	
53 43
 	private final AliasDefinition compiled;
44
+	private boolean typesLinked = false;
54 45
 	
55 46
 	public ParsedAlias(ZSPackage pkg, CodePosition position, int modifiers, ParsedAnnotation[] annotations, String name, List<ParsedTypeParameter> parameters, IParsedType type, HighLevelDefinition outerDefinition) {
56 47
 		super(position, modifiers, annotations);
@@ -71,109 +62,47 @@ public class ParsedAlias extends ParsedDefinition {
71 62
 	}
72 63
 	
73 64
 	@Override
74
-	public void compileTypes(BaseScope scope) {
75
-		BaseScope innerScope = new CompileTypeScope(scope);
76
-		compiled.setType(type.compile(innerScope));
77
-	}
78
-	
79
-	@Override
80
-	public HighLevelDefinition getCompiled() {
81
-		return compiled;
82
-	}
83
-
84
-	@Override
85
-	public void compileMembers(BaseScope scope) {
86
-		DefinitionScope innerScope = new DefinitionScope(scope, compiled);
65
+	public void linkTypes(TypeResolutionContext context) {
66
+		if (typesLinked)
67
+			return;
68
+		typesLinked = true;
69
+		
70
+		LocalTypeResolutionContext localContext = new LocalTypeResolutionContext(context, this, compiled.genericParameters);
71
+		compiled.setType(type.compile(localContext));
72
+		
87 73
 		for (int i = 0; i < compiled.genericParameters.length; i++) {
88 74
 			TypeParameter output = compiled.genericParameters[i];
89 75
 			ParsedTypeParameter input = this.parameters.get(i);
90 76
 			for (ParsedGenericBound bound : input.bounds) {
91
-				output.addBound(bound.compile(innerScope));
77
+				output.addBound(bound.compile(localContext));
92 78
 			}
93 79
 		}
94 80
 	}
95 81
 	
96 82
 	@Override
97
-	public void listMembers(BaseScope scope, PrecompilationState state) {
98
-		// nothing to do
83
+	public HighLevelDefinition getCompiled() {
84
+		return compiled;
99 85
 	}
100 86
 	
101 87
 	@Override
102
-	public void precompile(BaseScope scope, PrecompilationState state) {
88
+	public void registerMembers(BaseScope scope, PrecompilationState state) {
103 89
 		// nothing to do
104 90
 	}
105 91
 
106 92
 	@Override
107
-	public void compileCode(BaseScope scope, PrecompilationState state) {
93
+	public void compile(BaseScope scope) {
108 94
 		// nothing to do
109 95
 	}
110 96
 
111 97
 	@Override
112
-	public void linkInnerTypes() {
98
+	public CompilingType getInner(String name) {
99
+		// TODO: this should be possible too
100
+		return null;
113 101
 	}
114
-	
115
-	public class CompileTypeScope extends BaseScope {
116
-		private final BaseScope outer;
117
-		private final Map<String, TypeParameter> typeParameters = new HashMap<>();
118
-
119
-		public CompileTypeScope(BaseScope outer) {
120
-			this.outer = outer;
121
-			
122
-			if (parameters != null)
123
-				for (ParsedTypeParameter parameter : parameters)
124
-					typeParameters.put(parameter.name, parameter.compiled);
125
-		}
126
-
127
-		@Override
128
-		public LocalMemberCache getMemberCache() {
129
-			return outer.getMemberCache();
130
-		}
131
-
132
-		@Override
133
-		public IPartialExpression get(CodePosition position, GenericName name) {
134
-			if (typeParameters.containsKey(name.name) && !name.hasArguments())
135
-				return new PartialTypeExpression(position, getTypeRegistry().getGeneric(typeParameters.get(name.name)), name.arguments);
136 102
 
137
-			return outer.get(position, name);
138
-		}
139
-
140
-		@Override
141
-		public ITypeID getType(CodePosition position, List<GenericName> name) {
142
-			if (typeParameters.containsKey(name.get(0).name) && name.size() == 1 && !name.get(0).hasArguments()) {
143
-				return getTypeRegistry().getGeneric(typeParameters.get(name.get(0).name));
144
-			}
145
-
146
-			return outer.getType(position, name);
147
-		}
148
-
149
-		@Override
150
-		public LoopStatement getLoop(String name) {
151
-			return null;
152
-		}
153
-
154
-		@Override
155
-		public FunctionHeader getFunctionHeader() {
156
-			return null;
157
-		}
158
-
159
-		@Override
160
-		public ITypeID getThisType() {
161
-			throw new UnsupportedOperationException("Not available at this stage");
162
-		}
163
-
164
-		@Override
165
-		public Function<CodePosition, Expression> getDollar() {
166
-			return outer.getDollar();
167
-		}
168
-
169
-		@Override
170
-		public IPartialExpression getOuterInstance(CodePosition position) {
171
-			return null;
172
-		}
173
-
174
-		@Override
175
-		public AnnotationDefinition getAnnotation(String name) {
176
-			return outer.getAnnotation(name);
177
-		}
103
+	@Override
104
+	public HighLevelDefinition load(TypeResolutionContext context) {
105
+		linkTypes(context);
106
+		return compiled;
178 107
 	}
179 108
 }

+ 4
- 6
Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedClass.java Vedi File

@@ -8,12 +8,11 @@ package org.openzen.zenscript.parser.definitions;
8 8
 import java.util.List;
9 9
 import org.openzen.zencode.shared.CodePosition;
10 10
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
11
+import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
11 12
 import org.openzen.zenscript.codemodel.definition.ClassDefinition;
12 13
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
13 14
 import org.openzen.zenscript.lexer.ZSTokenParser;
14 15
 import org.openzen.zenscript.lexer.ZSTokenType;
15
-import org.openzen.zenscript.codemodel.scope.BaseScope;
16
-import org.openzen.zenscript.codemodel.scope.GenericFunctionScope;
17 16
 import org.openzen.zenscript.parser.ParsedAnnotation;
18 17
 import org.openzen.zenscript.parser.member.ParsedDefinitionMember;
19 18
 import org.openzen.zenscript.parser.type.IParsedType;
@@ -62,11 +61,10 @@ public class ParsedClass extends BaseParsedDefinition {
62 61
 	}
63 62
 
64 63
 	@Override
65
-	public void compileMembers(BaseScope scope) {
66
-		ParsedTypeParameter.compile(scope, compiled.genericParameters, genericParameters);
64
+	protected void linkTypesLocal(TypeResolutionContext context) {
67 65
 		if (superclass != null)
68
-			compiled.setSuperType(superclass.compile(new GenericFunctionScope(scope, compiled.genericParameters)));
66
+			compiled.setSuperType(superclass.compile(context));
69 67
 		
70
-		super.compileMembers(scope);
68
+		super.linkTypesLocal(context);
71 69
 	}
72 70
 }

+ 6
- 5
Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedEnum.java Vedi File

@@ -9,6 +9,7 @@ import java.util.ArrayList;
9 9
 import java.util.List;
10 10
 import org.openzen.zencode.shared.CodePosition;
11 11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
+import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
12 13
 import org.openzen.zenscript.codemodel.definition.EnumDefinition;
13 14
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
14 15
 import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
@@ -68,17 +69,17 @@ public class ParsedEnum extends BaseParsedDefinition {
68 69
 	}
69 70
 	
70 71
 	@Override
71
-	public void compileMembers(BaseScope scope) {
72
-		super.compileMembers(scope);
73
-		
72
+	protected void linkTypesLocal(TypeResolutionContext context) {
74 73
 		for (ParsedEnumConstant constant : enumValues) {
75 74
 			compiled.addEnumConstant(constant.getCompiled());
76 75
 		}
76
+		
77
+		super.linkTypesLocal(context);
77 78
 	}
78 79
 
79 80
 	@Override
80
-	public void compileCode(BaseScope scope, PrecompilationState state) {
81
-		super.compileCode(scope, state);
81
+	public void compile(BaseScope scope) {
82
+		super.compile(scope);
82 83
 		
83 84
 		DefinitionTypeID type = scope.getTypeRegistry().getForDefinition(compiled, ITypeID.NONE);
84 85
 		ExpressionScope evalScope = new ExpressionScope(scope);

+ 7
- 3
Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedExpansion.java Vedi File

@@ -10,6 +10,8 @@ import org.openzen.zencode.shared.CodePosition;
10 10
 import org.openzen.zencode.shared.CompileException;
11 11
 import org.openzen.zencode.shared.CompileExceptionCode;
12 12
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
13
+import org.openzen.zenscript.codemodel.context.LocalTypeResolutionContext;
14
+import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
13 15
 import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
14 16
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
15 17
 import org.openzen.zenscript.lexer.ZSTokenParser;
@@ -57,10 +59,12 @@ public class ParsedExpansion extends BaseParsedDefinition {
57 59
 	}
58 60
 
59 61
 	@Override
60
-	public void compileTypes(BaseScope scope) {
61
-		ParsedTypeParameter.compile(scope, compiled.genericParameters, this.parameters);
62
-		compiled.target = target.compile(new GenericFunctionScope(scope, compiled.genericParameters));
62
+	public void linkTypesLocal(TypeResolutionContext context) {
63
+		ParsedTypeParameter.compile(context, compiled.genericParameters, this.parameters);
64
+		compiled.target = target.compile(context);
63 65
 		if (compiled.target == null)
64 66
 			throw new CompileException(position, CompileExceptionCode.INTERNAL_ERROR, "Could not compile expansion target: " + target);
67
+		
68
+		super.linkTypesLocal(context);
65 69
 	}
66 70
 }

+ 18
- 20
Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedFunction.java Vedi File

@@ -7,17 +7,16 @@
7 7
 package org.openzen.zenscript.parser.definitions;
8 8
 
9 9
 import org.openzen.zencode.shared.CodePosition;
10
-import org.openzen.zencode.shared.CompileException;
11
-import org.openzen.zencode.shared.CompileExceptionCode;
12 10
 import static org.openzen.zenscript.lexer.ZSTokenType.*;
13 11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
+import org.openzen.zenscript.codemodel.context.CompilingType;
13
+import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
14 14
 import org.openzen.zenscript.codemodel.definition.FunctionDefinition;
15 15
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
16 16
 import org.openzen.zenscript.lexer.ZSTokenParser;
17 17
 import org.openzen.zenscript.codemodel.scope.BaseScope;
18 18
 import org.openzen.zenscript.codemodel.scope.FunctionScope;
19 19
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
20
-import org.openzen.zenscript.codemodel.type.ITypeID;
21 20
 import org.openzen.zenscript.parser.ParsedAnnotation;
22 21
 import org.openzen.zenscript.parser.ParsedDefinition;
23 22
 import org.openzen.zenscript.parser.PrecompilationState;
@@ -56,33 +55,32 @@ public class ParsedFunction extends ParsedDefinition {
56 55
 	}
57 56
 
58 57
 	@Override
59
-	public void linkInnerTypes() {
60
-		// nothing to do
61
-	}
62
-
63
-	@Override
64
-	public void compileMembers(BaseScope scope) {
65
-		compiled.setHeader(header.compile(scope));
58
+	public void linkTypes(TypeResolutionContext context) {
59
+		compiled.setHeader(header.compile(context));
66 60
 	}
67 61
 	
68 62
 	@Override
69
-	public void listMembers(BaseScope scope, PrecompilationState state) {
63
+	public void registerMembers(BaseScope scope, PrecompilationState state) {
70 64
 		
71 65
 	}
72
-	
66
+
73 67
 	@Override
74
-	public void precompile(BaseScope scope, PrecompilationState state) {
68
+	public void compile(BaseScope scope) {
69
+		FunctionScope innerScope = new FunctionScope(scope, compiled.header);
70
+		compiled.setCode(body.compile(innerScope, compiled.header));
71
+		
75 72
 		if (compiled.header.returnType == BasicTypeID.UNDETERMINED) {
76
-			ITypeID result = body.precompileForResultType(new FunctionScope(scope, compiled.header), state);
77
-			if (result == null)
78
-				throw new CompileException(position, CompileExceptionCode.PRECOMPILE_FAILED, "Could not determine return type for method " + compiled.name);
79
-			compiled.header = compiled.header.withReturnType(result);
73
+			compiled.header.returnType = compiled.statement.getReturnType();
80 74
 		}
81 75
 	}
82 76
 
83 77
 	@Override
84
-	public void compileCode(BaseScope scope, PrecompilationState state) {
85
-		FunctionScope innerScope = new FunctionScope(scope, compiled.header);
86
-		compiled.setCode(body.compile(innerScope, compiled.header));
78
+	public CompilingType getInner(String name) {
79
+		return null;
80
+	}
81
+
82
+	@Override
83
+	public HighLevelDefinition load(TypeResolutionContext context) {
84
+		return compiled;
87 85
 	}
88 86
 }

+ 8
- 8
Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedFunctionHeader.java Vedi File

@@ -10,14 +10,14 @@ import java.util.Collections;
10 10
 import java.util.List;
11 11
 import org.openzen.zenscript.codemodel.FunctionHeader;
12 12
 import org.openzen.zenscript.codemodel.FunctionParameter;
13
+import org.openzen.zenscript.codemodel.context.LocalTypeResolutionContext;
14
+import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
13 15
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
14 16
 import org.openzen.zenscript.codemodel.type.ITypeID;
15 17
 import org.openzen.zenscript.lexer.ZSToken;
16 18
 import org.openzen.zenscript.lexer.ZSTokenParser;
17 19
 import org.openzen.zenscript.lexer.ZSTokenType;
18 20
 import static org.openzen.zenscript.lexer.ZSTokenType.*;
19
-import org.openzen.zenscript.codemodel.scope.BaseScope;
20
-import org.openzen.zenscript.codemodel.scope.GenericFunctionScope;
21 21
 import org.openzen.zenscript.parser.ParsedAnnotation;
22 22
 import org.openzen.zenscript.parser.expression.ParsedExpression;
23 23
 import org.openzen.zenscript.parser.type.IParsedType;
@@ -92,16 +92,16 @@ public class ParsedFunctionHeader {
92 92
 		this.thrownType = thrownType;
93 93
 	}
94 94
 	
95
-	public FunctionHeader compile(BaseScope scope) {
95
+	public FunctionHeader compile(TypeResolutionContext context) {
96 96
 		TypeParameter[] genericParameters = ParsedTypeParameter.getCompiled(this.genericParameters);
97
-		ParsedTypeParameter.compile(scope, genericParameters, this.genericParameters);
98
-		GenericFunctionScope innerScope = new GenericFunctionScope(scope, genericParameters);
97
+		LocalTypeResolutionContext localContext = new LocalTypeResolutionContext(context, null, genericParameters);
98
+		ParsedTypeParameter.compile(localContext, genericParameters, this.genericParameters);
99 99
 		
100
-		ITypeID returnType = this.returnType.compile(innerScope);
100
+		ITypeID returnType = this.returnType.compile(localContext);
101 101
 		FunctionParameter[] parameters = new FunctionParameter[this.parameters.size()];
102 102
 		for (int i = 0; i < parameters.length; i++)
103
-			parameters[i] = this.parameters.get(i).compile(innerScope);
103
+			parameters[i] = this.parameters.get(i).compile(localContext);
104 104
 		
105
-		return new FunctionHeader(genericParameters, returnType, thrownType == null ? null : thrownType.compile(scope), parameters);
105
+		return new FunctionHeader(genericParameters, returnType, thrownType == null ? null : thrownType.compile(context), parameters);
106 106
 	}
107 107
 }

+ 15
- 5
Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedFunctionParameter.java Vedi File

@@ -1,11 +1,13 @@
1 1
 package org.openzen.zenscript.parser.definitions;
2 2
 
3 3
 import org.openzen.zenscript.codemodel.FunctionParameter;
4
+import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
4 5
 import org.openzen.zenscript.codemodel.expression.Expression;
5
-import org.openzen.zenscript.codemodel.type.ITypeID;
6 6
 import org.openzen.zenscript.codemodel.scope.BaseScope;
7
+import org.openzen.zenscript.codemodel.type.ITypeID;
7 8
 import org.openzen.zenscript.codemodel.scope.ExpressionScope;
8 9
 import org.openzen.zenscript.parser.ParsedAnnotation;
10
+import org.openzen.zenscript.parser.PrecompilationState;
9 11
 import org.openzen.zenscript.parser.expression.ParsedExpression;
10 12
 import org.openzen.zenscript.parser.type.IParsedType;
11 13
 
@@ -20,6 +22,8 @@ public class ParsedFunctionParameter {
20 22
 	public final ParsedExpression defaultValue;
21 23
 	public final boolean variadic;
22 24
 	
25
+	private FunctionParameter compiled;
26
+	
23 27
 	public ParsedFunctionParameter(ParsedAnnotation[] annotations, String name, IParsedType type, ParsedExpression defaultValue, boolean variadic) {
24 28
 		this.annotations = annotations;
25 29
 		this.name = name;
@@ -28,12 +32,18 @@ public class ParsedFunctionParameter {
28 32
 		this.variadic = variadic;
29 33
 	}
30 34
 	
31
-	public FunctionParameter compile(BaseScope scope) {
32
-		ITypeID cType = type.compile(scope);
35
+	public FunctionParameter compile(TypeResolutionContext context) {
36
+		if (compiled != null)
37
+			return compiled;
38
+		
39
+		ITypeID cType = type.compile(context);
33 40
 		Expression cDefaultValue = null;
41
+		return compiled = new FunctionParameter(cType, name, cDefaultValue, variadic);
42
+	}
43
+	
44
+	public void compileInitializer(BaseScope scope, PrecompilationState state) {
34 45
 		if (defaultValue != null) {
35
-			cDefaultValue = defaultValue.compile(new ExpressionScope(scope, cType)).eval();
46
+			compiled.defaultValue = defaultValue.compile(new ExpressionScope(scope, compiled.type)).eval();
36 47
 		}
37
-		return new FunctionParameter(cType, name, cDefaultValue, variadic);
38 48
 	}
39 49
 }

+ 2
- 2
Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedGenericBound.java Vedi File

@@ -5,13 +5,13 @@
5 5
  */
6 6
 package org.openzen.zenscript.parser.definitions;
7 7
 
8
+import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
8 9
 import org.openzen.zenscript.codemodel.generic.GenericParameterBound;
9
-import org.openzen.zenscript.codemodel.scope.BaseScope;
10 10
 
11 11
 /**
12 12
  *
13 13
  * @author Hoofdgebruiker
14 14
  */
15 15
 public abstract class ParsedGenericBound {
16
-	public abstract GenericParameterBound compile(BaseScope scope);
16
+	public abstract GenericParameterBound compile(TypeResolutionContext context);
17 17
 }

+ 0
- 0
Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedInterface.java Vedi File


Dato che sono stati cambiati molti file in questo diff, alcuni di essi non verranno mostrati

Loading…
Annulla
Salva