Browse Source

- 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 years ago
parent
commit
7bf2e9bfae
100 changed files with 1352 additions and 797 deletions
  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 View File

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

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

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

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

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

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

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

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

20
 import org.openzen.zenscript.codemodel.member.FieldMember;
20
 import org.openzen.zenscript.codemodel.member.FieldMember;
21
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
21
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
22
 import org.openzen.zenscript.codemodel.member.ImplementationMember;
22
 import org.openzen.zenscript.codemodel.member.ImplementationMember;
23
+import org.openzen.zenscript.codemodel.member.InnerDefinitionMember;
23
 import org.openzen.zenscript.codemodel.scope.TypeScope;
24
 import org.openzen.zenscript.codemodel.scope.TypeScope;
24
 import org.openzen.zenscript.codemodel.type.ITypeID;
25
 import org.openzen.zenscript.codemodel.type.ITypeID;
25
 
26
 
146
 	}
147
 	}
147
 	
148
 	
148
 	public abstract <T> T accept(DefinitionVisitor<T> visitor);
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 View File

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

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

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 View File

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 View File

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 View File

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 View File

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 View File

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 View File

22
 	}
22
 	}
23
 	
23
 	
24
 	public void setType(ITypeID type) {
24
 	public void setType(ITypeID type) {
25
+		if (type == null)
26
+			throw new NullPointerException("type cannot be null!");
27
+		
25
 		this.type = type;
28
 		this.type = type;
26
 	}
29
 	}
27
 
30
 

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

7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
 import org.openzen.zenscript.codemodel.FunctionHeader;
9
 import org.openzen.zenscript.codemodel.FunctionHeader;
10
+import org.openzen.zenscript.codemodel.GenericMapper;
10
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
11
 import org.openzen.zenscript.codemodel.Modifiers;
12
 import org.openzen.zenscript.codemodel.Modifiers;
12
 import org.openzen.zenscript.codemodel.member.CallerMember;
13
 import org.openzen.zenscript.codemodel.member.CallerMember;
38
 	public void setHeader(FunctionHeader header) {
39
 	public void setHeader(FunctionHeader header) {
39
 		this.header = header;
40
 		this.header = header;
40
 		addMember(caller = new CallerMember(position, this, modifiers | Modifiers.STATIC, header, null));
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
 	public void setCode(Statement statement) {
45
 	public void setCode(Statement statement) {

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

17
  * @author Hoofdgebruiker
17
  * @author Hoofdgebruiker
18
  */
18
  */
19
 public class InterfaceDefinition extends HighLevelDefinition {
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
 	public InterfaceDefinition(CodePosition position, ZSPackage pkg, String name, int modifiers, HighLevelDefinition outerDefinition) {
22
 	public InterfaceDefinition(CodePosition position, ZSPackage pkg, String name, int modifiers, HighLevelDefinition outerDefinition) {
23
 		super(position, pkg, name, modifiers, outerDefinition);
23
 		super(position, pkg, name, modifiers, outerDefinition);

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

12
 import org.openzen.zencode.shared.CompileException;
12
 import org.openzen.zencode.shared.CompileException;
13
 import org.openzen.zencode.shared.CompileExceptionCode;
13
 import org.openzen.zencode.shared.CompileExceptionCode;
14
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
14
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
15
+import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
15
 import org.openzen.zenscript.codemodel.partial.IPartialExpression;
16
 import org.openzen.zenscript.codemodel.partial.IPartialExpression;
16
 import org.openzen.zenscript.codemodel.partial.PartialPackageExpression;
17
 import org.openzen.zenscript.codemodel.partial.PartialPackageExpression;
17
 import org.openzen.zenscript.codemodel.partial.PartialTypeExpression;
18
 import org.openzen.zenscript.codemodel.partial.PartialTypeExpression;
19
+import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
18
 import org.openzen.zenscript.codemodel.type.GenericName;
20
 import org.openzen.zenscript.codemodel.type.GenericName;
19
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
21
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
20
 import org.openzen.zenscript.codemodel.type.ITypeID;
22
 import org.openzen.zenscript.codemodel.type.ITypeID;
21
-import org.openzen.zenscript.codemodel.scope.TypeScope;
22
 
23
 
23
 /**
24
 /**
24
  *
25
  *
80
 		return null;
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
 		if (types.containsKey(name.name)) {
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
 		return null;
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
 		if (depth >= nameParts.size())
97
 		if (depth >= nameParts.size())
97
 			return null;
98
 			return null;
98
 		
99
 		
99
 		GenericName name = nameParts.get(depth);
100
 		GenericName name = nameParts.get(depth);
100
 		if (subPackages.containsKey(name.name) && name.hasNoArguments())
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
 		if (types.containsKey(name.name)) {
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
 		return null;
109
 		return null;

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

17
 	public final Expression value;
17
 	public final Expression value;
18
 	
18
 	
19
 	public CheckNullExpression(CodePosition position, Expression value) {
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
 		this.value = value;
22
 		this.value = value;
23
 	}
23
 	}

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

27
 		super(position, BasicTypeID.BOOL, binaryThrow(position, left.thrownType, right.thrownType));
27
 		super(position, BasicTypeID.BOOL, binaryThrow(position, left.thrownType, right.thrownType));
28
 		
28
 		
29
 		this.left = left;
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
 		this.operator = operator;
31
 		this.operator = operator;
32
 		this.comparison = comparison;
32
 		this.comparison = comparison;
33
 	}
33
 	}

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

21
 	public final CallArguments arguments;
21
 	public final CallArguments arguments;
22
 	
22
 	
23
 	public ConstructorSuperCallExpression(CodePosition position, ITypeID type, FunctionalMemberRef constructor, CallArguments arguments) {
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
 		this.objectType = type;
26
 		this.objectType = type;
27
 		this.constructor = constructor;
27
 		this.constructor = constructor;
41
 
41
 
42
 	@Override
42
 	@Override
43
 	public Expression normalize(TypeScope scope) {
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 View File

21
 	public final CallArguments arguments;
21
 	public final CallArguments arguments;
22
 	
22
 	
23
 	public ConstructorThisCallExpression(CodePosition position, ITypeID type, FunctionalMemberRef constructor, CallArguments arguments) {
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
 		this.objectType = type;
29
 		this.objectType = type;
27
 		this.constructor = constructor;
30
 		this.constructor = constructor;
36
 	@Override
39
 	@Override
37
 	public Expression transform(ExpressionTransformer transformer) {
40
 	public Expression transform(ExpressionTransformer transformer) {
38
 		CallArguments tArguments = arguments.transform(transformer);
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
 	@Override
45
 	@Override
43
 	public Expression normalize(TypeScope scope) {
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 View File

106
 		return scope.getTypeMembers(type)
106
 		return scope.getTypeMembers(type)
107
 				.getOrCreateGroup(OperatorType.CALL)
107
 				.getOrCreateGroup(OperatorType.CALL)
108
 				.getMethodMembers().stream()
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
 				.collect(Collectors.toList());
111
 				.collect(Collectors.toList());
112
 	}
112
 	}
113
 	
113
 	
119
 	@Override
119
 	@Override
120
 	public IPartialExpression getMember(CodePosition position, TypeScope scope, List<ITypeID> hints, GenericName name) {
120
 	public IPartialExpression getMember(CodePosition position, TypeScope scope, List<ITypeID> hints, GenericName name) {
121
 		TypeMembers members = scope.getTypeMembers(type);
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
 		if (result == null)
123
 		if (result == null)
124
 			System.out.println("No such member: " + name.name);
124
 			System.out.println("No such member: " + name.name);
125
 		return result;
125
 		return result;

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

59
 				type,
59
 				type,
60
 				member,
60
 				member,
61
 				compiledArguments,
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
 	public Expression not(Expression value) {
65
 	public Expression not(Expression value) {

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

22
 	public final FieldMemberRef field;
22
 	public final FieldMemberRef field;
23
 	
23
 	
24
 	public GetFieldExpression(CodePosition position, Expression target, FieldMemberRef field) {
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
 		this.target = target;
27
 		this.target = target;
28
 		this.field = field;
28
 		this.field = field;

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

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

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

18
 	public final GetterMemberRef getter;
18
 	public final GetterMemberRef getter;
19
 	
19
 	
20
 	public GetterExpression(CodePosition position, Expression target, GetterMemberRef getter) {
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
 		this.target = target;
23
 		this.target = target;
24
 		this.getter = getter;
24
 		this.getter = getter;

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

26
 			FunctionalMemberRef constructor,
26
 			FunctionalMemberRef constructor,
27
 			CallArguments arguments)
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
 	public NewExpression(
32
 	public NewExpression(
36
 			CallArguments arguments,
36
 			CallArguments arguments,
37
 			FunctionHeader instancedHeader)
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
 		this.constructor = constructor;
41
 		this.constructor = constructor;
42
 		this.arguments = arguments;
42
 		this.arguments = arguments;

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

19
 	public final Expression value;
19
 	public final Expression value;
20
 	
20
 	
21
 	public SetFieldExpression(CodePosition position, Expression target, FieldMemberRef field, Expression value) {
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
 		this.target = target;
24
 		this.target = target;
25
 		this.field = field;
25
 		this.field = field;

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

18
 	public final Expression value;
18
 	public final Expression value;
19
 	
19
 	
20
 	public SetStaticFieldExpression(CodePosition position, FieldMemberRef field, Expression value) {
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
 		this.field = field;
23
 		this.field = field;
24
 		this.value = value;
24
 		this.value = value;

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

19
 	public final Expression value;
19
 	public final Expression value;
20
 	
20
 	
21
 	public SetterExpression(CodePosition position, Expression target, SetterMemberRef setter, Expression value) {
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
 		this.target = target;
24
 		this.target = target;
25
 		this.setter = setter;
25
 		this.setter = setter;

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

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

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

18
 	public final Expression value;
18
 	public final Expression value;
19
 	
19
 	
20
 	public StaticSetterExpression(CodePosition position, SetterMemberRef setter, Expression value) {
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
 		this.setter = setter;
23
 		this.setter = setter;
24
 		this.value = value;
24
 		this.value = value;

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

21
  *
21
  *
22
  * @author Hoofdgebruiker
22
  * @author Hoofdgebruiker
23
  */
23
  */
24
-public class ConstMember extends DefinitionMember {
24
+public class ConstMember extends PropertyMember {
25
 	public final String name;
25
 	public final String name;
26
-	public ITypeID type;
27
 	public Expression value;
26
 	public Expression value;
28
 	public final BuiltinID builtin;
27
 	public final BuiltinID builtin;
29
 	
28
 	
30
 	public ConstMember(CodePosition position, HighLevelDefinition definition, int modifiers, String name, ITypeID type, BuiltinID builtin) {
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
 		this.name = name;
32
 		this.name = name;
34
-		this.type = type;
35
 		this.builtin = builtin;
33
 		this.builtin = builtin;
36
 	}
34
 	}
37
 
35
 
47
 
45
 
48
 	@Override
46
 	@Override
49
 	public void registerTo(TypeMembers members, TypeMemberPriority priority, GenericMapper mapper) {
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
 	@Override
51
 	@Override

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

32
 		return position;
32
 		return position;
33
 	}
33
 	}
34
 	
34
 	
35
+	public MemberAnnotation[] getAnnotations() {
36
+		return annotations;
37
+	}
38
+	
35
 	public boolean isStatic() {
39
 	public boolean isStatic() {
36
 		return Modifiers.isStatic(modifiers);
40
 		return Modifiers.isStatic(modifiers);
37
 	}
41
 	}

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

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

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

46
 	public abstract FunctionalKind getKind();
46
 	public abstract FunctionalKind getKind();
47
 	
47
 	
48
 	public FunctionalMemberRef ref(GenericMapper mapper) {
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
 	@Override
52
 	@Override

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

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

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 View File

9
 import org.openzen.zenscript.codemodel.GenericMapper;
9
 import org.openzen.zenscript.codemodel.GenericMapper;
10
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
10
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
11
 import org.openzen.zenscript.codemodel.Modifiers;
11
 import org.openzen.zenscript.codemodel.Modifiers;
12
+import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
12
 import org.openzen.zenscript.codemodel.definition.InterfaceDefinition;
13
 import org.openzen.zenscript.codemodel.definition.InterfaceDefinition;
13
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
14
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
14
 import org.openzen.zenscript.codemodel.scope.TypeScope;
15
 import org.openzen.zenscript.codemodel.scope.TypeScope;

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

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

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

69
 	
69
 	
70
 	public void setOverrides(GlobalTypeRegistry registry, FunctionalMemberRef overrides) {
70
 	public void setOverrides(GlobalTypeRegistry registry, FunctionalMemberRef overrides) {
71
 		this.overrides = overrides;
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 View File

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 View File

6
 package org.openzen.zenscript.codemodel.member;
6
 package org.openzen.zenscript.codemodel.member;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zencode.shared.ConcatMap;
9
 import org.openzen.zenscript.codemodel.FunctionHeader;
10
 import org.openzen.zenscript.codemodel.FunctionHeader;
10
 import org.openzen.zenscript.codemodel.FunctionParameter;
11
 import org.openzen.zenscript.codemodel.FunctionParameter;
11
 import org.openzen.zenscript.codemodel.GenericMapper;
12
 import org.openzen.zenscript.codemodel.GenericMapper;
12
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
13
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
13
 import org.openzen.zenscript.codemodel.member.ref.SetterMemberRef;
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
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
17
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
15
 import org.openzen.zenscript.codemodel.type.ITypeID;
18
 import org.openzen.zenscript.codemodel.type.ITypeID;
16
 import org.openzen.zenscript.codemodel.type.member.BuiltinID;
19
 import org.openzen.zenscript.codemodel.type.member.BuiltinID;
21
  *
24
  *
22
  * @author Hoofdgebruiker
25
  * @author Hoofdgebruiker
23
  */
26
  */
24
-public class SetterMember extends FunctionalMember {
27
+public class SetterMember extends FunctionalMember implements IPropertyMember {
25
 	public ITypeID type;
28
 	public ITypeID type;
26
 	public final String name;
29
 	public final String name;
27
 	private SetterMemberRef overrides;
30
 	private SetterMemberRef overrides;
44
 		this.name = name;
47
 		this.name = name;
45
 	}
48
 	}
46
 	
49
 	
50
+	@Override
51
+	public ITypeID getType() {
52
+		return type;
53
+	}
54
+	
47
 	@Override
55
 	@Override
48
 	public String getCanonicalName() {
56
 	public String getCanonicalName() {
49
 		return definition.getFullName() + ":setter:" + name;
57
 		return definition.getFullName() + ":setter:" + name;
56
 
64
 
57
 	@Override
65
 	@Override
58
 	public void registerTo(TypeMembers members, TypeMemberPriority priority, GenericMapper mapper) {
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
 	@Override
70
 	@Override
73
 	public SetterMemberRef getOverrides() {
81
 	public SetterMemberRef getOverrides() {
74
 		return overrides;
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
 	public void setOverrides(SetterMemberRef overrides) {
91
 	public void setOverrides(SetterMemberRef overrides) {
78
 		this.overrides = overrides;
92
 		this.overrides = overrides;
79
 		
93
 		
80
 		if (type == BasicTypeID.UNDETERMINED)
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 View File

5
  */
5
  */
6
 package org.openzen.zenscript.codemodel.member.ref;
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.GenericMapper;
8
 import org.openzen.zenscript.codemodel.GenericMapper;
11
-import org.openzen.zenscript.codemodel.annotations.MemberAnnotation;
12
 import org.openzen.zenscript.codemodel.member.ConstMember;
9
 import org.openzen.zenscript.codemodel.member.ConstMember;
13
-import org.openzen.zenscript.codemodel.type.ITypeID;
14
 
10
 
15
 /**
11
 /**
16
  *
12
  *
17
  * @author Hoofdgebruiker
13
  * @author Hoofdgebruiker
18
  */
14
  */
19
-public class ConstMemberRef implements DefinitionMemberRef {
15
+public class ConstMemberRef extends PropertyRef {
20
 	public final ConstMember member;
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
 		this.member = member;
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
 	@Override
23
 	@Override
56
 	public DefinitionMemberRef getOverrides() {
24
 	public DefinitionMemberRef getOverrides() {
57
 		return null;
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 View File

5
  */
5
  */
6
 package org.openzen.zenscript.codemodel.member.ref;
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
 import org.openzen.zenscript.codemodel.member.FieldMember;
9
 import org.openzen.zenscript.codemodel.member.FieldMember;
12
-import org.openzen.zenscript.codemodel.type.ITypeID;
13
 
10
 
14
 /**
11
 /**
15
  *
12
  *
16
  * @author Hoofdgebruiker
13
  * @author Hoofdgebruiker
17
  */
14
  */
18
-public class FieldMemberRef implements DefinitionMemberRef {
15
+public class FieldMemberRef extends PropertyRef {
19
 	public final FieldMember member;
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
 		this.member = member;
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
 	@Override
23
 	@Override
51
 	public DefinitionMemberRef getOverrides() {
24
 	public DefinitionMemberRef getOverrides() {
52
 		return null;
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 View File

8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
 import org.openzen.zenscript.codemodel.CompareType;
9
 import org.openzen.zenscript.codemodel.CompareType;
10
 import org.openzen.zenscript.codemodel.FunctionHeader;
10
 import org.openzen.zenscript.codemodel.FunctionHeader;
11
+import org.openzen.zenscript.codemodel.GenericMapper;
11
 import org.openzen.zenscript.codemodel.OperatorType;
12
 import org.openzen.zenscript.codemodel.OperatorType;
12
 import org.openzen.zenscript.codemodel.annotations.MemberAnnotation;
13
 import org.openzen.zenscript.codemodel.annotations.MemberAnnotation;
13
 import org.openzen.zenscript.codemodel.expression.CallArguments;
14
 import org.openzen.zenscript.codemodel.expression.CallArguments;
29
  */
30
  */
30
 public class FunctionalMemberRef implements DefinitionMemberRef {
31
 public class FunctionalMemberRef implements DefinitionMemberRef {
31
 	private final FunctionalMember target;
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
 		this.target = target;
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
 	@Override
66
 	@Override
68
 	public DefinitionMemberRef getOverrides() {
95
 	public DefinitionMemberRef getOverrides() {
69
 		return target.getOverrides();
96
 		return target.getOverrides();
70
 	}
97
 	}
71
-
72
-	@Override
73
-	public FunctionHeader getHeader() {
74
-		return header;
75
-	}
76
 	
98
 	
77
 	public BuiltinID getBuiltin() {
99
 	public BuiltinID getBuiltin() {
78
 		return target.builtin;
100
 		return target.builtin;

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

7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
 import org.openzen.zenscript.codemodel.FunctionHeader;
9
 import org.openzen.zenscript.codemodel.FunctionHeader;
10
+import org.openzen.zenscript.codemodel.GenericMapper;
10
 import org.openzen.zenscript.codemodel.annotations.MemberAnnotation;
11
 import org.openzen.zenscript.codemodel.annotations.MemberAnnotation;
11
 import org.openzen.zenscript.codemodel.expression.Expression;
12
 import org.openzen.zenscript.codemodel.expression.Expression;
12
 import org.openzen.zenscript.codemodel.expression.GetterExpression;
13
 import org.openzen.zenscript.codemodel.expression.GetterExpression;
13
 import org.openzen.zenscript.codemodel.expression.StaticGetterExpression;
14
 import org.openzen.zenscript.codemodel.expression.StaticGetterExpression;
14
 import org.openzen.zenscript.codemodel.member.GetterMember;
15
 import org.openzen.zenscript.codemodel.member.GetterMember;
15
-import org.openzen.zenscript.codemodel.type.ITypeID;
16
 
16
 
17
 /**
17
 /**
18
  *
18
  *
19
  * @author Hoofdgebruiker
19
  * @author Hoofdgebruiker
20
  */
20
  */
21
-public class GetterMemberRef implements DefinitionMemberRef {
21
+public class GetterMemberRef extends PropertyRef {
22
 	public final GetterMember member;
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
 		this.member = member;
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
 	public Expression get(CodePosition position, Expression target) {
30
 	public Expression get(CodePosition position, Expression target) {
58
 	public DefinitionMemberRef getOverrides() {
39
 	public DefinitionMemberRef getOverrides() {
59
 		return member.getOverrides();
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 View File

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 View File

5
  */
5
  */
6
 package org.openzen.zenscript.codemodel.member.ref;
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
 import org.openzen.zenscript.codemodel.member.SetterMember;
9
 import org.openzen.zenscript.codemodel.member.SetterMember;
12
-import org.openzen.zenscript.codemodel.type.ITypeID;
13
 
10
 
14
 /**
11
 /**
15
  *
12
  *
16
  * @author Hoofdgebruiker
13
  * @author Hoofdgebruiker
17
  */
14
  */
18
-public class SetterMemberRef implements DefinitionMemberRef {
15
+public class SetterMemberRef extends PropertyRef {
19
 	public final SetterMember member;
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
 		this.member = member;
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
 	@Override
24
 	@Override
47
 	public DefinitionMemberRef getOverrides() {
25
 	public DefinitionMemberRef getOverrides() {
48
 		return member.getOverrides();
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 View File

7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
 import org.openzen.zenscript.codemodel.FunctionHeader;
9
 import org.openzen.zenscript.codemodel.FunctionHeader;
10
+import org.openzen.zenscript.codemodel.GenericMapper;
10
 import org.openzen.zenscript.codemodel.expression.CallArguments;
11
 import org.openzen.zenscript.codemodel.expression.CallArguments;
11
 import org.openzen.zenscript.codemodel.expression.CallTranslator;
12
 import org.openzen.zenscript.codemodel.expression.CallTranslator;
12
 import org.openzen.zenscript.codemodel.expression.Expression;
13
 import org.openzen.zenscript.codemodel.expression.Expression;
20
 public class TranslatedOperatorMemberRef extends FunctionalMemberRef {
21
 public class TranslatedOperatorMemberRef extends FunctionalMemberRef {
21
 	private final CallTranslator translator;
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
 		this.translator = translator;
27
 		this.translator = translator;
27
 	}
28
 	}

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

29
 	private final DefinitionMemberGroup group;
29
 	private final DefinitionMemberGroup group;
30
 	private final ITypeID[] typeArguments;
30
 	private final ITypeID[] typeArguments;
31
 	private final boolean allowStaticUsage;
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
 		this.position = position;
42
 		this.position = position;
43
+		this.scope = scope;
35
 		this.target = target;
44
 		this.target = target;
36
 		this.group = group;
45
 		this.group = group;
37
 		this.typeArguments = typeArguments;
46
 		this.typeArguments = typeArguments;
38
 		this.allowStaticUsage = allowStaticMembers;
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
 		this.position = position;
59
 		this.position = position;
60
+		this.scope = scope;
43
 		this.target = target;
61
 		this.target = target;
44
 		this.group = DefinitionMemberGroup.forMethod(name, member);
62
 		this.group = DefinitionMemberGroup.forMethod(name, member);
45
 		this.typeArguments = typeArguments;
63
 		this.typeArguments = typeArguments;
48
 
66
 
49
 	@Override
67
 	@Override
50
 	public Expression eval() {
68
 	public Expression eval() {
51
-		return group.getter(position, target, allowStaticUsage);
69
+		return group.getter(position, scope, target, allowStaticUsage);
52
 	}
70
 	}
53
 	
71
 	
54
 	@Override
72
 	@Override
55
 	public List<ITypeID> getAssignHints() {
73
 	public List<ITypeID> getAssignHints() {
56
 		if (group.getSetter() != null)
74
 		if (group.getSetter() != null)
57
-			return Collections.singletonList(group.getSetter().type);
75
+			return Collections.singletonList(group.getSetter().getType());
58
 		if (group.getField() != null)
76
 		if (group.getField() != null)
59
-			return Collections.singletonList(group.getField().type);
77
+			return Collections.singletonList(group.getField().getType());
60
 		
78
 		
61
 		return Collections.emptyList();
79
 		return Collections.emptyList();
62
 	}
80
 	}
69
 	@Override
87
 	@Override
70
 	public List<FunctionHeader> getPossibleFunctionHeaders(TypeScope scope, List<ITypeID> hints, int arguments) {
88
 	public List<FunctionHeader> getPossibleFunctionHeaders(TypeScope scope, List<ITypeID> hints, int arguments) {
71
 		List<FunctionHeader> results = group.getMethodMembers().stream()
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
 				.collect(Collectors.toList());
95
 				.collect(Collectors.toList());
75
 		if (results.isEmpty())
96
 		if (results.isEmpty())
76
 			System.out.println("!");
97
 			System.out.println("!");
94
 	
115
 	
95
 	@Override
116
 	@Override
96
 	public IPartialExpression capture(CodePosition position, LambdaClosure closure) {
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
 	@Override
121
 	@Override

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

24
  * @author Hoofdgebruiker
24
  * @author Hoofdgebruiker
25
  */
25
  */
26
 public class PartialStaticMemberGroupExpression implements IPartialExpression {
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
 		DefinitionMemberGroup group = new DefinitionMemberGroup(true, name);
28
 		DefinitionMemberGroup group = new DefinitionMemberGroup(true, name);
29
 		group.addMethod(method, TypeMemberPriority.SPECIFIED);
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
 	private final CodePosition position;
33
 	private final CodePosition position;
34
+	private final TypeScope scope;
34
 	private final ITypeID target;
35
 	private final ITypeID target;
35
 	private final DefinitionMemberGroup group;
36
 	private final DefinitionMemberGroup group;
36
 	private final ITypeID[] typeArguments;
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
 		this.position = position;
40
 		this.position = position;
41
+		this.scope = scope;
40
 		this.group = group;
42
 		this.group = group;
41
 		this.target = target;
43
 		this.target = target;
42
 		this.typeArguments = typeArguments;
44
 		this.typeArguments = typeArguments;
44
 	
46
 	
45
 	@Override
47
 	@Override
46
 	public Expression eval() {
48
 	public Expression eval() {
47
-		return group.staticGetter(position);
49
+		return group.staticGetter(position, scope);
48
 	}
50
 	}
49
 
51
 
50
 	@Override
52
 	@Override
55
 	@Override
57
 	@Override
56
 	public List<FunctionHeader> getPossibleFunctionHeaders(TypeScope scope, List<ITypeID> hints, int arguments) {
58
 	public List<FunctionHeader> getPossibleFunctionHeaders(TypeScope scope, List<ITypeID> hints, int arguments) {
57
 		return group.getMethodMembers().stream()
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
 				.collect(Collectors.toList());
62
 				.collect(Collectors.toList());
61
 	}
63
 	}
62
 
64
 
83
 	@Override
85
 	@Override
84
 	public List<ITypeID> getAssignHints() {
86
 	public List<ITypeID> getAssignHints() {
85
 		if (group.getSetter() != null)
87
 		if (group.getSetter() != null)
86
-			return Collections.singletonList(group.getSetter().type);
88
+			return Collections.singletonList(group.getSetter().getType());
87
 		if (group.getField() != null)
89
 		if (group.getField() != null)
88
-			return Collections.singletonList(group.getField().type);
90
+			return Collections.singletonList(group.getField().getType());
89
 		
91
 		
90
 		return Collections.emptyList();
92
 		return Collections.emptyList();
91
 	}
93
 	}

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

49
 		return scope.getTypeMembers(type)
49
 		return scope.getTypeMembers(type)
50
 				.getOrCreateGroup(OperatorType.CALL)
50
 				.getOrCreateGroup(OperatorType.CALL)
51
 				.getMethodMembers().stream()
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
 				.collect(Collectors.toList());
54
 				.collect(Collectors.toList());
55
 	}
55
 	}
56
 
56
 
57
 	@Override
57
 	@Override
58
 	public IPartialExpression getMember(CodePosition position, TypeScope scope, List<ITypeID> hints, GenericName name) {
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
 	@Override
62
 	@Override

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

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

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

16
 import org.openzen.zenscript.codemodel.type.GenericName;
16
 import org.openzen.zenscript.codemodel.type.GenericName;
17
 import org.openzen.zenscript.codemodel.type.ITypeID;
17
 import org.openzen.zenscript.codemodel.type.ITypeID;
18
 import org.openzen.zenscript.codemodel.type.member.LocalMemberCache;
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
 	public AnnotationDefinition getAnnotation(String name) {
77
 	public AnnotationDefinition getAnnotation(String name) {
77
 		return parent.getAnnotation(name);
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 View File

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 View File

28
 import org.openzen.zenscript.codemodel.type.GenericName;
28
 import org.openzen.zenscript.codemodel.type.GenericName;
29
 import org.openzen.zenscript.codemodel.type.ITypeID;
29
 import org.openzen.zenscript.codemodel.type.ITypeID;
30
 import org.openzen.zenscript.codemodel.type.member.LocalMemberCache;
30
 import org.openzen.zenscript.codemodel.type.member.LocalMemberCache;
31
+import org.openzen.zenscript.codemodel.type.member.TypeMemberPreparer;
31
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
32
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
32
 
33
 
33
 /**
34
 /**
87
 			if (members.hasInnerType(name.name))
88
 			if (members.hasInnerType(name.name))
88
 				return new PartialTypeExpression(position, members.getInnerType(position, name), name.arguments);
89
 				return new PartialTypeExpression(position, members.getInnerType(position, name), name.arguments);
89
 			if (members.hasMember(name.name) && !name.hasArguments())
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
 		} else if (innerTypes.containsKey(name.name)) {
92
 		} else if (innerTypes.containsKey(name.name)) {
92
 			return new PartialTypeExpression(position, getTypeRegistry().getForDefinition(innerTypes.get(name).get(), name.arguments), name.arguments);
93
 			return new PartialTypeExpression(position, getTypeRegistry().getForDefinition(innerTypes.get(name).get(), name.arguments), name.arguments);
93
 		}
94
 		}
154
 	public AnnotationDefinition getAnnotation(String name) {
155
 	public AnnotationDefinition getAnnotation(String name) {
155
 		return outer.getAnnotation(name);
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 View File

22
 import org.openzen.zenscript.codemodel.type.GenericName;
22
 import org.openzen.zenscript.codemodel.type.GenericName;
23
 import org.openzen.zenscript.codemodel.type.ITypeID;
23
 import org.openzen.zenscript.codemodel.type.ITypeID;
24
 import org.openzen.zenscript.codemodel.type.member.LocalMemberCache;
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
 	public AnnotationDefinition getAnnotation(String name) {
159
 	public AnnotationDefinition getAnnotation(String name) {
159
 		return outer.getAnnotation(name);
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 View File

5
  */
5
  */
6
 package org.openzen.zenscript.codemodel.scope;
6
 package org.openzen.zenscript.codemodel.scope;
7
 
7
 
8
-import java.util.HashMap;
8
+import java.util.Collections;
9
 import java.util.List;
9
 import java.util.List;
10
 import java.util.Map;
10
 import java.util.Map;
11
 import java.util.function.Function;
11
 import java.util.function.Function;
14
 import org.openzen.zencode.shared.CompileExceptionCode;
14
 import org.openzen.zencode.shared.CompileExceptionCode;
15
 import org.openzen.zenscript.codemodel.annotations.AnnotationDefinition;
15
 import org.openzen.zenscript.codemodel.annotations.AnnotationDefinition;
16
 import org.openzen.zenscript.codemodel.FunctionHeader;
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
 import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
18
 import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
20
-import org.openzen.zenscript.codemodel.definition.ZSPackage;
21
 import org.openzen.zenscript.codemodel.expression.Expression;
19
 import org.openzen.zenscript.codemodel.expression.Expression;
22
 import org.openzen.zenscript.codemodel.partial.IPartialExpression;
20
 import org.openzen.zenscript.codemodel.partial.IPartialExpression;
23
 import org.openzen.zenscript.codemodel.partial.PartialGlobalExpression;
21
 import org.openzen.zenscript.codemodel.partial.PartialGlobalExpression;
24
 import org.openzen.zenscript.codemodel.partial.PartialTypeExpression;
22
 import org.openzen.zenscript.codemodel.partial.PartialTypeExpression;
25
 import org.openzen.zenscript.codemodel.statement.LoopStatement;
23
 import org.openzen.zenscript.codemodel.statement.LoopStatement;
26
-import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
27
 import org.openzen.zenscript.codemodel.type.GenericName;
24
 import org.openzen.zenscript.codemodel.type.GenericName;
28
-import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
29
 import org.openzen.zenscript.codemodel.type.ISymbol;
25
 import org.openzen.zenscript.codemodel.type.ISymbol;
30
 import org.openzen.zenscript.codemodel.type.ITypeID;
26
 import org.openzen.zenscript.codemodel.type.ITypeID;
31
 import org.openzen.zenscript.codemodel.type.member.LocalMemberCache;
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
  * @author Hoofdgebruiker
32
  * @author Hoofdgebruiker
36
  */
33
  */
37
 public class FileScope extends BaseScope {
34
 public class FileScope extends BaseScope {
35
+	private final TypeResolutionContext context;
38
 	private final LocalMemberCache memberCache;
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
 	public FileScope(
40
 	public FileScope(
47
-			ZSPackage rootPackage,
48
-			PackageDefinitions packageDefinitions,
49
-			GlobalTypeRegistry globalRegistry,
41
+			TypeResolutionContext context,
50
 			List<ExpansionDefinition> expansions,
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
 	@Override
52
 	@Override
66
 	public LocalMemberCache getMemberCache() {
53
 	public LocalMemberCache getMemberCache() {
67
 		return memberCache;
54
 		return memberCache;
68
 	}
55
 	}
69
-	
70
-	public void register(String name, HighLevelDefinition type) {
71
-		importedTypes.put(name, type);
72
-	}
73
 
56
 
74
 	@Override
57
 	@Override
75
 	public IPartialExpression get(CodePosition position, GenericName name) {
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
 			return new PartialGlobalExpression(position, name.name, resolution, name.arguments);
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
 	@Override
71
 	@Override
92
 	public ITypeID getType(CodePosition position, List<GenericName> name) {
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
 			return type;
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
 			for (int i = 1; i < name.size(); i++) {
79
 			for (int i = 1; i < name.size(); i++) {
119
 				type = getTypeMembers(type).getInnerType(position, name.get(i));
80
 				type = getTypeMembers(type).getInnerType(position, name.get(i));
120
 				if (type == null)
81
 				if (type == null)
125
 				return type;
86
 				return type;
126
 		}
87
 		}
127
 		
88
 		
128
-		return rootPackage.getType(position, this, name);
89
+		return null;
129
 	}
90
 	}
130
 
91
 
131
 	@Override
92
 	@Override
155
 
116
 
156
 	@Override
117
 	@Override
157
 	public AnnotationDefinition getAnnotation(String name) {
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 View File

19
 import org.openzen.zenscript.codemodel.type.GenericName;
19
 import org.openzen.zenscript.codemodel.type.GenericName;
20
 import org.openzen.zenscript.codemodel.type.ITypeID;
20
 import org.openzen.zenscript.codemodel.type.ITypeID;
21
 import org.openzen.zenscript.codemodel.type.member.LocalMemberCache;
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
 	public AnnotationDefinition getAnnotation(String name) {
97
 	public AnnotationDefinition getAnnotation(String name) {
97
 		return outer.getAnnotation(name);
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 View File

20
 import org.openzen.zenscript.codemodel.type.GenericName;
20
 import org.openzen.zenscript.codemodel.type.GenericName;
21
 import org.openzen.zenscript.codemodel.type.ITypeID;
21
 import org.openzen.zenscript.codemodel.type.ITypeID;
22
 import org.openzen.zenscript.codemodel.type.member.LocalMemberCache;
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
 	public AnnotationDefinition getAnnotation(String name) {
111
 	public AnnotationDefinition getAnnotation(String name) {
111
 		return outer.getAnnotation(name);
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 View File

20
 import org.openzen.zenscript.codemodel.type.GenericName;
20
 import org.openzen.zenscript.codemodel.type.GenericName;
21
 import org.openzen.zenscript.codemodel.type.ITypeID;
21
 import org.openzen.zenscript.codemodel.type.ITypeID;
22
 import org.openzen.zenscript.codemodel.type.member.LocalMemberCache;
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
 	public AnnotationDefinition getAnnotation(String name) {
88
 	public AnnotationDefinition getAnnotation(String name) {
88
 		return outer.getAnnotation(name);
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 View File

16
 import org.openzen.zenscript.codemodel.type.GenericName;
16
 import org.openzen.zenscript.codemodel.type.GenericName;
17
 import org.openzen.zenscript.codemodel.type.ITypeID;
17
 import org.openzen.zenscript.codemodel.type.ITypeID;
18
 import org.openzen.zenscript.codemodel.type.member.LocalMemberCache;
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
 	public AnnotationDefinition getAnnotation(String name) {
77
 	public AnnotationDefinition getAnnotation(String name) {
77
 		return file.getAnnotation(name);
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 View File

22
 import org.openzen.zenscript.codemodel.type.GenericName;
22
 import org.openzen.zenscript.codemodel.type.GenericName;
23
 import org.openzen.zenscript.codemodel.type.ITypeID;
23
 import org.openzen.zenscript.codemodel.type.ITypeID;
24
 import org.openzen.zenscript.codemodel.type.member.LocalMemberCache;
24
 import org.openzen.zenscript.codemodel.type.member.LocalMemberCache;
25
+import org.openzen.zenscript.codemodel.type.member.TypeMemberPreparer;
25
 import org.openzen.zenscript.codemodel.type.member.TypeMemberPriority;
26
 import org.openzen.zenscript.codemodel.type.member.TypeMemberPriority;
26
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
27
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
27
 
28
 
38
 		this.outer = outer;
39
 		this.outer = outer;
39
 		this.implementation = implementation;
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
 		interfaceMembers.copyMembersTo(implementation.position, interfaceMembers, TypeMemberPriority.INHERITED);
44
 		interfaceMembers.copyMembersTo(implementation.position, interfaceMembers, TypeMemberPriority.INHERITED);
44
 		
45
 		
45
 		for (IDefinitionMember member : implementation.members) {
46
 		for (IDefinitionMember member : implementation.members) {
46
 			member.registerTo(members, TypeMemberPriority.SPECIFIED, new GenericMapper(outer.getTypeRegistry(), Collections.emptyMap()));
47
 			member.registerTo(members, TypeMemberPriority.SPECIFIED, new GenericMapper(outer.getTypeRegistry(), Collections.emptyMap()));
47
-		}
48
+		}*/
48
 	}
49
 	}
49
 
50
 
50
 	@Override
51
 	@Override
57
 		if (members.hasInnerType(name.name))
58
 		if (members.hasInnerType(name.name))
58
 			return new PartialTypeExpression(position, members.getInnerType(position, name), name.arguments);
59
 			return new PartialTypeExpression(position, members.getInnerType(position, name), name.arguments);
59
 		if (members.hasMember(name.name))
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
 		return outer.get(position, name);
63
 		return outer.get(position, name);
63
 	}
64
 	}
104
 	public AnnotationDefinition getAnnotation(String name) {
105
 	public AnnotationDefinition getAnnotation(String name) {
105
 		return outer.getAnnotation(name);
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 View File

19
 import org.openzen.zenscript.codemodel.type.GenericName;
19
 import org.openzen.zenscript.codemodel.type.GenericName;
20
 import org.openzen.zenscript.codemodel.type.ITypeID;
20
 import org.openzen.zenscript.codemodel.type.ITypeID;
21
 import org.openzen.zenscript.codemodel.type.member.LocalMemberCache;
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
 	public AnnotationDefinition getAnnotation(String name) {
96
 	public AnnotationDefinition getAnnotation(String name) {
96
 		return outer.getAnnotation(name);
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 View File

16
 import org.openzen.zenscript.codemodel.type.GenericName;
16
 import org.openzen.zenscript.codemodel.type.GenericName;
17
 import org.openzen.zenscript.codemodel.type.ITypeID;
17
 import org.openzen.zenscript.codemodel.type.ITypeID;
18
 import org.openzen.zenscript.codemodel.type.member.LocalMemberCache;
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
 	public AnnotationDefinition getAnnotation(String name) {
85
 	public AnnotationDefinition getAnnotation(String name) {
85
 		return outer.getAnnotation(name);
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 View File

12
 import org.openzen.zenscript.codemodel.partial.IPartialExpression;
12
 import org.openzen.zenscript.codemodel.partial.IPartialExpression;
13
 import org.openzen.zenscript.codemodel.statement.VarStatement;
13
 import org.openzen.zenscript.codemodel.statement.VarStatement;
14
 import org.openzen.zenscript.codemodel.type.GenericName;
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 View File

5
  */
5
  */
6
 package org.openzen.zenscript.codemodel.scope;
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
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
9
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
10
 import org.openzen.zenscript.codemodel.type.ITypeID;
10
 import org.openzen.zenscript.codemodel.type.ITypeID;
11
 import org.openzen.zenscript.codemodel.type.member.LocalMemberCache;
11
 import org.openzen.zenscript.codemodel.type.member.LocalMemberCache;
12
+import org.openzen.zenscript.codemodel.type.member.TypeMemberPreparer;
12
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
13
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
13
 
14
 
14
 /**
15
 /**
15
  *
16
  *
16
  * @author Hoofdgebruiker
17
  * @author Hoofdgebruiker
17
  */
18
  */
18
-public interface TypeScope {
19
+public interface TypeScope extends TypeResolutionContext {
19
 	public LocalMemberCache getMemberCache();
20
 	public LocalMemberCache getMemberCache();
20
 	
21
 	
21
 	default TypeMembers getTypeMembers(ITypeID type) {
22
 	default TypeMembers getTypeMembers(ITypeID type) {
22
 		return getMemberCache().get(type);
23
 		return getMemberCache().get(type);
23
 	}
24
 	}
24
 	
25
 	
26
+	@Override
25
 	default GlobalTypeRegistry getTypeRegistry() {
27
 	default GlobalTypeRegistry getTypeRegistry() {
26
 		return getMemberCache().getRegistry();
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 View File

23
  */
23
  */
24
 public class DefinitionTypeID implements ITypeID {
24
 public class DefinitionTypeID implements ITypeID {
25
 	public static DefinitionTypeID forType(HighLevelDefinition definition) {
25
 	public static DefinitionTypeID forType(HighLevelDefinition definition) {
26
-		if (definition.genericParameters != null)
26
+		if (definition.genericParameters != null && definition.genericParameters.length > 0)
27
 			throw new IllegalArgumentException("Definition has type arguments!");
27
 			throw new IllegalArgumentException("Definition has type arguments!");
28
 		
28
 		
29
 		return new DefinitionTypeID(null, definition, ITypeID.NONE);
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
 	public final HighLevelDefinition definition;
32
 	public final HighLevelDefinition definition;
35
 	public final ITypeID[] typeParameters;
33
 	public final ITypeID[] typeParameters;
36
 	public final DefinitionTypeID outer;
34
 	public final DefinitionTypeID outer;
48
 			throw new NullPointerException("typeParameters cannot be null");
46
 			throw new NullPointerException("typeParameters cannot be null");
49
 		if (typeParameters.length != definition.getNumberOfGenericParameters())
47
 		if (typeParameters.length != definition.getNumberOfGenericParameters())
50
 			throw new IllegalArgumentException("Wrong number of type parameters!");
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
 		this.definition = definition;
54
 		this.definition = definition;
53
 		this.typeParameters = typeParameters;
55
 		this.typeParameters = typeParameters;
129
 	public DefinitionTypeID instance(GenericMapper mapper) {
131
 	public DefinitionTypeID instance(GenericMapper mapper) {
130
 		if (!hasTypeParameters() && outer == null)
132
 		if (!hasTypeParameters() && outer == null)
131
 			return this;
133
 			return this;
134
+		if (mapper.getMapping().isEmpty())
135
+			return this;
132
 		
136
 		
133
 		ITypeID[] instancedArguments = ITypeID.NONE;
137
 		ITypeID[] instancedArguments = ITypeID.NONE;
134
 		if (hasTypeParameters()) {
138
 		if (hasTypeParameters()) {
221
 		final DefinitionTypeID other = (DefinitionTypeID) obj;
225
 		final DefinitionTypeID other = (DefinitionTypeID) obj;
222
 		return this.definition == other.definition
226
 		return this.definition == other.definition
223
 				&& Arrays.deepEquals(this.typeParameters, other.typeParameters)
227
 				&& Arrays.deepEquals(this.typeParameters, other.typeParameters)
224
-				&& outer == this.outer;
228
+				&& Objects.equals(outer, this.outer);
225
 	}
229
 	}
226
 	
230
 	
227
 	@Override
231
 	@Override
228
 	public String toString() {
232
 	public String toString() {
229
-		if (!hasTypeParameters()) {
233
+		if (!hasTypeParameters() && outer == null)
230
 			return definition.name;
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
 	@Override
251
 	@Override
257
 	public boolean isDestructible() {
263
 	public boolean isDestructible() {
258
 		return definition.isDestructible();
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 View File

5
  */
5
  */
6
 package org.openzen.zenscript.codemodel.type;
6
 package org.openzen.zenscript.codemodel.type;
7
 
7
 
8
+import java.util.List;
9
+
8
 /**
10
 /**
9
  *
11
  *
10
  * @author Hoofdgebruiker
12
  * @author Hoofdgebruiker
37
 		return arguments.length == 0;
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
 	@Override
53
 	@Override
41
 	public String toString() {
54
 	public String toString() {
42
 		StringBuilder result = new StringBuilder(name);
55
 		StringBuilder result = new StringBuilder(name);

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

5
  */
5
  */
6
 package org.openzen.zenscript.codemodel.type;
6
 package org.openzen.zenscript.codemodel.type;
7
 
7
 
8
-import java.util.Collections;
9
 import java.util.HashMap;
8
 import java.util.HashMap;
10
 import java.util.Map;
9
 import java.util.Map;
11
 import org.openzen.zenscript.codemodel.FunctionHeader;
10
 import org.openzen.zenscript.codemodel.FunctionHeader;
12
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
13
-import org.openzen.zenscript.codemodel.definition.FunctionDefinition;
14
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
12
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
15
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
13
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
16
-import org.openzen.zenscript.codemodel.type.member.TypeMembers;
17
 
14
 
18
 /**
15
 /**
19
  *
16
  *
142
 	}
139
 	}
143
 	
140
 	
144
 	public ITypeID getOptional(ITypeID original) {
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
 	public ITypeID getModified(int modifiers, ITypeID type) {
145
 	public ITypeID getModified(int modifiers, ITypeID type) {

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

6
 package org.openzen.zenscript.codemodel.type;
6
 package org.openzen.zenscript.codemodel.type;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
9
 import org.openzen.zenscript.codemodel.partial.IPartialExpression;
10
 import org.openzen.zenscript.codemodel.partial.IPartialExpression;
11
+import org.openzen.zenscript.codemodel.scope.BaseScope;
10
 
12
 
11
 /**
13
 /**
12
  *
14
  *
13
  * @author Hoofdgebruiker
15
  * @author Hoofdgebruiker
14
  */
16
  */
15
 public interface ISymbol {
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 View File

29
 		return null;
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
 	public boolean hasDefaultValue();
56
 	public boolean hasDefaultValue();

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

10
 import org.openzen.zenscript.codemodel.GenericMapper;
10
 import org.openzen.zenscript.codemodel.GenericMapper;
11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
12
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
13
-import org.openzen.zenscript.codemodel.type.member.TypeMembers;
14
 
13
 
15
 /**
14
 /**
16
  *
15
  *
17
  * @author Hoofdgebruiker
16
  * @author Hoofdgebruiker
18
  */
17
  */
19
 public class ModifiedTypeID implements ITypeID {
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
 	public final int modifiers;
23
 	public final int modifiers;
21
 	public final ITypeID baseType;
24
 	public final ITypeID baseType;
22
 	private final ITypeID normalized;
25
 	private final ITypeID normalized;
26
+	private final GlobalTypeRegistry registry;
23
 	
27
 	
24
 	public ModifiedTypeID(GlobalTypeRegistry registry, int modifiers, ITypeID baseType) {
28
 	public ModifiedTypeID(GlobalTypeRegistry registry, int modifiers, ITypeID baseType) {
25
 		this.modifiers = modifiers;
29
 		this.modifiers = modifiers;
26
 		this.baseType = baseType;
30
 		this.baseType = baseType;
31
+		this.registry = registry;
27
 		
32
 		
28
 		normalized = baseType.getNormalized() == baseType ? this : registry.getModified(modifiers, baseType.getNormalized());
33
 		normalized = baseType.getNormalized() == baseType ? this : registry.getModified(modifiers, baseType.getNormalized());
29
 	}
34
 	}
50
 
55
 
51
 	@Override
56
 	@Override
52
 	public boolean isOptional() {
57
 	public boolean isOptional() {
53
-		return (modifiers & TypeMembers.MODIFIER_OPTIONAL) > 0;
58
+		return (modifiers & MODIFIER_OPTIONAL) > 0;
54
 	}
59
 	}
55
 	
60
 	
61
+	@Override
56
 	public boolean isImmutable() {
62
 	public boolean isImmutable() {
57
-		return (modifiers & TypeMembers.MODIFIER_IMMUTABLE) > 0;
63
+		return (modifiers & MODIFIER_IMMUTABLE) > 0;
58
 	}
64
 	}
59
 
65
 
60
 	@Override
66
 	@Override
61
 	public boolean isConst() {
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
 	@Override
86
 	@Override
67
 		return baseType.isDefinition(definition);
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
 	@Override
96
 	@Override
84
 
105
 
85
 	@Override
106
 	@Override
86
 	public boolean hasDefaultValue() {
107
 	public boolean hasDefaultValue() {
87
-		return baseType.hasDefaultValue();
108
+		return isOptional() || baseType.hasDefaultValue();
88
 	}
109
 	}
89
 
110
 
90
 	@Override
111
 	@Override
116
 	
137
 	
117
 	@Override
138
 	@Override
118
 	public String toString() {
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 View File

7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
9
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
10
+import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
10
 import org.openzen.zenscript.codemodel.partial.IPartialExpression;
11
 import org.openzen.zenscript.codemodel.partial.IPartialExpression;
11
 import org.openzen.zenscript.codemodel.partial.PartialTypeExpression;
12
 import org.openzen.zenscript.codemodel.partial.PartialTypeExpression;
13
+import org.openzen.zenscript.codemodel.scope.BaseScope;
12
 
14
 
13
 /**
15
 /**
14
  *
16
  *
22
 	}
24
 	}
23
 	
25
 	
24
 	@Override
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
 	@Override
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 View File

87
 	
87
 	
88
 	public FunctionalMemberRef getUnaryMethod() {
88
 	public FunctionalMemberRef getUnaryMethod() {
89
 		for (TypeMember<FunctionalMemberRef> method : methods)
89
 		for (TypeMember<FunctionalMemberRef> method : methods)
90
-			if (method.member.header.parameters.length == 0)
90
+			if (method.member.getHeader().parameters.length == 0)
91
 				return method.member;
91
 				return method.member;
92
 		
92
 		
93
 		return null;
93
 		return null;
99
 	
99
 	
100
 	public boolean hasMethod(FunctionHeader header) {
100
 	public boolean hasMethod(FunctionHeader header) {
101
 		for (TypeMember<FunctionalMemberRef> method : methods) {
101
 		for (TypeMember<FunctionalMemberRef> method : methods) {
102
-			if (method.member.header.isEquivalentTo(header))
102
+			if (method.member.getHeader().isEquivalentTo(header))
103
 				return true;
103
 				return true;
104
 		}
104
 		}
105
 		
105
 		
143
 	}
143
 	}
144
 	
144
 	
145
 	public void addMethod(FunctionalMemberRef method, TypeMemberPriority priority) {
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
 				methods.set(i, methods.get(i).resolve(new TypeMember<>(priority, method)));
148
 				methods.set(i, methods.get(i).resolve(new TypeMember<>(priority, method)));
149
 				return;
149
 				return;
150
 			}
150
 			}
151
-		}
151
+		}*/
152
 		
152
 		
153
 		methods.add(new TypeMember<>(priority, method));
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
 		if (getter != null) {
157
 		if (getter != null) {
158
 			if (getter.member.isStatic()) {
158
 			if (getter.member.isStatic()) {
159
 				if (!allowStaticUsage)
159
 				if (!allowStaticUsage)
162
 				return getter.member.getStatic(position);
162
 				return getter.member.getStatic(position);
163
 			}
163
 			}
164
 			
164
 			
165
+			scope.getPreparer().prepare(getter.member.member);
165
 			return getter.member.get(position, target);
166
 			return getter.member.get(position, target);
166
 		} else if (field != null) {
167
 		} else if (field != null) {
167
 			if (field.member.isStatic()) {
168
 			if (field.member.isStatic()) {
171
 				return new GetStaticFieldExpression(position, field.member);
172
 				return new GetStaticFieldExpression(position, field.member);
172
 			}
173
 			}
173
 			
174
 			
175
+			scope.getPreparer().prepare(field.member.member);
174
 			return new GetFieldExpression(position, target, field.member);
176
 			return new GetFieldExpression(position, target, field.member);
175
 		} else {
177
 		} else {
176
 			throw new CompileException(position, CompileExceptionCode.MEMBER_NO_GETTER, "Value is not a property");
178
 			throw new CompileException(position, CompileExceptionCode.MEMBER_NO_GETTER, "Value is not a property");
183
 				if (!allowStaticUsage)
185
 				if (!allowStaticUsage)
184
 					throw new CompileException(position, CompileExceptionCode.USING_STATIC_ON_INSTANCE, "This field is static");
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
 		} else if (field != null) {
194
 		} else if (field != null) {
191
 			// TODO: perform proper checks on val fields
195
 			// TODO: perform proper checks on val fields
192
 			//if (field.isFinal)
196
 			//if (field.isFinal)
195
 				if (!allowStaticUsage)
199
 				if (!allowStaticUsage)
196
 					throw new CompileException(position, CompileExceptionCode.USING_STATIC_ON_INSTANCE, "This field is static");
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
 		} else {
208
 		} else {
203
 			throw new CompileException(position, CompileExceptionCode.MEMBER_NO_SETTER, "Value is not settable");
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
 		if (constant != null) {
214
 		if (constant != null) {
209
 			return new ConstExpression(position, constant.member);
215
 			return new ConstExpression(position, constant.member);
210
 		} else if (getter != null) {
216
 		} else if (getter != null) {
211
 			if (!getter.member.isStatic())
217
 			if (!getter.member.isStatic())
212
 				throw new CompileException(position, CompileExceptionCode.MEMBER_NOT_STATIC, "This getter is not static");
218
 				throw new CompileException(position, CompileExceptionCode.MEMBER_NOT_STATIC, "This getter is not static");
213
 			
219
 			
220
+			scope.getPreparer().prepare(getter.member.member);
214
 			return getter.member.getStatic(position);
221
 			return getter.member.getStatic(position);
215
 		} else if (field != null) {
222
 		} else if (field != null) {
216
 			if (!field.member.isStatic())
223
 			if (!field.member.isStatic())
217
 				throw new CompileException(position, CompileExceptionCode.MEMBER_NOT_STATIC, "This field is not static");
224
 				throw new CompileException(position, CompileExceptionCode.MEMBER_NOT_STATIC, "This field is not static");
218
 			
225
 			
226
+			scope.getPreparer().prepare(field.member.member);
219
 			return new GetStaticFieldExpression(position, field.member);
227
 			return new GetStaticFieldExpression(position, field.member);
220
 		} else {
228
 		} else {
221
 			throw new CompileException(position, CompileExceptionCode.MEMBER_NO_GETTER, "Member is not gettable");
229
 			throw new CompileException(position, CompileExceptionCode.MEMBER_NO_GETTER, "Member is not gettable");
227
 			if (!getter.member.isStatic())
235
 			if (!getter.member.isStatic())
228
 				throw new CompileException(position, CompileExceptionCode.MEMBER_NOT_STATIC, "This getter is not static");
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
 		} else if (field != null) {
240
 		} else if (field != null) {
232
 			//if (field.member.isFinal)
241
 			//if (field.member.isFinal)
233
 			//	throw new CompileException(position, CompileExceptionCode.MEMBER_IS_FINAL, "This field cannot be modified");
242
 			//	throw new CompileException(position, CompileExceptionCode.MEMBER_IS_FINAL, "This field cannot be modified");
234
 			if (!field.member.isStatic())
243
 			if (!field.member.isStatic())
235
 				throw new CompileException(position, CompileExceptionCode.MEMBER_NOT_STATIC, "This field is not static");
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
 		} else {
248
 		} else {
239
 			throw new CompileException(position, CompileExceptionCode.MEMBER_NO_SETTER, "Member is not settable");
249
 			throw new CompileException(position, CompileExceptionCode.MEMBER_NO_SETTER, "Member is not settable");
240
 		}
250
 		}
246
 			result[i] = new ArrayList<>();
256
 			result[i] = new ArrayList<>();
247
 		
257
 		
248
 		for (TypeMember<FunctionalMemberRef> method : methods) {
258
 		for (TypeMember<FunctionalMemberRef> method : methods) {
249
-			FunctionHeader header = method.member.header;
259
+			FunctionHeader header = method.member.getHeader();
250
 			if (header.parameters.length != arguments)
260
 			if (header.parameters.length != arguments)
251
 				continue;
261
 				continue;
252
 			
262
 			
271
 	
281
 	
272
 	public Expression call(CodePosition position, TypeScope scope, Expression target, CallArguments arguments, boolean allowStaticUsage) {
282
 	public Expression call(CodePosition position, TypeScope scope, Expression target, CallArguments arguments, boolean allowStaticUsage) {
273
 		FunctionalMemberRef method = selectMethod(position, scope, arguments, true, allowStaticUsage);
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
 		for (int i = 0; i < arguments.arguments.length; i++) {
285
 		for (int i = 0; i < arguments.arguments.length; i++) {
276
 			arguments.arguments[i] = arguments.arguments[i].castImplicit(position, scope, instancedHeader.parameters[i].type);
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
 		return method.call(position, target, instancedHeader, arguments, scope);
290
 		return method.call(position, target, instancedHeader, arguments, scope);
280
 	}
291
 	}
281
 	
292
 	
287
 		if (!method.isOperator()) {
298
 		if (!method.isOperator()) {
288
 			throw new CompileException(position, CompileExceptionCode.NO_SUCH_MEMBER, "Member is not an operator");
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
 	public Expression callWithComparator(
305
 	public Expression callWithComparator(
297
 			CallArguments arguments,
309
 			CallArguments arguments,
298
 			CompareType compareType) {
310
 			CompareType compareType) {
299
 		FunctionalMemberRef method = selectMethod(position, scope, arguments, true, false);
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
 		return method.callWithComparator(position, compareType, target, instancedHeader, arguments, scope);
313
 		return method.callWithComparator(position, compareType, target, instancedHeader, arguments, scope);
302
 	}
314
 	}
303
 	
315
 	
304
 	public Expression callStatic(CodePosition position, ITypeID target, TypeScope scope, CallArguments arguments) {
316
 	public Expression callStatic(CodePosition position, ITypeID target, TypeScope scope, CallArguments arguments) {
305
 		FunctionalMemberRef method = selectMethod(position, scope, arguments, false, true);
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
 		return method.callStatic(position, target, instancedHeader, arguments, scope);
319
 		return method.callStatic(position, target, instancedHeader, arguments, scope);
308
 	}
320
 	}
309
 	
321
 	
313
 			if (!(method.member.isStatic() ? allowStatic : allowNonStatic))
325
 			if (!(method.member.isStatic() ? allowStatic : allowNonStatic))
314
 				continue;
326
 				continue;
315
 			
327
 			
316
-			FunctionHeader header = method.member.header;
328
+			FunctionHeader header = method.member.getHeader();
317
 			if (header.matchesExactly(arguments, scope))
329
 			if (header.matchesExactly(arguments, scope))
318
 				return method.member;
330
 				return method.member;
319
 		}
331
 		}
323
 		for (TypeMember<FunctionalMemberRef> method : methods) {
335
 		for (TypeMember<FunctionalMemberRef> method : methods) {
324
 			if (!(method.member.isStatic() ? allowStatic : allowNonStatic))
336
 			if (!(method.member.isStatic() ? allowStatic : allowNonStatic))
325
 				continue;
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
 			if (!header.matchesImplicitly(arguments, scope))
344
 			if (!header.matchesImplicitly(arguments, scope))
329
 				continue;
345
 				continue;
330
 			
346
 			
331
 			if (selected != null) {
347
 			if (selected != null) {
332
 				StringBuilder explanation = new StringBuilder();
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
 				throw new CompileException(position, CompileExceptionCode.CALL_AMBIGUOUS, "Ambiguous call; multiple methods match:\n" + explanation.toString());
351
 				throw new CompileException(position, CompileExceptionCode.CALL_AMBIGUOUS, "Ambiguous call; multiple methods match:\n" + explanation.toString());
336
 			}
352
 			}
337
 			
353
 			
351
 					continue;
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
 			throw new CompileException(position, CompileExceptionCode.CALL_NO_VALID_METHOD, "No matching method found for " + name + ":\n" + message.toString());
373
 			throw new CompileException(position, CompileExceptionCode.CALL_NO_VALID_METHOD, "No matching method found for " + name + ":\n" + message.toString());
363
 	public FunctionalMemberRef getOverride(CodePosition position, TypeScope scope, FunctionalMember member) {
379
 	public FunctionalMemberRef getOverride(CodePosition position, TypeScope scope, FunctionalMember member) {
364
 		List<FunctionalMemberRef> candidates = new ArrayList<>();
380
 		List<FunctionalMemberRef> candidates = new ArrayList<>();
365
 		for (TypeMember<FunctionalMemberRef> method : methods) {
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
 				candidates.add(method.member);
383
 				candidates.add(method.member);
368
 		}
384
 		}
369
 		
385
 		

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

73
 import static org.openzen.zencode.shared.CodePosition.BUILTIN;
73
 import static org.openzen.zencode.shared.CodePosition.BUILTIN;
74
 import org.openzen.zencode.shared.CompileException;
74
 import org.openzen.zencode.shared.CompileException;
75
 import org.openzen.zencode.shared.CompileExceptionCode;
75
 import org.openzen.zencode.shared.CompileExceptionCode;
76
+import org.openzen.zenscript.codemodel.definition.InterfaceDefinition;
76
 
77
 
77
 /**
78
 /**
78
  *
79
  *
108
 			DefinitionMemberGroup group = members.getOrCreateGroup(OperatorType.EQUALS);
109
 			DefinitionMemberGroup group = members.getOrCreateGroup(OperatorType.EQUALS);
109
 			DefinitionMemberGroup inverse = members.getOrCreateGroup(OperatorType.NOTEQUALS);
110
 			DefinitionMemberGroup inverse = members.getOrCreateGroup(OperatorType.NOTEQUALS);
110
 			for (TypeMember<FunctionalMemberRef> method : group.getMethodMembers()) {
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
 			}
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
 		if (type.superType != null) {
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
 		} else {
476
 		} else {
470
 			getter(definition, OBJECT_HASHCODE, "objectHashCode", BasicTypeID.INT);
477
 			getter(definition, OBJECT_HASHCODE, "objectHashCode", BasicTypeID.INT);
471
 		}
478
 		}
1120
 	
1127
 	
1121
 	private void castedTargetCall(OperatorMember member, BuiltinID casterBuiltin) {
1128
 	private void castedTargetCall(OperatorMember member, BuiltinID casterBuiltin) {
1122
 		CasterMemberRef caster = castImplicitRef(member.definition, casterBuiltin, member.header.parameters[0].type);
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
 		members.getOrCreateGroup(member.operator).addMethod(method, TypeMemberPriority.SPECIFIED);
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 View File

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 View File

23
 import org.openzen.zenscript.codemodel.expression.SupertypeCastExpression;
23
 import org.openzen.zenscript.codemodel.expression.SupertypeCastExpression;
24
 import org.openzen.zenscript.codemodel.expression.WrapOptionalExpression;
24
 import org.openzen.zenscript.codemodel.expression.WrapOptionalExpression;
25
 import org.openzen.zenscript.codemodel.member.EnumConstantMember;
25
 import org.openzen.zenscript.codemodel.member.EnumConstantMember;
26
-import org.openzen.zenscript.codemodel.member.FunctionalMember;
27
 import org.openzen.zenscript.codemodel.member.InnerDefinition;
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
 import org.openzen.zenscript.codemodel.member.ref.CasterMemberRef;
27
 import org.openzen.zenscript.codemodel.member.ref.CasterMemberRef;
31
 import org.openzen.zenscript.codemodel.member.ref.ConstMemberRef;
28
 import org.openzen.zenscript.codemodel.member.ref.ConstMemberRef;
32
 import org.openzen.zenscript.codemodel.member.ref.FieldMemberRef;
29
 import org.openzen.zenscript.codemodel.member.ref.FieldMemberRef;
52
  * @author Hoofdgebruiker
49
  * @author Hoofdgebruiker
53
  */
50
  */
54
 public final class TypeMembers {
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
 	private final LocalMemberCache cache;
52
 	private final LocalMemberCache cache;
60
 	public final ITypeID type;
53
 	public final ITypeID type;
61
 	
54
 	
72
 	public TypeMembers(LocalMemberCache cache, ITypeID type) {
65
 	public TypeMembers(LocalMemberCache cache, ITypeID type) {
73
 		if (type == null)
66
 		if (type == null)
74
 			throw new NullPointerException("Type must not be null!");
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
 		this.cache = cache;
71
 		this.cache = cache;
77
 		this.type = type;
72
 		this.type = type;
295
 		if (operator == CompareType.EQ) {
290
 		if (operator == CompareType.EQ) {
296
 			DefinitionMemberGroup equal = getOrCreateGroup(OperatorType.EQUALS);
291
 			DefinitionMemberGroup equal = getOrCreateGroup(OperatorType.EQUALS);
297
 			for (TypeMember<FunctionalMemberRef> member : equal.getMethodMembers()) {
292
 			for (TypeMember<FunctionalMemberRef> member : equal.getMethodMembers()) {
298
-				if (member.member.header.accepts(scope, right))
293
+				if (member.member.getHeader().accepts(scope, right))
299
 					return equal.call(position, scope, left, new CallArguments(right), false);
294
 					return equal.call(position, scope, left, new CallArguments(right), false);
300
 			}
295
 			}
301
 		} else if (operator == CompareType.NE) {
296
 		} else if (operator == CompareType.NE) {
302
 			DefinitionMemberGroup equal = getOrCreateGroup(OperatorType.NOTEQUALS);
297
 			DefinitionMemberGroup equal = getOrCreateGroup(OperatorType.NOTEQUALS);
303
 			for (TypeMember<FunctionalMemberRef> member : equal.getMethodMembers()) {
298
 			for (TypeMember<FunctionalMemberRef> member : equal.getMethodMembers()) {
304
-				if (member.member.header.accepts(scope, right)) {
299
+				if (member.member.getHeader().accepts(scope, right)) {
305
 					return equal.call(position, scope, left, new CallArguments(right), false);
300
 					return equal.call(position, scope, left, new CallArguments(right), false);
306
 				}
301
 				}
307
 			}
302
 			}
316
 		return members.call(position, scope, value, new CallArguments(Expression.NONE), false);
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
 	public IteratorMemberRef getIterator(int variables) {
314
 	public IteratorMemberRef getIterator(int variables) {
325
 		for (TypeMember<IteratorMemberRef> iterator : iterators)
315
 		for (TypeMember<IteratorMemberRef> iterator : iterators)
326
 			if (iterator.member.getLoopVariableCount() == variables)
316
 			if (iterator.member.getLoopVariableCount() == variables)
343
 			return true;
333
 			return true;
344
 		if (toType == null)
334
 		if (toType == null)
345
 			throw new NullPointerException();
335
 			throw new NullPointerException();
336
+		if (toType == BasicTypeID.UNDETERMINED)
337
+			throw new IllegalArgumentException("Cannot cast to undetermined type!");
346
 		
338
 		
347
 		if (type == BasicTypeID.NULL && toType.isOptional())
339
 		if (type == BasicTypeID.NULL && toType.isOptional())
348
 			return true;
340
 			return true;
349
-		if (toType.isOptional() && canCastImplicit(toType.unwrap()))
341
+		if (toType.isOptional() && canCastImplicit(toType.withoutOptional()))
350
 			return true;
342
 			return true;
351
-		if (toType.isConst() && canCastImplicit(toType.unwrap()))
343
+		if (toType.isConst() && canCastImplicit(toType.withoutConst()))
352
 			return true;
344
 			return true;
353
-		if (type.isOptional() && type.unwrap() == toType)
345
+		if (type.isOptional() && type.withoutOptional() == toType)
354
 			return true;
346
 			return true;
355
 		
347
 		
356
 		return getImplicitCaster(toType) != null || extendsOrImplements(toType);
348
 		return getImplicitCaster(toType) != null || extendsOrImplements(toType);
398
 		
390
 		
399
 		if (type == BasicTypeID.NULL && toType.isOptional())
391
 		if (type == BasicTypeID.NULL && toType.isOptional())
400
 			return new NullExpression(position, toType);
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
 			return new CheckNullExpression(position, value);
398
 			return new CheckNullExpression(position, value);
407
 		
399
 		
408
 		for (TypeMember<CasterMemberRef> caster : casters) {
400
 		for (TypeMember<CasterMemberRef> caster : casters) {
435
 		return members.containsKey(name);
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
 		if (members.containsKey(name.name)) {
431
 		if (members.containsKey(name.name)) {
440
 			DefinitionMemberGroup group = members.get(name.name);
432
 			DefinitionMemberGroup group = members.get(name.name);
441
 			
433
 			
442
 			if (group.isStatic)
434
 			if (group.isStatic)
443
-				return new PartialStaticMemberGroupExpression(position, type, group, name.arguments);
435
+				return new PartialStaticMemberGroupExpression(position, scope, type, group, name.arguments);
444
 			else
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
 		return null;
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
 		if (members.containsKey(name.name))
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
 		if (innerTypes.containsKey(name.name))
446
 		if (innerTypes.containsKey(name.name))
455
 			return new PartialTypeExpression(position, innerTypes.get(name.name).instance(cache.getRegistry(), name.arguments, (DefinitionTypeID)type), name.arguments);
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 View File

8
 import java.util.HashMap;
8
 import java.util.HashMap;
9
 import java.util.List;
9
 import java.util.List;
10
 import java.util.Map;
10
 import java.util.Map;
11
+import org.openzen.zencode.shared.CodePosition;
11
 import org.openzen.zenscript.codemodel.annotations.AnnotationDefinition;
12
 import org.openzen.zenscript.codemodel.annotations.AnnotationDefinition;
12
 import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
13
 import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
13
 import org.openzen.zenscript.codemodel.scope.TypeScope;
14
 import org.openzen.zenscript.codemodel.scope.TypeScope;
15
+import org.openzen.zenscript.codemodel.type.GenericName;
14
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
16
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
15
 import org.openzen.zenscript.codemodel.type.ITypeID;
17
 import org.openzen.zenscript.codemodel.type.ITypeID;
16
 import org.openzen.zenscript.codemodel.type.member.LocalMemberCache;
18
 import org.openzen.zenscript.codemodel.type.member.LocalMemberCache;
19
+import org.openzen.zenscript.codemodel.type.member.TypeMemberPreparer;
17
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
20
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
18
 
21
 
19
 /**
22
 /**
26
 	private final LocalMemberCache cache;
29
 	private final LocalMemberCache cache;
27
 	private final Map<String, AnnotationDefinition> annotations = new HashMap<>();
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
 		this.globalRegistry = globalRegistry;
33
 		this.globalRegistry = globalRegistry;
31
 		this.expansions = expansions;
34
 		this.expansions = expansions;
32
 		this.cache = new LocalMemberCache(globalRegistry, expansions);
35
 		this.cache = new LocalMemberCache(globalRegistry, expansions);
55
 	public AnnotationDefinition getAnnotation(String name) {
58
 	public AnnotationDefinition getAnnotation(String name) {
56
 		return annotations.get(name);
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 View File

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

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

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

15
 import org.json.JSONObject;
15
 import org.json.JSONObject;
16
 import org.openzen.zencode.shared.CompileException;
16
 import org.openzen.zencode.shared.CompileException;
17
 import org.openzen.zencode.shared.FileSourceFile;
17
 import org.openzen.zencode.shared.FileSourceFile;
18
+import org.openzen.zenscript.codemodel.context.CompilingPackage;
18
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
19
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
19
 import org.openzen.zenscript.compiler.CompilationUnit;
20
 import org.openzen.zenscript.compiler.CompilationUnit;
20
 import org.openzen.zenscript.constructor.ConstructorException;
21
 import org.openzen.zenscript.constructor.ConstructorException;
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
 			for (String dependencyName : dependencyNames)
74
 			for (String dependencyName : dependencyNames)
73
 				space.addModule(dependencyName, loader.getModule(dependencyName));
75
 				space.addModule(dependencyName, loader.getModule(dependencyName));
74
 
76
 
75
 			Module module = new Module(moduleName, directory, jsonFile, exceptionLogger);
77
 			Module module = new Module(moduleName, directory, jsonFile, exceptionLogger);
76
 			ZSPackage pkg = isStdlib ? unit.globalTypeRegistry.stdlib : new ZSPackage(null, module.packageName);
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
 			JSONObject globals = json.optJSONObject("globals");
84
 			JSONObject globals = json.optJSONObject("globals");
82
 			if (globals != null) {
85
 			if (globals != null) {

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

29
 	public final ZSPackage globalsPackage = new ZSPackage(null, "");
29
 	public final ZSPackage globalsPackage = new ZSPackage(null, "");
30
 	private final List<ExpansionDefinition> expansions = new ArrayList<>();
30
 	private final List<ExpansionDefinition> expansions = new ArrayList<>();
31
 	private final Map<String, ISymbol> globals = new HashMap<>();
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
 		this.compilationUnit = compilationUnit;
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
 	public void addModule(String name, SemanticModule dependency) {
42
 	public void addModule(String name, SemanticModule dependency) {
54
 		}
51
 		}
55
 	}
52
 	}
56
 	
53
 	
54
+	public void addGlobal(String name, ISymbol global) {
55
+		globals.put(name, global);
56
+	}
57
+	
57
 	public ZSPackage collectPackages() {
58
 	public ZSPackage collectPackages() {
58
 		return rootPackage;
59
 		return rootPackage;
59
 	}
60
 	}
66
 		return globals;
67
 		return globals;
67
 	}
68
 	}
68
 	
69
 	
69
-	public List<AnnotationDefinition> getAnnotations() {
70
+	public AnnotationDefinition[] getAnnotations() {
70
 		return annotations;
71
 		return annotations;
71
 	}
72
 	}
72
 }
73
 }

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

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

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

220
 					argument.accept(clinitStatementVisitor.expressionVisitor);
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
 				clinitWriter.putStaticField(internalName, constant.name, "L" + internalName + ";");
224
 				clinitWriter.putStaticField(internalName, constant.name, "L" + internalName + ";");
225
 				
225
 				
226
 				enumDefinition = (EnumDefinition) constant.definition;
226
 				enumDefinition = (EnumDefinition) constant.definition;

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

99
 	K_IMPLICIT(true, "implicit"),
99
 	K_IMPLICIT(true, "implicit"),
100
 	K_VIRTUAL(true, "virtual"),
100
 	K_VIRTUAL(true, "virtual"),
101
 	K_EXTERN(true, "extern"),
101
 	K_EXTERN(true, "extern"),
102
+	K_IMMUTABLE(true, "immutable"),
102
 	
103
 	
103
 	K_VAL(true, "val"),
104
 	K_VAL(true, "val"),
104
 	K_VAR(true, "var"),
105
 	K_VAR(true, "var"),

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

5
  */
5
  */
6
 package org.openzen.zenscript.parser;
6
 package org.openzen.zenscript.parser;
7
 
7
 
8
+import java.util.Map;
8
 import org.openzen.zencode.shared.CodePosition;
9
 import org.openzen.zencode.shared.CodePosition;
9
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
10
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
11
+import org.openzen.zenscript.codemodel.context.CompilingType;
12
+import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
10
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
13
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
11
 import org.openzen.zenscript.lexer.ZSTokenParser;
14
 import org.openzen.zenscript.lexer.ZSTokenParser;
12
 import static org.openzen.zenscript.lexer.ZSTokenType.*;
15
 import static org.openzen.zenscript.lexer.ZSTokenType.*;
24
  *
27
  *
25
  * @author Hoofdgebruiker
28
  * @author Hoofdgebruiker
26
  */
29
  */
27
-public abstract class ParsedDefinition {
30
+public abstract class ParsedDefinition implements CompilingType {
28
 	public static ParsedDefinition parse(ZSPackage pkg, CodePosition position, int modifiers, ParsedAnnotation[] annotations, ZSTokenParser tokens, HighLevelDefinition outerDefinition) {
31
 	public static ParsedDefinition parse(ZSPackage pkg, CodePosition position, int modifiers, ParsedAnnotation[] annotations, ZSTokenParser tokens, HighLevelDefinition outerDefinition) {
29
 		if (tokens.optional(K_CLASS) != null) {
32
 		if (tokens.optional(K_CLASS) != null) {
30
 			return ParsedClass.parseClass(pkg, position, modifiers, annotations, tokens, outerDefinition);
33
 			return ParsedClass.parseClass(pkg, position, modifiers, annotations, tokens, outerDefinition);
58
 		this.annotations = annotations;
61
 		this.annotations = annotations;
59
 	}
62
 	}
60
 	
63
 	
64
+	public String getName() {
65
+		return getCompiled().name;
66
+	}
67
+	
61
 	public final CodePosition getPosition() {
68
 	public final CodePosition getPosition() {
62
 		return position;
69
 		return position;
63
 	}
70
 	}
68
 	
75
 	
69
 	public abstract HighLevelDefinition getCompiled();
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 View File

22
 import org.openzen.zenscript.codemodel.PackageDefinitions;
22
 import org.openzen.zenscript.codemodel.PackageDefinitions;
23
 import org.openzen.zenscript.codemodel.ScriptBlock;
23
 import org.openzen.zenscript.codemodel.ScriptBlock;
24
 import org.openzen.zenscript.codemodel.WhitespacePostComment;
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
 import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
28
 import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
26
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
29
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
27
 import org.openzen.zenscript.codemodel.statement.Statement;
30
 import org.openzen.zenscript.codemodel.statement.Statement;
28
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
31
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
29
-import org.openzen.zenscript.lexer.ZSToken;
30
 import org.openzen.zenscript.lexer.ZSTokenParser;
32
 import org.openzen.zenscript.lexer.ZSTokenParser;
31
 import static org.openzen.zenscript.lexer.ZSTokenType.*;
33
 import static org.openzen.zenscript.lexer.ZSTokenType.*;
32
 import org.openzen.zenscript.codemodel.scope.FileScope;
34
 import org.openzen.zenscript.codemodel.scope.FileScope;
40
  * @author Hoofdgebruiker
42
  * @author Hoofdgebruiker
41
  */
43
  */
42
 public class ParsedFile {
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
 		try {
50
 		try {
49
-			return parse(pkg, bracketParser, new LiteralSourceFile(filename, content));
51
+			return parse(pkg, compilingPackage, bracketParser, new LiteralSourceFile(filename, content));
50
 		} catch (IOException ex) {
52
 		} catch (IOException ex) {
51
 			throw new AssertionError(); // shouldn't happen
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
 		ZSTokenParser tokens = ZSTokenParser.create(file, bracketParser, 4);
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
 		ParsedFile result = new ParsedFile(tokens.getFile());
63
 		ParsedFile result = new ParsedFile(tokens.getFile());
62
 
64
 
63
 		while (true) {
65
 		while (true) {
109
 					result.statements.add(ParsedStatement.parse(tokens, annotations));
111
 					result.statements.add(ParsedStatement.parse(tokens, annotations));
110
 				} else {
112
 				} else {
111
 					result.definitions.add(definition);
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
 	
144
 	
139
 	public void listDefinitions(PackageDefinitions definitions) {
145
 	public void listDefinitions(PackageDefinitions definitions) {
140
 		for (ParsedDefinition definition : this.definitions) {
146
 		for (ParsedDefinition definition : this.definitions) {
141
-			definition.getCompiled().setTag(SourceFile.class, file);
142
 			definitions.add(definition.getCompiled());
147
 			definitions.add(definition.getCompiled());
143
-			definition.linkInnerTypes();
144
 		}
148
 		}
145
 	}
149
 	}
146
 	
150
 	
147
 	public void compileTypes(
151
 	public void compileTypes(
152
+			ModuleTypeResolutionContext moduleContext,
148
 			ZSPackage rootPackage,
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
 		for (ParsedDefinition definition : this.definitions) {
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
 			ZSPackage rootPackage,
165
 			ZSPackage rootPackage,
164
-			ZSPackage modulePackage,
165
-			PackageDefinitions packageDefinitions,
166
-			GlobalTypeRegistry globalRegistry,
166
+			CompilingPackage modulePackage,
167
 			List<ExpansionDefinition> expansions,
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
 		for (ParsedDefinition definition : this.definitions) {
173
 		for (ParsedDefinition definition : this.definitions) {
173
-			definition.compileMembers(scope);
174
+			definition.registerMembers(scope, precompiler);
174
 		}
175
 		}
175
 	}
176
 	}
176
 	
177
 	
177
 	public void compileCode(
178
 	public void compileCode(
179
+			ModuleTypeResolutionContext moduleContext,
180
+			PrecompilationState precompiler,
178
 			ZSPackage rootPackage,
181
 			ZSPackage rootPackage,
179
-			ZSPackage modulePackage,
180
-			PackageDefinitions packageDefinitions,
181
-			GlobalTypeRegistry globalRegistry,
182
+			CompilingPackage modulePackage,
182
 			List<ExpansionDefinition> expansions,
183
 			List<ExpansionDefinition> expansions,
183
 			List<ScriptBlock> scripts,
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
 		for (ParsedDefinition definition : this.definitions) {
190
 		for (ParsedDefinition definition : this.definitions) {
197
-			definition.compileCode(scope, state);
191
+			definition.compile(scope);
198
 		}
192
 		}
199
 		
193
 		
200
 		if (!statements.isEmpty() || postComment != null) {
194
 		if (!statements.isEmpty() || postComment != null) {
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
 		for (ParsedImport importEntry : imports) {
209
 		for (ParsedImport importEntry : imports) {
216
 			HighLevelDefinition definition;
210
 			HighLevelDefinition definition;
217
 			if (importEntry.isRelative()) {
211
 			if (importEntry.isRelative()) {
218
-				definition = modulePackage.getImport(importEntry.getPath(), 0);
212
+				definition = modulePackage.getImport(context, importEntry.getPath());
219
 			} else {
213
 			} else {
220
 				definition = rootPackage.getImport(importEntry.getPath(), 0);
214
 				definition = rootPackage.getImport(importEntry.getPath(), 0);
221
 			}
215
 			}
223
 			if (definition == null)
217
 			if (definition == null)
224
 				throw new CompileException(importEntry.position, CompileExceptionCode.IMPORT_NOT_FOUND, "Could not find type " + importEntry.toString());
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 View File

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

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

29
 	public SimpleBracketSubParser(GlobalTypeRegistry registry, FunctionalMemberRef method) {
29
 	public SimpleBracketSubParser(GlobalTypeRegistry registry, FunctionalMemberRef method) {
30
 		if (!method.isStatic())
30
 		if (!method.isStatic())
31
 			throw new IllegalArgumentException("Method must be static");
31
 			throw new IllegalArgumentException("Method must be static");
32
-		if (method.header.getNumberOfTypeParameters() > 0)
32
+		if (method.getHeader().getNumberOfTypeParameters() > 0)
33
 			throw new IllegalArgumentException("Method cannot have type parameters");
33
 			throw new IllegalArgumentException("Method cannot have type parameters");
34
 		
34
 		
35
 		this.method = method;
35
 		this.method = method;
57
 
57
 
58
 		@Override
58
 		@Override
59
 		public IPartialExpression compile(ExpressionScope scope) {
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
 		@Override
63
 		@Override
64
 		public boolean hasStrongType() {
64
 		public boolean hasStrongType() {
65
 			return true;
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 View File

6
 package org.openzen.zenscript.parser.definitions;
6
 package org.openzen.zenscript.parser.definitions;
7
 
7
 
8
 import java.util.ArrayList;
8
 import java.util.ArrayList;
9
+import java.util.HashMap;
9
 import java.util.List;
10
 import java.util.List;
11
+import java.util.Map;
10
 import org.openzen.zencode.shared.CodePosition;
12
 import org.openzen.zencode.shared.CodePosition;
11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
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
 import org.openzen.zenscript.codemodel.scope.BaseScope;
17
 import org.openzen.zenscript.codemodel.scope.BaseScope;
13
 import org.openzen.zenscript.codemodel.scope.DefinitionScope;
18
 import org.openzen.zenscript.codemodel.scope.DefinitionScope;
14
 import org.openzen.zenscript.parser.ParsedAnnotation;
19
 import org.openzen.zenscript.parser.ParsedAnnotation;
15
 import org.openzen.zenscript.parser.ParsedDefinition;
20
 import org.openzen.zenscript.parser.ParsedDefinition;
16
 import org.openzen.zenscript.parser.PrecompilationState;
21
 import org.openzen.zenscript.parser.PrecompilationState;
17
 import org.openzen.zenscript.parser.member.ParsedDefinitionMember;
22
 import org.openzen.zenscript.parser.member.ParsedDefinitionMember;
18
-import org.openzen.zenscript.parser.member.ParsedInnerDefinition;
19
 
23
 
20
 /**
24
 /**
21
  *
25
  *
24
 public abstract class BaseParsedDefinition extends ParsedDefinition {
28
 public abstract class BaseParsedDefinition extends ParsedDefinition {
25
 	protected final List<ParsedDefinitionMember> members = new ArrayList<>();
29
 	protected final List<ParsedDefinitionMember> members = new ArrayList<>();
26
 	private boolean typesCompiled = false;
30
 	private boolean typesCompiled = false;
31
+	private final Map<String, CompilingType> innerTypes = new HashMap<>();
32
+	private boolean isCompiled = false;
27
 	
33
 	
28
 	public BaseParsedDefinition(CodePosition position, int modifiers, ParsedAnnotation[] annotations) {
34
 	public BaseParsedDefinition(CodePosition position, int modifiers, ParsedAnnotation[] annotations) {
29
 		super(position, modifiers, annotations);
35
 		super(position, modifiers, annotations);
31
 	
37
 	
32
 	public void addMember(ParsedDefinitionMember member) {
38
 	public void addMember(ParsedDefinitionMember member) {
33
 		members.add(member);
39
 		members.add(member);
40
+		member.registerInnerTypes(innerTypes);
34
 	}
41
 	}
35
 	
42
 	
36
 	@Override
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
 		if (typesCompiled)
45
 		if (typesCompiled)
51
 			return;
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
 	@Override
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
 		DefinitionScope innerScope = new DefinitionScope(scope, getCompiled());
63
 		DefinitionScope innerScope = new DefinitionScope(scope, getCompiled());
73
 		for (ParsedDefinitionMember member : members) {
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
 	@Override
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
 		DefinitionScope innerScope = new DefinitionScope(scope, getCompiled());
78
 		DefinitionScope innerScope = new DefinitionScope(scope, getCompiled());
82
 		for (ParsedDefinitionMember member : members)
79
 		for (ParsedDefinitionMember member : members)
83
-			state.register(innerScope, member);
80
+			member.compile(innerScope);
84
 	}
81
 	}
85
 	
82
 	
86
 	@Override
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
 	@Override
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 View File

5
  */
5
  */
6
 package org.openzen.zenscript.parser.definitions;
6
 package org.openzen.zenscript.parser.definitions;
7
 
7
 
8
-import java.util.HashMap;
9
 import java.util.List;
8
 import java.util.List;
10
-import java.util.Map;
11
-import java.util.function.Function;
12
 import org.openzen.zencode.shared.CodePosition;
9
 import org.openzen.zencode.shared.CodePosition;
13
-import org.openzen.zenscript.codemodel.FunctionHeader;
14
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
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
 import org.openzen.zenscript.codemodel.definition.AliasDefinition;
14
 import org.openzen.zenscript.codemodel.definition.AliasDefinition;
17
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
15
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
18
-import org.openzen.zenscript.codemodel.expression.Expression;
19
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
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
 import org.openzen.zenscript.lexer.ZSTokenParser;
17
 import org.openzen.zenscript.lexer.ZSTokenParser;
23
 import org.openzen.zenscript.lexer.ZSTokenType;
18
 import org.openzen.zenscript.lexer.ZSTokenType;
24
 import org.openzen.zenscript.codemodel.scope.BaseScope;
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
 import org.openzen.zenscript.parser.ParsedAnnotation;
20
 import org.openzen.zenscript.parser.ParsedAnnotation;
31
 import org.openzen.zenscript.parser.ParsedDefinition;
21
 import org.openzen.zenscript.parser.ParsedDefinition;
32
 import org.openzen.zenscript.parser.PrecompilationState;
22
 import org.openzen.zenscript.parser.PrecompilationState;
51
 	private final IParsedType type;
41
 	private final IParsedType type;
52
 	
42
 	
53
 	private final AliasDefinition compiled;
43
 	private final AliasDefinition compiled;
44
+	private boolean typesLinked = false;
54
 	
45
 	
55
 	public ParsedAlias(ZSPackage pkg, CodePosition position, int modifiers, ParsedAnnotation[] annotations, String name, List<ParsedTypeParameter> parameters, IParsedType type, HighLevelDefinition outerDefinition) {
46
 	public ParsedAlias(ZSPackage pkg, CodePosition position, int modifiers, ParsedAnnotation[] annotations, String name, List<ParsedTypeParameter> parameters, IParsedType type, HighLevelDefinition outerDefinition) {
56
 		super(position, modifiers, annotations);
47
 		super(position, modifiers, annotations);
71
 	}
62
 	}
72
 	
63
 	
73
 	@Override
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
 		for (int i = 0; i < compiled.genericParameters.length; i++) {
73
 		for (int i = 0; i < compiled.genericParameters.length; i++) {
88
 			TypeParameter output = compiled.genericParameters[i];
74
 			TypeParameter output = compiled.genericParameters[i];
89
 			ParsedTypeParameter input = this.parameters.get(i);
75
 			ParsedTypeParameter input = this.parameters.get(i);
90
 			for (ParsedGenericBound bound : input.bounds) {
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
 	@Override
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
 	@Override
87
 	@Override
102
-	public void precompile(BaseScope scope, PrecompilationState state) {
88
+	public void registerMembers(BaseScope scope, PrecompilationState state) {
103
 		// nothing to do
89
 		// nothing to do
104
 	}
90
 	}
105
 
91
 
106
 	@Override
92
 	@Override
107
-	public void compileCode(BaseScope scope, PrecompilationState state) {
93
+	public void compile(BaseScope scope) {
108
 		// nothing to do
94
 		// nothing to do
109
 	}
95
 	}
110
 
96
 
111
 	@Override
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 View File

8
 import java.util.List;
8
 import java.util.List;
9
 import org.openzen.zencode.shared.CodePosition;
9
 import org.openzen.zencode.shared.CodePosition;
10
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
10
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
11
+import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
11
 import org.openzen.zenscript.codemodel.definition.ClassDefinition;
12
 import org.openzen.zenscript.codemodel.definition.ClassDefinition;
12
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
13
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
13
 import org.openzen.zenscript.lexer.ZSTokenParser;
14
 import org.openzen.zenscript.lexer.ZSTokenParser;
14
 import org.openzen.zenscript.lexer.ZSTokenType;
15
 import org.openzen.zenscript.lexer.ZSTokenType;
15
-import org.openzen.zenscript.codemodel.scope.BaseScope;
16
-import org.openzen.zenscript.codemodel.scope.GenericFunctionScope;
17
 import org.openzen.zenscript.parser.ParsedAnnotation;
16
 import org.openzen.zenscript.parser.ParsedAnnotation;
18
 import org.openzen.zenscript.parser.member.ParsedDefinitionMember;
17
 import org.openzen.zenscript.parser.member.ParsedDefinitionMember;
19
 import org.openzen.zenscript.parser.type.IParsedType;
18
 import org.openzen.zenscript.parser.type.IParsedType;
62
 	}
61
 	}
63
 
62
 
64
 	@Override
63
 	@Override
65
-	public void compileMembers(BaseScope scope) {
66
-		ParsedTypeParameter.compile(scope, compiled.genericParameters, genericParameters);
64
+	protected void linkTypesLocal(TypeResolutionContext context) {
67
 		if (superclass != null)
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 View File

9
 import java.util.List;
9
 import java.util.List;
10
 import org.openzen.zencode.shared.CodePosition;
10
 import org.openzen.zencode.shared.CodePosition;
11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
+import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
12
 import org.openzen.zenscript.codemodel.definition.EnumDefinition;
13
 import org.openzen.zenscript.codemodel.definition.EnumDefinition;
13
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
14
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
14
 import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
15
 import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
68
 	}
69
 	}
69
 	
70
 	
70
 	@Override
71
 	@Override
71
-	public void compileMembers(BaseScope scope) {
72
-		super.compileMembers(scope);
73
-		
72
+	protected void linkTypesLocal(TypeResolutionContext context) {
74
 		for (ParsedEnumConstant constant : enumValues) {
73
 		for (ParsedEnumConstant constant : enumValues) {
75
 			compiled.addEnumConstant(constant.getCompiled());
74
 			compiled.addEnumConstant(constant.getCompiled());
76
 		}
75
 		}
76
+		
77
+		super.linkTypesLocal(context);
77
 	}
78
 	}
78
 
79
 
79
 	@Override
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
 		DefinitionTypeID type = scope.getTypeRegistry().getForDefinition(compiled, ITypeID.NONE);
84
 		DefinitionTypeID type = scope.getTypeRegistry().getForDefinition(compiled, ITypeID.NONE);
84
 		ExpressionScope evalScope = new ExpressionScope(scope);
85
 		ExpressionScope evalScope = new ExpressionScope(scope);

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

10
 import org.openzen.zencode.shared.CompileException;
10
 import org.openzen.zencode.shared.CompileException;
11
 import org.openzen.zencode.shared.CompileExceptionCode;
11
 import org.openzen.zencode.shared.CompileExceptionCode;
12
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
13
+import org.openzen.zenscript.codemodel.context.LocalTypeResolutionContext;
14
+import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
13
 import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
15
 import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
14
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
16
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
15
 import org.openzen.zenscript.lexer.ZSTokenParser;
17
 import org.openzen.zenscript.lexer.ZSTokenParser;
57
 	}
59
 	}
58
 
60
 
59
 	@Override
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
 		if (compiled.target == null)
65
 		if (compiled.target == null)
64
 			throw new CompileException(position, CompileExceptionCode.INTERNAL_ERROR, "Could not compile expansion target: " + target);
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 View File

7
 package org.openzen.zenscript.parser.definitions;
7
 package org.openzen.zenscript.parser.definitions;
8
 
8
 
9
 import org.openzen.zencode.shared.CodePosition;
9
 import org.openzen.zencode.shared.CodePosition;
10
-import org.openzen.zencode.shared.CompileException;
11
-import org.openzen.zencode.shared.CompileExceptionCode;
12
 import static org.openzen.zenscript.lexer.ZSTokenType.*;
10
 import static org.openzen.zenscript.lexer.ZSTokenType.*;
13
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
+import org.openzen.zenscript.codemodel.context.CompilingType;
13
+import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
14
 import org.openzen.zenscript.codemodel.definition.FunctionDefinition;
14
 import org.openzen.zenscript.codemodel.definition.FunctionDefinition;
15
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
15
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
16
 import org.openzen.zenscript.lexer.ZSTokenParser;
16
 import org.openzen.zenscript.lexer.ZSTokenParser;
17
 import org.openzen.zenscript.codemodel.scope.BaseScope;
17
 import org.openzen.zenscript.codemodel.scope.BaseScope;
18
 import org.openzen.zenscript.codemodel.scope.FunctionScope;
18
 import org.openzen.zenscript.codemodel.scope.FunctionScope;
19
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
19
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
20
-import org.openzen.zenscript.codemodel.type.ITypeID;
21
 import org.openzen.zenscript.parser.ParsedAnnotation;
20
 import org.openzen.zenscript.parser.ParsedAnnotation;
22
 import org.openzen.zenscript.parser.ParsedDefinition;
21
 import org.openzen.zenscript.parser.ParsedDefinition;
23
 import org.openzen.zenscript.parser.PrecompilationState;
22
 import org.openzen.zenscript.parser.PrecompilationState;
56
 	}
55
 	}
57
 
56
 
58
 	@Override
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
 	@Override
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
 	@Override
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
 		if (compiled.header.returnType == BasicTypeID.UNDETERMINED) {
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
 	@Override
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 View File

10
 import java.util.List;
10
 import java.util.List;
11
 import org.openzen.zenscript.codemodel.FunctionHeader;
11
 import org.openzen.zenscript.codemodel.FunctionHeader;
12
 import org.openzen.zenscript.codemodel.FunctionParameter;
12
 import org.openzen.zenscript.codemodel.FunctionParameter;
13
+import org.openzen.zenscript.codemodel.context.LocalTypeResolutionContext;
14
+import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
13
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
15
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
14
 import org.openzen.zenscript.codemodel.type.ITypeID;
16
 import org.openzen.zenscript.codemodel.type.ITypeID;
15
 import org.openzen.zenscript.lexer.ZSToken;
17
 import org.openzen.zenscript.lexer.ZSToken;
16
 import org.openzen.zenscript.lexer.ZSTokenParser;
18
 import org.openzen.zenscript.lexer.ZSTokenParser;
17
 import org.openzen.zenscript.lexer.ZSTokenType;
19
 import org.openzen.zenscript.lexer.ZSTokenType;
18
 import static org.openzen.zenscript.lexer.ZSTokenType.*;
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
 import org.openzen.zenscript.parser.ParsedAnnotation;
21
 import org.openzen.zenscript.parser.ParsedAnnotation;
22
 import org.openzen.zenscript.parser.expression.ParsedExpression;
22
 import org.openzen.zenscript.parser.expression.ParsedExpression;
23
 import org.openzen.zenscript.parser.type.IParsedType;
23
 import org.openzen.zenscript.parser.type.IParsedType;
92
 		this.thrownType = thrownType;
92
 		this.thrownType = thrownType;
93
 	}
93
 	}
94
 	
94
 	
95
-	public FunctionHeader compile(BaseScope scope) {
95
+	public FunctionHeader compile(TypeResolutionContext context) {
96
 		TypeParameter[] genericParameters = ParsedTypeParameter.getCompiled(this.genericParameters);
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
 		FunctionParameter[] parameters = new FunctionParameter[this.parameters.size()];
101
 		FunctionParameter[] parameters = new FunctionParameter[this.parameters.size()];
102
 		for (int i = 0; i < parameters.length; i++)
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 View File

1
 package org.openzen.zenscript.parser.definitions;
1
 package org.openzen.zenscript.parser.definitions;
2
 
2
 
3
 import org.openzen.zenscript.codemodel.FunctionParameter;
3
 import org.openzen.zenscript.codemodel.FunctionParameter;
4
+import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
4
 import org.openzen.zenscript.codemodel.expression.Expression;
5
 import org.openzen.zenscript.codemodel.expression.Expression;
5
-import org.openzen.zenscript.codemodel.type.ITypeID;
6
 import org.openzen.zenscript.codemodel.scope.BaseScope;
6
 import org.openzen.zenscript.codemodel.scope.BaseScope;
7
+import org.openzen.zenscript.codemodel.type.ITypeID;
7
 import org.openzen.zenscript.codemodel.scope.ExpressionScope;
8
 import org.openzen.zenscript.codemodel.scope.ExpressionScope;
8
 import org.openzen.zenscript.parser.ParsedAnnotation;
9
 import org.openzen.zenscript.parser.ParsedAnnotation;
10
+import org.openzen.zenscript.parser.PrecompilationState;
9
 import org.openzen.zenscript.parser.expression.ParsedExpression;
11
 import org.openzen.zenscript.parser.expression.ParsedExpression;
10
 import org.openzen.zenscript.parser.type.IParsedType;
12
 import org.openzen.zenscript.parser.type.IParsedType;
11
 
13
 
20
 	public final ParsedExpression defaultValue;
22
 	public final ParsedExpression defaultValue;
21
 	public final boolean variadic;
23
 	public final boolean variadic;
22
 	
24
 	
25
+	private FunctionParameter compiled;
26
+	
23
 	public ParsedFunctionParameter(ParsedAnnotation[] annotations, String name, IParsedType type, ParsedExpression defaultValue, boolean variadic) {
27
 	public ParsedFunctionParameter(ParsedAnnotation[] annotations, String name, IParsedType type, ParsedExpression defaultValue, boolean variadic) {
24
 		this.annotations = annotations;
28
 		this.annotations = annotations;
25
 		this.name = name;
29
 		this.name = name;
28
 		this.variadic = variadic;
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
 		Expression cDefaultValue = null;
40
 		Expression cDefaultValue = null;
41
+		return compiled = new FunctionParameter(cType, name, cDefaultValue, variadic);
42
+	}
43
+	
44
+	public void compileInitializer(BaseScope scope, PrecompilationState state) {
34
 		if (defaultValue != null) {
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 View File

5
  */
5
  */
6
 package org.openzen.zenscript.parser.definitions;
6
 package org.openzen.zenscript.parser.definitions;
7
 
7
 
8
+import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
8
 import org.openzen.zenscript.codemodel.generic.GenericParameterBound;
9
 import org.openzen.zenscript.codemodel.generic.GenericParameterBound;
9
-import org.openzen.zenscript.codemodel.scope.BaseScope;
10
 
10
 
11
 /**
11
 /**
12
  *
12
  *
13
  * @author Hoofdgebruiker
13
  * @author Hoofdgebruiker
14
  */
14
  */
15
 public abstract class ParsedGenericBound {
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 View File


Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save