Browse Source

Revamped the compilation system; it now works fully modular. Also, a new ScriptingEngine class has been created to make it very easy to create a scripting environment.

Stan Hebben 6 years ago
parent
commit
67ee99945e
77 changed files with 1371 additions and 1089 deletions
  1. 10
    9
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/FunctionHeader.java
  2. 9
    6
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/GenericMapper.java
  3. 4
    4
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/AnnotationProcessor.java
  4. 3
    3
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/PreconditionAnnotationDefinition.java
  5. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/PreconditionForMethod.java
  6. 14
    11
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/StatementContext.java
  7. 9
    5
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/TypeContext.java
  8. 2
    2
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/Expression.java
  9. 5
    5
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ExpressionBuilder.java
  10. 38
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ExpressionSymbol.java
  11. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/partial/IPartialExpression.java
  12. 2
    2
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/partial/PartialGlobalExpression.java
  13. 2
    2
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/partial/PartialMemberGroupExpression.java
  14. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/partial/PartialPackageExpression.java
  15. 2
    2
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/partial/PartialStaticMemberGroupExpression.java
  16. 2
    2
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/partial/PartialTypeExpression.java
  17. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/partial/PartialVariantOptionExpression.java
  18. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/scope/DefinitionScope.java
  19. 4
    4
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/scope/FunctionScope.java
  20. 0
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/BasicTypeID.java
  21. 2
    2
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/DefinitionTypeID.java
  22. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/GenericTypeID.java
  23. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/OptionalTypeID.java
  24. 1
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/StoredType.java
  25. 3
    3
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/member/TypeMemberBuilder.java
  26. 11
    11
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/member/TypeMemberGroup.java
  27. 5
    2
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/storage/StorageTag.java
  28. 1
    8
      CompilerShared/src/main/java/org/openzen/zenscript/compiler/SemanticModule.java
  29. 1
    1
      CompilerShared/src/main/java/org/openzen/zenscript/compiler/ZenCodeCompiler.java
  30. 178
    6
      Constructor/src/main/java/org/openzen/zenscript/constructor/ConstructorRegistry.java
  31. 4
    0
      JavaAnnotations/src/main/java/org/openzen/zencode/java/ZenCodeType.java
  32. 7
    6
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeContext.java
  33. 0
    53
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeJarTarget.java
  34. 0
    27
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeJarTargetType.java
  35. 3
    0
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeModule.java
  36. 0
    50
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeRunTarget.java
  37. 0
    27
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeRunTargetType.java
  38. 22
    3
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeRunUnit.java
  39. 31
    140
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaCompiler.java
  40. 0
    76
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaModule.java
  41. 1
    9
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaExpressionVisitor.java
  42. 22
    0
      JavaIntegration/build.gradle
  43. 538
    0
      JavaIntegration/src/main/java/org/openzen/zencode/java/JavaNativeModule.java
  44. 129
    0
      JavaIntegration/src/main/java/org/openzen/zencode/java/ScriptingEngine.java
  45. 3
    0
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaCompileSpace.java
  46. 0
    12
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaCompiledModule.java
  47. 27
    9
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaContext.java
  48. 11
    0
      JavaShared/src/main/java/org/openzen/zenscript/javashared/SimpleJavaCompileSpace.java
  49. 5
    5
      JavaShared/src/main/java/org/openzen/zenscript/javashared/prepare/JavaPrepareDefinitionVisitor.java
  50. 5
    5
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaDefinitionVisitor.java
  51. 43
    0
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaDirectoryOutput.java
  52. 5
    4
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaMemberCompiler.java
  53. 40
    85
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceCompiler.java
  54. 7
    5
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceContext.java
  55. 24
    41
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceFile.java
  56. 40
    0
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceModule.java
  57. 5
    17
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceSyntheticHelperGenerator.java
  58. 22
    33
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceSyntheticTypeGenerator.java
  59. 0
    53
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceTarget.java
  60. 0
    26
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceTargetType.java
  61. 4
    5
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/scope/JavaSourceFileScope.java
  62. 1
    1
      Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedFunction.java
  63. 1
    1
      Parser/src/main/java/org/openzen/zenscript/parser/expression/ParsedExpressionBinary.java
  64. 1
    1
      Parser/src/main/java/org/openzen/zenscript/parser/expression/ParsedExpressionFunction.java
  65. 5
    5
      Parser/src/main/java/org/openzen/zenscript/parser/expression/ParsedExpressionIndex.java
  66. 2
    2
      Parser/src/main/java/org/openzen/zenscript/parser/expression/ParsedExpressionOpAssign.java
  67. 2
    4
      Parser/src/main/java/org/openzen/zenscript/parser/expression/ParsedNewExpression.java
  68. 1
    1
      Parser/src/main/java/org/openzen/zenscript/parser/member/ParsedFunctionalMember.java
  69. 1
    1
      Parser/src/main/java/org/openzen/zenscript/parser/member/ParsedGetter.java
  70. 1
    1
      Parser/src/main/java/org/openzen/zenscript/parser/member/ParsedIterator.java
  71. 1
    0
      Parser/src/main/java/org/openzen/zenscript/parser/member/ParsedSetter.java
  72. 1
    1
      Parser/src/main/java/org/openzen/zenscript/parser/member/ParsedStaticInitializer.java
  73. 1
    1
      ScriptingExample/build.gradle
  74. 0
    26
      ScriptingExample/src/main/java/org/openzen/zenscript/scriptingexample/FileContents.java
  75. 0
    131
      ScriptingExample/src/main/java/org/openzen/zenscript/scriptingexample/GlobalRegistry.java
  76. 21
    0
      ScriptingExample/src/main/java/org/openzen/zenscript/scriptingexample/Globals.java
  77. 19
    124
      ScriptingExample/src/main/java/org/openzen/zenscript/scriptingexample/Main.java

+ 10
- 9
CodeModel/src/main/java/org/openzen/zenscript/codemodel/FunctionHeader.java View File

9
 import java.util.HashMap;
9
 import java.util.HashMap;
10
 import java.util.List;
10
 import java.util.List;
11
 import java.util.Map;
11
 import java.util.Map;
12
+import org.openzen.zencode.shared.CodePosition;
12
 import org.openzen.zenscript.codemodel.expression.CallArguments;
13
 import org.openzen.zenscript.codemodel.expression.CallArguments;
13
 import org.openzen.zenscript.codemodel.expression.Expression;
14
 import org.openzen.zenscript.codemodel.expression.Expression;
14
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
15
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
180
 		return new FunctionHeader(resultTypeParameters, resultReturnType, resultThrownType, resultStorage, resultParameters);
181
 		return new FunctionHeader(resultTypeParameters, resultReturnType, resultThrownType, resultStorage, resultParameters);
181
 	}
182
 	}
182
 	
183
 	
183
-	public boolean matchesExactly(CallArguments arguments, TypeScope scope) {
184
+	public boolean matchesExactly(CodePosition position, CallArguments arguments, TypeScope scope) {
184
 		if (arguments.arguments.length < minParameters || arguments.arguments.length > maxParameters)
185
 		if (arguments.arguments.length < minParameters || arguments.arguments.length > maxParameters)
185
 			return false;
186
 			return false;
186
 		
187
 		
187
-		FunctionHeader header = fillGenericArguments(scope, arguments.typeArguments);
188
+		FunctionHeader header = fillGenericArguments(position, scope, arguments.typeArguments);
188
 		for (int i = 0; i < header.parameters.length; i++) {
189
 		for (int i = 0; i < header.parameters.length; i++) {
189
 			if (!arguments.arguments[i].type.equals(header.parameters[i].type))
190
 			if (!arguments.arguments[i].type.equals(header.parameters[i].type))
190
 				return false;
191
 				return false;
193
 		return true;
194
 		return true;
194
 	}
195
 	}
195
 	
196
 	
196
-	public boolean matchesImplicitly(CallArguments arguments, TypeScope scope) {
197
+	public boolean matchesImplicitly(CodePosition position, CallArguments arguments, TypeScope scope) {
197
 		if (arguments.arguments.length < minParameters || arguments.arguments.length > maxParameters)
198
 		if (arguments.arguments.length < minParameters || arguments.arguments.length > maxParameters)
198
 			return false;
199
 			return false;
199
 		
200
 		
200
-		FunctionHeader header = fillGenericArguments(scope, arguments.typeArguments);
201
+		FunctionHeader header = fillGenericArguments(position, scope, arguments.typeArguments);
201
 		for (int i = 0; i < header.parameters.length; i++) {
202
 		for (int i = 0; i < header.parameters.length; i++) {
202
 			if (!scope.getTypeMembers(arguments.arguments[i].type).canCastImplicit(header.parameters[i].type))
203
 			if (!scope.getTypeMembers(arguments.arguments[i].type).canCastImplicit(header.parameters[i].type))
203
 				return false;
204
 				return false;
361
 		return true;
362
 		return true;
362
 	}
363
 	}
363
 	
364
 	
364
-	public FunctionHeader instanceForCall(GlobalTypeRegistry registry, CallArguments arguments) {
365
+	public FunctionHeader instanceForCall(CodePosition position, GlobalTypeRegistry registry, CallArguments arguments) {
365
 		if (arguments.getNumberOfTypeArguments() > 0) {
366
 		if (arguments.getNumberOfTypeArguments() > 0) {
366
 			Map<TypeParameter, StoredType> typeParameters = StoredType.getMapping(this.typeParameters, arguments.typeArguments);
367
 			Map<TypeParameter, StoredType> typeParameters = StoredType.getMapping(this.typeParameters, arguments.typeArguments);
367
-			return instance(new GenericMapper(registry, typeParameters));
368
+			return instance(new GenericMapper(position, registry, typeParameters));
368
 		} else {
369
 		} else {
369
 			return this;
370
 			return this;
370
 		}
371
 		}
372
 	
373
 	
373
 	public FunctionHeader withGenericArguments(GenericMapper mapper) {
374
 	public FunctionHeader withGenericArguments(GenericMapper mapper) {
374
 		if (typeParameters.length > 0)
375
 		if (typeParameters.length > 0)
375
-			mapper = mapper.getInner(mapper.registry, StoredType.getSelfMapping(mapper.registry, typeParameters));
376
+			mapper = mapper.getInner(mapper.position, mapper.registry, StoredType.getSelfMapping(mapper.registry, typeParameters));
376
 		
377
 		
377
 		return instance(mapper);
378
 		return instance(mapper);
378
 	}
379
 	}
386
 		return new FunctionHeader(typeParameters, returnType, thrownType == null ? null : thrownType.instance(mapper), storage, parameters);
387
 		return new FunctionHeader(typeParameters, returnType, thrownType == null ? null : thrownType.instance(mapper), storage, parameters);
387
 	}
388
 	}
388
 	
389
 	
389
-	public FunctionHeader fillGenericArguments(TypeScope scope, StoredType[] arguments) {
390
+	public FunctionHeader fillGenericArguments(CodePosition position, TypeScope scope, StoredType[] arguments) {
390
 		if (arguments == null || arguments.length == 0)
391
 		if (arguments == null || arguments.length == 0)
391
 			return this;
392
 			return this;
392
 		
393
 		
393
 		Map<TypeParameter, StoredType> typeArguments = StoredType.getMapping(typeParameters, arguments);
394
 		Map<TypeParameter, StoredType> typeArguments = StoredType.getMapping(typeParameters, arguments);
394
-		GenericMapper mapper = scope.getLocalTypeParameters().getInner(scope.getTypeRegistry(), typeArguments);
395
+		GenericMapper mapper = scope.getLocalTypeParameters().getInner(position, scope.getTypeRegistry(), typeArguments);
395
 		
396
 		
396
 		StoredType returnType = this.returnType.instance(mapper);
397
 		StoredType returnType = this.returnType.instance(mapper);
397
 		FunctionParameter[] parameters = new FunctionParameter[this.parameters.length];
398
 		FunctionParameter[] parameters = new FunctionParameter[this.parameters.length];

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

8
 import java.util.Collections;
8
 import java.util.Collections;
9
 import java.util.HashMap;
9
 import java.util.HashMap;
10
 import java.util.Map;
10
 import java.util.Map;
11
+import org.openzen.zencode.shared.CodePosition;
11
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
12
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
12
 import org.openzen.zenscript.codemodel.type.GenericTypeID;
13
 import org.openzen.zenscript.codemodel.type.GenericTypeID;
13
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
14
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
18
  * @author Hoofdgebruiker
19
  * @author Hoofdgebruiker
19
  */
20
  */
20
 public class GenericMapper {
21
 public class GenericMapper {
21
-	public static final GenericMapper EMPTY = new GenericMapper(null, Collections.emptyMap());
22
+	public static final GenericMapper EMPTY = new GenericMapper(CodePosition.BUILTIN, null, Collections.emptyMap());
22
 	
23
 	
24
+	public final CodePosition position;
23
 	public final GlobalTypeRegistry registry;
25
 	public final GlobalTypeRegistry registry;
24
 	private final Map<TypeParameter, StoredType> mapping;
26
 	private final Map<TypeParameter, StoredType> mapping;
25
 	
27
 	
26
-	public GenericMapper(GlobalTypeRegistry registry, Map<TypeParameter, StoredType> mapping) {
28
+	public GenericMapper(CodePosition position, GlobalTypeRegistry registry, Map<TypeParameter, StoredType> mapping) {
29
+		this.position = position;
27
 		this.registry = registry;
30
 		this.registry = registry;
28
 		this.mapping = mapping;
31
 		this.mapping = mapping;
29
 	}
32
 	}
57
 		return mapping.isEmpty() ? original : original.withGenericArguments(this);
60
 		return mapping.isEmpty() ? original : original.withGenericArguments(this);
58
 	}
61
 	}
59
 	
62
 	
60
-	public GenericMapper getInner(GlobalTypeRegistry registry, Map<TypeParameter, StoredType> mapping) {
63
+	public GenericMapper getInner(CodePosition position, GlobalTypeRegistry registry, Map<TypeParameter, StoredType> mapping) {
61
 		Map<TypeParameter, StoredType> resultMap = new HashMap<>(this.mapping);
64
 		Map<TypeParameter, StoredType> resultMap = new HashMap<>(this.mapping);
62
 		resultMap.putAll(mapping);
65
 		resultMap.putAll(mapping);
63
-		return new GenericMapper(registry, resultMap);
66
+		return new GenericMapper(position, registry, resultMap);
64
 	}
67
 	}
65
 	
68
 	
66
-	public GenericMapper getInner(GlobalTypeRegistry registry, TypeParameter[] parameters) {
69
+	public GenericMapper getInner(CodePosition position, GlobalTypeRegistry registry, TypeParameter[] parameters) {
67
 		Map<TypeParameter, StoredType> resultMap = new HashMap<>(this.mapping);
70
 		Map<TypeParameter, StoredType> resultMap = new HashMap<>(this.mapping);
68
 		for (TypeParameter parameter : parameters)
71
 		for (TypeParameter parameter : parameters)
69
 			resultMap.put(parameter, new StoredType(registry.getGeneric(parameter), null));
72
 			resultMap.put(parameter, new StoredType(registry.getGeneric(parameter), null));
70
-		return new GenericMapper(registry, resultMap);
73
+		return new GenericMapper(position, registry, resultMap);
71
 	}
74
 	}
72
 	
75
 	
73
 	@Override
76
 	@Override

+ 4
- 4
CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/AnnotationProcessor.java View File

176
 
176
 
177
 		@Override
177
 		@Override
178
 		public Void visitStaticInitializer(StaticInitializerMember member) {
178
 		public Void visitStaticInitializer(StaticInitializerMember member) {
179
-			StatementScope scope = new FunctionScope(this.scope, new FunctionHeader(BasicTypeID.VOID));
179
+			StatementScope scope = new FunctionScope(member.position, this.scope, new FunctionHeader(BasicTypeID.VOID));
180
 			if (member.body == null) {
180
 			if (member.body == null) {
181
 				throw new IllegalStateException("No body in static initializer @ " + member.position);
181
 				throw new IllegalStateException("No body in static initializer @ " + member.position);
182
 			} else {
182
 			} else {
196
 			if (member.body == null)
196
 			if (member.body == null)
197
 				return null;
197
 				return null;
198
 			
198
 			
199
-			StatementScope scope = new FunctionScope(this.scope, member.header);
199
+			StatementScope scope = new FunctionScope(member.position, this.scope, member.header);
200
 			member.body = process(member.body, scope);
200
 			member.body = process(member.body, scope);
201
 			return null;
201
 			return null;
202
 		}
202
 		}
212
 			if (member.body == null)
212
 			if (member.body == null)
213
 				return null;
213
 				return null;
214
 			
214
 			
215
-			StatementScope scope = new FunctionScope(this.scope, new FunctionHeader(member.getType()));
215
+			StatementScope scope = new FunctionScope(member.position, this.scope, new FunctionHeader(member.getType()));
216
 			member.body = process(member.body, scope);
216
 			member.body = process(member.body, scope);
217
 			return null;
217
 			return null;
218
 		}
218
 		}
228
 			if (member.body == null)
228
 			if (member.body == null)
229
 				return null;
229
 				return null;
230
 			
230
 			
231
-			StatementScope scope = new FunctionScope(this.scope, new FunctionHeader(BasicTypeID.VOID, member.parameter));
231
+			StatementScope scope = new FunctionScope(member.position, this.scope, new FunctionHeader(BasicTypeID.VOID, member.parameter));
232
 			member.body = process(member.body, scope);
232
 			member.body = process(member.body, scope);
233
 			return null;
233
 			return null;
234
 		}
234
 		}

+ 3
- 3
CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/PreconditionAnnotationDefinition.java View File

61
 	public ExpressionScope getScopeForMember(IDefinitionMember member, BaseScope scope) {
61
 	public ExpressionScope getScopeForMember(IDefinitionMember member, BaseScope scope) {
62
 		if (member instanceof FunctionalMember) {
62
 		if (member instanceof FunctionalMember) {
63
 			FunctionHeader header = ((FunctionalMember)member).header;
63
 			FunctionHeader header = ((FunctionalMember)member).header;
64
-			return new ExpressionScope(new FunctionScope(scope, header));
64
+			return new ExpressionScope(new FunctionScope(((FunctionalMember) member).position, scope, header));
65
 		} else {
65
 		} else {
66
 			throw new UnsupportedOperationException("Can only assign preconditions to methods");
66
 			throw new UnsupportedOperationException("Can only assign preconditions to methods");
67
 		}
67
 		}
71
 	public ExpressionScope getScopeForType(HighLevelDefinition definition, BaseScope scope) {
71
 	public ExpressionScope getScopeForType(HighLevelDefinition definition, BaseScope scope) {
72
 		if (definition instanceof FunctionDefinition) {
72
 		if (definition instanceof FunctionDefinition) {
73
 			FunctionHeader header = ((FunctionDefinition)definition).header;
73
 			FunctionHeader header = ((FunctionDefinition)definition).header;
74
-			return new ExpressionScope(new FunctionScope(scope, header));
74
+			return new ExpressionScope(new FunctionScope(((FunctionDefinition) definition).position, scope, header));
75
 		} else {
75
 		} else {
76
 			throw new UnsupportedOperationException("Can only assign preconditions to functions");
76
 			throw new UnsupportedOperationException("Can only assign preconditions to functions");
77
 		}
77
 		}
114
 	public MemberAnnotation deserializeForMember(CodeSerializationInput input, TypeContext context, IDefinitionMember member) {
114
 	public MemberAnnotation deserializeForMember(CodeSerializationInput input, TypeContext context, IDefinitionMember member) {
115
 		CodePosition position = input.deserializePosition();
115
 		CodePosition position = input.deserializePosition();
116
 		String enforcement = input.readString();
116
 		String enforcement = input.readString();
117
-		StatementContext statementContext = new StatementContext(context, member.getHeader());
117
+		StatementContext statementContext = new StatementContext(position, context, member.getHeader());
118
 		Expression condition = input.deserializeExpression(statementContext);
118
 		Expression condition = input.deserializeExpression(statementContext);
119
 		Expression message = input.deserializeExpression(statementContext);
119
 		Expression message = input.deserializeExpression(statementContext);
120
 		return new PreconditionForMethod(position, enforcement, condition, message);
120
 		return new PreconditionForMethod(position, enforcement, condition, message);

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

109
 	public void serialize(CodeSerializationOutput output, IDefinitionMember member, TypeContext context) {
109
 	public void serialize(CodeSerializationOutput output, IDefinitionMember member, TypeContext context) {
110
 		output.serialize(position);
110
 		output.serialize(position);
111
 		output.writeString(enforcement);
111
 		output.writeString(enforcement);
112
-		StatementContext statementContext = new StatementContext(context, member.getHeader());
112
+		StatementContext statementContext = new StatementContext(position, context, member.getHeader());
113
 		output.serialize(statementContext, condition);
113
 		output.serialize(statementContext, condition);
114
 		output.serialize(statementContext, message);
114
 		output.serialize(statementContext, message);
115
 	}
115
 	}

+ 14
- 11
CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/StatementContext.java View File

8
 import java.util.ArrayList;
8
 import java.util.ArrayList;
9
 import java.util.Arrays;
9
 import java.util.Arrays;
10
 import java.util.List;
10
 import java.util.List;
11
+import org.openzen.zencode.shared.CodePosition;
11
 import org.openzen.zenscript.codemodel.FunctionHeader;
12
 import org.openzen.zenscript.codemodel.FunctionHeader;
12
 import org.openzen.zenscript.codemodel.FunctionParameter;
13
 import org.openzen.zenscript.codemodel.FunctionParameter;
13
 import org.openzen.zenscript.codemodel.expression.LambdaClosure;
14
 import org.openzen.zenscript.codemodel.expression.LambdaClosure;
30
 	
31
 	
31
 	public VariantOptionSwitchValue variantOptionSwitchValue;
32
 	public VariantOptionSwitchValue variantOptionSwitchValue;
32
 	
33
 	
33
-	public StatementContext(ModuleContext module, StoredType thisType) {
34
-		super(module, TypeParameter.NONE, thisType);
34
+	public StatementContext(CodePosition position, ModuleContext module, StoredType thisType) {
35
+		super(position, module, TypeParameter.NONE, thisType);
35
 		
36
 		
36
 		loops = LoopStatement.NONE;
37
 		loops = LoopStatement.NONE;
37
 		header = null;
38
 		header = null;
39
 		lambdaOuter = null;
40
 		lambdaOuter = null;
40
 	}
41
 	}
41
 	
42
 	
42
-	public StatementContext(ModuleContext module, StoredType thisType, FunctionHeader header) {
43
-		super(module, header.typeParameters, thisType);
43
+	public StatementContext(CodePosition position, ModuleContext module, StoredType thisType, FunctionHeader header) {
44
+		super(position, module, header.typeParameters, thisType);
44
 		
45
 		
45
 		loops = LoopStatement.NONE;
46
 		loops = LoopStatement.NONE;
46
 		this.header = header;
47
 		this.header = header;
48
 		lambdaOuter = null;
49
 		lambdaOuter = null;
49
 	}
50
 	}
50
 	
51
 	
51
-	public StatementContext(TypeContext outer) {
52
-		super(outer.moduleContext, outer.typeParameters, outer.thisType);
52
+	public StatementContext(CodePosition position, TypeContext outer) {
53
+		super(position, outer.moduleContext, outer.typeParameters, outer.thisType);
54
+		
53
 		loops = LoopStatement.NONE;
55
 		loops = LoopStatement.NONE;
54
 		header = null;
56
 		header = null;
55
 		closure = null;
57
 		closure = null;
56
 		lambdaOuter = null;
58
 		lambdaOuter = null;
57
 	}
59
 	}
58
 	
60
 	
59
-	public StatementContext(TypeContext outer, FunctionHeader header) {
60
-		super(outer, outer.thisType, header == null ? TypeParameter.NONE : header.typeParameters);
61
+	public StatementContext(CodePosition position, TypeContext outer, FunctionHeader header) {
62
+		super(position, outer, outer.thisType, header == null ? TypeParameter.NONE : header.typeParameters);
63
+		
61
 		loops = LoopStatement.NONE;
64
 		loops = LoopStatement.NONE;
62
 		this.header = header;
65
 		this.header = header;
63
 		closure = null;
66
 		closure = null;
65
 	}
68
 	}
66
 	
69
 	
67
 	public StatementContext(StatementContext outer) {
70
 	public StatementContext(StatementContext outer) {
68
-		super(outer.moduleContext, outer.typeParameters, outer.thisType);
71
+		super(outer.position, outer.moduleContext, outer.typeParameters, outer.thisType);
69
 		
72
 		
70
 		variables.addAll(outer.variables);
73
 		variables.addAll(outer.variables);
71
 		loops = outer.loops;
74
 		loops = outer.loops;
75
 	}
78
 	}
76
 	
79
 	
77
 	public StatementContext(StatementContext outer, LoopStatement loop) {
80
 	public StatementContext(StatementContext outer, LoopStatement loop) {
78
-		super(outer.moduleContext, outer.typeParameters, outer.thisType);
81
+		super(outer.position, outer.moduleContext, outer.typeParameters, outer.thisType);
79
 		
82
 		
80
 		variables.addAll(outer.variables);
83
 		variables.addAll(outer.variables);
81
 		loops = Arrays.copyOf(outer.loops, outer.loops.length + 1);
84
 		loops = Arrays.copyOf(outer.loops, outer.loops.length + 1);
86
 	}
89
 	}
87
 	
90
 	
88
 	public StatementContext(StatementContext outer, FunctionHeader lambdaHeader, LambdaClosure lambdaClosure) {
91
 	public StatementContext(StatementContext outer, FunctionHeader lambdaHeader, LambdaClosure lambdaClosure) {
89
-		super(outer, outer.thisType, lambdaHeader.typeParameters);
92
+		super(outer.position, outer, outer.thisType, lambdaHeader.typeParameters);
90
 		
93
 		
91
 		loops = LoopStatement.NONE;
94
 		loops = LoopStatement.NONE;
92
 		header = lambdaHeader;
95
 		header = lambdaHeader;

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

8
 import java.util.Arrays;
8
 import java.util.Arrays;
9
 import java.util.List;
9
 import java.util.List;
10
 import java.util.Map;
10
 import java.util.Map;
11
+import org.openzen.zencode.shared.CodePosition;
11
 import org.openzen.zenscript.codemodel.GenericMapper;
12
 import org.openzen.zenscript.codemodel.GenericMapper;
12
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
13
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
13
 import org.openzen.zenscript.codemodel.type.StoredType;
14
 import org.openzen.zenscript.codemodel.type.StoredType;
19
  * @author Hoofdgebruiker
20
  * @author Hoofdgebruiker
20
  */
21
  */
21
 public class TypeContext {
22
 public class TypeContext {
23
+	protected final CodePosition position;
22
 	protected final TypeParameter[] typeParameters;
24
 	protected final TypeParameter[] typeParameters;
23
 	public final StoredType thisType;
25
 	public final StoredType thisType;
24
 	private final LocalMemberCache memberCache;
26
 	private final LocalMemberCache memberCache;
25
 	public final ModuleContext moduleContext;
27
 	public final ModuleContext moduleContext;
26
 	
28
 	
27
-	public TypeContext(ModuleContext context, TypeParameter[] parameters, StoredType thisType) {
29
+	public TypeContext(CodePosition position, ModuleContext context, TypeParameter[] parameters, StoredType thisType) {
30
+		this.position = position;
28
 		this.typeParameters = parameters;
31
 		this.typeParameters = parameters;
29
 		this.thisType = thisType;
32
 		this.thisType = thisType;
30
 		memberCache = new LocalMemberCache(context.registry, context.expansions);
33
 		memberCache = new LocalMemberCache(context.registry, context.expansions);
31
 		moduleContext = context;
34
 		moduleContext = context;
32
 	}
35
 	}
33
 	
36
 	
34
-	public TypeContext(TypeContext outer, StoredType thisType, TypeParameter... inner) {
37
+	public TypeContext(CodePosition position, TypeContext outer, StoredType thisType, TypeParameter... inner) {
38
+		this.position = position;
35
 		typeParameters = concat(outer.typeParameters, inner);
39
 		typeParameters = concat(outer.typeParameters, inner);
36
 		this.thisType = thisType;
40
 		this.thisType = thisType;
37
 		moduleContext = outer.moduleContext;
41
 		moduleContext = outer.moduleContext;
38
 		memberCache = new LocalMemberCache(moduleContext.registry, moduleContext.expansions);
42
 		memberCache = new LocalMemberCache(moduleContext.registry, moduleContext.expansions);
39
 	}
43
 	}
40
 	
44
 	
41
-	public TypeContext(TypeContext outer, StoredType thisType, List<TypeParameter> inner) {
42
-		this(outer, thisType, inner.toArray(new TypeParameter[inner.size()]));
45
+	public TypeContext(CodePosition position, TypeContext outer, StoredType thisType, List<TypeParameter> inner) {
46
+		this(position, outer, thisType, inner.toArray(new TypeParameter[inner.size()]));
43
 	}
47
 	}
44
 	
48
 	
45
 	public int getId(TypeParameter parameter) {
49
 	public int getId(TypeParameter parameter) {
60
 	
64
 	
61
 	public GenericMapper getMapper() {
65
 	public GenericMapper getMapper() {
62
 		Map<TypeParameter, StoredType> mapper = StoredType.getSelfMapping(moduleContext.registry, typeParameters);
66
 		Map<TypeParameter, StoredType> mapper = StoredType.getSelfMapping(moduleContext.registry, typeParameters);
63
-		return new GenericMapper(moduleContext.registry, mapper);
67
+		return new GenericMapper(position, moduleContext.registry, mapper);
64
 	}
68
 	}
65
 	
69
 	
66
 	public static <T> T[] concat(T[] first, T[] second) {
70
 	public static <T> T[] concat(T[] first, T[] second) {

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

101
 	}
101
 	}
102
 	
102
 	
103
 	@Override
103
 	@Override
104
-	public List<StoredType>[] predictCallTypes(TypeScope scope, List<StoredType> hints, int arguments) {
105
-		return scope.getTypeMembers(type).getOrCreateGroup(OperatorType.CALL).predictCallTypes(scope, hints, arguments);
104
+	public List<StoredType>[] predictCallTypes(CodePosition position, TypeScope scope, List<StoredType> hints, int arguments) {
105
+		return scope.getTypeMembers(type).getOrCreateGroup(OperatorType.CALL).predictCallTypes(position, scope, hints, arguments);
106
 	}
106
 	}
107
 	
107
 	
108
 	@Override
108
 	@Override

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

34
 		this.scope = scope;
34
 		this.scope = scope;
35
 	}
35
 	}
36
 	
36
 	
37
-	public Expression constructNew(String typename, Expression... arguments) throws CompileException {
37
+	public Expression constructNew(CodePosition position, String typename, Expression... arguments) throws CompileException {
38
 		String[] nameParts = Strings.split(typename, '.');
38
 		String[] nameParts = Strings.split(typename, '.');
39
 		List<GenericName> name = new ArrayList<>();
39
 		List<GenericName> name = new ArrayList<>();
40
 		for (String namePart : nameParts)
40
 		for (String namePart : nameParts)
43
 		if (type == null)
43
 		if (type == null)
44
 			throw new CompileException(position, CompileExceptionCode.NO_SUCH_TYPE, "No such type: " + typename);
44
 			throw new CompileException(position, CompileExceptionCode.NO_SUCH_TYPE, "No such type: " + typename);
45
 		
45
 		
46
-		return constructNew(type.stored(UniqueStorageTag.INSTANCE), arguments);
46
+		return constructNew(position, type.stored(UniqueStorageTag.INSTANCE), arguments);
47
 	}
47
 	}
48
 	
48
 	
49
-	public Expression constructNew(StoredType type, Expression... arguments) throws CompileException {
49
+	public Expression constructNew(CodePosition position, StoredType type, Expression... arguments) throws CompileException {
50
 		TypeMemberGroup constructors = scope.getTypeMembers(type).getOrCreateGroup(OperatorType.CONSTRUCTOR);
50
 		TypeMemberGroup constructors = scope.getTypeMembers(type).getOrCreateGroup(OperatorType.CONSTRUCTOR);
51
-		List<StoredType>[] predictedTypes = constructors.predictCallTypes(scope, scope.hints, arguments.length);
51
+		List<StoredType>[] predictedTypes = constructors.predictCallTypes(position, scope, scope.hints, arguments.length);
52
 		CallArguments compiledArguments = new CallArguments(arguments);
52
 		CallArguments compiledArguments = new CallArguments(arguments);
53
 		FunctionalMemberRef member = constructors.selectMethod(position, scope, compiledArguments, true, true);
53
 		FunctionalMemberRef member = constructors.selectMethod(position, scope, compiledArguments, true, true);
54
 		if (member == null)
54
 		if (member == null)
61
 				type,
61
 				type,
62
 				member,
62
 				member,
63
 				compiledArguments,
63
 				compiledArguments,
64
-				compiledArguments.getNumberOfTypeArguments() == 0 ? member.getHeader() : member.getHeader().fillGenericArguments(scope, compiledArguments.typeArguments));
64
+				compiledArguments.getNumberOfTypeArguments() == 0 ? member.getHeader() : member.getHeader().fillGenericArguments(CodePosition.BUILTIN, scope, compiledArguments.typeArguments));
65
 	}
65
 	}
66
 	
66
 	
67
 	public Expression not(Expression value) throws CompileException {
67
 	public Expression not(Expression value) throws CompileException {

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

1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.codemodel.expression;
7
+
8
+import java.util.function.BiFunction;
9
+import java.util.function.Function;
10
+import org.openzen.zencode.shared.CodePosition;
11
+import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
12
+import org.openzen.zenscript.codemodel.partial.IPartialExpression;
13
+import org.openzen.zenscript.codemodel.scope.BaseScope;
14
+import org.openzen.zenscript.codemodel.type.ISymbol;
15
+import org.openzen.zenscript.codemodel.type.StoredType;
16
+import org.openzen.zenscript.codemodel.type.TypeID;
17
+
18
+/**
19
+ *
20
+ * @author Hoofdgebruiker
21
+ */
22
+public class ExpressionSymbol implements ISymbol {
23
+	private final BiFunction<CodePosition, BaseScope, IPartialExpression> function;
24
+	
25
+	public ExpressionSymbol(BiFunction<CodePosition, BaseScope, IPartialExpression> function) {
26
+		this.function = function;
27
+	}
28
+
29
+	@Override
30
+	public IPartialExpression getExpression(CodePosition position, BaseScope scope, StoredType[] typeArguments) {
31
+		return function.apply(position, scope);
32
+	}
33
+
34
+	@Override
35
+	public TypeID getType(CodePosition position, TypeResolutionContext context, StoredType[] typeArguments) {
36
+		return null;
37
+	}
38
+}

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

31
 	
31
 	
32
 	Expression eval() throws CompileException;
32
 	Expression eval() throws CompileException;
33
 	
33
 	
34
-	List<StoredType>[] predictCallTypes(TypeScope scope, List<StoredType> hints, int arguments) throws CompileException;
34
+	List<StoredType>[] predictCallTypes(CodePosition position, TypeScope scope, List<StoredType> hints, int arguments) throws CompileException;
35
 	
35
 	
36
 	List<FunctionHeader> getPossibleFunctionHeaders(TypeScope scope, List<StoredType> hints, int arguments) throws CompileException;
36
 	List<FunctionHeader> getPossibleFunctionHeaders(TypeScope scope, List<StoredType> hints, int arguments) throws CompileException;
37
 	
37
 	

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

40
 	}
40
 	}
41
 
41
 
42
 	@Override
42
 	@Override
43
-	public List<StoredType>[] predictCallTypes(TypeScope scope, List<StoredType> hints, int arguments) throws CompileException {
44
-		return resolution.predictCallTypes(scope, hints, arguments);
43
+	public List<StoredType>[] predictCallTypes(CodePosition position, TypeScope scope, List<StoredType> hints, int arguments) throws CompileException {
44
+		return resolution.predictCallTypes(position, scope, hints, arguments);
45
 	}
45
 	}
46
 
46
 
47
 	@Override
47
 	@Override

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

82
 	}
82
 	}
83
 
83
 
84
 	@Override
84
 	@Override
85
-	public List<StoredType>[] predictCallTypes(TypeScope scope, List<StoredType> hints, int arguments) {
86
-		return group.predictCallTypes(scope, hints, arguments);
85
+	public List<StoredType>[] predictCallTypes(CodePosition position, TypeScope scope, List<StoredType> hints, int arguments) {
86
+		return group.predictCallTypes(position, scope, hints, arguments);
87
 	}
87
 	}
88
 	
88
 	
89
 	@Override
89
 	@Override

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

37
 	}
37
 	}
38
 
38
 
39
 	@Override
39
 	@Override
40
-	public List<StoredType>[] predictCallTypes(TypeScope scope, List<StoredType> hints, int arguments) {
40
+	public List<StoredType>[] predictCallTypes(CodePosition position, TypeScope scope, List<StoredType> hints, int arguments) {
41
 		return new List[arguments];
41
 		return new List[arguments];
42
 	}
42
 	}
43
 	
43
 	

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

52
 	}
52
 	}
53
 
53
 
54
 	@Override
54
 	@Override
55
-	public List<StoredType>[] predictCallTypes(TypeScope scope, List<StoredType> hints, int arguments) {
56
-		return group.predictCallTypes(scope, hints, arguments);
55
+	public List<StoredType>[] predictCallTypes(CodePosition position, TypeScope scope, List<StoredType> hints, int arguments) {
56
+		return group.predictCallTypes(position, scope, hints, arguments);
57
 	}
57
 	}
58
 	
58
 	
59
 	@Override
59
 	@Override

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

43
 	}
43
 	}
44
 
44
 
45
 	@Override
45
 	@Override
46
-	public List<StoredType>[] predictCallTypes(TypeScope scope, List<StoredType> hints, int arguments) {
47
-		return scope.getTypeMembers(type).getOrCreateGroup(OperatorType.CALL).predictCallTypes(scope, hints, arguments);
46
+	public List<StoredType>[] predictCallTypes(CodePosition position, TypeScope scope, List<StoredType> hints, int arguments) {
47
+		return scope.getTypeMembers(type).getOrCreateGroup(OperatorType.CALL).predictCallTypes(position, scope, hints, arguments);
48
 	}
48
 	}
49
 	
49
 	
50
 	@Override
50
 	@Override

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

42
 	}
42
 	}
43
 
43
 
44
 	@Override
44
 	@Override
45
-	public List<StoredType>[] predictCallTypes(TypeScope scope, List<StoredType> hints, int arguments) {
45
+	public List<StoredType>[] predictCallTypes(CodePosition position, TypeScope scope, List<StoredType> hints, int arguments) {
46
 		if (arguments != option.getOption().types.length)
46
 		if (arguments != option.getOption().types.length)
47
 			return new List[0];
47
 			return new List[0];
48
 		
48
 		

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

79
 		}
79
 		}
80
 		
80
 		
81
 		members = withMembers ? outer.getMemberCache().get(type) : null;
81
 		members = withMembers ? outer.getMemberCache().get(type) : null;
82
-		typeParameterMap = outer.getLocalTypeParameters().getInner(getTypeRegistry(), typeParameters);
82
+		typeParameterMap = outer.getLocalTypeParameters().getInner(definition.position, getTypeRegistry(), typeParameters);
83
 	}
83
 	}
84
 	
84
 	
85
 	public void addInnerType(String name, Supplier<HighLevelDefinition> innerType) {
85
 	public void addInnerType(String name, Supplier<HighLevelDefinition> innerType) {

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

36
 	private final StoredType thisType;
36
 	private final StoredType thisType;
37
 	private final DollarEvaluator dollar;
37
 	private final DollarEvaluator dollar;
38
 	
38
 	
39
-	public FunctionScope(BaseScope outer, FunctionHeader header) {
40
-		this(outer, header, null);
39
+	public FunctionScope(CodePosition position, BaseScope outer, FunctionHeader header) {
40
+		this(position, outer, header, null);
41
 	}
41
 	}
42
 	
42
 	
43
-	public FunctionScope(BaseScope outer, FunctionHeader header, DollarEvaluator dollar) {
43
+	public FunctionScope(CodePosition position, BaseScope outer, FunctionHeader header, DollarEvaluator dollar) {
44
 		this.outer = outer;
44
 		this.outer = outer;
45
 		this.header = header;
45
 		this.header = header;
46
 		this.thisType = outer.getThisType() == null || header.storage == null ? outer.getThisType() : outer.getThisType().type.stored(header.storage);
46
 		this.thisType = outer.getThisType() == null || header.storage == null ? outer.getThisType() : outer.getThisType().type.stored(header.storage);
51
 		if (header == null)
51
 		if (header == null)
52
 			throw new NullPointerException();
52
 			throw new NullPointerException();
53
 		
53
 		
54
-		typeParameterMap = outer.getLocalTypeParameters().getInner(outer.getTypeRegistry(), header.typeParameters);
54
+		typeParameterMap = outer.getLocalTypeParameters().getInner(position, outer.getTypeRegistry(), header.typeParameters);
55
 	}
55
 	}
56
 	
56
 	
57
 	@Override
57
 	@Override

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

12
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
13
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
13
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
14
 import org.openzen.zenscript.codemodel.type.storage.StorageTag;
14
 import org.openzen.zenscript.codemodel.type.storage.StorageTag;
15
-import org.openzen.zenscript.codemodel.type.storage.ValueStorageTag;
16
 
15
 
17
 /**
16
 /**
18
  *
17
  *

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

86
 			Map<TypeParameter, StoredType> typeMapping = new HashMap<>();
86
 			Map<TypeParameter, StoredType> typeMapping = new HashMap<>();
87
 			for (int i = 0; i < definition.typeParameters.length; i++)
87
 			for (int i = 0; i < definition.typeParameters.length; i++)
88
 				typeMapping.put(definition.typeParameters[i], typeArguments[i].getNormalized());
88
 				typeMapping.put(definition.typeParameters[i], typeArguments[i].getNormalized());
89
-			GenericMapper mapper = new GenericMapper(typeRegistry, typeMapping);
89
+			GenericMapper mapper = new GenericMapper(definition.position, typeRegistry, typeMapping);
90
 			TypeID result = alias.type.instance(mapper, null).type.getNormalized();
90
 			TypeID result = alias.type.instance(mapper, null).type.getNormalized();
91
 			return result;
91
 			return result;
92
 		}
92
 		}
153
 	
153
 	
154
 	@Override
154
 	@Override
155
 	public TypeID getSuperType(GlobalTypeRegistry registry) {
155
 	public TypeID getSuperType(GlobalTypeRegistry registry) {
156
-		return definition.getSuperType() == null ? null : definition.getSuperType().instance(new GenericMapper(registry, getTypeParameterMapping()), null).type;
156
+		return definition.getSuperType() == null ? null : definition.getSuperType().instance(new GenericMapper(definition.position, registry, getTypeParameterMapping()), null).type;
157
 	}
157
 	}
158
 	
158
 	
159
 	@Override
159
 	@Override

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

39
 	@Override
39
 	@Override
40
 	public StoredType instance(GenericMapper mapper, StorageTag storage) {
40
 	public StoredType instance(GenericMapper mapper, StorageTag storage) {
41
 		StoredType mapped = mapper.map(this);
41
 		StoredType mapped = mapper.map(this);
42
-		return new StoredType(mapped.type, StorageTag.union(mapped.getSpecifiedStorage(), storage));
42
+		return new StoredType(mapped.type, StorageTag.union(mapper.position, mapped.getSpecifiedStorage(), storage));
43
 	}
43
 	}
44
 	
44
 	
45
 	@Override
45
 	@Override

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

37
 	@Override
37
 	@Override
38
 	public StoredType instance(GenericMapper mapper, StorageTag storage) {
38
 	public StoredType instance(GenericMapper mapper, StorageTag storage) {
39
 		StoredType base = baseType.instance(mapper, storage);
39
 		StoredType base = baseType.instance(mapper, storage);
40
-		return mapper.registry.getOptional(base.type).stored(StorageTag.union(base.getSpecifiedStorage(), storage));
40
+		return mapper.registry.getOptional(base.type).stored(StorageTag.union(mapper.position, base.getSpecifiedStorage(), storage));
41
 	}
41
 	}
42
 	
42
 	
43
 	@Override
43
 	@Override

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

9
 import java.util.Map;
9
 import java.util.Map;
10
 import java.util.Objects;
10
 import java.util.Objects;
11
 import java.util.Set;
11
 import java.util.Set;
12
+import org.openzen.zencode.shared.CodePosition;
12
 import org.openzen.zenscript.codemodel.GenericMapper;
13
 import org.openzen.zenscript.codemodel.GenericMapper;
13
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
14
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
14
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
15
 import org.openzen.zenscript.codemodel.generic.TypeParameter;

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

104
 			if (mapping == null)
104
 			if (mapping == null)
105
 				continue;
105
 				continue;
106
 			
106
 			
107
-			GenericMapper mapper = new GenericMapper(registry, mapping);
107
+			GenericMapper mapper = new GenericMapper(definition.position, registry, mapping);
108
 			for (IDefinitionMember member : expansion.members)
108
 			for (IDefinitionMember member : expansion.members)
109
 				member.registerTo(members, TypeMemberPriority.SPECIFIED, mapper);
109
 				member.registerTo(members, TypeMemberPriority.SPECIFIED, mapper);
110
 		}
110
 		}
387
 	public Void visitGenericMap(Void context, GenericMapTypeID map) {
387
 	public Void visitGenericMap(Void context, GenericMapTypeID map) {
388
 		TypeParameter functionParameter = new TypeParameter(BUILTIN, "T");
388
 		TypeParameter functionParameter = new TypeParameter(BUILTIN, "T");
389
 		Map<TypeParameter, StoredType> parameterFilled = Collections.singletonMap(map.key, registry.getGeneric(functionParameter).stored());
389
 		Map<TypeParameter, StoredType> parameterFilled = Collections.singletonMap(map.key, registry.getGeneric(functionParameter).stored());
390
-		StoredType valueType = map.value.instance(new GenericMapper(registry, parameterFilled));
390
+		StoredType valueType = map.value.instance(new GenericMapper(CodePosition.BUILTIN, registry, parameterFilled));
391
 		
391
 		
392
 		FunctionHeader getOptionalHeader = new FunctionHeader(
392
 		FunctionHeader getOptionalHeader = new FunctionHeader(
393
 				new TypeParameter[] { functionParameter },
393
 				new TypeParameter[] { functionParameter },
447
 		GenericMapper mapper = null;
447
 		GenericMapper mapper = null;
448
 		if (definitionType.hasTypeParameters() || (definitionType.outer != null && definitionType.outer.hasTypeParameters())) {
448
 		if (definitionType.hasTypeParameters() || (definitionType.outer != null && definitionType.outer.hasTypeParameters())) {
449
 			Map<TypeParameter, StoredType> mapping = definitionType.getTypeParameterMapping();
449
 			Map<TypeParameter, StoredType> mapping = definitionType.getTypeParameterMapping();
450
-			mapper = new GenericMapper(registry, mapping);
450
+			mapper = new GenericMapper(CodePosition.BUILTIN, registry, mapping);
451
 		}
451
 		}
452
 		
452
 		
453
 		for (IDefinitionMember member : definition.members) {
453
 		for (IDefinitionMember member : definition.members) {

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

256
 		}
256
 		}
257
 	}
257
 	}
258
 	
258
 	
259
-	public List<StoredType>[] predictCallTypes(TypeScope scope, List<StoredType> typeHints, int arguments) {
259
+	public List<StoredType>[] predictCallTypes(CodePosition position, TypeScope scope, List<StoredType> typeHints, int arguments) {
260
 		List<StoredType>[] result = (List<StoredType>[])(new List[arguments]);
260
 		List<StoredType>[] result = (List<StoredType>[])(new List[arguments]);
261
 		for (int i = 0; i < result.length; i++)
261
 		for (int i = 0; i < result.length; i++)
262
 			result[i] = new ArrayList<>();
262
 			result[i] = new ArrayList<>();
270
 				for (StoredType resultHint : typeHints) {
270
 				for (StoredType resultHint : typeHints) {
271
 					Map<TypeParameter, StoredType> mapping = header.getReturnType().inferTypeParameters(scope.getMemberCache(), resultHint);
271
 					Map<TypeParameter, StoredType> mapping = header.getReturnType().inferTypeParameters(scope.getMemberCache(), resultHint);
272
 					if (mapping != null) {
272
 					if (mapping != null) {
273
-						header = header.withGenericArguments(scope.getLocalTypeParameters().getInner(scope.getTypeRegistry(), mapping));
273
+						header = header.withGenericArguments(scope.getLocalTypeParameters().getInner(position, scope.getTypeRegistry(), mapping));
274
 						break;
274
 						break;
275
 					}
275
 					}
276
 				}
276
 				}
287
 	
287
 	
288
 	public Expression call(CodePosition position, TypeScope scope, Expression target, CallArguments arguments, boolean allowStaticUsage) throws CompileException {
288
 	public Expression call(CodePosition position, TypeScope scope, Expression target, CallArguments arguments, boolean allowStaticUsage) throws CompileException {
289
 		FunctionalMemberRef method = selectMethod(position, scope, arguments, true, allowStaticUsage);
289
 		FunctionalMemberRef method = selectMethod(position, scope, arguments, true, allowStaticUsage);
290
-		FunctionHeader instancedHeader = method.getHeader().fillGenericArguments(scope, arguments.typeArguments);
290
+		FunctionHeader instancedHeader = method.getHeader().fillGenericArguments(position, scope, arguments.typeArguments);
291
 		for (int i = 0; i < arguments.arguments.length; i++) {
291
 		for (int i = 0; i < arguments.arguments.length; i++) {
292
 			arguments.arguments[i] = arguments.arguments[i].castImplicit(position, scope, instancedHeader.parameters[i].type);
292
 			arguments.arguments[i] = arguments.arguments[i].castImplicit(position, scope, instancedHeader.parameters[i].type);
293
 		}
293
 		}
316
 			CompareType compareType) throws CompileException
316
 			CompareType compareType) throws CompileException
317
 	{
317
 	{
318
 		FunctionalMemberRef method = selectMethod(position, scope, arguments, true, false);
318
 		FunctionalMemberRef method = selectMethod(position, scope, arguments, true, false);
319
-		FunctionHeader instancedHeader = method.getHeader().fillGenericArguments(scope, arguments.typeArguments);
319
+		FunctionHeader instancedHeader = method.getHeader().fillGenericArguments(position, scope, arguments.typeArguments);
320
 		return method.callWithComparator(position, compareType, target, instancedHeader, arguments, scope);
320
 		return method.callWithComparator(position, compareType, target, instancedHeader, arguments, scope);
321
 	}
321
 	}
322
 	
322
 	
323
 	public Expression callStatic(CodePosition position, TypeID target, TypeScope scope, CallArguments arguments) throws CompileException {
323
 	public Expression callStatic(CodePosition position, TypeID target, TypeScope scope, CallArguments arguments) throws CompileException {
324
 		FunctionalMemberRef method = selectMethod(position, scope, arguments, false, true);
324
 		FunctionalMemberRef method = selectMethod(position, scope, arguments, false, true);
325
-		FunctionHeader instancedHeader = method.getHeader().fillGenericArguments(scope, arguments.typeArguments);
325
+		FunctionHeader instancedHeader = method.getHeader().fillGenericArguments(position, scope, arguments.typeArguments);
326
 		return method.callStatic(position, target, instancedHeader, arguments, scope);
326
 		return method.callStatic(position, target, instancedHeader, arguments, scope);
327
 	}
327
 	}
328
 	
328
 	
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().instanceForCall(scope.getTypeRegistry(), arguments);
336
-			if (header.matchesExactly(arguments, scope))
335
+			FunctionHeader header = method.member.getHeader().instanceForCall(position, scope.getTypeRegistry(), arguments);
336
+			if (header.matchesExactly(position, arguments, scope))
337
 				return method.member;
337
 				return method.member;
338
 		}
338
 		}
339
 		
339
 		
347
 			
347
 			
348
 			scope.getPreparer().prepare(method.member.getTarget());
348
 			scope.getPreparer().prepare(method.member.getTarget());
349
 			
349
 			
350
-			FunctionHeader header = method.member.getHeader().instanceForCall(scope.getTypeRegistry(), arguments);
351
-			if (!header.matchesImplicitly(arguments, scope))
350
+			FunctionHeader header = method.member.getHeader().instanceForCall(position, scope.getTypeRegistry(), arguments);
351
+			if (!header.matchesImplicitly(position, 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
-				FunctionHeader selectedHeader = selected.getHeader().instanceForCall(scope.getTypeRegistry(), arguments);
356
+				FunctionHeader selectedHeader = selected.getHeader().instanceForCall(position, scope.getTypeRegistry(), arguments);
357
 				explanation.append("Function A: ").append(selectedHeader.toString()).append("\n");
357
 				explanation.append("Function A: ").append(selectedHeader.toString()).append("\n");
358
 				explanation.append("Function B: ").append(header.toString());
358
 				explanation.append("Function B: ").append(header.toString());
359
 				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());
375
 					continue;
375
 					continue;
376
 				}
376
 				}
377
 				
377
 				
378
-				FunctionHeader instancedHeader = method.member.getHeader().instanceForCall(scope.getTypeRegistry(), arguments);
378
+				FunctionHeader instancedHeader = method.member.getHeader().instanceForCall(position, scope.getTypeRegistry(), arguments);
379
 				message.append(instancedHeader.explainWhyIncompatible(scope, arguments)).append("\n");
379
 				message.append(instancedHeader.explainWhyIncompatible(scope, arguments)).append("\n");
380
 			}
380
 			}
381
 			
381
 			

+ 5
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/storage/StorageTag.java View File

5
  */
5
  */
6
 package org.openzen.zenscript.codemodel.type.storage;
6
 package org.openzen.zenscript.codemodel.type.storage;
7
 
7
 
8
+import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zencode.shared.CompileExceptionCode;
10
+
8
 /**
11
 /**
9
  *
12
  *
10
  * @author Hoofdgebruiker
13
  * @author Hoofdgebruiker
22
 	
25
 	
23
 	boolean isImmutable();
26
 	boolean isImmutable();
24
 	
27
 	
25
-	static StorageTag union(StorageTag minor, StorageTag major) {
28
+	static StorageTag union(CodePosition position, StorageTag minor, StorageTag major) {
26
 		if (minor == AutoStorageTag.INSTANCE || minor == null)
29
 		if (minor == AutoStorageTag.INSTANCE || minor == null)
27
 			return major;
30
 			return major;
28
 		if (major == AutoStorageTag.INSTANCE || major == null)
31
 		if (major == AutoStorageTag.INSTANCE || major == null)
29
 			return minor;
32
 			return minor;
30
 		if (!minor.equals(major))
33
 		if (!minor.equals(major))
31
-			throw new IllegalArgumentException("Could not unite storage types: " + minor + " and " + major); // TODO: proper reporting
34
+			return new InvalidStorageTag(position, CompileExceptionCode.TYPE_CANNOT_UNITE, "Could not unite storage types: " + minor + " and " + major);
32
 		
35
 		
33
 		return major;
36
 		return major;
34
 	}
37
 	}

+ 1
- 8
CompilerShared/src/main/java/org/openzen/zenscript/compiler/SemanticModule.java View File

137
 		if (state != State.VALIDATED)
137
 		if (state != State.VALIDATED)
138
 			throw new IllegalStateException("Module is not yet validated");
138
 			throw new IllegalStateException("Module is not yet validated");
139
 		
139
 		
140
-		ZenCodeCompilingModule module = compiler.addModule(this);
141
-		for (HighLevelDefinition definition : definitions.getAll()) {
142
-			module.addDefinition(definition);
143
-		}
144
-		for (ScriptBlock script : scripts) {
145
-			module.addScriptBlock(script);
146
-		}
147
-		module.finish();
140
+		compiler.addModule(this);
148
 	}
141
 	}
149
 	
142
 	
150
 	public ModuleContext getContext() {
143
 	public ModuleContext getContext() {

+ 1
- 1
CompilerShared/src/main/java/org/openzen/zenscript/compiler/ZenCodeCompiler.java View File

10
  * @author Hoofdgebruiker
10
  * @author Hoofdgebruiker
11
  */
11
  */
12
 public interface ZenCodeCompiler {
12
 public interface ZenCodeCompiler {
13
-	ZenCodeCompilingModule addModule(SemanticModule module);
13
+	void addModule(SemanticModule module);
14
 	
14
 	
15
 	void finish();
15
 	void finish();
16
 	
16
 	

+ 178
- 6
Constructor/src/main/java/org/openzen/zenscript/constructor/ConstructorRegistry.java View File

5
  */
5
  */
6
 package org.openzen.zenscript.constructor;
6
 package org.openzen.zenscript.constructor;
7
 
7
 
8
+import java.io.File;
9
+import java.util.ArrayList;
8
 import java.util.HashMap;
10
 import java.util.HashMap;
11
+import java.util.List;
9
 import java.util.Map;
12
 import java.util.Map;
13
+import org.json.JSONObject;
14
+import org.openzen.zenscript.codemodel.definition.ZSPackage;
15
+import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
16
+import org.openzen.zenscript.compiler.SemanticModule;
17
+import org.openzen.zenscript.compiler.Target;
10
 import org.openzen.zenscript.compiler.TargetType;
18
 import org.openzen.zenscript.compiler.TargetType;
11
-import org.openzen.zenscript.javabytecode.JavaBytecodeJarTargetType;
12
-import org.openzen.zenscript.javabytecode.JavaBytecodeRunTargetType;
13
-import org.openzen.zenscript.javasource.JavaSourceTargetType;
19
+import org.openzen.zenscript.compiler.ZenCodeCompiler;
20
+import org.openzen.zenscript.javabytecode.JavaBytecodeModule;
21
+import org.openzen.zenscript.javabytecode.JavaBytecodeRunUnit;
22
+import org.openzen.zenscript.javabytecode.JavaCompiler;
23
+import org.openzen.zenscript.javashared.JavaCompileSpace;
24
+import org.openzen.zenscript.javashared.SimpleJavaCompileSpace;
25
+import org.openzen.zenscript.javasource.JavaDirectoryOutput;
26
+import org.openzen.zenscript.javasource.JavaSourceCompiler;
27
+import org.openzen.zenscript.javasource.JavaSourceModule;
14
 
28
 
15
 /**
29
 /**
16
  *
30
  *
20
 	private static final Map<String, TargetType> targetTypes = new HashMap<>();
34
 	private static final Map<String, TargetType> targetTypes = new HashMap<>();
21
 	
35
 	
22
 	static {
36
 	static {
23
-		registerTargetType("javaSource", JavaSourceTargetType.INSTANCE);
24
-		registerTargetType("javaBytecodeJar", JavaBytecodeJarTargetType.INSTANCE);
25
-		registerTargetType("javaBytecodeRun", JavaBytecodeRunTargetType.INSTANCE);
37
+		registerTargetType("javaSource", new JavaSourceTargetType());
38
+		registerTargetType("javaBytecodeJar", new JavaBytecodeTargetType());
39
+		registerTargetType("javaBytecodeRun", new JavaBytecodeTargetType());
26
 	}
40
 	}
27
 	
41
 	
28
 	public static void registerTargetType(String name, TargetType type) {
42
 	public static void registerTargetType(String name, TargetType type) {
34
 	}
48
 	}
35
 
49
 
36
 	private ConstructorRegistry() {}
50
 	private ConstructorRegistry() {}
51
+	
52
+	private static class JavaSourceTargetType implements TargetType {
53
+
54
+		@Override
55
+		public Target create(File projectDir, JSONObject definition) {
56
+			return new JavaSourceTarget(projectDir, definition);
57
+		}
58
+	}
59
+	
60
+	private static class JavaSourceTarget implements Target {
61
+		private final String module;
62
+		private final String name;
63
+		private final File output;
64
+
65
+		public JavaSourceTarget(File projectDir, JSONObject definition) {
66
+			module = definition.getString("module");
67
+			name = definition.optString("name", "Java Source: " + module);
68
+			output = new File(projectDir, definition.getString("output"));
69
+		}
70
+
71
+		@Override
72
+		public ZenCodeCompiler createCompiler(SemanticModule module) {
73
+			return new JavaSourceZenCompiler(output, module.registry);
74
+		}
75
+
76
+		@Override
77
+		public String getModule() {
78
+			return module;
79
+		}
80
+
81
+		@Override
82
+		public String getName() {
83
+			return name;
84
+		}
85
+
86
+		@Override
87
+		public boolean canRun() {
88
+			return false;
89
+		}
90
+
91
+		@Override
92
+		public boolean canBuild() {
93
+			return true;
94
+		}
95
+	}
96
+	
97
+	private static class JavaSourceZenCompiler implements ZenCodeCompiler {
98
+		private final File output;
99
+		private final JavaSourceCompiler compiler;
100
+		private final List<JavaSourceModule> modules = new ArrayList<>();
101
+		
102
+		public final GlobalTypeRegistry registry;
103
+		private final SimpleJavaCompileSpace space;
104
+		
105
+		public JavaSourceZenCompiler(File output, GlobalTypeRegistry registry) {
106
+			this.output = output;
107
+			compiler = new JavaSourceCompiler(registry);
108
+			this.registry = registry;
109
+			space = new SimpleJavaCompileSpace(registry);
110
+		}
111
+
112
+		@Override
113
+		public void addModule(SemanticModule module) {
114
+			JavaSourceModule result = compiler.compile(module, space, module.modulePackage.fullName);
115
+			modules.add(result);
116
+			space.register(result);
117
+		}
118
+
119
+		@Override
120
+		public void finish() {
121
+			JavaDirectoryOutput output = new JavaDirectoryOutput(this.output);
122
+			for (JavaSourceModule module : modules)
123
+				output.add(module);
124
+			output.add(compiler.helpers);
125
+		}
126
+
127
+		@Override
128
+		public void run() {
129
+			throw new UnsupportedOperationException();
130
+		}
131
+	}
132
+	
133
+	private static class JavaBytecodeTargetType implements TargetType {
134
+
135
+		@Override
136
+		public Target create(File projectDir, JSONObject definition) {
137
+			return new JavaBytecodeJarTarget(definition);
138
+		}
139
+	}
140
+	
141
+	private static class JavaBytecodeJarTarget implements Target {
142
+		private final String module;
143
+		private final String name;
144
+		private final File file;
145
+		private final boolean debugCompiler;
146
+
147
+		public JavaBytecodeJarTarget(JSONObject definition) {
148
+			module = definition.getString("module");
149
+			name = definition.getString("name");
150
+			file = new File(definition.getString("output"));
151
+			debugCompiler = definition.optBoolean("debugCompiler", false);
152
+		}
153
+
154
+		@Override
155
+		public ZenCodeCompiler createCompiler(SemanticModule module) {
156
+			return new JavaBytecodeJarCompiler();
157
+		}
158
+
159
+		@Override
160
+		public String getModule() {
161
+			return module;
162
+		}
163
+
164
+		@Override
165
+		public String getName() {
166
+			return name;
167
+		}
168
+
169
+		@Override
170
+		public boolean canRun() {
171
+			return true;
172
+		}
173
+
174
+		@Override
175
+		public boolean canBuild() {
176
+			return true;
177
+		}
178
+	}
179
+	
180
+	private static class JavaBytecodeJarCompiler implements ZenCodeCompiler {
181
+		private final ZSPackage root = ZSPackage.createRoot();
182
+		private final ZSPackage stdlib = new ZSPackage(root, "stdlib");
183
+		public final GlobalTypeRegistry registry = new GlobalTypeRegistry(stdlib);
184
+		
185
+		private final JavaCompiler compiler = new JavaCompiler();
186
+		private final List<JavaBytecodeModule> modules = new ArrayList<>();
187
+		private final JavaCompileSpace space = new SimpleJavaCompileSpace(registry);
188
+
189
+		@Override
190
+		public void addModule(SemanticModule module) {
191
+			JavaBytecodeModule result = compiler.compile(module.modulePackage.fullName, module, space);
192
+			modules.add(result);
193
+		}
194
+
195
+		@Override
196
+		public void finish() {
197
+			
198
+		}
199
+
200
+		@Override
201
+		public void run() {
202
+			JavaBytecodeRunUnit unit = new JavaBytecodeRunUnit();
203
+			for (JavaBytecodeModule module : modules)
204
+				unit.add(module);
205
+			//unit.add(compiler.helpers);
206
+			unit.run();
207
+		}
208
+	}
37
 }
209
 }

+ 4
- 0
JavaAnnotations/src/main/java/org/openzen/zencode/java/ZenCodeType.java View File

37
 		String value() default "";
37
 		String value() default "";
38
 	}
38
 	}
39
 	
39
 	
40
+	@Retention(RetentionPolicy.RUNTIME)
41
+	@Target(ElementType.CONSTRUCTOR)
42
+	@interface Constructor {}
43
+	
40
 	@Retention(RetentionPolicy.RUNTIME)
44
 	@Retention(RetentionPolicy.RUNTIME)
41
 	@Target(ElementType.METHOD)
45
 	@Target(ElementType.METHOD)
42
 	@interface Method {
46
 	@interface Method {

+ 7
- 6
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeContext.java View File

8
 import org.objectweb.asm.ClassWriter;
8
 import org.objectweb.asm.ClassWriter;
9
 import org.objectweb.asm.Opcodes;
9
 import org.objectweb.asm.Opcodes;
10
 import org.objectweb.asm.Type;
10
 import org.objectweb.asm.Type;
11
-import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
11
+import org.openzen.zenscript.codemodel.definition.ZSPackage;
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.javabytecode.compiler.JavaWriter;
14
 import org.openzen.zenscript.javabytecode.compiler.JavaWriter;
15
+import org.openzen.zenscript.javashared.JavaCompileSpace;
15
 import org.openzen.zenscript.javashared.JavaContext;
16
 import org.openzen.zenscript.javashared.JavaContext;
16
 import org.openzen.zenscript.javashared.JavaMethod;
17
 import org.openzen.zenscript.javashared.JavaMethod;
17
 import org.openzen.zenscript.javashared.JavaSynthesizedFunction;
18
 import org.openzen.zenscript.javashared.JavaSynthesizedFunction;
26
  * @author Hoofdgebruiker
27
  * @author Hoofdgebruiker
27
  */
28
  */
28
 public class JavaBytecodeContext extends JavaContext {
29
 public class JavaBytecodeContext extends JavaContext {
29
-	private final JavaModule module;
30
+	private final JavaBytecodeModule target;
30
 	private final TypeGenerator typeGenerator;
31
 	private final TypeGenerator typeGenerator;
31
 	private final JavaTypeInternalNameVisitor internalNameVisitor;
32
 	private final JavaTypeInternalNameVisitor internalNameVisitor;
32
 	private final JavaTypeDescriptorVisitor descriptorVisitor;
33
 	private final JavaTypeDescriptorVisitor descriptorVisitor;
33
 	private int lambdaCounter = 0;
34
 	private int lambdaCounter = 0;
34
 	
35
 	
35
-	public JavaBytecodeContext(GlobalTypeRegistry registry, JavaModule module) {
36
-		super(registry);
36
+	public JavaBytecodeContext(JavaBytecodeModule target, JavaCompileSpace space, ZSPackage modulePackage, String basePackage) {
37
+		super(space, modulePackage, basePackage);
37
 		
38
 		
38
-		this.module = module;
39
+		this.target = target;
39
 		
40
 		
40
 		typeGenerator = new TypeGenerator();
41
 		typeGenerator = new TypeGenerator();
41
 		internalNameVisitor = new JavaTypeInternalNameVisitor(this);
42
 		internalNameVisitor = new JavaTypeInternalNameVisitor(this);
73
 	}
74
 	}
74
 	
75
 	
75
 	public void register(String name, byte[] bytecode) {
76
 	public void register(String name, byte[] bytecode) {
76
-		module.register(name, bytecode);
77
+		target.addClass(name, bytecode);
77
 	}
78
 	}
78
 
79
 
79
     private void createLambdaInterface(JavaSynthesizedFunction function) {
80
     private void createLambdaInterface(JavaSynthesizedFunction function) {

+ 0
- 53
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeJarTarget.java View File

1
-/*
2
- * To change this license header, choose License Headers in Project Properties.
3
- * To change this template file, choose Tools | Templates
4
- * and open the template in the editor.
5
- */
6
-package org.openzen.zenscript.javabytecode;
7
-
8
-import java.io.File;
9
-import org.json.JSONObject;
10
-import org.openzen.zenscript.compiler.SemanticModule;
11
-import org.openzen.zenscript.compiler.Target;
12
-
13
-/**
14
- * @author Hoofdgebruiker
15
- */
16
-public class JavaBytecodeJarTarget implements Target {
17
-	private final String module;
18
-	private final String name;
19
-	private final File file;
20
-	private final boolean debugCompiler;
21
-
22
-	public JavaBytecodeJarTarget(JSONObject definition) {
23
-		module = definition.getString("module");
24
-		name = definition.getString("name");
25
-		file = new File(definition.getString("output"));
26
-		debugCompiler = definition.optBoolean("debugCompiler", false);
27
-	}
28
-
29
-	@Override
30
-	public JavaCompiler createCompiler(SemanticModule module) {
31
-		return new JavaCompiler(module.registry, debugCompiler, file);
32
-	}
33
-
34
-	@Override
35
-	public String getModule() {
36
-		return module;
37
-	}
38
-
39
-	@Override
40
-	public String getName() {
41
-		return name;
42
-	}
43
-
44
-	@Override
45
-	public boolean canRun() {
46
-		return true;
47
-	}
48
-
49
-	@Override
50
-	public boolean canBuild() {
51
-		return true;
52
-	}
53
-}

+ 0
- 27
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeJarTargetType.java View File

1
-/*
2
- * To change this license header, choose License Headers in Project Properties.
3
- * To change this template file, choose Tools | Templates
4
- * and open the template in the editor.
5
- */
6
-package org.openzen.zenscript.javabytecode;
7
-
8
-import org.json.JSONObject;
9
-import org.openzen.zenscript.compiler.Target;
10
-import org.openzen.zenscript.compiler.TargetType;
11
-
12
-import java.io.File;
13
-
14
-/**
15
- * @author Hoofdgebruiker
16
- */
17
-public class JavaBytecodeJarTargetType implements TargetType {
18
-	public static final JavaBytecodeJarTargetType INSTANCE = new JavaBytecodeJarTargetType();
19
-
20
-	private JavaBytecodeJarTargetType() {
21
-	}
22
-
23
-	@Override
24
-	public Target create(File projectDir, JSONObject definition) {
25
-		return new JavaBytecodeJarTarget(definition);
26
-	}
27
-}

+ 3
- 0
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeModule.java View File

26
 	}
26
 	}
27
 	
27
 	
28
 	public void addClass(String name, byte[] bytecode) {
28
 	public void addClass(String name, byte[] bytecode) {
29
+		if (bytecode == null)
30
+			return;
31
+		
29
 		classes.put(name, bytecode);
32
 		classes.put(name, bytecode);
30
 	}
33
 	}
31
 	
34
 	

+ 0
- 50
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeRunTarget.java View File

1
-/*
2
- * To change this license header, choose License Headers in Project Properties.
3
- * To change this template file, choose Tools | Templates
4
- * and open the template in the editor.
5
- */
6
-package org.openzen.zenscript.javabytecode;
7
-
8
-import org.json.JSONObject;
9
-import org.openzen.zenscript.compiler.SemanticModule;
10
-import org.openzen.zenscript.compiler.Target;
11
-
12
-/**
13
- * @author Hoofdgebruiker
14
- */
15
-public class JavaBytecodeRunTarget implements Target {
16
-	private final String module;
17
-	private final String name;
18
-	private final boolean debugCompiler;
19
-
20
-	public JavaBytecodeRunTarget(JSONObject definition) {
21
-		module = definition.getString("module");
22
-		name = definition.getString("name");
23
-		debugCompiler = definition.optBoolean("debugCompiler", false);
24
-	}
25
-
26
-	@Override
27
-	public JavaCompiler createCompiler(SemanticModule module) {
28
-		return new JavaCompiler(module.registry, debugCompiler, null);
29
-	}
30
-
31
-	@Override
32
-	public String getModule() {
33
-		return module;
34
-	}
35
-
36
-	@Override
37
-	public String getName() {
38
-		return name;
39
-	}
40
-
41
-	@Override
42
-	public boolean canRun() {
43
-		return true;
44
-	}
45
-
46
-	@Override
47
-	public boolean canBuild() {
48
-		return true;
49
-	}
50
-}

+ 0
- 27
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeRunTargetType.java View File

1
-/*
2
- * To change this license header, choose License Headers in Project Properties.
3
- * To change this template file, choose Tools | Templates
4
- * and open the template in the editor.
5
- */
6
-package org.openzen.zenscript.javabytecode;
7
-
8
-import org.json.JSONObject;
9
-import org.openzen.zenscript.compiler.Target;
10
-import org.openzen.zenscript.compiler.TargetType;
11
-
12
-import java.io.File;
13
-
14
-/**
15
- * @author Hoofdgebruiker
16
- */
17
-public class JavaBytecodeRunTargetType implements TargetType {
18
-	public static final JavaBytecodeRunTargetType INSTANCE = new JavaBytecodeRunTargetType();
19
-
20
-	private JavaBytecodeRunTargetType() {
21
-	}
22
-
23
-	@Override
24
-	public Target create(File projectDir, JSONObject definition) {
25
-		return new JavaBytecodeRunTarget(definition);
26
-	}
27
-}

+ 22
- 3
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeRunUnit.java View File

5
  */
5
  */
6
 package org.openzen.zenscript.javabytecode;
6
 package org.openzen.zenscript.javabytecode;
7
 
7
 
8
+import java.io.File;
9
+import java.io.FileOutputStream;
10
+import java.io.IOException;
8
 import java.lang.reflect.InvocationTargetException;
11
 import java.lang.reflect.InvocationTargetException;
9
 import java.util.ArrayList;
12
 import java.util.ArrayList;
10
 import java.util.HashMap;
13
 import java.util.HashMap;
39
 	}
42
 	}
40
 	
43
 	
41
 	public void run() {
44
 	public void run() {
42
-		if (!scriptsWritten)
43
-			writeScripts();
45
+		writeScripts();
44
 		
46
 		
45
 		ScriptClassLoader classLoader = new ScriptClassLoader();
47
 		ScriptClassLoader classLoader = new ScriptClassLoader();
46
 
48
 
47
 		try {
49
 		try {
48
 			classLoader.loadClass("Scripts").getMethod("run").invoke(null);
50
 			classLoader.loadClass("Scripts").getMethod("run").invoke(null);
49
 		} catch (ClassNotFoundException | InvocationTargetException | NoSuchMethodException | IllegalAccessException | SecurityException | IllegalArgumentException ex) {
51
 		} catch (ClassNotFoundException | InvocationTargetException | NoSuchMethodException | IllegalAccessException | SecurityException | IllegalArgumentException ex) {
50
-			Logger.getLogger(JavaModule.class.getName()).log(Level.SEVERE, null, ex);
52
+			Logger.getLogger(JavaBytecodeRunUnit.class.getName()).log(Level.SEVERE, null, ex);
53
+		}
54
+	}
55
+	
56
+	public void dump(File directory) {
57
+		writeScripts();
58
+		
59
+		for (Map.Entry<String, byte[]> classEntry : classes.entrySet()) {
60
+			File output = new File(directory, classEntry.getKey() + ".class");
61
+			try (FileOutputStream outputStream = new FileOutputStream(output)) {
62
+				outputStream.write(classEntry.getValue());
63
+			} catch (IOException ex) {
64
+				ex.printStackTrace();
65
+			}
51
 		}
66
 		}
52
 	}
67
 	}
53
 	
68
 	
54
 	private void writeScripts() {
69
 	private void writeScripts() {
70
+		if (scriptsWritten)
71
+			return;
72
+		
55
 		JavaClassWriter scriptsClassWriter = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
73
 		JavaClassWriter scriptsClassWriter = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
56
 		scriptsClassWriter.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, "Scripts", null, "java/lang/Object", null);
74
 		scriptsClassWriter.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, "Scripts", null, "java/lang/Object", null);
57
 		
75
 		
65
 		runWriter.end();
83
 		runWriter.end();
66
 		
84
 		
67
 		classes.put("Scripts", scriptsClassWriter.toByteArray());
85
 		classes.put("Scripts", scriptsClassWriter.toByteArray());
86
+		scriptsWritten = true;
68
 	}
87
 	}
69
 
88
 
70
 	public class ScriptClassLoader extends ClassLoader {
89
 	public class ScriptClassLoader extends ClassLoader {

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

5
  */
5
  */
6
 package org.openzen.zenscript.javabytecode;
6
 package org.openzen.zenscript.javabytecode;
7
 
7
 
8
-import java.io.File;
9
-import java.util.ArrayList;
10
 import java.util.HashMap;
8
 import java.util.HashMap;
11
-import java.util.List;
12
 import java.util.Map;
9
 import java.util.Map;
13
 import org.objectweb.asm.ClassWriter;
10
 import org.objectweb.asm.ClassWriter;
14
 import org.objectweb.asm.Opcodes;
11
 import org.objectweb.asm.Opcodes;
15
 import org.openzen.zencode.shared.SourceFile;
12
 import org.openzen.zencode.shared.SourceFile;
16
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
13
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
17
 import org.openzen.zenscript.codemodel.ScriptBlock;
14
 import org.openzen.zenscript.codemodel.ScriptBlock;
15
+import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
18
 import org.openzen.zenscript.codemodel.statement.Statement;
16
 import org.openzen.zenscript.codemodel.statement.Statement;
19
-import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
20
 import org.openzen.zenscript.compiler.SemanticModule;
17
 import org.openzen.zenscript.compiler.SemanticModule;
21
-import org.openzen.zenscript.compiler.ZenCodeCompiler;
22
-import org.openzen.zenscript.compiler.ZenCodeCompilingModule;
23
 import org.openzen.zenscript.javabytecode.compiler.JavaClassWriter;
18
 import org.openzen.zenscript.javabytecode.compiler.JavaClassWriter;
24
 import org.openzen.zenscript.javabytecode.compiler.JavaScriptFile;
19
 import org.openzen.zenscript.javabytecode.compiler.JavaScriptFile;
25
 import org.openzen.zenscript.javabytecode.compiler.JavaStatementVisitor;
20
 import org.openzen.zenscript.javabytecode.compiler.JavaStatementVisitor;
26
 import org.openzen.zenscript.javabytecode.compiler.JavaWriter;
21
 import org.openzen.zenscript.javabytecode.compiler.JavaWriter;
27
 import org.openzen.zenscript.javabytecode.compiler.definitions.JavaDefinitionVisitor;
22
 import org.openzen.zenscript.javabytecode.compiler.definitions.JavaDefinitionVisitor;
28
-import org.openzen.zenscript.javashared.JavaBaseCompiler;
29
 import org.openzen.zenscript.javashared.JavaClass;
23
 import org.openzen.zenscript.javashared.JavaClass;
30
 import org.openzen.zenscript.javashared.JavaCompileSpace;
24
 import org.openzen.zenscript.javashared.JavaCompileSpace;
31
-import org.openzen.zenscript.javashared.JavaCompiledModule;
32
-import org.openzen.zenscript.javashared.JavaContext;
33
 import org.openzen.zenscript.javashared.JavaMethod;
25
 import org.openzen.zenscript.javashared.JavaMethod;
34
 import org.openzen.zenscript.javashared.prepare.JavaPrepareDefinitionMemberVisitor;
26
 import org.openzen.zenscript.javashared.prepare.JavaPrepareDefinitionMemberVisitor;
35
 import org.openzen.zenscript.javashared.prepare.JavaPrepareDefinitionVisitor;
27
 import org.openzen.zenscript.javashared.prepare.JavaPrepareDefinitionVisitor;
37
 /**
29
 /**
38
  * @author Hoofdgebruiker
30
  * @author Hoofdgebruiker
39
  */
31
  */
40
-public class JavaCompiler extends JavaBaseCompiler implements ZenCodeCompiler {
41
-	private final JavaModule target;
42
-	private final Map<String, JavaScriptFile> scriptBlocks = new HashMap<>();
43
-	private final JavaClassWriter scriptsClassWriter;
32
+public class JavaCompiler {
44
 	private int generatedScriptBlockCounter = 0;
33
 	private int generatedScriptBlockCounter = 0;
45
-	private boolean finished = false;
46
-	private final File jarFile;
47
-	private final JavaBytecodeContext context;
48
 	
34
 	
49
-	private final List<HighLevelDefinition> definitions = new ArrayList<>();
50
-	private final List<ScriptBlock> scripts = new ArrayList<>();
35
+	public JavaCompiler() {}
51
 	
36
 	
52
-	public JavaCompiler(GlobalTypeRegistry registry, File jarFile) {
53
-		this(registry, false, jarFile);
54
-	}
55
-
56
-	public JavaCompiler(GlobalTypeRegistry registry, boolean debug, File jarFile) {
57
-		target = new JavaModule(new File("classes"));
58
-		this.jarFile = jarFile;
59
-		this.context = new JavaBytecodeContext(registry, target);
60
-		
61
-		scriptsClassWriter = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
62
-		scriptsClassWriter.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, "Scripts", null, "java/lang/Object", null);
63
-	}
64
-	
65
-	public JavaContext getContext() {
66
-		return context;
67
-	}
68
-	
69
-	//@Override
70
-	public JavaBytecodeModule compile(SemanticModule module, JavaCompileSpace space) {
71
-		context.addModule(module.module);
37
+	public JavaBytecodeModule compile(String packageName, SemanticModule module, JavaCompileSpace space) {
38
+		Map<String, JavaScriptFile> scriptBlocks = new HashMap<>();
72
 		
39
 		
73
 		JavaBytecodeModule target = new JavaBytecodeModule(module.module);
40
 		JavaBytecodeModule target = new JavaBytecodeModule(module.module);
41
+		JavaBytecodeContext context = new JavaBytecodeContext(target, space, module.modulePackage, packageName);
42
+		context.addModule(module.module, target);
43
+		
74
 		for (HighLevelDefinition definition : module.definitions.getAll()) {
44
 		for (HighLevelDefinition definition : module.definitions.getAll()) {
75
-			JavaPrepareDefinitionMemberVisitor memberPreparer = new JavaPrepareDefinitionMemberVisitor(context, context.getJavaModule(definition.module));
45
+			String filename = getFilename(definition);
46
+			JavaPrepareDefinitionVisitor definitionPreparer = new JavaPrepareDefinitionVisitor(context, target, filename, null);
47
+			definition.accept(definitionPreparer);
48
+		}
49
+		
50
+		for (HighLevelDefinition definition : module.definitions.getAll()) {
51
+			JavaPrepareDefinitionMemberVisitor memberPreparer = new JavaPrepareDefinitionMemberVisitor(context, target);
76
 			definition.accept(memberPreparer);
52
 			definition.accept(memberPreparer);
77
 		}
53
 		}
78
 		
54
 		
79
 		for (HighLevelDefinition definition : module.definitions.getAll()) {
55
 		for (HighLevelDefinition definition : module.definitions.getAll()) {
80
 			String className = getClassName(definition.position.getFilename());
56
 			String className = getClassName(definition.position.getFilename());
81
-			JavaScriptFile scriptFile = getScriptFile(className);
57
+			JavaScriptFile scriptFile = getScriptFile(scriptBlocks, definition.pkg.fullName + "/" + className);
82
 			
58
 			
83
-			target.addClass(definition.name, definition.accept(new JavaDefinitionVisitor(context, scriptFile.classWriter)));
59
+			JavaClass cls = definition instanceof ExpansionDefinition ? context.getJavaExpansionClass(definition) : context.getJavaClass(definition);
60
+			target.addClass(cls.internalName, definition.accept(new JavaDefinitionVisitor(context, scriptFile.classWriter)));
84
 		}
61
 		}
85
 		
62
 		
86
 		for (ScriptBlock script : module.scripts) {
63
 		for (ScriptBlock script : module.scripts) {
87
 			final SourceFile sourceFile = script.getTag(SourceFile.class);
64
 			final SourceFile sourceFile = script.getTag(SourceFile.class);
88
 			final String className = getClassName(sourceFile == null ? null : sourceFile.getFilename());
65
 			final String className = getClassName(sourceFile == null ? null : sourceFile.getFilename());
89
-			JavaScriptFile scriptFile = getScriptFile(script.pkg.fullName + "/" + className);
66
+			JavaScriptFile scriptFile = getScriptFile(scriptBlocks, script.pkg.fullName + "/" + className);
90
 
67
 
91
 			String methodName = scriptFile.scriptMethods.isEmpty() ? "run" : "run" + scriptFile.scriptMethods.size();
68
 			String methodName = scriptFile.scriptMethods.isEmpty() ? "run" : "run" + scriptFile.scriptMethods.size();
92
 
69
 
93
 			// convert scripts into methods (add them to a Scripts class?)
70
 			// convert scripts into methods (add them to a Scripts class?)
94
 			// (TODO: can we break very long scripts into smaller methods? for the extreme scripts)
71
 			// (TODO: can we break very long scripts into smaller methods? for the extreme scripts)
95
 			final JavaClassWriter visitor = scriptFile.classWriter;
72
 			final JavaClassWriter visitor = scriptFile.classWriter;
96
-			JavaMethod method = JavaMethod.getStatic(new JavaClass(script.pkg.fullName, className, JavaClass.Kind.CLASS), methodName, "()V", Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC);
73
+			JavaMethod method = JavaMethod.getStatic(new JavaClass(context.getPackageName(script.pkg), className, JavaClass.Kind.CLASS), methodName, "()V", Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC);
97
 			scriptFile.scriptMethods.add(method);
74
 			scriptFile.scriptMethods.add(method);
98
 
75
 
99
 			final JavaStatementVisitor statementVisitor = new JavaStatementVisitor(context, context.getJavaModule(script.module), new JavaWriter(visitor, method, null, null, null));
76
 			final JavaStatementVisitor statementVisitor = new JavaStatementVisitor(context, context.getJavaModule(script.module), new JavaWriter(visitor, method, null, null, null));
115
 		return target;
92
 		return target;
116
 	}
93
 	}
117
 	
94
 	
118
-	@Override
119
-	public ZenCodeCompilingModule addModule(SemanticModule module) {
120
-		context.addModule(module.module);
121
-		
122
-		return new ZenCodeCompilingModule() {
123
-			@Override
124
-			public void addDefinition(HighLevelDefinition definition) {
125
-				JavaPrepareDefinitionVisitor preparer = new JavaPrepareDefinitionVisitor(context, context.getJavaModule(module.module), definition.position.getFilename(), null);
126
-				definition.accept(preparer);
127
-
128
-				definitions.add(definition);
129
-			}
130
-
131
-			@Override
132
-			public void addScriptBlock(ScriptBlock script) {
133
-				scripts.add(script);
134
-			}
135
-
136
-			@Override
137
-			public void finish() {
138
-				
139
-			}
140
-		};
95
+	private String getFilename(HighLevelDefinition definition) {
96
+		SourceFile source = definition.getTag(SourceFile.class);
97
+		if (source != null) {
98
+			int slash = Math.max(source.getFilename().lastIndexOf('/'), source.getFilename().lastIndexOf('\\'));
99
+			String filename = source.getFilename().substring(slash < 0 ? 0 : slash + 1);
100
+			filename = filename.substring(0, filename.lastIndexOf('.'));
101
+			return filename;
102
+		} else {
103
+			return definition.name == null ? "Expansion" : definition.name;
104
+		}
141
 	}
105
 	}
142
 
106
 
143
 	private String getClassName(String filename) {
107
 	private String getClassName(String filename) {
150
 		}
114
 		}
151
 	}
115
 	}
152
 
116
 
153
-	private JavaScriptFile getScriptFile(String className) {
117
+	private JavaScriptFile getScriptFile(Map<String, JavaScriptFile> scriptBlocks, String className) {
154
 		if (!scriptBlocks.containsKey(className)) {
118
 		if (!scriptBlocks.containsKey(className)) {
155
 			JavaClassWriter scriptFileWriter = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
119
 			JavaClassWriter scriptFileWriter = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
156
 			scriptFileWriter.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, className, null, "java/lang/Object", null);
120
 			scriptFileWriter.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, className, null, "java/lang/Object", null);
159
 
123
 
160
 		return scriptBlocks.get(className);
124
 		return scriptBlocks.get(className);
161
 	}
125
 	}
162
-
163
-	@Override
164
-	public void finish() {
165
-		JavaModule module = finishAndGetModule();
166
-
167
-		if (jarFile != null) {
168
-			// TODO: write module to a Jar file
169
-		}
170
-	}
171
-
172
-	@Override
173
-	public void run() {
174
-		if (!finished)
175
-			throw new IllegalStateException("Not yet built!");
176
-		
177
-		// TODO: execute this
178
-	}
179
-
180
-	public JavaModule finishAndGetModule() {
181
-		if (finished)
182
-			throw new IllegalStateException("Already finished!");
183
-		
184
-		finished = true;
185
-		
186
-		for (HighLevelDefinition definition : definitions) {
187
-			JavaPrepareDefinitionMemberVisitor memberPreparer = new JavaPrepareDefinitionMemberVisitor(context, context.getJavaModule(definition.module));
188
-			definition.accept(memberPreparer);
189
-		}
190
-		
191
-		for (HighLevelDefinition definition : definitions) {
192
-			String className = getClassName(definition.position.getFilename());
193
-			JavaScriptFile scriptFile = getScriptFile(className);
194
-			
195
-			target.register(definition.name, definition.accept(new JavaDefinitionVisitor(context, scriptFile.classWriter)));
196
-		}
197
- 
198
-		for (ScriptBlock script : scripts) {
199
-			final SourceFile sourceFile = script.getTag(SourceFile.class);
200
-			final String className = getClassName(sourceFile == null ? null : sourceFile.getFilename());
201
-			JavaScriptFile scriptFile = getScriptFile(className);
202
-
203
-			String methodName = scriptFile.scriptMethods.isEmpty() ? "run" : "run" + scriptFile.scriptMethods.size();
204
-
205
-			// convert scripts into methods (add them to a Scripts class?)
206
-			// (TODO: can we break very long scripts into smaller methods? for the extreme scripts)
207
-			final JavaClassWriter visitor = scriptFile.classWriter;
208
-			JavaMethod method = JavaMethod.getStatic(new JavaClass(script.pkg.fullName, className, JavaClass.Kind.CLASS), methodName, "()V", Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC);
209
-			scriptFile.scriptMethods.add(method);
210
-
211
-			final JavaStatementVisitor statementVisitor = new JavaStatementVisitor(context, context.getJavaModule(script.module), new JavaWriter(visitor, method, null, null, null));
212
-			statementVisitor.start();
213
-			for (Statement statement : script.statements) {
214
-				statement.accept(statementVisitor);
215
-			}
216
-			statementVisitor.end();
217
-		}
218
-		
219
-		JavaMethod runMethod = JavaMethod.getStatic(new JavaClass("script", "Scripts", JavaClass.Kind.CLASS), "run", "()V", Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC);
220
-		final JavaWriter runWriter = new JavaWriter(scriptsClassWriter, runMethod, null, null, null);
221
-		runWriter.start();
222
-		for (Map.Entry<String, JavaScriptFile> entry : scriptBlocks.entrySet()) {
223
-			for (JavaMethod method : entry.getValue().scriptMethods)
224
-				runWriter.invokeStatic(method);
225
-
226
-			entry.getValue().classWriter.visitEnd();
227
-			target.register(entry.getKey(), entry.getValue().classWriter.toByteArray());
228
-		}
229
-		runWriter.ret();
230
-		runWriter.end();
231
-
232
-		target.register("Scripts", scriptsClassWriter.toByteArray());
233
-		return target;
234
-	}
235
 }
126
 }

+ 0
- 76
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaModule.java View File

1
-/*
2
- * To change this license header, choose License Headers in Project Properties.
3
- * To change this template file, choose Tools | Templates
4
- * and open the template in the editor.
5
- */
6
-package org.openzen.zenscript.javabytecode;
7
-
8
-import java.io.File;
9
-import java.io.FileOutputStream;
10
-import java.io.IOException;
11
-import java.lang.reflect.InvocationTargetException;
12
-import java.util.HashMap;
13
-import java.util.Map;
14
-import java.util.logging.Level;
15
-import java.util.logging.Logger;
16
-
17
-/**
18
- * @author Hoofdgebruiker
19
- */
20
-public class JavaModule {
21
-	private final Map<String, byte[]> classes = new HashMap<>();
22
-	private final File debugOutput;
23
-	
24
-	public JavaModule() {
25
-		debugOutput = null;
26
-	}
27
-	
28
-	public JavaModule(File debugOutput) {
29
-		this.debugOutput = debugOutput;
30
-		debugOutput.mkdirs();
31
-	}
32
-	
33
-	public void register(String classname, byte[] bytecode) {
34
-		if (bytecode == null)
35
-			return;
36
-		
37
-		classname = classname.replace('/', '.');
38
-		classes.put(classname, bytecode);
39
-		
40
-		if (debugOutput != null) {
41
-			try (FileOutputStream writer = new FileOutputStream(new File(debugOutput, classname + ".class"))) {
42
-				writer.write(bytecode);
43
-			} catch (IOException e) {
44
-				e.printStackTrace();
45
-			}
46
-		}
47
-	}
48
-
49
-	public void execute() {
50
-		ScriptClassLoader classLoader = new ScriptClassLoader();
51
-
52
-		try {
53
-			classLoader.loadClass("Scripts").getMethod("run").invoke(null);
54
-		} catch (ClassNotFoundException | InvocationTargetException | NoSuchMethodException | IllegalAccessException | SecurityException | IllegalArgumentException ex) {
55
-			Logger.getLogger(JavaModule.class.getName()).log(Level.SEVERE, null, ex);
56
-		}
57
-	}
58
-
59
-	public class ScriptClassLoader extends ClassLoader {
60
-		private final Map<String, Class> customClasses = new HashMap<>();
61
-
62
-		@Override
63
-		public Class<?> loadClass(String name) throws ClassNotFoundException {
64
-			//System.out.println("LoadClass " + name);
65
-			
66
-			if (customClasses.containsKey(name))
67
-				return customClasses.get(name);
68
-			if (classes.containsKey(name)) {
69
-				final byte[] bytes = classes.get(name);
70
-				customClasses.put(name, defineClass(name, bytes, 0, bytes.length, null));
71
-				return customClasses.get(name);
72
-			}
73
-			return super.loadClass(name);
74
-		}
75
-	}
76
-}

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

2127
 
2127
 
2128
     @Override
2128
     @Override
2129
     public Void visitNew(NewExpression expression) {
2129
     public Void visitNew(NewExpression expression) {
2130
-		// TODO: this code is incorrect!
2131
 		JavaMethod method = context.getJavaMethod(expression.constructor);
2130
 		JavaMethod method = context.getJavaMethod(expression.constructor);
2132
-
2133
-        final String type;
2134
-        if (expression.type.type instanceof DefinitionTypeID)
2135
-            type = ((DefinitionTypeID) expression.type.type).definition.name;
2136
-        else
2137
-            type = context.getDescriptor(expression.type);
2138
-
2139
-        javaWriter.newObject(type);
2131
+        javaWriter.newObject(method.cls.internalName);
2140
         javaWriter.dup();
2132
         javaWriter.dup();
2141
 
2133
 
2142
 		for (Expression argument : expression.arguments.arguments) {
2134
 		for (Expression argument : expression.arguments.arguments) {

+ 22
- 0
JavaIntegration/build.gradle View File

1
+// Note: "common.gradle" in the root project contains additional initialization
2
+//   for this project. This initialization is applied in the "build.gradle"
3
+//   of the root project.
4
+
5
+// NetBeans will automatically add "run" and "debug" tasks relying on the
6
+// "mainClass" property. You may however define the property prior executing
7
+// tasks by passing a "-PmainClass=<QUALIFIED_CLASS_NAME>" argument.
8
+//
9
+// Note however, that you may define your own "run" and "debug" task if you
10
+// prefer. In this case NetBeans will not add these tasks but you may rely on
11
+// your own implementation.
12
+if (!hasProperty('mainClass')) {
13
+    ext.mainClass = ''
14
+}
15
+
16
+dependencies {
17
+	compile project(':CodeModel')
18
+	compile project(':CompilerShared')
19
+	compile project(':Parser')
20
+	compile project(':JavaBytecodeCompiler')
21
+	compile project(':JavaAnnotations')
22
+}

+ 538
- 0
JavaIntegration/src/main/java/org/openzen/zencode/java/JavaNativeModule.java View File

1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zencode.java;
7
+
8
+import java.lang.reflect.AnnotatedType;
9
+import java.lang.reflect.Field;
10
+import java.lang.reflect.Method;
11
+import java.lang.reflect.Modifier;
12
+import java.lang.reflect.ParameterizedType;
13
+import java.lang.reflect.Type;
14
+import java.lang.reflect.TypeVariable;
15
+import java.util.Collections;
16
+import java.util.HashMap;
17
+import java.util.Map;
18
+import org.openzen.zencode.shared.CodePosition;
19
+import org.openzen.zenscript.codemodel.FunctionHeader;
20
+import org.openzen.zenscript.codemodel.FunctionParameter;
21
+import org.openzen.zenscript.codemodel.GenericMapper;
22
+import org.openzen.zenscript.codemodel.HighLevelDefinition;
23
+import org.openzen.zenscript.codemodel.Modifiers;
24
+import org.openzen.zenscript.codemodel.Module;
25
+import org.openzen.zenscript.codemodel.OperatorType;
26
+import org.openzen.zenscript.codemodel.PackageDefinitions;
27
+import org.openzen.zenscript.codemodel.definition.ClassDefinition;
28
+import org.openzen.zenscript.codemodel.definition.EnumDefinition;
29
+import org.openzen.zenscript.codemodel.definition.InterfaceDefinition;
30
+import org.openzen.zenscript.codemodel.definition.StructDefinition;
31
+import org.openzen.zenscript.codemodel.definition.ZSPackage;
32
+import org.openzen.zenscript.codemodel.expression.ExpressionSymbol;
33
+import org.openzen.zenscript.codemodel.expression.StaticGetterExpression;
34
+import org.openzen.zenscript.codemodel.generic.ParameterTypeBound;
35
+import org.openzen.zenscript.codemodel.generic.TypeParameter;
36
+import org.openzen.zenscript.codemodel.member.CasterMember;
37
+import org.openzen.zenscript.codemodel.member.ConstructorMember;
38
+import org.openzen.zenscript.codemodel.member.FieldMember;
39
+import org.openzen.zenscript.codemodel.member.GetterMember;
40
+import org.openzen.zenscript.codemodel.member.MethodMember;
41
+import org.openzen.zenscript.codemodel.member.OperatorMember;
42
+import org.openzen.zenscript.codemodel.member.SetterMember;
43
+import org.openzen.zenscript.codemodel.partial.PartialStaticMemberGroupExpression;
44
+import org.openzen.zenscript.codemodel.type.BasicTypeID;
45
+import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
46
+import org.openzen.zenscript.codemodel.type.ISymbol;
47
+import org.openzen.zenscript.codemodel.type.StoredType;
48
+import org.openzen.zenscript.codemodel.type.StringTypeID;
49
+import org.openzen.zenscript.codemodel.type.TypeID;
50
+import org.openzen.zenscript.codemodel.type.member.TypeMembers;
51
+import org.openzen.zenscript.codemodel.type.storage.AutoStorageTag;
52
+import org.openzen.zenscript.compiler.ModuleSpace;
53
+import org.openzen.zenscript.compiler.SemanticModule;
54
+import org.openzen.zenscript.javashared.JavaClass;
55
+import org.openzen.zenscript.javashared.JavaCompiledModule;
56
+import org.openzen.zenscript.javashared.JavaField;
57
+import org.openzen.zenscript.javashared.JavaMethod;
58
+import stdlib.Strings;
59
+
60
+/**
61
+ *
62
+ * @author Hoofdgebruiker
63
+ */
64
+public class JavaNativeModule {
65
+	public final Module module;
66
+	private final ZSPackage pkg;
67
+	private final String basePackage;
68
+	private final GlobalTypeRegistry registry;
69
+	private final boolean allowNonAnnonated;
70
+	private final PackageDefinitions definitions = new PackageDefinitions();
71
+	private final JavaCompiledModule compiled;
72
+	
73
+	private final Map<Class<?>, HighLevelDefinition> definitionByClass = new HashMap<>();
74
+	private final Map<Class<?>, TypeID> typeByClass = new HashMap<>();
75
+	private final Map<Class<?>, TypeID> unsignedByClass = new HashMap<>();
76
+	
77
+	public final Map<String, ISymbol> globals = new HashMap<>();
78
+	
79
+	public JavaNativeModule(ZSPackage pkg, String name, String basePackage, GlobalTypeRegistry registry, boolean allowNonAnnotated) {
80
+		this.pkg = pkg;
81
+		this.basePackage = basePackage;
82
+		module = new Module(name);
83
+		this.registry = registry;
84
+		
85
+		this.allowNonAnnonated = allowNonAnnotated;
86
+		compiled = new JavaCompiledModule(module);
87
+		
88
+		typeByClass.put(void.class, BasicTypeID.VOID);
89
+		typeByClass.put(boolean.class, BasicTypeID.BOOL);
90
+		typeByClass.put(byte.class, BasicTypeID.SBYTE);
91
+		typeByClass.put(short.class, BasicTypeID.SHORT);
92
+		typeByClass.put(int.class, BasicTypeID.INT);
93
+		typeByClass.put(long.class, BasicTypeID.LONG);
94
+		typeByClass.put(float.class, BasicTypeID.FLOAT);
95
+		typeByClass.put(double.class, BasicTypeID.DOUBLE);
96
+		typeByClass.put(String.class, StringTypeID.INSTANCE);
97
+		typeByClass.put(Boolean.class, registry.getOptional(BasicTypeID.BOOL));
98
+		typeByClass.put(Byte.class, registry.getOptional(BasicTypeID.BYTE));
99
+		typeByClass.put(Short.class, registry.getOptional(BasicTypeID.SHORT));
100
+		typeByClass.put(Integer.class, registry.getOptional(BasicTypeID.INT));
101
+		typeByClass.put(Long.class, registry.getOptional(BasicTypeID.LONG));
102
+		typeByClass.put(Float.class, registry.getOptional(BasicTypeID.FLOAT));
103
+		typeByClass.put(Double.class, registry.getOptional(BasicTypeID.DOUBLE));
104
+		
105
+		unsignedByClass.put(byte.class, BasicTypeID.BYTE);
106
+		unsignedByClass.put(short.class, BasicTypeID.USHORT);
107
+		unsignedByClass.put(int.class, BasicTypeID.UINT);
108
+		unsignedByClass.put(long.class, BasicTypeID.ULONG);
109
+		unsignedByClass.put(Byte.class, registry.getOptional(BasicTypeID.BYTE));
110
+		unsignedByClass.put(Short.class, registry.getOptional(BasicTypeID.SHORT));
111
+		unsignedByClass.put(Integer.class, registry.getOptional(BasicTypeID.INT));
112
+		unsignedByClass.put(Long.class, registry.getOptional(BasicTypeID.LONG));
113
+	}
114
+	
115
+	public SemanticModule toSemantic(ModuleSpace space) {
116
+		return new SemanticModule(
117
+				module,
118
+				SemanticModule.NONE,
119
+				SemanticModule.State.NORMALIZED,
120
+				space.rootPackage,
121
+				pkg,
122
+				definitions,
123
+				Collections.emptyList(),
124
+				space.registry,
125
+				space.collectExpansions(),
126
+				space.getAnnotations(),
127
+				space.getStorageTypes());
128
+	}
129
+	
130
+	public JavaCompiledModule getCompiled() {
131
+		return compiled;
132
+	}
133
+	
134
+	public HighLevelDefinition addClass(Class<?> cls) {
135
+		if (definitionByClass.containsKey(cls))
136
+			return definitionByClass.get(cls);
137
+		
138
+		HighLevelDefinition result = addClass(cls, ZenCodeType.class.isAssignableFrom(cls));
139
+		definitionByClass.put(cls, result);
140
+		return result;
141
+	}
142
+	
143
+	public void addGlobals(Class<?> cls) {
144
+		HighLevelDefinition definition = new ClassDefinition(CodePosition.NATIVE, module, pkg, "__globals__", Modifiers.PUBLIC);
145
+		JavaClass jcls = JavaClass.fromInternalName(getInternalName(cls), JavaClass.Kind.CLASS);
146
+		compiled.setClassInfo(definition, jcls);
147
+		StoredType thisType = registry.getForMyDefinition(definition).stored();
148
+		
149
+		for (Field field : cls.getDeclaredFields()) {
150
+			if (!field.isAnnotationPresent(ZenCodeGlobals.Global.class))
151
+				continue;
152
+			if (!isStatic(field.getModifiers()))
153
+				continue;
154
+			
155
+			ZenCodeGlobals.Global global = field.getAnnotation(ZenCodeGlobals.Global.class);
156
+			StoredType type = loadStoredType(field.getAnnotatedType());
157
+			String name = global.value().isEmpty() ? field.getName() : global.value();
158
+			FieldMember fieldMember = new FieldMember(CodePosition.NATIVE, definition, Modifiers.PUBLIC | Modifiers.STATIC, name, thisType, type, registry, Modifiers.PUBLIC, 0, null);
159
+			definition.addMember(fieldMember);
160
+			compiled.setFieldInfo(fieldMember, new JavaField(jcls, name, getDescriptor(field.getType())));
161
+			globals.put(name, new ExpressionSymbol((position, scope) -> new StaticGetterExpression(CodePosition.BUILTIN, fieldMember.autoGetter.ref(thisType, GenericMapper.EMPTY))));
162
+		}
163
+		
164
+		for (Method method : cls.getDeclaredMethods()) {
165
+			if (!method.isAnnotationPresent(ZenCodeGlobals.Global.class))
166
+				continue;
167
+			if (!isStatic(method.getModifiers()))
168
+				continue;
169
+			
170
+			ZenCodeGlobals.Global global = method.getAnnotation(ZenCodeGlobals.Global.class);
171
+			String name = global.value().isEmpty() ? method.getName() : global.value();
172
+			MethodMember methodMember = new MethodMember(CodePosition.NATIVE, definition, Modifiers.PUBLIC | Modifiers.STATIC, name, getHeader(method), null);
173
+			definition.addMember(methodMember);
174
+			
175
+			boolean isGenericResult = methodMember.header.getReturnType().isGeneric();
176
+			compiled.setMethodInfo(methodMember, new JavaMethod(jcls, JavaMethod.Kind.STATIC, name, false, getMethodDescriptor(method), method.getModifiers(), isGenericResult));
177
+			globals.put(name, new ExpressionSymbol((position, scope) -> {
178
+				TypeMembers members = scope.getTypeMembers(thisType);
179
+				return new PartialStaticMemberGroupExpression(position, scope, thisType.type, members.getGroup(name), StoredType.NONE);
180
+			}));
181
+		}
182
+	}
183
+	
184
+	private ZSPackage getPackage(String className) {
185
+		if (!className.contains("."))
186
+			return pkg;
187
+		
188
+		if (className.startsWith("."))
189
+			className = className.substring(1);
190
+		else if (className.startsWith(basePackage + "."))
191
+			className = className.substring(basePackage.length() + 1);
192
+		else
193
+			throw new IllegalArgumentException("Invalid class name: not in the given base package");
194
+		
195
+		String[] classNameParts = Strings.split(className, '.');
196
+		ZSPackage classPkg = pkg;
197
+		for (int i = 0; i < classNameParts.length - 1; i++)
198
+			classPkg = classPkg.getOrCreatePackage(classNameParts[i]);
199
+		
200
+		return classPkg;
201
+	}
202
+	
203
+	private <T> HighLevelDefinition addClass(Class<T> cls, boolean annotated) {
204
+		if (!annotated && !allowNonAnnonated)
205
+			throw new IllegalArgumentException("This class is not annotated as ZenCode class");
206
+		if ((cls.getModifiers() & Modifier.PUBLIC) == 0)
207
+			throw new IllegalArgumentException("Class must be public");
208
+		
209
+		ZenCodeType.Name name = cls.getDeclaredAnnotation(ZenCodeType.Name.class);
210
+		String className = name == null ? cls.getName() : name.value();
211
+		boolean isStruct = cls.getAnnotation(ZenCodeType.Struct.class) != null;
212
+		
213
+		ZSPackage classPkg = getPackage(className);
214
+		className = className.contains(".") ? className.substring(className.lastIndexOf('.') + 1) : className;
215
+		
216
+		TypeVariable<Class<T>>[] javaTypeParameters = cls.getTypeParameters();
217
+		TypeParameter[] typeParameters = new TypeParameter[cls.getTypeParameters().length];
218
+		for (int i = 0; i < javaTypeParameters.length; i++) {
219
+			TypeVariable<Class<T>> typeVariable = javaTypeParameters[i];
220
+			TypeParameter parameter = new TypeParameter(CodePosition.NATIVE, typeVariable.getName());
221
+			for (AnnotatedType bound : typeVariable.getAnnotatedBounds()) {
222
+				TypeID type = loadType(bound);
223
+				parameter.addBound(new ParameterTypeBound(CodePosition.NATIVE, type));
224
+			}
225
+		}
226
+		
227
+		HighLevelDefinition definition;
228
+		String internalName = getInternalName(cls);
229
+		JavaClass javaClass;
230
+		if (cls.isInterface()) {
231
+			definition = new InterfaceDefinition(CodePosition.NATIVE, module, classPkg, className, Modifiers.PUBLIC, null);
232
+			javaClass = JavaClass.fromInternalName(internalName, JavaClass.Kind.INTERFACE);
233
+		} else if (cls.isEnum()) {
234
+			definition = new EnumDefinition(CodePosition.NATIVE, module, pkg, className, Modifiers.PUBLIC, null);
235
+			javaClass = JavaClass.fromInternalName(internalName, JavaClass.Kind.ENUM);
236
+		} else if (isStruct) {
237
+			definition = new StructDefinition(CodePosition.NATIVE, module, pkg, className, Modifiers.PUBLIC, null);
238
+			javaClass = JavaClass.fromInternalName(internalName, JavaClass.Kind.CLASS);
239
+		} else {
240
+			definition = new ClassDefinition(CodePosition.NATIVE, module, classPkg, className, Modifiers.PUBLIC);
241
+			javaClass = JavaClass.fromInternalName(internalName, JavaClass.Kind.CLASS);
242
+		}
243
+		
244
+		definition.typeParameters = typeParameters;
245
+		compiled.setClassInfo(definition, javaClass);
246
+		
247
+		StoredType thisType = new StoredType(registry.getForMyDefinition(definition), AutoStorageTag.INSTANCE);
248
+		for (Field field : cls.getDeclaredFields()) {
249
+			ZenCodeType.Field annotation = field.getAnnotation(ZenCodeType.Field.class);
250
+			if (annotated && annotation == null)
251
+				continue;
252
+			if (!isPublic(field.getModifiers()))
253
+				continue;
254
+
255
+			String fieldName = field.getName();
256
+			if (annotation != null && !annotation.value().isEmpty())
257
+				fieldName = annotation.value();
258
+			
259
+			StoredType fieldType = loadStoredType(field.getAnnotatedType());
260
+			FieldMember member = new FieldMember(CodePosition.NATIVE, definition, Modifiers.PUBLIC, fieldName, thisType, fieldType, registry, 0, 0, null);
261
+			definition.addMember(member);
262
+			compiled.setFieldInfo(member, new JavaField(javaClass, field.getName(), getDescriptor(field.getType())));
263
+		}
264
+		
265
+		for (Method method : cls.getDeclaredMethods()) {
266
+			ZenCodeType.Constructor constructorAnnotation = method.getAnnotation(ZenCodeType.Constructor.class);
267
+			if (constructorAnnotation != null || (!annotated && method.getName().equals("<init>"))) {
268
+				ConstructorMember member = asConstructor(definition, method);
269
+				definition.addMember(member);
270
+				compiled.setMethodInfo(member, getMethod(javaClass, method, BasicTypeID.VOID.stored));
271
+			}
272
+			
273
+			ZenCodeType.Method methodAnnotation = method.getAnnotation(ZenCodeType.Method.class);
274
+			if (methodAnnotation != null) {
275
+				MethodMember member = asMethod(definition, method, methodAnnotation);
276
+				definition.addMember(member);
277
+				compiled.setMethodInfo(member, getMethod(javaClass, method, member.header.getReturnType()));
278
+				continue;
279
+			}
280
+			
281
+			ZenCodeType.Getter getter = method.getAnnotation(ZenCodeType.Getter.class);
282
+			if (getter != null || (!annotated && isGetterName(method.getName()) && method.getParameterCount() == 0)) {
283
+				GetterMember member = asGetter(definition, method, getter);
284
+				definition.addMember(member);
285
+				compiled.setMethodInfo(member, getMethod(javaClass, method, member.getType()));
286
+				continue;
287
+			}
288
+			
289
+			ZenCodeType.Setter setter = method.getAnnotation(ZenCodeType.Setter.class);
290
+			if (setter != null || (!annotated && method.getName().startsWith("set") && method.getParameterCount() == 1)) {
291
+				SetterMember member = asSetter(definition, method, setter);
292
+				definition.addMember(member);
293
+				compiled.setMethodInfo(member, getMethod(javaClass, method, BasicTypeID.VOID.stored));
294
+				continue;
295
+			}
296
+			
297
+			ZenCodeType.Operator operator = method.getAnnotation(ZenCodeType.Operator.class);
298
+			if (operator != null) {
299
+				OperatorMember member = asOperator(definition, method, operator);
300
+				definition.addMember(member);
301
+				compiled.setMethodInfo(member, getMethod(javaClass, method, member.header.getReturnType()));
302
+				continue;
303
+			}
304
+			
305
+			ZenCodeType.Caster caster = method.getAnnotation(ZenCodeType.Caster.class);
306
+			if (caster != null) {
307
+				CasterMember member = asCaster(definition, method, caster);
308
+				definition.addMember(member);
309
+				compiled.setMethodInfo(member, getMethod(javaClass, method, member.toType));
310
+				continue;
311
+			}
312
+			
313
+			if (!annotated) {
314
+				MethodMember member = asMethod(definition, method, null);
315
+				definition.addMember(member);
316
+				compiled.setMethodInfo(member, getMethod(javaClass, method, member.header.getReturnType()));
317
+			}
318
+		}
319
+		
320
+		return definition;
321
+	}
322
+	
323
+	private boolean isGetterName(String name) {
324
+		return name.startsWith("get") || name.startsWith("is") || name.startsWith("has");
325
+	}
326
+	
327
+	private String translateGetterName(String name) {
328
+		if (name.startsWith("get"))
329
+			return name.substring(3, 4).toLowerCase() + name.substring(4);
330
+		
331
+		return name;
332
+	}
333
+	
334
+	private String translateSetterName(String name) {
335
+		if (name.startsWith("set"))
336
+			return name.substring(3, 4).toLowerCase() + name.substring(4);
337
+		
338
+		return name;
339
+	}
340
+	
341
+	private ConstructorMember asConstructor(HighLevelDefinition definition, Method method) {
342
+		FunctionHeader header = getHeader(method);
343
+		return new ConstructorMember(
344
+				CodePosition.NATIVE,
345
+				definition,
346
+				getMethodModifiers(method),
347
+				header,
348
+				null);
349
+	}
350
+	
351
+	private MethodMember asMethod(HighLevelDefinition definition, Method method, ZenCodeType.Method annotation) {
352
+		String name = annotation != null && !annotation.value().isEmpty() ? annotation.value() : method.getName();
353
+		FunctionHeader header = getHeader(method);
354
+		return new MethodMember(
355
+				CodePosition.NATIVE,
356
+				definition,
357
+				getMethodModifiers(method),
358
+				name,
359
+				header,
360
+				null);
361
+	}
362
+	
363
+	private OperatorMember asOperator(HighLevelDefinition definition, Method method, ZenCodeType.Operator annotation) {
364
+		FunctionHeader header = getHeader(method);
365
+		if (isStatic(method.getModifiers()))
366
+			throw new IllegalArgumentException("operator method cannot be static");
367
+		
368
+		// TODO: check number of parameters
369
+		//if (header.parameters.length != annotation.value().parameters)
370
+		
371
+		return new OperatorMember(
372
+				CodePosition.NATIVE,
373
+				definition,
374
+				getMethodModifiers(method),
375
+				OperatorType.valueOf(annotation.value().toString()),
376
+				header,
377
+				null);
378
+	}
379
+	
380
+	private GetterMember asGetter(HighLevelDefinition definition, Method method, ZenCodeType.Getter annotation) {
381
+		StoredType type = loadStoredType(method.getAnnotatedReturnType());
382
+		String name = null;
383
+		if (annotation != null && !annotation.value().isEmpty())
384
+			name = annotation.value();
385
+		if (name == null)
386
+			name = translateGetterName(method.getName());
387
+		
388
+		return new GetterMember(CodePosition.NATIVE, definition, getMethodModifiers(method), name, type, null);
389
+	}
390
+	
391
+	private SetterMember asSetter(HighLevelDefinition definition, Method method, ZenCodeType.Setter annotation) {
392
+		if (method.getParameterCount() != 1)
393
+			throw new IllegalArgumentException("Illegal setter: must have exactly 1 parameter");
394
+		
395
+		StoredType type = loadStoredType(method.getAnnotatedParameterTypes()[0]);
396
+		String name = null;
397
+		if (annotation != null && !annotation.value().isEmpty())
398
+			name = annotation.value();
399
+		if (name == null)
400
+			name = translateSetterName(method.getName());
401
+		
402
+		return new SetterMember(CodePosition.NATIVE, definition, getMethodModifiers(method), name, type, null);
403
+	}
404
+	
405
+	private CasterMember asCaster(HighLevelDefinition definition, Method method, ZenCodeType.Caster annotation) {
406
+		boolean implicit = annotation != null && annotation.implicit();
407
+		int modifiers = Modifiers.PUBLIC;
408
+		if (implicit)
409
+			modifiers |= Modifiers.IMPLICIT;
410
+		
411
+		StoredType toType = loadStoredType(method.getAnnotatedReturnType());
412
+		return new CasterMember(CodePosition.NATIVE, definition, modifiers, toType, null);
413
+	}
414
+	
415
+	private FunctionHeader getHeader(Method method) {
416
+		StoredType returnType = loadStoredType(method.getAnnotatedReturnType());
417
+		
418
+		FunctionParameter[] parameters = new FunctionParameter[method.getParameterCount()];
419
+		AnnotatedType[] parameterTypes = method.getAnnotatedParameterTypes();
420
+		for (int i = 0; i < parameters.length; i++) {
421
+			parameters[i] = new FunctionParameter(loadStoredType(parameterTypes[i]));
422
+		}
423
+		
424
+		TypeVariable<Method>[] javaTypeParameters = method.getTypeParameters();
425
+		TypeParameter[] typeParameters = new TypeParameter[javaTypeParameters.length];
426
+		for (int i = 0; i < javaTypeParameters.length; i++) {
427
+			TypeVariable<Method> javaTypeParameter = javaTypeParameters[i];
428
+			typeParameters[i] = new TypeParameter(CodePosition.UNKNOWN, javaTypeParameter.getName());
429
+			
430
+			for (AnnotatedType bound : javaTypeParameter.getAnnotatedBounds())
431
+				typeParameters[i].addBound(new ParameterTypeBound(CodePosition.NATIVE, loadType(bound)));
432
+		}
433
+		
434
+		AnnotatedType[] exceptionTypes = method.getAnnotatedExceptionTypes();
435
+		if (exceptionTypes.length > 1)
436
+			throw new IllegalArgumentException("A method can only throw a single exception type!");
437
+		
438
+		StoredType thrownType = exceptionTypes.length == 0 ? null : loadStoredType(exceptionTypes[0]);
439
+		return new FunctionHeader(typeParameters, returnType, thrownType, AutoStorageTag.INSTANCE, parameters);
440
+	}
441
+	
442
+	private StoredType loadStoredType(AnnotatedType annotatedType) {
443
+		TypeID baseType = loadType(annotatedType);
444
+		return baseType.stored();
445
+	}
446
+	
447
+	private TypeID loadType(AnnotatedType annotatedType) {
448
+		if (annotatedType.isAnnotationPresent(ZenCodeType.USize.class))
449
+			return BasicTypeID.USIZE;
450
+		else if (annotatedType.isAnnotationPresent(ZenCodeType.NullableUSize.class))
451
+			return registry.getOptional(BasicTypeID.USIZE);
452
+		
453
+		boolean nullable = annotatedType.isAnnotationPresent(ZenCodeType.Nullable.class);
454
+		boolean unsigned = annotatedType.isAnnotationPresent(ZenCodeType.Unsigned.class);
455
+		
456
+		Type type = annotatedType.getType();
457
+		return loadType(type, nullable, unsigned);
458
+	}
459
+	
460
+	private TypeID loadType(Type type, boolean nullable, boolean unsigned) {
461
+		if (type instanceof Class) {
462
+			Class<?> classType = (Class<?>)type;
463
+			if (unsigned) {
464
+				if (unsignedByClass.containsKey(classType))
465
+					return unsignedByClass.get(classType);
466
+				else
467
+					throw new IllegalArgumentException("This class cannot be used as unsigned: " + classType);
468
+			}
469
+			
470
+			if (typeByClass.containsKey(classType))
471
+				return typeByClass.get(classType);
472
+			
473
+			HighLevelDefinition definition = addClass(classType);
474
+			return registry.getForDefinition(definition);
475
+		} else if (type instanceof ParameterizedType) {
476
+			ParameterizedType parameterizedType = (ParameterizedType)type;
477
+			Class<?> rawType = (Class)parameterizedType.getRawType();
478
+			
479
+			HighLevelDefinition definition = addClass(rawType);
480
+			Type[] parameters = parameterizedType.getActualTypeArguments();
481
+			StoredType[] codeParameters = new StoredType[parameters.length];
482
+			for (int i = 0; i < parameters.length; i++)
483
+				codeParameters[i] = loadType(parameters[i], false, false).stored();
484
+			
485
+			return registry.getForDefinition(definition, codeParameters);
486
+		} else {
487
+			throw new IllegalArgumentException("Could not analyze type: " + type);
488
+		}
489
+	}
490
+	
491
+	private int getMethodModifiers(Method method) {
492
+		int result = Modifiers.PUBLIC;
493
+		if (isStatic(method.getModifiers()))
494
+			result |= Modifiers.STATIC;
495
+		if (isFinal(method.getModifiers()))
496
+			result |= Modifiers.FINAL;
497
+		
498
+		return result;
499
+	}
500
+	
501
+	private static boolean isPublic(int modifiers) {
502
+		return (modifiers & Modifier.PUBLIC) > 0;
503
+	}
504
+	
505
+	private static boolean isStatic(int modifiers) {
506
+		return (modifiers & Modifier.STATIC) > 0;
507
+	}
508
+	
509
+	private static boolean isFinal(int modifiers) {
510
+		return (modifiers & Modifier.FINAL) > 0;
511
+	}
512
+	
513
+	private static String getInternalName(Class<?> cls) {
514
+		return org.objectweb.asm.Type.getInternalName(cls);
515
+	}
516
+	
517
+	private static String getDescriptor(Class<?> cls) {
518
+		return org.objectweb.asm.Type.getDescriptor(cls);
519
+	}
520
+	
521
+	private static String getMethodDescriptor(Method method) {
522
+		return org.objectweb.asm.Type.getMethodDescriptor(method);
523
+	}
524
+	
525
+	private static JavaMethod getMethod(JavaClass cls, Method method, StoredType result) {
526
+		JavaMethod.Kind kind;
527
+		if (method.getName().equals("<init>"))
528
+			kind = JavaMethod.Kind.CONSTRUCTOR;
529
+		else if (method.getName().equals("<clinit>"))
530
+			kind = JavaMethod.Kind.STATICINIT;
531
+		else if (isStatic(method.getModifiers()))
532
+			kind = JavaMethod.Kind.STATIC;
533
+		else
534
+			kind = JavaMethod.Kind.INSTANCE;
535
+		
536
+		return new JavaMethod(cls, kind, method.getName(), false, getMethodDescriptor(method), method.getModifiers(), result.isGeneric());
537
+	}
538
+}

+ 129
- 0
JavaIntegration/src/main/java/org/openzen/zencode/java/ScriptingEngine.java View File

1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zencode.java;
7
+
8
+import java.io.File;
9
+import java.io.IOException;
10
+import java.util.ArrayList;
11
+import java.util.List;
12
+import java.util.Map;
13
+import org.openzen.zencode.shared.CompileException;
14
+import org.openzen.zencode.shared.SourceFile;
15
+import org.openzen.zenscript.codemodel.Module;
16
+import org.openzen.zenscript.codemodel.context.CompilingPackage;
17
+import org.openzen.zenscript.codemodel.definition.ZSPackage;
18
+import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
19
+import org.openzen.zenscript.codemodel.type.ISymbol;
20
+import org.openzen.zenscript.codemodel.type.storage.StorageType;
21
+import org.openzen.zenscript.compiler.ModuleSpace;
22
+import org.openzen.zenscript.compiler.SemanticModule;
23
+import org.openzen.zenscript.javabytecode.JavaBytecodeRunUnit;
24
+import org.openzen.zenscript.javabytecode.JavaCompiler;
25
+import org.openzen.zenscript.javashared.SimpleJavaCompileSpace;
26
+import org.openzen.zenscript.lexer.ParseException;
27
+import org.openzen.zenscript.parser.BracketExpressionParser;
28
+import org.openzen.zenscript.parser.ParsedFile;
29
+import org.openzen.zenscript.parser.ZippedPackage;
30
+
31
+/**
32
+ *
33
+ * @author Hoofdgebruiker
34
+ */
35
+public class ScriptingEngine {
36
+	private final ZSPackage root = ZSPackage.createRoot();
37
+	private final ZSPackage stdlib = new ZSPackage(root, "stdlib");
38
+	public final GlobalTypeRegistry registry = new GlobalTypeRegistry(stdlib);
39
+	private final ModuleSpace space;
40
+	
41
+	private final List<JavaNativeModule> nativeModules = new ArrayList<>();
42
+	private final List<SemanticModule> compiledModules = new ArrayList<>();
43
+	
44
+	public ScriptingEngine() {
45
+		space = new ModuleSpace(registry, new ArrayList<>(), StorageType.getStandard());
46
+		
47
+		try {
48
+			ZippedPackage stdlibs = new ZippedPackage(ScriptingEngine.class.getResourceAsStream("/StdLibs.zip"));
49
+			SemanticModule stdlibModule = stdlibs.loadModule(space, "stdlib", null, new SemanticModule[0], stdlib);
50
+			stdlibModule.validate(error -> System.out.println(error.toString()));
51
+			space.addModule("stdlib", stdlibModule);
52
+		} catch (IOException ex) {
53
+			throw new RuntimeException(ex);
54
+		} catch (CompileException ex) {
55
+			throw new RuntimeException(ex);
56
+		} catch (ParseException ex) {
57
+			throw new RuntimeException(ex);
58
+		}
59
+	}
60
+	
61
+	public JavaNativeModule createNativeModule(String name, String basePackage, JavaNativeModule... dependencies) {
62
+		ZSPackage testPackage = new ZSPackage(space.rootPackage, name);
63
+		return new JavaNativeModule(testPackage, name, basePackage, registry, false);
64
+	}
65
+	
66
+	public void registerNativeProvided(JavaNativeModule module) throws CompileException {
67
+		SemanticModule semantic = module.toSemantic(space);
68
+		if (!semantic.validate(entry -> System.out.println(entry)))
69
+			return;
70
+		
71
+		space.addModule(module.module.name, semantic);
72
+		nativeModules.add(module);
73
+		
74
+		for (Map.Entry<String, ISymbol> globalEntry : module.globals.entrySet())
75
+			space.addGlobal(globalEntry.getKey(), globalEntry.getValue());
76
+	}
77
+	
78
+	public SemanticModule createScriptedModule(String name, SourceFile[] sources, String... dependencies) throws ParseException {
79
+		return createScriptedModule(name, sources, null, dependencies);
80
+	}
81
+	
82
+	public SemanticModule createScriptedModule(String name, SourceFile[] sources, BracketExpressionParser bracketParser, String... dependencies) throws ParseException {
83
+		Module scriptModule = new Module(name);
84
+		CompilingPackage scriptPackage = new CompilingPackage(new ZSPackage(space.rootPackage, name), scriptModule);
85
+		
86
+		ParsedFile[] files = new ParsedFile[sources.length];
87
+		for (int i = 0; i < sources.length; i++)
88
+			files[i] = ParsedFile.parse(scriptPackage, bracketParser, sources[i]);
89
+		
90
+		SemanticModule[] dependencyModules = new SemanticModule[dependencies.length + 1];
91
+		dependencyModules[0] = space.getModule("stdlib");
92
+		for (int i = 0; i < dependencies.length; i++) {
93
+			dependencyModules[i + 1] = space.getModule(dependencies[i]);
94
+		}
95
+		
96
+		SemanticModule scripts = ParsedFile.compileSyntaxToSemantic(
97
+				dependencyModules,
98
+				scriptPackage,
99
+				files,
100
+				space,
101
+				ex -> ex.printStackTrace());
102
+		if (!scripts.isValid())
103
+			return scripts;
104
+		
105
+		scripts = scripts.normalize();
106
+		if (!scripts.validate(error -> System.out.println(error.toString())))
107
+			return scripts;
108
+		
109
+		return scripts;
110
+	}
111
+	
112
+	public void registerCompiled(SemanticModule module) {
113
+		compiledModules.add(module);
114
+	}
115
+	
116
+	public void run() {
117
+		SimpleJavaCompileSpace javaSpace = new SimpleJavaCompileSpace(registry);
118
+		for (JavaNativeModule nativeModule : nativeModules)
119
+			javaSpace.register(nativeModule.getCompiled());
120
+		
121
+		JavaCompiler compiler = new JavaCompiler();
122
+		
123
+		JavaBytecodeRunUnit runUnit = new JavaBytecodeRunUnit();
124
+		for (SemanticModule compiled : compiledModules)
125
+			runUnit.add(compiler.compile(compiled.name, compiled, javaSpace));
126
+		runUnit.dump(new File("classes"));
127
+		runUnit.run();
128
+	}
129
+}

+ 3
- 0
JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaCompileSpace.java View File

6
 package org.openzen.zenscript.javashared;
6
 package org.openzen.zenscript.javashared;
7
 
7
 
8
 import org.openzen.zenscript.codemodel.Module;
8
 import org.openzen.zenscript.codemodel.Module;
9
+import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
9
 
10
 
10
 /**
11
 /**
11
  *
12
  *
12
  * @author Hoofdgebruiker
13
  * @author Hoofdgebruiker
13
  */
14
  */
14
 public interface JavaCompileSpace {
15
 public interface JavaCompileSpace {
16
+	public GlobalTypeRegistry getRegistry();
17
+	
15
 	public JavaCompiledModule getCompiled(Module module);
18
 	public JavaCompiledModule getCompiled(Module module);
16
 }
19
 }

+ 0
- 12
JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaCompiledModule.java View File

5
  */
5
  */
6
 package org.openzen.zenscript.javashared;
6
 package org.openzen.zenscript.javashared;
7
 
7
 
8
-import java.util.ArrayList;
9
 import java.util.HashMap;
8
 import java.util.HashMap;
10
-import java.util.List;
11
 import java.util.Map;
9
 import java.util.Map;
12
-import org.openzen.zencode.shared.CodePosition;
13
 import org.openzen.zenscript.codemodel.FunctionParameter;
10
 import org.openzen.zenscript.codemodel.FunctionParameter;
14
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
15
 import org.openzen.zenscript.codemodel.Module;
12
 import org.openzen.zenscript.codemodel.Module;
17
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
14
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
18
 import org.openzen.zenscript.codemodel.member.ImplementationMember;
15
 import org.openzen.zenscript.codemodel.member.ImplementationMember;
19
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
16
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
20
-import org.openzen.zenscript.codemodel.statement.BlockStatement;
21
-import org.openzen.zenscript.codemodel.statement.Statement;
22
 
17
 
23
 /**
18
 /**
24
  *
19
  *
40
 		this.module = module;
35
 		this.module = module;
41
 	}
36
 	}
42
 	
37
 	
43
-	/*public Statement generateModuleDefinitionMethod() {
44
-		List<Statement> statements = new ArrayList<>();
45
-		
46
-		
47
-		return new BlockStatement(CodePosition.GENERATED, statements.toArray(new Statement[statements.size()]));
48
-	}*/
49
-	
50
 	public void setClassInfo(HighLevelDefinition definition, JavaClass cls) {
38
 	public void setClassInfo(HighLevelDefinition definition, JavaClass cls) {
51
 		classes.put(definition, cls);
39
 		classes.put(definition, cls);
52
 	}
40
 	}

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

15
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
15
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
16
 import org.openzen.zenscript.codemodel.Module;
16
 import org.openzen.zenscript.codemodel.Module;
17
 import org.openzen.zenscript.codemodel.definition.VariantDefinition;
17
 import org.openzen.zenscript.codemodel.definition.VariantDefinition;
18
+import org.openzen.zenscript.codemodel.definition.ZSPackage;
18
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
19
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
19
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
20
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
20
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
21
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
38
 	private final Map<String, JavaSynthesizedRange> ranges = new HashMap<>();
39
 	private final Map<String, JavaSynthesizedRange> ranges = new HashMap<>();
39
 	private boolean useShared = false;
40
 	private boolean useShared = false;
40
 	
41
 	
42
+	private final JavaCompileSpace space;
41
 	private final Map<Module, JavaCompiledModule> modules = new HashMap<>();
43
 	private final Map<Module, JavaCompiledModule> modules = new HashMap<>();
42
 	
44
 	
43
-	public JavaContext(GlobalTypeRegistry registry) {
44
-		this.registry = registry;
45
+	public final ZSPackage modulePackage;
46
+	public final String basePackage;
47
+	
48
+	public JavaContext(JavaCompileSpace space, ZSPackage modulePackage, String basePackage) {
49
+		this.space = space;
50
+		this.registry = space.getRegistry();
51
+		
52
+		this.modulePackage = modulePackage;
53
+		this.basePackage = basePackage;
45
 		
54
 		
46
 		{
55
 		{
47
 			TypeParameter t = new TypeParameter(CodePosition.BUILTIN, "T");
56
 			TypeParameter t = new TypeParameter(CodePosition.BUILTIN, "T");
80
 		}
89
 		}
81
 	}
90
 	}
82
 	
91
 	
92
+	public String getPackageName(ZSPackage pkg) {
93
+		if (pkg == null)
94
+			throw new IllegalArgumentException("Package not part of this module");
95
+		
96
+		if (pkg == modulePackage)
97
+			return basePackage;
98
+		
99
+		return getPackageName(pkg.parent) + "/" + pkg.name;
100
+	}
101
+	
83
 	protected abstract JavaSyntheticClassGenerator getTypeGenerator();
102
 	protected abstract JavaSyntheticClassGenerator getTypeGenerator();
84
 		
103
 		
85
 	public abstract String getDescriptor(TypeID type);
104
 	public abstract String getDescriptor(TypeID type);
86
 	
105
 	
87
 	public abstract String getDescriptor(StoredType type);
106
 	public abstract String getDescriptor(StoredType type);
88
 	
107
 	
89
-	public void registerModule(JavaCompiledModule module) {
90
-		modules.put(module.module, module);
91
-	}
92
-	
93
-	public void addModule(Module module) {
94
-		modules.put(module, new JavaCompiledModule(module));
108
+	public void addModule(Module module, JavaCompiledModule target) {
109
+		modules.put(module, target);
95
 	}
110
 	}
96
 	
111
 	
97
 	public JavaCompiledModule getJavaModule(Module module) {
112
 	public JavaCompiledModule getJavaModule(Module module) {
98
-		JavaCompiledModule javaModule = modules.get(module);
113
+		if (modules.containsKey(module))
114
+			return modules.get(module);
115
+		
116
+		JavaCompiledModule javaModule = space.getCompiled(module);
99
 		if (javaModule == null)
117
 		if (javaModule == null)
100
 			throw new IllegalStateException("Module not yet registered: " + module.name);
118
 			throw new IllegalStateException("Module not yet registered: " + module.name);
101
 		
119
 		

+ 11
- 0
JavaShared/src/main/java/org/openzen/zenscript/javashared/SimpleJavaCompileSpace.java View File

8
 import java.util.HashMap;
8
 import java.util.HashMap;
9
 import java.util.Map;
9
 import java.util.Map;
10
 import org.openzen.zenscript.codemodel.Module;
10
 import org.openzen.zenscript.codemodel.Module;
11
+import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
11
 
12
 
12
 /**
13
 /**
13
  *
14
  *
14
  * @author Hoofdgebruiker
15
  * @author Hoofdgebruiker
15
  */
16
  */
16
 public class SimpleJavaCompileSpace implements JavaCompileSpace {
17
 public class SimpleJavaCompileSpace implements JavaCompileSpace {
18
+	private final GlobalTypeRegistry registry;
17
 	private final Map<Module, JavaCompiledModule> modules = new HashMap<>();
19
 	private final Map<Module, JavaCompiledModule> modules = new HashMap<>();
18
 	
20
 	
21
+	public SimpleJavaCompileSpace(GlobalTypeRegistry registry) {
22
+		this.registry = registry;
23
+	}
24
+	
19
 	public void register(JavaCompiledModule module) {
25
 	public void register(JavaCompiledModule module) {
20
 		modules.put(module.module, module);
26
 		modules.put(module.module, module);
21
 	}
27
 	}
28
+
29
+	@Override
30
+	public GlobalTypeRegistry getRegistry() {
31
+		return registry;
32
+	}
22
 	
33
 	
23
 	@Override
34
 	@Override
24
 	public JavaCompiledModule getCompiled(Module module) {
35
 	public JavaCompiledModule getCompiled(Module module) {

+ 5
- 5
JavaShared/src/main/java/org/openzen/zenscript/javashared/prepare/JavaPrepareDefinitionVisitor.java View File

295
 		if (isPrepared(definition))
295
 		if (isPrepared(definition))
296
 			return context.getJavaClass(definition);
296
 			return context.getJavaClass(definition);
297
 		
297
 		
298
-		JavaClass cls = new JavaClass(definition.pkg.fullName, JavaClass.getNameFromFile(filename), JavaClass.Kind.CLASS);
298
+		JavaClass cls = new JavaClass(context.getPackageName(definition.pkg), JavaClass.getNameFromFile(filename), JavaClass.Kind.CLASS);
299
 		context.setJavaClass(definition, cls);
299
 		context.setJavaClass(definition, cls);
300
 		return cls;
300
 		return cls;
301
 	}
301
 	}
310
 			context.setJavaNativeClass(definition, nativeClasses.get(nativeTag.value));
310
 			context.setJavaNativeClass(definition, nativeClasses.get(nativeTag.value));
311
 		}
311
 		}
312
 		
312
 		
313
-		JavaClass cls = new JavaClass(definition.pkg.fullName, JavaClass.getNameFromFile(filename), JavaClass.Kind.CLASS);
313
+		JavaClass cls = new JavaClass(context.getPackageName(definition.pkg), JavaClass.getNameFromFile(filename), JavaClass.Kind.CLASS);
314
 		context.setJavaClass(definition, cls);
314
 		context.setJavaClass(definition, cls);
315
 		return cls;
315
 		return cls;
316
 	}
316
 	}
326
 		if (isPrepared(variant))
326
 		if (isPrepared(variant))
327
 			return context.getJavaClass(variant);
327
 			return context.getJavaClass(variant);
328
 		
328
 		
329
-		JavaClass cls = new JavaClass(variant.pkg.fullName, variant.name, JavaClass.Kind.CLASS);
329
+		JavaClass cls = new JavaClass(context.getPackageName(variant.pkg), variant.name, JavaClass.Kind.CLASS);
330
 		context.setJavaClass(variant, cls);
330
 		context.setJavaClass(variant, cls);
331
 		
331
 		
332
 		for (VariantDefinition.Option option : variant.options) {
332
 		for (VariantDefinition.Option option : variant.options) {
345
 		JavaNativeClass nativeClass = nativeTag == null ? null : nativeClasses.get(nativeTag.value);
345
 		JavaNativeClass nativeClass = nativeTag == null ? null : nativeClasses.get(nativeTag.value);
346
 		JavaClass cls;
346
 		JavaClass cls;
347
 		if (nativeClass == null) {
347
 		if (nativeClass == null) {
348
-			cls = outerClass == null ? new JavaClass(definition.pkg.fullName, definition.name, kind) : new JavaClass(outerClass, definition.name, kind);
348
+			cls = outerClass == null ? new JavaClass(context.getPackageName(definition.pkg), definition.name, kind) : new JavaClass(outerClass, definition.name, kind);
349
 			cls.destructible = definition.isDestructible();
349
 			cls.destructible = definition.isDestructible();
350
 			context.setJavaClass(definition, cls);
350
 			context.setJavaClass(definition, cls);
351
 		} else {
351
 		} else {
352
-			cls = outerClass == null ? new JavaClass(definition.pkg.fullName, definition.name + "Expansion", kind) : new JavaClass(outerClass, definition.name + "Expansion", kind);
352
+			cls = outerClass == null ? new JavaClass(context.getPackageName(definition.pkg), definition.name + "Expansion", kind) : new JavaClass(outerClass, definition.name + "Expansion", kind);
353
 			
353
 			
354
 			context.setJavaClass(definition, nativeClass.cls);
354
 			context.setJavaClass(definition, nativeClass.cls);
355
 			context.setJavaExpansionClass(definition, cls);
355
 			context.setJavaExpansionClass(definition, cls);

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

36
 import org.openzen.zenscript.javasource.scope.JavaSourceStatementScope;
36
 import org.openzen.zenscript.javasource.scope.JavaSourceStatementScope;
37
 import org.openzen.zenscript.javashared.JavaClass;
37
 import org.openzen.zenscript.javashared.JavaClass;
38
 import org.openzen.zenscript.javashared.JavaCompiledModule;
38
 import org.openzen.zenscript.javashared.JavaCompiledModule;
39
-import org.openzen.zenscript.javashared.JavaContext;
40
 import org.openzen.zenscript.javashared.JavaImplementation;
39
 import org.openzen.zenscript.javashared.JavaImplementation;
41
 
40
 
42
 /**
41
 /**
51
 	private final JavaSourceFormattingSettings settings;
50
 	private final JavaSourceFormattingSettings settings;
52
 	private final List<ExpansionDefinition> expansions;
51
 	private final List<ExpansionDefinition> expansions;
53
 	private final StringBuilder output;
52
 	private final StringBuilder output;
54
-	private final JavaContext context;
53
+	private final JavaSourceContext context;
55
 	private final JavaCompiledModule module;
54
 	private final JavaCompiledModule module;
56
 	private final SemanticModule semanticModule;
55
 	private final SemanticModule semanticModule;
57
 	
56
 	
58
 	public JavaDefinitionVisitor(
57
 	public JavaDefinitionVisitor(
59
 			String indent,
58
 			String indent,
60
 			JavaSourceCompiler compiler,
59
 			JavaSourceCompiler compiler,
60
+			JavaSourceContext context,
61
 			JavaCompiledModule module,
61
 			JavaCompiledModule module,
62
 			JavaClass cls,
62
 			JavaClass cls,
63
 			JavaSourceFile file,
63
 			JavaSourceFile file,
72
 		this.settings = compiler.settings;
72
 		this.settings = compiler.settings;
73
 		this.output = output;
73
 		this.output = output;
74
 		this.expansions = expansions;
74
 		this.expansions = expansions;
75
-		this.context = compiler.context;
75
+		this.context = context;
76
 		this.module = module;
76
 		this.module = module;
77
 		this.semanticModule = semanticModule;
77
 		this.semanticModule = semanticModule;
78
 	}
78
 	}
87
 				semanticModule.expansions,
87
 				semanticModule.expansions,
88
 				semanticModule.annotations,
88
 				semanticModule.annotations,
89
 				semanticModule.storageTypes);
89
 				semanticModule.storageTypes);
90
-		return new JavaSourceFileScope(file.importer, compiler.helperGenerator, cls, scope, definition instanceof InterfaceDefinition, thisType, compiler.context);
90
+		return new JavaSourceFileScope(file.importer, context, cls, scope, definition instanceof InterfaceDefinition, thisType);
91
 	}
91
 	}
92
 	
92
 	
93
 	private List<ImplementationMember> getMergedImplementations(HighLevelDefinition definition) {
93
 	private List<ImplementationMember> getMergedImplementations(HighLevelDefinition definition) {
403
 				member.accept(memberCompiler);
403
 				member.accept(memberCompiler);
404
 			memberCompiler.finish();
404
 			memberCompiler.finish();
405
 		} else {
405
 		} else {
406
-			JavaMemberCompiler memberCompiler = new JavaMemberCompiler(compiler, module, file, settings, indent + settings.indent, output, scope, scope.isInterface, definition, semanticModule);
406
+			JavaMemberCompiler memberCompiler = new JavaMemberCompiler(compiler, context, module, file, settings, indent + settings.indent, output, scope, scope.isInterface, definition, semanticModule);
407
 			for (IDefinitionMember member : definition.members)
407
 			for (IDefinitionMember member : definition.members)
408
 				member.accept(memberCompiler);
408
 				member.accept(memberCompiler);
409
 			
409
 			

+ 43
- 0
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaDirectoryOutput.java View File

1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.javasource;
7
+
8
+import java.io.BufferedWriter;
9
+import java.io.File;
10
+import java.io.FileOutputStream;
11
+import java.io.IOException;
12
+import java.io.OutputStreamWriter;
13
+import java.io.Writer;
14
+import java.nio.charset.StandardCharsets;
15
+
16
+/**
17
+ *
18
+ * @author Hoofdgebruiker
19
+ */
20
+public class JavaDirectoryOutput {
21
+	private final File directory;
22
+	
23
+	public JavaDirectoryOutput(File directory) {
24
+		this.directory = directory;
25
+		
26
+		if (!directory.exists())
27
+			directory.mkdirs();
28
+	}
29
+	
30
+	public void add(JavaSourceModule module) {
31
+		for (JavaSourceModule.SourceFile file : module.sourceFiles) {
32
+			File target = new File(directory, file.filename);
33
+			if (!target.getParentFile().exists())
34
+				target.getParentFile().mkdirs();
35
+			
36
+			try (Writer output = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(target), StandardCharsets.UTF_8))) {
37
+				output.write(file.content);
38
+			} catch (IOException ex) {
39
+				ex.printStackTrace();
40
+			}
41
+		}
42
+	}
43
+}

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

39
 import org.openzen.zenscript.javasource.scope.JavaSourceFileScope;
39
 import org.openzen.zenscript.javasource.scope.JavaSourceFileScope;
40
 import org.openzen.zenscript.javashared.JavaClass;
40
 import org.openzen.zenscript.javashared.JavaClass;
41
 import org.openzen.zenscript.javashared.JavaCompiledModule;
41
 import org.openzen.zenscript.javashared.JavaCompiledModule;
42
-import org.openzen.zenscript.javashared.JavaContext;
43
 import org.openzen.zenscript.javashared.JavaImplementation;
42
 import org.openzen.zenscript.javashared.JavaImplementation;
44
 import org.openzen.zenscript.javashared.JavaMethod;
43
 import org.openzen.zenscript.javashared.JavaMethod;
45
 
44
 
52
 	private final JavaSourceFile file;
51
 	private final JavaSourceFile file;
53
 	private final List<FieldMember> fields = new ArrayList<>();
52
 	private final List<FieldMember> fields = new ArrayList<>();
54
 	private final boolean isInterface;
53
 	private final boolean isInterface;
55
-	private final JavaContext context;
54
+	private final JavaSourceContext context;
56
 	public boolean hasDestructor = false;
55
 	public boolean hasDestructor = false;
57
 	private final JavaCompiledModule module;
56
 	private final JavaCompiledModule module;
58
 	private final SemanticModule semanticModule;
57
 	private final SemanticModule semanticModule;
59
 	
58
 	
60
 	public JavaMemberCompiler(
59
 	public JavaMemberCompiler(
61
 			JavaSourceCompiler compiler,
60
 			JavaSourceCompiler compiler,
61
+			JavaSourceContext context,
62
 			JavaCompiledModule module,
62
 			JavaCompiledModule module,
63
 			JavaSourceFile file,
63
 			JavaSourceFile file,
64
 			JavaSourceFormattingSettings settings,
64
 			JavaSourceFormattingSettings settings,
74
 		this.file = file;
74
 		this.file = file;
75
 		this.isInterface = isInterface;
75
 		this.isInterface = isInterface;
76
 		this.compiler = compiler;
76
 		this.compiler = compiler;
77
-		this.context = compiler.context;
77
+		this.context = context;
78
 		this.module = module;
78
 		this.module = module;
79
 		this.semanticModule = semanticModule;
79
 		this.semanticModule = semanticModule;
80
 	}
80
 	}
242
 			
242
 			
243
 			begin(ElementType.INNERCLASS);
243
 			begin(ElementType.INNERCLASS);
244
 			output.append("private class ").append(implementationName).append(" implements ").append(scope.type(member.type)).append(" {\n");
244
 			output.append("private class ").append(implementationName).append(" implements ").append(scope.type(member.type)).append(" {\n");
245
-			JavaMemberCompiler memberCompiler = new JavaMemberCompiler(compiler, module, file, settings, indent + settings.indent, output, scope, isInterface, definition, semanticModule);
245
+			JavaMemberCompiler memberCompiler = new JavaMemberCompiler(compiler, context, module, file, settings, indent + settings.indent, output, scope, isInterface, definition, semanticModule);
246
 			for (IDefinitionMember m : member.members) {
246
 			for (IDefinitionMember m : member.members) {
247
 				m.accept(memberCompiler);
247
 				m.accept(memberCompiler);
248
 			}
248
 			}
260
 		JavaDefinitionVisitor visitor = new JavaDefinitionVisitor(
260
 		JavaDefinitionVisitor visitor = new JavaDefinitionVisitor(
261
 				indent, 
261
 				indent, 
262
 				compiler,
262
 				compiler,
263
+				context,
263
 				module,
264
 				module,
264
 				cls,
265
 				cls,
265
 				file,
266
 				file,

+ 40
- 85
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceCompiler.java View File

5
  */
5
  */
6
 package org.openzen.zenscript.javasource;
6
 package org.openzen.zenscript.javasource;
7
 
7
 
8
-import java.io.File;
9
-import java.util.ArrayList;
10
 import java.util.HashMap;
8
 import java.util.HashMap;
11
-import java.util.List;
12
 import java.util.Map;
9
 import java.util.Map;
13
 import org.openzen.zencode.shared.SourceFile;
10
 import org.openzen.zencode.shared.SourceFile;
14
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
+import org.openzen.zenscript.codemodel.Module;
15
 import org.openzen.zenscript.codemodel.ScriptBlock;
13
 import org.openzen.zenscript.codemodel.ScriptBlock;
16
-import org.openzen.zenscript.codemodel.definition.ZSPackage;
17
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
14
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
18
 import org.openzen.zenscript.compiler.SemanticModule;
15
 import org.openzen.zenscript.compiler.SemanticModule;
19
-import org.openzen.zenscript.compiler.ZenCodeCompiler;
20
-import org.openzen.zenscript.compiler.ZenCodeCompilingModule;
21
-import org.openzen.zenscript.javashared.JavaBaseCompiler;
22
 import org.openzen.zenscript.javashared.prepare.JavaPrepareDefinitionVisitor;
16
 import org.openzen.zenscript.javashared.prepare.JavaPrepareDefinitionVisitor;
23
 import org.openzen.zenscript.javashared.JavaClass;
17
 import org.openzen.zenscript.javashared.JavaClass;
18
+import org.openzen.zenscript.javashared.JavaCompileSpace;
24
 
19
 
25
 /**
20
 /**
26
  *
21
  *
27
  * @author Hoofdgebruiker
22
  * @author Hoofdgebruiker
28
  */
23
  */
29
-public class JavaSourceCompiler extends JavaBaseCompiler implements ZenCodeCompiler {
24
+public class JavaSourceCompiler {
30
 	public final JavaSourceFormattingSettings settings;
25
 	public final JavaSourceFormattingSettings settings;
31
-	public final JavaSourceSyntheticHelperGenerator helperGenerator;
26
+	public final JavaSourceModule helpers;
32
 	
27
 	
33
-	private final File directory;
34
-	public final JavaSourceContext context;
35
-	private final List<SourceModule> modules = new ArrayList<>();
36
-	
37
-	public JavaSourceCompiler(File directory, GlobalTypeRegistry registry) {
38
-		if (!directory.exists())
39
-			directory.mkdirs();
40
-		
28
+	public JavaSourceCompiler(GlobalTypeRegistry registry) {
29
+		helpers = new JavaSourceModule(new Module("helpers"));
41
 		settings = new JavaSourceFormattingSettings.Builder().build();
30
 		settings = new JavaSourceFormattingSettings.Builder().build();
42
-		context = new JavaSourceContext(registry, directory, settings);
43
-		helperGenerator = new JavaSourceSyntheticHelperGenerator(context, directory, settings);
44
-		
45
-		this.directory = directory;
46
 	}
31
 	}
47
 	
32
 	
48
-	@Override
49
-	public ZenCodeCompilingModule addModule(SemanticModule module) {
50
-		context.addModule(module.module);
51
-		SourceModule result = new SourceModule(module);
52
-		modules.add(result);
33
+	public JavaSourceModule compile(SemanticModule module, JavaCompileSpace space, String basePackage) {
34
+		JavaSourceContext context = new JavaSourceContext(helpers, settings, space, module.modulePackage, basePackage);
35
+		
36
+		JavaSourceModule result = new JavaSourceModule(module.module);
37
+		context.addModule(module.module, result);
38
+		
39
+		Map<String, JavaSourceFile> sourceFiles = new HashMap<>();
40
+		for (HighLevelDefinition definition : module.definitions.getAll()) {
41
+			String name = getFilename(definition);
42
+			JavaPrepareDefinitionVisitor prepare = new JavaPrepareDefinitionVisitor(context, context.getJavaModule(module.module), name, null);
43
+			JavaClass cls = definition.accept(prepare);
44
+
45
+			String filename = cls.getName() + ".java";
46
+			System.out.println("Compiling " + definition.name + " as " + cls.fullName);
47
+			JavaSourceFile sourceFile = sourceFiles.get(filename);
48
+			if (sourceFile == null)
49
+				sourceFiles.put(filename, sourceFile = new JavaSourceFile(JavaSourceCompiler.this, context, cls, module, definition.pkg));
50
+
51
+			sourceFile.add(definition);
52
+		}
53
+		
54
+		for (ScriptBlock scriptBlock : module.scripts) {
55
+			// TODO
56
+		}
57
+		
58
+		for (JavaSourceFile sourceFile : sourceFiles.values()) {
59
+			sourceFile.prepare(context);
60
+		}
61
+
62
+		String baseDirectory = basePackage.replace('.', '/');
63
+		for (Map.Entry<String, JavaSourceFile> entry : sourceFiles.entrySet())
64
+			result.addFile(baseDirectory + "/" + entry.getKey(), entry.getValue().generate());
65
+		
66
+		context.helperGenerator.write(); // TODO: move this elsewhere
53
 		return result;
67
 		return result;
54
 	}
68
 	}
55
 	
69
 	
56
-	@Override
57
-	public void finish() {
58
-		helperGenerator.write();
59
-	}
60
-	
61
-	@Override
62
-	public void run() {
63
-		throw new UnsupportedOperationException("Cannot run this target");
64
-	}
65
-	
66
 	public String getFullName(HighLevelDefinition definition) {
70
 	public String getFullName(HighLevelDefinition definition) {
67
 		return definition.pkg.fullName + "." + definition.name;
71
 		return definition.pkg.fullName + "." + definition.name;
68
 	}
72
 	}
69
 	
73
 	
70
-	private File getDirectory(ZSPackage pkg) {
71
-		if (pkg == null)
72
-			return directory;
73
-		
74
-		File base = getDirectory(pkg.parent);
75
-		return new File(base, pkg.name.replace('.', '/'));
76
-	}
77
-	
78
 	private String getFilename(HighLevelDefinition definition) {
74
 	private String getFilename(HighLevelDefinition definition) {
79
 		SourceFile source = definition.getTag(SourceFile.class);
75
 		SourceFile source = definition.getTag(SourceFile.class);
80
 		if (source != null) {
76
 		if (source != null) {
86
 			return definition.name == null ? "Expansion" : definition.name;
82
 			return definition.name == null ? "Expansion" : definition.name;
87
 		}
83
 		}
88
 	}
84
 	}
89
-	
90
-	private class SourceModule implements ZenCodeCompilingModule {
91
-		private final Map<File, JavaSourceFile> sourceFiles = new HashMap<>();
92
-		private final SemanticModule module;
93
-		
94
-		public SourceModule(SemanticModule module) {
95
-			this.module = module;
96
-		}
97
-
98
-		@Override
99
-		public void addDefinition(HighLevelDefinition definition) {
100
-			String filename = getFilename(definition);
101
-			JavaPrepareDefinitionVisitor prepare = new JavaPrepareDefinitionVisitor(context, context.getJavaModule(module.module), filename, null);
102
-			JavaClass cls = definition.accept(prepare);
103
-
104
-			File file = new File(getDirectory(definition.pkg), cls.getName() + ".java");
105
-			System.out.println("Compiling " + definition.name + " as " + cls.fullName);
106
-			JavaSourceFile sourceFile = sourceFiles.get(file);
107
-			if (sourceFile == null)
108
-				sourceFiles.put(file, sourceFile = new JavaSourceFile(JavaSourceCompiler.this, file, cls, module, definition.pkg));
109
-
110
-			sourceFile.add(definition);
111
-		}
112
-
113
-		@Override
114
-		public void addScriptBlock(ScriptBlock script) {
115
-			// TODO: implement this too
116
-		}
117
-
118
-		@Override
119
-		public void finish() {
120
-			for (JavaSourceFile sourceFile : sourceFiles.values()) {
121
-				sourceFile.prepare(context);
122
-			}
123
-
124
-			for (JavaSourceFile sourceFile : sourceFiles.values())
125
-				sourceFile.write();
126
-
127
-		}
128
-		
129
-	}
130
 }
85
 }

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

5
  */
5
  */
6
 package org.openzen.zenscript.javasource;
6
 package org.openzen.zenscript.javasource;
7
 
7
 
8
-import java.io.File;
9
-import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
8
+import org.openzen.zenscript.codemodel.definition.ZSPackage;
10
 import org.openzen.zenscript.codemodel.type.StoredType;
9
 import org.openzen.zenscript.codemodel.type.StoredType;
11
 import org.openzen.zenscript.codemodel.type.TypeID;
10
 import org.openzen.zenscript.codemodel.type.TypeID;
11
+import org.openzen.zenscript.javashared.JavaCompileSpace;
12
 import org.openzen.zenscript.javashared.JavaContext;
12
 import org.openzen.zenscript.javashared.JavaContext;
13
 import org.openzen.zenscript.javashared.JavaSyntheticClassGenerator;
13
 import org.openzen.zenscript.javashared.JavaSyntheticClassGenerator;
14
 import org.openzen.zenscript.javashared.JavaTypeDescriptorVisitor;
14
 import org.openzen.zenscript.javashared.JavaTypeDescriptorVisitor;
20
 public class JavaSourceContext extends JavaContext {
20
 public class JavaSourceContext extends JavaContext {
21
 	private final JavaTypeDescriptorVisitor typeDescriptorVisitor;
21
 	private final JavaTypeDescriptorVisitor typeDescriptorVisitor;
22
 	private final JavaSyntheticClassGenerator generator;
22
 	private final JavaSyntheticClassGenerator generator;
23
+	public final JavaSourceSyntheticHelperGenerator helperGenerator;
23
 	
24
 	
24
-	public JavaSourceContext(GlobalTypeRegistry registry, File directory, JavaSourceFormattingSettings settings) {
25
-		super(registry);
25
+	public JavaSourceContext(JavaSourceModule helpers, JavaSourceFormattingSettings settings, JavaCompileSpace space, ZSPackage modulePackage, String basePackage) {
26
+		super(space, modulePackage, basePackage);
26
 		
27
 		
27
 		typeDescriptorVisitor = new JavaTypeDescriptorVisitor(this);
28
 		typeDescriptorVisitor = new JavaTypeDescriptorVisitor(this);
28
-		this.generator = new JavaSourceSyntheticTypeGenerator(directory, settings, this);
29
+		this.generator = new JavaSourceSyntheticTypeGenerator(helpers, settings, this);
30
+		helperGenerator = new JavaSourceSyntheticHelperGenerator(helpers, this, settings);
29
 	}
31
 	}
30
 	
32
 	
31
 	@Override
33
 	@Override

+ 24
- 41
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceFile.java View File

7
 package org.openzen.zenscript.javasource;
7
 package org.openzen.zenscript.javasource;
8
 
8
 
9
 import org.openzen.zenscript.javashared.JavaContext;
9
 import org.openzen.zenscript.javashared.JavaContext;
10
-import java.io.BufferedOutputStream;
11
-import java.io.File;
12
-import java.io.FileOutputStream;
13
-import java.io.IOException;
14
-import java.io.OutputStreamWriter;
15
-import java.io.Writer;
16
-import java.nio.charset.StandardCharsets;
17
 import java.util.ArrayList;
10
 import java.util.ArrayList;
18
 import java.util.List;
11
 import java.util.List;
19
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
31
 public class JavaSourceFile {
24
 public class JavaSourceFile {
32
 	public final JavaSourceImporter importer;
25
 	public final JavaSourceImporter importer;
33
 	private final JavaSourceCompiler compiler;
26
 	private final JavaSourceCompiler compiler;
34
-	private final File file;
27
+	private final JavaSourceContext context;
35
 	private final JavaClass cls;
28
 	private final JavaClass cls;
36
 	private final StringBuilder contents = new StringBuilder();
29
 	private final StringBuilder contents = new StringBuilder();
37
 	private final ZSPackage pkg;
30
 	private final ZSPackage pkg;
40
 	private HighLevelDefinition mainDefinition;
33
 	private HighLevelDefinition mainDefinition;
41
 	private final List<ExpansionDefinition> expansions = new ArrayList<>();
34
 	private final List<ExpansionDefinition> expansions = new ArrayList<>();
42
 	
35
 	
43
-	public JavaSourceFile(JavaSourceCompiler compiler, File file, JavaClass cls, SemanticModule module, ZSPackage pkg) {
36
+	public JavaSourceFile(JavaSourceCompiler compiler, JavaSourceContext context, JavaClass cls, SemanticModule module, ZSPackage pkg) {
44
 		this.compiler = compiler;
37
 		this.compiler = compiler;
38
+		this.context = context;
45
 		this.pkg = pkg;
39
 		this.pkg = pkg;
46
 		this.cls = cls;
40
 		this.cls = cls;
47
 		this.module = module;
41
 		this.module = module;
48
-		this.file = file;
49
 		
42
 		
50
-		importer = new JavaSourceImporter(compiler.context, cls);
43
+		importer = new JavaSourceImporter(context, cls);
51
 	}
44
 	}
52
 	
45
 	
53
 	public String getName() {
46
 	public String getName() {
58
 		if (definition instanceof ExpansionDefinition) {
51
 		if (definition instanceof ExpansionDefinition) {
59
 			expansions.add((ExpansionDefinition)definition);
52
 			expansions.add((ExpansionDefinition)definition);
60
 		} else if (mainDefinition != null) {
53
 		} else if (mainDefinition != null) {
61
-			throw new IllegalStateException("Multiple main definitions in " + file + "!");
54
+			throw new IllegalStateException("Multiple main definitions in " + cls.internalName + "!");
62
 		} else {
55
 		} else {
63
 			mainDefinition = definition;
56
 			mainDefinition = definition;
64
 		}
57
 		}
75
 	}
68
 	}
76
 	
69
 	
77
 	private boolean isEmpty(HighLevelDefinition definition) {
70
 	private boolean isEmpty(HighLevelDefinition definition) {
78
-		JavaClass cls = compiler.context.getJavaClass(definition);
71
+		JavaClass cls = context.getJavaClass(definition);
79
 		if (!cls.empty)
72
 		if (!cls.empty)
80
 			return false;
73
 			return false;
81
 		
74
 		
85
 		return true;
78
 		return true;
86
 	}
79
 	}
87
 	
80
 	
88
-	public void write() {
89
-		System.out.println("Calling write on " + file.getName());
90
-		
81
+	public String generate() {
91
 		if (mainDefinition == null || isEmpty(mainDefinition)) {
82
 		if (mainDefinition == null || isEmpty(mainDefinition)) {
92
 			if (expansions.isEmpty())
83
 			if (expansions.isEmpty())
93
-				return;
84
+				return null;
94
 			
85
 			
95
 			mainDefinition = expansions.remove(0);
86
 			mainDefinition = expansions.remove(0);
96
 		}
87
 		}
99
 		JavaDefinitionVisitor visitor = new JavaDefinitionVisitor(
90
 		JavaDefinitionVisitor visitor = new JavaDefinitionVisitor(
100
 				"",
91
 				"",
101
 				compiler,
92
 				compiler,
102
-				compiler.context.getJavaModule(module.module),
93
+				context,
94
+				context.getJavaModule(module.module),
103
 				cls,
95
 				cls,
104
 				this,
96
 				this,
105
 				contents,
97
 				contents,
107
 				module);
99
 				module);
108
 		definition.accept(visitor);
100
 		definition.accept(visitor);
109
 		
101
 		
110
-		if (!file.getParentFile().exists())
111
-			file.getParentFile().mkdirs();
112
-		
113
-		try (Writer writer = new OutputStreamWriter(new BufferedOutputStream(new FileOutputStream(file, false)), StandardCharsets.UTF_8)) {
114
-			writer.write("package ");
115
-			writer.write(pkg.fullName);
116
-			writer.write(";\n\n");
102
+		StringBuilder result = new StringBuilder();
103
+		result.append("package ").append(pkg.fullName).append(";\n\n");
117
 			
104
 			
118
-			boolean hasImports = false;
119
-			for (JavaClass import_ : importer.getUsedImports()) {
120
-				if (import_.pkg.equals("java.lang"))
121
-					continue;
122
-
123
-				writer.write("import ");
124
-				writer.write(import_.fullName);
125
-				writer.write(";\n");
126
-				hasImports = true;
127
-			}
128
-
129
-			if (hasImports)
130
-				writer.write("\n");
105
+		boolean hasImports = false;
106
+		for (JavaClass import_ : importer.getUsedImports()) {
107
+			if (import_.pkg.equals("java.lang"))
108
+				continue;
131
 			
109
 			
132
-			writer.write(contents.toString());
133
-		} catch (IOException ex) {
134
-			ex.printStackTrace();
110
+			result.append("import ").append(import_.fullName).append(";\n");
111
+			hasImports = true;
135
 		}
112
 		}
113
+		
114
+		if (hasImports)
115
+			result.append("\n");
116
+		
117
+		result.append(contents.toString());
118
+		return result.toString();
136
 	}
119
 	}
137
 }
120
 }

+ 40
- 0
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceModule.java View File

1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.javasource;
7
+
8
+import java.util.ArrayList;
9
+import java.util.List;
10
+import org.openzen.zenscript.codemodel.Module;
11
+import org.openzen.zenscript.javashared.JavaCompiledModule;
12
+
13
+/**
14
+ *
15
+ * @author Hoofdgebruiker
16
+ */
17
+public class JavaSourceModule extends JavaCompiledModule {
18
+	public final List<SourceFile> sourceFiles = new ArrayList<>();
19
+	
20
+	public JavaSourceModule(Module module) {
21
+		super(module);
22
+	}
23
+	
24
+	public void addFile(String filename, String content) {
25
+		if (content == null)
26
+			return;
27
+		
28
+		sourceFiles.add(new SourceFile(filename, content));
29
+	}
30
+	
31
+	public static class SourceFile {
32
+		public final String filename;
33
+		public final String content;
34
+		
35
+		public SourceFile(String filename, String content) {
36
+			this.filename = filename;
37
+			this.content = content;
38
+		}
39
+	}
40
+}

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

5
  */
5
  */
6
 package org.openzen.zenscript.javasource;
6
 package org.openzen.zenscript.javasource;
7
 
7
 
8
-import java.io.BufferedWriter;
9
-import java.io.File;
10
-import java.io.FileOutputStream;
11
-import java.io.IOException;
12
-import java.io.OutputStreamWriter;
13
-import java.io.Writer;
14
-import java.nio.charset.StandardCharsets;
15
 import java.util.ArrayList;
8
 import java.util.ArrayList;
16
 import java.util.HashMap;
9
 import java.util.HashMap;
17
 import java.util.List;
10
 import java.util.List;
38
  */
31
  */
39
 public class JavaSourceSyntheticHelperGenerator {
32
 public class JavaSourceSyntheticHelperGenerator {
40
 	private final JavaContext context;
33
 	private final JavaContext context;
41
-	private final File directory;
42
 	private final JavaSourceFormattingSettings settings;
34
 	private final JavaSourceFormattingSettings settings;
43
 	private final Map<String, List<String>> members = new HashMap<>();
35
 	private final Map<String, List<String>> members = new HashMap<>();
44
 	private final JavaClass arrayHelpers = new JavaClass("zsynthetic", "ArrayHelpers", JavaClass.Kind.CLASS);
36
 	private final JavaClass arrayHelpers = new JavaClass("zsynthetic", "ArrayHelpers", JavaClass.Kind.CLASS);
45
 	private final Map<ArrayKind, JavaMethod> existingContains = new HashMap<>();
37
 	private final Map<ArrayKind, JavaMethod> existingContains = new HashMap<>();
46
 	private final Map<ArrayKind, JavaMethod> existingIndexOf = new HashMap<>();
38
 	private final Map<ArrayKind, JavaMethod> existingIndexOf = new HashMap<>();
39
+	private final JavaSourceModule helpers;
47
 	
40
 	
48
-	public JavaSourceSyntheticHelperGenerator(JavaContext context, File directory, JavaSourceFormattingSettings settings) {
41
+	public JavaSourceSyntheticHelperGenerator(JavaSourceModule helpers, JavaContext context, JavaSourceFormattingSettings settings) {
42
+		this.helpers = helpers;
49
 		this.context = context;
43
 		this.context = context;
50
-		this.directory = new File(directory, "zsynthetic");
51
 		this.settings = settings;
44
 		this.settings = settings;
52
 	}
45
 	}
53
 	
46
 	
111
 			}
104
 			}
112
 			contents.append("}\n");
105
 			contents.append("}\n");
113
 			
106
 			
114
-			File target = new File(directory, filename + ".java");
115
-			
116
-			try (Writer output = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(target), StandardCharsets.UTF_8))) {
117
-				output.write(contents.toString());
118
-			} catch (IOException ex) {
119
-				ex.printStackTrace();
120
-			}
107
+			String target = "zsynthetic/" + filename + ".java";
108
+			helpers.addFile(target, contents.toString());
121
 		}
109
 		}
122
 	}
110
 	}
123
 	
111
 	

+ 22
- 33
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceSyntheticTypeGenerator.java View File

5
  */
5
  */
6
 package org.openzen.zenscript.javasource;
6
 package org.openzen.zenscript.javasource;
7
 
7
 
8
-import java.io.BufferedOutputStream;
9
-import java.io.File;
10
-import java.io.FileOutputStream;
11
-import java.io.IOException;
12
-import java.io.OutputStreamWriter;
13
-import java.io.Writer;
14
-import java.nio.charset.StandardCharsets;
15
 import org.openzen.zenscript.codemodel.FunctionParameter;
8
 import org.openzen.zenscript.codemodel.FunctionParameter;
16
 import org.openzen.zenscript.javashared.JavaClass;
9
 import org.openzen.zenscript.javashared.JavaClass;
17
 import org.openzen.zenscript.javashared.JavaSynthesizedFunction;
10
 import org.openzen.zenscript.javashared.JavaSynthesizedFunction;
23
  * @author Hoofdgebruiker
16
  * @author Hoofdgebruiker
24
  */
17
  */
25
 public class JavaSourceSyntheticTypeGenerator implements JavaSyntheticClassGenerator {
18
 public class JavaSourceSyntheticTypeGenerator implements JavaSyntheticClassGenerator {
26
-	private final File directory;
19
+	private final JavaSourceModule helpers;
27
 	private final JavaSourceFormattingSettings settings;
20
 	private final JavaSourceFormattingSettings settings;
28
 	private final JavaSourceContext context;
21
 	private final JavaSourceContext context;
29
 	
22
 	
30
-	public JavaSourceSyntheticTypeGenerator(File directory, JavaSourceFormattingSettings settings, JavaSourceContext context) {
31
-		this.directory = new File(directory, "zsynthetic");
23
+	public JavaSourceSyntheticTypeGenerator(JavaSourceModule helpers, JavaSourceFormattingSettings settings, JavaSourceContext context) {
24
+		this.helpers = helpers;
32
 		this.settings = settings;
25
 		this.settings = settings;
33
 		this.context = context;
26
 		this.context = context;
34
 	}
27
 	}
133
 	}
126
 	}
134
 	
127
 	
135
 	private void writeFile(JavaClass cls, JavaSourceImporter importer, StringBuilder contents) {
128
 	private void writeFile(JavaClass cls, JavaSourceImporter importer, StringBuilder contents) {
136
-		if (!directory.exists())
137
-			directory.mkdirs();
138
-		
139
-		File file = new File(directory, cls.getName() + ".java");
140
-		try (Writer writer = new OutputStreamWriter(new BufferedOutputStream(new FileOutputStream(file)), StandardCharsets.UTF_8)) {
141
-			writer.write("package zsynthetic;\n");
142
-			
143
-			JavaClass[] imports = importer.getUsedImports();
144
-			if (imports.length > 0) {
145
-				for (JavaClass import_ : imports) {
146
-					if (import_.pkg.equals("java.lang"))
147
-						continue;
148
-					
149
-					writer.write("import ");
150
-					writer.write(import_.fullName);
151
-					writer.write(";\n");
152
-				}
129
+		StringBuilder output = new StringBuilder();
130
+		output.append("package zsynthetic;\n");
131
+
132
+		JavaClass[] imports = importer.getUsedImports();
133
+		if (imports.length > 0) {
134
+			for (JavaClass import_ : imports) {
135
+				if (import_.pkg.equals("java.lang"))
136
+					continue;
153
 
137
 
154
-				writer.write("\n");
138
+				output.append("import ");
139
+				output.append(import_.fullName);
140
+				output.append(";\n");
155
 			}
141
 			}
156
-			
157
-			writer.write('\n');
158
-			writer.write(contents.toString());
159
-		} catch (IOException ex) {
160
-			ex.printStackTrace();
142
+
143
+			output.append("\n");
161
 		}
144
 		}
145
+
146
+		output.append('\n');
147
+		output.append(contents.toString());
148
+		
149
+		String target = "zsynthetic/" + cls.getName() + ".java";
150
+		helpers.addFile(target, output.toString());
162
 	}
151
 	}
163
 }
152
 }

+ 0
- 53
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceTarget.java View File

1
-/*
2
- * To change this license header, choose License Headers in Project Properties.
3
- * To change this template file, choose Tools | Templates
4
- * and open the template in the editor.
5
- */
6
-package org.openzen.zenscript.javasource;
7
-
8
-import java.io.File;
9
-import org.json.JSONObject;
10
-import org.openzen.zenscript.compiler.SemanticModule;
11
-import org.openzen.zenscript.compiler.Target;
12
-import org.openzen.zenscript.compiler.ZenCodeCompiler;
13
-
14
-/**
15
- *
16
- * @author Hoofdgebruiker
17
- */
18
-public class JavaSourceTarget implements Target {
19
-	private final String module;
20
-	private final String name;
21
-	private final File output;
22
-	
23
-	public JavaSourceTarget(File projectDir, JSONObject definition) {
24
-		module = definition.getString("module");
25
-		name = definition.optString("name", "Java Source: " + module);
26
-		output = new File(projectDir, definition.getString("output"));
27
-	}
28
-
29
-	@Override
30
-	public ZenCodeCompiler createCompiler(SemanticModule module) {
31
-		return new JavaSourceCompiler(output, module.registry);
32
-	}
33
-
34
-	@Override
35
-	public String getModule() {
36
-		return module;
37
-	}
38
-
39
-	@Override
40
-	public String getName() {
41
-		return name;
42
-	}
43
-
44
-	@Override
45
-	public boolean canRun() {
46
-		return false;
47
-	}
48
-
49
-	@Override
50
-	public boolean canBuild() {
51
-		return true;
52
-	}
53
-}

+ 0
- 26
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceTargetType.java View File

1
-/*
2
- * To change this license header, choose License Headers in Project Properties.
3
- * To change this template file, choose Tools | Templates
4
- * and open the template in the editor.
5
- */
6
-package org.openzen.zenscript.javasource;
7
-
8
-import java.io.File;
9
-import org.json.JSONObject;
10
-import org.openzen.zenscript.compiler.Target;
11
-import org.openzen.zenscript.compiler.TargetType;
12
-
13
-/**
14
- *
15
- * @author Hoofdgebruiker
16
- */
17
-public class JavaSourceTargetType implements TargetType {
18
-	public static final JavaSourceTargetType INSTANCE = new JavaSourceTargetType();
19
-	
20
-	private JavaSourceTargetType() {}
21
-
22
-	@Override
23
-	public Target create(File projectDir, JSONObject definition) {
24
-		return new JavaSourceTarget(projectDir, definition);
25
-	}
26
-}

+ 4
- 5
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/scope/JavaSourceFileScope.java View File

31
 	public final JavaSourceContext context;
31
 	public final JavaSourceContext context;
32
 	
32
 	
33
 	public JavaSourceFileScope(
33
 	public JavaSourceFileScope(
34
-			JavaSourceImporter importer, 
35
-			JavaSourceSyntheticHelperGenerator helperGenerator,
34
+			JavaSourceImporter importer,
35
+			JavaSourceContext context,
36
 			JavaClass cls,
36
 			JavaClass cls,
37
 			TypeScope semanticScope,
37
 			TypeScope semanticScope,
38
 			boolean isInterface,
38
 			boolean isInterface,
39
-			TypeID thisType,
40
-			JavaSourceContext context)
39
+			TypeID thisType)
41
 	{
40
 	{
42
 		this.importer = importer;
41
 		this.importer = importer;
43
-		this.helperGenerator = helperGenerator;
42
+		this.helperGenerator = context.helperGenerator;
44
 		this.cls = cls;
43
 		this.cls = cls;
45
 		this.semanticScope = semanticScope;
44
 		this.semanticScope = semanticScope;
46
 		this.isInterface = isInterface;
45
 		this.isInterface = isInterface;

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

74
 
74
 
75
 	@Override
75
 	@Override
76
 	public void compile(BaseScope scope) {
76
 	public void compile(BaseScope scope) {
77
-		FunctionScope innerScope = new FunctionScope(scope, compiled.header);
77
+		FunctionScope innerScope = new FunctionScope(position, scope, compiled.header);
78
 		compiled.setCode(body.compile(innerScope, compiled.header));
78
 		compiled.setCode(body.compile(innerScope, compiled.header));
79
 		
79
 		
80
 		if (compiled.header.getReturnType().isBasic(BasicTypeID.UNDETERMINED))
80
 		if (compiled.header.getReturnType().isBasic(BasicTypeID.UNDETERMINED))

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

36
 	public IPartialExpression compile(ExpressionScope scope) throws CompileException {
36
 	public IPartialExpression compile(ExpressionScope scope) throws CompileException {
37
 		Expression cLeft = left.compile(scope).eval();
37
 		Expression cLeft = left.compile(scope).eval();
38
 		TypeMemberGroup members = scope.getTypeMembers(cLeft.type).getOrCreateGroup(this.operator);
38
 		TypeMemberGroup members = scope.getTypeMembers(cLeft.type).getOrCreateGroup(this.operator);
39
-		ExpressionScope innerScope = scope.withHints(members.predictCallTypes(scope, scope.getResultTypeHints(), 1)[0]);
39
+		ExpressionScope innerScope = scope.withHints(members.predictCallTypes(position, scope, scope.getResultTypeHints(), 1)[0]);
40
 		
40
 		
41
 		Expression cRight = right.compile(innerScope).eval();
41
 		Expression cRight = right.compile(innerScope).eval();
42
 		CallArguments arguments = new CallArguments(cRight);
42
 		CallArguments arguments = new CallArguments(cRight);

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

93
 		}
93
 		}
94
 		
94
 		
95
 		StoredType functionType = scope.getTypeRegistry()
95
 		StoredType functionType = scope.getTypeRegistry()
96
-				.getFunction(genericHeader.withGenericArguments(new GenericMapper(scope.getTypeRegistry(), scope.genericInferenceMap)))
96
+				.getFunction(genericHeader.withGenericArguments(new GenericMapper(position, scope.getTypeRegistry(), scope.genericInferenceMap)))
97
 				.stored(storage);
97
 				.stored(storage);
98
 		return new FunctionExpression(position, functionType, closure, header, statements);
98
 		return new FunctionExpression(position, functionType, closure, header, statements);
99
 	}
99
 	}

+ 5
- 5
Parser/src/main/java/org/openzen/zenscript/parser/expression/ParsedExpressionIndex.java View File

57
 		@Override
57
 		@Override
58
 		public Expression eval() throws CompileException {
58
 		public Expression eval() throws CompileException {
59
 			TypeMemberGroup members = scope.getTypeMembers(target.type).getOrCreateGroup(OperatorType.INDEXGET);
59
 			TypeMemberGroup members = scope.getTypeMembers(target.type).getOrCreateGroup(OperatorType.INDEXGET);
60
-			List<StoredType>[] predictedTypes = members.predictCallTypes(scope, scope.hints, indexes.size());
60
+			List<StoredType>[] predictedTypes = members.predictCallTypes(position, scope, scope.hints, indexes.size());
61
 			Expression[] arguments = new Expression[indexes.size()];
61
 			Expression[] arguments = new Expression[indexes.size()];
62
 			for (int i = 0; i < arguments.length; i++)
62
 			for (int i = 0; i < arguments.length; i++)
63
 				arguments[i] = indexes.get(i).compile(scope.createInner(predictedTypes[i], this::getLength)).eval();
63
 				arguments[i] = indexes.get(i).compile(scope.createInner(predictedTypes[i], this::getLength)).eval();
66
 		}
66
 		}
67
 
67
 
68
 		@Override
68
 		@Override
69
-		public List<StoredType>[] predictCallTypes(TypeScope scope, List<StoredType> hints, int arguments) throws CompileException {
70
-			return eval().predictCallTypes(scope, hints, arguments);
69
+		public List<StoredType>[] predictCallTypes(CodePosition position, TypeScope scope, List<StoredType> hints, int arguments) throws CompileException {
70
+			return eval().predictCallTypes(position, scope, hints, arguments);
71
 		}
71
 		}
72
 		
72
 		
73
 		@Override
73
 		@Override
88
 		@Override
88
 		@Override
89
 		public Expression assign(CodePosition position, TypeScope scope, Expression value) throws CompileException {
89
 		public Expression assign(CodePosition position, TypeScope scope, Expression value) throws CompileException {
90
 			TypeMemberGroup members = scope.getTypeMembers(target.type).getOrCreateGroup(OperatorType.INDEXSET);
90
 			TypeMemberGroup members = scope.getTypeMembers(target.type).getOrCreateGroup(OperatorType.INDEXSET);
91
-			List<StoredType>[] predictedTypes = members.predictCallTypes(scope, this.scope.hints, indexes.size() + 1);
91
+			List<StoredType>[] predictedTypes = members.predictCallTypes(position, scope, this.scope.hints, indexes.size() + 1);
92
 			
92
 			
93
 			Expression[] arguments = new Expression[indexes.size() + 1];
93
 			Expression[] arguments = new Expression[indexes.size() + 1];
94
 			for (int i = 0; i < arguments.length - 1; i++)
94
 			for (int i = 0; i < arguments.length - 1; i++)
101
 		@Override
101
 		@Override
102
 		public List<StoredType> getAssignHints() {
102
 		public List<StoredType> getAssignHints() {
103
 			TypeMemberGroup members = scope.getTypeMembers(target.type).getOrCreateGroup(OperatorType.INDEXSET);
103
 			TypeMemberGroup members = scope.getTypeMembers(target.type).getOrCreateGroup(OperatorType.INDEXSET);
104
-			List<StoredType>[] predictedTypes = members.predictCallTypes(scope, scope.hints, indexes.size() + 1);
104
+			List<StoredType>[] predictedTypes = members.predictCallTypes(position, scope, scope.hints, indexes.size() + 1);
105
 			return predictedTypes[indexes.size()];
105
 			return predictedTypes[indexes.size()];
106
 		}
106
 		}
107
 		
107
 		

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

40
 		TypeMemberGroup members = typeMembers.getOrCreateGroup(operator);
40
 		TypeMemberGroup members = typeMembers.getOrCreateGroup(operator);
41
 		if (members.getMethodMembers().isEmpty()) {
41
 		if (members.getMethodMembers().isEmpty()) {
42
 			members = typeMembers.getOrCreateGroup(operator.assignOperatorFor);
42
 			members = typeMembers.getOrCreateGroup(operator.assignOperatorFor);
43
-			Expression cRight = right.compile(scope.withHints(members.predictCallTypes(scope, scope.hints, 1)[0])).eval();
43
+			Expression cRight = right.compile(scope.withHints(members.predictCallTypes(position, scope, scope.hints, 1)[0])).eval();
44
 			Expression value = members.call(position, scope, cLeft, new CallArguments(cRight), false);
44
 			Expression value = members.call(position, scope, cLeft, new CallArguments(cRight), false);
45
 			return cLeft.assign(position, scope, value);
45
 			return cLeft.assign(position, scope, value);
46
 		} else {
46
 		} else {
47
-			Expression cRight = right.compile(scope.withHints(members.predictCallTypes(scope, scope.hints, 1)[0])).eval();
47
+			Expression cRight = right.compile(scope.withHints(members.predictCallTypes(position, scope, scope.hints, 1)[0])).eval();
48
 			return members.call(position, scope, cLeft, new CallArguments(cRight), false);
48
 			return members.call(position, scope, cLeft, new CallArguments(cRight), false);
49
 		}
49
 		}
50
 	}
50
 	}

+ 2
- 4
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.codemodel.type.member.TypeMembers;
25
 import org.openzen.zenscript.parser.type.IParsedType;
23
 import org.openzen.zenscript.parser.type.IParsedType;
26
 
24
 
59
 					System.out.println("X");
57
 					System.out.println("X");
60
 			}*/
58
 			}*/
61
 
59
 
62
-			List<StoredType>[] predictedTypes = constructors.predictCallTypes(scope, scope.hints, arguments.arguments.size());
60
+			List<StoredType>[] predictedTypes = constructors.predictCallTypes(position, scope, scope.hints, arguments.arguments.size());
63
 			CallArguments compiledArguments = arguments.compileCall(position, scope, null, constructors);
61
 			CallArguments compiledArguments = arguments.compileCall(position, scope, null, constructors);
64
 			FunctionalMemberRef member = constructors.selectMethod(position, scope, compiledArguments, true, true);
62
 			FunctionalMemberRef member = constructors.selectMethod(position, scope, compiledArguments, true, true);
65
 			if (member == null)
63
 			if (member == null)
72
 					type,
70
 					type,
73
 					member,
71
 					member,
74
 					compiledArguments,
72
 					compiledArguments,
75
-					member.getHeader().fillGenericArguments(scope, compiledArguments.typeArguments));
73
+					member.getHeader().fillGenericArguments(position, scope, compiledArguments.typeArguments));
76
 		} catch (CompileException ex) {
74
 		} catch (CompileException ex) {
77
 			return new InvalidExpression(type, ex);
75
 			return new InvalidExpression(type, ex);
78
 		}
76
 		}

+ 1
- 1
Parser/src/main/java/org/openzen/zenscript/parser/member/ParsedFunctionalMember.java View File

71
 		
71
 		
72
 		inferHeaders(scope);
72
 		inferHeaders(scope);
73
 		
73
 		
74
-		FunctionScope innerScope = new FunctionScope(scope, getCompiled().header);
74
+		FunctionScope innerScope = new FunctionScope(position, scope, getCompiled().header);
75
 		getCompiled().annotations = ParsedAnnotation.compileForMember(annotations, getCompiled(), scope);
75
 		getCompiled().annotations = ParsedAnnotation.compileForMember(annotations, getCompiled(), scope);
76
 		getCompiled().setBody(body.compile(innerScope, getCompiled().header));
76
 		getCompiled().setBody(body.compile(innerScope, getCompiled().header));
77
 		
77
 		

+ 1
- 1
Parser/src/main/java/org/openzen/zenscript/parser/member/ParsedGetter.java View File

99
 		inferHeaders(scope);
99
 		inferHeaders(scope);
100
 		
100
 		
101
 		FunctionHeader header = new FunctionHeader(compiled.getType());
101
 		FunctionHeader header = new FunctionHeader(compiled.getType());
102
-		FunctionScope innerScope = new FunctionScope(scope, header);
102
+		FunctionScope innerScope = new FunctionScope(position, scope, header);
103
 		compiled.annotations = ParsedAnnotation.compileForMember(annotations, getCompiled(), scope);
103
 		compiled.annotations = ParsedAnnotation.compileForMember(annotations, getCompiled(), scope);
104
 		compiled.setBody(body.compile(innerScope, header));
104
 		compiled.setBody(body.compile(innerScope, header));
105
 	}
105
 	}

+ 1
- 1
Parser/src/main/java/org/openzen/zenscript/parser/member/ParsedIterator.java View File

64
 	@Override
64
 	@Override
65
 	public void compile(BaseScope scope) {
65
 	public void compile(BaseScope scope) {
66
 		FunctionHeader header = new FunctionHeader(scope.getTypeRegistry().getIterator(compiled.getLoopVariableTypes()).stored(UniqueStorageTag.INSTANCE));
66
 		FunctionHeader header = new FunctionHeader(scope.getTypeRegistry().getIterator(compiled.getLoopVariableTypes()).stored(UniqueStorageTag.INSTANCE));
67
-		StatementScope innerScope = new FunctionScope(scope, header);
67
+		StatementScope innerScope = new FunctionScope(position, scope, header);
68
 		compiled.annotations = ParsedAnnotation.compileForMember(annotations, compiled, scope);
68
 		compiled.annotations = ParsedAnnotation.compileForMember(annotations, compiled, scope);
69
 		compiled.setContent(body.compile(innerScope, header));
69
 		compiled.setContent(body.compile(innerScope, header));
70
 	}
70
 	}

+ 1
- 0
Parser/src/main/java/org/openzen/zenscript/parser/member/ParsedSetter.java View File

97
 		
97
 		
98
 		FunctionHeader header = new FunctionHeader(compiled.getType());
98
 		FunctionHeader header = new FunctionHeader(compiled.getType());
99
 		FunctionScope innerScope = new FunctionScope(
99
 		FunctionScope innerScope = new FunctionScope(
100
+				position,
100
 				scope,
101
 				scope,
101
 				header,
102
 				header,
102
 				position -> new GetFunctionParameterExpression(position, compiled.parameter));
103
 				position -> new GetFunctionParameterExpression(position, compiled.parameter));

+ 1
- 1
Parser/src/main/java/org/openzen/zenscript/parser/member/ParsedStaticInitializer.java View File

45
 	@Override
45
 	@Override
46
 	public void compile(BaseScope scope) {
46
 	public void compile(BaseScope scope) {
47
 		compiled.annotations = ParsedAnnotation.compileForMember(annotations, compiled, scope);
47
 		compiled.annotations = ParsedAnnotation.compileForMember(annotations, compiled, scope);
48
-		compiled.body = body.compile(new FunctionScope(scope, new FunctionHeader(BasicTypeID.VOID)));
48
+		compiled.body = body.compile(new FunctionScope(compiled.position, scope, new FunctionHeader(BasicTypeID.VOID)));
49
 	}
49
 	}
50
 }
50
 }

+ 1
- 1
ScriptingExample/build.gradle View File

18
 	compile project(':JavaBytecodeCompiler')
18
 	compile project(':JavaBytecodeCompiler')
19
 	compile project(':JavaShared')
19
 	compile project(':JavaShared')
20
 	compile project(':CodeFormatter')
20
 	compile project(':CodeFormatter')
21
-    //compile project(':ScriptingHost')
21
+    compile project(':JavaIntegration')
22
 }
22
 }

+ 0
- 26
ScriptingExample/src/main/java/org/openzen/zenscript/scriptingexample/FileContents.java View File

1
-/*
2
- * To change this license header, choose License Headers in Project Properties.
3
- * To change this template file, choose Tools | Templates
4
- * and open the template in the editor.
5
- */
6
-package org.openzen.zenscript.scriptingexample;
7
-
8
-import java.util.ArrayList;
9
-import java.util.List;
10
-import org.openzen.zencode.shared.SourceFile;
11
-import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
-import org.openzen.zenscript.codemodel.ScriptBlock;
13
-
14
-/**
15
- *
16
- * @author Hoofdgebruiker
17
- */
18
-public class FileContents {
19
-	public final SourceFile file;
20
-	public ScriptBlock script;
21
-	public final List<HighLevelDefinition> definitions = new ArrayList<>();
22
-	
23
-	public FileContents(SourceFile file) {
24
-		this.file = file;
25
-	}
26
-}

+ 0
- 131
ScriptingExample/src/main/java/org/openzen/zenscript/scriptingexample/GlobalRegistry.java View File

1
-/*
2
- * To change this license header, choose License Headers in Project Properties.
3
- * To change this template file, choose Tools | Templates
4
- * and open the template in the editor.
5
- */
6
-package org.openzen.zenscript.scriptingexample;
7
-
8
-import java.util.ArrayList;
9
-import java.util.HashMap;
10
-import java.util.List;
11
-import java.util.Map;
12
-import org.openzen.zencode.shared.CodePosition;
13
-import org.openzen.zenscript.codemodel.FunctionHeader;
14
-import org.openzen.zenscript.codemodel.FunctionParameter;
15
-import org.openzen.zenscript.codemodel.GenericMapper;
16
-import org.openzen.zenscript.codemodel.Modifiers;
17
-import org.openzen.zenscript.codemodel.Module;
18
-import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
19
-import org.openzen.zenscript.codemodel.definition.ClassDefinition;
20
-import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
21
-import org.openzen.zenscript.codemodel.definition.ZSPackage;
22
-import org.openzen.zenscript.codemodel.expression.StaticGetterExpression;
23
-import org.openzen.zenscript.codemodel.member.GetterMember;
24
-import org.openzen.zenscript.codemodel.member.MethodMember;
25
-import org.openzen.zenscript.codemodel.member.ref.GetterMemberRef;
26
-import org.openzen.zenscript.codemodel.partial.IPartialExpression;
27
-import org.openzen.zenscript.codemodel.partial.PartialMemberGroupExpression;
28
-import org.openzen.zenscript.codemodel.scope.BaseScope;
29
-import org.openzen.zenscript.codemodel.type.BasicTypeID;
30
-import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
31
-import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
32
-import org.openzen.zenscript.codemodel.type.ISymbol;
33
-import org.openzen.zenscript.codemodel.type.StoredType;
34
-import org.openzen.zenscript.codemodel.type.StringTypeID;
35
-import org.openzen.zenscript.codemodel.type.storage.BorrowStorageTag;
36
-import org.openzen.zenscript.javashared.JavaClass;
37
-import org.openzen.zenscript.javashared.JavaField;
38
-import org.openzen.zenscript.javashared.JavaMethod;
39
-import org.openzen.zenscript.codemodel.type.TypeID;
40
-import org.openzen.zenscript.codemodel.type.storage.AutoStorageTag;
41
-import org.openzen.zenscript.codemodel.type.storage.StaticExpressionStorageTag;
42
-import org.openzen.zenscript.javashared.JavaCompiledModule;
43
-import org.openzen.zenscript.javashared.JavaContext;
44
-
45
-/**
46
- *
47
- * @author Hoofdgebruiker
48
- */
49
-public class GlobalRegistry {
50
-	public final ZSPackage globals = new ZSPackage(null, "");
51
-	private final ZSPackage rootPackage = new ZSPackage(null, "");
52
-	private final ZSPackage javaIo = rootPackage.getOrCreatePackage("java").getOrCreatePackage("io");
53
-	private final ZSPackage javaLang = rootPackage.getOrCreatePackage("java").getOrCreatePackage("lang");
54
-	
55
-	private final Module MODULE = new Module("scriptingExample");
56
-	private final ClassDefinition PRINTSTREAM = new ClassDefinition(CodePosition.NATIVE, MODULE, javaIo, "PrintStream", Modifiers.PUBLIC);
57
-	private final ClassDefinition SYSTEM = new ClassDefinition(CodePosition.NATIVE, MODULE, javaLang, "System", Modifiers.PUBLIC);
58
-	private final MethodMember PRINTSTREAM_PRINTLN;
59
-	private final GetterMember SYSTEM_OUT;
60
-	
61
-	public GlobalRegistry(GlobalTypeRegistry registry, ZSPackage globals) {
62
-		PRINTSTREAM_PRINTLN = new MethodMember(
63
-			CodePosition.NATIVE,
64
-			PRINTSTREAM,
65
-			Modifiers.PUBLIC,
66
-			"println",
67
-			new FunctionHeader(BasicTypeID.VOID, new FunctionParameter(StringTypeID.BORROW)),
68
-			null);
69
-		
70
-		SYSTEM_OUT = new GetterMember(
71
-			CodePosition.NATIVE,
72
-			SYSTEM,
73
-			Modifiers.PUBLIC | Modifiers.FINAL | Modifiers.STATIC,
74
-			"out",
75
-			DefinitionTypeID.forType(registry, SYSTEM).stored(AutoStorageTag.INSTANCE),
76
-			null);
77
-	}
78
-	
79
-	public void register(JavaContext context) {
80
-		context.addModule(MODULE);
81
-		JavaCompiledModule javaModule = context.getJavaModule(MODULE);
82
-		
83
-		JavaClass jSystem = new JavaClass("java.lang", "System", JavaClass.Kind.CLASS);
84
-		javaModule.setFieldInfo(SYSTEM_OUT, new JavaField(jSystem, "out", "Ljava/io/PrintStream;"));
85
-		
86
-		JavaClass jPrintStream = new JavaClass("java.io", "PrintStream", JavaClass.Kind.CLASS);
87
-		JavaMethod printstreamPrintln = JavaMethod.getNativeVirtual(jPrintStream, "println", "(Ljava/lang/String;)V");
88
-		javaModule.setMethodInfo(PRINTSTREAM_PRINTLN, printstreamPrintln);
89
-	}
90
-	
91
-	public ZSPackage collectPackages() {
92
-		// register packages here
93
-		
94
-		return rootPackage;
95
-	}
96
-	
97
-	public List<ExpansionDefinition> collectExpansions() {
98
-		List<ExpansionDefinition> expansions = new ArrayList<>();
99
-		
100
-		return expansions;
101
-	}
102
-	
103
-	public Map<String, ISymbol> collectGlobals() {
104
-		Map<String, ISymbol> globals = new HashMap<>();
105
-		
106
-		// for example, let's add a println global so we can call println("Hello world!") from anywhere
107
-		globals.put("println", new PrintlnSymbol());
108
-		
109
-		return globals;
110
-	}
111
-	
112
-	private class PrintlnSymbol implements ISymbol {
113
-
114
-		@Override
115
-		public IPartialExpression getExpression(CodePosition position, BaseScope scope, StoredType[] typeArguments) {
116
-			return new PartialMemberGroupExpression(
117
-					position,
118
-					scope,
119
-					new StaticGetterExpression(position, new GetterMemberRef(scope.getTypeRegistry().getForMyDefinition(SYSTEM).stored(StaticExpressionStorageTag.INSTANCE), SYSTEM_OUT, GenericMapper.EMPTY)),
120
-					"println",
121
-					PRINTSTREAM_PRINTLN.ref(scope.getTypeRegistry().getForDefinition(PRINTSTREAM).stored(BorrowStorageTag.INVOCATION), GenericMapper.EMPTY),
122
-					null,
123
-					false);
124
-		}
125
-
126
-		@Override
127
-		public TypeID getType(CodePosition position, TypeResolutionContext context, StoredType[] typeArguments) {
128
-			return null; // not a type
129
-		}
130
-	}
131
-}

+ 21
- 0
ScriptingExample/src/main/java/org/openzen/zenscript/scriptingexample/Globals.java View File

1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.scriptingexample;
7
+
8
+import org.openzen.zencode.java.ZenCodeGlobals;
9
+
10
+/**
11
+ *
12
+ * @author Hoofdgebruiker
13
+ */
14
+public class Globals implements ZenCodeGlobals {
15
+	private Globals() {}
16
+	
17
+	@Global
18
+	public static void println(String message) {
19
+		System.out.println(message);
20
+	}
21
+}

+ 19
- 124
ScriptingExample/src/main/java/org/openzen/zenscript/scriptingexample/Main.java View File

1
 package org.openzen.zenscript.scriptingexample;
1
 package org.openzen.zenscript.scriptingexample;
2
 
2
 
3
 import java.io.File;
3
 import java.io.File;
4
-import java.util.ArrayList;
5
-import java.util.Collections;
6
-import java.util.HashMap;
7
-import java.util.List;
8
-import java.util.Map;
4
+import java.io.IOException;
9
 import java.util.Optional;
5
 import java.util.Optional;
6
+import org.openzen.zencode.java.JavaNativeModule;
7
+import org.openzen.zencode.java.ScriptingEngine;
10
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zencode.shared.CompileException;
10
+import org.openzen.zencode.shared.FileSourceFile;
11
 import org.openzen.zencode.shared.SourceFile;
11
 import org.openzen.zencode.shared.SourceFile;
12
-import org.openzen.zenscript.codemodel.HighLevelDefinition;
13
-import org.openzen.zenscript.codemodel.Module;
14
-
15
-import org.openzen.zenscript.codemodel.ScriptBlock;
16
-import org.openzen.zenscript.codemodel.context.CompilingPackage;
17
-import org.openzen.zenscript.codemodel.definition.ZSPackage;
18
-import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
19
-import org.openzen.zenscript.codemodel.type.ISymbol;
20
-import org.openzen.zenscript.codemodel.type.storage.StorageType;
21
 import org.openzen.zenscript.compiler.SemanticModule;
12
 import org.openzen.zenscript.compiler.SemanticModule;
22
-import org.openzen.zenscript.formatter.FileFormatter;
23
-import org.openzen.zenscript.formatter.ScriptFormattingSettings;
24
-import org.openzen.zenscript.javabytecode.JavaCompiler;
25
-import org.openzen.zenscript.javabytecode.JavaModule;
26
-import org.openzen.zenscript.compiler.ModuleSpace;
27
-import org.openzen.zenscript.compiler.ZenCodeCompilingModule;
28
 import org.openzen.zenscript.lexer.ParseException;
13
 import org.openzen.zenscript.lexer.ParseException;
29
 import org.openzen.zenscript.lexer.ZSToken;
14
 import org.openzen.zenscript.lexer.ZSToken;
30
 import org.openzen.zenscript.lexer.ZSTokenParser;
15
 import org.openzen.zenscript.lexer.ZSTokenParser;
31
 import org.openzen.zenscript.lexer.ZSTokenType;
16
 import org.openzen.zenscript.lexer.ZSTokenType;
32
 import org.openzen.zenscript.parser.BracketExpressionParser;
17
 import org.openzen.zenscript.parser.BracketExpressionParser;
33
-import org.openzen.zenscript.parser.ParsedFile;
34
 import org.openzen.zenscript.parser.expression.ParsedExpression;
18
 import org.openzen.zenscript.parser.expression.ParsedExpression;
35
 import org.openzen.zenscript.parser.expression.ParsedExpressionString;
19
 import org.openzen.zenscript.parser.expression.ParsedExpressionString;
36
 
20
 
37
 public class Main {
21
 public class Main {
38
-    /**
39
-     * @param args the command line arguments
40
-     */
41
-    public static void main(String[] args) throws ParseException {
22
+	public static void main(String[] args) throws CompileException, ParseException, IOException {
23
+		ScriptingEngine scriptingEngine = new ScriptingEngine();
24
+		
25
+		JavaNativeModule module = scriptingEngine.createNativeModule("globals", "org.openzen.zenscript.scriptingexample");
26
+		module.addGlobals(Globals.class);
27
+		scriptingEngine.registerNativeProvided(module);
42
 		
28
 		
43
-		System.out.println();
44
 		File inputDirectory = new File("scripts");
29
 		File inputDirectory = new File("scripts");
45
 		File[] inputFiles = Optional.ofNullable(inputDirectory.listFiles((dir, name) -> name.endsWith(".zs"))).orElseGet(() -> new File[0]);
30
 		File[] inputFiles = Optional.ofNullable(inputDirectory.listFiles((dir, name) -> name.endsWith(".zs"))).orElseGet(() -> new File[0]);
31
+		SourceFile[] sourceFiles = new SourceFile[inputFiles.length];
32
+		for (int i = 0; i < inputFiles.length; i++)
33
+			sourceFiles[i] = new FileSourceFile(inputFiles[i].getName(), inputFiles[i]);
46
 		
34
 		
47
-		ZSPackage pkg = new ZSPackage(null, "");
48
-		Module module = new Module("scripts");
49
-		CompilingPackage compilingPkg = new CompilingPackage(pkg, module);
50
-		ParsedFile[] parsedFiles = parse(compilingPkg, inputFiles);
51
-		
52
-		ZSPackage root = ZSPackage.createRoot();
53
-		ZSPackage stdlib = new ZSPackage(root, "stdlib");
54
-		GlobalTypeRegistry typeRegistry = new GlobalTypeRegistry(stdlib);
55
-		
56
-		ZSPackage global = new ZSPackage(null, "");
57
-		GlobalRegistry registry = new GlobalRegistry(typeRegistry, global);
58
-		SemanticModule semantic = compileSyntaxToSemantic(typeRegistry, compilingPkg, parsedFiles, registry);
59
-		
60
-		//formatFiles(pkg, module);
61
-		
62
-		if (semantic.isValid()) {
63
-			JavaModule javaModule = compileSemanticToJava(registry, semantic);
64
-			javaModule.execute();
65
-		} else {
66
-			System.out.println("There were compilation errors");
67
-		}
68
-    }
69
-	
70
-	private static ParsedFile[] parse(CompilingPackage compilingPkg, File[] files) throws ParseException {
71
-		ParsedFile[] parsedFiles = new ParsedFile[files.length];
72
-		for (int i = 0; i < files.length; i++) {
73
-			parsedFiles[i] = ParsedFile.parse(compilingPkg, new TestBracketParser(), files[i]);
74
-		}
75
-		return parsedFiles;
76
-	}
77
-	
78
-	private static void formatFiles(ZSPackage pkg, SemanticModule module) {
79
-		Map<String, FileContents> files = new HashMap<>();
80
-		for (ScriptBlock block : module.scripts) {
81
-			SourceFile file = block.getTag(SourceFile.class);
82
-			if (file == null)
83
-				continue;
84
-			
85
-			FileContents contents = new FileContents(file);
86
-			contents.script = block;
87
-			files.put(file.getFilename(), contents);
88
-		}
89
-		
90
-		for (HighLevelDefinition definition : module.definitions.getAll()) {
91
-			SourceFile file = definition.getTag(SourceFile.class);
92
-			if (file == null)
93
-				continue;
94
-			
95
-			if (!files.containsKey(file.getFilename()))
96
-				files.put(file.getFilename(), new FileContents(file));
97
-			
98
-			files.get(file.getFilename()).definitions.add(definition);
99
-		}
100
-		
101
-		List<String> filenames = new ArrayList<>(files.keySet());
102
-		Collections.sort(filenames);
103
-		
104
-		ScriptFormattingSettings settings = new ScriptFormattingSettings.Builder().build();
105
-		for (String filename : filenames) {
106
-			FileContents contents = files.get(filename);
107
-			FileFormatter formatter = new FileFormatter(settings);
108
-			System.out.println("== " + filename + " ==");
109
-			System.out.println(formatter.format(pkg, contents.script, contents.definitions));
110
-		}
111
-	}
112
-	
113
-	private static SemanticModule compileSyntaxToSemantic(GlobalTypeRegistry typeRegistry, CompilingPackage compiling, ParsedFile[] files, GlobalRegistry registry) {
114
-		ModuleSpace space = new ModuleSpace(typeRegistry, new ArrayList<>(), StorageType.getStandard());
115
-		for (Map.Entry<String, ISymbol> global : registry.collectGlobals().entrySet()) {
116
-			space.addGlobal(global.getKey(), global.getValue());
117
-		}
118
-		SemanticModule result = ParsedFile.compileSyntaxToSemantic(
119
-				new SemanticModule[0],
120
-				compiling,
121
-				files,
122
-				space,
123
-				exception -> exception.printStackTrace());
124
-		
125
-		result = result.normalize();
126
-		result.validate(entry -> {
127
-			System.out.println(entry.kind + " " + entry.position.toString() + ": " + entry.message);
128
-		});
129
-		return result;
130
-	}
131
-	
132
-	private static JavaModule compileSemanticToJava(GlobalRegistry registry, SemanticModule module) {
133
-		JavaCompiler compiler = new JavaCompiler(module.registry, false, null);
134
-		registry.register(compiler.getContext());
135
-		
136
-		ZenCodeCompilingModule compiling = compiler.addModule(module);
137
-		for (HighLevelDefinition definition : module.definitions.getAll()) {
138
-			compiling.addDefinition(definition);
139
-		}
140
-		for (ScriptBlock script : module.scripts) {
141
-			compiling.addScriptBlock(script);
142
-		}
143
-		compiling.finish();
35
+		SemanticModule scripts = scriptingEngine.createScriptedModule("script", sourceFiles, new TestBracketParser());
36
+		if (!scripts.isValid())
37
+			return;
144
 		
38
 		
145
-		return compiler.finishAndGetModule();
39
+		scriptingEngine.registerCompiled(scripts);
40
+		scriptingEngine.run();
146
 	}
41
 	}
147
 	
42
 	
148
 	private static class TestBracketParser implements BracketExpressionParser {
43
 	private static class TestBracketParser implements BracketExpressionParser {

Loading…
Cancel
Save