Browse Source

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

kindlich 6 years ago
parent
commit
86fd54ed92
No known key found for this signature in database
100 changed files with 1345 additions and 539 deletions
  1. 6
    0
      CodeFormatter/src/main/java/org/openzen/zenscript/formatter/ExpressionFormatter.java
  2. 5
    3
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/FunctionHeader.java
  3. 22
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/HighLevelDefinition.java
  4. 22
    3
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/CompilingPackage.java
  5. 5
    4
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/CompilingType.java
  6. 7
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/FileResolutionContext.java
  7. 3
    3
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/LocalTypeResolutionContext.java
  8. 9
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/definition/InterfaceDefinition.java
  9. 3
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/definition/VariantDefinition.java
  10. 2
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ExpressionVisitor.java
  11. 41
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/GetMatchingVariantField.java
  12. 2
    3
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/switchvalue/VariantOptionSwitchValue.java
  13. 0
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/CallerMember.java
  14. 5
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ConstMember.java
  15. 3
    3
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/EnumConstantMember.java
  16. 5
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/FieldMember.java
  17. 5
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/FunctionalMember.java
  18. 9
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/GetterMember.java
  19. 2
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/IDefinitionMember.java
  20. 1
    9
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/IPropertyMember.java
  21. 5
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ImplementationMember.java
  22. 5
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/InnerDefinitionMember.java
  23. 5
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/StaticInitializerMember.java
  24. 5
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/builtin/ArrayIteratorKeyValues.java
  25. 5
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/builtin/ArrayIteratorValues.java
  26. 5
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/builtin/AssocIterator.java
  27. 5
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/builtin/RangeIterator.java
  28. 5
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/builtin/StringCharIterator.java
  29. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/CasterMemberRef.java
  30. 3
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/DefinitionMemberRef.java
  31. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/ImplementationMemberRef.java
  32. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/IteratorMemberRef.java
  33. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/PropertyRef.java
  34. 10
    4
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/scope/ExpressionScope.java
  35. 3
    3
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/statement/ReturnStatement.java
  36. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/member/DefinitionMemberGroup.java
  37. 38
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/member/TypeMembers.java
  38. 18
    15
      Constructor/src/main/java/org/openzen/zenscript/constructor/Module.java
  39. 3
    3
      Constructor/src/main/java/org/openzen/zenscript/constructor/module/DirectoryModuleReference.java
  40. 1
    1
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaCompiler.java
  41. 2
    2
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/CompilerUtils.java
  42. 5
    0
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaExpressionVisitor.java
  43. 5
    0
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaPreDecrementVisitor.java
  44. 5
    0
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaPreIncrementVisitor.java
  45. 1
    1
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/definitions/JavaDefinitionVisitor.java
  46. 2
    2
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/definitions/JavaMemberVisitor.java
  47. 6
    0
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/ExpressionHoistingChecker.java
  48. 20
    6
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaDefinitionVisitor.java
  49. 1
    1
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaExpansionMemberCompiler.java
  50. 9
    8
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaMemberCompiler.java
  51. 10
    1
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceExpressionFormatter.java
  52. 5
    5
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceStatementFormatter.java
  53. 6
    0
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/prepare/JavaNativeClass.java
  54. 46
    6
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/prepare/JavaSourcePrepareClassMethodVisitor.java
  55. 65
    4
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/prepare/JavaSourcePrepareDefinitionVisitor.java
  56. 14
    1
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/prepare/JavaSourcePrepareExpansionMethodVisitor.java
  57. 3
    1
      Parser/src/main/java/org/openzen/zenscript/lexer/ZSTokenType.java
  58. 8
    5
      Parser/src/main/java/org/openzen/zenscript/parser/ParsedDefinition.java
  59. 31
    17
      Parser/src/main/java/org/openzen/zenscript/parser/ParsedFile.java
  60. 28
    12
      Parser/src/main/java/org/openzen/zenscript/parser/definitions/BaseParsedDefinition.java
  61. 27
    15
      Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedAlias.java
  62. 11
    9
      Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedClass.java
  63. 6
    7
      Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedEnum.java
  64. 6
    9
      Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedExpansion.java
  65. 23
    10
      Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedFunction.java
  66. 6
    6
      Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedInterface.java
  67. 6
    7
      Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedStruct.java
  68. 8
    7
      Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedVariant.java
  69. 4
    3
      Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedVariantOption.java
  70. 2
    3
      Parser/src/main/java/org/openzen/zenscript/parser/expression/ParsedExpressionCall.java
  71. 1
    1
      Parser/src/main/java/org/openzen/zenscript/parser/expression/ParsedExpressionVariable.java
  72. 2
    4
      Parser/src/main/java/org/openzen/zenscript/parser/expression/ParsedMatchExpression.java
  73. 19
    20
      Parser/src/main/java/org/openzen/zenscript/parser/member/ParsedDefinitionMember.java
  74. 2
    2
      Parser/src/main/java/org/openzen/zenscript/parser/member/ParsedInnerDefinition.java
  75. 2
    3
      ScriptingExample/src/main/java/org/openzen/zenscript/scriptingexample/Main.java
  76. 18
    0
      Shared/src/main/java/listeners/DummyListenerHandle.java
  77. 9
    0
      Shared/src/main/java/listeners/ListenerHandle.java
  78. 85
    0
      Shared/src/main/java/listeners/ListenerList.java
  79. 25
    0
      Shared/src/main/java/live/ImmutableLiveBool.java
  80. 22
    0
      Shared/src/main/java/live/ImmutableLiveObject.java
  81. 22
    0
      Shared/src/main/java/live/ImmutableLiveString.java
  82. 23
    0
      Shared/src/main/java/live/InverseLiveBool.java
  83. 88
    0
      Shared/src/main/java/live/LiveArrayList.java
  84. 10
    0
      Shared/src/main/java/live/LiveBool.java
  85. 12
    0
      Shared/src/main/java/live/LiveInt.java
  86. 23
    0
      Shared/src/main/java/live/LiveList.java
  87. 10
    0
      Shared/src/main/java/live/LiveObject.java
  88. 10
    0
      Shared/src/main/java/live/LiveString.java
  89. 19
    0
      Shared/src/main/java/live/MutableLiveList.java
  90. 15
    15
      Shared/src/main/java/org/openzen/zencode/shared/CharacterEntity.java
  91. 58
    55
      Shared/src/main/java/org/openzen/zencode/shared/CodePosition.java
  92. 21
    21
      Shared/src/main/java/org/openzen/zencode/shared/CompileException.java
  93. 65
    65
      Shared/src/main/java/org/openzen/zencode/shared/CompileExceptionCode.java
  94. 49
    48
      Shared/src/main/java/org/openzen/zencode/shared/ConcatMap.java
  95. 22
    32
      Shared/src/main/java/org/openzen/zencode/shared/LiteralSourceFile.java
  96. 5
    5
      Shared/src/main/java/org/openzen/zencode/shared/SourceFile.java
  97. 2
    15
      Shared/src/main/java/org/openzen/zencode/shared/StringExpansion.java
  98. 17
    17
      Shared/src/main/java/org/openzen/zencode/shared/Taggable.java
  99. 20
    30
      Shared/src/main/java/org/openzen/zencode/shared/VirtualSourceFile.java
  100. 0
    0
      Shared/src/main/java/stdlib/Arrays.java

+ 6
- 0
CodeFormatter/src/main/java/org/openzen/zenscript/formatter/ExpressionFormatter.java View File

45
 import org.openzen.zenscript.codemodel.expression.GetFieldExpression;
45
 import org.openzen.zenscript.codemodel.expression.GetFieldExpression;
46
 import org.openzen.zenscript.codemodel.expression.GetFunctionParameterExpression;
46
 import org.openzen.zenscript.codemodel.expression.GetFunctionParameterExpression;
47
 import org.openzen.zenscript.codemodel.expression.GetLocalVariableExpression;
47
 import org.openzen.zenscript.codemodel.expression.GetLocalVariableExpression;
48
+import org.openzen.zenscript.codemodel.expression.GetMatchingVariantField;
48
 import org.openzen.zenscript.codemodel.expression.GetStaticFieldExpression;
49
 import org.openzen.zenscript.codemodel.expression.GetStaticFieldExpression;
49
 import org.openzen.zenscript.codemodel.expression.GetterExpression;
50
 import org.openzen.zenscript.codemodel.expression.GetterExpression;
50
 import org.openzen.zenscript.codemodel.expression.GlobalCallExpression;
51
 import org.openzen.zenscript.codemodel.expression.GlobalCallExpression;
480
 	public ExpressionString visitGetLocalVariable(GetLocalVariableExpression expression) {
481
 	public ExpressionString visitGetLocalVariable(GetLocalVariableExpression expression) {
481
 		return new ExpressionString(expression.variable.name, ZenScriptOperator.PRIMARY);
482
 		return new ExpressionString(expression.variable.name, ZenScriptOperator.PRIMARY);
482
 	}
483
 	}
484
+	
485
+	@Override
486
+	public ExpressionString visitGetMatchingVariantField(GetMatchingVariantField expression) {
487
+		return new ExpressionString(expression.value.parameters[expression.index], ZenScriptOperator.PRIMARY);
488
+	}
483
 
489
 
484
 	@Override
490
 	@Override
485
 	public ExpressionString visitGetStaticField(GetStaticFieldExpression expression) {
491
 	public ExpressionString visitGetStaticField(GetStaticFieldExpression expression) {

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

80
 		hasUnknowns = hasUnknowns(parameters, returnType);
80
 		hasUnknowns = hasUnknowns(parameters, returnType);
81
 	}
81
 	}
82
 	
82
 	
83
-	public FunctionHeader(TypeParameter[] genericParameters, ITypeID returnType, ITypeID thrownType, FunctionParameter... parameters) {
83
+	public FunctionHeader(TypeParameter[] typeParameters, ITypeID returnType, ITypeID thrownType, FunctionParameter... parameters) {
84
 		if (returnType == null)
84
 		if (returnType == null)
85
 			throw new NullPointerException();
85
 			throw new NullPointerException();
86
-		if (genericParameters == null)
86
+		if (typeParameters == null)
87
 			throw new NullPointerException();
87
 			throw new NullPointerException();
88
 		
88
 		
89
-		this.typeParameters = genericParameters;
89
+		this.typeParameters = typeParameters;
90
 		this.returnType = returnType;
90
 		this.returnType = returnType;
91
 		this.parameters = parameters;
91
 		this.parameters = parameters;
92
 		this.thrownType = thrownType;
92
 		this.thrownType = thrownType;
250
 	}
250
 	}
251
 	
251
 	
252
 	public boolean canOverride(TypeScope scope, FunctionHeader other) {
252
 	public boolean canOverride(TypeScope scope, FunctionHeader other) {
253
+		if (other == null)
254
+			throw new NullPointerException();
253
 		if (parameters.length != other.parameters.length)
255
 		if (parameters.length != other.parameters.length)
254
 			return false;
256
 			return false;
255
 		if (returnType != BasicTypeID.UNDETERMINED && !scope.getTypeMembers(returnType).canCastImplicit(other.returnType))
257
 		if (returnType != BasicTypeID.UNDETERMINED && !scope.getTypeMembers(returnType).canCastImplicit(other.returnType))

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

12
 import org.openzen.zenscript.codemodel.annotations.DefinitionAnnotation;
12
 import org.openzen.zenscript.codemodel.annotations.DefinitionAnnotation;
13
 import org.openzen.zenscript.codemodel.definition.AliasDefinition;
13
 import org.openzen.zenscript.codemodel.definition.AliasDefinition;
14
 import org.openzen.zenscript.codemodel.definition.DefinitionVisitor;
14
 import org.openzen.zenscript.codemodel.definition.DefinitionVisitor;
15
+import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
15
 import org.openzen.zenscript.codemodel.definition.InterfaceDefinition;
16
 import org.openzen.zenscript.codemodel.definition.InterfaceDefinition;
16
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
17
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
17
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
18
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
141
 	}
142
 	}
142
 	
143
 	
143
 	public void normalize(TypeScope scope) {
144
 	public void normalize(TypeScope scope) {
145
+		DestructorMember destructor = null;
146
+		List<FieldMember> fields = new ArrayList();
147
+		
144
 		for (IDefinitionMember member : members) {
148
 		for (IDefinitionMember member : members) {
145
 			member.normalize(scope);
149
 			member.normalize(scope);
150
+			
151
+			if (member instanceof DestructorMember)
152
+				destructor = (DestructorMember)member;
153
+			if (member instanceof FieldMember)
154
+				fields.add((FieldMember)member);
155
+		}
156
+		
157
+		if (isDestructible() && destructor == null && !(this instanceof ExpansionDefinition)) {
158
+			System.out.println("Added destructor to " + position);
159
+			destructor = new DestructorMember(position, this, Modifiers.PUBLIC);
160
+			members.add(destructor);
161
+		}
162
+		
163
+		for (FieldMember field : fields) {
164
+			if (field.autoGetter != null)
165
+				members.add(field.autoGetter);
166
+			if (field.autoSetter != null)
167
+				members.add(field.autoSetter);
146
 		}
168
 		}
147
 	}
169
 	}
148
 	
170
 	

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

9
 import java.util.List;
9
 import java.util.List;
10
 import java.util.Map;
10
 import java.util.Map;
11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
+import org.openzen.zenscript.codemodel.definition.ZSPackage;
12
 import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
13
 import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
13
 import org.openzen.zenscript.codemodel.type.GenericName;
14
 import org.openzen.zenscript.codemodel.type.GenericName;
14
 import org.openzen.zenscript.codemodel.type.ITypeID;
15
 import org.openzen.zenscript.codemodel.type.ITypeID;
18
  * @author Hoofdgebruiker
19
  * @author Hoofdgebruiker
19
  */
20
  */
20
 public class CompilingPackage {
21
 public class CompilingPackage {
22
+	private final ZSPackage pkg;
21
 	private final Map<String, CompilingPackage> packages = new HashMap<>();
23
 	private final Map<String, CompilingPackage> packages = new HashMap<>();
22
 	private final Map<String, CompilingType> types = new HashMap<>();
24
 	private final Map<String, CompilingType> types = new HashMap<>();
23
 	
25
 	
26
+	public CompilingPackage(ZSPackage pkg) {
27
+		this.pkg = pkg;
28
+	}
29
+	
30
+	public ZSPackage getPackage() {
31
+		return pkg;
32
+	}
33
+	
34
+	public CompilingPackage getOrCreatePackage(String name) {
35
+		if (packages.containsKey(name))
36
+			return packages.get(name);
37
+		
38
+		CompilingPackage newPackage = new CompilingPackage(pkg.getOrCreatePackage(name));
39
+		packages.put(name, newPackage);
40
+		return newPackage;
41
+	}
42
+	
24
 	public void addPackage(String name, CompilingPackage package_) {
43
 	public void addPackage(String name, CompilingPackage package_) {
25
 		packages.put(name, package_);
44
 		packages.put(name, package_);
26
 	}
45
 	}
44
 	
63
 	
45
 	private HighLevelDefinition getImportType(TypeResolutionContext context, CompilingType type, List<String> name, int index) {
64
 	private HighLevelDefinition getImportType(TypeResolutionContext context, CompilingType type, List<String> name, int index) {
46
 		if (index == name.size())
65
 		if (index == name.size())
47
-			return type.load(context);
66
+			return type.load();
48
 		
67
 		
49
 		return getImportType(context, type.getInner(name.get(index)), name, index + 1);
68
 		return getImportType(context, type.getInner(name.get(index)), name, index + 1);
50
 	}
69
 	}
62
 		
81
 		
63
 		if (types.containsKey(name.get(index).name)) {
82
 		if (types.containsKey(name.get(index).name)) {
64
 			CompilingType type = types.get(name.get(index).name);
83
 			CompilingType type = types.get(name.get(index).name);
65
-			DefinitionTypeID result = context.getTypeRegistry().getForDefinition(type.load(context), name.get(index).arguments);
84
+			DefinitionTypeID result = context.getTypeRegistry().getForDefinition(type.load(), name.get(index).arguments);
66
 			return getInner(context, name, index + 1, type, result);
85
 			return getInner(context, name, index + 1, type, result);
67
 		}
86
 		}
68
 		
87
 		
77
 		if (innerType == null)
96
 		if (innerType == null)
78
 			return null;
97
 			return null;
79
 		
98
 		
80
-		DefinitionTypeID innerResult = context.getTypeRegistry().getForDefinition(innerType.load(context), name.get(index).arguments, result);
99
+		DefinitionTypeID innerResult = context.getTypeRegistry().getForDefinition(innerType.load(), name.get(index).arguments, result);
81
 		return getInner(context, name, index + 1, innerType, innerResult);
100
 		return getInner(context, name, index + 1, innerType, innerResult);
82
 	}
101
 	}
83
 }
102
 }

+ 5
- 4
CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/CompilingType.java View File

9
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
9
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
10
 import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
10
 import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
11
 import org.openzen.zenscript.codemodel.type.GenericName;
11
 import org.openzen.zenscript.codemodel.type.GenericName;
12
+import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
12
 
13
 
13
 /**
14
 /**
14
  *
15
  *
17
 public interface CompilingType {
18
 public interface CompilingType {
18
 	CompilingType getInner(String name);
19
 	CompilingType getInner(String name);
19
 	
20
 	
20
-	HighLevelDefinition load(TypeResolutionContext context);
21
+	HighLevelDefinition load();
21
 	
22
 	
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);
23
+	default DefinitionTypeID getInnerType(GlobalTypeRegistry registry, List<GenericName> name, int index, DefinitionTypeID outer) {
24
+		DefinitionTypeID type = registry.getForDefinition(load(), name.get(index).arguments, outer);
24
 		index++;
25
 		index++;
25
 		if (index == name.size())
26
 		if (index == name.size())
26
 			return type;
27
 			return type;
29
 		if (innerType == null)
30
 		if (innerType == null)
30
 			return null;
31
 			return null;
31
 		
32
 		
32
-		return innerType.getInnerType(context, name, index, type);
33
+		return innerType.getInnerType(registry, name, index, type);
33
 	}
34
 	}
34
 }
35
 }

+ 7
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/FileResolutionContext.java View File

21
  */
21
  */
22
 public class FileResolutionContext implements TypeResolutionContext {
22
 public class FileResolutionContext implements TypeResolutionContext {
23
 	private final ModuleTypeResolutionContext module;
23
 	private final ModuleTypeResolutionContext module;
24
+	private final CompilingPackage modulePackage;
24
 	private final Map<String, HighLevelDefinition> imports = new HashMap<>();
25
 	private final Map<String, HighLevelDefinition> imports = new HashMap<>();
25
 	
26
 	
26
-	public FileResolutionContext(ModuleTypeResolutionContext module) {
27
+	public FileResolutionContext(ModuleTypeResolutionContext module, CompilingPackage modulePackage) {
27
 		this.module = module;
28
 		this.module = module;
29
+		this.modulePackage = modulePackage;
28
 	}
30
 	}
29
 	
31
 	
30
 	public void addImport(String name, HighLevelDefinition definition) {
32
 	public void addImport(String name, HighLevelDefinition definition) {
51
 					1);
53
 					1);
52
 		}
54
 		}
53
 		
55
 		
56
+		ITypeID moduleType = modulePackage.getType(this, name);
57
+		if (moduleType != null)
58
+			return moduleType;
59
+		
54
 		return module.getType(position, name);
60
 		return module.getType(position, name);
55
 	}
61
 	}
56
 
62
 

+ 3
- 3
CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/LocalTypeResolutionContext.java View File

44
 		if (type != null) {
44
 		if (type != null) {
45
 			CompilingType compiling = type.getInner(name.get(0).name);
45
 			CompilingType compiling = type.getInner(name.get(0).name);
46
 			if (compiling != null) {
46
 			if (compiling != null) {
47
-				DefinitionTypeID outer = getTypeRegistry().getForMyDefinition(type.load(this));
48
-				return compiling.getInnerType(this, name, 0, outer);
47
+				DefinitionTypeID outer = getTypeRegistry().getForMyDefinition(type.load());
48
+				return compiling.getInnerType(getTypeRegistry(), name, 0, outer);
49
 			}
49
 			}
50
 		}
50
 		}
51
 		
51
 		
60
 	
60
 	
61
 	@Override
61
 	@Override
62
 	public ITypeID getThisType() {
62
 	public ITypeID getThisType() {
63
-		return type == null ? null : getTypeRegistry().getForMyDefinition(type.load(this));
63
+		return type == null ? null : getTypeRegistry().getForMyDefinition(type.load());
64
 	}
64
 	}
65
 }
65
 }

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

26
 		baseInterfaces.add(baseInterface);
26
 		baseInterfaces.add(baseInterface);
27
 	}
27
 	}
28
 	
28
 	
29
+	@Override
30
+	public boolean isDestructible() {
31
+		for (ITypeID baseInterface : baseInterfaces)
32
+			if (baseInterface.isDestructible())
33
+				return true;
34
+		
35
+		return super.isDestructible();
36
+	}
37
+	
29
 	@Override
38
 	@Override
30
 	public boolean isStatic() {
39
 	public boolean isStatic() {
31
 		return true;
40
 		return true;

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

32
 	
32
 	
33
 	public static class Option extends Taggable {
33
 	public static class Option extends Taggable {
34
 		public final String name;
34
 		public final String name;
35
+		public final int ordinal;
35
 		public final ITypeID[] types;
36
 		public final ITypeID[] types;
36
 		
37
 		
37
-		public Option(String name, ITypeID[] types) {
38
+		public Option(String name, int ordinal, ITypeID[] types) {
38
 			this.name = name;
39
 			this.name = name;
40
+			this.ordinal = ordinal;
39
 			this.types = types;
41
 			this.types = types;
40
 		}
42
 		}
41
 		
43
 		

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

80
 	
80
 	
81
 	public T visitGetLocalVariable(GetLocalVariableExpression expression);
81
 	public T visitGetLocalVariable(GetLocalVariableExpression expression);
82
 	
82
 	
83
+	public T visitGetMatchingVariantField(GetMatchingVariantField expression);
84
+	
83
 	public T visitGetStaticField(GetStaticFieldExpression expression);
85
 	public T visitGetStaticField(GetStaticFieldExpression expression);
84
 	
86
 	
85
 	public T visitGetter(GetterExpression expression);
87
 	public T visitGetter(GetterExpression expression);

+ 41
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/GetMatchingVariantField.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.expression;
7
+
8
+import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.expression.switchvalue.VariantOptionSwitchValue;
10
+import org.openzen.zenscript.codemodel.scope.TypeScope;
11
+
12
+/**
13
+ *
14
+ * @author Hoofdgebruiker
15
+ */
16
+public class GetMatchingVariantField extends Expression {
17
+	public final VariantOptionSwitchValue value;
18
+	public final int index;
19
+	
20
+	public GetMatchingVariantField(CodePosition position, VariantOptionSwitchValue value, int index) {
21
+		super(position, value.option.types[index], null);
22
+		
23
+		this.value = value;
24
+		this.index = index;
25
+	}
26
+
27
+	@Override
28
+	public <T> T accept(ExpressionVisitor<T> visitor) {
29
+		return visitor.visitGetMatchingVariantField(this);
30
+	}
31
+
32
+	@Override
33
+	public Expression transform(ExpressionTransformer transformer) {
34
+		return this;
35
+	}
36
+
37
+	@Override
38
+	public Expression normalize(TypeScope scope) {
39
+		return this;
40
+	}
41
+}

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

6
 package org.openzen.zenscript.codemodel.expression.switchvalue;
6
 package org.openzen.zenscript.codemodel.expression.switchvalue;
7
 
7
 
8
 import org.openzen.zenscript.codemodel.member.ref.VariantOptionRef;
8
 import org.openzen.zenscript.codemodel.member.ref.VariantOptionRef;
9
-import org.openzen.zenscript.codemodel.statement.VarStatement;
10
 
9
 
11
 /**
10
 /**
12
  *
11
  *
14
  */
13
  */
15
 public class VariantOptionSwitchValue implements SwitchValue {
14
 public class VariantOptionSwitchValue implements SwitchValue {
16
 	public final VariantOptionRef option;
15
 	public final VariantOptionRef option;
17
-	public final VarStatement[] parameters;
16
+	public final String[] parameters;
18
 	
17
 	
19
-	public VariantOptionSwitchValue(VariantOptionRef option, VarStatement[] parameters) {
18
+	public VariantOptionSwitchValue(VariantOptionRef option, String[] parameters) {
20
 		this.option = option;
19
 		this.option = option;
21
 		this.parameters = parameters;
20
 		this.parameters = parameters;
22
 	}
21
 	}

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

11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
12
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
13
 import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
13
 import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
14
-import org.openzen.zenscript.codemodel.scope.TypeScope;
15
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
14
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
16
 import org.openzen.zenscript.codemodel.type.member.BuiltinID;
15
 import org.openzen.zenscript.codemodel.type.member.BuiltinID;
17
 import org.openzen.zenscript.codemodel.type.member.TypeMemberPriority;
16
 import org.openzen.zenscript.codemodel.type.member.TypeMemberPriority;

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

63
 		type = type.getNormalized();
63
 		type = type.getNormalized();
64
 		value = value.normalize(scope);
64
 		value = value.normalize(scope);
65
 	}
65
 	}
66
+
67
+	@Override
68
+	public boolean isAbstract() {
69
+		return false;
70
+	}
66
 }
71
 }

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

17
 	public final CodePosition position;
17
 	public final CodePosition position;
18
 	public final HighLevelDefinition definition;
18
 	public final HighLevelDefinition definition;
19
 	public final String name;
19
 	public final String name;
20
-	public final int value;
20
+	public final int ordinal;
21
 	
21
 	
22
 	public NewExpression constructor;
22
 	public NewExpression constructor;
23
 	
23
 	
24
-	public EnumConstantMember(CodePosition position, HighLevelDefinition definition, String name, int value) {
24
+	public EnumConstantMember(CodePosition position, HighLevelDefinition definition, String name, int ordinal) {
25
 		this.position = position;
25
 		this.position = position;
26
 		this.definition = definition;
26
 		this.definition = definition;
27
 		this.name = name;
27
 		this.name = name;
28
-		this.value = value;
28
+		this.ordinal = ordinal;
29
 	}
29
 	}
30
 }
30
 }

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

147
 		if (initializer != null)
147
 		if (initializer != null)
148
 			initializer = initializer.normalize(scope);
148
 			initializer = initializer.normalize(scope);
149
 	}
149
 	}
150
+
151
+	@Override
152
+	public boolean isAbstract() {
153
+		return false;
154
+	}
150
 }
155
 }

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

60
 		if (body != null)
60
 		if (body != null)
61
 			body = body.normalize(scope, ConcatMap.empty(LoopStatement.class, LoopStatement.class));
61
 			body = body.normalize(scope, ConcatMap.empty(LoopStatement.class, LoopStatement.class));
62
 	}
62
 	}
63
+	
64
+	@Override
65
+	public boolean isAbstract() {
66
+		return body == null && builtin == null;
67
+	}
63
 }
68
 }

+ 9
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/GetterMember.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.member.ref.GetterMemberRef;
12
 import org.openzen.zenscript.codemodel.member.ref.GetterMemberRef;
13
+import org.openzen.zenscript.codemodel.statement.Statement;
13
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
14
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
14
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
15
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
15
 import org.openzen.zenscript.codemodel.type.ITypeID;
16
 import org.openzen.zenscript.codemodel.type.ITypeID;
38
 		this.type = type;
39
 		this.type = type;
39
 	}
40
 	}
40
 	
41
 	
42
+	@Override
43
+	public void setBody(Statement body) {
44
+		super.setBody(body);
45
+		
46
+		if (type == BasicTypeID.UNDETERMINED)
47
+			type = body.getReturnType();
48
+	}
49
+	
41
 	@Override
50
 	@Override
42
 	public ITypeID getType() {
51
 	public ITypeID getType() {
43
 		return type;
52
 		return type;

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

38
 	DefinitionMemberRef getOverrides();
38
 	DefinitionMemberRef getOverrides();
39
 
39
 
40
 	public void normalize(TypeScope scope);
40
 	public void normalize(TypeScope scope);
41
+	
42
+	boolean isAbstract();
41
 }
43
 }

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

5
  */
5
  */
6
 package org.openzen.zenscript.codemodel.member;
6
 package org.openzen.zenscript.codemodel.member;
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.annotations.MemberAnnotation;
11
 import org.openzen.zenscript.codemodel.type.ITypeID;
9
 import org.openzen.zenscript.codemodel.type.ITypeID;
12
 
10
 
14
  *
12
  *
15
  * @author Hoofdgebruiker
13
  * @author Hoofdgebruiker
16
  */
14
  */
17
-public interface IPropertyMember {
15
+public interface IPropertyMember extends IDefinitionMember {
18
 	ITypeID getType();
16
 	ITypeID getType();
19
 	
17
 	
20
-	CodePosition getPosition();
21
-	
22
-	String describe();
23
-
24
-	<T> T getTag(Class<T> type);
25
-	
26
 	boolean isStatic();
18
 	boolean isStatic();
27
 	
19
 	
28
 	boolean isFinal();
20
 	boolean isFinal();

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

70
 		for (IDefinitionMember member : members)
70
 		for (IDefinitionMember member : members)
71
 			member.normalize(scope);
71
 			member.normalize(scope);
72
 	}
72
 	}
73
+
74
+	@Override
75
+	public boolean isAbstract() {
76
+		return false;
77
+	}
73
 }
78
 }

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

63
 	public void normalize(TypeScope scope) {
63
 	public void normalize(TypeScope scope) {
64
 		innerDefinition.normalize(scope);
64
 		innerDefinition.normalize(scope);
65
 	}
65
 	}
66
+
67
+	@Override
68
+	public boolean isAbstract() {
69
+		return false;
70
+	}
66
 }
71
 }

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

65
 	public void normalize(TypeScope scope) {
65
 	public void normalize(TypeScope scope) {
66
 		body = body.normalize(scope, ConcatMap.empty(LoopStatement.class, LoopStatement.class));
66
 		body = body.normalize(scope, ConcatMap.empty(LoopStatement.class, LoopStatement.class));
67
 	}
67
 	}
68
+
69
+	@Override
70
+	public boolean isAbstract() {
71
+		return false;
72
+	}
68
 }
73
 }

+ 5
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/builtin/ArrayIteratorKeyValues.java View File

87
 	public void normalize(TypeScope scope) {
87
 	public void normalize(TypeScope scope) {
88
 		
88
 		
89
 	}
89
 	}
90
+
91
+	@Override
92
+	public boolean isAbstract() {
93
+		return false;
94
+	}
90
 }
95
 }

+ 5
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/builtin/ArrayIteratorValues.java View File

82
 	public void normalize(TypeScope scope) {
82
 	public void normalize(TypeScope scope) {
83
 		
83
 		
84
 	}
84
 	}
85
+
86
+	@Override
87
+	public boolean isAbstract() {
88
+		return false;
89
+	}
85
 }
90
 }

+ 5
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/builtin/AssocIterator.java View File

85
 	public void normalize(TypeScope scope) {
85
 	public void normalize(TypeScope scope) {
86
 		
86
 		
87
 	}
87
 	}
88
+
89
+	@Override
90
+	public boolean isAbstract() {
91
+		return false;
92
+	}
88
 }
93
 }

+ 5
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/builtin/RangeIterator.java View File

93
 	public void normalize(TypeScope scope) {
93
 	public void normalize(TypeScope scope) {
94
 		
94
 		
95
 	}
95
 	}
96
+
97
+	@Override
98
+	public boolean isAbstract() {
99
+		return false;
100
+	}
96
 }
101
 }

+ 5
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/builtin/StringCharIterator.java View File

76
 	public void normalize(TypeScope scope) {
76
 	public void normalize(TypeScope scope) {
77
 		
77
 		
78
 	}
78
 	}
79
+
80
+	@Override
81
+	public boolean isAbstract() {
82
+		return false;
83
+	}
79
 }
84
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/CasterMemberRef.java View File

12
 import org.openzen.zenscript.codemodel.expression.CastExpression;
12
 import org.openzen.zenscript.codemodel.expression.CastExpression;
13
 import org.openzen.zenscript.codemodel.expression.Expression;
13
 import org.openzen.zenscript.codemodel.expression.Expression;
14
 import org.openzen.zenscript.codemodel.member.CasterMember;
14
 import org.openzen.zenscript.codemodel.member.CasterMember;
15
+import org.openzen.zenscript.codemodel.member.IDefinitionMember;
15
 import org.openzen.zenscript.codemodel.type.ITypeID;
16
 import org.openzen.zenscript.codemodel.type.ITypeID;
16
 
17
 
17
 /**
18
 /**
64
 	public MemberAnnotation[] getAnnotations() {
65
 	public MemberAnnotation[] getAnnotations() {
65
 		return member.annotations;
66
 		return member.annotations;
66
 	}
67
 	}
68
+
69
+	@Override
70
+	public IDefinitionMember getTarget() {
71
+		return member;
72
+	}
67
 }
73
 }

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

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.annotations.MemberAnnotation;
10
 import org.openzen.zenscript.codemodel.annotations.MemberAnnotation;
11
+import org.openzen.zenscript.codemodel.member.IDefinitionMember;
11
 
12
 
12
 /**
13
 /**
13
  *
14
  *
25
 	FunctionHeader getHeader();
26
 	FunctionHeader getHeader();
26
 	
27
 	
27
 	MemberAnnotation[] getAnnotations();
28
 	MemberAnnotation[] getAnnotations();
29
+	
30
+	IDefinitionMember getTarget();
28
 }
31
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/ImplementationMemberRef.java View File

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.annotations.MemberAnnotation;
10
 import org.openzen.zenscript.codemodel.annotations.MemberAnnotation;
11
+import org.openzen.zenscript.codemodel.member.IDefinitionMember;
11
 import org.openzen.zenscript.codemodel.member.ImplementationMember;
12
 import org.openzen.zenscript.codemodel.member.ImplementationMember;
12
 import org.openzen.zenscript.codemodel.type.ITypeID;
13
 import org.openzen.zenscript.codemodel.type.ITypeID;
13
 
14
 
53
 	public MemberAnnotation[] getAnnotations() {
54
 	public MemberAnnotation[] getAnnotations() {
54
 		return member.annotations;
55
 		return member.annotations;
55
 	}
56
 	}
57
+
58
+	@Override
59
+	public IDefinitionMember getTarget() {
60
+		return member;
61
+	}
56
 }
62
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/IteratorMemberRef.java View File

9
 import org.openzen.zenscript.codemodel.FunctionHeader;
9
 import org.openzen.zenscript.codemodel.FunctionHeader;
10
 import org.openzen.zenscript.codemodel.annotations.MemberAnnotation;
10
 import org.openzen.zenscript.codemodel.annotations.MemberAnnotation;
11
 import org.openzen.zenscript.codemodel.member.CustomIteratorMember;
11
 import org.openzen.zenscript.codemodel.member.CustomIteratorMember;
12
+import org.openzen.zenscript.codemodel.member.IDefinitionMember;
12
 import org.openzen.zenscript.codemodel.member.IIteratorMember;
13
 import org.openzen.zenscript.codemodel.member.IIteratorMember;
13
 import org.openzen.zenscript.codemodel.type.ITypeID;
14
 import org.openzen.zenscript.codemodel.type.ITypeID;
14
 
15
 
62
 			return null;
63
 			return null;
63
 		}
64
 		}
64
 	}
65
 	}
66
+
67
+	@Override
68
+	public IDefinitionMember getTarget() {
69
+		return target;
70
+	}
65
 }
71
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/PropertyRef.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.annotations.MemberAnnotation;
11
 import org.openzen.zenscript.codemodel.annotations.MemberAnnotation;
12
+import org.openzen.zenscript.codemodel.member.IDefinitionMember;
12
 import org.openzen.zenscript.codemodel.member.IPropertyMember;
13
 import org.openzen.zenscript.codemodel.member.IPropertyMember;
13
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
14
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
14
 import org.openzen.zenscript.codemodel.type.ITypeID;
15
 import org.openzen.zenscript.codemodel.type.ITypeID;
79
 	public final MemberAnnotation[] getAnnotations() {
80
 	public final MemberAnnotation[] getAnnotations() {
80
 		return member.getAnnotations();
81
 		return member.getAnnotations();
81
 	}
82
 	}
83
+	
84
+	@Override
85
+	public final IDefinitionMember getTarget() {
86
+		return member;
87
+	}
82
 }
88
 }

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

16
 import org.openzen.zenscript.codemodel.GenericMapper;
16
 import org.openzen.zenscript.codemodel.GenericMapper;
17
 import org.openzen.zenscript.codemodel.expression.Expression;
17
 import org.openzen.zenscript.codemodel.expression.Expression;
18
 import org.openzen.zenscript.codemodel.expression.GetLocalVariableExpression;
18
 import org.openzen.zenscript.codemodel.expression.GetLocalVariableExpression;
19
+import org.openzen.zenscript.codemodel.expression.GetMatchingVariantField;
20
+import org.openzen.zenscript.codemodel.expression.switchvalue.VariantOptionSwitchValue;
19
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
21
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
20
 import org.openzen.zenscript.codemodel.partial.IPartialExpression;
22
 import org.openzen.zenscript.codemodel.partial.IPartialExpression;
21
 import org.openzen.zenscript.codemodel.statement.LoopStatement;
23
 import org.openzen.zenscript.codemodel.statement.LoopStatement;
35
 	
37
 	
36
 	public final List<ITypeID> hints;
38
 	public final List<ITypeID> hints;
37
 	public final Map<TypeParameter, ITypeID> genericInferenceMap;
39
 	public final Map<TypeParameter, ITypeID> genericInferenceMap;
38
-	public final Map<String, VarStatement> innerVariables = new HashMap<>();
40
+	public final Map<String, Function<CodePosition, Expression>> innerVariables = new HashMap<>();
39
 	
41
 	
40
 	public ExpressionScope(BaseScope outer) {
42
 	public ExpressionScope(BaseScope outer) {
41
 		this.outer = outer;
43
 		this.outer = outer;
70
 			List<ITypeID> hints,
72
 			List<ITypeID> hints,
71
 			Function<CodePosition, Expression> dollar,
73
 			Function<CodePosition, Expression> dollar,
72
 			Map<TypeParameter, ITypeID> genericInferenceMap,
74
 			Map<TypeParameter, ITypeID> genericInferenceMap,
73
-			Map<String, VarStatement> innerVariables) {
75
+			Map<String, Function<CodePosition, Expression>> innerVariables) {
74
 		this.outer = scope;
76
 		this.outer = scope;
75
 		this.hints = hints;
77
 		this.hints = hints;
76
 		this.dollar = dollar;
78
 		this.dollar = dollar;
79
 	}
81
 	}
80
 	
82
 	
81
 	public void addInnerVariable(VarStatement variable) {
83
 	public void addInnerVariable(VarStatement variable) {
82
-		innerVariables.put(variable.name, variable);
84
+		innerVariables.put(variable.name, position -> new GetLocalVariableExpression(position, variable));
85
+	}
86
+	
87
+	public void addMatchingVariantOption(String name, int index, VariantOptionSwitchValue value) {
88
+		innerVariables.put(name, position -> new GetMatchingVariantField(position, value, index));
83
 	}
89
 	}
84
 	
90
 	
85
 	public List<ITypeID> getResultTypeHints() {
91
 	public List<ITypeID> getResultTypeHints() {
121
 	@Override
127
 	@Override
122
 	public IPartialExpression get(CodePosition position, GenericName name) {
128
 	public IPartialExpression get(CodePosition position, GenericName name) {
123
 		if (name.hasNoArguments() && innerVariables.containsKey(name.name))
129
 		if (name.hasNoArguments() && innerVariables.containsKey(name.name))
124
-			return new GetLocalVariableExpression(position, innerVariables.get(name.name));
130
+			return innerVariables.get(name.name).apply(position);
125
 		
131
 		
126
 		return outer.get(position, name);
132
 		return outer.get(position, name);
127
 	}
133
 	}

+ 3
- 3
CodeModel/src/main/java/org/openzen/zenscript/codemodel/statement/ReturnStatement.java View File

48
 
48
 
49
 	@Override
49
 	@Override
50
 	public Statement transform(StatementTransformer transformer, ConcatMap<LoopStatement, LoopStatement> modified) {
50
 	public Statement transform(StatementTransformer transformer, ConcatMap<LoopStatement, LoopStatement> modified) {
51
-		Expression tValue = value.transform(transformer);
51
+		Expression tValue = value == null ? null : value.transform(transformer);
52
 		return tValue == value ? this : new ReturnStatement(position, tValue);
52
 		return tValue == value ? this : new ReturnStatement(position, tValue);
53
 	}
53
 	}
54
 
54
 
55
 	@Override
55
 	@Override
56
 	public Statement transform(ExpressionTransformer transformer, ConcatMap<LoopStatement, LoopStatement> modified) {
56
 	public Statement transform(ExpressionTransformer transformer, ConcatMap<LoopStatement, LoopStatement> modified) {
57
-		Expression tValue = value.transform(transformer);
57
+		Expression tValue = value == null ? null : value.transform(transformer);
58
 		return tValue == value ? this : new ReturnStatement(position, tValue);
58
 		return tValue == value ? this : new ReturnStatement(position, tValue);
59
 	}
59
 	}
60
 
60
 
61
 	@Override
61
 	@Override
62
 	public Statement normalize(TypeScope scope, ConcatMap<LoopStatement, LoopStatement> modified) {
62
 	public Statement normalize(TypeScope scope, ConcatMap<LoopStatement, LoopStatement> modified) {
63
-		return new ReturnStatement(position, value.normalize(scope));
63
+		return new ReturnStatement(position, value == null ? null : value.normalize(scope));
64
 	}
64
 	}
65
 }
65
 }

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

264
 				for (ITypeID resultHint : typeHints) {
264
 				for (ITypeID resultHint : typeHints) {
265
 					Map<TypeParameter, ITypeID> mapping = new HashMap<>();
265
 					Map<TypeParameter, ITypeID> mapping = new HashMap<>();
266
 					if (header.returnType.inferTypeParameters(scope.getMemberCache(), resultHint, mapping)) {
266
 					if (header.returnType.inferTypeParameters(scope.getMemberCache(), resultHint, mapping)) {
267
-						header = header.withGenericArguments(new GenericMapper(scope.getTypeRegistry(), mapping));
267
+						header = header.withGenericArguments(scope.getLocalTypeParameters().getInner(mapping));
268
 						break;
268
 						break;
269
 					}
269
 					}
270
 				}
270
 				}

+ 38
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/member/TypeMembers.java View File

9
 import java.util.HashMap;
9
 import java.util.HashMap;
10
 import java.util.List;
10
 import java.util.List;
11
 import java.util.Map;
11
 import java.util.Map;
12
+import java.util.Set;
12
 import org.openzen.zencode.shared.CodePosition;
13
 import org.openzen.zencode.shared.CodePosition;
13
 import org.openzen.zencode.shared.CompileException;
14
 import org.openzen.zencode.shared.CompileException;
14
 import org.openzen.zencode.shared.CompileExceptionCode;
15
 import org.openzen.zencode.shared.CompileExceptionCode;
23
 import org.openzen.zenscript.codemodel.expression.SupertypeCastExpression;
24
 import org.openzen.zenscript.codemodel.expression.SupertypeCastExpression;
24
 import org.openzen.zenscript.codemodel.expression.WrapOptionalExpression;
25
 import org.openzen.zenscript.codemodel.expression.WrapOptionalExpression;
25
 import org.openzen.zenscript.codemodel.member.EnumConstantMember;
26
 import org.openzen.zenscript.codemodel.member.EnumConstantMember;
27
+import org.openzen.zenscript.codemodel.member.IDefinitionMember;
26
 import org.openzen.zenscript.codemodel.member.InnerDefinition;
28
 import org.openzen.zenscript.codemodel.member.InnerDefinition;
27
 import org.openzen.zenscript.codemodel.member.ref.CasterMemberRef;
29
 import org.openzen.zenscript.codemodel.member.ref.CasterMemberRef;
28
 import org.openzen.zenscript.codemodel.member.ref.ConstMemberRef;
30
 import org.openzen.zenscript.codemodel.member.ref.ConstMemberRef;
142
 		return null;
144
 		return null;
143
 	}
145
 	}
144
 	
146
 	
147
+	public List<IDefinitionMember> getUnimplementedMembers(Set<IDefinitionMember> implemented) {
148
+		List<IDefinitionMember> result = new ArrayList<>();
149
+		for (TypeMember<CasterMemberRef> caster : casters) {
150
+			if (caster.member.member.isAbstract() && !implemented.contains(caster.member.member))
151
+				result.add(caster.member.member);
152
+		}
153
+		for (TypeMember<IteratorMemberRef> iterator : iterators) {
154
+			if (iterator.member.target.isAbstract() && !implemented.contains(iterator.member.target))
155
+				result.add(iterator.member.target);
156
+		}
157
+		for (Map.Entry<String, DefinitionMemberGroup> entry : members.entrySet()) {
158
+			DefinitionMemberGroup group = entry.getValue();
159
+			if (group.getGetter() != null && group.getGetter().member.isAbstract() && !implemented.contains(group.getGetter().member))
160
+				result.add(group.getGetter().member);
161
+			if (group.getSetter() != null && group.getSetter().member.isAbstract() && !implemented.contains(group.getSetter().member))
162
+				result.add(group.getSetter().member);
163
+			for (TypeMember<FunctionalMemberRef> member : group.getMethodMembers())
164
+				if (member.member.getTarget().isAbstract() && !implemented.contains(member.member.getTarget()))
165
+					result.add(member.member.getTarget());
166
+		}
167
+		for (Map.Entry<OperatorType, DefinitionMemberGroup> entry : operators.entrySet()) {
168
+			if (entry.getKey() == OperatorType.DESTRUCTOR)
169
+				continue; // destructor doesn't have to be implemented; the compiler can do so automatically
170
+			
171
+			DefinitionMemberGroup group = entry.getValue();
172
+			if (group.getGetter() != null && group.getGetter().member.isAbstract() && !implemented.contains(group.getGetter().member))
173
+				result.add(group.getGetter().member);
174
+			if (group.getSetter() != null && group.getSetter().member.isAbstract() && !implemented.contains(group.getSetter().member))
175
+				result.add(group.getSetter().member);
176
+			for (TypeMember<FunctionalMemberRef> member : group.getMethodMembers())
177
+				if (member.member.getTarget().isAbstract() && !implemented.contains(member.member.getTarget()))
178
+					result.add(member.member.getTarget());
179
+		}
180
+		return result;
181
+	}
182
+	
145
 	public void addConstructor(FunctionalMemberRef constructor, TypeMemberPriority priority) {
183
 	public void addConstructor(FunctionalMemberRef constructor, TypeMemberPriority priority) {
146
 		getOrCreateGroup(OperatorType.CONSTRUCTOR).addMethod(constructor, priority);
184
 		getOrCreateGroup(OperatorType.CONSTRUCTOR).addMethod(constructor, priority);
147
 	}
185
 	}

+ 18
- 15
Constructor/src/main/java/org/openzen/zenscript/constructor/Module.java View File

64
 		}
64
 		}
65
 	}
65
 	}
66
 	
66
 	
67
-	public ParsedFile[] parse(ZSPackage pkg, CompilingPackage compilingPackage) throws IOException {
67
+	public ParsedFile[] parse(CompilingPackage compilingPackage) throws IOException {
68
 		// TODO: load bracket parsers from host plugins
68
 		// TODO: load bracket parsers from host plugins
69
 		List<ParsedFile> files = new ArrayList<>();
69
 		List<ParsedFile> files = new ArrayList<>();
70
-		parse(files, pkg, compilingPackage, null, sourceDirectory);
70
+		parse(files, compilingPackage, null, sourceDirectory);
71
 		return files.toArray(new ParsedFile[files.size()]);
71
 		return files.toArray(new ParsedFile[files.size()]);
72
 	}
72
 	}
73
 	
73
 	
74
-	private void parse(List<ParsedFile> files, ZSPackage pkg, CompilingPackage compilingPackage, BracketExpressionParser bracketParser, File directory) throws IOException {
74
+	private void parse(List<ParsedFile> files, CompilingPackage pkg, BracketExpressionParser bracketParser, File directory) throws IOException {
75
 		for (File file : directory.listFiles()) {
75
 		for (File file : directory.listFiles()) {
76
 			if (file.getName().endsWith(".zs")) {
76
 			if (file.getName().endsWith(".zs")) {
77
 				try {
77
 				try {
78
-					files.add(ParsedFile.parse(pkg, compilingPackage, bracketParser, file));
78
+					files.add(ParsedFile.parse(pkg, bracketParser, file));
79
 				} catch (CompileException ex) {
79
 				} catch (CompileException ex) {
80
 					exceptionLogger.accept(ex);
80
 					exceptionLogger.accept(ex);
81
 				}
81
 				}
82
 			} else if (file.isDirectory()) {
82
 			} else if (file.isDirectory()) {
83
-				CompilingPackage innerPackage = new CompilingPackage();
84
-				compilingPackage.addPackage(file.getName(), innerPackage);
85
-				parse(files, pkg.getOrCreatePackage(file.getName()), innerPackage, bracketParser, file);
83
+				CompilingPackage innerPackage = pkg.getOrCreatePackage(file.getName());
84
+				pkg.addPackage(file.getName(), innerPackage);
85
+				parse(files, innerPackage, bracketParser, file);
86
 			}
86
 			}
87
 		}
87
 		}
88
 	}
88
 	}
90
 	public static SemanticModule compileSyntaxToSemantic(
90
 	public static SemanticModule compileSyntaxToSemantic(
91
 			String name,
91
 			String name,
92
 			String[] dependencies,
92
 			String[] dependencies,
93
-			ZSPackage pkg,
94
-			CompilingPackage compilingPkg,
93
+			CompilingPackage pkg,
95
 			ParsedFile[] files,
94
 			ParsedFile[] files,
96
 			ModuleSpace registry,
95
 			ModuleSpace registry,
97
 			Consumer<CompileException> exceptionLogger) {
96
 			Consumer<CompileException> exceptionLogger) {
117
 				registry.compilationUnit.globalTypeRegistry,
116
 				registry.compilationUnit.globalTypeRegistry,
118
 				registry.getAnnotations(),
117
 				registry.getAnnotations(),
119
 				rootPackage,
118
 				rootPackage,
120
-				compilingPkg,
119
+				pkg,
121
 				globals);
120
 				globals);
122
 		
121
 		
122
+		for (ParsedFile file : files) {
123
+			file.registerTypes(moduleContext, rootPackage, pkg);
124
+		}
125
+		
123
 		for (ParsedFile file : files) {
126
 		for (ParsedFile file : files) {
124
 			// compileMembers will register all definition members to their
127
 			// compileMembers will register all definition members to their
125
 			// respective definitions, such as fields, constructors, methods...
128
 			// respective definitions, such as fields, constructors, methods...
126
 			// It doesn't yet compile the method contents.
129
 			// It doesn't yet compile the method contents.
127
 			try {
130
 			try {
128
-				file.compileTypes(moduleContext, rootPackage, compilingPkg);
131
+				file.compileTypes(moduleContext, rootPackage, pkg);
129
 			} catch (CompileException ex) {
132
 			} catch (CompileException ex) {
130
 				exceptionLogger.accept(ex);
133
 				exceptionLogger.accept(ex);
131
 				failed = true;
134
 				failed = true;
133
 		}
136
 		}
134
 		
137
 		
135
 		if (failed)
138
 		if (failed)
136
-			return new SemanticModule(name, dependencies, SemanticModule.State.INVALID, rootPackage, pkg, definitions, Collections.emptyList(), registry.compilationUnit, expansions, registry.getAnnotations());
139
+			return new SemanticModule(name, dependencies, SemanticModule.State.INVALID, rootPackage, pkg.getPackage(), definitions, Collections.emptyList(), registry.compilationUnit, expansions, registry.getAnnotations());
137
 		
140
 		
138
 		// scripts will store all the script blocks encountered in the files
141
 		// scripts will store all the script blocks encountered in the files
139
 		PrecompilationState precompiler = new PrecompilationState();
142
 		PrecompilationState precompiler = new PrecompilationState();
140
 		for (ParsedFile file : files) {
143
 		for (ParsedFile file : files) {
141
-			file.registerMembers(moduleContext, precompiler, rootPackage, compilingPkg, expansions, globals);
144
+			file.registerMembers(moduleContext, precompiler, rootPackage, pkg, expansions, globals);
142
 		}
145
 		}
143
 		
146
 		
144
 		List<ScriptBlock> scripts = new ArrayList<>();
147
 		List<ScriptBlock> scripts = new ArrayList<>();
147
 			// into semantic code. This semantic code can then be compiled
150
 			// into semantic code. This semantic code can then be compiled
148
 			// to various targets.
151
 			// to various targets.
149
 			try {
152
 			try {
150
-				file.compileCode(moduleContext, precompiler, rootPackage, compilingPkg, expansions, scripts, globals);
153
+				file.compileCode(moduleContext, precompiler, rootPackage, pkg, expansions, scripts, globals);
151
 			} catch (CompileException ex) {
154
 			} catch (CompileException ex) {
152
 				exceptionLogger.accept(ex);
155
 				exceptionLogger.accept(ex);
153
 				failed = true;
156
 				failed = true;
154
 			}
157
 			}
155
 		}
158
 		}
156
 		
159
 		
157
-		return new SemanticModule(name, dependencies, SemanticModule.State.ASSEMBLED, rootPackage, pkg, definitions, scripts, registry.compilationUnit, expansions, registry.getAnnotations());
160
+		return new SemanticModule(name, dependencies, SemanticModule.State.ASSEMBLED, rootPackage, pkg.getPackage(), definitions, scripts, registry.compilationUnit, expansions, registry.getAnnotations());
158
 	}
161
 	}
159
 }
162
 }

+ 3
- 3
Constructor/src/main/java/org/openzen/zenscript/constructor/module/DirectoryModuleReference.java View File

76
 
76
 
77
 			Module module = new Module(moduleName, directory, jsonFile, exceptionLogger);
77
 			Module module = new Module(moduleName, directory, jsonFile, exceptionLogger);
78
 			ZSPackage pkg = isStdlib ? unit.globalTypeRegistry.stdlib : new ZSPackage(null, module.packageName);
78
 			ZSPackage pkg = isStdlib ? unit.globalTypeRegistry.stdlib : new ZSPackage(null, module.packageName);
79
-			CompilingPackage compilingPackage = new CompilingPackage();
79
+			CompilingPackage compilingPackage = new CompilingPackage(pkg);
80
 			
80
 			
81
-			ParsedFile[] parsedFiles = module.parse(pkg, compilingPackage);
82
-			SemanticModule result = Module.compileSyntaxToSemantic(module.name, module.dependencies, pkg, compilingPackage, parsedFiles, space, exceptionLogger);
81
+			ParsedFile[] parsedFiles = module.parse(compilingPackage);
82
+			SemanticModule result = Module.compileSyntaxToSemantic(module.name, module.dependencies, compilingPackage, parsedFiles, space, exceptionLogger);
83
 			
83
 			
84
 			JSONObject globals = json.optJSONObject("globals");
84
 			JSONObject globals = json.optJSONObject("globals");
85
 			if (globals != null) {
85
 			if (globals != null) {

+ 1
- 1
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaCompiler.java View File

46
 
46
 
47
 	@Override
47
 	@Override
48
 	public void addDefinition(HighLevelDefinition definition, SemanticModule module) {
48
 	public void addDefinition(HighLevelDefinition definition, SemanticModule module) {
49
-		String className = getClassName(definition.position.filename);
49
+		String className = getClassName(definition.position.getFilename());
50
 		JavaScriptFile scriptFile = getScriptFile(className);
50
 		JavaScriptFile scriptFile = getScriptFile(className);
51
 		target.register(definition.name, definition.accept(new JavaDefinitionVisitor(scriptFile.classWriter)));
51
 		target.register(definition.name, definition.accept(new JavaDefinitionVisitor(scriptFile.classWriter)));
52
 	}
52
 	}

+ 2
- 2
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/CompilerUtils.java View File

84
 	}
84
 	}
85
 
85
 
86
 	public static String calcClasName(CodePosition position) {
86
 	public static String calcClasName(CodePosition position) {
87
-		return position.filename.substring(0, position.filename.lastIndexOf('.')).replace("/", "_");
87
+		return position.getFilename().substring(0, position.getFilename().lastIndexOf('.')).replace("/", "_");
88
 	}
88
 	}
89
 
89
 
90
 	public static void tagMethodParameters(FunctionHeader header, boolean isStatic) {
90
 	public static void tagMethodParameters(FunctionHeader header, boolean isStatic) {
191
 
191
 
192
 		@Override
192
 		@Override
193
 		public Integer acceptEnumConstant(EnumConstantSwitchValue value) {
193
 		public Integer acceptEnumConstant(EnumConstantSwitchValue value) {
194
-			return value.constant.value;
194
+			return value.constant.ordinal;
195
 		}
195
 		}
196
 
196
 
197
 		@Override
197
 		@Override

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

1734
 		return null;
1734
 		return null;
1735
 	}
1735
 	}
1736
 
1736
 
1737
+	@Override
1738
+	public Void visitGetMatchingVariantField(GetMatchingVariantField expression) {
1739
+		throw new UnsupportedOperationException(); // TODO
1740
+	}
1741
+
1737
 	@Override
1742
 	@Override
1738
 	public Void visitGetStaticField(GetStaticFieldExpression expression) {
1743
 	public Void visitGetStaticField(GetStaticFieldExpression expression) {
1739
 		if (!checkAndGetFieldInfo(expression.field, true))
1744
 		if (!checkAndGetFieldInfo(expression.field, true))

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

216
 		return null;
216
 		return null;
217
 	}
217
 	}
218
 
218
 
219
+	@Override
220
+	public Void visitGetMatchingVariantField(GetMatchingVariantField expression) {
221
+		throw new UnsupportedOperationException("Invalid increment target");
222
+	}
223
+
219
 	@Override
224
 	@Override
220
 	public Void visitGetStaticField(GetStaticFieldExpression expression) {
225
 	public Void visitGetStaticField(GetStaticFieldExpression expression) {
221
 		if (!expressionCompiler.checkAndGetFieldInfo(expression.field, false))
226
 		if (!expressionCompiler.checkAndGetFieldInfo(expression.field, false))

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

221
 		return null;
221
 		return null;
222
 	}
222
 	}
223
 
223
 
224
+	@Override
225
+	public Void visitGetMatchingVariantField(GetMatchingVariantField expression) {
226
+		throw new UnsupportedOperationException("Invalid increment target");
227
+	}
228
+
224
 	@Override
229
 	@Override
225
 	public Void visitGetStaticField(GetStaticFieldExpression expression) {
230
 	public Void visitGetStaticField(GetStaticFieldExpression expression) {
226
 		if (!expressionCompiler.checkAndGetFieldInfo(expression.field, false))
231
 		if (!expressionCompiler.checkAndGetFieldInfo(expression.field, false))

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

89
 
89
 
90
 	@Override
90
 	@Override
91
 	public byte[] visitEnum(EnumDefinition definition) {
91
 	public byte[] visitEnum(EnumDefinition definition) {
92
-		System.out.println("Compiling enum " + definition.name + " in " + definition.position.filename);
92
+		System.out.println("Compiling enum " + definition.name + " in " + definition.position.getFilename());
93
 
93
 
94
 		final Type superType;
94
 		final Type superType;
95
 		if (definition.getSuperType() == null)
95
 		if (definition.getSuperType() == null)

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

215
 				clinitWriter.newObject(internalName);
215
 				clinitWriter.newObject(internalName);
216
 				clinitWriter.dup();
216
 				clinitWriter.dup();
217
 				clinitWriter.constant(constant.name);
217
 				clinitWriter.constant(constant.name);
218
-				clinitWriter.constant(constant.value);
218
+				clinitWriter.constant(constant.ordinal);
219
 				for (Expression argument : constant.constructor.arguments.arguments) {
219
 				for (Expression argument : constant.constructor.arguments.arguments) {
220
 					argument.accept(clinitStatementVisitor.expressionVisitor);
220
 					argument.accept(clinitStatementVisitor.expressionVisitor);
221
 				}
221
 				}
233
 
233
 
234
 			for (EnumConstantMember enumConstant : enumConstants) {
234
 			for (EnumConstantMember enumConstant : enumConstants) {
235
 				clinitWriter.dup();
235
 				clinitWriter.dup();
236
-				clinitWriter.constant(enumConstant.value);
236
+				clinitWriter.constant(enumConstant.ordinal);
237
 				clinitWriter.getStaticField(definition.name, enumConstant.name, "L" + definition.name + ";");
237
 				clinitWriter.getStaticField(definition.name, enumConstant.name, "L" + definition.name + ";");
238
 				clinitWriter.arrayStore(Type.getType("L" + definition.name + ";"));
238
 				clinitWriter.arrayStore(Type.getType("L" + definition.name + ";"));
239
 			}
239
 			}

+ 6
- 0
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/ExpressionHoistingChecker.java View File

41
 import org.openzen.zenscript.codemodel.expression.GetFieldExpression;
41
 import org.openzen.zenscript.codemodel.expression.GetFieldExpression;
42
 import org.openzen.zenscript.codemodel.expression.GetFunctionParameterExpression;
42
 import org.openzen.zenscript.codemodel.expression.GetFunctionParameterExpression;
43
 import org.openzen.zenscript.codemodel.expression.GetLocalVariableExpression;
43
 import org.openzen.zenscript.codemodel.expression.GetLocalVariableExpression;
44
+import org.openzen.zenscript.codemodel.expression.GetMatchingVariantField;
44
 import org.openzen.zenscript.codemodel.expression.GetStaticFieldExpression;
45
 import org.openzen.zenscript.codemodel.expression.GetStaticFieldExpression;
45
 import org.openzen.zenscript.codemodel.expression.GetterExpression;
46
 import org.openzen.zenscript.codemodel.expression.GetterExpression;
46
 import org.openzen.zenscript.codemodel.expression.GlobalCallExpression;
47
 import org.openzen.zenscript.codemodel.expression.GlobalCallExpression;
257
 		return false;
258
 		return false;
258
 	}
259
 	}
259
 
260
 
261
+	@Override
262
+	public Boolean visitGetMatchingVariantField(GetMatchingVariantField expression) {
263
+		return false;
264
+	}
265
+
260
 	@Override
266
 	@Override
261
 	public Boolean visitGetStaticField(GetStaticFieldExpression expression) {
267
 	public Boolean visitGetStaticField(GetStaticFieldExpression expression) {
262
 		return false;
268
 		return false;

+ 20
- 6
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaDefinitionVisitor.java View File

82
 	@Override
82
 	@Override
83
 	public Void visitClass(ClassDefinition definition) {
83
 	public Void visitClass(ClassDefinition definition) {
84
 		JavaSourceFileScope scope = createScope(definition);
84
 		JavaSourceFileScope scope = createScope(definition);
85
+		JavaSourceClass cls = definition.getTag(JavaSourceClass.class);
85
 		
86
 		
86
 		output.append(indent);
87
 		output.append(indent);
87
 		convertModifiers(definition.modifiers);
88
 		convertModifiers(definition.modifiers);
88
-		output.append("class ").append(definition.name);
89
+		output.append("class ").append(cls.getName());
89
 		JavaSourceUtils.formatTypeParameters(scope.typeVisitor, output, definition.genericParameters, false);
90
 		JavaSourceUtils.formatTypeParameters(scope.typeVisitor, output, definition.genericParameters, false);
90
 		if (definition.getSuperType() != null) {
91
 		if (definition.getSuperType() != null) {
91
 			output.append(" extends ");
92
 			output.append(" extends ");
99
 			}
100
 			}
100
 		}
101
 		}
101
 		
102
 		
102
-		if (mergedImplementations.size() > 0 || definition.isDestructible()) {
103
+		if (mergedImplementations.size() > 0 || cls.destructible) {
103
 			output.append(" implements ");
104
 			output.append(" implements ");
104
 			boolean first = true;
105
 			boolean first = true;
105
 			for (int i = 0; i < mergedImplementations.size(); i++) {
106
 			for (int i = 0; i < mergedImplementations.size(); i++) {
112
 				output.append(scope.type(implementation.type));
113
 				output.append(scope.type(implementation.type));
113
 			}
114
 			}
114
 			
115
 			
115
-			if (definition.isDestructible()) {
116
+			if (cls.destructible) {
116
 				if (first)
117
 				if (first)
117
 					first = false;
118
 					first = false;
118
 				else
119
 				else
132
 	@Override
133
 	@Override
133
 	public Void visitInterface(InterfaceDefinition definition) {
134
 	public Void visitInterface(InterfaceDefinition definition) {
134
 		JavaSourceFileScope scope = createScope(definition);
135
 		JavaSourceFileScope scope = createScope(definition);
136
+		JavaSourceClass cls = definition.getTag(JavaSourceClass.class);
135
 		
137
 		
136
 		output.append(indent);
138
 		output.append(indent);
137
 		convertModifiers(definition.modifiers | Modifiers.VIRTUAL); // to prevent 'final'
139
 		convertModifiers(definition.modifiers | Modifiers.VIRTUAL); // to prevent 'final'
138
-		output.append("interface ").append(definition.name);
140
+		output.append("interface ").append(cls.getName());
139
 		JavaSourceUtils.formatTypeParameters(scope.typeVisitor, output, definition.genericParameters, false);
141
 		JavaSourceUtils.formatTypeParameters(scope.typeVisitor, output, definition.genericParameters, false);
140
-			
142
+		
143
+		boolean firstExtends = true;
141
 		if (definition.isDestructible()) {
144
 		if (definition.isDestructible()) {
142
 			output.append(" extends ");
145
 			output.append(" extends ");
143
 			output.append(scope.importer.importType(new JavaSourceClass("java.lang", "AutoCloseable")));
146
 			output.append(scope.importer.importType(new JavaSourceClass("java.lang", "AutoCloseable")));
147
+			firstExtends = false;
148
+		}
149
+		
150
+		for (ITypeID base : definition.baseInterfaces) {
151
+			if (firstExtends) {
152
+				firstExtends = false;
153
+				output.append(" extends ");
154
+			} else {
155
+				output.append(", ");
156
+			}
157
+			output.append(scope.type(base));
144
 		}
158
 		}
145
 		
159
 		
146
 		output.append(" {\n");
160
 		output.append(" {\n");
302
 				String name = option.types.length == 1 ? "value" : "value" + (i + 1);
316
 				String name = option.types.length == 1 ? "value" : "value" + (i + 1);
303
 				output.append(scope.type(option.types[i])).append(' ').append(name);
317
 				output.append(scope.type(option.types[i])).append(' ').append(name);
304
 			}
318
 			}
305
-			output.append("){\n");
319
+			output.append(") {\n");
306
 			for (int i = 0; i < option.types.length; i++) {
320
 			for (int i = 0; i < option.types.length; i++) {
307
 				if (i > 0)
321
 				if (i > 0)
308
 					output.append(indent).append(settings.indent).append(settings.indent).append(settings.indent).append(";\n");
322
 					output.append(indent).append(settings.indent).append(settings.indent).append(settings.indent).append(";\n");

+ 1
- 1
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaExpansionMemberCompiler.java View File

129
 
129
 
130
 	@Override
130
 	@Override
131
 	public Void visitDestructor(DestructorMember member) {
131
 	public Void visitDestructor(DestructorMember member) {
132
-		throw new UnsupportedOperationException("Expansions cannot declare destructors");
132
+		return null; // ignore
133
 	}
133
 	}
134
 
134
 
135
 	@Override
135
 	@Override

+ 9
- 8
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaMemberCompiler.java View File

13
 import org.openzen.zenscript.codemodel.FunctionParameter;
13
 import org.openzen.zenscript.codemodel.FunctionParameter;
14
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
14
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
15
 import org.openzen.zenscript.codemodel.Modifiers;
15
 import org.openzen.zenscript.codemodel.Modifiers;
16
+import org.openzen.zenscript.codemodel.definition.InterfaceDefinition;
16
 import org.openzen.zenscript.codemodel.member.CallerMember;
17
 import org.openzen.zenscript.codemodel.member.CallerMember;
17
 import org.openzen.zenscript.codemodel.member.CasterMember;
18
 import org.openzen.zenscript.codemodel.member.CasterMember;
18
 import org.openzen.zenscript.codemodel.member.ConstMember;
19
 import org.openzen.zenscript.codemodel.member.ConstMember;
29
 import org.openzen.zenscript.codemodel.member.OperatorMember;
30
 import org.openzen.zenscript.codemodel.member.OperatorMember;
30
 import org.openzen.zenscript.codemodel.member.SetterMember;
31
 import org.openzen.zenscript.codemodel.member.SetterMember;
31
 import org.openzen.zenscript.codemodel.member.StaticInitializerMember;
32
 import org.openzen.zenscript.codemodel.member.StaticInitializerMember;
33
+import org.openzen.zenscript.codemodel.statement.BlockStatement;
32
 import org.openzen.zenscript.codemodel.statement.EmptyStatement;
34
 import org.openzen.zenscript.codemodel.statement.EmptyStatement;
33
 import org.openzen.zenscript.codemodel.statement.Statement;
35
 import org.openzen.zenscript.codemodel.statement.Statement;
34
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
36
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
166
 		
168
 		
167
 		output.append(indent).append("@Override\n");
169
 		output.append(indent).append("@Override\n");
168
 		output.append(indent).append("public void close()");
170
 		output.append(indent).append("public void close()");
169
-		compileBody(member.body, member.header);
171
+		
172
+		Statement body = member.body;
173
+		if ((body == null || body instanceof EmptyStatement) && !(definition instanceof InterfaceDefinition))
174
+			body = new BlockStatement(member.position, Collections.emptyList());
175
+		
176
+		compileBody(body, member.header);
170
 		return null;
177
 		return null;
171
 	}
178
 	}
172
 
179
 
263
 	}
270
 	}
264
 	
271
 	
265
 	public void finish() {
272
 	public void finish() {
266
-		// TODO: needs to be moved elsewhere (normalization stage?)
267
-		for (FieldMember field : fields) {
268
-			if (field.autoGetter != null)
269
-				visitGetter(field.autoGetter);
270
-			if (field.autoSetter != null)
271
-				visitSetter(field.autoSetter);
272
-		}
273
+		
273
 	}
274
 	}
274
 }
275
 }

+ 10
- 1
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceExpressionFormatter.java View File

49
 import org.openzen.zenscript.codemodel.expression.GetFieldExpression;
49
 import org.openzen.zenscript.codemodel.expression.GetFieldExpression;
50
 import org.openzen.zenscript.codemodel.expression.GetFunctionParameterExpression;
50
 import org.openzen.zenscript.codemodel.expression.GetFunctionParameterExpression;
51
 import org.openzen.zenscript.codemodel.expression.GetLocalVariableExpression;
51
 import org.openzen.zenscript.codemodel.expression.GetLocalVariableExpression;
52
+import org.openzen.zenscript.codemodel.expression.GetMatchingVariantField;
52
 import org.openzen.zenscript.codemodel.expression.GetStaticFieldExpression;
53
 import org.openzen.zenscript.codemodel.expression.GetStaticFieldExpression;
53
 import org.openzen.zenscript.codemodel.expression.GetterExpression;
54
 import org.openzen.zenscript.codemodel.expression.GetterExpression;
54
 import org.openzen.zenscript.codemodel.expression.GlobalCallExpression;
55
 import org.openzen.zenscript.codemodel.expression.GlobalCallExpression;
421
 		return new ExpressionString(expression.variable.name, JavaOperator.PRIMARY);
422
 		return new ExpressionString(expression.variable.name, JavaOperator.PRIMARY);
422
 	}
423
 	}
423
 
424
 
425
+	@Override
426
+	public ExpressionString visitGetMatchingVariantField(GetMatchingVariantField expression) {
427
+		return new ExpressionString(expression.value.parameters[expression.index], JavaOperator.PRIMARY);
428
+	}
429
+
424
 	@Override
430
 	@Override
425
 	public ExpressionString visitGetStaticField(GetStaticFieldExpression expression) {
431
 	public ExpressionString visitGetStaticField(GetStaticFieldExpression expression) {
426
 		JavaSourceField field = expression.field.getTag(JavaSourceField.class);
432
 		JavaSourceField field = expression.field.getTag(JavaSourceField.class);
1680
 					throw new UnsupportedOperationException("Not yet supported!");
1686
 					throw new UnsupportedOperationException("Not yet supported!");
1681
 				}
1687
 				}
1682
 			}
1688
 			}
1683
-			case ARRAY_CONSTRUCTOR_PROJECTED_INDEXED:
1689
+			case ARRAY_CONSTRUCTOR_PROJECTED_INDEXED: {
1684
 				ArrayTypeID type = (ArrayTypeID) expression.type;
1690
 				ArrayTypeID type = (ArrayTypeID) expression.type;
1685
 				
1691
 				
1686
 				if (type.dimension == 1) {
1692
 				if (type.dimension == 1) {
1759
 					// TODO: implement
1765
 					// TODO: implement
1760
 					throw new UnsupportedOperationException("Not yet supported!");
1766
 					throw new UnsupportedOperationException("Not yet supported!");
1761
 				}
1767
 				}
1768
+			}
1769
+			case CLASS_DEFAULT_CONSTRUCTOR:
1770
+				return new ExpressionString("new " + scope.type(expression.type) + "()", JavaOperator.NEW);
1762
 		}
1771
 		}
1763
 		
1772
 		
1764
 		throw new UnsupportedOperationException("Unknown builtin constructor: " + expression.constructor.getBuiltin());
1773
 		throw new UnsupportedOperationException("Unknown builtin constructor: " + expression.constructor.getBuiltin());

+ 5
- 5
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceStatementFormatter.java View File

140
 				String header = switchValue == null ? "default:" : "case " + switchValue.option.getName() + ":";
140
 				String header = switchValue == null ? "default:" : "case " + switchValue.option.getName() + ":";
141
 				List<String> statements = new ArrayList<>();
141
 				List<String> statements = new ArrayList<>();
142
 				if (switchValue != null) {
142
 				if (switchValue != null) {
143
-					for (VarStatement var : switchValue.parameters) {
143
+					for (int i = 0; i < switchValue.parameters.length; i++) {
144
 						StringBuilder statementOutput = new StringBuilder();
144
 						StringBuilder statementOutput = new StringBuilder();
145
-						statementOutput.append(scope.type(var.type)).append(" ").append(var.name).append(" = ((").append(variantTypeName).append(".").append(switchValue.option.getName());
145
+						statementOutput.append(scope.type(switchValue.option.types[i])).append(" ").append(switchValue.parameters[i]).append(" = ((").append(variantTypeName).append(".").append(switchValue.option.getName());
146
 						if (variant.genericParameters != null && variant.genericParameters.length > 0) {
146
 						if (variant.genericParameters != null && variant.genericParameters.length > 0) {
147
 							statementOutput.append("<");
147
 							statementOutput.append("<");
148
-							for (int i = 0; i < variantType.typeParameters.length; i++) {
149
-								if (i > 0)
148
+							for (int j = 0; j < variantType.typeParameters.length; j++) {
149
+								if (j > 0)
150
 									statementOutput.append(", ");
150
 									statementOutput.append(", ");
151
-								statementOutput.append(scope.type(variantType.typeParameters[i]));
151
+								statementOutput.append(scope.type(variantType.typeParameters[j]));
152
 							}
152
 							}
153
 							statementOutput.append(">");
153
 							statementOutput.append(">");
154
 						}
154
 						}

+ 6
- 0
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/prepare/JavaNativeClass.java View File

17
 public class JavaNativeClass {
17
 public class JavaNativeClass {
18
 	public final JavaSourceClass cls;
18
 	public final JavaSourceClass cls;
19
 	private final Map<String, JavaSourceMethod> methods = new HashMap<>();
19
 	private final Map<String, JavaSourceMethod> methods = new HashMap<>();
20
+	public final boolean nonDestructible;
20
 	
21
 	
21
 	public JavaNativeClass(JavaSourceClass cls) {
22
 	public JavaNativeClass(JavaSourceClass cls) {
23
+		this(cls, false);
24
+	}
25
+	
26
+	public JavaNativeClass(JavaSourceClass cls, boolean nonDestructible) {
22
 		this.cls = cls;
27
 		this.cls = cls;
28
+		this.nonDestructible = nonDestructible;
23
 	}
29
 	}
24
 	
30
 	
25
 	public void addMethod(String key, JavaSourceMethod method) {
31
 	public void addMethod(String key, JavaSourceMethod method) {

+ 46
- 6
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/prepare/JavaSourcePrepareClassMethodVisitor.java View File

25
 import org.openzen.zenscript.codemodel.member.OperatorMember;
25
 import org.openzen.zenscript.codemodel.member.OperatorMember;
26
 import org.openzen.zenscript.codemodel.member.SetterMember;
26
 import org.openzen.zenscript.codemodel.member.SetterMember;
27
 import org.openzen.zenscript.codemodel.member.StaticInitializerMember;
27
 import org.openzen.zenscript.codemodel.member.StaticInitializerMember;
28
+import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
28
 import org.openzen.zenscript.javasource.JavaSourceTypeNameVisitor;
29
 import org.openzen.zenscript.javasource.JavaSourceTypeNameVisitor;
29
 import org.openzen.zenscript.javasource.tags.JavaSourceClass;
30
 import org.openzen.zenscript.javasource.tags.JavaSourceClass;
30
 import org.openzen.zenscript.javasource.tags.JavaSourceField;
31
 import org.openzen.zenscript.javasource.tags.JavaSourceField;
36
  * @author Hoofdgebruiker
37
  * @author Hoofdgebruiker
37
  */
38
  */
38
 public class JavaSourcePrepareClassMethodVisitor implements MemberVisitor<Void> {
39
 public class JavaSourcePrepareClassMethodVisitor implements MemberVisitor<Void> {
40
+	private static final boolean DEBUG_EMPTY = true;
41
+	
42
+	private final JavaSourcePrepareDefinitionVisitor definitionPreparer;
39
 	private final String filename;
43
 	private final String filename;
40
 	private final JavaSourceClass cls;
44
 	private final JavaSourceClass cls;
41
 	private final JavaNativeClass nativeClass;
45
 	private final JavaNativeClass nativeClass;
42
 	
46
 	
43
-	public JavaSourcePrepareClassMethodVisitor(String filename, JavaSourceClass cls, JavaNativeClass nativeClass, boolean startsEmpty) {
47
+	public JavaSourcePrepareClassMethodVisitor(
48
+			JavaSourcePrepareDefinitionVisitor definitionPreparer,
49
+			String filename,
50
+			JavaSourceClass cls,
51
+			JavaNativeClass nativeClass,
52
+			boolean startsEmpty) {
53
+		this.definitionPreparer = definitionPreparer;
44
 		this.filename = filename;
54
 		this.filename = filename;
45
 		this.cls = cls;
55
 		this.cls = cls;
46
 		this.nativeClass = nativeClass;
56
 		this.nativeClass = nativeClass;
57
+		
47
 		cls.empty = startsEmpty;
58
 		cls.empty = startsEmpty;
48
 	}
59
 	}
49
 	
60
 	
50
 	@Override
61
 	@Override
51
 	public Void visitConst(ConstMember member) {
62
 	public Void visitConst(ConstMember member) {
63
+		if (DEBUG_EMPTY && cls.empty)
64
+			System.out.println("Class " + cls.fullName + " not empty because of const " + member.name);
65
+		
52
 		cls.empty = false;
66
 		cls.empty = false;
53
 		member.setTag(JavaSourceField.class, new JavaSourceField(cls, member.name));
67
 		member.setTag(JavaSourceField.class, new JavaSourceField(cls, member.name));
54
 		return null;
68
 		return null;
56
 	
70
 	
57
 	@Override
71
 	@Override
58
 	public Void visitField(FieldMember member) {
72
 	public Void visitField(FieldMember member) {
59
-		cls.empty = false;
60
 		member.setTag(JavaSourceField.class, new JavaSourceField(cls, member.name));
73
 		member.setTag(JavaSourceField.class, new JavaSourceField(cls, member.name));
61
 		if (member.hasAutoGetter())
74
 		if (member.hasAutoGetter())
62
 			visitGetter(member.autoGetter);
75
 			visitGetter(member.autoGetter);
74
 
87
 
75
 	@Override
88
 	@Override
76
 	public Void visitDestructor(DestructorMember member) {
89
 	public Void visitDestructor(DestructorMember member) {
90
+		if (DEBUG_EMPTY && cls.empty)
91
+			System.out.println("Class " + cls.fullName + " not empty because of destructor");
92
+		
77
 		cls.empty = false;
93
 		cls.empty = false;
78
 		return null;
94
 		return null;
79
 	}
95
 	}
122
 
138
 
123
 	@Override
139
 	@Override
124
 	public Void visitImplementation(ImplementationMember member) {
140
 	public Void visitImplementation(ImplementationMember member) {
125
-		cls.empty = false;
141
+		definitionPreparer.prepare(member.type);
142
+		
126
 		if (canMergeImplementation(member)) {
143
 		if (canMergeImplementation(member)) {
127
 			member.setTag(JavaSourceImplementation.class, new JavaSourceImplementation(true, cls));
144
 			member.setTag(JavaSourceImplementation.class, new JavaSourceImplementation(true, cls));
128
 			for (IDefinitionMember m : member.members)
145
 			for (IDefinitionMember m : member.members)
129
 				m.accept(this);
146
 				m.accept(this);
130
 		} else {
147
 		} else {
148
+			if (DEBUG_EMPTY && cls.empty)
149
+				System.out.println("Class " + cls.fullName + " not empty because of unmergeable implementation");
150
+			
151
+			cls.empty = false;
152
+			
131
 			JavaSourceClass implementationClass = new JavaSourceClass(cls, member.type.accept(new JavaSourceTypeNameVisitor()) + "Implementation");
153
 			JavaSourceClass implementationClass = new JavaSourceClass(cls, member.type.accept(new JavaSourceTypeNameVisitor()) + "Implementation");
132
 			member.setTag(JavaSourceImplementation.class, new JavaSourceImplementation(false, implementationClass));
154
 			member.setTag(JavaSourceImplementation.class, new JavaSourceImplementation(false, implementationClass));
133
 			
155
 			
134
-			JavaSourcePrepareClassMethodVisitor visitor = new JavaSourcePrepareClassMethodVisitor(filename, implementationClass, null, true);
156
+			JavaSourcePrepareClassMethodVisitor visitor = new JavaSourcePrepareClassMethodVisitor(definitionPreparer, filename, implementationClass, null, true);
135
 			for (IDefinitionMember m : member.members)
157
 			for (IDefinitionMember m : member.members)
136
 				m.accept(visitor);
158
 				m.accept(visitor);
137
 		}
159
 		}
147
 		JavaSourcePrepareDefinitionVisitor innerDefinitionPrepare = new JavaSourcePrepareDefinitionVisitor(filename, cls);
169
 		JavaSourcePrepareDefinitionVisitor innerDefinitionPrepare = new JavaSourcePrepareDefinitionVisitor(filename, cls);
148
 		member.innerDefinition.accept(innerDefinitionPrepare);
170
 		member.innerDefinition.accept(innerDefinitionPrepare);
149
 		
171
 		
172
+		if (DEBUG_EMPTY && cls.empty)
173
+			System.out.println("Class " + cls.fullName + " not empty because of inner definition " + member.innerDefinition.name);
150
 		cls.empty = false;
174
 		cls.empty = false;
151
 		return null;
175
 		return null;
152
 	}
176
 	}
153
 
177
 
154
 	@Override
178
 	@Override
155
 	public Void visitStaticInitializer(StaticInitializerMember member) {
179
 	public Void visitStaticInitializer(StaticInitializerMember member) {
180
+		if (DEBUG_EMPTY && cls.empty)
181
+			System.out.println("Class " + cls.fullName + " not empty because of static initializer");
182
+		
156
 		cls.empty = false;
183
 		cls.empty = false;
157
 		return null;
184
 		return null;
158
 	}
185
 	}
252
 		JavaSourceMethod method = null;
279
 		JavaSourceMethod method = null;
253
 		if (nativeTag != null && nativeClass != null)
280
 		if (nativeTag != null && nativeClass != null)
254
 			method = nativeClass.getMethod(nativeTag.value);
281
 			method = nativeClass.getMethod(nativeTag.value);
255
-		if (method == null)
282
+		
283
+		if (member.getOverrides() != null) {
284
+			DefinitionMemberRef base = member.getOverrides();
285
+			JavaSourceMethod baseMethod = base.getTarget().getTag(JavaSourceMethod.class);
286
+			if (baseMethod == null)
287
+				throw new IllegalStateException("Base method not yet prepared!");
288
+			
289
+			method = new JavaSourceMethod(cls, baseMethod.kind, baseMethod.name, true);
290
+		} else if (method == null) {
256
 			method = new JavaSourceMethod(cls, getKind(member), name, true);
291
 			method = new JavaSourceMethod(cls, getKind(member), name, true);
292
+		}
257
 		
293
 		
258
-		if (method.compile)
294
+		if (method.compile) {
295
+			if (DEBUG_EMPTY && cls.empty)
296
+				System.out.println("Class " + cls.fullName + " not empty because of " + member.describe());
297
+			
259
 			cls.empty = false;
298
 			cls.empty = false;
299
+		}
260
 		
300
 		
261
 		member.setTag(JavaSourceMethod.class, method);
301
 		member.setTag(JavaSourceMethod.class, method);
262
 	}
302
 	}

+ 65
- 4
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/prepare/JavaSourcePrepareDefinitionVisitor.java View File

22
 import org.openzen.zenscript.codemodel.expression.CastExpression;
22
 import org.openzen.zenscript.codemodel.expression.CastExpression;
23
 import org.openzen.zenscript.codemodel.expression.Expression;
23
 import org.openzen.zenscript.codemodel.expression.Expression;
24
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
24
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
25
+import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
26
+import org.openzen.zenscript.codemodel.type.ITypeID;
25
 import org.openzen.zenscript.formattershared.ExpressionString;
27
 import org.openzen.zenscript.formattershared.ExpressionString;
26
 import org.openzen.zenscript.javasource.JavaOperator;
28
 import org.openzen.zenscript.javasource.JavaOperator;
27
 import org.openzen.zenscript.javasource.tags.JavaSourceClass;
29
 import org.openzen.zenscript.javasource.tags.JavaSourceClass;
68
 			list.addInstanceMethod("insert", "add");
70
 			list.addInstanceMethod("insert", "add");
69
 			list.addInstanceMethod("remove", "remove");
71
 			list.addInstanceMethod("remove", "remove");
70
 			list.addInstanceMethod("indexOf", "indexOf");
72
 			list.addInstanceMethod("indexOf", "indexOf");
73
+			list.addInstanceMethod("lastIndexOf", "lastIndexOf");
71
 			list.addInstanceMethod("getAtIndex", "get");
74
 			list.addInstanceMethod("getAtIndex", "get");
72
 			list.addInstanceMethod("setAtIndex", "set");
75
 			list.addInstanceMethod("setAtIndex", "set");
73
 			list.addInstanceMethod("contains", "contains");
76
 			list.addInstanceMethod("contains", "contains");
74
 			list.addMethod("toArray", new JavaSourceMethod((formatter, call) -> formatter.listToArray((CastExpression)call)));
77
 			list.addMethod("toArray", new JavaSourceMethod((formatter, call) -> formatter.listToArray((CastExpression)call)));
75
-			list.addInstanceMethod("length", "length");
78
+			list.addInstanceMethod("length", "size");
76
 			list.addInstanceMethod("isEmpty", "isEmpty");
79
 			list.addInstanceMethod("isEmpty", "isEmpty");
80
+			list.addInstanceMethod("iterate", "iterator");
77
 			nativeClasses.put("stdlib::List", list);
81
 			nativeClasses.put("stdlib::List", list);
78
 		}
82
 		}
79
 		
83
 		
84
+		{
85
+			JavaNativeClass iterable = new JavaNativeClass(new JavaSourceClass("java.lang", "Iterable"));
86
+			iterable.addInstanceMethod("iterate", "iterator");
87
+			nativeClasses.put("stdlib::Iterable", iterable);
88
+		}
89
+		
90
+		{
91
+			JavaNativeClass iterator = new JavaNativeClass(new JavaSourceClass("java.lang", "Iterator"));
92
+			iterator.addInstanceMethod("hasNext", "hasNext");
93
+			iterator.addInstanceMethod("next", "next");
94
+			nativeClasses.put("stdlib::Iterator", iterator);
95
+		}
96
+		
80
 		{
97
 		{
81
 			JavaNativeClass comparable = new JavaNativeClass(new JavaSourceClass("java.lang", "Comparable"));
98
 			JavaNativeClass comparable = new JavaNativeClass(new JavaSourceClass("java.lang", "Comparable"));
82
 			comparable.addInstanceMethod("compareTo", "compareTo");
99
 			comparable.addInstanceMethod("compareTo", "compareTo");
184
 		}
201
 		}
185
 		
202
 		
186
 		{
203
 		{
187
-			JavaNativeClass cls = new JavaNativeClass(new JavaSourceClass("java.io", "StringReader"));
188
-			cls.addInstanceMethod("constructor", "");
204
+			JavaNativeClass cls = new JavaNativeClass(new JavaSourceClass("java.io", "StringReader"), true);
205
+			cls.addConstructor("constructor", "");
189
 			cls.addInstanceMethod("destructor", "close");
206
 			cls.addInstanceMethod("destructor", "close");
190
 			cls.addInstanceMethod("readCharacter", "read");
207
 			cls.addInstanceMethod("readCharacter", "read");
191
 			cls.addInstanceMethod("readSlice", "read");
208
 			cls.addInstanceMethod("readSlice", "read");
201
 		this.outerClass = outerClass;
218
 		this.outerClass = outerClass;
202
 	}
219
 	}
203
 	
220
 	
221
+	private boolean isPrepared(HighLevelDefinition definition) {
222
+		return definition.hasTag(JavaSourceClass.class);
223
+	}
224
+	
225
+	public void prepare(ITypeID type) {
226
+		if (!(type instanceof DefinitionTypeID))
227
+			return;
228
+			
229
+		HighLevelDefinition definition = ((DefinitionTypeID)type).definition;
230
+		definition.accept(this);
231
+	}
232
+	
204
 	@Override
233
 	@Override
205
 	public JavaSourceClass visitClass(ClassDefinition definition) {
234
 	public JavaSourceClass visitClass(ClassDefinition definition) {
235
+		if (isPrepared(definition))
236
+			return definition.getTag(JavaSourceClass.class);
237
+		
206
 		return visitClassCompiled(definition, true);
238
 		return visitClassCompiled(definition, true);
207
 	}
239
 	}
208
 
240
 
209
 	@Override
241
 	@Override
210
 	public JavaSourceClass visitInterface(InterfaceDefinition definition) {
242
 	public JavaSourceClass visitInterface(InterfaceDefinition definition) {
243
+		if (isPrepared(definition))
244
+			return definition.getTag(JavaSourceClass.class);
245
+		
246
+		for (ITypeID baseType : definition.baseInterfaces)
247
+			prepare(baseType);
248
+		
211
 		return visitClassCompiled(definition, true);
249
 		return visitClassCompiled(definition, true);
212
 	}
250
 	}
213
 
251
 
214
 	@Override
252
 	@Override
215
 	public JavaSourceClass visitEnum(EnumDefinition definition) {
253
 	public JavaSourceClass visitEnum(EnumDefinition definition) {
254
+		if (isPrepared(definition))
255
+			return definition.getTag(JavaSourceClass.class);
256
+		
216
 		return visitClassCompiled(definition, false);
257
 		return visitClassCompiled(definition, false);
217
 	}
258
 	}
218
 
259
 
219
 	@Override
260
 	@Override
220
 	public JavaSourceClass visitStruct(StructDefinition definition) {
261
 	public JavaSourceClass visitStruct(StructDefinition definition) {
262
+		if (isPrepared(definition))
263
+			return definition.getTag(JavaSourceClass.class);
264
+		
221
 		return visitClassCompiled(definition, true);
265
 		return visitClassCompiled(definition, true);
222
 	}
266
 	}
223
 
267
 
224
 	@Override
268
 	@Override
225
 	public JavaSourceClass visitFunction(FunctionDefinition definition) {
269
 	public JavaSourceClass visitFunction(FunctionDefinition definition) {
270
+		if (isPrepared(definition))
271
+			return definition.getTag(JavaSourceClass.class);
272
+		
226
 		JavaSourceClass cls = new JavaSourceClass(definition.pkg.fullName, filename);
273
 		JavaSourceClass cls = new JavaSourceClass(definition.pkg.fullName, filename);
227
 		definition.setTag(JavaSourceClass.class, cls);
274
 		definition.setTag(JavaSourceClass.class, cls);
228
 		JavaSourceMethod method = new JavaSourceMethod(cls, JavaSourceMethod.Kind.STATIC, definition.name, true);
275
 		JavaSourceMethod method = new JavaSourceMethod(cls, JavaSourceMethod.Kind.STATIC, definition.name, true);
232
 
279
 
233
 	@Override
280
 	@Override
234
 	public JavaSourceClass visitExpansion(ExpansionDefinition definition) {
281
 	public JavaSourceClass visitExpansion(ExpansionDefinition definition) {
282
+		if (isPrepared(definition))
283
+			return definition.getTag(JavaSourceClass.class);
284
+		
235
 		NativeTag nativeTag = definition.getTag(NativeTag.class);
285
 		NativeTag nativeTag = definition.getTag(NativeTag.class);
236
 		JavaNativeClass nativeClass = null;
286
 		JavaNativeClass nativeClass = null;
237
 		if (nativeTag != null) {
287
 		if (nativeTag != null) {
252
 
302
 
253
 	@Override
303
 	@Override
254
 	public JavaSourceClass visitVariant(VariantDefinition variant) {
304
 	public JavaSourceClass visitVariant(VariantDefinition variant) {
305
+		if (isPrepared(variant))
306
+			return variant.getTag(JavaSourceClass.class);
307
+		
255
 		JavaSourceClass cls = new JavaSourceClass(variant.pkg.fullName, variant.name);
308
 		JavaSourceClass cls = new JavaSourceClass(variant.pkg.fullName, variant.name);
256
 		variant.setTag(JavaSourceClass.class, cls);
309
 		variant.setTag(JavaSourceClass.class, cls);
257
 		
310
 		
265
 	}
318
 	}
266
 	
319
 	
267
 	private JavaSourceClass visitClassCompiled(HighLevelDefinition definition, boolean startsEmpty) {
320
 	private JavaSourceClass visitClassCompiled(HighLevelDefinition definition, boolean startsEmpty) {
321
+		if (definition.getSuperType() != null)
322
+			prepare(definition.getSuperType());
323
+		
268
 		NativeTag nativeTag = definition.getTag(NativeTag.class);
324
 		NativeTag nativeTag = definition.getTag(NativeTag.class);
269
 		JavaNativeClass nativeClass = nativeTag == null ? null : nativeClasses.get(nativeTag.value);
325
 		JavaNativeClass nativeClass = nativeTag == null ? null : nativeClasses.get(nativeTag.value);
270
 		if (nativeClass == null) {
326
 		if (nativeClass == null) {
271
 			JavaSourceClass cls = outerClass == null ? new JavaSourceClass(definition.pkg.fullName, definition.name) : new JavaSourceClass(outerClass, definition.name);
327
 			JavaSourceClass cls = outerClass == null ? new JavaSourceClass(definition.pkg.fullName, definition.name) : new JavaSourceClass(outerClass, definition.name);
328
+			cls.destructible = definition.isDestructible();
272
 			definition.setTag(JavaSourceClass.class, cls);
329
 			definition.setTag(JavaSourceClass.class, cls);
273
 			visitClassMembers(definition, cls, null, startsEmpty);
330
 			visitClassMembers(definition, cls, null, startsEmpty);
274
 			return cls;
331
 			return cls;
277
 			definition.setTag(JavaSourceClass.class, nativeClass.cls);
334
 			definition.setTag(JavaSourceClass.class, nativeClass.cls);
278
 			definition.setTag(JavaNativeClass.class, nativeClass);
335
 			definition.setTag(JavaNativeClass.class, nativeClass);
279
 			visitExpansionMembers(definition, cls, nativeClass);
336
 			visitExpansionMembers(definition, cls, nativeClass);
337
+			
338
+			if (nativeClass.nonDestructible)
339
+				cls.destructible = false;
340
+			
280
 			return cls;
341
 			return cls;
281
 		}
342
 		}
282
 	}
343
 	}
283
 	
344
 	
284
 	private void visitClassMembers(HighLevelDefinition definition, JavaSourceClass cls, JavaNativeClass nativeClass, boolean startsEmpty) {
345
 	private void visitClassMembers(HighLevelDefinition definition, JavaSourceClass cls, JavaNativeClass nativeClass, boolean startsEmpty) {
285
-		JavaSourcePrepareClassMethodVisitor methodVisitor = new JavaSourcePrepareClassMethodVisitor(filename, cls, nativeClass, startsEmpty);
346
+		JavaSourcePrepareClassMethodVisitor methodVisitor = new JavaSourcePrepareClassMethodVisitor(this, filename, cls, nativeClass, startsEmpty);
286
 		for (IDefinitionMember member : definition.members) {
347
 		for (IDefinitionMember member : definition.members) {
287
 			member.accept(methodVisitor);
348
 			member.accept(methodVisitor);
288
 		}
349
 		}

+ 14
- 1
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/prepare/JavaSourcePrepareExpansionMethodVisitor.java View File

36
  * @author Hoofdgebruiker
36
  * @author Hoofdgebruiker
37
  */
37
  */
38
 public class JavaSourcePrepareExpansionMethodVisitor implements MemberVisitor<Void> {
38
 public class JavaSourcePrepareExpansionMethodVisitor implements MemberVisitor<Void> {
39
+	private static final boolean DEBUG_EMPTY = true;
40
+	
39
 	private final JavaSourceClass cls;
41
 	private final JavaSourceClass cls;
40
 	private final JavaNativeClass nativeClass;
42
 	private final JavaNativeClass nativeClass;
41
 	
43
 	
48
 	@Override
50
 	@Override
49
 	public Void visitConst(ConstMember member) {
51
 	public Void visitConst(ConstMember member) {
50
 		member.setTag(JavaSourceField.class, new JavaSourceField(cls, member.name));
52
 		member.setTag(JavaSourceField.class, new JavaSourceField(cls, member.name));
53
+		
54
+		if (DEBUG_EMPTY && cls.empty)
55
+			System.out.println("Class " + cls.fullName + " not empty because of const");
56
+		
51
 		cls.empty = false;
57
 		cls.empty = false;
52
 		return null;
58
 		return null;
53
 	}
59
 	}
69
 
75
 
70
 	@Override
76
 	@Override
71
 	public Void visitDestructor(DestructorMember member) {
77
 	public Void visitDestructor(DestructorMember member) {
78
+		if (nativeClass != null && nativeClass.nonDestructible)
79
+			return null;
80
+		
72
 		visitFunctional(member, "");
81
 		visitFunctional(member, "");
73
 		return null;
82
 		return null;
74
 	}
83
 	}
146
 		if (method == null)
155
 		if (method == null)
147
 			method = new JavaSourceMethod(cls, getKind(member), name, true); 
156
 			method = new JavaSourceMethod(cls, getKind(member), name, true); 
148
 		
157
 		
149
-		if (method.compile)
158
+		if (method.compile) {
159
+			if (DEBUG_EMPTY && cls.empty)
160
+				System.out.println("Class " + cls.fullName + " not empty because of " + member.describe());
161
+			
150
 			cls.empty = false;
162
 			cls.empty = false;
163
+		}
151
 		
164
 		
152
 		member.setTag(JavaSourceMethod.class, method);
165
 		member.setTag(JavaSourceMethod.class, method);
153
 	}
166
 	}

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

17
 	T_WHITESPACE_TAB(true, "\t", "\t"),
17
 	T_WHITESPACE_TAB(true, "\t", "\t"),
18
 	T_WHITESPACE_NEWLINE(true, "\n", "\n", true),
18
 	T_WHITESPACE_NEWLINE(true, "\n", "\n", true),
19
 	T_WHITESPACE_CARRIAGE_RETURN(true, "\r", "\r"),
19
 	T_WHITESPACE_CARRIAGE_RETURN(true, "\r", "\r"),
20
-	T_IDENTIFIER("[a-zA-Z_][a-zA-Z_0-9]*"),
20
+	T_IDENTIFIER("@?[a-zA-Z_][a-zA-Z_0-9]*"),
21
+	T_LOCAL_IDENTIFIER("$[a-zA-Z_][a-zA-Z_0-9]*"),
21
 	T_FLOAT("\\-?(0|[1-9][0-9]*)\\.[0-9]+([eE][\\+\\-]?[0-9]+)?"),
22
 	T_FLOAT("\\-?(0|[1-9][0-9]*)\\.[0-9]+([eE][\\+\\-]?[0-9]+)?"),
22
 	T_INT("\\-?(0|[1-9][0-9]*)"),
23
 	T_INT("\\-?(0|[1-9][0-9]*)"),
23
 	T_STRING_SQ("\"([^\"\\\\\\n]|\\\\([\'\"\\\\/bfnrt&]|u[0-9a-fA-F]{4}))*\""),
24
 	T_STRING_SQ("\"([^\"\\\\\\n]|\\\\([\'\"\\\\/bfnrt&]|u[0-9a-fA-F]{4}))*\""),
94
 	K_PRIVATE(true, "private"),
95
 	K_PRIVATE(true, "private"),
95
 	K_PUBLIC(true, "public"),
96
 	K_PUBLIC(true, "public"),
96
 	K_EXPORT(true, "export"),
97
 	K_EXPORT(true, "export"),
98
+	K_INTERNAL(true, "internal"),
97
 	K_STATIC(true, "static"),
99
 	K_STATIC(true, "static"),
98
 	K_PROTECTED(true, "protected"),
100
 	K_PROTECTED(true, "protected"),
99
 	K_IMPLICIT(true, "implicit"),
101
 	K_IMPLICIT(true, "implicit"),

+ 8
- 5
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;
9
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
10
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
9
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
10
+import org.openzen.zenscript.codemodel.context.CompilingPackage;
11
 import org.openzen.zenscript.codemodel.context.CompilingType;
11
 import org.openzen.zenscript.codemodel.context.CompilingType;
12
 import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
12
 import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
13
-import org.openzen.zenscript.codemodel.definition.ZSPackage;
14
 import org.openzen.zenscript.lexer.ZSTokenParser;
13
 import org.openzen.zenscript.lexer.ZSTokenParser;
15
 import static org.openzen.zenscript.lexer.ZSTokenType.*;
14
 import static org.openzen.zenscript.lexer.ZSTokenType.*;
16
 import org.openzen.zenscript.codemodel.scope.BaseScope;
15
 import org.openzen.zenscript.codemodel.scope.BaseScope;
27
  *
26
  *
28
  * @author Hoofdgebruiker
27
  * @author Hoofdgebruiker
29
  */
28
  */
30
-public abstract class ParsedDefinition implements CompilingType {
31
-	public static ParsedDefinition parse(ZSPackage pkg, CodePosition position, int modifiers, ParsedAnnotation[] annotations, ZSTokenParser tokens, HighLevelDefinition outerDefinition) {
29
+public abstract class ParsedDefinition {
30
+	public static ParsedDefinition parse(CompilingPackage pkg, CodePosition position, int modifiers, ParsedAnnotation[] annotations, ZSTokenParser tokens, HighLevelDefinition outerDefinition) {
32
 		if (tokens.optional(K_CLASS) != null) {
31
 		if (tokens.optional(K_CLASS) != null) {
33
 			return ParsedClass.parseClass(pkg, position, modifiers, annotations, tokens, outerDefinition);
32
 			return ParsedClass.parseClass(pkg, position, modifiers, annotations, tokens, outerDefinition);
34
 		} else if (tokens.optional(K_INTERFACE) != null) {
33
 		} else if (tokens.optional(K_INTERFACE) != null) {
54
 	public final CodePosition position;
53
 	public final CodePosition position;
55
 	public final int modifiers;
54
 	public final int modifiers;
56
 	public final ParsedAnnotation[] annotations;
55
 	public final ParsedAnnotation[] annotations;
56
+	public final CompilingPackage pkg;
57
 	
57
 	
58
-	public ParsedDefinition(CodePosition position, int modifiers, ParsedAnnotation[] annotations) {
58
+	public ParsedDefinition(CodePosition position, int modifiers, CompilingPackage pkg, ParsedAnnotation[] annotations) {
59
 		this.position = position;
59
 		this.position = position;
60
+		this.pkg = pkg;
60
 		this.modifiers = modifiers;
61
 		this.modifiers = modifiers;
61
 		this.annotations = annotations;
62
 		this.annotations = annotations;
62
 	}
63
 	}
73
 		return modifiers;
74
 		return modifiers;
74
 	}
75
 	}
75
 	
76
 	
77
+	public abstract CompilingType getCompiling(TypeResolutionContext context);
78
+	
76
 	public abstract HighLevelDefinition getCompiled();
79
 	public abstract HighLevelDefinition getCompiled();
77
 	
80
 	
78
 	public abstract void linkTypes(TypeResolutionContext context);
81
 	public abstract void linkTypes(TypeResolutionContext context);

+ 31
- 17
Parser/src/main/java/org/openzen/zenscript/parser/ParsedFile.java View File

16
 import org.openzen.zencode.shared.FileSourceFile;
16
 import org.openzen.zencode.shared.FileSourceFile;
17
 import org.openzen.zencode.shared.LiteralSourceFile;
17
 import org.openzen.zencode.shared.LiteralSourceFile;
18
 import org.openzen.zencode.shared.SourceFile;
18
 import org.openzen.zencode.shared.SourceFile;
19
-import org.openzen.zenscript.codemodel.annotations.AnnotationDefinition;
20
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
19
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
21
 import org.openzen.zenscript.codemodel.Modifiers;
20
 import org.openzen.zenscript.codemodel.Modifiers;
22
 import org.openzen.zenscript.codemodel.PackageDefinitions;
21
 import org.openzen.zenscript.codemodel.PackageDefinitions;
28
 import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
27
 import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
29
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
28
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
30
 import org.openzen.zenscript.codemodel.statement.Statement;
29
 import org.openzen.zenscript.codemodel.statement.Statement;
31
-import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
32
 import org.openzen.zenscript.lexer.ZSTokenParser;
30
 import org.openzen.zenscript.lexer.ZSTokenParser;
33
 import static org.openzen.zenscript.lexer.ZSTokenType.*;
31
 import static org.openzen.zenscript.lexer.ZSTokenType.*;
34
 import org.openzen.zenscript.codemodel.scope.FileScope;
32
 import org.openzen.zenscript.codemodel.scope.FileScope;
42
  * @author Hoofdgebruiker
40
  * @author Hoofdgebruiker
43
  */
41
  */
44
 public class ParsedFile {
42
 public class ParsedFile {
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));
43
+	public static ParsedFile parse(CompilingPackage compilingPackage, BracketExpressionParser bracketParser, File file) throws IOException {
44
+		return parse(compilingPackage, bracketParser, new FileSourceFile(file.getName(), file));
47
 	}
45
 	}
48
 	
46
 	
49
-	public static ParsedFile parse(ZSPackage pkg, CompilingPackage compilingPackage, BracketExpressionParser bracketParser, String filename, String content) {
47
+	public static ParsedFile parse(CompilingPackage compilingPackage, BracketExpressionParser bracketParser, String filename, String content) {
50
 		try {
48
 		try {
51
-			return parse(pkg, compilingPackage, bracketParser, new LiteralSourceFile(filename, content));
49
+			return parse(compilingPackage, bracketParser, new LiteralSourceFile(filename, content));
52
 		} catch (IOException ex) {
50
 		} catch (IOException ex) {
53
 			throw new AssertionError(); // shouldn't happen
51
 			throw new AssertionError(); // shouldn't happen
54
 		}
52
 		}
55
 	}
53
 	}
56
 	
54
 	
57
-	public static ParsedFile parse(ZSPackage pkg, CompilingPackage compilingPackage, BracketExpressionParser bracketParser, SourceFile file) throws IOException {
55
+	public static ParsedFile parse(CompilingPackage compilingPackage, BracketExpressionParser bracketParser, SourceFile file) throws IOException {
58
 		ZSTokenParser tokens = ZSTokenParser.create(file, bracketParser, 4);
56
 		ZSTokenParser tokens = ZSTokenParser.create(file, bracketParser, 4);
59
-		return parse(pkg, compilingPackage, tokens);
57
+		return parse(compilingPackage, tokens);
60
 	}
58
 	}
61
 	
59
 	
62
-	public static ParsedFile parse(ZSPackage pkg, CompilingPackage compilingPackage, ZSTokenParser tokens) {
60
+	public static ParsedFile parse(CompilingPackage compilingPackage, ZSTokenParser tokens) {
63
 		ParsedFile result = new ParsedFile(tokens.getFile());
61
 		ParsedFile result = new ParsedFile(tokens.getFile());
64
 
62
 
65
 		while (true) {
63
 		while (true) {
106
 			} else if ((tokens.optional(EOF)) != null) {
104
 			} else if ((tokens.optional(EOF)) != null) {
107
 				break;
105
 				break;
108
 			} else {
106
 			} else {
109
-				ParsedDefinition definition = ParsedDefinition.parse(pkg, position, modifiers, annotations, tokens, null);
107
+				ParsedDefinition definition = ParsedDefinition.parse(compilingPackage, position, modifiers, annotations, tokens, null);
110
 				if (definition == null) {
108
 				if (definition == null) {
111
 					result.statements.add(ParsedStatement.parse(tokens, annotations));
109
 					result.statements.add(ParsedStatement.parse(tokens, annotations));
112
 				} else {
110
 				} else {
113
 					result.definitions.add(definition);
111
 					result.definitions.add(definition);
114
 					definition.getCompiled().setTag(SourceFile.class, tokens.getFile());
112
 					definition.getCompiled().setTag(SourceFile.class, tokens.getFile());
115
-					
116
-					if (definition.getName() != null)
117
-						compilingPackage.addType(definition.getName(), definition);
118
 				}
113
 				}
119
 			}
114
 			}
120
 		}
115
 		}
148
 		}
143
 		}
149
 	}
144
 	}
150
 	
145
 	
146
+	public void registerTypes(
147
+			ModuleTypeResolutionContext moduleContext,
148
+			ZSPackage rootPackage,
149
+			CompilingPackage modulePackage) {
150
+		FileResolutionContext context = new FileResolutionContext(moduleContext, modulePackage);
151
+		loadImports(context, rootPackage, modulePackage);
152
+		
153
+		for (ParsedDefinition definition : this.definitions) {
154
+			if (definition.getName() != null)
155
+				definition.pkg.addType(definition.getName(), definition.getCompiling(context));
156
+		}
157
+	}
158
+	
151
 	public void compileTypes(
159
 	public void compileTypes(
152
 			ModuleTypeResolutionContext moduleContext,
160
 			ModuleTypeResolutionContext moduleContext,
153
 			ZSPackage rootPackage,
161
 			ZSPackage rootPackage,
154
 			CompilingPackage modulePackage) {
162
 			CompilingPackage modulePackage) {
155
-		FileResolutionContext context = new FileResolutionContext(moduleContext);
163
+		FileResolutionContext context = new FileResolutionContext(moduleContext, modulePackage);
156
 		loadImports(context, rootPackage, modulePackage);
164
 		loadImports(context, rootPackage, modulePackage);
165
+		
166
+		for (ParsedDefinition definition : this.definitions) {
167
+			if (definition.getName() != null)
168
+				modulePackage.addType(definition.getName(), definition.getCompiling(context));
169
+		}
170
+		
157
 		for (ParsedDefinition definition : this.definitions) {
171
 		for (ParsedDefinition definition : this.definitions) {
158
-			definition.linkTypes(context);
172
+			definition.getCompiling(context).load();
159
 		}
173
 		}
160
 	}
174
 	}
161
 	
175
 	
166
 			CompilingPackage modulePackage,
180
 			CompilingPackage modulePackage,
167
 			List<ExpansionDefinition> expansions,
181
 			List<ExpansionDefinition> expansions,
168
 			Map<String, ISymbol> globals) {
182
 			Map<String, ISymbol> globals) {
169
-		FileResolutionContext context = new FileResolutionContext(moduleContext);
183
+		FileResolutionContext context = new FileResolutionContext(moduleContext, modulePackage);
170
 		loadImports(context, rootPackage, modulePackage);
184
 		loadImports(context, rootPackage, modulePackage);
171
 		
185
 		
172
 		FileScope scope = new FileScope(context, expansions, globals, precompiler);
186
 		FileScope scope = new FileScope(context, expansions, globals, precompiler);
183
 			List<ExpansionDefinition> expansions,
197
 			List<ExpansionDefinition> expansions,
184
 			List<ScriptBlock> scripts,
198
 			List<ScriptBlock> scripts,
185
 			Map<String, ISymbol> globals) {
199
 			Map<String, ISymbol> globals) {
186
-		FileResolutionContext context = new FileResolutionContext(moduleContext);
200
+		FileResolutionContext context = new FileResolutionContext(moduleContext, modulePackage);
187
 		loadImports(context, rootPackage, modulePackage);
201
 		loadImports(context, rootPackage, modulePackage);
188
 		
202
 		
189
 		FileScope scope = new FileScope(context, expansions, globals, precompiler);
203
 		FileScope scope = new FileScope(context, expansions, globals, precompiler);

+ 28
- 12
Parser/src/main/java/org/openzen/zenscript/parser/definitions/BaseParsedDefinition.java View File

11
 import java.util.Map;
11
 import java.util.Map;
12
 import org.openzen.zencode.shared.CodePosition;
12
 import org.openzen.zencode.shared.CodePosition;
13
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
13
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
14
+import org.openzen.zenscript.codemodel.context.CompilingPackage;
14
 import org.openzen.zenscript.codemodel.context.CompilingType;
15
 import org.openzen.zenscript.codemodel.context.CompilingType;
15
 import org.openzen.zenscript.codemodel.context.LocalTypeResolutionContext;
16
 import org.openzen.zenscript.codemodel.context.LocalTypeResolutionContext;
16
 import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
17
 import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
28
 public abstract class BaseParsedDefinition extends ParsedDefinition {
29
 public abstract class BaseParsedDefinition extends ParsedDefinition {
29
 	protected final List<ParsedDefinitionMember> members = new ArrayList<>();
30
 	protected final List<ParsedDefinitionMember> members = new ArrayList<>();
30
 	private boolean typesCompiled = false;
31
 	private boolean typesCompiled = false;
31
-	private final Map<String, CompilingType> innerTypes = new HashMap<>();
32
+	private final Map<String, ParsedDefinition> innerTypes = new HashMap<>();
32
 	private boolean isCompiled = false;
33
 	private boolean isCompiled = false;
33
 	
34
 	
34
-	public BaseParsedDefinition(CodePosition position, int modifiers, ParsedAnnotation[] annotations) {
35
-		super(position, modifiers, annotations);
35
+	public BaseParsedDefinition(CodePosition position, int modifiers, CompilingPackage pkg, ParsedAnnotation[] annotations) {
36
+		super(position, modifiers, pkg, annotations);
36
 	}
37
 	}
37
 	
38
 	
38
 	public void addMember(ParsedDefinitionMember member) {
39
 	public void addMember(ParsedDefinitionMember member) {
47
 		typesCompiled = true;
48
 		typesCompiled = true;
48
 		
49
 		
49
 		System.out.println("compileTypes " + getCompiled().name);
50
 		System.out.println("compileTypes " + getCompiled().name);
50
-		LocalTypeResolutionContext localContext = new LocalTypeResolutionContext(context, this, getCompiled().genericParameters);
51
-		linkTypesLocal(localContext);
51
+		linkTypesLocal(context);
52
 	}
52
 	}
53
 	
53
 	
54
 	protected void linkTypesLocal(TypeResolutionContext localContext) {
54
 	protected void linkTypesLocal(TypeResolutionContext localContext) {
79
 		for (ParsedDefinitionMember member : members)
79
 		for (ParsedDefinitionMember member : members)
80
 			member.compile(innerScope);
80
 			member.compile(innerScope);
81
 	}
81
 	}
82
-	
82
+
83
 	@Override
83
 	@Override
84
-	public HighLevelDefinition load(TypeResolutionContext context) {
85
-		linkTypes(context);
86
-		return getCompiled();
84
+	public CompilingType getCompiling(TypeResolutionContext context) {
85
+		return new Compiling(context);
87
 	}
86
 	}
88
 	
87
 	
89
-	@Override
90
-	public CompilingType getInner(String name) {
91
-		return innerTypes.get(name);
88
+	private class Compiling implements CompilingType {
89
+		private final TypeResolutionContext context;
90
+		
91
+		public Compiling(TypeResolutionContext context) {
92
+			this.context = new LocalTypeResolutionContext(context, this, getCompiled().genericParameters);
93
+		}
94
+		
95
+		@Override
96
+		public HighLevelDefinition load() {
97
+			linkTypes(context);
98
+			return getCompiled();
99
+		}
100
+
101
+		@Override
102
+		public CompilingType getInner(String name) {
103
+			if (!innerTypes.containsKey(name))
104
+				return null;
105
+			
106
+			return innerTypes.get(name).getCompiling(context);
107
+		}
92
 	}
108
 	}
93
 }
109
 }

+ 27
- 15
Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedAlias.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.CompilingPackage;
11
 import org.openzen.zenscript.codemodel.context.CompilingType;
12
 import org.openzen.zenscript.codemodel.context.CompilingType;
12
 import org.openzen.zenscript.codemodel.context.LocalTypeResolutionContext;
13
 import org.openzen.zenscript.codemodel.context.LocalTypeResolutionContext;
13
 import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
14
 import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
14
 import org.openzen.zenscript.codemodel.definition.AliasDefinition;
15
 import org.openzen.zenscript.codemodel.definition.AliasDefinition;
15
-import org.openzen.zenscript.codemodel.definition.ZSPackage;
16
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
16
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
17
 import org.openzen.zenscript.lexer.ZSTokenParser;
17
 import org.openzen.zenscript.lexer.ZSTokenParser;
18
 import org.openzen.zenscript.lexer.ZSTokenType;
18
 import org.openzen.zenscript.lexer.ZSTokenType;
27
  * @author Hoofdgebruiker
27
  * @author Hoofdgebruiker
28
  */
28
  */
29
 public class ParsedAlias extends ParsedDefinition {
29
 public class ParsedAlias extends ParsedDefinition {
30
-	public static ParsedAlias parseAlias(ZSPackage pkg, CodePosition position, int modifiers, ParsedAnnotation[] annotations, ZSTokenParser tokens, HighLevelDefinition outerDefinition) {
30
+	public static ParsedAlias parseAlias(CompilingPackage pkg, CodePosition position, int modifiers, ParsedAnnotation[] annotations, ZSTokenParser tokens, HighLevelDefinition outerDefinition) {
31
 		String name = tokens.required(ZSTokenType.T_IDENTIFIER, "identifier expected").content;
31
 		String name = tokens.required(ZSTokenType.T_IDENTIFIER, "identifier expected").content;
32
 		List<ParsedTypeParameter> parameters = ParsedTypeParameter.parseAll(tokens);
32
 		List<ParsedTypeParameter> parameters = ParsedTypeParameter.parseAll(tokens);
33
 		tokens.required(ZSTokenType.K_AS, "as expected");
33
 		tokens.required(ZSTokenType.K_AS, "as expected");
43
 	private final AliasDefinition compiled;
43
 	private final AliasDefinition compiled;
44
 	private boolean typesLinked = false;
44
 	private boolean typesLinked = false;
45
 	
45
 	
46
-	public ParsedAlias(ZSPackage pkg, CodePosition position, int modifiers, ParsedAnnotation[] annotations, String name, List<ParsedTypeParameter> parameters, IParsedType type, HighLevelDefinition outerDefinition) {
47
-		super(position, modifiers, annotations);
46
+	public ParsedAlias(CompilingPackage pkg, CodePosition position, int modifiers, ParsedAnnotation[] annotations, String name, List<ParsedTypeParameter> parameters, IParsedType type, HighLevelDefinition outerDefinition) {
47
+		super(position, modifiers, pkg, annotations);
48
 		
48
 		
49
 		this.name = name;
49
 		this.name = name;
50
 		this.parameters = parameters;
50
 		this.parameters = parameters;
51
 		this.type = type;
51
 		this.type = type;
52
 		
52
 		
53
-		compiled = new AliasDefinition(position, pkg, name, modifiers, outerDefinition);
53
+		compiled = new AliasDefinition(position, pkg.getPackage(), name, modifiers, outerDefinition);
54
 		
54
 		
55
 		if (parameters != null && parameters.size() > 0) {
55
 		if (parameters != null && parameters.size() > 0) {
56
 			TypeParameter[] typeParameters = new TypeParameter[parameters.size()];
56
 			TypeParameter[] typeParameters = new TypeParameter[parameters.size()];
67
 			return;
67
 			return;
68
 		typesLinked = true;
68
 		typesLinked = true;
69
 		
69
 		
70
-		LocalTypeResolutionContext localContext = new LocalTypeResolutionContext(context, this, compiled.genericParameters);
71
-		compiled.setType(type.compile(localContext));
70
+		compiled.setType(type.compile(context));
72
 		
71
 		
73
 		for (int i = 0; i < compiled.genericParameters.length; i++) {
72
 		for (int i = 0; i < compiled.genericParameters.length; i++) {
74
 			TypeParameter output = compiled.genericParameters[i];
73
 			TypeParameter output = compiled.genericParameters[i];
75
 			ParsedTypeParameter input = this.parameters.get(i);
74
 			ParsedTypeParameter input = this.parameters.get(i);
76
 			for (ParsedGenericBound bound : input.bounds) {
75
 			for (ParsedGenericBound bound : input.bounds) {
77
-				output.addBound(bound.compile(localContext));
76
+				output.addBound(bound.compile(context));
78
 			}
77
 			}
79
 		}
78
 		}
80
 	}
79
 	}
95
 	}
94
 	}
96
 
95
 
97
 	@Override
96
 	@Override
98
-	public CompilingType getInner(String name) {
99
-		// TODO: this should be possible too
100
-		return null;
97
+	public CompilingType getCompiling(TypeResolutionContext context) {
98
+		return new Compiling(context);
101
 	}
99
 	}
100
+	
101
+	private class Compiling implements CompilingType {
102
+		private final TypeResolutionContext context;
103
+		
104
+		public Compiling(TypeResolutionContext context) {
105
+			this.context = new LocalTypeResolutionContext(context, this, compiled.genericParameters);
106
+		}
107
+		
108
+		@Override
109
+		public CompilingType getInner(String name) {
110
+			// TODO: this should be possible too
111
+			return null;
112
+		}
102
 
113
 
103
-	@Override
104
-	public HighLevelDefinition load(TypeResolutionContext context) {
105
-		linkTypes(context);
106
-		return compiled;
114
+		@Override
115
+		public HighLevelDefinition load() {
116
+			linkTypes(context);
117
+			return compiled;
118
+		}
107
 	}
119
 	}
108
 }
120
 }

+ 11
- 9
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.CompilingPackage;
11
 import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
12
 import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
12
 import org.openzen.zenscript.codemodel.definition.ClassDefinition;
13
 import org.openzen.zenscript.codemodel.definition.ClassDefinition;
13
-import org.openzen.zenscript.codemodel.definition.ZSPackage;
14
 import org.openzen.zenscript.lexer.ZSTokenParser;
14
 import org.openzen.zenscript.lexer.ZSTokenParser;
15
 import org.openzen.zenscript.lexer.ZSTokenType;
15
 import org.openzen.zenscript.lexer.ZSTokenType;
16
 import org.openzen.zenscript.parser.ParsedAnnotation;
16
 import org.openzen.zenscript.parser.ParsedAnnotation;
22
  * @author Stan Hebben
22
  * @author Stan Hebben
23
  */
23
  */
24
 public class ParsedClass extends BaseParsedDefinition {
24
 public class ParsedClass extends BaseParsedDefinition {
25
-	public static ParsedClass parseClass(ZSPackage pkg, CodePosition position, int modifiers, ParsedAnnotation[] annotations, ZSTokenParser tokens, HighLevelDefinition outerDefinition) {
25
+	public static ParsedClass parseClass(CompilingPackage pkg, CodePosition position, int modifiers, ParsedAnnotation[] annotations, ZSTokenParser tokens, HighLevelDefinition outerDefinition) {
26
 		String name = tokens.required(ZSTokenType.T_IDENTIFIER, "identifier expected").content;
26
 		String name = tokens.required(ZSTokenType.T_IDENTIFIER, "identifier expected").content;
27
 		List<ParsedTypeParameter> genericParameters = ParsedTypeParameter.parseAll(tokens);
27
 		List<ParsedTypeParameter> genericParameters = ParsedTypeParameter.parseAll(tokens);
28
 		
28
 		
35
 		
35
 		
36
 		ParsedClass result = new ParsedClass(pkg, position, modifiers, annotations, name, genericParameters, superclass, outerDefinition);
36
 		ParsedClass result = new ParsedClass(pkg, position, modifiers, annotations, name, genericParameters, superclass, outerDefinition);
37
 		while (tokens.optional(ZSTokenType.T_ACLOSE) == null) {
37
 		while (tokens.optional(ZSTokenType.T_ACLOSE) == null) {
38
-			result.addMember(ParsedDefinitionMember.parse(tokens, result.compiled, null));
38
+			result.addMember(ParsedDefinitionMember.parse(tokens, result, null));
39
 		}
39
 		}
40
 		return result;
40
 		return result;
41
 	}
41
 	}
42
 	
42
 	
43
-	private final List<ParsedTypeParameter> genericParameters;
43
+	private final List<ParsedTypeParameter> parameters;
44
 	private final IParsedType superclass;
44
 	private final IParsedType superclass;
45
 	
45
 	
46
 	private final ClassDefinition compiled;
46
 	private final ClassDefinition compiled;
47
 	
47
 	
48
-	public ParsedClass(ZSPackage pkg, CodePosition position, int modifiers, ParsedAnnotation[] annotations, String name, List<ParsedTypeParameter> genericParameters, IParsedType superclass, HighLevelDefinition outerDefinition) {
49
-		super(position, modifiers, annotations);
48
+	public ParsedClass(CompilingPackage pkg, CodePosition position, int modifiers, ParsedAnnotation[] annotations, String name, List<ParsedTypeParameter> parameters, IParsedType superclass, HighLevelDefinition outerDefinition) {
49
+		super(position, modifiers, pkg, annotations);
50
 		
50
 		
51
-		this.genericParameters = genericParameters;
51
+		this.parameters = parameters;
52
 		this.superclass = superclass;
52
 		this.superclass = superclass;
53
 		
53
 		
54
-		compiled = new ClassDefinition(position, pkg, name, modifiers, outerDefinition);
55
-		compiled.setTypeParameters(ParsedTypeParameter.getCompiled(genericParameters));
54
+		compiled = new ClassDefinition(position, pkg.getPackage(), name, modifiers, outerDefinition);
55
+		compiled.setTypeParameters(ParsedTypeParameter.getCompiled(parameters));
56
 	}
56
 	}
57
 
57
 
58
 	@Override
58
 	@Override
62
 
62
 
63
 	@Override
63
 	@Override
64
 	protected void linkTypesLocal(TypeResolutionContext context) {
64
 	protected void linkTypesLocal(TypeResolutionContext context) {
65
+		ParsedTypeParameter.compile(context, compiled.genericParameters, this.parameters);
66
+		
65
 		if (superclass != null)
67
 		if (superclass != null)
66
 			compiled.setSuperType(superclass.compile(context));
68
 			compiled.setSuperType(superclass.compile(context));
67
 		
69
 		

+ 6
- 7
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.CompilingPackage;
12
 import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
13
 import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
13
 import org.openzen.zenscript.codemodel.definition.EnumDefinition;
14
 import org.openzen.zenscript.codemodel.definition.EnumDefinition;
14
-import org.openzen.zenscript.codemodel.definition.ZSPackage;
15
 import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
15
 import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
16
 import org.openzen.zenscript.codemodel.type.ITypeID;
16
 import org.openzen.zenscript.codemodel.type.ITypeID;
17
 import org.openzen.zenscript.lexer.ZSTokenParser;
17
 import org.openzen.zenscript.lexer.ZSTokenParser;
19
 import org.openzen.zenscript.codemodel.scope.BaseScope;
19
 import org.openzen.zenscript.codemodel.scope.BaseScope;
20
 import org.openzen.zenscript.codemodel.scope.ExpressionScope;
20
 import org.openzen.zenscript.codemodel.scope.ExpressionScope;
21
 import org.openzen.zenscript.parser.ParsedAnnotation;
21
 import org.openzen.zenscript.parser.ParsedAnnotation;
22
-import org.openzen.zenscript.parser.PrecompilationState;
23
 import org.openzen.zenscript.parser.member.ParsedDefinitionMember;
22
 import org.openzen.zenscript.parser.member.ParsedDefinitionMember;
24
 
23
 
25
 /**
24
 /**
27
  * @author Hoofdgebruiker
26
  * @author Hoofdgebruiker
28
  */
27
  */
29
 public class ParsedEnum extends BaseParsedDefinition {
28
 public class ParsedEnum extends BaseParsedDefinition {
30
-	public static ParsedEnum parseEnum(ZSPackage pkg, CodePosition position, int modifiers, ParsedAnnotation[] annotations, ZSTokenParser tokens, HighLevelDefinition outerDefinition) {
29
+	public static ParsedEnum parseEnum(CompilingPackage pkg, CodePosition position, int modifiers, ParsedAnnotation[] annotations, ZSTokenParser tokens, HighLevelDefinition outerDefinition) {
31
 		String name = tokens.required(ZSTokenType.T_IDENTIFIER, "identifier expected").content;
30
 		String name = tokens.required(ZSTokenType.T_IDENTIFIER, "identifier expected").content;
32
 		tokens.required(ZSTokenType.T_AOPEN, "{ expected");
31
 		tokens.required(ZSTokenType.T_AOPEN, "{ expected");
33
 		
32
 		
41
 		
40
 		
42
 		if (tokens.optional(ZSTokenType.T_SEMICOLON) != null) {
41
 		if (tokens.optional(ZSTokenType.T_SEMICOLON) != null) {
43
 			while (tokens.optional(ZSTokenType.T_ACLOSE) == null) {
42
 			while (tokens.optional(ZSTokenType.T_ACLOSE) == null) {
44
-				result.addMember(ParsedDefinitionMember.parse(tokens, result.compiled, null));
43
+				result.addMember(ParsedDefinitionMember.parse(tokens, result, null));
45
 			}
44
 			}
46
 		} else {
45
 		} else {
47
 			tokens.required(ZSTokenType.T_ACLOSE, "} expected");
46
 			tokens.required(ZSTokenType.T_ACLOSE, "} expected");
53
 	
52
 	
54
 	private final EnumDefinition compiled;
53
 	private final EnumDefinition compiled;
55
 	
54
 	
56
-	public ParsedEnum(ZSPackage pkg, CodePosition position, int modifiers, ParsedAnnotation[] annotations, String name, HighLevelDefinition outerDefinition) {
57
-		super(position, modifiers, annotations);
55
+	public ParsedEnum(CompilingPackage pkg, CodePosition position, int modifiers, ParsedAnnotation[] annotations, String name, HighLevelDefinition outerDefinition) {
56
+		super(position, modifiers, pkg, annotations);
58
 		
57
 		
59
-		compiled = new EnumDefinition(position, pkg, name, modifiers, outerDefinition);
58
+		compiled = new EnumDefinition(position, pkg.getPackage(), name, modifiers, outerDefinition);
60
 	}
59
 	}
61
 	
60
 	
62
 	public void addEnumValue(ParsedEnumConstant value) {
61
 	public void addEnumValue(ParsedEnumConstant value) {

+ 6
- 9
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;
13
+import org.openzen.zenscript.codemodel.context.CompilingPackage;
14
 import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
14
 import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
15
 import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
15
 import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
16
-import org.openzen.zenscript.codemodel.definition.ZSPackage;
17
 import org.openzen.zenscript.lexer.ZSTokenParser;
16
 import org.openzen.zenscript.lexer.ZSTokenParser;
18
 import org.openzen.zenscript.lexer.ZSTokenType;
17
 import 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;
18
 import org.openzen.zenscript.parser.ParsedAnnotation;
22
 import org.openzen.zenscript.parser.member.ParsedDefinitionMember;
19
 import org.openzen.zenscript.parser.member.ParsedDefinitionMember;
23
 import org.openzen.zenscript.parser.type.IParsedType;
20
 import org.openzen.zenscript.parser.type.IParsedType;
27
  * @author Hoofdgebruiker
24
  * @author Hoofdgebruiker
28
  */
25
  */
29
 public class ParsedExpansion extends BaseParsedDefinition {
26
 public class ParsedExpansion extends BaseParsedDefinition {
30
-	public static ParsedExpansion parseExpansion(ZSPackage pkg, CodePosition position, int modifiers, ParsedAnnotation[] annotations, ZSTokenParser tokens, HighLevelDefinition outerDefinition) {
27
+	public static ParsedExpansion parseExpansion(CompilingPackage pkg, CodePosition position, int modifiers, ParsedAnnotation[] annotations, ZSTokenParser tokens, HighLevelDefinition outerDefinition) {
31
 		List<ParsedTypeParameter> parameters = ParsedTypeParameter.parseAll(tokens);
28
 		List<ParsedTypeParameter> parameters = ParsedTypeParameter.parseAll(tokens);
32
 		IParsedType target = IParsedType.parse(tokens);
29
 		IParsedType target = IParsedType.parse(tokens);
33
 		tokens.required(ZSTokenType.T_AOPEN, "{ expected");
30
 		tokens.required(ZSTokenType.T_AOPEN, "{ expected");
34
 		
31
 		
35
 		ParsedExpansion result = new ParsedExpansion(pkg, position, modifiers, annotations, parameters, target, outerDefinition);
32
 		ParsedExpansion result = new ParsedExpansion(pkg, position, modifiers, annotations, parameters, target, outerDefinition);
36
 		while (tokens.optional(ZSTokenType.T_ACLOSE) == null) {
33
 		while (tokens.optional(ZSTokenType.T_ACLOSE) == null) {
37
-			result.addMember(ParsedDefinitionMember.parse(tokens, result.compiled, null));
34
+			result.addMember(ParsedDefinitionMember.parse(tokens, result, null));
38
 		}
35
 		}
39
 		return result;
36
 		return result;
40
 	}
37
 	}
43
 	private final IParsedType target;
40
 	private final IParsedType target;
44
 	private final ExpansionDefinition compiled;
41
 	private final ExpansionDefinition compiled;
45
 	
42
 	
46
-	public ParsedExpansion(ZSPackage pkg, CodePosition position, int modifiers, ParsedAnnotation[] annotations, List<ParsedTypeParameter> genericParameters, IParsedType target, HighLevelDefinition outerDefinition) {
47
-		super(position, modifiers, annotations);
43
+	public ParsedExpansion(CompilingPackage pkg, CodePosition position, int modifiers, ParsedAnnotation[] annotations, List<ParsedTypeParameter> genericParameters, IParsedType target, HighLevelDefinition outerDefinition) {
44
+		super(position, modifiers, pkg, annotations);
48
 		
45
 		
49
 		this.parameters = genericParameters;
46
 		this.parameters = genericParameters;
50
 		this.target = target;
47
 		this.target = target;
51
 		
48
 		
52
-		compiled = new ExpansionDefinition(position, pkg, modifiers, outerDefinition);
49
+		compiled = new ExpansionDefinition(position, pkg.getPackage(), modifiers, outerDefinition);
53
 		compiled.setTypeParameters(ParsedTypeParameter.getCompiled(genericParameters));
50
 		compiled.setTypeParameters(ParsedTypeParameter.getCompiled(genericParameters));
54
 	}
51
 	}
55
 	
52
 	

+ 23
- 10
Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedFunction.java View File

9
 import org.openzen.zencode.shared.CodePosition;
9
 import org.openzen.zencode.shared.CodePosition;
10
 import static org.openzen.zenscript.lexer.ZSTokenType.*;
10
 import static org.openzen.zenscript.lexer.ZSTokenType.*;
11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
+import org.openzen.zenscript.codemodel.context.CompilingPackage;
12
 import org.openzen.zenscript.codemodel.context.CompilingType;
13
 import org.openzen.zenscript.codemodel.context.CompilingType;
13
 import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
14
 import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
14
 import org.openzen.zenscript.codemodel.definition.FunctionDefinition;
15
 import org.openzen.zenscript.codemodel.definition.FunctionDefinition;
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;
28
  * @author Stanneke
28
  * @author Stanneke
29
  */
29
  */
30
 public class ParsedFunction extends ParsedDefinition {
30
 public class ParsedFunction extends ParsedDefinition {
31
-	public static ParsedFunction parseFunction(ZSPackage pkg, CodePosition position, int modifiers, ParsedAnnotation[] annotations, ZSTokenParser parser, HighLevelDefinition outerDefinition) {
31
+	public static ParsedFunction parseFunction(CompilingPackage pkg, CodePosition position, int modifiers, ParsedAnnotation[] annotations, ZSTokenParser parser, HighLevelDefinition outerDefinition) {
32
 		String name = parser.required(T_IDENTIFIER, "identifier expected").content;
32
 		String name = parser.required(T_IDENTIFIER, "identifier expected").content;
33
 		ParsedFunctionHeader header = ParsedFunctionHeader.parse(parser);
33
 		ParsedFunctionHeader header = ParsedFunctionHeader.parse(parser);
34
 		ParsedFunctionBody body = ParsedStatement.parseFunctionBody(parser);
34
 		ParsedFunctionBody body = ParsedStatement.parseFunctionBody(parser);
40
 
40
 
41
 	private final FunctionDefinition compiled;
41
 	private final FunctionDefinition compiled;
42
 	
42
 	
43
-	private ParsedFunction(ZSPackage pkg, CodePosition position, int modifiers, ParsedAnnotation[] annotations, String name, ParsedFunctionHeader header, ParsedFunctionBody body, HighLevelDefinition outerDefinition) {
44
-		super(position, modifiers, annotations);
43
+	private ParsedFunction(CompilingPackage pkg, CodePosition position, int modifiers, ParsedAnnotation[] annotations, String name, ParsedFunctionHeader header, ParsedFunctionBody body, HighLevelDefinition outerDefinition) {
44
+		super(position, modifiers, pkg, annotations);
45
 		
45
 		
46
 		this.header = header;
46
 		this.header = header;
47
 		this.body = body;
47
 		this.body = body;
48
 		
48
 		
49
-		compiled = new FunctionDefinition(position, pkg, name, modifiers, outerDefinition);
49
+		compiled = new FunctionDefinition(position, pkg.getPackage(), name, modifiers, outerDefinition);
50
 	}
50
 	}
51
 
51
 
52
 	@Override
52
 	@Override
75
 	}
75
 	}
76
 
76
 
77
 	@Override
77
 	@Override
78
-	public CompilingType getInner(String name) {
79
-		return null;
78
+	public CompilingType getCompiling(TypeResolutionContext context) {
79
+		return new Compiling(context);
80
 	}
80
 	}
81
 
81
 
82
-	@Override
83
-	public HighLevelDefinition load(TypeResolutionContext context) {
84
-		return compiled;
82
+	private class Compiling implements CompilingType {
83
+		private final TypeResolutionContext context;
84
+		
85
+		public Compiling(TypeResolutionContext context) {
86
+			this.context = context;
87
+		}
88
+		
89
+		@Override
90
+		public CompilingType getInner(String name) {
91
+			return null;
92
+		}
93
+
94
+		@Override
95
+		public HighLevelDefinition load() {
96
+			return compiled;
97
+		}
85
 	}
98
 	}
86
 }
99
 }

+ 6
- 6
Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedInterface.java View File

10
 import java.util.List;
10
 import java.util.List;
11
 import org.openzen.zencode.shared.CodePosition;
11
 import org.openzen.zencode.shared.CodePosition;
12
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
13
+import org.openzen.zenscript.codemodel.context.CompilingPackage;
13
 import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
14
 import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
14
 import org.openzen.zenscript.codemodel.definition.InterfaceDefinition;
15
 import org.openzen.zenscript.codemodel.definition.InterfaceDefinition;
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.lexer.ZSTokenType;
17
 import org.openzen.zenscript.lexer.ZSTokenType;
18
 import org.openzen.zenscript.parser.ParsedAnnotation;
18
 import org.openzen.zenscript.parser.ParsedAnnotation;
24
  * @author Hoofdgebruiker
24
  * @author Hoofdgebruiker
25
  */
25
  */
26
 public class ParsedInterface extends BaseParsedDefinition {
26
 public class ParsedInterface extends BaseParsedDefinition {
27
-	public static ParsedInterface parseInterface(ZSPackage pkg, CodePosition position, int modifiers, ParsedAnnotation[] annotations, ZSTokenParser tokens, HighLevelDefinition outerDefinition) {
27
+	public static ParsedInterface parseInterface(CompilingPackage pkg, CodePosition position, int modifiers, ParsedAnnotation[] annotations, ZSTokenParser tokens, HighLevelDefinition outerDefinition) {
28
 		String name = tokens.required(ZSTokenType.T_IDENTIFIER, "identifier expected").content;
28
 		String name = tokens.required(ZSTokenType.T_IDENTIFIER, "identifier expected").content;
29
 		List<ParsedTypeParameter> genericParameters = ParsedTypeParameter.parseAll(tokens);
29
 		List<ParsedTypeParameter> genericParameters = ParsedTypeParameter.parseAll(tokens);
30
 		List<IParsedType> superInterfaces = Collections.emptyList();
30
 		List<IParsedType> superInterfaces = Collections.emptyList();
39
 		
39
 		
40
 		ParsedInterface result = new ParsedInterface(pkg, position, modifiers, annotations, name, genericParameters, superInterfaces, outerDefinition);
40
 		ParsedInterface result = new ParsedInterface(pkg, position, modifiers, annotations, name, genericParameters, superInterfaces, outerDefinition);
41
 		while (tokens.optional(ZSTokenType.T_ACLOSE) == null) {
41
 		while (tokens.optional(ZSTokenType.T_ACLOSE) == null) {
42
-			result.addMember(ParsedDefinitionMember.parse(tokens, result.compiled, null));
42
+			result.addMember(ParsedDefinitionMember.parse(tokens, result, null));
43
 		}
43
 		}
44
 		return result;
44
 		return result;
45
 	}
45
 	}
49
 	
49
 	
50
 	private final InterfaceDefinition compiled;
50
 	private final InterfaceDefinition compiled;
51
 	
51
 	
52
-	public ParsedInterface(ZSPackage pkg, CodePosition position, int modifiers, ParsedAnnotation[] annotations, String name, List<ParsedTypeParameter> typeParameters, List<IParsedType> superInterfaces, HighLevelDefinition outerDefinition) {
53
-		super(position, modifiers, annotations);
52
+	public ParsedInterface(CompilingPackage pkg, CodePosition position, int modifiers, ParsedAnnotation[] annotations, String name, List<ParsedTypeParameter> typeParameters, List<IParsedType> superInterfaces, HighLevelDefinition outerDefinition) {
53
+		super(position, modifiers, pkg, annotations);
54
 		
54
 		
55
 		this.typeParameters = typeParameters;
55
 		this.typeParameters = typeParameters;
56
 		this.superInterfaces = superInterfaces;
56
 		this.superInterfaces = superInterfaces;
57
 		
57
 		
58
-		compiled = new InterfaceDefinition(position, pkg, name, modifiers, outerDefinition);
58
+		compiled = new InterfaceDefinition(position, pkg.getPackage(), name, modifiers, outerDefinition);
59
 		compiled.setTypeParameters(ParsedTypeParameter.getCompiled(typeParameters));
59
 		compiled.setTypeParameters(ParsedTypeParameter.getCompiled(typeParameters));
60
 	}
60
 	}
61
 
61
 

+ 6
- 7
Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedStruct.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.CompilingPackage;
11
 import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
12
 import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
12
 import org.openzen.zenscript.codemodel.definition.StructDefinition;
13
 import org.openzen.zenscript.codemodel.definition.StructDefinition;
13
-import org.openzen.zenscript.codemodel.definition.ZSPackage;
14
 import org.openzen.zenscript.lexer.ZSTokenParser;
14
 import org.openzen.zenscript.lexer.ZSTokenParser;
15
 import org.openzen.zenscript.lexer.ZSTokenType;
15
 import org.openzen.zenscript.lexer.ZSTokenType;
16
-import org.openzen.zenscript.codemodel.scope.BaseScope;
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
 
18
 
22
  * @author Hoofdgebruiker
21
  * @author Hoofdgebruiker
23
  */
22
  */
24
 public class ParsedStruct extends BaseParsedDefinition {
23
 public class ParsedStruct extends BaseParsedDefinition {
25
-	public static ParsedStruct parseStruct(ZSPackage pkg, CodePosition position, int modifiers, ParsedAnnotation[] annotations, ZSTokenParser tokens, HighLevelDefinition outerDefinition) {
24
+	public static ParsedStruct parseStruct(CompilingPackage pkg, CodePosition position, int modifiers, ParsedAnnotation[] annotations, ZSTokenParser tokens, HighLevelDefinition outerDefinition) {
26
 		String name = tokens.required(ZSTokenType.T_IDENTIFIER, "identifier expected").content;
25
 		String name = tokens.required(ZSTokenType.T_IDENTIFIER, "identifier expected").content;
27
 		List<ParsedTypeParameter> parameters = ParsedTypeParameter.parseAll(tokens);
26
 		List<ParsedTypeParameter> parameters = ParsedTypeParameter.parseAll(tokens);
28
 		
27
 		
30
 		
29
 		
31
 		ParsedStruct result = new ParsedStruct(pkg, position, modifiers, annotations, name, parameters, outerDefinition);
30
 		ParsedStruct result = new ParsedStruct(pkg, position, modifiers, annotations, name, parameters, outerDefinition);
32
 		while (tokens.optional(ZSTokenType.T_ACLOSE) == null) {
31
 		while (tokens.optional(ZSTokenType.T_ACLOSE) == null) {
33
-			result.addMember(ParsedDefinitionMember.parse(tokens, result.compiled, null));
32
+			result.addMember(ParsedDefinitionMember.parse(tokens, result, null));
34
 		}
33
 		}
35
 		return result;
34
 		return result;
36
 	}
35
 	}
39
 	
38
 	
40
 	private final StructDefinition compiled;
39
 	private final StructDefinition compiled;
41
 	
40
 	
42
-	public ParsedStruct(ZSPackage pkg, CodePosition position, int modifiers, ParsedAnnotation[] annotations, String name, List<ParsedTypeParameter> genericParameters, HighLevelDefinition outerDefinition) {
43
-		super(position, modifiers, annotations);
41
+	public ParsedStruct(CompilingPackage pkg, CodePosition position, int modifiers, ParsedAnnotation[] annotations, String name, List<ParsedTypeParameter> genericParameters, HighLevelDefinition outerDefinition) {
42
+		super(position, modifiers, pkg, annotations);
44
 		
43
 		
45
 		this.parameters = genericParameters;
44
 		this.parameters = genericParameters;
46
 		
45
 		
47
-		compiled = new StructDefinition(position, pkg, name, modifiers, outerDefinition);
46
+		compiled = new StructDefinition(position, pkg.getPackage(), name, modifiers, outerDefinition);
48
 		compiled.setTypeParameters(ParsedTypeParameter.getCompiled(genericParameters));
47
 		compiled.setTypeParameters(ParsedTypeParameter.getCompiled(genericParameters));
49
 	}
48
 	}
50
 
49
 

+ 8
- 7
Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedVariant.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.CompilingPackage;
12
 import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
13
 import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
13
 import org.openzen.zenscript.codemodel.definition.VariantDefinition;
14
 import org.openzen.zenscript.codemodel.definition.VariantDefinition;
14
-import org.openzen.zenscript.codemodel.definition.ZSPackage;
15
 import org.openzen.zenscript.lexer.ZSTokenParser;
15
 import org.openzen.zenscript.lexer.ZSTokenParser;
16
 import org.openzen.zenscript.lexer.ZSTokenType;
16
 import org.openzen.zenscript.lexer.ZSTokenType;
17
 import org.openzen.zenscript.parser.ParsedAnnotation;
17
 import org.openzen.zenscript.parser.ParsedAnnotation;
23
  * @author Hoofdgebruiker
23
  * @author Hoofdgebruiker
24
  */
24
  */
25
 public class ParsedVariant extends BaseParsedDefinition {
25
 public class ParsedVariant extends BaseParsedDefinition {
26
-	public static ParsedVariant parseVariant(ZSPackage pkg, CodePosition position, int modifiers, ParsedAnnotation[] annotations, ZSTokenParser tokens, HighLevelDefinition outerDefinition) {
26
+	public static ParsedVariant parseVariant(CompilingPackage pkg, CodePosition position, int modifiers, ParsedAnnotation[] annotations, ZSTokenParser tokens, HighLevelDefinition outerDefinition) {
27
 		String name = tokens.required(ZSTokenType.T_IDENTIFIER, "identifier expected").content;
27
 		String name = tokens.required(ZSTokenType.T_IDENTIFIER, "identifier expected").content;
28
 		List<ParsedTypeParameter> typeParameters = ParsedTypeParameter.parseAll(tokens);
28
 		List<ParsedTypeParameter> typeParameters = ParsedTypeParameter.parseAll(tokens);
29
 		tokens.required(ZSTokenType.T_AOPEN, "{ expected");
29
 		tokens.required(ZSTokenType.T_AOPEN, "{ expected");
30
 		
30
 		
31
 		ParsedVariant result = new ParsedVariant(pkg, position, modifiers, annotations, name, typeParameters, outerDefinition);
31
 		ParsedVariant result = new ParsedVariant(pkg, position, modifiers, annotations, name, typeParameters, outerDefinition);
32
 		
32
 		
33
+		int ordinal = 0;
33
 		while (!tokens.isNext(ZSTokenType.T_ACLOSE) && !tokens.isNext(ZSTokenType.T_SEMICOLON)) {
34
 		while (!tokens.isNext(ZSTokenType.T_ACLOSE) && !tokens.isNext(ZSTokenType.T_SEMICOLON)) {
34
 			String optionName = tokens.required(ZSTokenType.T_IDENTIFIER, "identifier expected").content;
35
 			String optionName = tokens.required(ZSTokenType.T_IDENTIFIER, "identifier expected").content;
35
 			List<IParsedType> types = new ArrayList<>();
36
 			List<IParsedType> types = new ArrayList<>();
40
 				}
41
 				}
41
 				tokens.required(ZSTokenType.T_BRCLOSE, ") expected");
42
 				tokens.required(ZSTokenType.T_BRCLOSE, ") expected");
42
 			}
43
 			}
43
-			result.addVariant(new ParsedVariantOption(optionName, types));
44
+			result.addVariant(new ParsedVariantOption(optionName, ordinal++, types));
44
 			if (tokens.optional(ZSTokenType.T_COMMA) == null)
45
 			if (tokens.optional(ZSTokenType.T_COMMA) == null)
45
 				break;
46
 				break;
46
 		}
47
 		}
47
 		
48
 		
48
 		if (tokens.optional(ZSTokenType.T_SEMICOLON) != null) {
49
 		if (tokens.optional(ZSTokenType.T_SEMICOLON) != null) {
49
 			while (tokens.optional(ZSTokenType.T_ACLOSE) == null) {
50
 			while (tokens.optional(ZSTokenType.T_ACLOSE) == null) {
50
-				result.addMember(ParsedDefinitionMember.parse(tokens, result.compiled, null));
51
+				result.addMember(ParsedDefinitionMember.parse(tokens, result, null));
51
 			}
52
 			}
52
 		} else {
53
 		} else {
53
 			tokens.required(ZSTokenType.T_ACLOSE, "} expected");
54
 			tokens.required(ZSTokenType.T_ACLOSE, "} expected");
60
 	
61
 	
61
 	private final VariantDefinition compiled;
62
 	private final VariantDefinition compiled;
62
 	
63
 	
63
-	public ParsedVariant(ZSPackage pkg, CodePosition position, int modifiers, ParsedAnnotation[] annotations, String name, List<ParsedTypeParameter> typeParameters, HighLevelDefinition outerDefinition) {
64
-		super(position, modifiers, annotations);
64
+	public ParsedVariant(CompilingPackage pkg, CodePosition position, int modifiers, ParsedAnnotation[] annotations, String name, List<ParsedTypeParameter> typeParameters, HighLevelDefinition outerDefinition) {
65
+		super(position, modifiers, pkg, annotations);
65
 		
66
 		
66
 		this.typeParameters = typeParameters;
67
 		this.typeParameters = typeParameters;
67
-		compiled = new VariantDefinition(position, pkg, name, modifiers, outerDefinition);
68
+		compiled = new VariantDefinition(position, pkg.getPackage(), name, modifiers, outerDefinition);
68
 		compiled.setTypeParameters(ParsedTypeParameter.getCompiled(typeParameters));
69
 		compiled.setTypeParameters(ParsedTypeParameter.getCompiled(typeParameters));
69
 	}
70
 	}
70
 	
71
 	

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

9
 import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
9
 import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
10
 import org.openzen.zenscript.codemodel.definition.VariantDefinition;
10
 import org.openzen.zenscript.codemodel.definition.VariantDefinition;
11
 import org.openzen.zenscript.codemodel.type.ITypeID;
11
 import org.openzen.zenscript.codemodel.type.ITypeID;
12
-import org.openzen.zenscript.codemodel.scope.BaseScope;
13
 import org.openzen.zenscript.parser.type.IParsedType;
12
 import org.openzen.zenscript.parser.type.IParsedType;
14
 
13
 
15
 /**
14
 /**
18
  */
17
  */
19
 public class ParsedVariantOption {
18
 public class ParsedVariantOption {
20
 	public final String name;
19
 	public final String name;
20
+	public final int ordinal;
21
 	public final List<IParsedType> types;
21
 	public final List<IParsedType> types;
22
 	
22
 	
23
-	public ParsedVariantOption(String name, List<IParsedType> types) {
23
+	public ParsedVariantOption(String name, int ordinal, List<IParsedType> types) {
24
 		this.name = name;
24
 		this.name = name;
25
+		this.ordinal = ordinal;
25
 		this.types = types;
26
 		this.types = types;
26
 	}
27
 	}
27
 	
28
 	
30
 		for (int i = 0; i < cTypes.length; i++)
31
 		for (int i = 0; i < cTypes.length; i++)
31
 			cTypes[i] = types.get(i).compile(context);
32
 			cTypes[i] = types.get(i).compile(context);
32
 		
33
 		
33
-		return new VariantDefinition.Option(name, cTypes);
34
+		return new VariantDefinition.Option(name, ordinal, cTypes);
34
 	}
35
 	}
35
 }
36
 }

+ 2
- 3
Parser/src/main/java/org/openzen/zenscript/parser/expression/ParsedExpressionCall.java View File

21
 import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
21
 import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
22
 import org.openzen.zenscript.codemodel.member.ref.VariantOptionRef;
22
 import org.openzen.zenscript.codemodel.member.ref.VariantOptionRef;
23
 import org.openzen.zenscript.codemodel.partial.IPartialExpression;
23
 import org.openzen.zenscript.codemodel.partial.IPartialExpression;
24
-import org.openzen.zenscript.codemodel.statement.VarStatement;
25
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
24
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
26
 import org.openzen.zenscript.codemodel.type.ITypeID;
25
 import org.openzen.zenscript.codemodel.type.ITypeID;
27
 import org.openzen.zenscript.codemodel.type.member.DefinitionMemberGroup;
26
 import org.openzen.zenscript.codemodel.type.member.DefinitionMemberGroup;
103
 			if (option == null)
102
 			if (option == null)
104
 				throw new CompileException(position, CompileExceptionCode.NO_SUCH_MEMBER, "Variant option does not exist: " + name);
103
 				throw new CompileException(position, CompileExceptionCode.NO_SUCH_MEMBER, "Variant option does not exist: " + name);
105
 			
104
 			
106
-			VarStatement[] values = new VarStatement[arguments.arguments.size()];
105
+			String[] values = new String[arguments.arguments.size()];
107
 			for (int i = 0; i < values.length; i++) {
106
 			for (int i = 0; i < values.length; i++) {
108
 				ParsedExpression argument = arguments.arguments.get(i);
107
 				ParsedExpression argument = arguments.arguments.get(i);
109
 				ParsedFunctionParameter lambdaHeader = argument.toLambdaParameter();
108
 				ParsedFunctionParameter lambdaHeader = argument.toLambdaParameter();
110
-				values[i] = new VarStatement(argument.position, lambdaHeader.name, option.types[i], null, true);
109
+				values[i] = lambdaHeader.name;
111
 			}
110
 			}
112
 			
111
 			
113
 			return new VariantOptionSwitchValue(option, values);
112
 			return new VariantOptionSwitchValue(option, values);

+ 1
- 1
Parser/src/main/java/org/openzen/zenscript/parser/expression/ParsedExpressionVariable.java View File

97
 			if (option.types.length > 0)
97
 			if (option.types.length > 0)
98
 				throw new CompileException(position, CompileExceptionCode.MISSING_VARIANT_CASEPARAMETERS, "Variant case is missing parameters");
98
 				throw new CompileException(position, CompileExceptionCode.MISSING_VARIANT_CASEPARAMETERS, "Variant case is missing parameters");
99
 			
99
 			
100
-			return new VariantOptionSwitchValue(option, new VarStatement[0]);
100
+			return new VariantOptionSwitchValue(option, new String[0]);
101
 		} else {
101
 		} else {
102
 			throw new CompileException(position, CompileExceptionCode.INVALID_SWITCH_CASE, "Invalid switch case");
102
 			throw new CompileException(position, CompileExceptionCode.INVALID_SWITCH_CASE, "Invalid switch case");
103
 		}
103
 		}

+ 2
- 4
Parser/src/main/java/org/openzen/zenscript/parser/expression/ParsedMatchExpression.java View File

14
 import org.openzen.zenscript.codemodel.expression.switchvalue.SwitchValue;
14
 import org.openzen.zenscript.codemodel.expression.switchvalue.SwitchValue;
15
 import org.openzen.zenscript.codemodel.expression.switchvalue.VariantOptionSwitchValue;
15
 import org.openzen.zenscript.codemodel.expression.switchvalue.VariantOptionSwitchValue;
16
 import org.openzen.zenscript.codemodel.partial.IPartialExpression;
16
 import org.openzen.zenscript.codemodel.partial.IPartialExpression;
17
-import org.openzen.zenscript.codemodel.statement.VarStatement;
18
 import org.openzen.zenscript.codemodel.type.ITypeID;
17
 import org.openzen.zenscript.codemodel.type.ITypeID;
19
 import org.openzen.zenscript.codemodel.scope.ExpressionScope;
18
 import org.openzen.zenscript.codemodel.scope.ExpressionScope;
20
-import org.openzen.zenscript.parser.PrecompilationState;
21
 
19
 
22
 /**
20
 /**
23
  *
21
  *
80
 			if (switchValue instanceof VariantOptionSwitchValue) {
78
 			if (switchValue instanceof VariantOptionSwitchValue) {
81
 				VariantOptionSwitchValue variantSwitchValue = (VariantOptionSwitchValue)switchValue;
79
 				VariantOptionSwitchValue variantSwitchValue = (VariantOptionSwitchValue)switchValue;
82
 				
80
 				
83
-				for (VarStatement var : variantSwitchValue.parameters)
84
-					innerScope.addInnerVariable(var);
81
+				for (int i = 0; i < variantSwitchValue.parameters.length; i++)
82
+					innerScope.addMatchingVariantOption(variantSwitchValue.parameters[i], i, variantSwitchValue);
85
 			}
83
 			}
86
 			
84
 			
87
 			Expression value = this.value.compile(innerScope).eval();
85
 			Expression value = this.value.compile(innerScope).eval();

+ 19
- 20
Parser/src/main/java/org/openzen/zenscript/parser/member/ParsedDefinitionMember.java View File

15
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
15
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
16
 import org.openzen.zenscript.codemodel.Modifiers;
16
 import org.openzen.zenscript.codemodel.Modifiers;
17
 import org.openzen.zenscript.codemodel.OperatorType;
17
 import org.openzen.zenscript.codemodel.OperatorType;
18
-import org.openzen.zenscript.codemodel.context.CompilingType;
19
 import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
18
 import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
20
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
19
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
21
 import org.openzen.zenscript.lexer.ZSToken;
20
 import org.openzen.zenscript.lexer.ZSToken;
35
  * @author Hoofdgebruiker
34
  * @author Hoofdgebruiker
36
  */
35
  */
37
 public abstract class ParsedDefinitionMember {
36
 public abstract class ParsedDefinitionMember {
38
-	public static ParsedDefinitionMember parse(ZSTokenParser tokens, HighLevelDefinition forDefinition, ParsedImplementation forImplementation) {
37
+	public static ParsedDefinitionMember parse(ZSTokenParser tokens, ParsedDefinition forDefinition, ParsedImplementation forImplementation) {
39
 		CodePosition start = tokens.getPosition();
38
 		CodePosition start = tokens.getPosition();
40
 		ParsedAnnotation[] annotations = ParsedAnnotation.parseAnnotations(tokens);
39
 		ParsedAnnotation[] annotations = ParsedAnnotation.parseAnnotations(tokens);
41
 		int modifiers = 0;
40
 		int modifiers = 0;
127
 					initializer = ParsedExpression.parse(tokens);
126
 					initializer = ParsedExpression.parse(tokens);
128
 				}
127
 				}
129
 				tokens.required(ZSTokenType.T_SEMICOLON, "; expected");
128
 				tokens.required(ZSTokenType.T_SEMICOLON, "; expected");
130
-				return new ParsedField(start, forDefinition, modifiers, annotations, name, type, initializer, t.type == ZSTokenType.K_VAL, autoGetter, autoSetter);
129
+				return new ParsedField(start, forDefinition.getCompiled(), modifiers, annotations, name, type, initializer, t.type == ZSTokenType.K_VAL, autoGetter, autoSetter);
131
 			}
130
 			}
132
 			case K_THIS: {
131
 			case K_THIS: {
133
 				tokens.next();
132
 				tokens.next();
136
 				if (body == null)
135
 				if (body == null)
137
 					throw new CompileException(start, CompileExceptionCode.METHOD_BODY_REQUIRED, "Function body is required for constructors");
136
 					throw new CompileException(start, CompileExceptionCode.METHOD_BODY_REQUIRED, "Function body is required for constructors");
138
 				
137
 				
139
-				return new ParsedConstructor(start, forDefinition, forImplementation, modifiers, annotations, header, body);
138
+				return new ParsedConstructor(start, forDefinition.getCompiled(), forImplementation, modifiers, annotations, header, body);
140
 			}
139
 			}
141
 			case T_IDENTIFIER: {
140
 			case T_IDENTIFIER: {
142
 				String name = tokens.next().content;
141
 				String name = tokens.next().content;
148
 					tokens.required(ZSTokenType.T_ASSIGN, "= expected");
147
 					tokens.required(ZSTokenType.T_ASSIGN, "= expected");
149
 					ParsedExpression value = ParsedExpression.parse(tokens);
148
 					ParsedExpression value = ParsedExpression.parse(tokens);
150
 					tokens.required(ZSTokenType.T_SEMICOLON, "; expected");
149
 					tokens.required(ZSTokenType.T_SEMICOLON, "; expected");
151
-					return new ParsedConst(start, forDefinition, modifiers & ~Modifiers.CONST, annotations, name, type, value);
150
+					return new ParsedConst(start, forDefinition.getCompiled(), modifiers & ~Modifiers.CONST, annotations, name, type, value);
152
 				}
151
 				}
153
 				
152
 				
154
 				ParsedFunctionHeader header = ParsedFunctionHeader.parse(tokens);
153
 				ParsedFunctionHeader header = ParsedFunctionHeader.parse(tokens);
155
 				ParsedFunctionBody body = ParsedStatement.parseFunctionBody(tokens);
154
 				ParsedFunctionBody body = ParsedStatement.parseFunctionBody(tokens);
156
-				return new ParsedMethod(start, forDefinition, forImplementation, modifiers, annotations, name, header, body);
155
+				return new ParsedMethod(start, forDefinition.getCompiled(), forImplementation, modifiers, annotations, name, header, body);
157
 			}
156
 			}
158
 			case K_SET: {
157
 			case K_SET: {
159
 				tokens.next();
158
 				tokens.next();
163
 					type = IParsedType.parse(tokens);
162
 					type = IParsedType.parse(tokens);
164
 				}
163
 				}
165
 				ParsedFunctionBody body = ParsedStatement.parseFunctionBody(tokens);
164
 				ParsedFunctionBody body = ParsedStatement.parseFunctionBody(tokens);
166
-				return new ParsedSetter(start, forDefinition, forImplementation, modifiers, annotations, name, type, body);
165
+				return new ParsedSetter(start, forDefinition.getCompiled(), forImplementation, modifiers, annotations, name, type, body);
167
 			}
166
 			}
168
 			case K_GET: {
167
 			case K_GET: {
169
 				tokens.next();
168
 				tokens.next();
173
 					type = IParsedType.parse(tokens);
172
 					type = IParsedType.parse(tokens);
174
 				}
173
 				}
175
 				ParsedFunctionBody statements = ParsedStatement.parseFunctionBody(tokens);
174
 				ParsedFunctionBody statements = ParsedStatement.parseFunctionBody(tokens);
176
-				return new ParsedGetter(start, forDefinition, forImplementation, modifiers, annotations, name, type, statements);
175
+				return new ParsedGetter(start, forDefinition.getCompiled(), forImplementation, modifiers, annotations, name, type, statements);
177
 			}
176
 			}
178
 			case K_IMPLEMENTS: {
177
 			case K_IMPLEMENTS: {
179
 				tokens.next();
178
 				tokens.next();
180
 				IParsedType type = IParsedType.parse(tokens);
179
 				IParsedType type = IParsedType.parse(tokens);
181
-				ParsedImplementation implementation = new ParsedImplementation(start, forDefinition, modifiers, annotations, type);
180
+				ParsedImplementation implementation = new ParsedImplementation(start, forDefinition.getCompiled(), modifiers, annotations, type);
182
 				if (tokens.optional(ZSTokenType.T_SEMICOLON) == null) {
181
 				if (tokens.optional(ZSTokenType.T_SEMICOLON) == null) {
183
 					tokens.required(ZSTokenType.T_AOPEN, "{ expected");
182
 					tokens.required(ZSTokenType.T_AOPEN, "{ expected");
184
 					while (tokens.optional(ZSTokenType.T_ACLOSE) == null) {
183
 					while (tokens.optional(ZSTokenType.T_ACLOSE) == null) {
190
 			case T_BROPEN: {
189
 			case T_BROPEN: {
191
 				ParsedFunctionHeader header = ParsedFunctionHeader.parse(tokens);
190
 				ParsedFunctionHeader header = ParsedFunctionHeader.parse(tokens);
192
 				ParsedFunctionBody body = ParsedStatement.parseFunctionBody(tokens);
191
 				ParsedFunctionBody body = ParsedStatement.parseFunctionBody(tokens);
193
-				return new ParsedCaller(start, forDefinition, forImplementation, modifiers, annotations, header, body);
192
+				return new ParsedCaller(start, forDefinition.getCompiled(), forImplementation, modifiers, annotations, header, body);
194
 			}
193
 			}
195
 			case T_SQOPEN: {
194
 			case T_SQOPEN: {
196
 				tokens.next();
195
 				tokens.next();
201
 				}
200
 				}
202
 				ParsedFunctionHeader header = ParsedFunctionHeader.parse(tokens);
201
 				ParsedFunctionHeader header = ParsedFunctionHeader.parse(tokens);
203
 				ParsedFunctionBody body = ParsedStatement.parseFunctionBody(tokens);
202
 				ParsedFunctionBody body = ParsedStatement.parseFunctionBody(tokens);
204
-				return new ParsedOperator(start, forDefinition, forImplementation, modifiers, annotations, operator, header, body);
203
+				return new ParsedOperator(start, forDefinition.getCompiled(), forImplementation, modifiers, annotations, operator, header, body);
205
 			}
204
 			}
206
 			case T_CAT:
205
 			case T_CAT:
207
 				tokens.pushMark();
206
 				tokens.pushMark();
211
 					
210
 					
212
 					// destructor
211
 					// destructor
213
 					ParsedFunctionBody body = ParsedStatement.parseFunctionBody(tokens);
212
 					ParsedFunctionBody body = ParsedStatement.parseFunctionBody(tokens);
214
-					return new ParsedDestructor(start, forDefinition, forImplementation, modifiers, annotations, body);
213
+					return new ParsedDestructor(start, forDefinition.getCompiled(), forImplementation, modifiers, annotations, body);
215
 				}
214
 				}
216
 				tokens.reset();
215
 				tokens.reset();
217
 				// else it is a ~ operator, continue...
216
 				// else it is a ~ operator, continue...
245
 				ZSToken token = tokens.next();
244
 				ZSToken token = tokens.next();
246
 				ParsedFunctionHeader header = ParsedFunctionHeader.parse(tokens);
245
 				ParsedFunctionHeader header = ParsedFunctionHeader.parse(tokens);
247
 				ParsedFunctionBody body = ParsedStatement.parseFunctionBody(tokens);
246
 				ParsedFunctionBody body = ParsedStatement.parseFunctionBody(tokens);
248
-				return new ParsedOperator(start, forDefinition, forImplementation, modifiers, annotations, getOperator(token.type), header, body);
247
+				return new ParsedOperator(start, forDefinition.getCompiled(), forImplementation, modifiers, annotations, getOperator(token.type), header, body);
249
 			}
248
 			}
250
 			case T_EQUAL2: {
249
 			case T_EQUAL2: {
251
 				tokens.next();
250
 				tokens.next();
252
 				ParsedFunctionHeader header = ParsedFunctionHeader.parse(tokens);
251
 				ParsedFunctionHeader header = ParsedFunctionHeader.parse(tokens);
253
 				ParsedFunctionBody body = ParsedStatement.parseFunctionBody(tokens);
252
 				ParsedFunctionBody body = ParsedStatement.parseFunctionBody(tokens);
254
-				return new ParsedOperator(start, forDefinition, forImplementation, modifiers, annotations, OperatorType.EQUALS, header, body);
253
+				return new ParsedOperator(start, forDefinition.getCompiled(), forImplementation, modifiers, annotations, OperatorType.EQUALS, header, body);
255
 			}
254
 			}
256
 			case K_AS: {
255
 			case K_AS: {
257
 				tokens.next();
256
 				tokens.next();
258
 				IParsedType type = IParsedType.parse(tokens);
257
 				IParsedType type = IParsedType.parse(tokens);
259
 				ParsedFunctionBody body = ParsedStatement.parseFunctionBody(tokens);
258
 				ParsedFunctionBody body = ParsedStatement.parseFunctionBody(tokens);
260
-				return new ParsedCaster(start, forDefinition, forImplementation, modifiers, annotations, type, body);
259
+				return new ParsedCaster(start, forDefinition.getCompiled(), forImplementation, modifiers, annotations, type, body);
261
 			}
260
 			}
262
 			case K_IN: {
261
 			case K_IN: {
263
 				tokens.next();
262
 				tokens.next();
264
 				ParsedFunctionHeader header = ParsedFunctionHeader.parse(tokens);
263
 				ParsedFunctionHeader header = ParsedFunctionHeader.parse(tokens);
265
 				ParsedFunctionBody body = ParsedStatement.parseFunctionBody(tokens);
264
 				ParsedFunctionBody body = ParsedStatement.parseFunctionBody(tokens);
266
-				return new ParsedOperator(start, forDefinition, forImplementation, modifiers, annotations, OperatorType.CONTAINS, header, body);
265
+				return new ParsedOperator(start, forDefinition.getCompiled(), forImplementation, modifiers, annotations, OperatorType.CONTAINS, header, body);
267
 			}
266
 			}
268
 			case K_CLASS:
267
 			case K_CLASS:
269
 			case K_INTERFACE:
268
 			case K_INTERFACE:
270
 			case K_ALIAS:
269
 			case K_ALIAS:
271
 			case K_STRUCT:
270
 			case K_STRUCT:
272
 			case K_ENUM:
271
 			case K_ENUM:
273
-				return new ParsedInnerDefinition(forDefinition, ParsedDefinition.parse(forDefinition.pkg, start, modifiers, annotations, tokens, forDefinition));
272
+				return new ParsedInnerDefinition(forDefinition.getCompiled(), ParsedDefinition.parse(forDefinition.pkg, start, modifiers, annotations, tokens, forDefinition.getCompiled()));
274
 			case K_FOR: {
273
 			case K_FOR: {
275
 				tokens.next();
274
 				tokens.next();
276
 				ParsedFunctionHeader header = ParsedFunctionHeader.parse(tokens);
275
 				ParsedFunctionHeader header = ParsedFunctionHeader.parse(tokens);
277
 				ParsedFunctionBody body = ParsedStatement.parseFunctionBody(tokens);
276
 				ParsedFunctionBody body = ParsedStatement.parseFunctionBody(tokens);
278
-				return new ParsedIterator(start, forDefinition, modifiers, annotations, header, body);
277
+				return new ParsedIterator(start, forDefinition.getCompiled(), modifiers, annotations, header, body);
279
 			}
278
 			}
280
 			default:
279
 			default:
281
 				if (modifiers == Modifiers.STATIC && tokens.peek().type == ZSTokenType.T_AOPEN) {
280
 				if (modifiers == Modifiers.STATIC && tokens.peek().type == ZSTokenType.T_AOPEN) {
282
 					ParsedStatementBlock body = ParsedStatementBlock.parseBlock(tokens, annotations, true);
281
 					ParsedStatementBlock body = ParsedStatementBlock.parseBlock(tokens, annotations, true);
283
-					return new ParsedStaticInitializer(forDefinition, tokens.getPosition(), annotations, body);
282
+					return new ParsedStaticInitializer(forDefinition.getCompiled(), tokens.getPosition(), annotations, body);
284
 				}
283
 				}
285
 				throw new CompileException(tokens.getPosition(), CompileExceptionCode.UNEXPECTED_TOKEN, "Unexpected token: " + tokens.peek().content);
284
 				throw new CompileException(tokens.getPosition(), CompileExceptionCode.UNEXPECTED_TOKEN, "Unexpected token: " + tokens.peek().content);
286
 		}
285
 		}
331
 	
330
 	
332
 	public abstract void linkTypes(TypeResolutionContext context);
331
 	public abstract void linkTypes(TypeResolutionContext context);
333
 	
332
 	
334
-	public void registerInnerTypes(Map<String, CompilingType> innerTypes) {}
333
+	public void registerInnerTypes(Map<String, ParsedDefinition> innerTypes) {}
335
 	
334
 	
336
 	public abstract IDefinitionMember getCompiled();
335
 	public abstract IDefinitionMember getCompiled();
337
 	
336
 	

+ 2
- 2
Parser/src/main/java/org/openzen/zenscript/parser/member/ParsedInnerDefinition.java View File

7
 
7
 
8
 import java.util.Map;
8
 import java.util.Map;
9
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
9
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
10
-import org.openzen.zenscript.codemodel.context.CompilingType;
10
+import org.openzen.zenscript.codemodel.context.LocalTypeResolutionContext;
11
 import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
11
 import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
12
 import org.openzen.zenscript.codemodel.member.InnerDefinitionMember;
12
 import org.openzen.zenscript.codemodel.member.InnerDefinitionMember;
13
 import org.openzen.zenscript.codemodel.scope.BaseScope;
13
 import org.openzen.zenscript.codemodel.scope.BaseScope;
33
 	}
33
 	}
34
 	
34
 	
35
 	@Override
35
 	@Override
36
-	public void registerInnerTypes(Map<String, CompilingType> inner) {
36
+	public void registerInnerTypes(Map<String, ParsedDefinition> inner) {
37
 		inner.put(innerDefinition.getCompiled().name, innerDefinition);
37
 		inner.put(innerDefinition.getCompiled().name, innerDefinition);
38
 	}
38
 	}
39
 	
39
 	

+ 2
- 3
ScriptingExample/src/main/java/org/openzen/zenscript/scriptingexample/Main.java View File

42
 		File[] inputFiles = Optional.ofNullable(inputDirectory.listFiles((dir, name) -> name.endsWith(".zs"))).orElseGet(() -> new File[0]);
42
 		File[] inputFiles = Optional.ofNullable(inputDirectory.listFiles((dir, name) -> name.endsWith(".zs"))).orElseGet(() -> new File[0]);
43
 		
43
 		
44
 		ZSPackage pkg = new ZSPackage(null, "");
44
 		ZSPackage pkg = new ZSPackage(null, "");
45
-		CompilingPackage compilingPkg = new CompilingPackage();
45
+		CompilingPackage compilingPkg = new CompilingPackage(pkg);
46
 		ParsedFile[] parsedFiles = parse(pkg, compilingPkg, inputFiles);
46
 		ParsedFile[] parsedFiles = parse(pkg, compilingPkg, inputFiles);
47
 		
47
 		
48
 		ZSPackage global = new ZSPackage(null, "");
48
 		ZSPackage global = new ZSPackage(null, "");
62
 	private static ParsedFile[] parse(ZSPackage pkg, CompilingPackage compilingPkg, File[] files) throws IOException {
62
 	private static ParsedFile[] parse(ZSPackage pkg, CompilingPackage compilingPkg, File[] files) throws IOException {
63
 		ParsedFile[] parsedFiles = new ParsedFile[files.length];
63
 		ParsedFile[] parsedFiles = new ParsedFile[files.length];
64
 		for (int i = 0; i < files.length; i++) {
64
 		for (int i = 0; i < files.length; i++) {
65
-			parsedFiles[i] = ParsedFile.parse(pkg, compilingPkg, new TestBracketParser(), files[i]);
65
+			parsedFiles[i] = ParsedFile.parse(compilingPkg, new TestBracketParser(), files[i]);
66
 		}
66
 		}
67
 		return parsedFiles;
67
 		return parsedFiles;
68
 	}
68
 	}
110
 		SemanticModule result = Module.compileSyntaxToSemantic(
110
 		SemanticModule result = Module.compileSyntaxToSemantic(
111
 				"scripts",
111
 				"scripts",
112
 				new String[0],
112
 				new String[0],
113
-				pkg,
114
 				compiling,
113
 				compiling,
115
 				files,
114
 				files,
116
 				space,
115
 				space,

+ 18
- 0
Shared/src/main/java/listeners/DummyListenerHandle.java View File

1
+package listeners;
2
+
3
+
4
+public final class DummyListenerHandle<T> implements ListenerHandle<T>, AutoCloseable {
5
+    public final T listener;
6
+    
7
+    public DummyListenerHandle(T listener) {
8
+        this.listener = listener;
9
+    }
10
+    
11
+    @Override
12
+    public void close() {
13
+    }
14
+    
15
+    public T getListener() {
16
+        return listener;
17
+    }
18
+}

+ 9
- 0
Shared/src/main/java/listeners/ListenerHandle.java View File

1
+package listeners;
2
+
3
+
4
+public interface ListenerHandle<T> extends AutoCloseable {
5
+    @Override
6
+    public void close();
7
+    
8
+    T getListener();
9
+}

+ 85
- 0
Shared/src/main/java/listeners/ListenerList.java View File

1
+package listeners;
2
+
3
+import listeners.ListenerList;
4
+import zsynthetic.FunctionTToVoid;
5
+
6
+public final class ListenerList<T> {
7
+    public static final int PRIORITY_HIGH = 100;
8
+    public static final int PRIORITY_DEFAULT = 0;
9
+    public static final int PRIORITY_LOW = -100;
10
+    private ListenerList<T>.EventListenerNode first = null;
11
+    private ListenerList<T>.EventListenerNode last = null;
12
+    
13
+    public ListenerHandle<T> add(T listener) {
14
+        return this.add(listener, ListenerList.PRIORITY_DEFAULT);
15
+    }
16
+    
17
+    public ListenerHandle<T> add(T listener, int priority) {
18
+        ListenerList<T>.EventListenerNode node = new ListenerList<T>.EventListenerNode(listener, priority);
19
+        if (first == null) {
20
+            this.first = this.last = node;
21
+        }
22
+        else {
23
+            ListenerList<T>.EventListenerNode previousNode = last;
24
+            while (previousNode != null && priority > previousNode.priority)
25
+                previousNode = previousNode.prev;
26
+            if (previousNode == null) {
27
+                node.next = first;
28
+                first.prev = previousNode;
29
+                this.first = node;
30
+            }
31
+            else {
32
+                if (previousNode.next == null)
33
+                    this.last = node;
34
+                else
35
+                    previousNode.next.prev = node;
36
+                previousNode.next = node;
37
+                node.prev = previousNode;
38
+            }
39
+        }
40
+        return node;
41
+    }
42
+    
43
+    public void clear() {
44
+        this.first = this.last = null;
45
+    }
46
+    
47
+    public void accept(FunctionTToVoid<T> consumer) {
48
+        ListenerList<T>.EventListenerNode current = first;
49
+        while (current != null) {
50
+            consumer.invoke(current.getListener());
51
+            current = current.next;
52
+        }
53
+    }
54
+    
55
+    public boolean getIsEmpty() {
56
+        return first == null;
57
+    }
58
+    private final class EventListenerNode implements ListenerHandle<T>, AutoCloseable {
59
+        public final T listener;
60
+        private final int priority;
61
+        private ListenerList<T>.EventListenerNode next = null;
62
+        private ListenerList<T>.EventListenerNode prev = null;
63
+        
64
+        public EventListenerNode(T listener, int priority) {
65
+            this.listener = listener;
66
+            this.priority = priority;
67
+        }
68
+        
69
+        @Override
70
+        public void close() {
71
+            if (prev == null)
72
+                ListenerList.this.first = next;
73
+            else
74
+                prev.next = next;
75
+            if (next == null)
76
+                ListenerList.this.last = prev;
77
+            else
78
+                next.prev = prev;
79
+        }
80
+        
81
+        public T getListener() {
82
+            return listener;
83
+        }
84
+    }
85
+}

+ 25
- 0
Shared/src/main/java/live/ImmutableLiveBool.java View File

1
+package live;
2
+
3
+import listeners.DummyListenerHandle;
4
+import listeners.ListenerHandle;
5
+import live.ImmutableLiveBool;
6
+import zsynthetic.FunctionBoolBoolToVoid;
7
+
8
+public final class ImmutableLiveBool implements LiveBool {
9
+    public static final ImmutableLiveBool TRUE = new ImmutableLiveBool(true);
10
+    public static final ImmutableLiveBool FALSE = new ImmutableLiveBool(false);
11
+    public final boolean value;
12
+    
13
+    private ImmutableLiveBool(boolean value) {
14
+        this.value = value;
15
+    }
16
+    
17
+    @Override
18
+    public ListenerHandle<FunctionBoolBoolToVoid> addListener(FunctionBoolBoolToVoid listener) {
19
+        return new DummyListenerHandle<FunctionBoolBoolToVoid>(listener);
20
+    }
21
+    
22
+    public boolean getValue() {
23
+        return value;
24
+    }
25
+}

+ 22
- 0
Shared/src/main/java/live/ImmutableLiveObject.java View File

1
+package live;
2
+
3
+import listeners.DummyListenerHandle;
4
+import listeners.ListenerHandle;
5
+import zsynthetic.FunctionTTToVoid;
6
+
7
+public final class ImmutableLiveObject<T> implements LiveObject<T> {
8
+    public final T value;
9
+    
10
+    public ImmutableLiveObject(T value) {
11
+        this.value = value;
12
+    }
13
+    
14
+    @Override
15
+    public ListenerHandle<FunctionTTToVoid<T>> addListener(FunctionTTToVoid<T> listener) {
16
+        return new DummyListenerHandle<FunctionTTToVoid<T>>(listener);
17
+    }
18
+    
19
+    public T getValue() {
20
+        return value;
21
+    }
22
+}

+ 22
- 0
Shared/src/main/java/live/ImmutableLiveString.java View File

1
+package live;
2
+
3
+import listeners.DummyListenerHandle;
4
+import listeners.ListenerHandle;
5
+import zsynthetic.FunctionStringStringToVoid;
6
+
7
+public final class ImmutableLiveString implements LiveString {
8
+    public final String value;
9
+    
10
+    public ImmutableLiveString(String value) {
11
+        this.value = value;
12
+    }
13
+    
14
+    @Override
15
+    public ListenerHandle<FunctionStringStringToVoid> addListener(FunctionStringStringToVoid listener) {
16
+        return new DummyListenerHandle<FunctionStringStringToVoid>(listener);
17
+    }
18
+    
19
+    public String getValue() {
20
+        return value;
21
+    }
22
+}

+ 23
- 0
Shared/src/main/java/live/InverseLiveBool.java View File

1
+package live;
2
+
3
+import listeners.ListenerHandle;
4
+import zsynthetic.FunctionBoolBoolToVoid;
5
+
6
+public final class InverseLiveBool implements LiveBool {
7
+    private final LiveBool source;
8
+    
9
+    public InverseLiveBool(LiveBool source) {
10
+        this.source = source;
11
+    }
12
+    
13
+    @Override
14
+    public boolean getValue() {
15
+        return !source.getValue();
16
+    }
17
+    
18
+    @Override
19
+    public ListenerHandle<FunctionBoolBoolToVoid> addListener(FunctionBoolBoolToVoid listener) {
20
+        return source.addListener((oldVal, newVal) -> 
21
+        listener.invoke(!oldVal, !newVal));
22
+    }
23
+}

+ 88
- 0
Shared/src/main/java/live/LiveArrayList.java View File

1
+package live;
2
+
3
+import java.util.ArrayList;
4
+import java.util.Iterator;
5
+import java.util.List;
6
+import listeners.ListenerHandle;
7
+import listeners.ListenerList;
8
+
9
+final class LiveArrayList<T> implements MutableLiveList<T>, AutoCloseable {
10
+    private final List<T> values = new ArrayList<T>();
11
+    private final ListenerList<LiveList.Listener<T>> listeners = new ListenerList<LiveList.Listener<T>>();
12
+    
13
+    @Override
14
+    public void add(T value) {
15
+        int index = values.size();
16
+        values.add(value);
17
+        listeners.accept(listener -> 
18
+        listener.onInserted(index, value));
19
+    }
20
+    
21
+    @Override
22
+    public void insert(int index, T value) {
23
+        values.add(index, value);
24
+        listeners.accept(listener -> 
25
+        listener.onInserted(index, value));
26
+    }
27
+    
28
+    @Override
29
+    public void setAt(int index, T value) {
30
+        T oldValue = values.get(index);
31
+        values.set(index, value);
32
+        listeners.accept(listener -> 
33
+        listener.onChanged(index, oldValue, value));
34
+    }
35
+    
36
+    @Override
37
+    public void remove(int index) {
38
+        T oldValue = values.remove(index);
39
+        listeners.accept(listener -> 
40
+        listener.onRemoved(index, oldValue));
41
+    }
42
+    
43
+    @Override
44
+    public void remove(T value) {
45
+        int index = this.indexOf(value);
46
+        if (index < 0)
47
+            return;
48
+        this.remove(index);
49
+    }
50
+    
51
+    @Override
52
+    public void clear() {
53
+        int i = this.getLength();
54
+        while (i > 0) {
55
+            i--;
56
+            this.remove(i);
57
+        }
58
+    }
59
+    
60
+    @Override
61
+    public Iterator<T> iterator() {
62
+        return values.iterator();
63
+    }
64
+    
65
+    @Override
66
+    public int indexOf(T value) {
67
+        return values.indexOf(value);
68
+    }
69
+    
70
+    @Override
71
+    public int getLength() {
72
+        return values.size();
73
+    }
74
+    
75
+    @Override
76
+    public T getAt(int index) {
77
+        return values.get(index);
78
+    }
79
+    
80
+    @Override
81
+    public ListenerHandle<LiveList.Listener<T>> addListener(LiveList.Listener<T> listener) {
82
+        return listeners.add(listener);
83
+    }
84
+    
85
+    @Override
86
+    public void close() {
87
+    }
88
+}

+ 10
- 0
Shared/src/main/java/live/LiveBool.java View File

1
+package live;
2
+
3
+import listeners.ListenerHandle;
4
+import zsynthetic.FunctionBoolBoolToVoid;
5
+
6
+public interface LiveBool {
7
+    boolean getValue();
8
+    
9
+    ListenerHandle<FunctionBoolBoolToVoid> addListener(FunctionBoolBoolToVoid listener);
10
+}

+ 12
- 0
Shared/src/main/java/live/LiveInt.java View File

1
+package live;
2
+
3
+import listeners.ListenerHandle;
4
+import zsynthetic.FunctionIntIntToVoid;
5
+
6
+public interface LiveInt {
7
+    int getValue();
8
+    
9
+    void setValue(int value);
10
+    
11
+    ListenerHandle<FunctionIntIntToVoid> addListener(FunctionIntIntToVoid listener);
12
+}

+ 23
- 0
Shared/src/main/java/live/LiveList.java View File

1
+package live;
2
+
3
+import listeners.ListenerHandle;
4
+
5
+public interface LiveList<T> extends AutoCloseable, Iterable<T> {
6
+    @Override
7
+    public void close();
8
+    
9
+    int getLength();
10
+    
11
+    int indexOf(T value);
12
+    
13
+    T getAt(int index);
14
+    
15
+    ListenerHandle<LiveList.Listener<T>> addListener(LiveList.Listener<T> listener);
16
+    public interface Listener<T> {
17
+        void onInserted(int index, T value);
18
+        
19
+        void onChanged(int index, T oldValue, T newValue);
20
+        
21
+        void onRemoved(int index, T oldValue);
22
+    }
23
+}

+ 10
- 0
Shared/src/main/java/live/LiveObject.java View File

1
+package live;
2
+
3
+import listeners.ListenerHandle;
4
+import zsynthetic.FunctionTTToVoid;
5
+
6
+public interface LiveObject<T> {
7
+    T getValue();
8
+    
9
+    ListenerHandle<FunctionTTToVoid<T>> addListener(FunctionTTToVoid<T> listener);
10
+}

+ 10
- 0
Shared/src/main/java/live/LiveString.java View File

1
+package live;
2
+
3
+import listeners.ListenerHandle;
4
+import zsynthetic.FunctionStringStringToVoid;
5
+
6
+public interface LiveString {
7
+    String getValue();
8
+    
9
+    ListenerHandle<FunctionStringStringToVoid> addListener(FunctionStringStringToVoid listener);
10
+}

+ 19
- 0
Shared/src/main/java/live/MutableLiveList.java View File

1
+package live;
2
+
3
+
4
+public interface MutableLiveList<T> extends AutoCloseable, LiveList<T> {
5
+    void add(T value);
6
+    
7
+    void insert(int index, T value);
8
+    
9
+    void setAt(int index, T value);
10
+    
11
+    void remove(int index);
12
+    
13
+    void remove(T value);
14
+    
15
+    void clear();
16
+    
17
+    @Override
18
+    public void close();
19
+}

+ 15
- 15
Shared/src/main/java/org/openzen/zencode/shared/CharacterEntity.java View File

1
 package org.openzen.zencode.shared;
1
 package org.openzen.zencode.shared;
2
 
2
 
3
 public final class CharacterEntity {
3
 public final class CharacterEntity {
4
-	public final char charValue;
5
-	public final String stringValue;
6
-	
7
-	public CharacterEntity(String stringValue, char charValue) {
8
-	    this.charValue = charValue;
9
-	    this.stringValue = stringValue;
10
-	}
11
-	
12
-	public char getCharValue() {
13
-	    return charValue;
14
-	}
15
-	
16
-	public String getStringValue() {
17
-	    return stringValue;
18
-	}
4
+    public final char charValue;
5
+    public final String stringValue;
6
+    
7
+    public CharacterEntity(String stringValue, char charValue) {
8
+        this.charValue = charValue;
9
+        this.stringValue = stringValue;
10
+    }
11
+    
12
+    public char getCharValue() {
13
+        return charValue;
14
+    }
15
+    
16
+    public String getStringValue() {
17
+        return stringValue;
18
+    }
19
 }
19
 }

+ 58
- 55
Shared/src/main/java/org/openzen/zencode/shared/CodePosition.java View File

1
 package org.openzen.zencode.shared;
1
 package org.openzen.zencode.shared;
2
 
2
 
3
 import org.openzen.zencode.shared.CodePosition;
3
 import org.openzen.zencode.shared.CodePosition;
4
+import org.openzen.zencode.shared.VirtualSourceFile;
4
 
5
 
5
 public final class CodePosition {
6
 public final class CodePosition {
6
-	public static final CodePosition BUILTIN = new CodePosition(new VirtualSourceFile("builtin"), 0, 0, 0, 0);
7
-	public static final CodePosition NATIVE = new CodePosition(new VirtualSourceFile("native"), 0, 0, 0, 0);
8
-	public final String filename;
9
-	public final SourceFile file;
10
-	public final int fromLine;
11
-	public final int fromLineOffset;
12
-	public final int toLine;
13
-	public final int toLineOffset;
14
-	
15
-	public CodePosition(SourceFile file, int fromLine, int fromLineOffset, int toLine, int toLineOffset) {
16
-		this.file = file;
17
-	    this.filename = file.getFilename();
18
-	    this.fromLine = fromLine;
19
-	    this.fromLineOffset = fromLineOffset;
20
-	    this.toLine = toLine;
21
-	    this.toLineOffset = toLineOffset;
22
-	}
23
-	
24
-	public String toShortString() {
25
-	    int lastSeparator = filename.lastIndexOf('/');
26
-	    String shortFilename = lastSeparator >= 0 ? filename.substring(lastSeparator + 1, (filename).length()) : filename;
27
-	    if (fromLine == 0 && fromLineOffset == 0)
28
-	        return shortFilename;
29
-	    return shortFilename + ":" + Integer.toString(fromLine) + ":" + Integer.toString(fromLineOffset);
30
-	}
31
-	
32
-	public CodePosition until(CodePosition to) {
33
-	    if (!filename.equals(to.filename))
34
-	        throw new AssertionError("From and to positions must be in the same file!");
35
-	    return new CodePosition(file, fromLine, fromLineOffset, to.toLine, to.toLineOffset);
36
-	}
37
-	
38
-	public String toString() {
39
-	    return fromLine == 0 && fromLineOffset == 0 ? filename : filename + ":" + Integer.toString(fromLine) + ":" + Integer.toString(fromLineOffset);
40
-	}
41
-	
42
-	public String getFilename() {
43
-	    return filename;
44
-	}
45
-	
46
-	public int getFromLine() {
47
-	    return fromLine;
48
-	}
49
-	
50
-	public int getFromLineOffset() {
51
-	    return fromLineOffset;
52
-	}
53
-	
54
-	public int getToLine() {
55
-	    return toLine;
56
-	}
57
-	
58
-	public int getToLineOffset() {
59
-	    return toLineOffset;
60
-	}
7
+    public static final CodePosition BUILTIN = new CodePosition(new VirtualSourceFile("builtin"), 0, 0, 0, 0);
8
+    public static final CodePosition NATIVE = new CodePosition(new VirtualSourceFile("native"), 0, 0, 0, 0);
9
+    public final SourceFile file;
10
+    public final int fromLine;
11
+    public final int fromLineOffset;
12
+    public final int toLine;
13
+    public final int toLineOffset;
14
+    
15
+    public CodePosition(SourceFile file, int fromLine, int fromLineOffset, int toLine, int toLineOffset) {
16
+        this.file = file;
17
+        this.fromLine = fromLine;
18
+        this.fromLineOffset = fromLineOffset;
19
+        this.toLine = toLine;
20
+        this.toLineOffset = toLineOffset;
21
+    }
22
+    
23
+    public String getFilename() {
24
+        return file.getFilename();
25
+    }
26
+    
27
+    public String toShortString() {
28
+        int lastSeparator = file.getFilename().lastIndexOf('/');
29
+        String shortFilename = lastSeparator >= 0 ? file.getFilename().substring(lastSeparator + 1, (file.getFilename()).length()) : file.getFilename();
30
+        if (fromLine == 0 && fromLineOffset == 0)
31
+            return shortFilename;
32
+        return shortFilename + ":" + Integer.toString(fromLine) + ":" + Integer.toString(fromLineOffset);
33
+    }
34
+    
35
+    public CodePosition until(CodePosition to) {
36
+        if (!(file == to.file))
37
+            throw new AssertionError("From and to positions must be in the same file!");
38
+        return new CodePosition(file, fromLine, fromLineOffset, to.toLine, to.toLineOffset);
39
+    }
40
+    
41
+    public String toString() {
42
+        return fromLine == 0 && fromLineOffset == 0 ? file.getFilename() : file.getFilename() + ":" + Integer.toString(fromLine) + ":" + Integer.toString(fromLineOffset);
43
+    }
44
+    
45
+    public SourceFile getFile() {
46
+        return file;
47
+    }
48
+    
49
+    public int getFromLine() {
50
+        return fromLine;
51
+    }
52
+    
53
+    public int getFromLineOffset() {
54
+        return fromLineOffset;
55
+    }
56
+    
57
+    public int getToLine() {
58
+        return toLine;
59
+    }
60
+    
61
+    public int getToLineOffset() {
62
+        return toLineOffset;
63
+    }
61
 }
64
 }

+ 21
- 21
Shared/src/main/java/org/openzen/zencode/shared/CompileException.java View File

1
 package org.openzen.zencode.shared;
1
 package org.openzen.zencode.shared;
2
 
2
 
3
+import org.openzen.zencode.shared.CodePosition;
3
 import org.openzen.zencode.shared.CompileException;
4
 import org.openzen.zencode.shared.CompileException;
4
 
5
 
5
 public final class CompileException extends RuntimeException {
6
 public final class CompileException extends RuntimeException {
6
-	public static CompileException internalError(String message) {
7
-	    return new CompileException(CodePosition.BUILTIN, CompileExceptionCode.INTERNAL_ERROR, message);
8
-	}
9
-	
10
-	public final CodePosition position;
11
-	public final CompileExceptionCode code;
12
-	
13
-	public CompileException(CodePosition position, CompileExceptionCode code, String message) {
14
-	    super(position.toString() + ": [" + code.toString() + "] " + message);
15
-	    
16
-	    this.position = position;
17
-	    this.code = code;
18
-	}
19
-	
20
-	public CodePosition getPosition() {
21
-	    return position;
22
-	}
23
-	
24
-	public CompileExceptionCode getCode() {
25
-	    return code;
26
-	}
7
+    public static CompileException internalError(String message) {
8
+        return new CompileException(CodePosition.BUILTIN, CompileExceptionCode.INTERNAL_ERROR, message);
9
+    }
10
+    
11
+    public final CodePosition position;
12
+    public final CompileExceptionCode code;
13
+    
14
+    public CompileException(CodePosition position, CompileExceptionCode code, String message) {
15
+        super(position.toString() + ": [" + code.toString() + "] " + message);
16
+        this.position = position;
17
+        this.code = code;
18
+    }
19
+    
20
+    public CodePosition getPosition() {
21
+        return position;
22
+    }
23
+    
24
+    public CompileExceptionCode getCode() {
25
+        return code;
26
+    }
27
 }
27
 }

+ 65
- 65
Shared/src/main/java/org/openzen/zencode/shared/CompileExceptionCode.java View File

1
 package org.openzen.zencode.shared;
1
 package org.openzen.zencode.shared;
2
 
2
 
3
 public enum CompileExceptionCode {
3
 public enum CompileExceptionCode {
4
-	UNEXPECTED_TOKEN,
5
-	IMPORT_NOT_FOUND,
6
-	NO_OUTER_BECAUSE_NOT_INNER,
7
-	NO_OUTER_BECAUSE_STATIC,
8
-	NO_OUTER_BECAUSE_OUTSIDE_TYPE,
9
-	TYPE_ARGUMENTS_INVALID_NUMBER,
10
-	TYPE_ARGUMENTS_NOT_INFERRABLE,
11
-	USING_STATIC_ON_INSTANCE,
12
-	CANNOT_ASSIGN,
13
-	UNAVAILABLE_IN_CLOSURE,
14
-	USING_PACKAGE_AS_EXPRESSION,
15
-	USING_PACKAGE_AS_CALL_TARGET,
16
-	USING_TYPE_AS_EXPRESSION,
17
-	MEMBER_NO_SETTER,
18
-	MEMBER_NO_GETTER,
19
-	MEMBER_NOT_STATIC,
20
-	MEMBER_IS_FINAL,
21
-	MEMBER_DUPLICATE,
22
-	CALL_AMBIGUOUS,
23
-	CALL_NO_VALID_METHOD,
24
-	ENUM_VALUE_DUPLICATE,
25
-	INVALID_CAST,
26
-	NO_SUCH_INNER_TYPE,
27
-	NO_DOLLAR_HERE,
28
-	UNSUPPORTED_XML_EXPRESSIONS,
29
-	UNSUPPORTED_NAMED_ARGUMENTS,
30
-	TYPE_CANNOT_UNITE,
31
-	BRACKET_MULTIPLE_EXPRESSIONS,
32
-	SUPER_CALL_NO_SUPERCLASS,
33
-	LAMBDA_HEADER_INVALID,
34
-	COALESCE_TARGET_NOT_OPTIONAL,
35
-	MULTIPLE_MATCHING_HINTS,
36
-	MISSING_MAP_KEY,
37
-	NO_SUCH_MEMBER,
38
-	USING_THIS_OUTSIDE_TYPE,
39
-	USING_THIS_STATIC,
40
-	UNDEFINED_VARIABLE,
41
-	METHOD_BODY_REQUIRED,
42
-	BREAK_OUTSIDE_LOOP,
43
-	CONTINUE_OUTSIDE_LOOP,
44
-	NO_SUCH_ITERATOR,
45
-	NO_SUCH_TYPE,
46
-	RETURN_VALUE_REQUIRED,
47
-	RETURN_VALUE_VOID,
48
-	INVALID_CONDITION,
49
-	INTERNAL_ERROR,
50
-	CANNOT_SET_FINAL_VARIABLE,
51
-	MISSING_PARAMETER,
52
-	STATEMENT_OUTSIDE_SWITCH_CASE,
53
-	MISSING_VARIANT_CASEPARAMETERS,
54
-	INVALID_SWITCH_CASE,
55
-	TRY_CONVERT_OUTSIDE_FUNCTION,
56
-	TRY_CONVERT_ILLEGAL_TARGET,
57
-	TRY_RETHROW_NOT_A_RESULT,
58
-	DIFFERENT_EXCEPTIONS,
59
-	UNKNOWN_ANNOTATION,
60
-	OVERRIDE_WITHOUT_BASE,
61
-	OVERRIDE_AMBIGUOUS,
62
-	OVERRIDE_CONSTRUCTOR,
63
-	PRECOMPILE_FAILED,
64
-	UNTYPED_EMPTY_ARRAY,
65
-	UNTYPED_EMPTY_MAP,
66
-	VAR_WITHOUT_TYPE_OR_INITIALIZER,
67
-	NO_BRACKET_PARSER,
68
-	INVALID_BRACKET_EXPRESSION
4
+	UNEXPECTED_TOKEN(),
5
+	IMPORT_NOT_FOUND(),
6
+	NO_OUTER_BECAUSE_NOT_INNER(),
7
+	NO_OUTER_BECAUSE_STATIC(),
8
+	NO_OUTER_BECAUSE_OUTSIDE_TYPE(),
9
+	TYPE_ARGUMENTS_INVALID_NUMBER(),
10
+	TYPE_ARGUMENTS_NOT_INFERRABLE(),
11
+	USING_STATIC_ON_INSTANCE(),
12
+	CANNOT_ASSIGN(),
13
+	UNAVAILABLE_IN_CLOSURE(),
14
+	USING_PACKAGE_AS_EXPRESSION(),
15
+	USING_PACKAGE_AS_CALL_TARGET(),
16
+	USING_TYPE_AS_EXPRESSION(),
17
+	MEMBER_NO_SETTER(),
18
+	MEMBER_NO_GETTER(),
19
+	MEMBER_NOT_STATIC(),
20
+	MEMBER_IS_FINAL(),
21
+	MEMBER_DUPLICATE(),
22
+	CALL_AMBIGUOUS(),
23
+	CALL_NO_VALID_METHOD(),
24
+	ENUM_VALUE_DUPLICATE(),
25
+	INVALID_CAST(),
26
+	NO_SUCH_INNER_TYPE(),
27
+	NO_DOLLAR_HERE(),
28
+	UNSUPPORTED_XML_EXPRESSIONS(),
29
+	UNSUPPORTED_NAMED_ARGUMENTS(),
30
+	TYPE_CANNOT_UNITE(),
31
+	BRACKET_MULTIPLE_EXPRESSIONS(),
32
+	SUPER_CALL_NO_SUPERCLASS(),
33
+	LAMBDA_HEADER_INVALID(),
34
+	COALESCE_TARGET_NOT_OPTIONAL(),
35
+	MULTIPLE_MATCHING_HINTS(),
36
+	MISSING_MAP_KEY(),
37
+	NO_SUCH_MEMBER(),
38
+	USING_THIS_OUTSIDE_TYPE(),
39
+	USING_THIS_STATIC(),
40
+	UNDEFINED_VARIABLE(),
41
+	METHOD_BODY_REQUIRED(),
42
+	BREAK_OUTSIDE_LOOP(),
43
+	CONTINUE_OUTSIDE_LOOP(),
44
+	NO_SUCH_ITERATOR(),
45
+	NO_SUCH_TYPE(),
46
+	RETURN_VALUE_REQUIRED(),
47
+	RETURN_VALUE_VOID(),
48
+	INVALID_CONDITION(),
49
+	INTERNAL_ERROR(),
50
+	CANNOT_SET_FINAL_VARIABLE(),
51
+	MISSING_PARAMETER(),
52
+	STATEMENT_OUTSIDE_SWITCH_CASE(),
53
+	MISSING_VARIANT_CASEPARAMETERS(),
54
+	INVALID_SWITCH_CASE(),
55
+	TRY_CONVERT_OUTSIDE_FUNCTION(),
56
+	TRY_CONVERT_ILLEGAL_TARGET(),
57
+	TRY_RETHROW_NOT_A_RESULT(),
58
+	DIFFERENT_EXCEPTIONS(),
59
+	UNKNOWN_ANNOTATION(),
60
+	OVERRIDE_WITHOUT_BASE(),
61
+	OVERRIDE_AMBIGUOUS(),
62
+	OVERRIDE_CONSTRUCTOR(),
63
+	PRECOMPILE_FAILED(),
64
+	UNTYPED_EMPTY_ARRAY(),
65
+	UNTYPED_EMPTY_MAP(),
66
+	VAR_WITHOUT_TYPE_OR_INITIALIZER(),
67
+	NO_BRACKET_PARSER(),
68
+	INVALID_BRACKET_EXPRESSION()
69
 }
69
 }

+ 49
- 48
Shared/src/main/java/org/openzen/zencode/shared/ConcatMap.java View File

1
 package org.openzen.zencode.shared;
1
 package org.openzen.zencode.shared;
2
 
2
 
3
+import org.openzen.zencode.shared.ConcatMap;
3
 import stdlib.EqualsComparable;
4
 import stdlib.EqualsComparable;
4
 
5
 
5
-public final class ConcatMap<K extends EqualsComparable<K>, V>  {
6
-	public static final <K extends EqualsComparable<K>, V> ConcatMap<K, V> empty(Class<K> typeOfK, Class<V> typeOfV) {
7
-	    return new ConcatMap<K, V>(null, null, null);
8
-	}
9
-	
10
-	private final K key;
11
-	private final V value;
12
-	private final ConcatMap<K, V> remaining;
13
-	
14
-	private ConcatMap(K key, V value, ConcatMap<K, V> remaining) {
15
-	    this.key = key;
16
-	    this.value = value;
17
-	    this.remaining = remaining;
18
-	}
19
-	
20
-	public boolean getIsEmpty() {
21
-	    return key == null;
22
-	}
23
-	
24
-	public ConcatMap<K, V> concat(K key, V value) {
25
-	    return new ConcatMap<K, V>(key, value, this);
26
-	}
27
-	
28
-	public boolean contains(K key) {
29
-	    if (this.key == null)
30
-	        return false;
31
-	    if (key.equals_(this.key))
32
-	        return true;
33
-	    if (remaining == null)
34
-	        return false;
35
-	    return remaining.contains(key);
36
-	}
37
-	
38
-	public V getAt(K key) {
39
-	    if (this.key == null)
40
-	        return null;
41
-	    if (key.equals_(this.key))
42
-	        return value;
43
-	    return remaining.getAt(key);
44
-	}
45
-	
46
-	public V getOrDefault(K key, V defaultValue) {
47
-	    if (this.key == null)
48
-	        return defaultValue;
49
-	    if (key.equals_(this.key))
50
-	        return value;
51
-	    return remaining.getOrDefault(key, defaultValue);
52
-	}
6
+public final class ConcatMap<K extends EqualsComparable<K>, V> {
7
+    public static final <K extends EqualsComparable<K>, V> ConcatMap<K, V> empty(Class<K> typeOfK, Class<V> typeOfV) {
8
+        return new ConcatMap<K, V>(null, null, null);
9
+    }
10
+    
11
+    private final K key;
12
+    private final V value;
13
+    private final ConcatMap<K, V> remaining;
14
+    
15
+    private ConcatMap(K key, V value, ConcatMap<K, V> remaining) {
16
+        this.key = key;
17
+        this.value = value;
18
+        this.remaining = remaining;
19
+    }
20
+    
21
+    public boolean getIsEmpty() {
22
+        return key == null;
23
+    }
24
+    
25
+    public ConcatMap<K, V> concat(K key, V value) {
26
+        return new ConcatMap<K, V>(key, value, this);
27
+    }
28
+    
29
+    public boolean contains(K key) {
30
+        if (this.key == null)
31
+            return false;
32
+        if (key.equals_(this.key))
33
+            return true;
34
+        if (remaining == null)
35
+            return false;
36
+        return remaining.contains(key);
37
+    }
38
+    
39
+    public V getAt(K key) {
40
+        if (this.key == null)
41
+            return null;
42
+        if (key.equals_(this.key))
43
+            return value;
44
+        return remaining.getAt(key);
45
+    }
46
+    
47
+    public V getOrDefault(K key, V defaultValue) {
48
+        if (this.key == null)
49
+            return defaultValue;
50
+        if (key.equals_(this.key))
51
+            return value;
52
+        return remaining.getOrDefault(key, defaultValue);
53
+    }
53
 }
54
 }

+ 22
- 32
Shared/src/main/java/org/openzen/zencode/shared/LiteralSourceFile.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.zencode.shared;
1
 package org.openzen.zencode.shared;
7
 
2
 
8
 import java.io.IOException;
3
 import java.io.IOException;
9
 import java.io.Reader;
4
 import java.io.Reader;
10
 import java.io.StringReader;
5
 import java.io.StringReader;
11
 
6
 
12
-/**
13
- *
14
- * @author Hoofdgebruiker
15
- */
16
-public class LiteralSourceFile implements SourceFile {
17
-	private final String filename;
18
-	private final String contents;
19
-	
20
-	public LiteralSourceFile(String filename, String contents) {
21
-		this.filename = filename;
22
-		this.contents = contents;
23
-	}
24
-
25
-	@Override
26
-	public String getFilename() {
27
-		return filename;
28
-	}
29
-
30
-	@Override
31
-	public Reader open() throws IOException {
32
-		return new StringReader(contents);
33
-	}
34
-
35
-	@Override
36
-	public void update(String content) throws IOException {
37
-		throw new UnsupportedOperationException("Cannot update literal source files");
38
-	}
7
+public final class LiteralSourceFile implements SourceFile {
8
+    public final String filename;
9
+    private final String contents;
10
+    
11
+    public LiteralSourceFile(String filename, String contents) {
12
+        this.filename = filename;
13
+        this.contents = contents;
14
+    }
15
+    
16
+    @Override
17
+    public Reader open() throws IOException {
18
+        return new StringReader(contents);
19
+    }
20
+    
21
+    @Override
22
+    public void update(String contents) throws IOException {
23
+        throw new AssertionError("Cannot update literal source files");
24
+    }
25
+    
26
+    public String getFilename() {
27
+        return filename;
28
+    }
39
 }
29
 }

+ 5
- 5
Shared/src/main/java/org/openzen/zencode/shared/SourceFile.java View File

4
 import java.io.Reader;
4
 import java.io.Reader;
5
 
5
 
6
 public interface SourceFile {
6
 public interface SourceFile {
7
-	String getFilename();
8
-	
9
-	Reader open() throws IOException;
10
-	
11
-	void update(String content) throws IOException;
7
+    String getFilename();
8
+    
9
+    Reader open() throws IOException;
10
+    
11
+    void update(String content) throws IOException;
12
 }
12
 }

+ 2
- 15
Shared/src/main/java/org/openzen/zencode/shared/StringExpansion.java View File

18
 	
18
 	
19
 	static  {
19
 	static  {
20
 	    CharacterEntity[] entities = StringExpansion.getCharacterEntities();
20
 	    CharacterEntity[] entities = StringExpansion.getCharacterEntities();
21
-	    // TODO: getCharacterEntities().index(e => e.stringValue);
22
-	    
23
 	    NAMED_CHARACTER_ENTITIES = new HashMap<>();
21
 	    NAMED_CHARACTER_ENTITIES = new HashMap<>();
24
 	    for (CharacterEntity entity : entities)
22
 	    for (CharacterEntity entity : entities)
25
-	        
26
 	        StringExpansion.NAMED_CHARACTER_ENTITIES.put(entity.stringValue, entity);
23
 	        StringExpansion.NAMED_CHARACTER_ENTITIES.put(entity.stringValue, entity);
27
 	}
24
 	}
28
 	
25
 	
57
 	                return new Error("Unfinished escape sequence");
54
 	                return new Error("Unfinished escape sequence");
58
 	            switch (quoted.charAt(i + 1)) {
55
 	            switch (quoted.charAt(i + 1)) {
59
 	                case '\\':
56
 	                case '\\':
60
-	                    
61
 	                    i++;
57
 	                    i++;
62
 	                    result.append('\\');
58
 	                    result.append('\\');
63
 	                    break;
59
 	                    break;
64
 	                case '&':
60
 	                case '&':
65
-	                    
66
 	                    Result<CharacterEntity, String> temp1 = StringExpansion.readCharacterEntity(quoted, i + 1);
61
 	                    Result<CharacterEntity, String> temp1 = StringExpansion.readCharacterEntity(quoted, i + 1);
67
 	                    if (temp1 instanceof Result.Error)
62
 	                    if (temp1 instanceof Result.Error)
68
 	                        return new Result.Error<>(((Result.Error<CharacterEntity, String>)temp1).value);
63
 	                        return new Result.Error<>(((Result.Error<CharacterEntity, String>)temp1).value);
99
 	                    result.append('\'');
94
 	                    result.append('\'');
100
 	                    break;
95
 	                    break;
101
 	                case 'u':
96
 	                case 'u':
102
-	                    
103
 	                    if (i >= quoted.length() - 5)
97
 	                    if (i >= quoted.length() - 5)
104
 	                        return new Error("Unfinished escape sequence");
98
 	                        return new Error("Unfinished escape sequence");
105
 	                    Result<Integer, String> temp2 = StringExpansion.readHexCharacter(quoted.charAt(i + 2));
99
 	                    Result<Integer, String> temp2 = StringExpansion.readHexCharacter(quoted.charAt(i + 2));
122
 	                    result.append((char)hex0 << 12 | hex1 << 8 | hex2 << 4 | hex3);
116
 	                    result.append((char)hex0 << 12 | hex1 << 8 | hex2 << 4 | hex3);
123
 	                    break;
117
 	                    break;
124
 	                default:
118
 	                default:
125
-	                    
126
 	                    return new Error("Illegal escape sequence");
119
 	                    return new Error("Illegal escape sequence");
127
 	            }
120
 	            }
128
 	        }
121
 	        }
140
 	    for (char c : self.toCharArray()) {
133
 	    for (char c : self.toCharArray()) {
141
 	        switch (c) {
134
 	        switch (c) {
142
 	            case '\\':
135
 	            case '\\':
143
-	                
144
 	                output.append("\\\\");
136
 	                output.append("\\\\");
145
 	                break;
137
 	                break;
146
 	            case '"':
138
 	            case '"':
147
-	                
148
 	                if (quote == '"')
139
 	                if (quote == '"')
149
 	                    output.append("\\\"");
140
 	                    output.append("\\\"");
150
 	                else
141
 	                else
151
 	                    output.append('"');
142
 	                    output.append('"');
152
 	                break;
143
 	                break;
153
 	            case '\'':
144
 	            case '\'':
154
-	                
155
 	                if (quote == '\'')
145
 	                if (quote == '\'')
156
 	                    output.append("\\'");
146
 	                    output.append("\\'");
157
 	                else
147
 	                else
167
 	                output.append("\\t");
157
 	                output.append("\\t");
168
 	                break;
158
 	                break;
169
 	            default:
159
 	            default:
170
-	                
171
 	                if (escapeUnicode && c > '') {
160
 	                if (escapeUnicode && c > '') {
172
 	                    output.append("\\u").append(Strings.lpad(Integer.toHexString((int)c), 4, '0'));
161
 	                    output.append("\\u").append(Strings.lpad(Integer.toHexString((int)c), 4, '0'));
173
 	                }
162
 	                }
206
 	    if (entity.charAt(0) == '#') {
195
 	    if (entity.charAt(0) == '#') {
207
 	        if (entity.length() < 2)
196
 	        if (entity.length() < 2)
208
 	            return new Error("Character entity number too short");
197
 	            return new Error("Character entity number too short");
209
-	        if (str.charAt(1) == 'x') {// hex character entity
210
-	            
198
+	        if (str.charAt(1) == 'x') {
211
 	            if (entity.length() != 7)
199
 	            if (entity.length() != 7)
212
 	                return new Error("Hexadecimal character entity must have 4 hex digits");
200
 	                return new Error("Hexadecimal character entity must have 4 hex digits");
213
 	            int ivalue = Integer.parseInt(entity.substring(2, entity.length()), 16);
201
 	            int ivalue = Integer.parseInt(entity.substring(2, entity.length()), 16);
214
 	            return new Ok(new CharacterEntity(entity, (char)ivalue));
202
 	            return new Ok(new CharacterEntity(entity, (char)ivalue));
215
 	        }
203
 	        }
216
-	        else {// decimal character entity
217
-	            
204
+	        else {
218
 	            int ivalue = Integer.parseInt(entity.substring(1, entity.length()));
205
 	            int ivalue = Integer.parseInt(entity.substring(1, entity.length()));
219
 	            return new Ok(new CharacterEntity(entity, (char)ivalue));
206
 	            return new Ok(new CharacterEntity(entity, (char)ivalue));
220
 	        }
207
 	        }

+ 17
- 17
Shared/src/main/java/org/openzen/zencode/shared/Taggable.java View File

4
 import java.util.Map;
4
 import java.util.Map;
5
 
5
 
6
 public class Taggable {
6
 public class Taggable {
7
-	private final Map<Class<?>, Object> tags = new HashMap<Class<?>, Object>();
8
-	
9
-	public <T> void setTag(Class<T> typeOfT, T tag) {
10
-	    tags.put(typeOfT, tag);
11
-	}
12
-	
13
-	public <T> T getTag(Class<T> typeOfT) {
14
-	    return (T)(tags.get(typeOfT));
15
-	}
16
-	
17
-	public <T> boolean hasTag(Class<T> typeOfT) {
18
-	    return tags.containsKey(typeOfT);
19
-	}
20
-	
21
-	public void addAllTagsFrom(Taggable other) {
22
-	    tags.putAll(other.tags);
23
-	}
7
+    private final Map<Class<?>, Object> tags = new HashMap<Class<?>, Object>();
8
+    
9
+    public <T> void setTag(Class<T> typeOfT, T tag) {
10
+        tags.put(typeOfT, tag);
11
+    }
12
+    
13
+    public <T> T getTag(Class<T> typeOfT) {
14
+        return (T)(tags.get(typeOfT));
15
+    }
16
+    
17
+    public <T> boolean hasTag(Class<T> typeOfT) {
18
+        return tags.containsKey(typeOfT);
19
+    }
20
+    
21
+    public void addAllTagsFrom(Taggable other) {
22
+        tags.putAll(other.tags);
23
+    }
24
 }
24
 }

+ 20
- 30
Shared/src/main/java/org/openzen/zencode/shared/VirtualSourceFile.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.zencode.shared;
1
 package org.openzen.zencode.shared;
7
 
2
 
8
 import java.io.IOException;
3
 import java.io.IOException;
9
 import java.io.Reader;
4
 import java.io.Reader;
10
 
5
 
11
-/**
12
- *
13
- * @author Hoofdgebruiker
14
- */
15
-public class VirtualSourceFile implements SourceFile {
16
-	private final String filename;
17
-	
18
-	public VirtualSourceFile(String filename) {
19
-		this.filename = filename;
20
-	}
21
-
22
-	@Override
23
-	public String getFilename() {
24
-		return filename;
25
-	}
26
-
27
-	@Override
28
-	public Reader open() throws IOException {
29
-		throw new UnsupportedOperationException("Cannot open virtual source files");
30
-	}
31
-
32
-	@Override
33
-	public void update(String content) throws IOException {
34
-		throw new UnsupportedOperationException("Cannot write to virtual source files");
35
-	}
6
+public final class VirtualSourceFile implements SourceFile {
7
+    public final String filename;
8
+    
9
+    public VirtualSourceFile(String filename) {
10
+        this.filename = filename;
11
+    }
12
+    
13
+    @Override
14
+    public Reader open() throws IOException {
15
+        throw new AssertionError("Cannot open virtual source files");
16
+    }
17
+    
18
+    @Override
19
+    public void update(String content) throws IOException {
20
+        throw new AssertionError("Cannot write to virtual source files");
21
+    }
22
+    
23
+    public String getFilename() {
24
+        return filename;
25
+    }
36
 }
26
 }

+ 0
- 0
Shared/src/main/java/stdlib/Arrays.java View File


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

Loading…
Cancel
Save