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,6 +45,7 @@ import org.openzen.zenscript.codemodel.expression.FunctionExpression;
45 45
 import org.openzen.zenscript.codemodel.expression.GetFieldExpression;
46 46
 import org.openzen.zenscript.codemodel.expression.GetFunctionParameterExpression;
47 47
 import org.openzen.zenscript.codemodel.expression.GetLocalVariableExpression;
48
+import org.openzen.zenscript.codemodel.expression.GetMatchingVariantField;
48 49
 import org.openzen.zenscript.codemodel.expression.GetStaticFieldExpression;
49 50
 import org.openzen.zenscript.codemodel.expression.GetterExpression;
50 51
 import org.openzen.zenscript.codemodel.expression.GlobalCallExpression;
@@ -480,6 +481,11 @@ public class ExpressionFormatter implements ExpressionVisitor<ExpressionString>
480 481
 	public ExpressionString visitGetLocalVariable(GetLocalVariableExpression expression) {
481 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 490
 	@Override
485 491
 	public ExpressionString visitGetStaticField(GetStaticFieldExpression expression) {

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

@@ -80,13 +80,13 @@ public class FunctionHeader {
80 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 84
 		if (returnType == null)
85 85
 			throw new NullPointerException();
86
-		if (genericParameters == null)
86
+		if (typeParameters == null)
87 87
 			throw new NullPointerException();
88 88
 		
89
-		this.typeParameters = genericParameters;
89
+		this.typeParameters = typeParameters;
90 90
 		this.returnType = returnType;
91 91
 		this.parameters = parameters;
92 92
 		this.thrownType = thrownType;
@@ -250,6 +250,8 @@ public class FunctionHeader {
250 250
 	}
251 251
 	
252 252
 	public boolean canOverride(TypeScope scope, FunctionHeader other) {
253
+		if (other == null)
254
+			throw new NullPointerException();
253 255
 		if (parameters.length != other.parameters.length)
254 256
 			return false;
255 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,6 +12,7 @@ import org.openzen.zencode.shared.Taggable;
12 12
 import org.openzen.zenscript.codemodel.annotations.DefinitionAnnotation;
13 13
 import org.openzen.zenscript.codemodel.definition.AliasDefinition;
14 14
 import org.openzen.zenscript.codemodel.definition.DefinitionVisitor;
15
+import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
15 16
 import org.openzen.zenscript.codemodel.definition.InterfaceDefinition;
16 17
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
17 18
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
@@ -141,8 +142,29 @@ public abstract class HighLevelDefinition extends Taggable {
141 142
 	}
142 143
 	
143 144
 	public void normalize(TypeScope scope) {
145
+		DestructorMember destructor = null;
146
+		List<FieldMember> fields = new ArrayList();
147
+		
144 148
 		for (IDefinitionMember member : members) {
145 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,6 +9,7 @@ import java.util.HashMap;
9 9
 import java.util.List;
10 10
 import java.util.Map;
11 11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
+import org.openzen.zenscript.codemodel.definition.ZSPackage;
12 13
 import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
13 14
 import org.openzen.zenscript.codemodel.type.GenericName;
14 15
 import org.openzen.zenscript.codemodel.type.ITypeID;
@@ -18,9 +19,27 @@ import org.openzen.zenscript.codemodel.type.ITypeID;
18 19
  * @author Hoofdgebruiker
19 20
  */
20 21
 public class CompilingPackage {
22
+	private final ZSPackage pkg;
21 23
 	private final Map<String, CompilingPackage> packages = new HashMap<>();
22 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 43
 	public void addPackage(String name, CompilingPackage package_) {
25 44
 		packages.put(name, package_);
26 45
 	}
@@ -44,7 +63,7 @@ public class CompilingPackage {
44 63
 	
45 64
 	private HighLevelDefinition getImportType(TypeResolutionContext context, CompilingType type, List<String> name, int index) {
46 65
 		if (index == name.size())
47
-			return type.load(context);
66
+			return type.load();
48 67
 		
49 68
 		return getImportType(context, type.getInner(name.get(index)), name, index + 1);
50 69
 	}
@@ -62,7 +81,7 @@ public class CompilingPackage {
62 81
 		
63 82
 		if (types.containsKey(name.get(index).name)) {
64 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 85
 			return getInner(context, name, index + 1, type, result);
67 86
 		}
68 87
 		
@@ -77,7 +96,7 @@ public class CompilingPackage {
77 96
 		if (innerType == null)
78 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 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,6 +9,7 @@ import java.util.List;
9 9
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
10 10
 import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
11 11
 import org.openzen.zenscript.codemodel.type.GenericName;
12
+import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
12 13
 
13 14
 /**
14 15
  *
@@ -17,10 +18,10 @@ import org.openzen.zenscript.codemodel.type.GenericName;
17 18
 public interface CompilingType {
18 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 25
 		index++;
25 26
 		if (index == name.size())
26 27
 			return type;
@@ -29,6 +30,6 @@ public interface CompilingType {
29 30
 		if (innerType == null)
30 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,10 +21,12 @@ import org.openzen.zenscript.codemodel.type.ITypeID;
21 21
  */
22 22
 public class FileResolutionContext implements TypeResolutionContext {
23 23
 	private final ModuleTypeResolutionContext module;
24
+	private final CompilingPackage modulePackage;
24 25
 	private final Map<String, HighLevelDefinition> imports = new HashMap<>();
25 26
 	
26
-	public FileResolutionContext(ModuleTypeResolutionContext module) {
27
+	public FileResolutionContext(ModuleTypeResolutionContext module, CompilingPackage modulePackage) {
27 28
 		this.module = module;
29
+		this.modulePackage = modulePackage;
28 30
 	}
29 31
 	
30 32
 	public void addImport(String name, HighLevelDefinition definition) {
@@ -51,6 +53,10 @@ public class FileResolutionContext implements TypeResolutionContext {
51 53
 					1);
52 54
 		}
53 55
 		
56
+		ITypeID moduleType = modulePackage.getType(this, name);
57
+		if (moduleType != null)
58
+			return moduleType;
59
+		
54 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,8 +44,8 @@ public class LocalTypeResolutionContext implements TypeResolutionContext {
44 44
 		if (type != null) {
45 45
 			CompilingType compiling = type.getInner(name.get(0).name);
46 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,6 +60,6 @@ public class LocalTypeResolutionContext implements TypeResolutionContext {
60 60
 	
61 61
 	@Override
62 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,6 +26,15 @@ public class InterfaceDefinition extends HighLevelDefinition {
26 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 38
 	@Override
30 39
 	public boolean isStatic() {
31 40
 		return true;

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

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

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

@@ -80,6 +80,8 @@ public interface ExpressionVisitor<T> {
80 80
 	
81 81
 	public T visitGetLocalVariable(GetLocalVariableExpression expression);
82 82
 	
83
+	public T visitGetMatchingVariantField(GetMatchingVariantField expression);
84
+	
83 85
 	public T visitGetStaticField(GetStaticFieldExpression expression);
84 86
 	
85 87
 	public T visitGetter(GetterExpression expression);

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

@@ -0,0 +1,41 @@
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,7 +6,6 @@
6 6
 package org.openzen.zenscript.codemodel.expression.switchvalue;
7 7
 
8 8
 import org.openzen.zenscript.codemodel.member.ref.VariantOptionRef;
9
-import org.openzen.zenscript.codemodel.statement.VarStatement;
10 9
 
11 10
 /**
12 11
  *
@@ -14,9 +13,9 @@ import org.openzen.zenscript.codemodel.statement.VarStatement;
14 13
  */
15 14
 public class VariantOptionSwitchValue implements SwitchValue {
16 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 19
 		this.option = option;
21 20
 		this.parameters = parameters;
22 21
 	}

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

@@ -11,7 +11,6 @@ import org.openzen.zenscript.codemodel.GenericMapper;
11 11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12 12
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
13 13
 import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
14
-import org.openzen.zenscript.codemodel.scope.TypeScope;
15 14
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
16 15
 import org.openzen.zenscript.codemodel.type.member.BuiltinID;
17 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,4 +63,9 @@ public class ConstMember extends PropertyMember {
63 63
 		type = type.getNormalized();
64 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,14 +17,14 @@ public class EnumConstantMember {
17 17
 	public final CodePosition position;
18 18
 	public final HighLevelDefinition definition;
19 19
 	public final String name;
20
-	public final int value;
20
+	public final int ordinal;
21 21
 	
22 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 25
 		this.position = position;
26 26
 		this.definition = definition;
27 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,4 +147,9 @@ public class FieldMember extends PropertyMember {
147 147
 		if (initializer != null)
148 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,4 +60,9 @@ public abstract class FunctionalMember extends DefinitionMember {
60 60
 		if (body != null)
61 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,6 +10,7 @@ import org.openzen.zenscript.codemodel.FunctionHeader;
10 10
 import org.openzen.zenscript.codemodel.GenericMapper;
11 11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12 12
 import org.openzen.zenscript.codemodel.member.ref.GetterMemberRef;
13
+import org.openzen.zenscript.codemodel.statement.Statement;
13 14
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
14 15
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
15 16
 import org.openzen.zenscript.codemodel.type.ITypeID;
@@ -38,6 +39,14 @@ public class GetterMember extends FunctionalMember implements IPropertyMember {
38 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 50
 	@Override
42 51
 	public ITypeID getType() {
43 52
 		return type;

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

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

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

@@ -70,4 +70,9 @@ public class ImplementationMember extends DefinitionMember {
70 70
 		for (IDefinitionMember member : members)
71 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,4 +63,9 @@ public class InnerDefinitionMember extends DefinitionMember {
63 63
 	public void normalize(TypeScope scope) {
64 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,4 +65,9 @@ public class StaticInitializerMember extends Taggable implements IDefinitionMemb
65 65
 	public void normalize(TypeScope scope) {
66 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,4 +87,9 @@ public class ArrayIteratorKeyValues extends Taggable implements IIteratorMember
87 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,4 +82,9 @@ public class ArrayIteratorValues extends Taggable implements IIteratorMember {
82 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,4 +85,9 @@ public class AssocIterator extends Taggable implements IIteratorMember {
85 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,4 +93,9 @@ public class RangeIterator extends Taggable implements IIteratorMember {
93 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,4 +76,9 @@ public class StringCharIterator extends Taggable implements IIteratorMember {
76 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,6 +12,7 @@ import org.openzen.zenscript.codemodel.annotations.MemberAnnotation;
12 12
 import org.openzen.zenscript.codemodel.expression.CastExpression;
13 13
 import org.openzen.zenscript.codemodel.expression.Expression;
14 14
 import org.openzen.zenscript.codemodel.member.CasterMember;
15
+import org.openzen.zenscript.codemodel.member.IDefinitionMember;
15 16
 import org.openzen.zenscript.codemodel.type.ITypeID;
16 17
 
17 18
 /**
@@ -64,4 +65,9 @@ public class CasterMemberRef implements DefinitionMemberRef {
64 65
 	public MemberAnnotation[] getAnnotations() {
65 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,6 +8,7 @@ package org.openzen.zenscript.codemodel.member.ref;
8 8
 import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.FunctionHeader;
10 10
 import org.openzen.zenscript.codemodel.annotations.MemberAnnotation;
11
+import org.openzen.zenscript.codemodel.member.IDefinitionMember;
11 12
 
12 13
 /**
13 14
  *
@@ -25,4 +26,6 @@ public interface DefinitionMemberRef {
25 26
 	FunctionHeader getHeader();
26 27
 	
27 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,6 +8,7 @@ package org.openzen.zenscript.codemodel.member.ref;
8 8
 import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.FunctionHeader;
10 10
 import org.openzen.zenscript.codemodel.annotations.MemberAnnotation;
11
+import org.openzen.zenscript.codemodel.member.IDefinitionMember;
11 12
 import org.openzen.zenscript.codemodel.member.ImplementationMember;
12 13
 import org.openzen.zenscript.codemodel.type.ITypeID;
13 14
 
@@ -53,4 +54,9 @@ public class ImplementationMemberRef implements DefinitionMemberRef {
53 54
 	public MemberAnnotation[] getAnnotations() {
54 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,6 +9,7 @@ import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.FunctionHeader;
10 10
 import org.openzen.zenscript.codemodel.annotations.MemberAnnotation;
11 11
 import org.openzen.zenscript.codemodel.member.CustomIteratorMember;
12
+import org.openzen.zenscript.codemodel.member.IDefinitionMember;
12 13
 import org.openzen.zenscript.codemodel.member.IIteratorMember;
13 14
 import org.openzen.zenscript.codemodel.type.ITypeID;
14 15
 
@@ -62,4 +63,9 @@ public class IteratorMemberRef implements DefinitionMemberRef {
62 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,6 +9,7 @@ import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.FunctionHeader;
10 10
 import org.openzen.zenscript.codemodel.GenericMapper;
11 11
 import org.openzen.zenscript.codemodel.annotations.MemberAnnotation;
12
+import org.openzen.zenscript.codemodel.member.IDefinitionMember;
12 13
 import org.openzen.zenscript.codemodel.member.IPropertyMember;
13 14
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
14 15
 import org.openzen.zenscript.codemodel.type.ITypeID;
@@ -79,4 +80,9 @@ public abstract class PropertyRef implements DefinitionMemberRef {
79 80
 	public final MemberAnnotation[] getAnnotations() {
80 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,6 +16,8 @@ import org.openzen.zenscript.codemodel.FunctionHeader;
16 16
 import org.openzen.zenscript.codemodel.GenericMapper;
17 17
 import org.openzen.zenscript.codemodel.expression.Expression;
18 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 21
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
20 22
 import org.openzen.zenscript.codemodel.partial.IPartialExpression;
21 23
 import org.openzen.zenscript.codemodel.statement.LoopStatement;
@@ -35,7 +37,7 @@ public class ExpressionScope extends BaseScope {
35 37
 	
36 38
 	public final List<ITypeID> hints;
37 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 42
 	public ExpressionScope(BaseScope outer) {
41 43
 		this.outer = outer;
@@ -70,7 +72,7 @@ public class ExpressionScope extends BaseScope {
70 72
 			List<ITypeID> hints,
71 73
 			Function<CodePosition, Expression> dollar,
72 74
 			Map<TypeParameter, ITypeID> genericInferenceMap,
73
-			Map<String, VarStatement> innerVariables) {
75
+			Map<String, Function<CodePosition, Expression>> innerVariables) {
74 76
 		this.outer = scope;
75 77
 		this.hints = hints;
76 78
 		this.dollar = dollar;
@@ -79,7 +81,11 @@ public class ExpressionScope extends BaseScope {
79 81
 	}
80 82
 	
81 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 91
 	public List<ITypeID> getResultTypeHints() {
@@ -121,7 +127,7 @@ public class ExpressionScope extends BaseScope {
121 127
 	@Override
122 128
 	public IPartialExpression get(CodePosition position, GenericName name) {
123 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 132
 		return outer.get(position, name);
127 133
 	}

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

@@ -48,18 +48,18 @@ public class ReturnStatement extends Statement {
48 48
 
49 49
 	@Override
50 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 52
 		return tValue == value ? this : new ReturnStatement(position, tValue);
53 53
 	}
54 54
 
55 55
 	@Override
56 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 58
 		return tValue == value ? this : new ReturnStatement(position, tValue);
59 59
 	}
60 60
 
61 61
 	@Override
62 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,7 +264,7 @@ public class DefinitionMemberGroup {
264 264
 				for (ITypeID resultHint : typeHints) {
265 265
 					Map<TypeParameter, ITypeID> mapping = new HashMap<>();
266 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 268
 						break;
269 269
 					}
270 270
 				}

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

@@ -9,6 +9,7 @@ import java.util.ArrayList;
9 9
 import java.util.HashMap;
10 10
 import java.util.List;
11 11
 import java.util.Map;
12
+import java.util.Set;
12 13
 import org.openzen.zencode.shared.CodePosition;
13 14
 import org.openzen.zencode.shared.CompileException;
14 15
 import org.openzen.zencode.shared.CompileExceptionCode;
@@ -23,6 +24,7 @@ import org.openzen.zenscript.codemodel.expression.NullExpression;
23 24
 import org.openzen.zenscript.codemodel.expression.SupertypeCastExpression;
24 25
 import org.openzen.zenscript.codemodel.expression.WrapOptionalExpression;
25 26
 import org.openzen.zenscript.codemodel.member.EnumConstantMember;
27
+import org.openzen.zenscript.codemodel.member.IDefinitionMember;
26 28
 import org.openzen.zenscript.codemodel.member.InnerDefinition;
27 29
 import org.openzen.zenscript.codemodel.member.ref.CasterMemberRef;
28 30
 import org.openzen.zenscript.codemodel.member.ref.ConstMemberRef;
@@ -142,6 +144,42 @@ public final class TypeMembers {
142 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 183
 	public void addConstructor(FunctionalMemberRef constructor, TypeMemberPriority priority) {
146 184
 		getOrCreateGroup(OperatorType.CONSTRUCTOR).addMethod(constructor, priority);
147 185
 	}

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

@@ -64,25 +64,25 @@ public class Module {
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 68
 		// TODO: load bracket parsers from host plugins
69 69
 		List<ParsedFile> files = new ArrayList<>();
70
-		parse(files, pkg, compilingPackage, null, sourceDirectory);
70
+		parse(files, compilingPackage, null, sourceDirectory);
71 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 75
 		for (File file : directory.listFiles()) {
76 76
 			if (file.getName().endsWith(".zs")) {
77 77
 				try {
78
-					files.add(ParsedFile.parse(pkg, compilingPackage, bracketParser, file));
78
+					files.add(ParsedFile.parse(pkg, bracketParser, file));
79 79
 				} catch (CompileException ex) {
80 80
 					exceptionLogger.accept(ex);
81 81
 				}
82 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,8 +90,7 @@ public class Module {
90 90
 	public static SemanticModule compileSyntaxToSemantic(
91 91
 			String name,
92 92
 			String[] dependencies,
93
-			ZSPackage pkg,
94
-			CompilingPackage compilingPkg,
93
+			CompilingPackage pkg,
95 94
 			ParsedFile[] files,
96 95
 			ModuleSpace registry,
97 96
 			Consumer<CompileException> exceptionLogger) {
@@ -117,15 +116,19 @@ public class Module {
117 116
 				registry.compilationUnit.globalTypeRegistry,
118 117
 				registry.getAnnotations(),
119 118
 				rootPackage,
120
-				compilingPkg,
119
+				pkg,
121 120
 				globals);
122 121
 		
122
+		for (ParsedFile file : files) {
123
+			file.registerTypes(moduleContext, rootPackage, pkg);
124
+		}
125
+		
123 126
 		for (ParsedFile file : files) {
124 127
 			// compileMembers will register all definition members to their
125 128
 			// respective definitions, such as fields, constructors, methods...
126 129
 			// It doesn't yet compile the method contents.
127 130
 			try {
128
-				file.compileTypes(moduleContext, rootPackage, compilingPkg);
131
+				file.compileTypes(moduleContext, rootPackage, pkg);
129 132
 			} catch (CompileException ex) {
130 133
 				exceptionLogger.accept(ex);
131 134
 				failed = true;
@@ -133,12 +136,12 @@ public class Module {
133 136
 		}
134 137
 		
135 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 141
 		// scripts will store all the script blocks encountered in the files
139 142
 		PrecompilationState precompiler = new PrecompilationState();
140 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 147
 		List<ScriptBlock> scripts = new ArrayList<>();
@@ -147,13 +150,13 @@ public class Module {
147 150
 			// into semantic code. This semantic code can then be compiled
148 151
 			// to various targets.
149 152
 			try {
150
-				file.compileCode(moduleContext, precompiler, rootPackage, compilingPkg, expansions, scripts, globals);
153
+				file.compileCode(moduleContext, precompiler, rootPackage, pkg, expansions, scripts, globals);
151 154
 			} catch (CompileException ex) {
152 155
 				exceptionLogger.accept(ex);
153 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,10 +76,10 @@ public class DirectoryModuleReference implements ModuleReference {
76 76
 
77 77
 			Module module = new Module(moduleName, directory, jsonFile, exceptionLogger);
78 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 84
 			JSONObject globals = json.optJSONObject("globals");
85 85
 			if (globals != null) {

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

@@ -46,7 +46,7 @@ public class JavaCompiler implements ZenCodeCompiler {
46 46
 
47 47
 	@Override
48 48
 	public void addDefinition(HighLevelDefinition definition, SemanticModule module) {
49
-		String className = getClassName(definition.position.filename);
49
+		String className = getClassName(definition.position.getFilename());
50 50
 		JavaScriptFile scriptFile = getScriptFile(className);
51 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,7 +84,7 @@ public class CompilerUtils {
84 84
 	}
85 85
 
86 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 90
 	public static void tagMethodParameters(FunctionHeader header, boolean isStatic) {
@@ -191,7 +191,7 @@ public class CompilerUtils {
191 191
 
192 192
 		@Override
193 193
 		public Integer acceptEnumConstant(EnumConstantSwitchValue value) {
194
-			return value.constant.value;
194
+			return value.constant.ordinal;
195 195
 		}
196 196
 
197 197
 		@Override

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

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

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

@@ -216,6 +216,11 @@ public class JavaPreDecrementVisitor implements ExpressionVisitor<Void> {
216 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 224
 	@Override
220 225
 	public Void visitGetStaticField(GetStaticFieldExpression expression) {
221 226
 		if (!expressionCompiler.checkAndGetFieldInfo(expression.field, false))

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

@@ -221,6 +221,11 @@ public class JavaPreIncrementVisitor implements ExpressionVisitor<Void> {
221 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 229
 	@Override
225 230
 	public Void visitGetStaticField(GetStaticFieldExpression expression) {
226 231
 		if (!expressionCompiler.checkAndGetFieldInfo(expression.field, false))

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

@@ -89,7 +89,7 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
89 89
 
90 90
 	@Override
91 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 94
 		final Type superType;
95 95
 		if (definition.getSuperType() == null)

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

@@ -215,7 +215,7 @@ public class JavaMemberVisitor implements MemberVisitor<Void> {
215 215
 				clinitWriter.newObject(internalName);
216 216
 				clinitWriter.dup();
217 217
 				clinitWriter.constant(constant.name);
218
-				clinitWriter.constant(constant.value);
218
+				clinitWriter.constant(constant.ordinal);
219 219
 				for (Expression argument : constant.constructor.arguments.arguments) {
220 220
 					argument.accept(clinitStatementVisitor.expressionVisitor);
221 221
 				}
@@ -233,7 +233,7 @@ public class JavaMemberVisitor implements MemberVisitor<Void> {
233 233
 
234 234
 			for (EnumConstantMember enumConstant : enumConstants) {
235 235
 				clinitWriter.dup();
236
-				clinitWriter.constant(enumConstant.value);
236
+				clinitWriter.constant(enumConstant.ordinal);
237 237
 				clinitWriter.getStaticField(definition.name, enumConstant.name, "L" + definition.name + ";");
238 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,6 +41,7 @@ import org.openzen.zenscript.codemodel.expression.FunctionExpression;
41 41
 import org.openzen.zenscript.codemodel.expression.GetFieldExpression;
42 42
 import org.openzen.zenscript.codemodel.expression.GetFunctionParameterExpression;
43 43
 import org.openzen.zenscript.codemodel.expression.GetLocalVariableExpression;
44
+import org.openzen.zenscript.codemodel.expression.GetMatchingVariantField;
44 45
 import org.openzen.zenscript.codemodel.expression.GetStaticFieldExpression;
45 46
 import org.openzen.zenscript.codemodel.expression.GetterExpression;
46 47
 import org.openzen.zenscript.codemodel.expression.GlobalCallExpression;
@@ -257,6 +258,11 @@ public class ExpressionHoistingChecker implements ExpressionVisitor<Boolean> {
257 258
 		return false;
258 259
 	}
259 260
 
261
+	@Override
262
+	public Boolean visitGetMatchingVariantField(GetMatchingVariantField expression) {
263
+		return false;
264
+	}
265
+
260 266
 	@Override
261 267
 	public Boolean visitGetStaticField(GetStaticFieldExpression expression) {
262 268
 		return false;

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

@@ -82,10 +82,11 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<Void> {
82 82
 	@Override
83 83
 	public Void visitClass(ClassDefinition definition) {
84 84
 		JavaSourceFileScope scope = createScope(definition);
85
+		JavaSourceClass cls = definition.getTag(JavaSourceClass.class);
85 86
 		
86 87
 		output.append(indent);
87 88
 		convertModifiers(definition.modifiers);
88
-		output.append("class ").append(definition.name);
89
+		output.append("class ").append(cls.getName());
89 90
 		JavaSourceUtils.formatTypeParameters(scope.typeVisitor, output, definition.genericParameters, false);
90 91
 		if (definition.getSuperType() != null) {
91 92
 			output.append(" extends ");
@@ -99,7 +100,7 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<Void> {
99 100
 			}
100 101
 		}
101 102
 		
102
-		if (mergedImplementations.size() > 0 || definition.isDestructible()) {
103
+		if (mergedImplementations.size() > 0 || cls.destructible) {
103 104
 			output.append(" implements ");
104 105
 			boolean first = true;
105 106
 			for (int i = 0; i < mergedImplementations.size(); i++) {
@@ -112,7 +113,7 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<Void> {
112 113
 				output.append(scope.type(implementation.type));
113 114
 			}
114 115
 			
115
-			if (definition.isDestructible()) {
116
+			if (cls.destructible) {
116 117
 				if (first)
117 118
 					first = false;
118 119
 				else
@@ -132,15 +133,28 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<Void> {
132 133
 	@Override
133 134
 	public Void visitInterface(InterfaceDefinition definition) {
134 135
 		JavaSourceFileScope scope = createScope(definition);
136
+		JavaSourceClass cls = definition.getTag(JavaSourceClass.class);
135 137
 		
136 138
 		output.append(indent);
137 139
 		convertModifiers(definition.modifiers | Modifiers.VIRTUAL); // to prevent 'final'
138
-		output.append("interface ").append(definition.name);
140
+		output.append("interface ").append(cls.getName());
139 141
 		JavaSourceUtils.formatTypeParameters(scope.typeVisitor, output, definition.genericParameters, false);
140
-			
142
+		
143
+		boolean firstExtends = true;
141 144
 		if (definition.isDestructible()) {
142 145
 			output.append(" extends ");
143 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 160
 		output.append(" {\n");
@@ -302,7 +316,7 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<Void> {
302 316
 				String name = option.types.length == 1 ? "value" : "value" + (i + 1);
303 317
 				output.append(scope.type(option.types[i])).append(' ').append(name);
304 318
 			}
305
-			output.append("){\n");
319
+			output.append(") {\n");
306 320
 			for (int i = 0; i < option.types.length; i++) {
307 321
 				if (i > 0)
308 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,7 +129,7 @@ public class JavaExpansionMemberCompiler extends BaseMemberCompiler {
129 129
 
130 130
 	@Override
131 131
 	public Void visitDestructor(DestructorMember member) {
132
-		throw new UnsupportedOperationException("Expansions cannot declare destructors");
132
+		return null; // ignore
133 133
 	}
134 134
 
135 135
 	@Override

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

@@ -13,6 +13,7 @@ import org.openzen.zenscript.codemodel.FunctionHeader;
13 13
 import org.openzen.zenscript.codemodel.FunctionParameter;
14 14
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
15 15
 import org.openzen.zenscript.codemodel.Modifiers;
16
+import org.openzen.zenscript.codemodel.definition.InterfaceDefinition;
16 17
 import org.openzen.zenscript.codemodel.member.CallerMember;
17 18
 import org.openzen.zenscript.codemodel.member.CasterMember;
18 19
 import org.openzen.zenscript.codemodel.member.ConstMember;
@@ -29,6 +30,7 @@ import org.openzen.zenscript.codemodel.member.MethodMember;
29 30
 import org.openzen.zenscript.codemodel.member.OperatorMember;
30 31
 import org.openzen.zenscript.codemodel.member.SetterMember;
31 32
 import org.openzen.zenscript.codemodel.member.StaticInitializerMember;
33
+import org.openzen.zenscript.codemodel.statement.BlockStatement;
32 34
 import org.openzen.zenscript.codemodel.statement.EmptyStatement;
33 35
 import org.openzen.zenscript.codemodel.statement.Statement;
34 36
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
@@ -166,7 +168,12 @@ public class JavaMemberCompiler extends BaseMemberCompiler {
166 168
 		
167 169
 		output.append(indent).append("@Override\n");
168 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 177
 		return null;
171 178
 	}
172 179
 
@@ -263,12 +270,6 @@ public class JavaMemberCompiler extends BaseMemberCompiler {
263 270
 	}
264 271
 	
265 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,6 +49,7 @@ import org.openzen.zenscript.codemodel.expression.FunctionExpression;
49 49
 import org.openzen.zenscript.codemodel.expression.GetFieldExpression;
50 50
 import org.openzen.zenscript.codemodel.expression.GetFunctionParameterExpression;
51 51
 import org.openzen.zenscript.codemodel.expression.GetLocalVariableExpression;
52
+import org.openzen.zenscript.codemodel.expression.GetMatchingVariantField;
52 53
 import org.openzen.zenscript.codemodel.expression.GetStaticFieldExpression;
53 54
 import org.openzen.zenscript.codemodel.expression.GetterExpression;
54 55
 import org.openzen.zenscript.codemodel.expression.GlobalCallExpression;
@@ -421,6 +422,11 @@ public class JavaSourceExpressionFormatter implements ExpressionVisitor<Expressi
421 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 430
 	@Override
425 431
 	public ExpressionString visitGetStaticField(GetStaticFieldExpression expression) {
426 432
 		JavaSourceField field = expression.field.getTag(JavaSourceField.class);
@@ -1680,7 +1686,7 @@ public class JavaSourceExpressionFormatter implements ExpressionVisitor<Expressi
1680 1686
 					throw new UnsupportedOperationException("Not yet supported!");
1681 1687
 				}
1682 1688
 			}
1683
-			case ARRAY_CONSTRUCTOR_PROJECTED_INDEXED:
1689
+			case ARRAY_CONSTRUCTOR_PROJECTED_INDEXED: {
1684 1690
 				ArrayTypeID type = (ArrayTypeID) expression.type;
1685 1691
 				
1686 1692
 				if (type.dimension == 1) {
@@ -1759,6 +1765,9 @@ public class JavaSourceExpressionFormatter implements ExpressionVisitor<Expressi
1759 1765
 					// TODO: implement
1760 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 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,15 +140,15 @@ public class JavaSourceStatementFormatter implements StatementFormatter.Formatte
140 140
 				String header = switchValue == null ? "default:" : "case " + switchValue.option.getName() + ":";
141 141
 				List<String> statements = new ArrayList<>();
142 142
 				if (switchValue != null) {
143
-					for (VarStatement var : switchValue.parameters) {
143
+					for (int i = 0; i < switchValue.parameters.length; i++) {
144 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 146
 						if (variant.genericParameters != null && variant.genericParameters.length > 0) {
147 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 150
 									statementOutput.append(", ");
151
-								statementOutput.append(scope.type(variantType.typeParameters[i]));
151
+								statementOutput.append(scope.type(variantType.typeParameters[j]));
152 152
 							}
153 153
 							statementOutput.append(">");
154 154
 						}

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

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

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

@@ -25,6 +25,7 @@ import org.openzen.zenscript.codemodel.member.MethodMember;
25 25
 import org.openzen.zenscript.codemodel.member.OperatorMember;
26 26
 import org.openzen.zenscript.codemodel.member.SetterMember;
27 27
 import org.openzen.zenscript.codemodel.member.StaticInitializerMember;
28
+import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
28 29
 import org.openzen.zenscript.javasource.JavaSourceTypeNameVisitor;
29 30
 import org.openzen.zenscript.javasource.tags.JavaSourceClass;
30 31
 import org.openzen.zenscript.javasource.tags.JavaSourceField;
@@ -36,19 +37,32 @@ import org.openzen.zenscript.javasource.tags.JavaSourceMethod;
36 37
  * @author Hoofdgebruiker
37 38
  */
38 39
 public class JavaSourcePrepareClassMethodVisitor implements MemberVisitor<Void> {
40
+	private static final boolean DEBUG_EMPTY = true;
41
+	
42
+	private final JavaSourcePrepareDefinitionVisitor definitionPreparer;
39 43
 	private final String filename;
40 44
 	private final JavaSourceClass cls;
41 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 54
 		this.filename = filename;
45 55
 		this.cls = cls;
46 56
 		this.nativeClass = nativeClass;
57
+		
47 58
 		cls.empty = startsEmpty;
48 59
 	}
49 60
 	
50 61
 	@Override
51 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 66
 		cls.empty = false;
53 67
 		member.setTag(JavaSourceField.class, new JavaSourceField(cls, member.name));
54 68
 		return null;
@@ -56,7 +70,6 @@ public class JavaSourcePrepareClassMethodVisitor implements MemberVisitor<Void>
56 70
 	
57 71
 	@Override
58 72
 	public Void visitField(FieldMember member) {
59
-		cls.empty = false;
60 73
 		member.setTag(JavaSourceField.class, new JavaSourceField(cls, member.name));
61 74
 		if (member.hasAutoGetter())
62 75
 			visitGetter(member.autoGetter);
@@ -74,6 +87,9 @@ public class JavaSourcePrepareClassMethodVisitor implements MemberVisitor<Void>
74 87
 
75 88
 	@Override
76 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 93
 		cls.empty = false;
78 94
 		return null;
79 95
 	}
@@ -122,16 +138,22 @@ public class JavaSourcePrepareClassMethodVisitor implements MemberVisitor<Void>
122 138
 
123 139
 	@Override
124 140
 	public Void visitImplementation(ImplementationMember member) {
125
-		cls.empty = false;
141
+		definitionPreparer.prepare(member.type);
142
+		
126 143
 		if (canMergeImplementation(member)) {
127 144
 			member.setTag(JavaSourceImplementation.class, new JavaSourceImplementation(true, cls));
128 145
 			for (IDefinitionMember m : member.members)
129 146
 				m.accept(this);
130 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 153
 			JavaSourceClass implementationClass = new JavaSourceClass(cls, member.type.accept(new JavaSourceTypeNameVisitor()) + "Implementation");
132 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 157
 			for (IDefinitionMember m : member.members)
136 158
 				m.accept(visitor);
137 159
 		}
@@ -147,12 +169,17 @@ public class JavaSourcePrepareClassMethodVisitor implements MemberVisitor<Void>
147 169
 		JavaSourcePrepareDefinitionVisitor innerDefinitionPrepare = new JavaSourcePrepareDefinitionVisitor(filename, cls);
148 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 174
 		cls.empty = false;
151 175
 		return null;
152 176
 	}
153 177
 
154 178
 	@Override
155 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 183
 		cls.empty = false;
157 184
 		return null;
158 185
 	}
@@ -252,11 +279,24 @@ public class JavaSourcePrepareClassMethodVisitor implements MemberVisitor<Void>
252 279
 		JavaSourceMethod method = null;
253 280
 		if (nativeTag != null && nativeClass != null)
254 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 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 298
 			cls.empty = false;
299
+		}
260 300
 		
261 301
 		member.setTag(JavaSourceMethod.class, method);
262 302
 	}

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

@@ -22,6 +22,8 @@ import org.openzen.zenscript.codemodel.expression.CallExpression;
22 22
 import org.openzen.zenscript.codemodel.expression.CastExpression;
23 23
 import org.openzen.zenscript.codemodel.expression.Expression;
24 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 27
 import org.openzen.zenscript.formattershared.ExpressionString;
26 28
 import org.openzen.zenscript.javasource.JavaOperator;
27 29
 import org.openzen.zenscript.javasource.tags.JavaSourceClass;
@@ -68,15 +70,30 @@ public class JavaSourcePrepareDefinitionVisitor implements DefinitionVisitor<Jav
68 70
 			list.addInstanceMethod("insert", "add");
69 71
 			list.addInstanceMethod("remove", "remove");
70 72
 			list.addInstanceMethod("indexOf", "indexOf");
73
+			list.addInstanceMethod("lastIndexOf", "lastIndexOf");
71 74
 			list.addInstanceMethod("getAtIndex", "get");
72 75
 			list.addInstanceMethod("setAtIndex", "set");
73 76
 			list.addInstanceMethod("contains", "contains");
74 77
 			list.addMethod("toArray", new JavaSourceMethod((formatter, call) -> formatter.listToArray((CastExpression)call)));
75
-			list.addInstanceMethod("length", "length");
78
+			list.addInstanceMethod("length", "size");
76 79
 			list.addInstanceMethod("isEmpty", "isEmpty");
80
+			list.addInstanceMethod("iterate", "iterator");
77 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 98
 			JavaNativeClass comparable = new JavaNativeClass(new JavaSourceClass("java.lang", "Comparable"));
82 99
 			comparable.addInstanceMethod("compareTo", "compareTo");
@@ -184,8 +201,8 @@ public class JavaSourcePrepareDefinitionVisitor implements DefinitionVisitor<Jav
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 206
 			cls.addInstanceMethod("destructor", "close");
190 207
 			cls.addInstanceMethod("readCharacter", "read");
191 208
 			cls.addInstanceMethod("readSlice", "read");
@@ -201,28 +218,58 @@ public class JavaSourcePrepareDefinitionVisitor implements DefinitionVisitor<Jav
201 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 233
 	@Override
205 234
 	public JavaSourceClass visitClass(ClassDefinition definition) {
235
+		if (isPrepared(definition))
236
+			return definition.getTag(JavaSourceClass.class);
237
+		
206 238
 		return visitClassCompiled(definition, true);
207 239
 	}
208 240
 
209 241
 	@Override
210 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 249
 		return visitClassCompiled(definition, true);
212 250
 	}
213 251
 
214 252
 	@Override
215 253
 	public JavaSourceClass visitEnum(EnumDefinition definition) {
254
+		if (isPrepared(definition))
255
+			return definition.getTag(JavaSourceClass.class);
256
+		
216 257
 		return visitClassCompiled(definition, false);
217 258
 	}
218 259
 
219 260
 	@Override
220 261
 	public JavaSourceClass visitStruct(StructDefinition definition) {
262
+		if (isPrepared(definition))
263
+			return definition.getTag(JavaSourceClass.class);
264
+		
221 265
 		return visitClassCompiled(definition, true);
222 266
 	}
223 267
 
224 268
 	@Override
225 269
 	public JavaSourceClass visitFunction(FunctionDefinition definition) {
270
+		if (isPrepared(definition))
271
+			return definition.getTag(JavaSourceClass.class);
272
+		
226 273
 		JavaSourceClass cls = new JavaSourceClass(definition.pkg.fullName, filename);
227 274
 		definition.setTag(JavaSourceClass.class, cls);
228 275
 		JavaSourceMethod method = new JavaSourceMethod(cls, JavaSourceMethod.Kind.STATIC, definition.name, true);
@@ -232,6 +279,9 @@ public class JavaSourcePrepareDefinitionVisitor implements DefinitionVisitor<Jav
232 279
 
233 280
 	@Override
234 281
 	public JavaSourceClass visitExpansion(ExpansionDefinition definition) {
282
+		if (isPrepared(definition))
283
+			return definition.getTag(JavaSourceClass.class);
284
+		
235 285
 		NativeTag nativeTag = definition.getTag(NativeTag.class);
236 286
 		JavaNativeClass nativeClass = null;
237 287
 		if (nativeTag != null) {
@@ -252,6 +302,9 @@ public class JavaSourcePrepareDefinitionVisitor implements DefinitionVisitor<Jav
252 302
 
253 303
 	@Override
254 304
 	public JavaSourceClass visitVariant(VariantDefinition variant) {
305
+		if (isPrepared(variant))
306
+			return variant.getTag(JavaSourceClass.class);
307
+		
255 308
 		JavaSourceClass cls = new JavaSourceClass(variant.pkg.fullName, variant.name);
256 309
 		variant.setTag(JavaSourceClass.class, cls);
257 310
 		
@@ -265,10 +318,14 @@ public class JavaSourcePrepareDefinitionVisitor implements DefinitionVisitor<Jav
265 318
 	}
266 319
 	
267 320
 	private JavaSourceClass visitClassCompiled(HighLevelDefinition definition, boolean startsEmpty) {
321
+		if (definition.getSuperType() != null)
322
+			prepare(definition.getSuperType());
323
+		
268 324
 		NativeTag nativeTag = definition.getTag(NativeTag.class);
269 325
 		JavaNativeClass nativeClass = nativeTag == null ? null : nativeClasses.get(nativeTag.value);
270 326
 		if (nativeClass == null) {
271 327
 			JavaSourceClass cls = outerClass == null ? new JavaSourceClass(definition.pkg.fullName, definition.name) : new JavaSourceClass(outerClass, definition.name);
328
+			cls.destructible = definition.isDestructible();
272 329
 			definition.setTag(JavaSourceClass.class, cls);
273 330
 			visitClassMembers(definition, cls, null, startsEmpty);
274 331
 			return cls;
@@ -277,12 +334,16 @@ public class JavaSourcePrepareDefinitionVisitor implements DefinitionVisitor<Jav
277 334
 			definition.setTag(JavaSourceClass.class, nativeClass.cls);
278 335
 			definition.setTag(JavaNativeClass.class, nativeClass);
279 336
 			visitExpansionMembers(definition, cls, nativeClass);
337
+			
338
+			if (nativeClass.nonDestructible)
339
+				cls.destructible = false;
340
+			
280 341
 			return cls;
281 342
 		}
282 343
 	}
283 344
 	
284 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 347
 		for (IDefinitionMember member : definition.members) {
287 348
 			member.accept(methodVisitor);
288 349
 		}

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

@@ -36,6 +36,8 @@ import org.openzen.zenscript.javasource.tags.JavaSourceMethod;
36 36
  * @author Hoofdgebruiker
37 37
  */
38 38
 public class JavaSourcePrepareExpansionMethodVisitor implements MemberVisitor<Void> {
39
+	private static final boolean DEBUG_EMPTY = true;
40
+	
39 41
 	private final JavaSourceClass cls;
40 42
 	private final JavaNativeClass nativeClass;
41 43
 	
@@ -48,6 +50,10 @@ public class JavaSourcePrepareExpansionMethodVisitor implements MemberVisitor<Vo
48 50
 	@Override
49 51
 	public Void visitConst(ConstMember member) {
50 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 57
 		cls.empty = false;
52 58
 		return null;
53 59
 	}
@@ -69,6 +75,9 @@ public class JavaSourcePrepareExpansionMethodVisitor implements MemberVisitor<Vo
69 75
 
70 76
 	@Override
71 77
 	public Void visitDestructor(DestructorMember member) {
78
+		if (nativeClass != null && nativeClass.nonDestructible)
79
+			return null;
80
+		
72 81
 		visitFunctional(member, "");
73 82
 		return null;
74 83
 	}
@@ -146,8 +155,12 @@ public class JavaSourcePrepareExpansionMethodVisitor implements MemberVisitor<Vo
146 155
 		if (method == null)
147 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 162
 			cls.empty = false;
163
+		}
151 164
 		
152 165
 		member.setTag(JavaSourceMethod.class, method);
153 166
 	}

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

@@ -17,7 +17,8 @@ public enum ZSTokenType implements TokenType {
17 17
 	T_WHITESPACE_TAB(true, "\t", "\t"),
18 18
 	T_WHITESPACE_NEWLINE(true, "\n", "\n", true),
19 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 22
 	T_FLOAT("\\-?(0|[1-9][0-9]*)\\.[0-9]+([eE][\\+\\-]?[0-9]+)?"),
22 23
 	T_INT("\\-?(0|[1-9][0-9]*)"),
23 24
 	T_STRING_SQ("\"([^\"\\\\\\n]|\\\\([\'\"\\\\/bfnrt&]|u[0-9a-fA-F]{4}))*\""),
@@ -94,6 +95,7 @@ public enum ZSTokenType implements TokenType {
94 95
 	K_PRIVATE(true, "private"),
95 96
 	K_PUBLIC(true, "public"),
96 97
 	K_EXPORT(true, "export"),
98
+	K_INTERNAL(true, "internal"),
97 99
 	K_STATIC(true, "static"),
98 100
 	K_PROTECTED(true, "protected"),
99 101
 	K_IMPLICIT(true, "implicit"),

+ 8
- 5
Parser/src/main/java/org/openzen/zenscript/parser/ParsedDefinition.java View File

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

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

@@ -16,7 +16,6 @@ import org.openzen.zencode.shared.CompileExceptionCode;
16 16
 import org.openzen.zencode.shared.FileSourceFile;
17 17
 import org.openzen.zencode.shared.LiteralSourceFile;
18 18
 import org.openzen.zencode.shared.SourceFile;
19
-import org.openzen.zenscript.codemodel.annotations.AnnotationDefinition;
20 19
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
21 20
 import org.openzen.zenscript.codemodel.Modifiers;
22 21
 import org.openzen.zenscript.codemodel.PackageDefinitions;
@@ -28,7 +27,6 @@ import org.openzen.zenscript.codemodel.context.ModuleTypeResolutionContext;
28 27
 import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
29 28
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
30 29
 import org.openzen.zenscript.codemodel.statement.Statement;
31
-import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
32 30
 import org.openzen.zenscript.lexer.ZSTokenParser;
33 31
 import static org.openzen.zenscript.lexer.ZSTokenType.*;
34 32
 import org.openzen.zenscript.codemodel.scope.FileScope;
@@ -42,24 +40,24 @@ import org.openzen.zenscript.parser.statements.ParsedStatement;
42 40
  * @author Hoofdgebruiker
43 41
  */
44 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 48
 		try {
51
-			return parse(pkg, compilingPackage, bracketParser, new LiteralSourceFile(filename, content));
49
+			return parse(compilingPackage, bracketParser, new LiteralSourceFile(filename, content));
52 50
 		} catch (IOException ex) {
53 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 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 61
 		ParsedFile result = new ParsedFile(tokens.getFile());
64 62
 
65 63
 		while (true) {
@@ -106,15 +104,12 @@ public class ParsedFile {
106 104
 			} else if ((tokens.optional(EOF)) != null) {
107 105
 				break;
108 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 108
 				if (definition == null) {
111 109
 					result.statements.add(ParsedStatement.parse(tokens, annotations));
112 110
 				} else {
113 111
 					result.definitions.add(definition);
114 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,14 +143,33 @@ public class ParsedFile {
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 159
 	public void compileTypes(
152 160
 			ModuleTypeResolutionContext moduleContext,
153 161
 			ZSPackage rootPackage,
154 162
 			CompilingPackage modulePackage) {
155
-		FileResolutionContext context = new FileResolutionContext(moduleContext);
163
+		FileResolutionContext context = new FileResolutionContext(moduleContext, modulePackage);
156 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 171
 		for (ParsedDefinition definition : this.definitions) {
158
-			definition.linkTypes(context);
172
+			definition.getCompiling(context).load();
159 173
 		}
160 174
 	}
161 175
 	
@@ -166,7 +180,7 @@ public class ParsedFile {
166 180
 			CompilingPackage modulePackage,
167 181
 			List<ExpansionDefinition> expansions,
168 182
 			Map<String, ISymbol> globals) {
169
-		FileResolutionContext context = new FileResolutionContext(moduleContext);
183
+		FileResolutionContext context = new FileResolutionContext(moduleContext, modulePackage);
170 184
 		loadImports(context, rootPackage, modulePackage);
171 185
 		
172 186
 		FileScope scope = new FileScope(context, expansions, globals, precompiler);
@@ -183,7 +197,7 @@ public class ParsedFile {
183 197
 			List<ExpansionDefinition> expansions,
184 198
 			List<ScriptBlock> scripts,
185 199
 			Map<String, ISymbol> globals) {
186
-		FileResolutionContext context = new FileResolutionContext(moduleContext);
200
+		FileResolutionContext context = new FileResolutionContext(moduleContext, modulePackage);
187 201
 		loadImports(context, rootPackage, modulePackage);
188 202
 		
189 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,6 +11,7 @@ import java.util.List;
11 11
 import java.util.Map;
12 12
 import org.openzen.zencode.shared.CodePosition;
13 13
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
14
+import org.openzen.zenscript.codemodel.context.CompilingPackage;
14 15
 import org.openzen.zenscript.codemodel.context.CompilingType;
15 16
 import org.openzen.zenscript.codemodel.context.LocalTypeResolutionContext;
16 17
 import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
@@ -28,11 +29,11 @@ import org.openzen.zenscript.parser.member.ParsedDefinitionMember;
28 29
 public abstract class BaseParsedDefinition extends ParsedDefinition {
29 30
 	protected final List<ParsedDefinitionMember> members = new ArrayList<>();
30 31
 	private boolean typesCompiled = false;
31
-	private final Map<String, CompilingType> innerTypes = new HashMap<>();
32
+	private final Map<String, ParsedDefinition> innerTypes = new HashMap<>();
32 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 39
 	public void addMember(ParsedDefinitionMember member) {
@@ -47,8 +48,7 @@ public abstract class BaseParsedDefinition extends ParsedDefinition {
47 48
 		typesCompiled = true;
48 49
 		
49 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 54
 	protected void linkTypesLocal(TypeResolutionContext localContext) {
@@ -79,15 +79,31 @@ public abstract class BaseParsedDefinition extends ParsedDefinition {
79 79
 		for (ParsedDefinitionMember member : members)
80 80
 			member.compile(innerScope);
81 81
 	}
82
-	
82
+
83 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,11 +8,11 @@ package org.openzen.zenscript.parser.definitions;
8 8
 import java.util.List;
9 9
 import org.openzen.zencode.shared.CodePosition;
10 10
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
11
+import org.openzen.zenscript.codemodel.context.CompilingPackage;
11 12
 import org.openzen.zenscript.codemodel.context.CompilingType;
12 13
 import org.openzen.zenscript.codemodel.context.LocalTypeResolutionContext;
13 14
 import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
14 15
 import org.openzen.zenscript.codemodel.definition.AliasDefinition;
15
-import org.openzen.zenscript.codemodel.definition.ZSPackage;
16 16
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
17 17
 import org.openzen.zenscript.lexer.ZSTokenParser;
18 18
 import org.openzen.zenscript.lexer.ZSTokenType;
@@ -27,7 +27,7 @@ import org.openzen.zenscript.parser.type.IParsedType;
27 27
  * @author Hoofdgebruiker
28 28
  */
29 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 31
 		String name = tokens.required(ZSTokenType.T_IDENTIFIER, "identifier expected").content;
32 32
 		List<ParsedTypeParameter> parameters = ParsedTypeParameter.parseAll(tokens);
33 33
 		tokens.required(ZSTokenType.K_AS, "as expected");
@@ -43,14 +43,14 @@ public class ParsedAlias extends ParsedDefinition {
43 43
 	private final AliasDefinition compiled;
44 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 49
 		this.name = name;
50 50
 		this.parameters = parameters;
51 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 55
 		if (parameters != null && parameters.size() > 0) {
56 56
 			TypeParameter[] typeParameters = new TypeParameter[parameters.size()];
@@ -67,14 +67,13 @@ public class ParsedAlias extends ParsedDefinition {
67 67
 			return;
68 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 72
 		for (int i = 0; i < compiled.genericParameters.length; i++) {
74 73
 			TypeParameter output = compiled.genericParameters[i];
75 74
 			ParsedTypeParameter input = this.parameters.get(i);
76 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,14 +94,27 @@ public class ParsedAlias extends ParsedDefinition {
95 94
 	}
96 95
 
97 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,9 +8,9 @@ package org.openzen.zenscript.parser.definitions;
8 8
 import java.util.List;
9 9
 import org.openzen.zencode.shared.CodePosition;
10 10
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
11
+import org.openzen.zenscript.codemodel.context.CompilingPackage;
11 12
 import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
12 13
 import org.openzen.zenscript.codemodel.definition.ClassDefinition;
13
-import org.openzen.zenscript.codemodel.definition.ZSPackage;
14 14
 import org.openzen.zenscript.lexer.ZSTokenParser;
15 15
 import org.openzen.zenscript.lexer.ZSTokenType;
16 16
 import org.openzen.zenscript.parser.ParsedAnnotation;
@@ -22,7 +22,7 @@ import org.openzen.zenscript.parser.type.IParsedType;
22 22
  * @author Stan Hebben
23 23
  */
24 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 26
 		String name = tokens.required(ZSTokenType.T_IDENTIFIER, "identifier expected").content;
27 27
 		List<ParsedTypeParameter> genericParameters = ParsedTypeParameter.parseAll(tokens);
28 28
 		
@@ -35,24 +35,24 @@ public class ParsedClass extends BaseParsedDefinition {
35 35
 		
36 36
 		ParsedClass result = new ParsedClass(pkg, position, modifiers, annotations, name, genericParameters, superclass, outerDefinition);
37 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 40
 		return result;
41 41
 	}
42 42
 	
43
-	private final List<ParsedTypeParameter> genericParameters;
43
+	private final List<ParsedTypeParameter> parameters;
44 44
 	private final IParsedType superclass;
45 45
 	
46 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 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 58
 	@Override
@@ -62,6 +62,8 @@ public class ParsedClass extends BaseParsedDefinition {
62 62
 
63 63
 	@Override
64 64
 	protected void linkTypesLocal(TypeResolutionContext context) {
65
+		ParsedTypeParameter.compile(context, compiled.genericParameters, this.parameters);
66
+		
65 67
 		if (superclass != null)
66 68
 			compiled.setSuperType(superclass.compile(context));
67 69
 		

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

@@ -9,9 +9,9 @@ import java.util.ArrayList;
9 9
 import java.util.List;
10 10
 import org.openzen.zencode.shared.CodePosition;
11 11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
+import org.openzen.zenscript.codemodel.context.CompilingPackage;
12 13
 import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
13 14
 import org.openzen.zenscript.codemodel.definition.EnumDefinition;
14
-import org.openzen.zenscript.codemodel.definition.ZSPackage;
15 15
 import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
16 16
 import org.openzen.zenscript.codemodel.type.ITypeID;
17 17
 import org.openzen.zenscript.lexer.ZSTokenParser;
@@ -19,7 +19,6 @@ import org.openzen.zenscript.lexer.ZSTokenType;
19 19
 import org.openzen.zenscript.codemodel.scope.BaseScope;
20 20
 import org.openzen.zenscript.codemodel.scope.ExpressionScope;
21 21
 import org.openzen.zenscript.parser.ParsedAnnotation;
22
-import org.openzen.zenscript.parser.PrecompilationState;
23 22
 import org.openzen.zenscript.parser.member.ParsedDefinitionMember;
24 23
 
25 24
 /**
@@ -27,7 +26,7 @@ import org.openzen.zenscript.parser.member.ParsedDefinitionMember;
27 26
  * @author Hoofdgebruiker
28 27
  */
29 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 30
 		String name = tokens.required(ZSTokenType.T_IDENTIFIER, "identifier expected").content;
32 31
 		tokens.required(ZSTokenType.T_AOPEN, "{ expected");
33 32
 		
@@ -41,7 +40,7 @@ public class ParsedEnum extends BaseParsedDefinition {
41 40
 		
42 41
 		if (tokens.optional(ZSTokenType.T_SEMICOLON) != null) {
43 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 45
 		} else {
47 46
 			tokens.required(ZSTokenType.T_ACLOSE, "} expected");
@@ -53,10 +52,10 @@ public class ParsedEnum extends BaseParsedDefinition {
53 52
 	
54 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 61
 	public void addEnumValue(ParsedEnumConstant value) {

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

@@ -10,14 +10,11 @@ import org.openzen.zencode.shared.CodePosition;
10 10
 import org.openzen.zencode.shared.CompileException;
11 11
 import org.openzen.zencode.shared.CompileExceptionCode;
12 12
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
13
-import org.openzen.zenscript.codemodel.context.LocalTypeResolutionContext;
13
+import org.openzen.zenscript.codemodel.context.CompilingPackage;
14 14
 import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
15 15
 import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
16
-import org.openzen.zenscript.codemodel.definition.ZSPackage;
17 16
 import org.openzen.zenscript.lexer.ZSTokenParser;
18 17
 import org.openzen.zenscript.lexer.ZSTokenType;
19
-import org.openzen.zenscript.codemodel.scope.BaseScope;
20
-import org.openzen.zenscript.codemodel.scope.GenericFunctionScope;
21 18
 import org.openzen.zenscript.parser.ParsedAnnotation;
22 19
 import org.openzen.zenscript.parser.member.ParsedDefinitionMember;
23 20
 import org.openzen.zenscript.parser.type.IParsedType;
@@ -27,14 +24,14 @@ import org.openzen.zenscript.parser.type.IParsedType;
27 24
  * @author Hoofdgebruiker
28 25
  */
29 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 28
 		List<ParsedTypeParameter> parameters = ParsedTypeParameter.parseAll(tokens);
32 29
 		IParsedType target = IParsedType.parse(tokens);
33 30
 		tokens.required(ZSTokenType.T_AOPEN, "{ expected");
34 31
 		
35 32
 		ParsedExpansion result = new ParsedExpansion(pkg, position, modifiers, annotations, parameters, target, outerDefinition);
36 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 36
 		return result;
40 37
 	}
@@ -43,13 +40,13 @@ public class ParsedExpansion extends BaseParsedDefinition {
43 40
 	private final IParsedType target;
44 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 46
 		this.parameters = genericParameters;
50 47
 		this.target = target;
51 48
 		
52
-		compiled = new ExpansionDefinition(position, pkg, modifiers, outerDefinition);
49
+		compiled = new ExpansionDefinition(position, pkg.getPackage(), modifiers, outerDefinition);
53 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,10 +9,10 @@ package org.openzen.zenscript.parser.definitions;
9 9
 import org.openzen.zencode.shared.CodePosition;
10 10
 import static org.openzen.zenscript.lexer.ZSTokenType.*;
11 11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
+import org.openzen.zenscript.codemodel.context.CompilingPackage;
12 13
 import org.openzen.zenscript.codemodel.context.CompilingType;
13 14
 import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
14 15
 import org.openzen.zenscript.codemodel.definition.FunctionDefinition;
15
-import org.openzen.zenscript.codemodel.definition.ZSPackage;
16 16
 import org.openzen.zenscript.lexer.ZSTokenParser;
17 17
 import org.openzen.zenscript.codemodel.scope.BaseScope;
18 18
 import org.openzen.zenscript.codemodel.scope.FunctionScope;
@@ -28,7 +28,7 @@ import org.openzen.zenscript.parser.statements.ParsedStatement;
28 28
  * @author Stanneke
29 29
  */
30 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 32
 		String name = parser.required(T_IDENTIFIER, "identifier expected").content;
33 33
 		ParsedFunctionHeader header = ParsedFunctionHeader.parse(parser);
34 34
 		ParsedFunctionBody body = ParsedStatement.parseFunctionBody(parser);
@@ -40,13 +40,13 @@ public class ParsedFunction extends ParsedDefinition {
40 40
 
41 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 46
 		this.header = header;
47 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 52
 	@Override
@@ -75,12 +75,25 @@ public class ParsedFunction extends ParsedDefinition {
75 75
 	}
76 76
 
77 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,9 +10,9 @@ import java.util.Collections;
10 10
 import java.util.List;
11 11
 import org.openzen.zencode.shared.CodePosition;
12 12
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
13
+import org.openzen.zenscript.codemodel.context.CompilingPackage;
13 14
 import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
14 15
 import org.openzen.zenscript.codemodel.definition.InterfaceDefinition;
15
-import org.openzen.zenscript.codemodel.definition.ZSPackage;
16 16
 import org.openzen.zenscript.lexer.ZSTokenParser;
17 17
 import org.openzen.zenscript.lexer.ZSTokenType;
18 18
 import org.openzen.zenscript.parser.ParsedAnnotation;
@@ -24,7 +24,7 @@ import org.openzen.zenscript.parser.type.IParsedType;
24 24
  * @author Hoofdgebruiker
25 25
  */
26 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 28
 		String name = tokens.required(ZSTokenType.T_IDENTIFIER, "identifier expected").content;
29 29
 		List<ParsedTypeParameter> genericParameters = ParsedTypeParameter.parseAll(tokens);
30 30
 		List<IParsedType> superInterfaces = Collections.emptyList();
@@ -39,7 +39,7 @@ public class ParsedInterface extends BaseParsedDefinition {
39 39
 		
40 40
 		ParsedInterface result = new ParsedInterface(pkg, position, modifiers, annotations, name, genericParameters, superInterfaces, outerDefinition);
41 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 44
 		return result;
45 45
 	}
@@ -49,13 +49,13 @@ public class ParsedInterface extends BaseParsedDefinition {
49 49
 	
50 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 55
 		this.typeParameters = typeParameters;
56 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 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,12 +8,11 @@ package org.openzen.zenscript.parser.definitions;
8 8
 import java.util.List;
9 9
 import org.openzen.zencode.shared.CodePosition;
10 10
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
11
+import org.openzen.zenscript.codemodel.context.CompilingPackage;
11 12
 import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
12 13
 import org.openzen.zenscript.codemodel.definition.StructDefinition;
13
-import org.openzen.zenscript.codemodel.definition.ZSPackage;
14 14
 import org.openzen.zenscript.lexer.ZSTokenParser;
15 15
 import org.openzen.zenscript.lexer.ZSTokenType;
16
-import org.openzen.zenscript.codemodel.scope.BaseScope;
17 16
 import org.openzen.zenscript.parser.ParsedAnnotation;
18 17
 import org.openzen.zenscript.parser.member.ParsedDefinitionMember;
19 18
 
@@ -22,7 +21,7 @@ import org.openzen.zenscript.parser.member.ParsedDefinitionMember;
22 21
  * @author Hoofdgebruiker
23 22
  */
24 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 25
 		String name = tokens.required(ZSTokenType.T_IDENTIFIER, "identifier expected").content;
27 26
 		List<ParsedTypeParameter> parameters = ParsedTypeParameter.parseAll(tokens);
28 27
 		
@@ -30,7 +29,7 @@ public class ParsedStruct extends BaseParsedDefinition {
30 29
 		
31 30
 		ParsedStruct result = new ParsedStruct(pkg, position, modifiers, annotations, name, parameters, outerDefinition);
32 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 34
 		return result;
36 35
 	}
@@ -39,12 +38,12 @@ public class ParsedStruct extends BaseParsedDefinition {
39 38
 	
40 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 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 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,9 +9,9 @@ import java.util.ArrayList;
9 9
 import java.util.List;
10 10
 import org.openzen.zencode.shared.CodePosition;
11 11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
+import org.openzen.zenscript.codemodel.context.CompilingPackage;
12 13
 import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
13 14
 import org.openzen.zenscript.codemodel.definition.VariantDefinition;
14
-import org.openzen.zenscript.codemodel.definition.ZSPackage;
15 15
 import org.openzen.zenscript.lexer.ZSTokenParser;
16 16
 import org.openzen.zenscript.lexer.ZSTokenType;
17 17
 import org.openzen.zenscript.parser.ParsedAnnotation;
@@ -23,13 +23,14 @@ import org.openzen.zenscript.parser.type.IParsedType;
23 23
  * @author Hoofdgebruiker
24 24
  */
25 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 27
 		String name = tokens.required(ZSTokenType.T_IDENTIFIER, "identifier expected").content;
28 28
 		List<ParsedTypeParameter> typeParameters = ParsedTypeParameter.parseAll(tokens);
29 29
 		tokens.required(ZSTokenType.T_AOPEN, "{ expected");
30 30
 		
31 31
 		ParsedVariant result = new ParsedVariant(pkg, position, modifiers, annotations, name, typeParameters, outerDefinition);
32 32
 		
33
+		int ordinal = 0;
33 34
 		while (!tokens.isNext(ZSTokenType.T_ACLOSE) && !tokens.isNext(ZSTokenType.T_SEMICOLON)) {
34 35
 			String optionName = tokens.required(ZSTokenType.T_IDENTIFIER, "identifier expected").content;
35 36
 			List<IParsedType> types = new ArrayList<>();
@@ -40,14 +41,14 @@ public class ParsedVariant extends BaseParsedDefinition {
40 41
 				}
41 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 45
 			if (tokens.optional(ZSTokenType.T_COMMA) == null)
45 46
 				break;
46 47
 		}
47 48
 		
48 49
 		if (tokens.optional(ZSTokenType.T_SEMICOLON) != null) {
49 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 53
 		} else {
53 54
 			tokens.required(ZSTokenType.T_ACLOSE, "} expected");
@@ -60,11 +61,11 @@ public class ParsedVariant extends BaseParsedDefinition {
60 61
 	
61 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 67
 		this.typeParameters = typeParameters;
67
-		compiled = new VariantDefinition(position, pkg, name, modifiers, outerDefinition);
68
+		compiled = new VariantDefinition(position, pkg.getPackage(), name, modifiers, outerDefinition);
68 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,7 +9,6 @@ import java.util.List;
9 9
 import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
10 10
 import org.openzen.zenscript.codemodel.definition.VariantDefinition;
11 11
 import org.openzen.zenscript.codemodel.type.ITypeID;
12
-import org.openzen.zenscript.codemodel.scope.BaseScope;
13 12
 import org.openzen.zenscript.parser.type.IParsedType;
14 13
 
15 14
 /**
@@ -18,10 +17,12 @@ import org.openzen.zenscript.parser.type.IParsedType;
18 17
  */
19 18
 public class ParsedVariantOption {
20 19
 	public final String name;
20
+	public final int ordinal;
21 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 24
 		this.name = name;
25
+		this.ordinal = ordinal;
25 26
 		this.types = types;
26 27
 	}
27 28
 	
@@ -30,6 +31,6 @@ public class ParsedVariantOption {
30 31
 		for (int i = 0; i < cTypes.length; i++)
31 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,7 +21,6 @@ import org.openzen.zenscript.codemodel.expression.switchvalue.VariantOptionSwitc
21 21
 import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
22 22
 import org.openzen.zenscript.codemodel.member.ref.VariantOptionRef;
23 23
 import org.openzen.zenscript.codemodel.partial.IPartialExpression;
24
-import org.openzen.zenscript.codemodel.statement.VarStatement;
25 24
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
26 25
 import org.openzen.zenscript.codemodel.type.ITypeID;
27 26
 import org.openzen.zenscript.codemodel.type.member.DefinitionMemberGroup;
@@ -103,11 +102,11 @@ public class ParsedExpressionCall extends ParsedExpression {
103 102
 			if (option == null)
104 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 106
 			for (int i = 0; i < values.length; i++) {
108 107
 				ParsedExpression argument = arguments.arguments.get(i);
109 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 112
 			return new VariantOptionSwitchValue(option, values);

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

@@ -97,7 +97,7 @@ public class ParsedExpressionVariable extends ParsedExpression {
97 97
 			if (option.types.length > 0)
98 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 101
 		} else {
102 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,10 +14,8 @@ import org.openzen.zenscript.codemodel.expression.MatchExpression;
14 14
 import org.openzen.zenscript.codemodel.expression.switchvalue.SwitchValue;
15 15
 import org.openzen.zenscript.codemodel.expression.switchvalue.VariantOptionSwitchValue;
16 16
 import org.openzen.zenscript.codemodel.partial.IPartialExpression;
17
-import org.openzen.zenscript.codemodel.statement.VarStatement;
18 17
 import org.openzen.zenscript.codemodel.type.ITypeID;
19 18
 import org.openzen.zenscript.codemodel.scope.ExpressionScope;
20
-import org.openzen.zenscript.parser.PrecompilationState;
21 19
 
22 20
 /**
23 21
  *
@@ -80,8 +78,8 @@ public class ParsedMatchExpression extends ParsedExpression {
80 78
 			if (switchValue instanceof VariantOptionSwitchValue) {
81 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 85
 			Expression value = this.value.compile(innerScope).eval();

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

@@ -15,7 +15,6 @@ import org.openzen.zenscript.parser.statements.ParsedFunctionBody;
15 15
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
16 16
 import org.openzen.zenscript.codemodel.Modifiers;
17 17
 import org.openzen.zenscript.codemodel.OperatorType;
18
-import org.openzen.zenscript.codemodel.context.CompilingType;
19 18
 import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
20 19
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
21 20
 import org.openzen.zenscript.lexer.ZSToken;
@@ -35,7 +34,7 @@ import org.openzen.zenscript.parser.type.ParsedTypeBasic;
35 34
  * @author Hoofdgebruiker
36 35
  */
37 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 38
 		CodePosition start = tokens.getPosition();
40 39
 		ParsedAnnotation[] annotations = ParsedAnnotation.parseAnnotations(tokens);
41 40
 		int modifiers = 0;
@@ -127,7 +126,7 @@ public abstract class ParsedDefinitionMember {
127 126
 					initializer = ParsedExpression.parse(tokens);
128 127
 				}
129 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 131
 			case K_THIS: {
133 132
 				tokens.next();
@@ -136,7 +135,7 @@ public abstract class ParsedDefinitionMember {
136 135
 				if (body == null)
137 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 140
 			case T_IDENTIFIER: {
142 141
 				String name = tokens.next().content;
@@ -148,12 +147,12 @@ public abstract class ParsedDefinitionMember {
148 147
 					tokens.required(ZSTokenType.T_ASSIGN, "= expected");
149 148
 					ParsedExpression value = ParsedExpression.parse(tokens);
150 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 153
 				ParsedFunctionHeader header = ParsedFunctionHeader.parse(tokens);
155 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 157
 			case K_SET: {
159 158
 				tokens.next();
@@ -163,7 +162,7 @@ public abstract class ParsedDefinitionMember {
163 162
 					type = IParsedType.parse(tokens);
164 163
 				}
165 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 167
 			case K_GET: {
169 168
 				tokens.next();
@@ -173,12 +172,12 @@ public abstract class ParsedDefinitionMember {
173 172
 					type = IParsedType.parse(tokens);
174 173
 				}
175 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 177
 			case K_IMPLEMENTS: {
179 178
 				tokens.next();
180 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 181
 				if (tokens.optional(ZSTokenType.T_SEMICOLON) == null) {
183 182
 					tokens.required(ZSTokenType.T_AOPEN, "{ expected");
184 183
 					while (tokens.optional(ZSTokenType.T_ACLOSE) == null) {
@@ -190,7 +189,7 @@ public abstract class ParsedDefinitionMember {
190 189
 			case T_BROPEN: {
191 190
 				ParsedFunctionHeader header = ParsedFunctionHeader.parse(tokens);
192 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 194
 			case T_SQOPEN: {
196 195
 				tokens.next();
@@ -201,7 +200,7 @@ public abstract class ParsedDefinitionMember {
201 200
 				}
202 201
 				ParsedFunctionHeader header = ParsedFunctionHeader.parse(tokens);
203 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 205
 			case T_CAT:
207 206
 				tokens.pushMark();
@@ -211,7 +210,7 @@ public abstract class ParsedDefinitionMember {
211 210
 					
212 211
 					// destructor
213 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 215
 				tokens.reset();
217 216
 				// else it is a ~ operator, continue...
@@ -245,42 +244,42 @@ public abstract class ParsedDefinitionMember {
245 244
 				ZSToken token = tokens.next();
246 245
 				ParsedFunctionHeader header = ParsedFunctionHeader.parse(tokens);
247 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 249
 			case T_EQUAL2: {
251 250
 				tokens.next();
252 251
 				ParsedFunctionHeader header = ParsedFunctionHeader.parse(tokens);
253 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 255
 			case K_AS: {
257 256
 				tokens.next();
258 257
 				IParsedType type = IParsedType.parse(tokens);
259 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 261
 			case K_IN: {
263 262
 				tokens.next();
264 263
 				ParsedFunctionHeader header = ParsedFunctionHeader.parse(tokens);
265 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 267
 			case K_CLASS:
269 268
 			case K_INTERFACE:
270 269
 			case K_ALIAS:
271 270
 			case K_STRUCT:
272 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 273
 			case K_FOR: {
275 274
 				tokens.next();
276 275
 				ParsedFunctionHeader header = ParsedFunctionHeader.parse(tokens);
277 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 279
 			default:
281 280
 				if (modifiers == Modifiers.STATIC && tokens.peek().type == ZSTokenType.T_AOPEN) {
282 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 284
 				throw new CompileException(tokens.getPosition(), CompileExceptionCode.UNEXPECTED_TOKEN, "Unexpected token: " + tokens.peek().content);
286 285
 		}
@@ -331,7 +330,7 @@ public abstract class ParsedDefinitionMember {
331 330
 	
332 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 335
 	public abstract IDefinitionMember getCompiled();
337 336
 	

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

@@ -7,7 +7,7 @@ package org.openzen.zenscript.parser.member;
7 7
 
8 8
 import java.util.Map;
9 9
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
10
-import org.openzen.zenscript.codemodel.context.CompilingType;
10
+import org.openzen.zenscript.codemodel.context.LocalTypeResolutionContext;
11 11
 import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
12 12
 import org.openzen.zenscript.codemodel.member.InnerDefinitionMember;
13 13
 import org.openzen.zenscript.codemodel.scope.BaseScope;
@@ -33,7 +33,7 @@ public class ParsedInnerDefinition extends ParsedDefinitionMember {
33 33
 	}
34 34
 	
35 35
 	@Override
36
-	public void registerInnerTypes(Map<String, CompilingType> inner) {
36
+	public void registerInnerTypes(Map<String, ParsedDefinition> inner) {
37 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,7 +42,7 @@ public class Main {
42 42
 		File[] inputFiles = Optional.ofNullable(inputDirectory.listFiles((dir, name) -> name.endsWith(".zs"))).orElseGet(() -> new File[0]);
43 43
 		
44 44
 		ZSPackage pkg = new ZSPackage(null, "");
45
-		CompilingPackage compilingPkg = new CompilingPackage();
45
+		CompilingPackage compilingPkg = new CompilingPackage(pkg);
46 46
 		ParsedFile[] parsedFiles = parse(pkg, compilingPkg, inputFiles);
47 47
 		
48 48
 		ZSPackage global = new ZSPackage(null, "");
@@ -62,7 +62,7 @@ public class Main {
62 62
 	private static ParsedFile[] parse(ZSPackage pkg, CompilingPackage compilingPkg, File[] files) throws IOException {
63 63
 		ParsedFile[] parsedFiles = new ParsedFile[files.length];
64 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 67
 		return parsedFiles;
68 68
 	}
@@ -110,7 +110,6 @@ public class Main {
110 110
 		SemanticModule result = Module.compileSyntaxToSemantic(
111 111
 				"scripts",
112 112
 				new String[0],
113
-				pkg,
114 113
 				compiling,
115 114
 				files,
116 115
 				space,

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

@@ -0,0 +1,18 @@
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

@@ -0,0 +1,9 @@
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

@@ -0,0 +1,85 @@
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

@@ -0,0 +1,25 @@
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

@@ -0,0 +1,22 @@
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

@@ -0,0 +1,22 @@
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

@@ -0,0 +1,23 @@
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

@@ -0,0 +1,88 @@
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

@@ -0,0 +1,10 @@
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

@@ -0,0 +1,12 @@
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

@@ -0,0 +1,23 @@
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

@@ -0,0 +1,10 @@
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

@@ -0,0 +1,10 @@
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

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