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

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

48
 	}
48
 	}
49
 	
49
 	
50
 	public StoredType map(GenericTypeID type) {
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
 		return mapping.containsKey(type.parameter) ? mapping.get(type.parameter) : type.stored();
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
 import java.util.List;
9
 import java.util.List;
10
 import java.util.Map;
10
 import java.util.Map;
11
 import org.openzen.zencode.shared.CodePosition;
11
 import org.openzen.zencode.shared.CodePosition;
12
+import org.openzen.zencode.shared.CompileExceptionCode;
12
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
13
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
13
 import org.openzen.zenscript.codemodel.annotations.AnnotationDefinition;
14
 import org.openzen.zenscript.codemodel.annotations.AnnotationDefinition;
14
 import org.openzen.zenscript.codemodel.type.GenericName;
15
 import org.openzen.zenscript.codemodel.type.GenericName;
15
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
16
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
17
+import org.openzen.zenscript.codemodel.type.InvalidTypeID;
16
 import org.openzen.zenscript.codemodel.type.StoredType;
18
 import org.openzen.zenscript.codemodel.type.StoredType;
17
 import org.openzen.zenscript.codemodel.type.TypeID;
19
 import org.openzen.zenscript.codemodel.type.TypeID;
18
 import org.openzen.zenscript.codemodel.type.storage.StorageTag;
20
 import org.openzen.zenscript.codemodel.type.storage.StorageTag;
48
 	@Override
50
 	@Override
49
 	public TypeID getType(CodePosition position, List<GenericName> name) {
51
 	public TypeID getType(CodePosition position, List<GenericName> name) {
50
 		if (imports.containsKey(name.get(0).name)) {
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
 			return GenericName.getInnerType(
57
 			return GenericName.getInnerType(
52
 					getTypeRegistry(),
58
 					getTypeRegistry(),
53
-					getTypeRegistry().getForDefinition(imports.get(name.get(0).name), name.get(0).arguments),
59
+					getTypeRegistry().getForDefinition(definition, name.get(0).arguments),
54
 					name,
60
 					name,
55
 					1);
61
 					1);
56
 		}
62
 		}

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

10
 import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
10
 import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
11
 import org.openzen.zenscript.codemodel.scope.TypeScope;
11
 import org.openzen.zenscript.codemodel.scope.TypeScope;
12
 import org.openzen.zenscript.codemodel.type.StoredType;
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
 			typeParameters = StoredType.getSelfMapping(outer.getTypeRegistry(), expansion.typeParameters);
66
 			typeParameters = StoredType.getSelfMapping(outer.getTypeRegistry(), expansion.typeParameters);
67
 		} else {
67
 		} else {
68
 			DefinitionTypeID definitionType = outer.getTypeRegistry().getForMyDefinition(definition);
68
 			DefinitionTypeID definitionType = outer.getTypeRegistry().getForMyDefinition(definition);
69
-			type = definitionType.stored(BorrowStorageTag.THIS);
69
+			type = definitionType.stored();
70
 			
70
 			
71
 			List<TypeParameter> typeParameterList = new ArrayList<>();
71
 			List<TypeParameter> typeParameterList = new ArrayList<>();
72
 			while (definitionType != null) {
72
 			while (definitionType != null) {

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

61
 	}
61
 	}
62
 	
62
 	
63
 	public StoredType getNormalized() {
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
 	public StoredType getSuperType(GlobalTypeRegistry registry) {
67
 	public StoredType getSuperType(GlobalTypeRegistry registry) {

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

215
 				ARRAY_INDEXGET);
215
 				ARRAY_INDEXGET);
216
 		
216
 		
217
 		if (dimension == 1) {
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
 			operator(
219
 			operator(
220
 					definition,
220
 					definition,
221
 					OperatorType.INDEXGET,
221
 					OperatorType.INDEXGET,
291
 					VOID.stored,
291
 					VOID.stored,
292
 					null,
292
 					null,
293
 					null,
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
 					new FunctionParameter(registry.getFunction(mappedConstructorHeaderWithoutIndex).stored(BorrowStorageTag.INVOCATION), "projection"));
295
 					new FunctionParameter(registry.getFunction(mappedConstructorHeaderWithoutIndex).stored(BorrowStorageTag.INVOCATION), "projection"));
296
 			members.addConstructor(new ConstructorMember(
296
 			members.addConstructor(new ConstructorMember(
297
 					BUILTIN,
297
 					BUILTIN,
314
 					VOID.stored,
314
 					VOID.stored,
315
 					null,
315
 					null,
316
 					null,
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
 					new FunctionParameter(registry.getFunction(mappedConstructorHeaderWithIndex).stored(BorrowStorageTag.INVOCATION), "projection"));
318
 					new FunctionParameter(registry.getFunction(mappedConstructorHeaderWithIndex).stored(BorrowStorageTag.INVOCATION), "projection"));
319
 			constructor(definition, ARRAY_CONSTRUCTOR_PROJECTED_INDEXED, mappedConstructorFunctionWithIndex);
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
 			if (!(method.member.isStatic() ? allowStatic : allowNonStatic))
332
 			if (!(method.member.isStatic() ? allowStatic : allowNonStatic))
333
 				continue;
333
 				continue;
334
 			
334
 			
335
-			FunctionHeader header = method.member.getHeader();
335
+			FunctionHeader header = method.member.getHeader().instanceForCall(scope.getTypeRegistry(), arguments);
336
 			if (header.matchesExactly(arguments, scope))
336
 			if (header.matchesExactly(arguments, scope))
337
 				return method.member;
337
 				return method.member;
338
 		}
338
 		}
347
 			
347
 			
348
 			scope.getPreparer().prepare(method.member.getTarget());
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
 			if (!header.matchesImplicitly(arguments, scope))
351
 			if (!header.matchesImplicitly(arguments, scope))
352
 				continue;
352
 				continue;
353
 			
353
 			
354
 			if (selected != null) {
354
 			if (selected != null) {
355
 				StringBuilder explanation = new StringBuilder();
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
 				throw new CompileException(position, CompileExceptionCode.CALL_AMBIGUOUS, "Ambiguous call; multiple methods match:\n" + explanation.toString());
359
 				throw new CompileException(position, CompileExceptionCode.CALL_AMBIGUOUS, "Ambiguous call; multiple methods match:\n" + explanation.toString());
359
 			}
360
 			}
360
 			
361
 			
374
 					continue;
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
 			throw new CompileException(position, CompileExceptionCode.CALL_NO_VALID_METHOD, "No matching method found for " + name + ":\n" + message.toString());
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
 				return castEquivalent(position, caster.member.cast(position, value, implicit), toType);
487
 				return castEquivalent(position, caster.member.cast(position, value, implicit), toType);
488
 		}
488
 		}
489
 		for (TypeMember<ImplementationMemberRef> implementation : implementations) {
489
 		for (TypeMember<ImplementationMemberRef> implementation : implementations) {
490
-			if (implementation.member.implementsType.equals(toType.type))
490
+			if (implementation.member.implementsType.getNormalized() == toType.type)
491
 				return castEquivalent(position, new InterfaceCastExpression(position, value, toType.type.stored(type.getActualStorage())), toType);
491
 				return castEquivalent(position, new InterfaceCastExpression(position, value, toType.type.stored(type.getActualStorage())), toType);
492
 		}
492
 		}
493
 		if (extendsType(toType.type))
493
 		if (extendsType(toType.type))

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

11
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
11
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
12
 import org.openzen.zenscript.codemodel.type.StoredType;
12
 import org.openzen.zenscript.codemodel.type.StoredType;
13
 import org.openzen.zenscript.codemodel.type.TypeID;
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
 import org.openzen.zenscript.javabytecode.compiler.JavaWriter;
14
 import org.openzen.zenscript.javabytecode.compiler.JavaWriter;
17
 import org.openzen.zenscript.javashared.JavaContext;
15
 import org.openzen.zenscript.javashared.JavaContext;
18
 import org.openzen.zenscript.javashared.JavaMethod;
16
 import org.openzen.zenscript.javashared.JavaMethod;
118
 		
116
 		
119
 		register(range.cls.internalName, rangeWriter.toByteArray());
117
 		register(range.cls.internalName, rangeWriter.toByteArray());
120
 	}
118
 	}
119
+	
120
+	private void createSharedClass() {
121
+		// TODO
122
+	}
121
 
123
 
122
     public String getLambdaCounter() {
124
     public String getLambdaCounter() {
123
         return "lambda" + ++lambdaCounter;
125
         return "lambda" + ++lambdaCounter;
134
 		public void synthesizeRange(JavaSynthesizedRange range) {
136
 		public void synthesizeRange(JavaSynthesizedRange range) {
135
 			createRangeClass(range);
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
 	private final GlobalTypeRegistry registry;
30
 	private final GlobalTypeRegistry registry;
31
 	private final Map<String, JavaSynthesizedFunction> functions = new HashMap<>();
31
 	private final Map<String, JavaSynthesizedFunction> functions = new HashMap<>();
32
 	private final Map<String, JavaSynthesizedRange> ranges = new HashMap<>();
32
 	private final Map<String, JavaSynthesizedRange> ranges = new HashMap<>();
33
+	private boolean useShared = false;
33
 	
34
 	
34
 	public JavaContext(GlobalTypeRegistry registry) {
35
 	public JavaContext(GlobalTypeRegistry registry) {
35
 		this.registry = registry;
36
 		this.registry = registry;
77
 	
78
 	
78
 	public abstract String getDescriptor(StoredType type);
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
 	public String getMethodDescriptor(FunctionHeader header) {
89
 	public String getMethodDescriptor(FunctionHeader header) {
81
 		return getMethodDescriptor(header, false);
90
 		return getMethodDescriptor(header, false);
82
 	}
91
 	}

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

13
 	void synthesizeFunction(JavaSynthesizedFunction function);
13
 	void synthesizeFunction(JavaSynthesizedFunction function);
14
 	
14
 	
15
 	void synthesizeRange(JavaSynthesizedRange range);
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
 	}
20
 	}
21
 	
21
 	
22
 	public String process(StoredType type) {
22
 	public String process(StoredType type) {
23
-		if (JavaTypeUtils.isShared(type))
23
+		if (JavaTypeUtils.isShared(type)) {
24
+			context.useShared();
24
 			return "L" + JavaClass.SHARED.internalName + ";";
25
 			return "L" + JavaClass.SHARED.internalName + ";";
26
+		}
25
 		
27
 		
26
 		return type.type.accept(this);
28
 		return type.type.accept(this);
27
 	}
29
 	}

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

667
 	
667
 	
668
 	@Override
668
 	@Override
669
 	public ExpressionString visitStorageCast(StorageCastExpression expression) {
669
 	public ExpressionString visitStorageCast(StorageCastExpression expression) {
670
-		ExpressionString value = expression.accept(this);
670
+		ExpressionString value = expression.value.accept(this);
671
 		if (expression.value.type.isDestructible()) {
671
 		if (expression.value.type.isDestructible()) {
672
 			StorageTag fromTag = expression.value.type.getActualStorage();
672
 			StorageTag fromTag = expression.value.type.getActualStorage();
673
 			StorageTag toTag = expression.type.getActualStorage();
673
 			StorageTag toTag = expression.type.getActualStorage();
689
 
689
 
690
 	@Override
690
 	@Override
691
 	public ExpressionString visitThis(ThisExpression expression) {
691
 	public ExpressionString visitThis(ThisExpression expression) {
692
-		if (scope.isExpansion || scope.thisType == expression.type) {
692
+		if (scope.isExpansion || scope.thisType == expression.type.type) {
693
 			return new ExpressionString(scope.isExpansion ? "self" : "this", JavaOperator.PRIMARY);
693
 			return new ExpressionString(scope.isExpansion ? "self" : "this", JavaOperator.PRIMARY);
694
 		} else {
694
 		} else {
695
 			return new ExpressionString(constructThisName((DefinitionTypeID)expression.type.type) + ".this", JavaOperator.MEMBER);
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
 		writeFile(range.cls, importer, contents);
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
 	private void writeFile(JavaClass cls, JavaSourceImporter importer, StringBuilder contents) {
131
 	private void writeFile(JavaClass cls, JavaSourceImporter importer, StringBuilder contents) {
97
 		if (!directory.exists())
132
 		if (!directory.exists())
98
 			directory.mkdirs();
133
 			directory.mkdirs();

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

24
 import org.openzen.zenscript.codemodel.scope.LambdaScope;
24
 import org.openzen.zenscript.codemodel.scope.LambdaScope;
25
 import org.openzen.zenscript.codemodel.scope.StatementScope;
25
 import org.openzen.zenscript.codemodel.scope.StatementScope;
26
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
26
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
27
+import org.openzen.zenscript.codemodel.type.InvalidTypeID;
27
 import org.openzen.zenscript.codemodel.type.StoredType;
28
 import org.openzen.zenscript.codemodel.type.StoredType;
28
 import org.openzen.zenscript.codemodel.type.storage.AutoStorageTag;
29
 import org.openzen.zenscript.codemodel.type.storage.AutoStorageTag;
29
 import org.openzen.zenscript.codemodel.type.storage.StorageTag;
30
 import org.openzen.zenscript.codemodel.type.storage.StorageTag;
76
 		if (header.getReturnType().isBasic(BasicTypeID.UNDETERMINED)) {
77
 		if (header.getReturnType().isBasic(BasicTypeID.UNDETERMINED)) {
77
 			StoredType returnType = statements.getReturnType();
78
 			StoredType returnType = statements.getReturnType();
78
 			if (returnType == null)
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
 		if (!scope.genericInferenceMap.isEmpty()) {
85
 		if (!scope.genericInferenceMap.isEmpty()) {

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

19
 import org.openzen.zenscript.codemodel.type.member.TypeMemberGroup;
19
 import org.openzen.zenscript.codemodel.type.member.TypeMemberGroup;
20
 import org.openzen.zenscript.codemodel.scope.ExpressionScope;
20
 import org.openzen.zenscript.codemodel.scope.ExpressionScope;
21
 import org.openzen.zenscript.codemodel.type.StoredType;
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
 import org.openzen.zenscript.parser.type.IParsedType;
25
 import org.openzen.zenscript.parser.type.IParsedType;
23
 
26
 
24
 /**
27
 /**
49
 	
52
 	
50
 	public static Expression compile(CodePosition position, StoredType type, ParsedCallArguments arguments, ExpressionScope scope) {
53
 	public static Expression compile(CodePosition position, StoredType type, ParsedCallArguments arguments, ExpressionScope scope) {
51
 		try {
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
 			List<StoredType>[] predictedTypes = constructors.predictCallTypes(scope, scope.hints, arguments.arguments.size());
62
 			List<StoredType>[] predictedTypes = constructors.predictCallTypes(scope, scope.hints, arguments.arguments.size());
54
 			CallArguments compiledArguments = arguments.compileCall(position, scope, null, constructors);
63
 			CallArguments compiledArguments = arguments.compileCall(position, scope, null, constructors);
55
 			FunctionalMemberRef member = constructors.selectMethod(position, scope, compiledArguments, true, true);
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
 	NO_SUCH_STORAGE_TYPE,
75
 	NO_SUCH_STORAGE_TYPE,
76
 	INVALID_STORAGE_TYPE_ARGUMENTS,
76
 	INVALID_STORAGE_TYPE_ARGUMENTS,
77
 	STORAGE_NOT_SUPPORTED,
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
 		statement.value.accept(new ExpressionValidator(validator, new StatementExpressionScope()));
177
 		statement.value.accept(new ExpressionValidator(validator, new StatementExpressionScope()));
178
 		
178
 		
179
 		for (SwitchCase switchCase : statement.cases) {
179
 		for (SwitchCase switchCase : statement.cases) {
180
+			for (Statement caseStatement : switchCase.statements)
181
+				caseStatement.accept(this);
182
+			
180
 			// TODO: finish this
183
 			// TODO: finish this
181
 		}
184
 		}
182
 		
185
 		

Loading…
Cancel
Save