Browse Source

Fixed remaining critical bugs in the current implementation.

Stan Hebben 6 years ago
parent
commit
f11b965626
19 changed files with 107 additions and 27 deletions
  1. 6
    4
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/FunctionHeader.java
  2. 2
    2
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/GenericMapper.java
  3. 7
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/FileResolutionContext.java
  4. 1
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/NewExpression.java
  5. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/scope/DefinitionScope.java
  6. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/StoredType.java
  7. 3
    3
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/member/TypeMemberBuilder.java
  8. 7
    5
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/member/TypeMemberGroup.java
  9. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/member/TypeMembers.java
  10. 9
    2
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeContext.java
  11. 9
    0
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaContext.java
  12. 2
    0
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaSyntheticClassGenerator.java
  13. 3
    1
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaTypeDescriptorVisitor.java
  14. 2
    2
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceExpressionFormatter.java
  15. 35
    0
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceSyntheticTypeGenerator.java
  16. 3
    2
      Parser/src/main/java/org/openzen/zenscript/parser/expression/ParsedExpressionFunction.java
  17. 10
    1
      Parser/src/main/java/org/openzen/zenscript/parser/expression/ParsedNewExpression.java
  18. 2
    1
      Shared/src/main/java/org/openzen/zencode/shared/CompileExceptionCode.java
  19. 3
    0
      Validator/src/main/java/org/openzen/zenscript/validator/visitors/StatementValidator.java

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

@@ -190,7 +190,7 @@ public class FunctionHeader {
190 190
 		
191 191
 		FunctionHeader header = fillGenericArguments(scope.getTypeRegistry(), arguments.typeArguments, scope.getLocalTypeParameters());
192 192
 		for (int i = 0; i < header.parameters.length; i++) {
193
-			if (arguments.arguments[i].type != header.parameters[i].type)
193
+			if (!arguments.arguments[i].type.equals(header.parameters[i].type))
194 194
 				return false;
195 195
 		}
196 196
 		
@@ -366,9 +366,7 @@ public class FunctionHeader {
366 366
 	public FunctionHeader instanceForCall(GlobalTypeRegistry registry, CallArguments arguments) {
367 367
 		if (arguments.getNumberOfTypeArguments() > 0) {
368 368
 			Map<TypeParameter, StoredType> typeParameters = StoredType.getMapping(this.typeParameters, arguments.typeArguments);
369
-			return withGenericArguments(
370
-					registry,
371
-					new GenericMapper(registry, typeParameters));
369
+			return instance(new GenericMapper(registry, typeParameters));
372 370
 		} else {
373 371
 			return this;
374 372
 		}
@@ -378,6 +376,10 @@ public class FunctionHeader {
378 376
 		if (typeParameters.length > 0)
379 377
 			mapper = mapper.getInner(registry, StoredType.getSelfMapping(registry, typeParameters));
380 378
 		
379
+		return instance(mapper);
380
+	}
381
+	
382
+	private FunctionHeader instance(GenericMapper mapper) {
381 383
 		StoredType returnType = this.returnType.instance(mapper);
382 384
 		FunctionParameter[] parameters = new FunctionParameter[this.parameters.length];
383 385
 		for (int i = 0; i < parameters.length; i++) {

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

@@ -48,8 +48,8 @@ public class GenericMapper {
48 48
 	}
49 49
 	
50 50
 	public StoredType map(GenericTypeID type) {
51
-		if (!mapping.containsKey(type.parameter))
52
-			throw new IllegalStateException("No mapping found for type " + type);
51
+		//if (!mapping.containsKey(type.parameter))
52
+		//	throw new IllegalStateException("No mapping found for type " + type);
53 53
 		
54 54
 		return mapping.containsKey(type.parameter) ? mapping.get(type.parameter) : type.stored();
55 55
 	}

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

@@ -9,10 +9,12 @@ import java.util.HashMap;
9 9
 import java.util.List;
10 10
 import java.util.Map;
11 11
 import org.openzen.zencode.shared.CodePosition;
12
+import org.openzen.zencode.shared.CompileExceptionCode;
12 13
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
13 14
 import org.openzen.zenscript.codemodel.annotations.AnnotationDefinition;
14 15
 import org.openzen.zenscript.codemodel.type.GenericName;
15 16
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
17
+import org.openzen.zenscript.codemodel.type.InvalidTypeID;
16 18
 import org.openzen.zenscript.codemodel.type.StoredType;
17 19
 import org.openzen.zenscript.codemodel.type.TypeID;
18 20
 import org.openzen.zenscript.codemodel.type.storage.StorageTag;
@@ -48,9 +50,13 @@ public class FileResolutionContext implements TypeResolutionContext {
48 50
 	@Override
49 51
 	public TypeID getType(CodePosition position, List<GenericName> name) {
50 52
 		if (imports.containsKey(name.get(0).name)) {
53
+			HighLevelDefinition definition = imports.get(name.get(0).name);
54
+			if (definition.getNumberOfGenericParameters() != name.get(0).arguments.length)
55
+				return new InvalidTypeID(position, CompileExceptionCode.INVALID_TYPE_ARGUMENTS, "Invalid number of type arguments");
56
+			
51 57
 			return GenericName.getInnerType(
52 58
 					getTypeRegistry(),
53
-					getTypeRegistry().getForDefinition(imports.get(name.get(0).name), name.get(0).arguments),
59
+					getTypeRegistry().getForDefinition(definition, name.get(0).arguments),
54 60
 					name,
55 61
 					1);
56 62
 		}

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

@@ -10,6 +10,7 @@ import org.openzen.zenscript.codemodel.FunctionHeader;
10 10
 import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
11 11
 import org.openzen.zenscript.codemodel.scope.TypeScope;
12 12
 import org.openzen.zenscript.codemodel.type.StoredType;
13
+import org.openzen.zenscript.codemodel.type.member.BuiltinID;
13 14
 
14 15
 /**
15 16
  *

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

@@ -66,7 +66,7 @@ public class DefinitionScope extends BaseScope {
66 66
 			typeParameters = StoredType.getSelfMapping(outer.getTypeRegistry(), expansion.typeParameters);
67 67
 		} else {
68 68
 			DefinitionTypeID definitionType = outer.getTypeRegistry().getForMyDefinition(definition);
69
-			type = definitionType.stored(BorrowStorageTag.THIS);
69
+			type = definitionType.stored();
70 70
 			
71 71
 			List<TypeParameter> typeParameterList = new ArrayList<>();
72 72
 			while (definitionType != null) {

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

@@ -61,7 +61,7 @@ public class StoredType {
61 61
 	}
62 62
 	
63 63
 	public StoredType getNormalized() {
64
-		return type.getNormalized() == type ? this : new StoredType(type, storage);
64
+		return type.getNormalized() == type ? this : new StoredType(type.getNormalized(), storage);
65 65
 	}
66 66
 	
67 67
 	public StoredType getSuperType(GlobalTypeRegistry registry) {

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

@@ -215,7 +215,7 @@ public class TypeMemberBuilder implements TypeVisitorWithContext<Void, Void, Run
215 215
 				ARRAY_INDEXGET);
216 216
 		
217 217
 		if (dimension == 1) {
218
-			FunctionHeader sliceHeader = new FunctionHeader(type, new FunctionParameter(RangeTypeID.USIZE.stored, "range"));
218
+			FunctionHeader sliceHeader = new FunctionHeader(new StoredType(type.type, UniqueStorageTag.INSTANCE), new FunctionParameter(RangeTypeID.USIZE.stored, "range"));
219 219
 			operator(
220 220
 					definition,
221 221
 					OperatorType.INDEXGET,
@@ -291,7 +291,7 @@ public class TypeMemberBuilder implements TypeVisitorWithContext<Void, Void, Run
291 291
 					VOID.stored,
292 292
 					null,
293 293
 					null,
294
-					new FunctionParameter(registry.getArray(registry.getGeneric(mappedConstructorParameter).stored(BorrowStorageTag.INVOCATION), dimension).stored(BorrowStorageTag.INVOCATION), "original"),
294
+					new FunctionParameter(registry.getArray(registry.getGeneric(mappedConstructorParameter).stored(), dimension).stored(BorrowStorageTag.INVOCATION), "original"),
295 295
 					new FunctionParameter(registry.getFunction(mappedConstructorHeaderWithoutIndex).stored(BorrowStorageTag.INVOCATION), "projection"));
296 296
 			members.addConstructor(new ConstructorMember(
297 297
 					BUILTIN,
@@ -314,7 +314,7 @@ public class TypeMemberBuilder implements TypeVisitorWithContext<Void, Void, Run
314 314
 					VOID.stored,
315 315
 					null,
316 316
 					null,
317
-					new FunctionParameter(registry.getArray(registry.getGeneric(mappedConstructorParameter).stored(BorrowStorageTag.INVOCATION), dimension).stored(BorrowStorageTag.INVOCATION), "original"),
317
+					new FunctionParameter(registry.getArray(registry.getGeneric(mappedConstructorParameter).stored(), dimension).stored(BorrowStorageTag.INVOCATION), "original"),
318 318
 					new FunctionParameter(registry.getFunction(mappedConstructorHeaderWithIndex).stored(BorrowStorageTag.INVOCATION), "projection"));
319 319
 			constructor(definition, ARRAY_CONSTRUCTOR_PROJECTED_INDEXED, mappedConstructorFunctionWithIndex);
320 320
 		}

+ 7
- 5
CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/member/TypeMemberGroup.java View File

@@ -332,7 +332,7 @@ public class TypeMemberGroup {
332 332
 			if (!(method.member.isStatic() ? allowStatic : allowNonStatic))
333 333
 				continue;
334 334
 			
335
-			FunctionHeader header = method.member.getHeader();
335
+			FunctionHeader header = method.member.getHeader().instanceForCall(scope.getTypeRegistry(), arguments);
336 336
 			if (header.matchesExactly(arguments, scope))
337 337
 				return method.member;
338 338
 		}
@@ -347,14 +347,15 @@ public class TypeMemberGroup {
347 347
 			
348 348
 			scope.getPreparer().prepare(method.member.getTarget());
349 349
 			
350
-			FunctionHeader header = method.member.getHeader();
350
+			FunctionHeader header = method.member.getHeader().instanceForCall(scope.getTypeRegistry(), arguments);
351 351
 			if (!header.matchesImplicitly(arguments, scope))
352 352
 				continue;
353 353
 			
354 354
 			if (selected != null) {
355 355
 				StringBuilder explanation = new StringBuilder();
356
-				explanation.append("Function A: ").append(selected.getHeader().toString()).append("\n");
357
-				explanation.append("Function B: ").append(method.member.getHeader().toString());
356
+				FunctionHeader selectedHeader = selected.getHeader().instanceForCall(scope.getTypeRegistry(), arguments);
357
+				explanation.append("Function A: ").append(selectedHeader.toString()).append("\n");
358
+				explanation.append("Function B: ").append(header.toString());
358 359
 				throw new CompileException(position, CompileExceptionCode.CALL_AMBIGUOUS, "Ambiguous call; multiple methods match:\n" + explanation.toString());
359 360
 			}
360 361
 			
@@ -374,7 +375,8 @@ public class TypeMemberGroup {
374 375
 					continue;
375 376
 				}
376 377
 				
377
-				message.append(method.member.getHeader().explainWhyIncompatible(scope, arguments)).append("\n");
378
+				FunctionHeader instancedHeader = method.member.getHeader().instanceForCall(scope.getTypeRegistry(), arguments);
379
+				message.append(instancedHeader.explainWhyIncompatible(scope, arguments)).append("\n");
378 380
 			}
379 381
 			
380 382
 			throw new CompileException(position, CompileExceptionCode.CALL_NO_VALID_METHOD, "No matching method found for " + name + ":\n" + message.toString());

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

@@ -487,7 +487,7 @@ public final class TypeMembers {
487 487
 				return castEquivalent(position, caster.member.cast(position, value, implicit), toType);
488 488
 		}
489 489
 		for (TypeMember<ImplementationMemberRef> implementation : implementations) {
490
-			if (implementation.member.implementsType.equals(toType.type))
490
+			if (implementation.member.implementsType.getNormalized() == toType.type)
491 491
 				return castEquivalent(position, new InterfaceCastExpression(position, value, toType.type.stored(type.getActualStorage())), toType);
492 492
 		}
493 493
 		if (extendsType(toType.type))

+ 9
- 2
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeContext.java View File

@@ -11,8 +11,6 @@ import org.objectweb.asm.Type;
11 11
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
12 12
 import org.openzen.zenscript.codemodel.type.StoredType;
13 13
 import org.openzen.zenscript.codemodel.type.TypeID;
14
-import org.openzen.zenscript.codemodel.type.storage.AutoStorageTag;
15
-import org.openzen.zenscript.codemodel.type.storage.SharedStorageTag;
16 14
 import org.openzen.zenscript.javabytecode.compiler.JavaWriter;
17 15
 import org.openzen.zenscript.javashared.JavaContext;
18 16
 import org.openzen.zenscript.javashared.JavaMethod;
@@ -118,6 +116,10 @@ public class JavaBytecodeContext extends JavaContext {
118 116
 		
119 117
 		register(range.cls.internalName, rangeWriter.toByteArray());
120 118
 	}
119
+	
120
+	private void createSharedClass() {
121
+		// TODO
122
+	}
121 123
 
122 124
     public String getLambdaCounter() {
123 125
         return "lambda" + ++lambdaCounter;
@@ -134,5 +136,10 @@ public class JavaBytecodeContext extends JavaContext {
134 136
 		public void synthesizeRange(JavaSynthesizedRange range) {
135 137
 			createRangeClass(range);
136 138
 		}
139
+		
140
+		@Override
141
+		public void synthesizeShared() {
142
+			createSharedClass();
143
+		}
137 144
 	}
138 145
 }

+ 9
- 0
JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaContext.java View File

@@ -30,6 +30,7 @@ public abstract class JavaContext {
30 30
 	private final GlobalTypeRegistry registry;
31 31
 	private final Map<String, JavaSynthesizedFunction> functions = new HashMap<>();
32 32
 	private final Map<String, JavaSynthesizedRange> ranges = new HashMap<>();
33
+	private boolean useShared = false;
33 34
 	
34 35
 	public JavaContext(GlobalTypeRegistry registry) {
35 36
 		this.registry = registry;
@@ -77,6 +78,14 @@ public abstract class JavaContext {
77 78
 	
78 79
 	public abstract String getDescriptor(StoredType type);
79 80
 	
81
+	public void useShared() {
82
+		if (useShared)
83
+			return;
84
+		
85
+		useShared = true;
86
+		getTypeGenerator().synthesizeShared();
87
+	}
88
+	
80 89
 	public String getMethodDescriptor(FunctionHeader header) {
81 90
 		return getMethodDescriptor(header, false);
82 91
 	}

+ 2
- 0
JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaSyntheticClassGenerator.java View File

@@ -13,4 +13,6 @@ public interface JavaSyntheticClassGenerator {
13 13
 	void synthesizeFunction(JavaSynthesizedFunction function);
14 14
 	
15 15
 	void synthesizeRange(JavaSynthesizedRange range);
16
+	
17
+	void synthesizeShared();
16 18
 }

+ 3
- 1
JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaTypeDescriptorVisitor.java View File

@@ -20,8 +20,10 @@ public class JavaTypeDescriptorVisitor implements TypeVisitor<String> {
20 20
 	}
21 21
 	
22 22
 	public String process(StoredType type) {
23
-		if (JavaTypeUtils.isShared(type))
23
+		if (JavaTypeUtils.isShared(type)) {
24
+			context.useShared();
24 25
 			return "L" + JavaClass.SHARED.internalName + ";";
26
+		}
25 27
 		
26 28
 		return type.type.accept(this);
27 29
 	}

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

@@ -667,7 +667,7 @@ public class JavaSourceExpressionFormatter implements ExpressionVisitor<Expressi
667 667
 	
668 668
 	@Override
669 669
 	public ExpressionString visitStorageCast(StorageCastExpression expression) {
670
-		ExpressionString value = expression.accept(this);
670
+		ExpressionString value = expression.value.accept(this);
671 671
 		if (expression.value.type.isDestructible()) {
672 672
 			StorageTag fromTag = expression.value.type.getActualStorage();
673 673
 			StorageTag toTag = expression.type.getActualStorage();
@@ -689,7 +689,7 @@ public class JavaSourceExpressionFormatter implements ExpressionVisitor<Expressi
689 689
 
690 690
 	@Override
691 691
 	public ExpressionString visitThis(ThisExpression expression) {
692
-		if (scope.isExpansion || scope.thisType == expression.type) {
692
+		if (scope.isExpansion || scope.thisType == expression.type.type) {
693 693
 			return new ExpressionString(scope.isExpansion ? "self" : "this", JavaOperator.PRIMARY);
694 694
 		} else {
695 695
 			return new ExpressionString(constructThisName((DefinitionTypeID)expression.type.type) + ".this", JavaOperator.MEMBER);

+ 35
- 0
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceSyntheticTypeGenerator.java View File

@@ -93,6 +93,41 @@ public class JavaSourceSyntheticTypeGenerator implements JavaSyntheticClassGener
93 93
 		writeFile(range.cls, importer, contents);
94 94
 	}
95 95
 	
96
+	@Override
97
+	public void synthesizeShared() {
98
+		JavaSourceImporter importer = new JavaSourceImporter(JavaClass.SHARED);
99
+		
100
+		StringBuilder contents = new StringBuilder();
101
+		contents.append("public final class Shared<T extends AutoCloseable> {\n");
102
+		contents.append(settings.indent).append("private final T value;\n");
103
+		contents.append(settings.indent).append("private int refcount = 1;\n");
104
+		contents.append(settings.indent).append("\n");
105
+		contents.append(settings.indent).append("public Shared(T value) {\n");
106
+		contents.append(settings.indent).append(settings.indent).append("this.value = value;\n");
107
+		contents.append(settings.indent).append("}\n");
108
+		contents.append(settings.indent).append("\n");
109
+		contents.append(settings.indent).append("public synchronized void addRef() {\n");
110
+		contents.append(settings.indent).append(settings.indent).append("refcount++;\n");
111
+		contents.append(settings.indent).append("}\n");
112
+		contents.append(settings.indent).append("\n");
113
+		contents.append(settings.indent).append("public synchronized void release() {\n");
114
+		contents.append(settings.indent).append(settings.indent).append("refcount--;\n");
115
+		contents.append(settings.indent).append(settings.indent).append("if (refcount == 0) {\n");
116
+		contents.append(settings.indent).append(settings.indent).append(settings.indent).append("try {\n");
117
+		contents.append(settings.indent).append(settings.indent).append(settings.indent).append(settings.indent).append("value.close();\n");
118
+		contents.append(settings.indent).append(settings.indent).append(settings.indent).append("} catch (Exception ex) {}\n");
119
+		contents.append(settings.indent).append(settings.indent).append("}\n");
120
+		contents.append(settings.indent).append("}\n");
121
+		contents.append("}\n");
122
+		
123
+		writeFile(JavaClass.SHARED, importer, contents);
124
+	}
125
+	
126
+	private void line(StringBuilder output, int level) {
127
+		for (int i = 0; i < level; i++)
128
+			output.append(settings.indent);
129
+	}
130
+	
96 131
 	private void writeFile(JavaClass cls, JavaSourceImporter importer, StringBuilder contents) {
97 132
 		if (!directory.exists())
98 133
 			directory.mkdirs();

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

@@ -24,6 +24,7 @@ import org.openzen.zenscript.codemodel.scope.ExpressionScope;
24 24
 import org.openzen.zenscript.codemodel.scope.LambdaScope;
25 25
 import org.openzen.zenscript.codemodel.scope.StatementScope;
26 26
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
27
+import org.openzen.zenscript.codemodel.type.InvalidTypeID;
27 28
 import org.openzen.zenscript.codemodel.type.StoredType;
28 29
 import org.openzen.zenscript.codemodel.type.storage.AutoStorageTag;
29 30
 import org.openzen.zenscript.codemodel.type.storage.StorageTag;
@@ -76,9 +77,9 @@ public class ParsedExpressionFunction extends ParsedExpression {
76 77
 		if (header.getReturnType().isBasic(BasicTypeID.UNDETERMINED)) {
77 78
 			StoredType returnType = statements.getReturnType();
78 79
 			if (returnType == null)
79
-				throw new CompileException(position, CompileExceptionCode.CANNOT_INFER_RETURN_TYPE, "Could not infer return type");
80
+				returnType = new InvalidTypeID(position, CompileExceptionCode.CANNOT_INFER_RETURN_TYPE, "Could not infer return type").stored();
80 81
 			
81
-			header.setReturnType(statements.getReturnType());
82
+			header.setReturnType(returnType);
82 83
 		}
83 84
 		
84 85
 		if (!scope.genericInferenceMap.isEmpty()) {

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

@@ -19,6 +19,9 @@ import org.openzen.zenscript.codemodel.partial.IPartialExpression;
19 19
 import org.openzen.zenscript.codemodel.type.member.TypeMemberGroup;
20 20
 import org.openzen.zenscript.codemodel.scope.ExpressionScope;
21 21
 import org.openzen.zenscript.codemodel.type.StoredType;
22
+import org.openzen.zenscript.codemodel.type.member.BuiltinID;
23
+import org.openzen.zenscript.codemodel.type.member.TypeMember;
24
+import org.openzen.zenscript.codemodel.type.member.TypeMembers;
22 25
 import org.openzen.zenscript.parser.type.IParsedType;
23 26
 
24 27
 /**
@@ -49,7 +52,13 @@ public class ParsedNewExpression extends ParsedExpression{
49 52
 	
50 53
 	public static Expression compile(CodePosition position, StoredType type, ParsedCallArguments arguments, ExpressionScope scope) {
51 54
 		try {
52
-			TypeMemberGroup constructors = scope.getTypeMembers(type).getOrCreateGroup(OperatorType.CONSTRUCTOR);
55
+			TypeMembers members = scope.getTypeMembers(type);
56
+			TypeMemberGroup constructors = members.getOrCreateGroup(OperatorType.CONSTRUCTOR);
57
+			for (TypeMember<FunctionalMemberRef> member : constructors.getMethodMembers()) {
58
+				if (member.member.getBuiltin() == BuiltinID.ARRAY_CONSTRUCTOR_PROJECTED)
59
+					System.out.println("X");
60
+			}
61
+
53 62
 			List<StoredType>[] predictedTypes = constructors.predictCallTypes(scope, scope.hints, arguments.arguments.size());
54 63
 			CallArguments compiledArguments = arguments.compileCall(position, scope, null, constructors);
55 64
 			FunctionalMemberRef member = constructors.selectMethod(position, scope, compiledArguments, true, true);

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

@@ -75,5 +75,6 @@ public enum CompileExceptionCode {
75 75
 	NO_SUCH_STORAGE_TYPE,
76 76
 	INVALID_STORAGE_TYPE_ARGUMENTS,
77 77
 	STORAGE_NOT_SUPPORTED,
78
-	INCOMPATIBLE_STORAGE_TAG
78
+	INCOMPATIBLE_STORAGE_TAG,
79
+	INVALID_TYPE_ARGUMENTS
79 80
 }

+ 3
- 0
Validator/src/main/java/org/openzen/zenscript/validator/visitors/StatementValidator.java View File

@@ -177,6 +177,9 @@ public class StatementValidator implements StatementVisitor<Void> {
177 177
 		statement.value.accept(new ExpressionValidator(validator, new StatementExpressionScope()));
178 178
 		
179 179
 		for (SwitchCase switchCase : statement.cases) {
180
+			for (Statement caseStatement : switchCase.statements)
181
+				caseStatement.accept(this);
182
+			
180 183
 			// TODO: finish this
181 184
 		}
182 185
 		

Loading…
Cancel
Save