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,6 +9,7 @@ import java.util.Arrays;
9 9
 import java.util.HashMap;
10 10
 import java.util.List;
11 11
 import java.util.Map;
12
+import org.openzen.zencode.shared.CodePosition;
12 13
 import org.openzen.zenscript.codemodel.expression.CallArguments;
13 14
 import org.openzen.zenscript.codemodel.expression.Expression;
14 15
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
@@ -180,11 +181,11 @@ public class FunctionHeader {
180 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 185
 		if (arguments.arguments.length < minParameters || arguments.arguments.length > maxParameters)
185 186
 			return false;
186 187
 		
187
-		FunctionHeader header = fillGenericArguments(scope, arguments.typeArguments);
188
+		FunctionHeader header = fillGenericArguments(position, scope, arguments.typeArguments);
188 189
 		for (int i = 0; i < header.parameters.length; i++) {
189 190
 			if (!arguments.arguments[i].type.equals(header.parameters[i].type))
190 191
 				return false;
@@ -193,11 +194,11 @@ public class FunctionHeader {
193 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 198
 		if (arguments.arguments.length < minParameters || arguments.arguments.length > maxParameters)
198 199
 			return false;
199 200
 		
200
-		FunctionHeader header = fillGenericArguments(scope, arguments.typeArguments);
201
+		FunctionHeader header = fillGenericArguments(position, scope, arguments.typeArguments);
201 202
 		for (int i = 0; i < header.parameters.length; i++) {
202 203
 			if (!scope.getTypeMembers(arguments.arguments[i].type).canCastImplicit(header.parameters[i].type))
203 204
 				return false;
@@ -361,10 +362,10 @@ public class FunctionHeader {
361 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 366
 		if (arguments.getNumberOfTypeArguments() > 0) {
366 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 369
 		} else {
369 370
 			return this;
370 371
 		}
@@ -372,7 +373,7 @@ public class FunctionHeader {
372 373
 	
373 374
 	public FunctionHeader withGenericArguments(GenericMapper mapper) {
374 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 378
 		return instance(mapper);
378 379
 	}
@@ -386,12 +387,12 @@ public class FunctionHeader {
386 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 391
 		if (arguments == null || arguments.length == 0)
391 392
 			return this;
392 393
 		
393 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 397
 		StoredType returnType = this.returnType.instance(mapper);
397 398
 		FunctionParameter[] parameters = new FunctionParameter[this.parameters.length];

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

@@ -8,6 +8,7 @@ package org.openzen.zenscript.codemodel;
8 8
 import java.util.Collections;
9 9
 import java.util.HashMap;
10 10
 import java.util.Map;
11
+import org.openzen.zencode.shared.CodePosition;
11 12
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
12 13
 import org.openzen.zenscript.codemodel.type.GenericTypeID;
13 14
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
@@ -18,12 +19,14 @@ import org.openzen.zenscript.codemodel.type.StoredType;
18 19
  * @author Hoofdgebruiker
19 20
  */
20 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 25
 	public final GlobalTypeRegistry registry;
24 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 30
 		this.registry = registry;
28 31
 		this.mapping = mapping;
29 32
 	}
@@ -57,17 +60,17 @@ public class GenericMapper {
57 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 64
 		Map<TypeParameter, StoredType> resultMap = new HashMap<>(this.mapping);
62 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 70
 		Map<TypeParameter, StoredType> resultMap = new HashMap<>(this.mapping);
68 71
 		for (TypeParameter parameter : parameters)
69 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 76
 	@Override

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

@@ -176,7 +176,7 @@ public class AnnotationProcessor implements ModuleProcessor {
176 176
 
177 177
 		@Override
178 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 180
 			if (member.body == null) {
181 181
 				throw new IllegalStateException("No body in static initializer @ " + member.position);
182 182
 			} else {
@@ -196,7 +196,7 @@ public class AnnotationProcessor implements ModuleProcessor {
196 196
 			if (member.body == null)
197 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 200
 			member.body = process(member.body, scope);
201 201
 			return null;
202 202
 		}
@@ -212,7 +212,7 @@ public class AnnotationProcessor implements ModuleProcessor {
212 212
 			if (member.body == null)
213 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 216
 			member.body = process(member.body, scope);
217 217
 			return null;
218 218
 		}
@@ -228,7 +228,7 @@ public class AnnotationProcessor implements ModuleProcessor {
228 228
 			if (member.body == null)
229 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 232
 			member.body = process(member.body, scope);
233 233
 			return null;
234 234
 		}

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

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

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

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

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

@@ -8,6 +8,7 @@ package org.openzen.zenscript.codemodel.context;
8 8
 import java.util.ArrayList;
9 9
 import java.util.Arrays;
10 10
 import java.util.List;
11
+import org.openzen.zencode.shared.CodePosition;
11 12
 import org.openzen.zenscript.codemodel.FunctionHeader;
12 13
 import org.openzen.zenscript.codemodel.FunctionParameter;
13 14
 import org.openzen.zenscript.codemodel.expression.LambdaClosure;
@@ -30,8 +31,8 @@ public class StatementContext extends TypeContext {
30 31
 	
31 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 37
 		loops = LoopStatement.NONE;
37 38
 		header = null;
@@ -39,8 +40,8 @@ public class StatementContext extends TypeContext {
39 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 46
 		loops = LoopStatement.NONE;
46 47
 		this.header = header;
@@ -48,16 +49,18 @@ public class StatementContext extends TypeContext {
48 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 55
 		loops = LoopStatement.NONE;
54 56
 		header = null;
55 57
 		closure = null;
56 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 64
 		loops = LoopStatement.NONE;
62 65
 		this.header = header;
63 66
 		closure = null;
@@ -65,7 +68,7 @@ public class StatementContext extends TypeContext {
65 68
 	}
66 69
 	
67 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 73
 		variables.addAll(outer.variables);
71 74
 		loops = outer.loops;
@@ -75,7 +78,7 @@ public class StatementContext extends TypeContext {
75 78
 	}
76 79
 	
77 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 83
 		variables.addAll(outer.variables);
81 84
 		loops = Arrays.copyOf(outer.loops, outer.loops.length + 1);
@@ -86,7 +89,7 @@ public class StatementContext extends TypeContext {
86 89
 	}
87 90
 	
88 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 94
 		loops = LoopStatement.NONE;
92 95
 		header = lambdaHeader;

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

@@ -8,6 +8,7 @@ package org.openzen.zenscript.codemodel.context;
8 8
 import java.util.Arrays;
9 9
 import java.util.List;
10 10
 import java.util.Map;
11
+import org.openzen.zencode.shared.CodePosition;
11 12
 import org.openzen.zenscript.codemodel.GenericMapper;
12 13
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
13 14
 import org.openzen.zenscript.codemodel.type.StoredType;
@@ -19,27 +20,30 @@ import org.openzen.zenscript.codemodel.type.member.TypeMembers;
19 20
  * @author Hoofdgebruiker
20 21
  */
21 22
 public class TypeContext {
23
+	protected final CodePosition position;
22 24
 	protected final TypeParameter[] typeParameters;
23 25
 	public final StoredType thisType;
24 26
 	private final LocalMemberCache memberCache;
25 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 31
 		this.typeParameters = parameters;
29 32
 		this.thisType = thisType;
30 33
 		memberCache = new LocalMemberCache(context.registry, context.expansions);
31 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 39
 		typeParameters = concat(outer.typeParameters, inner);
36 40
 		this.thisType = thisType;
37 41
 		moduleContext = outer.moduleContext;
38 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 49
 	public int getId(TypeParameter parameter) {
@@ -60,7 +64,7 @@ public class TypeContext {
60 64
 	
61 65
 	public GenericMapper getMapper() {
62 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 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,8 +101,8 @@ public abstract class Expression implements IPartialExpression {
101 101
 	}
102 102
 	
103 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 108
 	@Override

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

@@ -34,7 +34,7 @@ public class ExpressionBuilder {
34 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 38
 		String[] nameParts = Strings.split(typename, '.');
39 39
 		List<GenericName> name = new ArrayList<>();
40 40
 		for (String namePart : nameParts)
@@ -43,12 +43,12 @@ public class ExpressionBuilder {
43 43
 		if (type == null)
44 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 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 52
 		CallArguments compiledArguments = new CallArguments(arguments);
53 53
 		FunctionalMemberRef member = constructors.selectMethod(position, scope, compiledArguments, true, true);
54 54
 		if (member == null)
@@ -61,7 +61,7 @@ public class ExpressionBuilder {
61 61
 				type,
62 62
 				member,
63 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 67
 	public Expression not(Expression value) throws CompileException {

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

@@ -0,0 +1,38 @@
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,7 +31,7 @@ public interface IPartialExpression {
31 31
 	
32 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 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,8 +40,8 @@ public class PartialGlobalExpression implements IPartialExpression {
40 40
 	}
41 41
 
42 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 47
 	@Override

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

@@ -82,8 +82,8 @@ public class PartialMemberGroupExpression implements IPartialExpression {
82 82
 	}
83 83
 
84 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 89
 	@Override

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

@@ -37,7 +37,7 @@ public class PartialPackageExpression implements IPartialExpression {
37 37
 	}
38 38
 
39 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 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,8 +52,8 @@ public class PartialStaticMemberGroupExpression implements IPartialExpression {
52 52
 	}
53 53
 
54 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 59
 	@Override

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

@@ -43,8 +43,8 @@ public class PartialTypeExpression implements IPartialExpression {
43 43
 	}
44 44
 
45 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 50
 	@Override

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

@@ -42,7 +42,7 @@ public class PartialVariantOptionExpression implements IPartialExpression {
42 42
 	}
43 43
 
44 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 46
 		if (arguments != option.getOption().types.length)
47 47
 			return new List[0];
48 48
 		

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

@@ -79,7 +79,7 @@ public class DefinitionScope extends BaseScope {
79 79
 		}
80 80
 		
81 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 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,11 +36,11 @@ public class FunctionScope extends StatementScope {
36 36
 	private final StoredType thisType;
37 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 44
 		this.outer = outer;
45 45
 		this.header = header;
46 46
 		this.thisType = outer.getThisType() == null || header.storage == null ? outer.getThisType() : outer.getThisType().type.stored(header.storage);
@@ -51,7 +51,7 @@ public class FunctionScope extends StatementScope {
51 51
 		if (header == null)
52 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 57
 	@Override

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

@@ -12,7 +12,6 @@ import org.openzen.zenscript.codemodel.GenericMapper;
12 12
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
13 13
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
14 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,7 +86,7 @@ public class DefinitionTypeID implements TypeID {
86 86
 			Map<TypeParameter, StoredType> typeMapping = new HashMap<>();
87 87
 			for (int i = 0; i < definition.typeParameters.length; i++)
88 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 90
 			TypeID result = alias.type.instance(mapper, null).type.getNormalized();
91 91
 			return result;
92 92
 		}
@@ -153,7 +153,7 @@ public class DefinitionTypeID implements TypeID {
153 153
 	
154 154
 	@Override
155 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 159
 	@Override

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

@@ -39,7 +39,7 @@ public class GenericTypeID implements TypeID {
39 39
 	@Override
40 40
 	public StoredType instance(GenericMapper mapper, StorageTag storage) {
41 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 45
 	@Override

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

@@ -37,7 +37,7 @@ public class OptionalTypeID implements TypeID {
37 37
 	@Override
38 38
 	public StoredType instance(GenericMapper mapper, StorageTag storage) {
39 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 43
 	@Override

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

@@ -9,6 +9,7 @@ import java.util.HashMap;
9 9
 import java.util.Map;
10 10
 import java.util.Objects;
11 11
 import java.util.Set;
12
+import org.openzen.zencode.shared.CodePosition;
12 13
 import org.openzen.zenscript.codemodel.GenericMapper;
13 14
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
14 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,7 +104,7 @@ public class TypeMemberBuilder implements TypeVisitorWithContext<Void, Void, Run
104 104
 			if (mapping == null)
105 105
 				continue;
106 106
 			
107
-			GenericMapper mapper = new GenericMapper(registry, mapping);
107
+			GenericMapper mapper = new GenericMapper(definition.position, registry, mapping);
108 108
 			for (IDefinitionMember member : expansion.members)
109 109
 				member.registerTo(members, TypeMemberPriority.SPECIFIED, mapper);
110 110
 		}
@@ -387,7 +387,7 @@ public class TypeMemberBuilder implements TypeVisitorWithContext<Void, Void, Run
387 387
 	public Void visitGenericMap(Void context, GenericMapTypeID map) {
388 388
 		TypeParameter functionParameter = new TypeParameter(BUILTIN, "T");
389 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 392
 		FunctionHeader getOptionalHeader = new FunctionHeader(
393 393
 				new TypeParameter[] { functionParameter },
@@ -447,7 +447,7 @@ public class TypeMemberBuilder implements TypeVisitorWithContext<Void, Void, Run
447 447
 		GenericMapper mapper = null;
448 448
 		if (definitionType.hasTypeParameters() || (definitionType.outer != null && definitionType.outer.hasTypeParameters())) {
449 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 453
 		for (IDefinitionMember member : definition.members) {

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

@@ -256,7 +256,7 @@ public class TypeMemberGroup {
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 260
 		List<StoredType>[] result = (List<StoredType>[])(new List[arguments]);
261 261
 		for (int i = 0; i < result.length; i++)
262 262
 			result[i] = new ArrayList<>();
@@ -270,7 +270,7 @@ public class TypeMemberGroup {
270 270
 				for (StoredType resultHint : typeHints) {
271 271
 					Map<TypeParameter, StoredType> mapping = header.getReturnType().inferTypeParameters(scope.getMemberCache(), resultHint);
272 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 274
 						break;
275 275
 					}
276 276
 				}
@@ -287,7 +287,7 @@ public class TypeMemberGroup {
287 287
 	
288 288
 	public Expression call(CodePosition position, TypeScope scope, Expression target, CallArguments arguments, boolean allowStaticUsage) throws CompileException {
289 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 291
 		for (int i = 0; i < arguments.arguments.length; i++) {
292 292
 			arguments.arguments[i] = arguments.arguments[i].castImplicit(position, scope, instancedHeader.parameters[i].type);
293 293
 		}
@@ -316,13 +316,13 @@ public class TypeMemberGroup {
316 316
 			CompareType compareType) throws CompileException
317 317
 	{
318 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 320
 		return method.callWithComparator(position, compareType, target, instancedHeader, arguments, scope);
321 321
 	}
322 322
 	
323 323
 	public Expression callStatic(CodePosition position, TypeID target, TypeScope scope, CallArguments arguments) throws CompileException {
324 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 326
 		return method.callStatic(position, target, instancedHeader, arguments, scope);
327 327
 	}
328 328
 	
@@ -332,8 +332,8 @@ public class TypeMemberGroup {
332 332
 			if (!(method.member.isStatic() ? allowStatic : allowNonStatic))
333 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 337
 				return method.member;
338 338
 		}
339 339
 		
@@ -347,13 +347,13 @@ public class TypeMemberGroup {
347 347
 			
348 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 352
 				continue;
353 353
 			
354 354
 			if (selected != null) {
355 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 357
 				explanation.append("Function A: ").append(selectedHeader.toString()).append("\n");
358 358
 				explanation.append("Function B: ").append(header.toString());
359 359
 				throw new CompileException(position, CompileExceptionCode.CALL_AMBIGUOUS, "Ambiguous call; multiple methods match:\n" + explanation.toString());
@@ -375,7 +375,7 @@ public class TypeMemberGroup {
375 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 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,6 +5,9 @@
5 5
  */
6 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 13
  * @author Hoofdgebruiker
@@ -22,13 +25,13 @@ public interface StorageTag {
22 25
 	
23 26
 	boolean isImmutable();
24 27
 	
25
-	static StorageTag union(StorageTag minor, StorageTag major) {
28
+	static StorageTag union(CodePosition position, StorageTag minor, StorageTag major) {
26 29
 		if (minor == AutoStorageTag.INSTANCE || minor == null)
27 30
 			return major;
28 31
 		if (major == AutoStorageTag.INSTANCE || major == null)
29 32
 			return minor;
30 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 36
 		return major;
34 37
 	}

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

@@ -137,14 +137,7 @@ public class SemanticModule {
137 137
 		if (state != State.VALIDATED)
138 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 143
 	public ModuleContext getContext() {

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

@@ -10,7 +10,7 @@ package org.openzen.zenscript.compiler;
10 10
  * @author Hoofdgebruiker
11 11
  */
12 12
 public interface ZenCodeCompiler {
13
-	ZenCodeCompilingModule addModule(SemanticModule module);
13
+	void addModule(SemanticModule module);
14 14
 	
15 15
 	void finish();
16 16
 	

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

@@ -5,12 +5,26 @@
5 5
  */
6 6
 package org.openzen.zenscript.constructor;
7 7
 
8
+import java.io.File;
9
+import java.util.ArrayList;
8 10
 import java.util.HashMap;
11
+import java.util.List;
9 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 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,9 +34,9 @@ public class ConstructorRegistry {
20 34
 	private static final Map<String, TargetType> targetTypes = new HashMap<>();
21 35
 	
22 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 42
 	public static void registerTargetType(String name, TargetType type) {
@@ -34,4 +48,162 @@ public class ConstructorRegistry {
34 48
 	}
35 49
 
36 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,6 +37,10 @@ public interface ZenCodeType {
37 37
 		String value() default "";
38 38
 	}
39 39
 	
40
+	@Retention(RetentionPolicy.RUNTIME)
41
+	@Target(ElementType.CONSTRUCTOR)
42
+	@interface Constructor {}
43
+	
40 44
 	@Retention(RetentionPolicy.RUNTIME)
41 45
 	@Target(ElementType.METHOD)
42 46
 	@interface Method {

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

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

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

@@ -1,53 +0,0 @@
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,27 +0,0 @@
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,6 +26,9 @@ public class JavaBytecodeModule extends JavaCompiledModule {
26 26
 	}
27 27
 	
28 28
 	public void addClass(String name, byte[] bytecode) {
29
+		if (bytecode == null)
30
+			return;
31
+		
29 32
 		classes.put(name, bytecode);
30 33
 	}
31 34
 	

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

@@ -1,50 +0,0 @@
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,27 +0,0 @@
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,6 +5,9 @@
5 5
  */
6 6
 package org.openzen.zenscript.javabytecode;
7 7
 
8
+import java.io.File;
9
+import java.io.FileOutputStream;
10
+import java.io.IOException;
8 11
 import java.lang.reflect.InvocationTargetException;
9 12
 import java.util.ArrayList;
10 13
 import java.util.HashMap;
@@ -39,19 +42,34 @@ public class JavaBytecodeRunUnit {
39 42
 	}
40 43
 	
41 44
 	public void run() {
42
-		if (!scriptsWritten)
43
-			writeScripts();
45
+		writeScripts();
44 46
 		
45 47
 		ScriptClassLoader classLoader = new ScriptClassLoader();
46 48
 
47 49
 		try {
48 50
 			classLoader.loadClass("Scripts").getMethod("run").invoke(null);
49 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 69
 	private void writeScripts() {
70
+		if (scriptsWritten)
71
+			return;
72
+		
55 73
 		JavaClassWriter scriptsClassWriter = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
56 74
 		scriptsClassWriter.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, "Scripts", null, "java/lang/Object", null);
57 75
 		
@@ -65,6 +83,7 @@ public class JavaBytecodeRunUnit {
65 83
 		runWriter.end();
66 84
 		
67 85
 		classes.put("Scripts", scriptsClassWriter.toByteArray());
86
+		scriptsWritten = true;
68 87
 	}
69 88
 
70 89
 	public class ScriptClassLoader extends ClassLoader {

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

@@ -5,31 +5,23 @@
5 5
  */
6 6
 package org.openzen.zenscript.javabytecode;
7 7
 
8
-import java.io.File;
9
-import java.util.ArrayList;
10 8
 import java.util.HashMap;
11
-import java.util.List;
12 9
 import java.util.Map;
13 10
 import org.objectweb.asm.ClassWriter;
14 11
 import org.objectweb.asm.Opcodes;
15 12
 import org.openzen.zencode.shared.SourceFile;
16 13
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
17 14
 import org.openzen.zenscript.codemodel.ScriptBlock;
15
+import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
18 16
 import org.openzen.zenscript.codemodel.statement.Statement;
19
-import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
20 17
 import org.openzen.zenscript.compiler.SemanticModule;
21
-import org.openzen.zenscript.compiler.ZenCodeCompiler;
22
-import org.openzen.zenscript.compiler.ZenCodeCompilingModule;
23 18
 import org.openzen.zenscript.javabytecode.compiler.JavaClassWriter;
24 19
 import org.openzen.zenscript.javabytecode.compiler.JavaScriptFile;
25 20
 import org.openzen.zenscript.javabytecode.compiler.JavaStatementVisitor;
26 21
 import org.openzen.zenscript.javabytecode.compiler.JavaWriter;
27 22
 import org.openzen.zenscript.javabytecode.compiler.definitions.JavaDefinitionVisitor;
28
-import org.openzen.zenscript.javashared.JavaBaseCompiler;
29 23
 import org.openzen.zenscript.javashared.JavaClass;
30 24
 import org.openzen.zenscript.javashared.JavaCompileSpace;
31
-import org.openzen.zenscript.javashared.JavaCompiledModule;
32
-import org.openzen.zenscript.javashared.JavaContext;
33 25
 import org.openzen.zenscript.javashared.JavaMethod;
34 26
 import org.openzen.zenscript.javashared.prepare.JavaPrepareDefinitionMemberVisitor;
35 27
 import org.openzen.zenscript.javashared.prepare.JavaPrepareDefinitionVisitor;
@@ -37,63 +29,48 @@ import org.openzen.zenscript.javashared.prepare.JavaPrepareDefinitionVisitor;
37 29
 /**
38 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 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 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 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 52
 			definition.accept(memberPreparer);
77 53
 		}
78 54
 		
79 55
 		for (HighLevelDefinition definition : module.definitions.getAll()) {
80 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 63
 		for (ScriptBlock script : module.scripts) {
87 64
 			final SourceFile sourceFile = script.getTag(SourceFile.class);
88 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 68
 			String methodName = scriptFile.scriptMethods.isEmpty() ? "run" : "run" + scriptFile.scriptMethods.size();
92 69
 
93 70
 			// convert scripts into methods (add them to a Scripts class?)
94 71
 			// (TODO: can we break very long scripts into smaller methods? for the extreme scripts)
95 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 74
 			scriptFile.scriptMethods.add(method);
98 75
 
99 76
 			final JavaStatementVisitor statementVisitor = new JavaStatementVisitor(context, context.getJavaModule(script.module), new JavaWriter(visitor, method, null, null, null));
@@ -115,29 +92,16 @@ public class JavaCompiler extends JavaBaseCompiler implements ZenCodeCompiler {
115 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 107
 	private String getClassName(String filename) {
@@ -150,7 +114,7 @@ public class JavaCompiler extends JavaBaseCompiler implements ZenCodeCompiler {
150 114
 		}
151 115
 	}
152 116
 
153
-	private JavaScriptFile getScriptFile(String className) {
117
+	private JavaScriptFile getScriptFile(Map<String, JavaScriptFile> scriptBlocks, String className) {
154 118
 		if (!scriptBlocks.containsKey(className)) {
155 119
 			JavaClassWriter scriptFileWriter = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
156 120
 			scriptFileWriter.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, className, null, "java/lang/Object", null);
@@ -159,77 +123,4 @@ public class JavaCompiler extends JavaBaseCompiler implements ZenCodeCompiler {
159 123
 
160 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,76 +0,0 @@
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,16 +2127,8 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
2127 2127
 
2128 2128
     @Override
2129 2129
     public Void visitNew(NewExpression expression) {
2130
-		// TODO: this code is incorrect!
2131 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 2132
         javaWriter.dup();
2141 2133
 
2142 2134
 		for (Expression argument : expression.arguments.arguments) {

+ 22
- 0
JavaIntegration/build.gradle View File

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

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

@@ -0,0 +1,129 @@
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,11 +6,14 @@
6 6
 package org.openzen.zenscript.javashared;
7 7
 
8 8
 import org.openzen.zenscript.codemodel.Module;
9
+import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
9 10
 
10 11
 /**
11 12
  *
12 13
  * @author Hoofdgebruiker
13 14
  */
14 15
 public interface JavaCompileSpace {
16
+	public GlobalTypeRegistry getRegistry();
17
+	
15 18
 	public JavaCompiledModule getCompiled(Module module);
16 19
 }

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

@@ -5,11 +5,8 @@
5 5
  */
6 6
 package org.openzen.zenscript.javashared;
7 7
 
8
-import java.util.ArrayList;
9 8
 import java.util.HashMap;
10
-import java.util.List;
11 9
 import java.util.Map;
12
-import org.openzen.zencode.shared.CodePosition;
13 10
 import org.openzen.zenscript.codemodel.FunctionParameter;
14 11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
15 12
 import org.openzen.zenscript.codemodel.Module;
@@ -17,8 +14,6 @@ import org.openzen.zenscript.codemodel.definition.VariantDefinition;
17 14
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
18 15
 import org.openzen.zenscript.codemodel.member.ImplementationMember;
19 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,13 +35,6 @@ public class JavaCompiledModule {
40 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 38
 	public void setClassInfo(HighLevelDefinition definition, JavaClass cls) {
51 39
 		classes.put(definition, cls);
52 40
 	}

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

@@ -15,6 +15,7 @@ import org.openzen.zenscript.codemodel.FunctionParameter;
15 15
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
16 16
 import org.openzen.zenscript.codemodel.Module;
17 17
 import org.openzen.zenscript.codemodel.definition.VariantDefinition;
18
+import org.openzen.zenscript.codemodel.definition.ZSPackage;
18 19
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
19 20
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
20 21
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
@@ -38,10 +39,18 @@ public abstract class JavaContext {
38 39
 	private final Map<String, JavaSynthesizedRange> ranges = new HashMap<>();
39 40
 	private boolean useShared = false;
40 41
 	
42
+	private final JavaCompileSpace space;
41 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 56
 			TypeParameter t = new TypeParameter(CodePosition.BUILTIN, "T");
@@ -80,22 +89,31 @@ public abstract class JavaContext {
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 102
 	protected abstract JavaSyntheticClassGenerator getTypeGenerator();
84 103
 		
85 104
 	public abstract String getDescriptor(TypeID type);
86 105
 	
87 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 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 117
 		if (javaModule == null)
100 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,17 +8,28 @@ package org.openzen.zenscript.javashared;
8 8
 import java.util.HashMap;
9 9
 import java.util.Map;
10 10
 import org.openzen.zenscript.codemodel.Module;
11
+import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
11 12
 
12 13
 /**
13 14
  *
14 15
  * @author Hoofdgebruiker
15 16
  */
16 17
 public class SimpleJavaCompileSpace implements JavaCompileSpace {
18
+	private final GlobalTypeRegistry registry;
17 19
 	private final Map<Module, JavaCompiledModule> modules = new HashMap<>();
18 20
 	
21
+	public SimpleJavaCompileSpace(GlobalTypeRegistry registry) {
22
+		this.registry = registry;
23
+	}
24
+	
19 25
 	public void register(JavaCompiledModule module) {
20 26
 		modules.put(module.module, module);
21 27
 	}
28
+
29
+	@Override
30
+	public GlobalTypeRegistry getRegistry() {
31
+		return registry;
32
+	}
22 33
 	
23 34
 	@Override
24 35
 	public JavaCompiledModule getCompiled(Module module) {

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

@@ -295,7 +295,7 @@ public class JavaPrepareDefinitionVisitor implements DefinitionVisitor<JavaClass
295 295
 		if (isPrepared(definition))
296 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 299
 		context.setJavaClass(definition, cls);
300 300
 		return cls;
301 301
 	}
@@ -310,7 +310,7 @@ public class JavaPrepareDefinitionVisitor implements DefinitionVisitor<JavaClass
310 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 314
 		context.setJavaClass(definition, cls);
315 315
 		return cls;
316 316
 	}
@@ -326,7 +326,7 @@ public class JavaPrepareDefinitionVisitor implements DefinitionVisitor<JavaClass
326 326
 		if (isPrepared(variant))
327 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 330
 		context.setJavaClass(variant, cls);
331 331
 		
332 332
 		for (VariantDefinition.Option option : variant.options) {
@@ -345,11 +345,11 @@ public class JavaPrepareDefinitionVisitor implements DefinitionVisitor<JavaClass
345 345
 		JavaNativeClass nativeClass = nativeTag == null ? null : nativeClasses.get(nativeTag.value);
346 346
 		JavaClass cls;
347 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 349
 			cls.destructible = definition.isDestructible();
350 350
 			context.setJavaClass(definition, cls);
351 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 354
 			context.setJavaClass(definition, nativeClass.cls);
355 355
 			context.setJavaExpansionClass(definition, cls);

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

@@ -36,7 +36,6 @@ import org.openzen.zenscript.javasource.scope.JavaSourceFileScope;
36 36
 import org.openzen.zenscript.javasource.scope.JavaSourceStatementScope;
37 37
 import org.openzen.zenscript.javashared.JavaClass;
38 38
 import org.openzen.zenscript.javashared.JavaCompiledModule;
39
-import org.openzen.zenscript.javashared.JavaContext;
40 39
 import org.openzen.zenscript.javashared.JavaImplementation;
41 40
 
42 41
 /**
@@ -51,13 +50,14 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<Void> {
51 50
 	private final JavaSourceFormattingSettings settings;
52 51
 	private final List<ExpansionDefinition> expansions;
53 52
 	private final StringBuilder output;
54
-	private final JavaContext context;
53
+	private final JavaSourceContext context;
55 54
 	private final JavaCompiledModule module;
56 55
 	private final SemanticModule semanticModule;
57 56
 	
58 57
 	public JavaDefinitionVisitor(
59 58
 			String indent,
60 59
 			JavaSourceCompiler compiler,
60
+			JavaSourceContext context,
61 61
 			JavaCompiledModule module,
62 62
 			JavaClass cls,
63 63
 			JavaSourceFile file,
@@ -72,7 +72,7 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<Void> {
72 72
 		this.settings = compiler.settings;
73 73
 		this.output = output;
74 74
 		this.expansions = expansions;
75
-		this.context = compiler.context;
75
+		this.context = context;
76 76
 		this.module = module;
77 77
 		this.semanticModule = semanticModule;
78 78
 	}
@@ -87,7 +87,7 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<Void> {
87 87
 				semanticModule.expansions,
88 88
 				semanticModule.annotations,
89 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 93
 	private List<ImplementationMember> getMergedImplementations(HighLevelDefinition definition) {
@@ -403,7 +403,7 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<Void> {
403 403
 				member.accept(memberCompiler);
404 404
 			memberCompiler.finish();
405 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 407
 			for (IDefinitionMember member : definition.members)
408 408
 				member.accept(memberCompiler);
409 409
 			

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

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

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

@@ -5,76 +5,72 @@
5 5
  */
6 6
 package org.openzen.zenscript.javasource;
7 7
 
8
-import java.io.File;
9
-import java.util.ArrayList;
10 8
 import java.util.HashMap;
11
-import java.util.List;
12 9
 import java.util.Map;
13 10
 import org.openzen.zencode.shared.SourceFile;
14 11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
+import org.openzen.zenscript.codemodel.Module;
15 13
 import org.openzen.zenscript.codemodel.ScriptBlock;
16
-import org.openzen.zenscript.codemodel.definition.ZSPackage;
17 14
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
18 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 16
 import org.openzen.zenscript.javashared.prepare.JavaPrepareDefinitionVisitor;
23 17
 import org.openzen.zenscript.javashared.JavaClass;
18
+import org.openzen.zenscript.javashared.JavaCompileSpace;
24 19
 
25 20
 /**
26 21
  *
27 22
  * @author Hoofdgebruiker
28 23
  */
29
-public class JavaSourceCompiler extends JavaBaseCompiler implements ZenCodeCompiler {
24
+public class JavaSourceCompiler {
30 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 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 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 70
 	public String getFullName(HighLevelDefinition definition) {
67 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 74
 	private String getFilename(HighLevelDefinition definition) {
79 75
 		SourceFile source = definition.getTag(SourceFile.class);
80 76
 		if (source != null) {
@@ -86,45 +82,4 @@ public class JavaSourceCompiler extends JavaBaseCompiler implements ZenCodeCompi
86 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,10 +5,10 @@
5 5
  */
6 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 9
 import org.openzen.zenscript.codemodel.type.StoredType;
11 10
 import org.openzen.zenscript.codemodel.type.TypeID;
11
+import org.openzen.zenscript.javashared.JavaCompileSpace;
12 12
 import org.openzen.zenscript.javashared.JavaContext;
13 13
 import org.openzen.zenscript.javashared.JavaSyntheticClassGenerator;
14 14
 import org.openzen.zenscript.javashared.JavaTypeDescriptorVisitor;
@@ -20,12 +20,14 @@ import org.openzen.zenscript.javashared.JavaTypeDescriptorVisitor;
20 20
 public class JavaSourceContext extends JavaContext {
21 21
 	private final JavaTypeDescriptorVisitor typeDescriptorVisitor;
22 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 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 33
 	@Override

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

@@ -7,13 +7,6 @@
7 7
 package org.openzen.zenscript.javasource;
8 8
 
9 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 10
 import java.util.ArrayList;
18 11
 import java.util.List;
19 12
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
@@ -31,7 +24,7 @@ import org.openzen.zenscript.javashared.prepare.JavaPrepareDefinitionMemberVisit
31 24
 public class JavaSourceFile {
32 25
 	public final JavaSourceImporter importer;
33 26
 	private final JavaSourceCompiler compiler;
34
-	private final File file;
27
+	private final JavaSourceContext context;
35 28
 	private final JavaClass cls;
36 29
 	private final StringBuilder contents = new StringBuilder();
37 30
 	private final ZSPackage pkg;
@@ -40,14 +33,14 @@ public class JavaSourceFile {
40 33
 	private HighLevelDefinition mainDefinition;
41 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 37
 		this.compiler = compiler;
38
+		this.context = context;
45 39
 		this.pkg = pkg;
46 40
 		this.cls = cls;
47 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 46
 	public String getName() {
@@ -58,7 +51,7 @@ public class JavaSourceFile {
58 51
 		if (definition instanceof ExpansionDefinition) {
59 52
 			expansions.add((ExpansionDefinition)definition);
60 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 55
 		} else {
63 56
 			mainDefinition = definition;
64 57
 		}
@@ -75,7 +68,7 @@ public class JavaSourceFile {
75 68
 	}
76 69
 	
77 70
 	private boolean isEmpty(HighLevelDefinition definition) {
78
-		JavaClass cls = compiler.context.getJavaClass(definition);
71
+		JavaClass cls = context.getJavaClass(definition);
79 72
 		if (!cls.empty)
80 73
 			return false;
81 74
 		
@@ -85,12 +78,10 @@ public class JavaSourceFile {
85 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 82
 		if (mainDefinition == null || isEmpty(mainDefinition)) {
92 83
 			if (expansions.isEmpty())
93
-				return;
84
+				return null;
94 85
 			
95 86
 			mainDefinition = expansions.remove(0);
96 87
 		}
@@ -99,7 +90,8 @@ public class JavaSourceFile {
99 90
 		JavaDefinitionVisitor visitor = new JavaDefinitionVisitor(
100 91
 				"",
101 92
 				compiler,
102
-				compiler.context.getJavaModule(module.module),
93
+				context,
94
+				context.getJavaModule(module.module),
103 95
 				cls,
104 96
 				this,
105 97
 				contents,
@@ -107,31 +99,22 @@ public class JavaSourceFile {
107 99
 				module);
108 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

@@ -0,0 +1,40 @@
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,13 +5,6 @@
5 5
  */
6 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 8
 import java.util.ArrayList;
16 9
 import java.util.HashMap;
17 10
 import java.util.List;
@@ -38,16 +31,16 @@ import org.openzen.zenscript.codemodel.type.TypeVisitor;
38 31
  */
39 32
 public class JavaSourceSyntheticHelperGenerator {
40 33
 	private final JavaContext context;
41
-	private final File directory;
42 34
 	private final JavaSourceFormattingSettings settings;
43 35
 	private final Map<String, List<String>> members = new HashMap<>();
44 36
 	private final JavaClass arrayHelpers = new JavaClass("zsynthetic", "ArrayHelpers", JavaClass.Kind.CLASS);
45 37
 	private final Map<ArrayKind, JavaMethod> existingContains = new HashMap<>();
46 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 43
 		this.context = context;
50
-		this.directory = new File(directory, "zsynthetic");
51 44
 		this.settings = settings;
52 45
 	}
53 46
 	
@@ -111,13 +104,8 @@ public class JavaSourceSyntheticHelperGenerator {
111 104
 			}
112 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,13 +5,6 @@
5 5
  */
6 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 8
 import org.openzen.zenscript.codemodel.FunctionParameter;
16 9
 import org.openzen.zenscript.javashared.JavaClass;
17 10
 import org.openzen.zenscript.javashared.JavaSynthesizedFunction;
@@ -23,12 +16,12 @@ import org.openzen.zenscript.javashared.JavaSyntheticClassGenerator;
23 16
  * @author Hoofdgebruiker
24 17
  */
25 18
 public class JavaSourceSyntheticTypeGenerator implements JavaSyntheticClassGenerator {
26
-	private final File directory;
19
+	private final JavaSourceModule helpers;
27 20
 	private final JavaSourceFormattingSettings settings;
28 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 25
 		this.settings = settings;
33 26
 		this.context = context;
34 27
 	}
@@ -133,31 +126,27 @@ public class JavaSourceSyntheticTypeGenerator implements JavaSyntheticClassGener
133 126
 	}
134 127
 	
135 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,53 +0,0 @@
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,26 +0,0 @@
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,16 +31,15 @@ public class JavaSourceFileScope {
31 31
 	public final JavaSourceContext context;
32 32
 	
33 33
 	public JavaSourceFileScope(
34
-			JavaSourceImporter importer, 
35
-			JavaSourceSyntheticHelperGenerator helperGenerator,
34
+			JavaSourceImporter importer,
35
+			JavaSourceContext context,
36 36
 			JavaClass cls,
37 37
 			TypeScope semanticScope,
38 38
 			boolean isInterface,
39
-			TypeID thisType,
40
-			JavaSourceContext context)
39
+			TypeID thisType)
41 40
 	{
42 41
 		this.importer = importer;
43
-		this.helperGenerator = helperGenerator;
42
+		this.helperGenerator = context.helperGenerator;
44 43
 		this.cls = cls;
45 44
 		this.semanticScope = semanticScope;
46 45
 		this.isInterface = isInterface;

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

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

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

@@ -36,7 +36,7 @@ public class ParsedExpressionBinary extends ParsedExpression {
36 36
 	public IPartialExpression compile(ExpressionScope scope) throws CompileException {
37 37
 		Expression cLeft = left.compile(scope).eval();
38 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 41
 		Expression cRight = right.compile(innerScope).eval();
42 42
 		CallArguments arguments = new CallArguments(cRight);

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

@@ -93,7 +93,7 @@ public class ParsedExpressionFunction extends ParsedExpression {
93 93
 		}
94 94
 		
95 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 97
 				.stored(storage);
98 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,7 +57,7 @@ public class ParsedExpressionIndex extends ParsedExpression {
57 57
 		@Override
58 58
 		public Expression eval() throws CompileException {
59 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 61
 			Expression[] arguments = new Expression[indexes.size()];
62 62
 			for (int i = 0; i < arguments.length; i++)
63 63
 				arguments[i] = indexes.get(i).compile(scope.createInner(predictedTypes[i], this::getLength)).eval();
@@ -66,8 +66,8 @@ public class ParsedExpressionIndex extends ParsedExpression {
66 66
 		}
67 67
 
68 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 73
 		@Override
@@ -88,7 +88,7 @@ public class ParsedExpressionIndex extends ParsedExpression {
88 88
 		@Override
89 89
 		public Expression assign(CodePosition position, TypeScope scope, Expression value) throws CompileException {
90 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 93
 			Expression[] arguments = new Expression[indexes.size() + 1];
94 94
 			for (int i = 0; i < arguments.length - 1; i++)
@@ -101,7 +101,7 @@ public class ParsedExpressionIndex extends ParsedExpression {
101 101
 		@Override
102 102
 		public List<StoredType> getAssignHints() {
103 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 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,11 +40,11 @@ public class ParsedExpressionOpAssign extends ParsedExpression {
40 40
 		TypeMemberGroup members = typeMembers.getOrCreateGroup(operator);
41 41
 		if (members.getMethodMembers().isEmpty()) {
42 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 44
 			Expression value = members.call(position, scope, cLeft, new CallArguments(cRight), false);
45 45
 			return cLeft.assign(position, scope, value);
46 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 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,8 +19,6 @@ import org.openzen.zenscript.codemodel.partial.IPartialExpression;
19 19
 import org.openzen.zenscript.codemodel.type.member.TypeMemberGroup;
20 20
 import org.openzen.zenscript.codemodel.scope.ExpressionScope;
21 21
 import org.openzen.zenscript.codemodel.type.StoredType;
22
-import org.openzen.zenscript.codemodel.type.member.BuiltinID;
23
-import org.openzen.zenscript.codemodel.type.member.TypeMember;
24 22
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
25 23
 import org.openzen.zenscript.parser.type.IParsedType;
26 24
 
@@ -59,7 +57,7 @@ public class ParsedNewExpression extends ParsedExpression{
59 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 61
 			CallArguments compiledArguments = arguments.compileCall(position, scope, null, constructors);
64 62
 			FunctionalMemberRef member = constructors.selectMethod(position, scope, compiledArguments, true, true);
65 63
 			if (member == null)
@@ -72,7 +70,7 @@ public class ParsedNewExpression extends ParsedExpression{
72 70
 					type,
73 71
 					member,
74 72
 					compiledArguments,
75
-					member.getHeader().fillGenericArguments(scope, compiledArguments.typeArguments));
73
+					member.getHeader().fillGenericArguments(position, scope, compiledArguments.typeArguments));
76 74
 		} catch (CompileException ex) {
77 75
 			return new InvalidExpression(type, ex);
78 76
 		}

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

@@ -71,7 +71,7 @@ public abstract class ParsedFunctionalMember extends ParsedDefinitionMember {
71 71
 		
72 72
 		inferHeaders(scope);
73 73
 		
74
-		FunctionScope innerScope = new FunctionScope(scope, getCompiled().header);
74
+		FunctionScope innerScope = new FunctionScope(position, scope, getCompiled().header);
75 75
 		getCompiled().annotations = ParsedAnnotation.compileForMember(annotations, getCompiled(), scope);
76 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,7 +99,7 @@ public class ParsedGetter extends ParsedDefinitionMember {
99 99
 		inferHeaders(scope);
100 100
 		
101 101
 		FunctionHeader header = new FunctionHeader(compiled.getType());
102
-		FunctionScope innerScope = new FunctionScope(scope, header);
102
+		FunctionScope innerScope = new FunctionScope(position, scope, header);
103 103
 		compiled.annotations = ParsedAnnotation.compileForMember(annotations, getCompiled(), scope);
104 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,7 +64,7 @@ public class ParsedIterator extends ParsedDefinitionMember {
64 64
 	@Override
65 65
 	public void compile(BaseScope scope) {
66 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 68
 		compiled.annotations = ParsedAnnotation.compileForMember(annotations, compiled, scope);
69 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,6 +97,7 @@ public class ParsedSetter extends ParsedDefinitionMember {
97 97
 		
98 98
 		FunctionHeader header = new FunctionHeader(compiled.getType());
99 99
 		FunctionScope innerScope = new FunctionScope(
100
+				position,
100 101
 				scope,
101 102
 				header,
102 103
 				position -> new GetFunctionParameterExpression(position, compiled.parameter));

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

@@ -45,6 +45,6 @@ public class ParsedStaticInitializer extends ParsedDefinitionMember {
45 45
 	@Override
46 46
 	public void compile(BaseScope scope) {
47 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,5 +18,5 @@ dependencies {
18 18
 	compile project(':JavaBytecodeCompiler')
19 19
 	compile project(':JavaShared')
20 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,26 +0,0 @@
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,131 +0,0 @@
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

@@ -0,0 +1,21 @@
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,148 +1,43 @@
1 1
 package org.openzen.zenscript.scriptingexample;
2 2
 
3 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 5
 import java.util.Optional;
6
+import org.openzen.zencode.java.JavaNativeModule;
7
+import org.openzen.zencode.java.ScriptingEngine;
10 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zencode.shared.CompileException;
10
+import org.openzen.zencode.shared.FileSourceFile;
11 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 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 13
 import org.openzen.zenscript.lexer.ParseException;
29 14
 import org.openzen.zenscript.lexer.ZSToken;
30 15
 import org.openzen.zenscript.lexer.ZSTokenParser;
31 16
 import org.openzen.zenscript.lexer.ZSTokenType;
32 17
 import org.openzen.zenscript.parser.BracketExpressionParser;
33
-import org.openzen.zenscript.parser.ParsedFile;
34 18
 import org.openzen.zenscript.parser.expression.ParsedExpression;
35 19
 import org.openzen.zenscript.parser.expression.ParsedExpressionString;
36 20
 
37 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 29
 		File inputDirectory = new File("scripts");
45 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 43
 	private static class TestBracketParser implements BracketExpressionParser {

Loading…
Cancel
Save