Browse Source

- Improving compilation system to have compilation targets

- Added run & build functionality to the IDE
- Fixed an error in match expressions
- WIP on compiling to Java source files
Stan Hebben 6 years ago
parent
commit
4987a05c10
53 changed files with 1523 additions and 54 deletions
  1. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/FunctionHeader.java
  2. 7
    3
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/definition/ZSPackage.java
  3. 20
    0
      CompilerShared/build.gradle
  4. 24
    0
      CompilerShared/src/main/java/org/openzen/zenscript/compiler/CompilerOutput.java
  5. 3
    6
      CompilerShared/src/main/java/org/openzen/zenscript/compiler/SemanticModule.java
  6. 22
    0
      CompilerShared/src/main/java/org/openzen/zenscript/compiler/Target.java
  7. 17
    0
      CompilerShared/src/main/java/org/openzen/zenscript/compiler/TargetType.java
  8. 23
    0
      CompilerShared/src/main/java/org/openzen/zenscript/compiler/ZenCodeCompiler.java
  9. 3
    0
      Constructor/build.gradle
  10. 3
    3
      Constructor/libraries/stdlib/src/Arrays.zs
  11. 37
    0
      Constructor/src/main/java/org/openzen/zenscript/constructor/ConstructorRegistry.java
  12. 1
    1
      Constructor/src/main/java/org/openzen/zenscript/constructor/Module.java
  13. 1
    1
      Constructor/src/main/java/org/openzen/zenscript/constructor/ModuleLoader.java
  14. 21
    0
      Constructor/src/main/java/org/openzen/zenscript/constructor/Project.java
  15. 2
    1
      Constructor/src/main/java/org/openzen/zenscript/constructor/module/DirectoryModuleLoader.java
  16. 2
    0
      Constructor/src/main/java/org/openzen/zenscript/constructor/module/ModuleReference.java
  17. 4
    3
      Constructor/src/main/java/org/openzen/zenscript/constructor/module/ModuleSpace.java
  18. 38
    0
      DrawableGui/src/main/java/org/openzen/drawablegui/DCompositeIcon.java
  19. 82
    0
      DrawableGui/src/main/java/org/openzen/drawablegui/DInputField.java
  20. 45
    0
      DrawableGui/src/main/java/org/openzen/drawablegui/DInputFieldStyle.java
  21. 7
    5
      DrawableGui/src/main/java/org/openzen/drawablegui/DUIWindow.java
  22. 110
    0
      DrawableGui/src/main/java/org/openzen/drawablegui/form/DForm.java
  23. 22
    0
      DrawableGui/src/main/java/org/openzen/drawablegui/form/DFormComponent.java
  24. 41
    0
      DrawableGui/src/main/java/org/openzen/drawablegui/form/DFormStyle.java
  25. 24
    0
      DrawableGui/src/main/java/org/openzen/drawablegui/live/LiveString.java
  26. 40
    0
      DrawableGui/src/main/java/org/openzen/drawablegui/live/SimpleLiveString.java
  27. 14
    0
      DrawableGui/src/main/java/org/openzen/drawablegui/swing/SwingWindow.java
  28. 1
    1
      IDE/src/main/java/org/openzen/zenscript/ide/Main.java
  29. 2
    0
      IDE/src/main/java/org/openzen/zenscript/ide/host/DevelopmentHost.java
  30. 22
    0
      IDE/src/main/java/org/openzen/zenscript/ide/host/IDETarget.java
  31. 12
    0
      IDE/src/main/java/org/openzen/zenscript/ide/host/local/LocalProjectDevelopmentHost.java
  32. 90
    0
      IDE/src/main/java/org/openzen/zenscript/ide/host/local/LocalTarget.java
  33. 22
    6
      IDE/src/main/java/org/openzen/zenscript/ide/ui/IDEWindow.java
  34. 2
    2
      IDE/src/main/java/org/openzen/zenscript/ide/ui/view/TabbedView.java
  35. 1
    11
      IDE/src/main/java/org/openzen/zenscript/ide/ui/view/TabbedViewStyle.java
  36. 1
    1
      IDE/src/main/java/org/openzen/zenscript/ide/ui/view/TabbedViewTabStyle.java
  37. 1
    0
      JavaBytecodeCompiler/build.gradle
  38. 51
    0
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeJarTarget.java
  39. 26
    0
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeJarTargetType.java
  40. 51
    0
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeRunTarget.java
  41. 26
    0
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeRunTargetType.java
  42. 19
    2
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaCompiler.java
  43. 19
    0
      JavaSourceCompiler/build.gradle
  44. 148
    0
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaDefinitionVisitor.java
  45. 84
    0
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceCompiler.java
  46. 79
    0
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceFile.java
  47. 41
    0
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceObjectTypeVisitor.java
  48. 53
    0
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceTarget.java
  49. 26
    0
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceTargetType.java
  50. 125
    0
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceTypeVisitor.java
  51. 1
    1
      Parser/src/main/java/org/openzen/zenscript/parser/expression/ParsedMatchExpression.java
  52. 2
    2
      ScriptingExample/src/main/java/org/openzen/zenscript/scriptingexample/GlobalRegistry.java
  53. 4
    4
      ScriptingExample/src/main/java/org/openzen/zenscript/scriptingexample/Main.java

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

265
 	@Override
265
 	@Override
266
 	public String toString() {
266
 	public String toString() {
267
 		StringBuilder result = new StringBuilder();
267
 		StringBuilder result = new StringBuilder();
268
-		if (typeParameters.length > 0) {
268
+		if (typeParameters != null && typeParameters.length > 0) {
269
 			result.append("<");
269
 			result.append("<");
270
 			for (int i = 0; i < typeParameters.length; i++) {
270
 			for (int i = 0; i < typeParameters.length; i++) {
271
 				if (i > 0)
271
 				if (i > 0)

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

25
  * @author Hoofdgebruiker
25
  * @author Hoofdgebruiker
26
  */
26
  */
27
 public class ZSPackage {
27
 public class ZSPackage {
28
+	public final String name;
28
 	public final String fullName;
29
 	public final String fullName;
30
+	public final ZSPackage parent;
29
 	
31
 	
30
-	public ZSPackage(String fullName) {
31
-		this.fullName = fullName;
32
+	public ZSPackage(ZSPackage parent, String name) {
33
+		this.parent = parent;
34
+		this.name = name;
35
+		this.fullName = parent == null ? name : parent.fullName + "." + name;
32
 	}
36
 	}
33
 	
37
 	
34
 	private final Map<String, ZSPackage> subPackages = new HashMap<>();
38
 	private final Map<String, ZSPackage> subPackages = new HashMap<>();
116
 		if (subPackages.containsKey(name))
120
 		if (subPackages.containsKey(name))
117
 			return subPackages.get(name);
121
 			return subPackages.get(name);
118
 		
122
 		
119
-		ZSPackage result = new ZSPackage(fullName.isEmpty() ? name : fullName + '.' + name);
123
+		ZSPackage result = new ZSPackage(this, name);
120
 		subPackages.put(name, result);
124
 		subPackages.put(name, result);
121
 		return result;
125
 		return result;
122
 	}
126
 	}

+ 20
- 0
CompilerShared/build.gradle View File

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

+ 24
- 0
CompilerShared/src/main/java/org/openzen/zenscript/compiler/CompilerOutput.java View File

1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.compiler;
7
+
8
+import org.openzen.zenscript.shared.CodePosition;
9
+
10
+/**
11
+ *
12
+ * @author Hoofdgebruiker
13
+ */
14
+public interface CompilerOutput {
15
+	void info(String message);
16
+	
17
+	void warning(String message);
18
+	
19
+	void warning(CodePosition position, String message);
20
+	
21
+	void error(String message);
22
+	
23
+	void error(CodePosition position, String message);
24
+}

Constructor/src/main/java/org/openzen/zenscript/constructor/module/SemanticModule.java → CompilerShared/src/main/java/org/openzen/zenscript/compiler/SemanticModule.java View File

3
  * To change this template file, choose Tools | Templates
3
  * To change this template file, choose Tools | Templates
4
  * and open the template in the editor.
4
  * and open the template in the editor.
5
  */
5
  */
6
-package org.openzen.zenscript.constructor.module;
6
+package org.openzen.zenscript.compiler;
7
 
7
 
8
 import java.util.HashMap;
8
 import java.util.HashMap;
9
 import java.util.List;
9
 import java.util.List;
12
 import org.openzen.zenscript.codemodel.PackageDefinitions;
12
 import org.openzen.zenscript.codemodel.PackageDefinitions;
13
 import org.openzen.zenscript.codemodel.ScriptBlock;
13
 import org.openzen.zenscript.codemodel.ScriptBlock;
14
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
14
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
15
-import org.openzen.zenscript.javabytecode.JavaCompiler;
16
-import org.openzen.zenscript.javabytecode.JavaModule;
17
 import org.openzen.zenscript.linker.symbol.ISymbol;
15
 import org.openzen.zenscript.linker.symbol.ISymbol;
18
 
16
 
19
 /**
17
 /**
34
 		this.scripts = scripts;
32
 		this.scripts = scripts;
35
 	}
33
 	}
36
 	
34
 	
37
-	public JavaModule compileToJava() {
38
-		JavaCompiler compiler = new JavaCompiler(false);
35
+	public void compile(ZenCodeCompiler compiler) {
39
 		for (HighLevelDefinition definition : definitions.getAll()) {
36
 		for (HighLevelDefinition definition : definitions.getAll()) {
40
 			compiler.addDefinition(definition);
37
 			compiler.addDefinition(definition);
41
 		}
38
 		}
42
 		for (ScriptBlock script : scripts) {
39
 		for (ScriptBlock script : scripts) {
43
 			compiler.addScriptBlock(script);
40
 			compiler.addScriptBlock(script);
44
 		}
41
 		}
45
-		return compiler.finish();
42
+		compiler.finish();
46
 	}
43
 	}
47
 }
44
 }

+ 22
- 0
CompilerShared/src/main/java/org/openzen/zenscript/compiler/Target.java View File

1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.compiler;
7
+
8
+/**
9
+ *
10
+ * @author Hoofdgebruiker
11
+ */
12
+public interface Target {
13
+	public ZenCodeCompiler createCompiler(SemanticModule module);
14
+	
15
+	public String getModule();
16
+	
17
+	public String getName();
18
+	
19
+	public boolean canRun();
20
+	
21
+	public boolean canBuild();
22
+}

+ 17
- 0
CompilerShared/src/main/java/org/openzen/zenscript/compiler/TargetType.java View File

1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.compiler;
7
+
8
+import java.io.File;
9
+import org.json.JSONObject;
10
+
11
+/**
12
+ *
13
+ * @author Hoofdgebruiker
14
+ */
15
+public interface TargetType {
16
+	public Target create(File projectDir, JSONObject definition);
17
+}

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

1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.compiler;
7
+
8
+import org.openzen.zenscript.codemodel.HighLevelDefinition;
9
+import org.openzen.zenscript.codemodel.ScriptBlock;
10
+
11
+/**
12
+ *
13
+ * @author Hoofdgebruiker
14
+ */
15
+public interface ZenCodeCompiler {
16
+	void addDefinition(HighLevelDefinition definition);
17
+	
18
+	void addScriptBlock(ScriptBlock script);
19
+	
20
+	void finish();
21
+	
22
+	void run();
23
+}

+ 3
- 0
Constructor/build.gradle View File

17
 	compile 'org.json:json:20180130'
17
 	compile 'org.json:json:20180130'
18
 	compile project(':CodeModel')
18
 	compile project(':CodeModel')
19
 	compile project(':Parser')
19
 	compile project(':Parser')
20
+	compile project(':Linker')
20
 	compile project(':Validator')
21
 	compile project(':Validator')
22
+	compile project(':CompilerShared')
21
 	compile project(':JavaBytecodeCompiler')
23
 	compile project(':JavaBytecodeCompiler')
24
+	compile project(':JavaSourceCompiler')
22
 }
25
 }

+ 3
- 3
Constructor/libraries/stdlib/src/Arrays.zs View File

104
 		return null;
104
 		return null;
105
 	}
105
 	}
106
 	
106
 	
107
-	public last(predicate as function(value as T) as bool) as T? {
107
+	public last(predicate as function(index as int, value as T) as bool) as T? {
108
 		for i, value in this.reversed
108
 		for i, value in this.reversed
109
-			if predicate(value)
110
-				return value
109
+			if predicate(i, value)
110
+				return value;
111
 		
111
 		
112
 		return null;
112
 		return null;
113
 	}
113
 	}

+ 37
- 0
Constructor/src/main/java/org/openzen/zenscript/constructor/ConstructorRegistry.java View File

1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.constructor;
7
+
8
+import java.util.HashMap;
9
+import java.util.Map;
10
+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;
14
+
15
+/**
16
+ *
17
+ * @author Hoofdgebruiker
18
+ */
19
+public class ConstructorRegistry {
20
+	private static final Map<String, TargetType> targetTypes = new HashMap<>();
21
+	
22
+	static {
23
+		registerTargetType("javaSource", JavaSourceTargetType.INSTANCE);
24
+		registerTargetType("javaBytecodeJar", JavaBytecodeJarTargetType.INSTANCE);
25
+		registerTargetType("javaBytecodeRun", JavaBytecodeRunTargetType.INSTANCE);
26
+	}
27
+	
28
+	public static void registerTargetType(String name, TargetType type) {
29
+		targetTypes.put(name, type);
30
+	}
31
+	
32
+	public static TargetType getTargetType(String name) {
33
+		return targetTypes.get(name);
34
+	}
35
+
36
+	private ConstructorRegistry() {}
37
+}

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

21
 import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
21
 import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
22
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
22
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
23
 import org.openzen.zenscript.constructor.module.ModuleSpace;
23
 import org.openzen.zenscript.constructor.module.ModuleSpace;
24
-import org.openzen.zenscript.constructor.module.SemanticModule;
24
+import org.openzen.zenscript.compiler.SemanticModule;
25
 import org.openzen.zenscript.linker.symbol.ISymbol;
25
 import org.openzen.zenscript.linker.symbol.ISymbol;
26
 import org.openzen.zenscript.parser.ParsedFile;
26
 import org.openzen.zenscript.parser.ParsedFile;
27
 import org.openzen.zenscript.shared.CompileException;
27
 import org.openzen.zenscript.shared.CompileException;

+ 1
- 1
Constructor/src/main/java/org/openzen/zenscript/constructor/ModuleLoader.java View File

10
 import java.util.Map;
10
 import java.util.Map;
11
 import java.util.Stack;
11
 import java.util.Stack;
12
 import org.openzen.zenscript.constructor.module.ModuleReference;
12
 import org.openzen.zenscript.constructor.module.ModuleReference;
13
-import org.openzen.zenscript.constructor.module.SemanticModule;
13
+import org.openzen.zenscript.compiler.SemanticModule;
14
 
14
 
15
 /**
15
 /**
16
  *
16
  *

+ 21
- 0
Constructor/src/main/java/org/openzen/zenscript/constructor/Project.java View File

7
 
7
 
8
 import java.io.File;
8
 import java.io.File;
9
 import java.io.IOException;
9
 import java.io.IOException;
10
+import java.util.ArrayList;
11
+import java.util.List;
10
 import org.json.JSONArray;
12
 import org.json.JSONArray;
11
 import org.json.JSONObject;
13
 import org.json.JSONObject;
12
 import org.openzen.zenscript.constructor.module.DirectoryModuleLoader;
14
 import org.openzen.zenscript.constructor.module.DirectoryModuleLoader;
13
 import org.openzen.zenscript.constructor.module.ModuleReference;
15
 import org.openzen.zenscript.constructor.module.ModuleReference;
16
+import org.openzen.zenscript.compiler.Target;
17
+import org.openzen.zenscript.compiler.TargetType;
14
 
18
 
15
 /**
19
 /**
16
  *
20
  *
17
  * @author Hoofdgebruiker
21
  * @author Hoofdgebruiker
18
  */
22
  */
19
 public class Project {
23
 public class Project {
24
+	public final File directory;
20
 	public final String name;
25
 	public final String name;
21
 	public final ModuleReference[] modules;
26
 	public final ModuleReference[] modules;
22
 	public final Library[] libraries;
27
 	public final Library[] libraries;
28
+	public final Target[] targets;
23
 	
29
 	
24
 	public Project(ModuleLoader loader, File directory) throws IOException {
30
 	public Project(ModuleLoader loader, File directory) throws IOException {
31
+		this.directory = directory;
25
 		name = directory.getName();
32
 		name = directory.getName();
26
 		
33
 		
27
 		if (!directory.exists())
34
 		if (!directory.exists())
61
 				}
68
 				}
62
 			}
69
 			}
63
 		}
70
 		}
71
+		
72
+		JSONArray jsonTargets = json.getJSONArray("targets");
73
+		List<Target> targetList = new ArrayList<>();
74
+		for (int i = 0; i < jsonTargets.length(); i++) {
75
+			JSONObject jsonTarget = jsonTargets.getJSONObject(i);
76
+			TargetType targetType = ConstructorRegistry.getTargetType(jsonTarget.getString("type"));
77
+			if (targetType == null) {
78
+				System.out.println("Unknown target type: " + jsonTarget.getString("type"));
79
+				continue;
80
+			}
81
+			
82
+			targetList.add(targetType.create(directory, jsonTarget));
83
+		}
84
+		targets = targetList.toArray(new Target[targetList.size()]);
64
 	}
85
 	}
65
 }
86
 }

+ 2
- 1
Constructor/src/main/java/org/openzen/zenscript/constructor/module/DirectoryModuleLoader.java View File

5
  */
5
  */
6
 package org.openzen.zenscript.constructor.module;
6
 package org.openzen.zenscript.constructor.module;
7
 
7
 
8
+import org.openzen.zenscript.compiler.SemanticModule;
8
 import java.io.File;
9
 import java.io.File;
9
 import java.io.IOException;
10
 import java.io.IOException;
10
 import java.util.ArrayList;
11
 import java.util.ArrayList;
70
 				space.addModule(dependencyName, loader.getModule(dependencyName));
71
 				space.addModule(dependencyName, loader.getModule(dependencyName));
71
 
72
 
72
 			Module module = new Module(moduleName, directory, jsonFile);
73
 			Module module = new Module(moduleName, directory, jsonFile);
73
-			ZSPackage pkg = new ZSPackage(module.packageName);
74
+			ZSPackage pkg = new ZSPackage(null, module.packageName);
74
 
75
 
75
 			ParsedFile[] parsedFiles = module.parse(pkg);
76
 			ParsedFile[] parsedFiles = module.parse(pkg);
76
 			SemanticModule result = Module.compileSyntaxToSemantic(pkg, parsedFiles, space);
77
 			SemanticModule result = Module.compileSyntaxToSemantic(pkg, parsedFiles, space);

+ 2
- 0
Constructor/src/main/java/org/openzen/zenscript/constructor/module/ModuleReference.java View File

5
  */
5
  */
6
 package org.openzen.zenscript.constructor.module;
6
 package org.openzen.zenscript.constructor.module;
7
 
7
 
8
+import org.openzen.zenscript.compiler.SemanticModule;
9
+
8
 /**
10
 /**
9
  *
11
  *
10
  * @author Hoofdgebruiker
12
  * @author Hoofdgebruiker

+ 4
- 3
Constructor/src/main/java/org/openzen/zenscript/constructor/module/ModuleSpace.java View File

5
  */
5
  */
6
 package org.openzen.zenscript.constructor.module;
6
 package org.openzen.zenscript.constructor.module;
7
 
7
 
8
+import org.openzen.zenscript.compiler.SemanticModule;
8
 import java.util.ArrayList;
9
 import java.util.ArrayList;
9
 import java.util.HashMap;
10
 import java.util.HashMap;
10
 import java.util.List;
11
 import java.util.List;
20
  * @author Hoofdgebruiker
21
  * @author Hoofdgebruiker
21
  */
22
  */
22
 public class ModuleSpace {
23
 public class ModuleSpace {
23
-	private final ZSPackage rootPackage = new ZSPackage("");
24
-	private final ZSPackage stdlib = new ZSPackage("");
24
+	private final ZSPackage rootPackage = new ZSPackage(null, "");
25
+	private final ZSPackage stdlib = new ZSPackage(null, "stdlib");
25
 	public final GlobalTypeRegistry typeRegistry = new GlobalTypeRegistry(stdlib);
26
 	public final GlobalTypeRegistry typeRegistry = new GlobalTypeRegistry(stdlib);
26
-	public final ZSPackage globalsPackage = new ZSPackage("");
27
+	public final ZSPackage globalsPackage = new ZSPackage(null, "");
27
 	private final List<ExpansionDefinition> expansions = new ArrayList<>();
28
 	private final List<ExpansionDefinition> expansions = new ArrayList<>();
28
 	private final Map<String, ISymbol> globals = new HashMap<>();
29
 	private final Map<String, ISymbol> globals = new HashMap<>();
29
 	
30
 	

+ 38
- 0
DrawableGui/src/main/java/org/openzen/drawablegui/DCompositeIcon.java View File

1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.drawablegui;
7
+
8
+/**
9
+ *
10
+ * @author Hoofdgebruiker
11
+ */
12
+public class DCompositeIcon implements DColorableIcon {
13
+	private final DColorableIcon base;
14
+	private final DColorableIcon addition;
15
+	private final DTransform2D additionTransform;
16
+	
17
+	public DCompositeIcon(DColorableIcon base, DColorableIcon addition, DTransform2D additionTransform) {
18
+		this.base = base;
19
+		this.addition = addition;
20
+		this.additionTransform = additionTransform;
21
+	}
22
+
23
+	@Override
24
+	public void draw(DCanvas canvas, DTransform2D transform, int color) {
25
+		base.draw(canvas, transform, color);
26
+		addition.draw(canvas, transform.mul(additionTransform), color);
27
+	}
28
+
29
+	@Override
30
+	public float getNominalWidth() {
31
+		return base.getNominalWidth();
32
+	}
33
+
34
+	@Override
35
+	public float getNominalHeight() {
36
+		return base.getNominalHeight();
37
+	}
38
+}

+ 82
- 0
DrawableGui/src/main/java/org/openzen/drawablegui/DInputField.java View File

1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.drawablegui;
7
+
8
+import org.openzen.drawablegui.listeners.ListenerHandle;
9
+import org.openzen.drawablegui.live.LiveObject;
10
+import org.openzen.drawablegui.live.LiveString;
11
+import org.openzen.drawablegui.live.SimpleLiveObject;
12
+import org.openzen.drawablegui.style.DStyleClass;
13
+import org.openzen.drawablegui.style.DStylePath;
14
+
15
+/**
16
+ *
17
+ * @author Hoofdgebruiker
18
+ */
19
+public class DInputField implements DComponent {
20
+	public final LiveString value;
21
+	private final ListenerHandle<LiveString.Listener> valueListener;
22
+	
23
+	private final DStyleClass styleClass;
24
+	private final LiveObject<DDimensionPreferences> dimensionPreferences = new SimpleLiveObject<>(DDimensionPreferences.EMPTY);
25
+	private DIRectangle bounds = DIRectangle.EMPTY;
26
+	
27
+	private DUIContext context;
28
+	private DInputFieldStyle style;
29
+	private DFontMetrics fontMetrics;
30
+	private int cursorFrom = -1;
31
+	private int cursorTo = -1;
32
+	
33
+	public DInputField(DStyleClass styleClass, LiveString value) {
34
+		this.styleClass = styleClass;
35
+		this.value = value;
36
+		valueListener = value.addListener((oldValue, newValue) -> handleValueUpdated(newValue));
37
+	}
38
+
39
+	@Override
40
+	public void setContext(DStylePath parent, DUIContext context) {
41
+		this.context = context;
42
+		
43
+		DStylePath path = parent.getChild("input", styleClass);
44
+		style = new DInputFieldStyle(context.getStylesheets().get(context, path));
45
+		fontMetrics = context.getFontMetrics(style.font);
46
+	}
47
+
48
+	@Override
49
+	public LiveObject<DDimensionPreferences> getDimensionPreferences() {
50
+		return dimensionPreferences;
51
+	}
52
+
53
+	@Override
54
+	public DIRectangle getBounds() {
55
+		return bounds;
56
+	}
57
+
58
+	@Override
59
+	public void setBounds(DIRectangle bounds) {
60
+		this.bounds = bounds;
61
+	}
62
+
63
+	@Override
64
+	public void paint(DCanvas canvas) {
65
+		canvas.fillRectangle(bounds.x, bounds.y, bounds.width, bounds.height, style.backgroundColor);
66
+		canvas.drawText(style.font, style.color, bounds.x + style.paddingLeft, bounds.y + style.paddingBottom, value.getValue());
67
+	}
68
+
69
+	@Override
70
+	public void close() {
71
+		valueListener.close();
72
+	}
73
+	
74
+	@Override
75
+	public void onMouseClick(DMouseEvent e) {
76
+		context.focus(this);
77
+	}
78
+	
79
+	private void handleValueUpdated(String newValue) {
80
+		
81
+	}
82
+}

+ 45
- 0
DrawableGui/src/main/java/org/openzen/drawablegui/DInputFieldStyle.java View File

1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.drawablegui;
7
+
8
+import org.openzen.drawablegui.style.DDpDimension;
9
+import org.openzen.drawablegui.style.DStyleDefinition;
10
+
11
+/**
12
+ *
13
+ * @author Hoofdgebruiker
14
+ */
15
+public class DInputFieldStyle {
16
+	public final int backgroundColor;
17
+	public final int paddingTop;
18
+	public final int paddingLeft;
19
+	public final int paddingRight;
20
+	public final int paddingBottom;
21
+	
22
+	public final int color;
23
+	public final DFont font;
24
+	
25
+	public final int cursorColor;
26
+	public final int cursorWidth;
27
+	
28
+	public final int selectionColor;
29
+	
30
+	public DInputFieldStyle(DStyleDefinition style) {
31
+		backgroundColor = style.getColor("backgroundColor", 0);
32
+		paddingTop = style.getDimension("paddingTop", new DDpDimension(2));
33
+		paddingBottom = style.getDimension("paddingBottom", new DDpDimension(2));
34
+		paddingLeft = style.getDimension("paddingLeft", new DDpDimension(2));
35
+		paddingRight = style.getDimension("paddingRight", new DDpDimension(2));
36
+		
37
+		color = style.getColor("color", 0xFF000000);
38
+		font = style.getFont("font", context -> new DFont(DFontFamily.UI, false, false, false, (int)(14 * context.getScale())));
39
+		
40
+		cursorColor = style.getColor("cursorColor", 0xFF000000);
41
+		cursorWidth = style.getDimension("cursorWidth", new DDpDimension(1));
42
+		
43
+		selectionColor = style.getColor("selectionColor", 0xFFB0C5E3);
44
+	}
45
+}

+ 7
- 5
DrawableGui/src/main/java/org/openzen/drawablegui/DUIWindow.java View File

13
  * @author Hoofdgebruiker
13
  * @author Hoofdgebruiker
14
  */
14
  */
15
 public interface DUIWindow {
15
 public interface DUIWindow {
16
-	public boolean hasTitleBar();
16
+	boolean hasTitleBar();
17
 	
17
 	
18
-	public void close();
18
+	void close();
19
 	
19
 	
20
-	public void maximize();
20
+	void maximize();
21
 	
21
 	
22
-	public void restore();
22
+	void restore();
23
 	
23
 	
24
-	public void minimize();
24
+	void minimize();
25
 	
25
 	
26
 	LiveObject<State> getWindowState();
26
 	LiveObject<State> getWindowState();
27
 	
27
 	
28
 	LiveBool getActive();
28
 	LiveBool getActive();
29
 	
29
 	
30
+	DUIWindow openModal(String title, DComponent root);
31
+	
30
 	enum State {
32
 	enum State {
31
 		NORMAL,
33
 		NORMAL,
32
 		MAXIMIZED,
34
 		MAXIMIZED,

+ 110
- 0
DrawableGui/src/main/java/org/openzen/drawablegui/form/DForm.java View File

1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.drawablegui.form;
7
+
8
+import org.openzen.drawablegui.DCanvas;
9
+import org.openzen.drawablegui.DComponent;
10
+import org.openzen.drawablegui.DDimensionPreferences;
11
+import org.openzen.drawablegui.DFontMetrics;
12
+import org.openzen.drawablegui.DIRectangle;
13
+import org.openzen.drawablegui.DUIContext;
14
+import org.openzen.drawablegui.live.LiveObject;
15
+import org.openzen.drawablegui.live.SimpleLiveObject;
16
+import org.openzen.drawablegui.style.DStyleClass;
17
+import org.openzen.drawablegui.style.DStylePath;
18
+
19
+/**
20
+ *
21
+ * @author Hoofdgebruiker
22
+ */
23
+public class DForm implements DComponent {
24
+	private final DFormComponent[] components;
25
+	private final DStyleClass styleClass;
26
+	private final LiveObject<DDimensionPreferences> preferences = new SimpleLiveObject<>(DDimensionPreferences.EMPTY);
27
+	
28
+	private DIRectangle bounds;
29
+	private DUIContext context;
30
+	private DFormStyle style;
31
+	private DFontMetrics fontMetrics;
32
+	
33
+	public DForm(DStyleClass styleClass, DFormComponent... components) {
34
+		this.styleClass = styleClass;
35
+		this.components = components;
36
+	}
37
+
38
+	@Override
39
+	public void setContext(DStylePath parent, DUIContext context) {
40
+		this.context = context;
41
+		
42
+		DStylePath path = parent.getChild("form", styleClass);
43
+		style = new DFormStyle(context.getStylesheets().get(context, path));
44
+		fontMetrics = context.getFontMetrics(style.labelFont);
45
+		for (DFormComponent component : components)
46
+			component.component.setContext(path, context);
47
+		
48
+		int height = style.paddingBottom + style.paddingTop;
49
+		int maxTextWidth = style.minimumLabelSize;
50
+		int maxComponentWidth = style.minimumFieldSize;
51
+		
52
+		for (DFormComponent component : components) {
53
+			maxTextWidth = Math.max(maxTextWidth, fontMetrics.getWidth(component.label));
54
+			int componentWidth = component.component.getDimensionPreferences().getValue().preferredWidth;
55
+			maxComponentWidth = Math.max(maxComponentWidth, componentWidth);
56
+		}
57
+		
58
+		for (DFormComponent component : components) {
59
+			height += component.component.getDimensionPreferences().getValue().preferredHeight;
60
+			height += style.spacing;
61
+		}
62
+		
63
+		preferences.setValue(new DDimensionPreferences(maxTextWidth + maxComponentWidth, height));
64
+	}
65
+
66
+	@Override
67
+	public LiveObject<DDimensionPreferences> getDimensionPreferences() {
68
+		return preferences;
69
+	}
70
+
71
+	@Override
72
+	public DIRectangle getBounds() {
73
+		return bounds;
74
+	}
75
+
76
+	@Override
77
+	public void setBounds(DIRectangle bounds) {
78
+		this.bounds = bounds;
79
+		layout();
80
+	}
81
+
82
+	@Override
83
+	public void paint(DCanvas canvas) {
84
+		for (DFormComponent component : components) {
85
+			
86
+		}
87
+	}
88
+
89
+	@Override
90
+	public void close() {
91
+		
92
+	}
93
+	
94
+	private void layout() {
95
+		int x = bounds.x + style.paddingLeft;
96
+		int y = bounds.y + style.paddingBottom;
97
+		int maxTextWidth = style.minimumLabelSize;
98
+		
99
+		for (DFormComponent component : components)
100
+			maxTextWidth = Math.max(maxTextWidth, fontMetrics.getWidth(component.label));
101
+		
102
+		for (DFormComponent component : components) {
103
+			int preferredHeight = component.component.getDimensionPreferences().getValue().preferredHeight;
104
+			DIRectangle componentBounds = new DIRectangle(x + maxTextWidth, y, bounds.width - maxTextWidth, preferredHeight);
105
+			component.component.setBounds(componentBounds);
106
+			
107
+			y += preferredHeight + style.spacing;
108
+		}
109
+	}
110
+}

+ 22
- 0
DrawableGui/src/main/java/org/openzen/drawablegui/form/DFormComponent.java View File

1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.drawablegui.form;
7
+
8
+import org.openzen.drawablegui.DComponent;
9
+
10
+/**
11
+ *
12
+ * @author Hoofdgebruiker
13
+ */
14
+public class DFormComponent {
15
+	public final String label;
16
+	public final DComponent component;
17
+	
18
+	public DFormComponent(String label, DComponent component) {
19
+		this.label = label;
20
+		this.component = component;
21
+	}
22
+}

+ 41
- 0
DrawableGui/src/main/java/org/openzen/drawablegui/form/DFormStyle.java View File

1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.drawablegui.form;
7
+
8
+import org.openzen.drawablegui.DFont;
9
+import org.openzen.drawablegui.DFontFamily;
10
+import org.openzen.drawablegui.style.DDpDimension;
11
+import org.openzen.drawablegui.style.DStyleDefinition;
12
+
13
+/**
14
+ *
15
+ * @author Hoofdgebruiker
16
+ */
17
+public class DFormStyle {
18
+	public final int paddingLeft;
19
+	public final int paddingTop;
20
+	public final int paddingRight;
21
+	public final int paddingBottom;
22
+	public final int spacing;
23
+	
24
+	public final int labelColor;
25
+	public final DFont labelFont;
26
+	public final int minimumLabelSize;
27
+	public final int minimumFieldSize;
28
+	
29
+	public DFormStyle(DStyleDefinition style) {
30
+		paddingLeft = style.getDimension("paddingLeft", new DDpDimension(16));
31
+		paddingTop = style.getDimension("paddingTop", new DDpDimension(16));
32
+		paddingRight = style.getDimension("paddingRight", new DDpDimension(16));
33
+		paddingBottom = style.getDimension("paddingBottom", new DDpDimension(16));
34
+		spacing = style.getDimension("spacing", new DDpDimension(8));
35
+		
36
+		labelColor = style.getColor("labelColor", 0xFF000000);
37
+		labelFont = style.getFont("labelFont", context -> new DFont(DFontFamily.UI, false, false, false, (int)(16 * context.getScale())));
38
+		minimumLabelSize = style.getDimension("minimumLabelSize", new DDpDimension(150));
39
+		minimumFieldSize = style.getDimension("minimumFieldSize", new DDpDimension(150));
40
+	}
41
+}

+ 24
- 0
DrawableGui/src/main/java/org/openzen/drawablegui/live/LiveString.java View File

1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.drawablegui.live;
7
+
8
+import org.openzen.drawablegui.listeners.ListenerHandle;
9
+
10
+/**
11
+ *
12
+ * @author Hoofdgebruiker
13
+ */
14
+public interface LiveString {
15
+	ListenerHandle<Listener> addListener(Listener listener);
16
+	
17
+	String getValue();
18
+	
19
+	void setValue(String value);
20
+	
21
+	interface Listener {
22
+		void onChanged(String oldValue, String newValue);
23
+	}
24
+}

+ 40
- 0
DrawableGui/src/main/java/org/openzen/drawablegui/live/SimpleLiveString.java View File

1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.drawablegui.live;
7
+
8
+import org.openzen.drawablegui.listeners.ListenerHandle;
9
+import org.openzen.drawablegui.listeners.ListenerList;
10
+
11
+/**
12
+ *
13
+ * @author Hoofdgebruiker
14
+ */
15
+public class SimpleLiveString implements LiveString {
16
+	private final ListenerList<Listener> listeners = new ListenerList<>();
17
+	
18
+	private String value;
19
+	
20
+	public SimpleLiveString(String value) {
21
+		this.value = value;
22
+	}
23
+
24
+	@Override
25
+	public ListenerHandle<Listener> addListener(Listener listener) {
26
+		return listeners.add(listener);
27
+	}
28
+
29
+	@Override
30
+	public String getValue() {
31
+		return value;
32
+	}
33
+
34
+	@Override
35
+	public void setValue(String value) {
36
+		String oldValue = this.value;
37
+		this.value = value;
38
+		listeners.accept(listener -> listener.onChanged(oldValue, value));
39
+	}
40
+}

+ 14
- 0
DrawableGui/src/main/java/org/openzen/drawablegui/swing/SwingWindow.java View File

12
 import java.awt.event.WindowStateListener;
12
 import java.awt.event.WindowStateListener;
13
 import javax.swing.JFrame;
13
 import javax.swing.JFrame;
14
 import org.openzen.drawablegui.DComponent;
14
 import org.openzen.drawablegui.DComponent;
15
+import org.openzen.drawablegui.DDimensionPreferences;
15
 import org.openzen.drawablegui.DUIContext;
16
 import org.openzen.drawablegui.DUIContext;
16
 import org.openzen.drawablegui.DUIWindow;
17
 import org.openzen.drawablegui.DUIWindow;
17
 import org.openzen.drawablegui.border.DCustomWindowBorder;
18
 import org.openzen.drawablegui.border.DCustomWindowBorder;
87
 	public LiveBool getActive() {
88
 	public LiveBool getActive() {
88
 		return active;
89
 		return active;
89
 	}
90
 	}
91
+	
92
+	@Override
93
+	public DUIWindow openModal(String title, DComponent component) {
94
+		SwingWindow result = new SwingWindow(title, component, false);
95
+		result.setResizable(false);
96
+		
97
+		DDimensionPreferences size = component.getDimensionPreferences().getValue();
98
+		result.setLocation(
99
+				getX() + (getWidth() - size.preferredWidth) / 2,
100
+				getY() + (getHeight() - size.preferredHeight) / 2);
101
+		result.setSize(size.preferredWidth, size.preferredHeight);
102
+		return result;
103
+	}
90
 
104
 
91
 	@Override
105
 	@Override
92
 	public void windowOpened(WindowEvent e) {
106
 	public void windowOpened(WindowEvent e) {

+ 1
- 1
IDE/src/main/java/org/openzen/zenscript/ide/Main.java View File

24
 		
24
 		
25
 		int pixelPerInch = java.awt.Toolkit.getDefaultToolkit().getScreenResolution();
25
 		int pixelPerInch = java.awt.Toolkit.getDefaultToolkit().getScreenResolution();
26
 		
26
 		
27
-		IDEWindow window = new IDEWindow();
27
+		IDEWindow window = new IDEWindow(host);
28
 		WindowView root = new WindowView(window, host);
28
 		WindowView root = new WindowView(window, host);
29
 		
29
 		
30
 		SwingWindow swingWindow = new SwingWindow("ZenCode IDE - " + host.getName(), root, false);
30
 		SwingWindow swingWindow = new SwingWindow("ZenCode IDE - " + host.getName(), root, false);

+ 2
- 0
IDE/src/main/java/org/openzen/zenscript/ide/host/DevelopmentHost.java View File

17
 	public LiveList<IDEModule> getModules();
17
 	public LiveList<IDEModule> getModules();
18
 	
18
 	
19
 	public LiveList<IDELibrary> getLibraries();
19
 	public LiveList<IDELibrary> getLibraries();
20
+	
21
+	public LiveList<IDETarget> getTargets();
20
 }
22
 }

+ 22
- 0
IDE/src/main/java/org/openzen/zenscript/ide/host/IDETarget.java View File

1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.ide.host;
7
+
8
+/**
9
+ *
10
+ * @author Hoofdgebruiker
11
+ */
12
+public interface IDETarget {
13
+	String getName();
14
+	
15
+	boolean canBuild();
16
+	
17
+	boolean canRun();
18
+	
19
+	void build();
20
+	
21
+	void run();
22
+}

+ 12
- 0
IDE/src/main/java/org/openzen/zenscript/ide/host/local/LocalProjectDevelopmentHost.java View File

11
 import org.openzen.zenscript.constructor.Library;
11
 import org.openzen.zenscript.constructor.Library;
12
 import org.openzen.zenscript.constructor.Project;
12
 import org.openzen.zenscript.constructor.Project;
13
 import org.openzen.zenscript.constructor.module.ModuleReference;
13
 import org.openzen.zenscript.constructor.module.ModuleReference;
14
+import org.openzen.zenscript.compiler.Target;
14
 import org.openzen.zenscript.ide.host.DevelopmentHost;
15
 import org.openzen.zenscript.ide.host.DevelopmentHost;
15
 import org.openzen.zenscript.ide.host.IDEModule;
16
 import org.openzen.zenscript.ide.host.IDEModule;
16
 import org.openzen.zenscript.ide.host.IDELibrary;
17
 import org.openzen.zenscript.ide.host.IDELibrary;
18
+import org.openzen.zenscript.ide.host.IDETarget;
17
 
19
 
18
 /**
20
 /**
19
  *
21
  *
23
 	private final Project project;
25
 	private final Project project;
24
 	private final LiveList<IDEModule> modules;
26
 	private final LiveList<IDEModule> modules;
25
 	private final LiveList<IDELibrary> libraries;
27
 	private final LiveList<IDELibrary> libraries;
28
+	private final LiveList<IDETarget> targets;
26
 	
29
 	
27
 	public LocalProjectDevelopmentHost(Project project) {
30
 	public LocalProjectDevelopmentHost(Project project) {
28
 		this.project = project;
31
 		this.project = project;
34
 		libraries = new LiveArrayList<>();
37
 		libraries = new LiveArrayList<>();
35
 		for (Library library : project.libraries)
38
 		for (Library library : project.libraries)
36
 			libraries.add(new LocalLibrary(library));
39
 			libraries.add(new LocalLibrary(library));
40
+		
41
+		targets = new LiveArrayList<>();
42
+		for (Target target : project.targets)
43
+			targets.add(new LocalTarget(project, target));
37
 	}
44
 	}
38
 	
45
 	
39
 	@Override
46
 	@Override
50
 	public LiveList<IDELibrary> getLibraries() {
57
 	public LiveList<IDELibrary> getLibraries() {
51
 		return libraries;
58
 		return libraries;
52
 	}
59
 	}
60
+
61
+	@Override
62
+	public LiveList<IDETarget> getTargets() {
63
+		return targets;
64
+	}
53
 }
65
 }

+ 90
- 0
IDE/src/main/java/org/openzen/zenscript/ide/host/local/LocalTarget.java View File

1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.ide.host.local;
7
+
8
+import java.io.File;
9
+import java.io.IOException;
10
+import org.openzen.zenscript.codemodel.HighLevelDefinition;
11
+import org.openzen.zenscript.codemodel.ScriptBlock;
12
+import org.openzen.zenscript.compiler.Target;
13
+import org.openzen.zenscript.compiler.ZenCodeCompiler;
14
+import org.openzen.zenscript.constructor.Library;
15
+import org.openzen.zenscript.constructor.ModuleLoader;
16
+import org.openzen.zenscript.constructor.Project;
17
+import org.openzen.zenscript.constructor.module.DirectoryModuleLoader;
18
+import org.openzen.zenscript.constructor.module.ModuleReference;
19
+import org.openzen.zenscript.compiler.SemanticModule;
20
+import org.openzen.zenscript.ide.host.IDETarget;
21
+
22
+/**
23
+ *
24
+ * @author Hoofdgebruiker
25
+ */
26
+public class LocalTarget implements IDETarget {
27
+	private final Project project;
28
+	private final Target target;
29
+	
30
+	public LocalTarget(Project project, Target target) {
31
+		this.project = project;
32
+		this.target = target;
33
+	}
34
+
35
+	@Override
36
+	public String getName() {
37
+		return target.getName();
38
+	}
39
+
40
+	@Override
41
+	public boolean canBuild() {
42
+		return target.canBuild();
43
+	}
44
+
45
+	@Override
46
+	public boolean canRun() {
47
+		return target.canRun();
48
+	}
49
+
50
+	@Override
51
+	public void build() {
52
+		buildInternal();
53
+	}
54
+
55
+	@Override
56
+	public void run() {
57
+		ZenCodeCompiler compiler = buildInternal();
58
+		if (compiler != null)
59
+			compiler.run();
60
+	}
61
+	
62
+	private ZenCodeCompiler buildInternal() {
63
+		ModuleLoader moduleLoader = new ModuleLoader();
64
+		moduleLoader.register("stdlib", new DirectoryModuleLoader(moduleLoader, "stdlib", new File("../Constructor/libraries/stdlib"), true));
65
+		
66
+		try {
67
+			Project project = new Project(moduleLoader, this.project.directory);
68
+			for (Library library : project.libraries) {
69
+				for (ModuleReference module : library.modules)
70
+					moduleLoader.register(module.getName(), module);
71
+			}
72
+			for (ModuleReference module : project.modules) {
73
+				moduleLoader.register(module.getName(), module);
74
+			}
75
+
76
+			SemanticModule module = moduleLoader.getModule(target.getModule());
77
+			ZenCodeCompiler compiler = target.createCompiler(module);
78
+			for (HighLevelDefinition definition : module.definitions.getAll())
79
+				compiler.addDefinition(definition);
80
+			for (ScriptBlock script : module.scripts)
81
+				compiler.addScriptBlock(script);
82
+			
83
+			compiler.finish();
84
+			return compiler;
85
+		} catch (IOException ex) {
86
+			ex.printStackTrace();
87
+			return null;
88
+		}
89
+	}
90
+}

+ 22
- 6
IDE/src/main/java/org/openzen/zenscript/ide/ui/IDEWindow.java View File

5
  */
5
  */
6
 package org.openzen.zenscript.ide.ui;
6
 package org.openzen.zenscript.ide.ui;
7
 
7
 
8
-import org.openzen.drawablegui.live.SimpleLiveBool;
9
 import org.openzen.drawablegui.style.DStyleClass;
8
 import org.openzen.drawablegui.style.DStyleClass;
9
+import org.openzen.zenscript.ide.host.DevelopmentHost;
10
 import org.openzen.zenscript.ide.host.IDESourceFile;
10
 import org.openzen.zenscript.ide.host.IDESourceFile;
11
+import org.openzen.zenscript.ide.host.IDETarget;
11
 import org.openzen.zenscript.ide.ui.icons.AddBoxIcon;
12
 import org.openzen.zenscript.ide.ui.icons.AddBoxIcon;
12
 import org.openzen.zenscript.ide.ui.icons.BuildIcon;
13
 import org.openzen.zenscript.ide.ui.icons.BuildIcon;
13
 import org.openzen.zenscript.ide.ui.icons.PlayIcon;
14
 import org.openzen.zenscript.ide.ui.icons.PlayIcon;
14
-import org.openzen.zenscript.ide.ui.icons.ProjectIcon;
15
 import org.openzen.zenscript.ide.ui.icons.SettingsIcon;
15
 import org.openzen.zenscript.ide.ui.icons.SettingsIcon;
16
 import org.openzen.zenscript.ide.ui.icons.ShadedProjectIcon;
16
 import org.openzen.zenscript.ide.ui.icons.ShadedProjectIcon;
17
 import org.openzen.zenscript.ide.ui.view.IconButtonControl;
17
 import org.openzen.zenscript.ide.ui.view.IconButtonControl;
21
  * @author Hoofdgebruiker
21
  * @author Hoofdgebruiker
22
  */
22
  */
23
 public class IDEWindow {
23
 public class IDEWindow {
24
+	private final DevelopmentHost host;
25
+	
24
 	public final IDEAspectBar aspectBar;
26
 	public final IDEAspectBar aspectBar;
25
 	public final IDEDockWindow dockWindow;
27
 	public final IDEDockWindow dockWindow;
26
 	public final IDEStatusBar statusBar;
28
 	public final IDEStatusBar statusBar;
27
 	
29
 	
28
 	public IDEAspectToolbar projectToolbar;
30
 	public IDEAspectToolbar projectToolbar;
29
 	
31
 	
30
-	public IDEWindow() {
32
+	public IDEWindow(DevelopmentHost host) {
33
+		this.host = host;
34
+		
31
 		aspectBar = new IDEAspectBar();
35
 		aspectBar = new IDEAspectBar();
32
 		dockWindow = new IDEDockWindow();
36
 		dockWindow = new IDEDockWindow();
33
 		statusBar = new IDEStatusBar();
37
 		statusBar = new IDEStatusBar();
34
 		init();
38
 		init();
35
 	}
39
 	}
36
 	
40
 	
37
-	public IDEWindow(IDEAspectBar aspectBar, IDEDockWindow dockWindow, IDEStatusBar statusBar) {
41
+	public IDEWindow(DevelopmentHost host, IDEAspectBar aspectBar, IDEDockWindow dockWindow, IDEStatusBar statusBar) {
42
+		this.host = host;
43
+		
38
 		this.aspectBar = aspectBar;
44
 		this.aspectBar = aspectBar;
39
 		this.dockWindow = dockWindow;
45
 		this.dockWindow = dockWindow;
40
 		this.statusBar = statusBar;
46
 		this.statusBar = statusBar;
49
 		projectToolbar = new IDEAspectToolbar(0, ShadedProjectIcon.PURPLE, "Project", "Project management");
55
 		projectToolbar = new IDEAspectToolbar(0, ShadedProjectIcon.PURPLE, "Project", "Project management");
50
 		projectToolbar.controls.add(() -> new IconButtonControl(DStyleClass.EMPTY, AddBoxIcon.ORANGE, e -> {}));
56
 		projectToolbar.controls.add(() -> new IconButtonControl(DStyleClass.EMPTY, AddBoxIcon.ORANGE, e -> {}));
51
 		projectToolbar.controls.add(() -> new IconButtonControl(DStyleClass.EMPTY, SettingsIcon.PURPLE, e -> {}));
57
 		projectToolbar.controls.add(() -> new IconButtonControl(DStyleClass.EMPTY, SettingsIcon.PURPLE, e -> {}));
52
-		projectToolbar.controls.add(() -> new IconButtonControl(DStyleClass.EMPTY, BuildIcon.BLUE, e -> {}));
53
-		projectToolbar.controls.add(() -> new IconButtonControl(DStyleClass.EMPTY, PlayIcon.GREEN, e -> {}));
58
+		projectToolbar.controls.add(() -> new IconButtonControl(DStyleClass.EMPTY, BuildIcon.BLUE, e -> {
59
+			for (IDETarget target : host.getTargets()) {
60
+				if (target.canBuild())
61
+					target.build();
62
+			}
63
+		}));
64
+		projectToolbar.controls.add(() -> new IconButtonControl(DStyleClass.EMPTY, PlayIcon.GREEN, e -> {
65
+			for (IDETarget target : host.getTargets()) {
66
+				if (target.canRun())
67
+					target.run();
68
+			}
69
+		}));
54
 		aspectBar.toolbars.add(projectToolbar);
70
 		aspectBar.toolbars.add(projectToolbar);
55
 	}
71
 	}
56
 }
72
 }

+ 2
- 2
IDE/src/main/java/org/openzen/zenscript/ide/ui/view/TabbedView.java View File

13
 import org.openzen.drawablegui.DDimensionPreferences;
13
 import org.openzen.drawablegui.DDimensionPreferences;
14
 import org.openzen.drawablegui.DFontMetrics;
14
 import org.openzen.drawablegui.DFontMetrics;
15
 import org.openzen.drawablegui.DIRectangle;
15
 import org.openzen.drawablegui.DIRectangle;
16
-import org.openzen.drawablegui.DPath;
17
-import org.openzen.drawablegui.DTransform2D;
18
 import org.openzen.drawablegui.DUIContext;
16
 import org.openzen.drawablegui.DUIContext;
19
 import org.openzen.drawablegui.live.ImmutableLiveObject;
17
 import org.openzen.drawablegui.live.ImmutableLiveObject;
20
 import org.openzen.drawablegui.live.LiveArrayList;
18
 import org.openzen.drawablegui.live.LiveArrayList;
65
 					bounds.width, bounds.height - totalTabHeight);
63
 					bounds.width, bounds.height - totalTabHeight);
66
 				newValue.content.setBounds(contentBounds);
64
 				newValue.content.setBounds(contentBounds);
67
 			}
65
 			}
66
+			if (newValue == null && context != null && bounds != null)
67
+				context.repaint(bounds);
68
 		});
68
 		});
69
 	}
69
 	}
70
 	
70
 	

+ 1
- 11
IDE/src/main/java/org/openzen/zenscript/ide/ui/view/TabbedViewStyle.java View File

20
 	public final DFont tabFont;
20
 	public final DFont tabFont;
21
 	public final int tabFontColor;
21
 	public final int tabFontColor;
22
 	
22
 	
23
-	public final int tabColorNormal;
24
-	public final int tabColorHover;
25
-	public final int tabColorPress;
26
-	public final int tabColorActive;
27
-	
28
 	public final int paddingTop;
23
 	public final int paddingTop;
29
 	public final int paddingBottom;
24
 	public final int paddingBottom;
30
 	public final int paddingLeft;
25
 	public final int paddingLeft;
38
 	
33
 	
39
 	public TabbedViewStyle(DStyleDefinition style) {
34
 	public TabbedViewStyle(DStyleDefinition style) {
40
 		backgroundColor = style.getColor("backgroundColor", 0xFFEEEEEE);
35
 		backgroundColor = style.getColor("backgroundColor", 0xFFEEEEEE);
41
-		tabFont = style.getFont("tabFont", context -> new DFont(DFontFamily.CODE, false, false, false, (int)(12 * context.getScale())));
36
+		tabFont = style.getFont("tabFont", context -> new DFont(DFontFamily.UI, false, false, false, (int)(12 * context.getScale())));
42
 		tabFontColor = style.getColor("tabFontColor", 0xFF000000);
37
 		tabFontColor = style.getColor("tabFontColor", 0xFF000000);
43
 		
38
 		
44
-		tabColorNormal = style.getColor("tabColorNormal", 0xFFEEEEEE);
45
-		tabColorHover = style.getColor("tabColorHover", 0xFFFFFFFF);
46
-		tabColorPress = style.getColor("tabColorPress", 0xFFF0F0F0);
47
-		tabColorActive = style.getColor("tabColorActive", 0xFFFFFFFF);
48
-		
49
 		paddingTop = style.getDimension("paddingTop", new DDpDimension(4));
39
 		paddingTop = style.getDimension("paddingTop", new DDpDimension(4));
50
 		paddingBottom = style.getDimension("paddingTop", new DDpDimension(4));
40
 		paddingBottom = style.getDimension("paddingTop", new DDpDimension(4));
51
 		paddingLeft = style.getDimension("paddingLeft", new DDpDimension(4));
41
 		paddingLeft = style.getDimension("paddingLeft", new DDpDimension(4));

+ 1
- 1
IDE/src/main/java/org/openzen/zenscript/ide/ui/view/TabbedViewTabStyle.java View File

36
 	public final int closeIconPadding;
36
 	public final int closeIconPadding;
37
 	
37
 	
38
 	public TabbedViewTabStyle(DStyleDefinition style) {
38
 	public TabbedViewTabStyle(DStyleDefinition style) {
39
-		tabFont = style.getFont("tabFont", context -> new DFont(DFontFamily.CODE, false, false, false, (int)(12 * context.getScale())));
39
+		tabFont = style.getFont("tabFont", context -> new DFont(DFontFamily.UI, false, false, false, (int)(12 * context.getScale())));
40
 		tabFontColor = style.getColor("tabFontColor", 0xFF000000);
40
 		tabFontColor = style.getColor("tabFontColor", 0xFF000000);
41
 		
41
 		
42
 		tabColorNormal = style.getColor("tabColorNormal", 0xFFEEEEEE);
42
 		tabColorNormal = style.getColor("tabColorNormal", 0xFFEEEEEE);

+ 1
- 0
JavaBytecodeCompiler/build.gradle View File

16
 dependencies {
16
 dependencies {
17
 	compile 'org.ow2.asm:asm-debug-all:6.0_BETA'
17
 	compile 'org.ow2.asm:asm-debug-all:6.0_BETA'
18
 	compile project(':CodeModel')
18
 	compile project(':CodeModel')
19
+	compile project(':CompilerShared')
19
 }
20
 }

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

1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.javabytecode;
7
+
8
+import org.json.JSONObject;
9
+import org.openzen.zenscript.compiler.SemanticModule;
10
+import org.openzen.zenscript.compiler.Target;
11
+
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 boolean debugCompiler;
20
+	
21
+	public JavaBytecodeJarTarget(JSONObject definition) {
22
+		module = definition.getString("module");
23
+		name = definition.optString("name", "Java Bytecode: " + module);
24
+		debugCompiler = definition.optBoolean("debugCompiler", false);
25
+	}
26
+	
27
+	@Override
28
+	public JavaCompiler createCompiler(SemanticModule module) {
29
+		return new JavaCompiler(debugCompiler);
30
+	}
31
+
32
+	@Override
33
+	public String getModule() {
34
+		return module;
35
+	}
36
+
37
+	@Override
38
+	public String getName() {
39
+		return name;
40
+	}
41
+
42
+	@Override
43
+	public boolean canRun() {
44
+		return true;
45
+	}
46
+
47
+	@Override
48
+	public boolean canBuild() {
49
+		return true;
50
+	}
51
+}

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

1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.javabytecode;
7
+
8
+import 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 JavaBytecodeJarTargetType implements TargetType {
18
+	public static final JavaBytecodeJarTargetType INSTANCE = new JavaBytecodeJarTargetType();
19
+	
20
+	private JavaBytecodeJarTargetType() {}
21
+
22
+	@Override
23
+	public Target create(File projectDir, JSONObject definition) {
24
+		return new JavaBytecodeJarTarget(definition);
25
+	}
26
+}

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

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

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

1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.javabytecode;
7
+
8
+import 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 JavaBytecodeRunTargetType implements TargetType {
18
+	public static final JavaBytecodeRunTargetType INSTANCE = new JavaBytecodeRunTargetType();
19
+	
20
+	private JavaBytecodeRunTargetType() {}
21
+
22
+	@Override
23
+	public Target create(File projectDir, JSONObject definition) {
24
+		return new JavaBytecodeRunTarget(definition);
25
+	}
26
+}

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

22
 import org.openzen.zenscript.javabytecode.compiler.JavaStatementVisitor;
22
 import org.openzen.zenscript.javabytecode.compiler.JavaStatementVisitor;
23
 import org.openzen.zenscript.javabytecode.compiler.JavaWriter;
23
 import org.openzen.zenscript.javabytecode.compiler.JavaWriter;
24
 import org.openzen.zenscript.shared.SourceFile;
24
 import org.openzen.zenscript.shared.SourceFile;
25
+import org.openzen.zenscript.compiler.ZenCodeCompiler;
25
 
26
 
26
 /**
27
 /**
27
  *
28
  *
28
  * @author Hoofdgebruiker
29
  * @author Hoofdgebruiker
29
  */
30
  */
30
-public class JavaCompiler {
31
+public class JavaCompiler implements ZenCodeCompiler {
31
 	static {
32
 	static {
32
 		JavaClassInfo jInteger = new JavaClassInfo("java/lang/Integer");
33
 		JavaClassInfo jInteger = new JavaClassInfo("java/lang/Integer");
33
 		JavaClassInfo jLong = new JavaClassInfo("java/lang/Long");
34
 		JavaClassInfo jLong = new JavaClassInfo("java/lang/Long");
136
 	private final JavaClassWriter scriptsClassWriter;
137
 	private final JavaClassWriter scriptsClassWriter;
137
 	private int generatedScriptBlockCounter = 0;
138
 	private int generatedScriptBlockCounter = 0;
138
 	private boolean finished = false;
139
 	private boolean finished = false;
140
+	private JavaModule compiled = null;
139
 	
141
 	
140
 	public JavaCompiler() {
142
 	public JavaCompiler() {
141
 		this(false);
143
 		this(false);
148
 		scriptsClassWriter.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, "Scripts", null, "java/lang/Object", null);
150
 		scriptsClassWriter.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, "Scripts", null, "java/lang/Object", null);
149
 	}
151
 	}
150
 	
152
 	
153
+	@Override
151
 	public void addDefinition(HighLevelDefinition definition) {
154
 	public void addDefinition(HighLevelDefinition definition) {
152
 		String className = getClassName(definition.position.filename);
155
 		String className = getClassName(definition.position.filename);
153
 		JavaScriptFile scriptFile = getScriptFile(className);
156
 		JavaScriptFile scriptFile = getScriptFile(className);
154
 		target.register(definition.name, definition.accept(new JavaDefinitionVisitor(scriptFile.classWriter)));
157
 		target.register(definition.name, definition.accept(new JavaDefinitionVisitor(scriptFile.classWriter)));
155
 	}
158
 	}
156
 	
159
 	
160
+	@Override
157
 	public void addScriptBlock(ScriptBlock script) {
161
 	public void addScriptBlock(ScriptBlock script) {
158
 		final SourceFile sourceFile = script.getTag(SourceFile.class);
162
 		final SourceFile sourceFile = script.getTag(SourceFile.class);
159
 		final String className = getClassName(sourceFile == null ? null : sourceFile.filename);
163
 		final String className = getClassName(sourceFile == null ? null : sourceFile.filename);
196
 		return scriptBlocks.get(className);
200
 		return scriptBlocks.get(className);
197
 	}
201
 	}
198
 	
202
 	
199
-	public JavaModule finish() {
203
+	@Override
204
+	public void finish() {
205
+		finishAndGetModule();
206
+	}
207
+	
208
+	@Override
209
+	public void run() {
210
+		if (compiled == null)
211
+			throw new IllegalStateException("Not yet built!");
212
+		
213
+		
214
+	}
215
+	
216
+	public JavaModule finishAndGetModule() {
200
 		if (finished)
217
 		if (finished)
201
 			throw new IllegalStateException("Already finished!");
218
 			throw new IllegalStateException("Already finished!");
202
 		finished = true;
219
 		finished = true;

+ 19
- 0
JavaSourceCompiler/build.gradle View File

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

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

1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.javasource;
7
+
8
+import java.util.ArrayList;
9
+import java.util.List;
10
+import org.openzen.zenscript.codemodel.Modifiers;
11
+import org.openzen.zenscript.codemodel.definition.AliasDefinition;
12
+import org.openzen.zenscript.codemodel.definition.ClassDefinition;
13
+import org.openzen.zenscript.codemodel.definition.DefinitionVisitor;
14
+import org.openzen.zenscript.codemodel.definition.EnumDefinition;
15
+import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
16
+import org.openzen.zenscript.codemodel.definition.FunctionDefinition;
17
+import org.openzen.zenscript.codemodel.definition.InterfaceDefinition;
18
+import org.openzen.zenscript.codemodel.definition.StructDefinition;
19
+import org.openzen.zenscript.codemodel.definition.VariantDefinition;
20
+import org.openzen.zenscript.codemodel.member.IDefinitionMember;
21
+import org.openzen.zenscript.codemodel.member.ImplementationMember;
22
+
23
+/**
24
+ *
25
+ * @author Hoofdgebruiker
26
+ */
27
+public class JavaDefinitionVisitor implements DefinitionVisitor<Void> {
28
+	private final JavaSourceFile file;
29
+	private final StringBuilder output;
30
+	
31
+	public JavaDefinitionVisitor(JavaSourceFile file, StringBuilder output) {
32
+		this.file = file;
33
+		this.output = output;
34
+	}
35
+
36
+	@Override
37
+	public Void visitClass(ClassDefinition definition) {
38
+		convertModifiers(definition.modifiers);
39
+		output.append("class ").append(definition.name);
40
+		if (definition.superType != null) {
41
+			output.append(" extends ");
42
+			output.append(definition.superType.accept(new JavaSourceTypeVisitor(file)));
43
+		}
44
+		List<ImplementationMember> mergedImplementations = new ArrayList<>();
45
+		for (IDefinitionMember member : definition.members) {
46
+			if (member instanceof ImplementationMember) {
47
+				if (isImplementationMergable((ImplementationMember)member))
48
+					mergedImplementations.add((ImplementationMember)member);
49
+			}
50
+		}
51
+		
52
+		if (mergedImplementations.size() > 0) {
53
+			output.append("implements ");
54
+			for (int i = 0; i < mergedImplementations.size(); i++) {
55
+				if (i > 0)
56
+					output.append(", ");
57
+				
58
+				ImplementationMember implementation = mergedImplementations.get(i);
59
+				output.append(implementation.type.accept(new JavaSourceTypeVisitor(file)));
60
+			}
61
+		}
62
+		
63
+		output.append(" {\n");
64
+		
65
+		
66
+		
67
+		output.append("}\n");
68
+		return null;
69
+	}
70
+
71
+	@Override
72
+	public Void visitInterface(InterfaceDefinition definition) {
73
+		convertModifiers(definition.modifiers);
74
+		output.append("interface ").append(definition.name);
75
+		output.append(" {\n");
76
+		
77
+		
78
+		
79
+		output.append("}\n");
80
+		return null;
81
+	}
82
+
83
+	@Override
84
+	public Void visitEnum(EnumDefinition definition) {
85
+		convertModifiers(definition.modifiers);
86
+		output.append("enum ").append(definition.name);
87
+		
88
+		output.append(" {\n");
89
+		
90
+		
91
+		
92
+		output.append("}\n");
93
+		return null;
94
+	}
95
+
96
+	@Override
97
+	public Void visitStruct(StructDefinition definition) {
98
+		convertModifiers(definition.modifiers | Modifiers.FINAL);
99
+		output.append("class ").append(definition.name);
100
+		output.append(" {\n");
101
+		
102
+		
103
+		
104
+		output.append("}\n");
105
+		return null;
106
+	}
107
+
108
+	@Override
109
+	public Void visitFunction(FunctionDefinition definition) {
110
+		convertModifiers(definition.modifiers | Modifiers.STATIC);
111
+		return null;
112
+	}
113
+
114
+	@Override
115
+	public Void visitExpansion(ExpansionDefinition definition) {
116
+		convertModifiers(definition.modifiers);
117
+		return null;
118
+	}
119
+
120
+	@Override
121
+	public Void visitAlias(AliasDefinition definition) {
122
+		throw new UnsupportedOperationException("Should not arrive here");
123
+	}
124
+
125
+	@Override
126
+	public Void visitVariant(VariantDefinition variant) {
127
+		return null;
128
+	}
129
+	
130
+	private void convertModifiers(int modifiers) {
131
+		if (Modifiers.isExport(modifiers) || Modifiers.isPublic(modifiers))
132
+			output.append("public ");
133
+		if (Modifiers.isPrivate(modifiers))
134
+			output.append("private ");
135
+		if (Modifiers.isProtected(modifiers))
136
+			output.append("protected ");
137
+		if (Modifiers.isStatic(modifiers))
138
+			output.append("static ");
139
+		if (Modifiers.isAbstract(modifiers))
140
+			output.append("abstract ");
141
+		if (!Modifiers.isVirtual(modifiers))
142
+			output.append("final ");
143
+	}
144
+	
145
+	private boolean isImplementationMergable(ImplementationMember implementation) {
146
+		return true; // TODO: check merging conflicts
147
+	}
148
+}

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

1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.javasource;
7
+
8
+import java.io.File;
9
+import java.util.HashMap;
10
+import java.util.Map;
11
+import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
+import org.openzen.zenscript.codemodel.ScriptBlock;
13
+import org.openzen.zenscript.codemodel.definition.FunctionDefinition;
14
+import org.openzen.zenscript.codemodel.definition.ZSPackage;
15
+import org.openzen.zenscript.compiler.ZenCodeCompiler;
16
+import org.openzen.zenscript.shared.SourceFile;
17
+
18
+/**
19
+ *
20
+ * @author Hoofdgebruiker
21
+ */
22
+public class JavaSourceCompiler implements ZenCodeCompiler {
23
+	private final File directory;
24
+	private final ZSPackage pkg;
25
+	private final Map<File, JavaSourceFile> sourceFiles = new HashMap<>();
26
+	
27
+	public JavaSourceCompiler(File directory, ZSPackage pkg) {
28
+		if (!directory.exists())
29
+			directory.mkdirs();
30
+		
31
+		this.directory = directory;
32
+		this.pkg = pkg;
33
+	}
34
+	
35
+	@Override
36
+	public void addDefinition(HighLevelDefinition definition) {
37
+		File file = new File(getDirectory(definition.pkg), definition.name + ".java");
38
+		if (definition.name == null || definition instanceof FunctionDefinition) {
39
+			SourceFile source = definition.getTag(SourceFile.class);
40
+			if (source != null) {
41
+				int slash = Math.max(source.filename.lastIndexOf('/'), source.filename.lastIndexOf('\\'));
42
+				String filename = source.filename.substring(slash < 0 ? 0 : slash);
43
+				filename = filename.substring(0, filename.lastIndexOf('.'));
44
+				file = new File(getDirectory(definition.pkg), filename + ".java");
45
+			}
46
+		}
47
+		
48
+		JavaSourceFile sourceFile = sourceFiles.get(file);
49
+		if (sourceFile == null)
50
+			sourceFiles.put(file, sourceFile = new JavaSourceFile(this, file, definition.pkg.fullName));
51
+		
52
+		sourceFile.add(definition);
53
+	}
54
+	
55
+	@Override
56
+	public void addScriptBlock(ScriptBlock script) {
57
+		
58
+	}
59
+	
60
+	@Override
61
+	public void finish() {
62
+		for (JavaSourceFile sourceFile : sourceFiles.values())
63
+			sourceFile.write();
64
+	}
65
+	
66
+	@Override
67
+	public void run() {
68
+		throw new UnsupportedOperationException("Cannot run this target");
69
+	}
70
+	
71
+	public String getFullName(HighLevelDefinition definition) {
72
+		return definition.pkg.fullName + "." + definition.name;
73
+	}
74
+	
75
+	private File getDirectory(ZSPackage pkg) {
76
+		if (pkg == null)
77
+			throw new RuntimeException("Package not in the package directory");
78
+		if (pkg == this.pkg)
79
+			return directory;
80
+		
81
+		File base = getDirectory(pkg.parent);
82
+		return new File(base, pkg.name);
83
+	}
84
+}

+ 79
- 0
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceFile.java View File

1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.javasource;
7
+
8
+import java.io.BufferedOutputStream;
9
+import java.io.File;
10
+import java.io.FileOutputStream;
11
+import java.io.IOException;
12
+import java.io.OutputStreamWriter;
13
+import java.io.Writer;
14
+import java.nio.charset.StandardCharsets;
15
+import java.util.Arrays;
16
+import java.util.HashMap;
17
+import java.util.Map;
18
+import org.openzen.zenscript.codemodel.HighLevelDefinition;
19
+
20
+/**
21
+ *
22
+ * @author Hoofdgebruiker
23
+ */
24
+public class JavaSourceFile {
25
+	private final JavaSourceCompiler compiler;
26
+	private final File file;
27
+	private final String packageName;
28
+	private final Map<String, String> imports = new HashMap<>();
29
+	private final StringBuilder contents = new StringBuilder();
30
+	
31
+	public JavaSourceFile(JavaSourceCompiler compiler, File file, String packageName) {
32
+		this.compiler = compiler;
33
+		this.packageName = packageName;
34
+		this.file = file;
35
+	}
36
+	
37
+	public String importType(HighLevelDefinition definition) {
38
+		return importType(compiler.getFullName(definition));
39
+	}
40
+	
41
+	public String importType(String fullName) {
42
+		String name = fullName.substring(fullName.lastIndexOf('.') + 1);
43
+		if (imports.containsKey(name))
44
+			return fullName;
45
+		
46
+		imports.put(name, fullName);
47
+		return name;
48
+	}
49
+	
50
+	public void add(HighLevelDefinition definition) {
51
+		JavaDefinitionVisitor visitor = new JavaDefinitionVisitor(this, contents);
52
+		definition.accept(visitor);
53
+	}
54
+	
55
+	public void write() {
56
+		try (Writer writer = new OutputStreamWriter(new BufferedOutputStream(new FileOutputStream(file)), StandardCharsets.UTF_8)) {
57
+			writer.write("package ");
58
+			writer.write(packageName);
59
+			writer.write(";\n\n");
60
+			
61
+			if (this.imports.size() > 0) {
62
+				String[] imports = this.imports.values().toArray(new String[this.imports.size()]);
63
+				Arrays.sort(imports);
64
+
65
+				for (String importName : imports) {
66
+					writer.write("import ");
67
+					writer.write(importName);
68
+					writer.write(";");
69
+				}
70
+
71
+				writer.write("\n\n");
72
+			}
73
+			
74
+			writer.write(contents.toString());
75
+		} catch (IOException ex) {
76
+			ex.printStackTrace();
77
+		}
78
+	}
79
+}

+ 41
- 0
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceObjectTypeVisitor.java View File

1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.javasource;
7
+
8
+import org.openzen.zenscript.codemodel.type.BasicTypeID;
9
+
10
+/**
11
+ *
12
+ * @author Hoofdgebruiker
13
+ */
14
+public class JavaSourceObjectTypeVisitor extends JavaSourceTypeVisitor {
15
+	public JavaSourceObjectTypeVisitor(JavaSourceFile file) {
16
+		super(file);
17
+	}
18
+	
19
+	@Override
20
+	public String visitBasic(BasicTypeID basic) {
21
+		switch (basic) {
22
+			case VOID: return "Void";
23
+			case ANY: return "Any";
24
+			case BOOL: return "Boolean";
25
+			case BYTE: return "Byte";
26
+			case SBYTE: return "Byte";
27
+			case SHORT: return "Short";
28
+			case USHORT: return "Short";
29
+			case INT: return "Integer";
30
+			case UINT: return "Integer";
31
+			case LONG: return "Long";
32
+			case ULONG: return "Long";
33
+			case FLOAT: return "Float";
34
+			case DOUBLE: return "Double";
35
+			case CHAR: return "Character";
36
+			case STRING: return "String";
37
+			default:
38
+				throw new IllegalArgumentException("Unknown basic type: " + basic);
39
+		}
40
+	}
41
+}

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

1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.javasource;
7
+
8
+import java.io.File;
9
+import org.json.JSONObject;
10
+import org.openzen.zenscript.compiler.SemanticModule;
11
+import org.openzen.zenscript.compiler.Target;
12
+import org.openzen.zenscript.compiler.ZenCodeCompiler;
13
+
14
+/**
15
+ *
16
+ * @author Hoofdgebruiker
17
+ */
18
+public class JavaSourceTarget implements Target {
19
+	private final String module;
20
+	private final String name;
21
+	private final File output;
22
+	
23
+	public JavaSourceTarget(File projectDir, JSONObject definition) {
24
+		module = definition.getString("module");
25
+		name = definition.optString("name", "Java Source: " + module);
26
+		output = new File(projectDir, definition.getString("output"));
27
+	}
28
+
29
+	@Override
30
+	public ZenCodeCompiler createCompiler(SemanticModule module) {
31
+		return new JavaSourceCompiler(output, module.pkg);
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
+}

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

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

+ 125
- 0
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceTypeVisitor.java View File

1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.javasource;
7
+
8
+import org.openzen.zenscript.codemodel.type.ArrayTypeID;
9
+import org.openzen.zenscript.codemodel.type.AssocTypeID;
10
+import org.openzen.zenscript.codemodel.type.BasicTypeID;
11
+import org.openzen.zenscript.codemodel.type.ConstTypeID;
12
+import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
13
+import org.openzen.zenscript.codemodel.type.FunctionTypeID;
14
+import org.openzen.zenscript.codemodel.type.GenericMapTypeID;
15
+import org.openzen.zenscript.codemodel.type.GenericTypeID;
16
+import org.openzen.zenscript.codemodel.type.ITypeVisitor;
17
+import org.openzen.zenscript.codemodel.type.IteratorTypeID;
18
+import org.openzen.zenscript.codemodel.type.OptionalTypeID;
19
+import org.openzen.zenscript.codemodel.type.RangeTypeID;
20
+
21
+/**
22
+ *
23
+ * @author Hoofdgebruiker
24
+ */
25
+public class JavaSourceTypeVisitor implements ITypeVisitor<String> {
26
+	private final JavaSourceFile file;
27
+	
28
+	public JavaSourceTypeVisitor(JavaSourceFile file) {
29
+		this.file = file;
30
+	}
31
+
32
+	@Override
33
+	public String visitBasic(BasicTypeID basic) {
34
+		switch (basic) {
35
+			case VOID: return "void";
36
+			case ANY: return "Any";
37
+			case BOOL: return "boolean";
38
+			case BYTE: return "byte";
39
+			case SBYTE: return "byte";
40
+			case SHORT: return "short";
41
+			case USHORT: return "ushort";
42
+			case INT: return "int";
43
+			case UINT: return "int";
44
+			case LONG: return "long";
45
+			case ULONG: return "long";
46
+			case FLOAT: return "float";
47
+			case DOUBLE: return "double";
48
+			case CHAR: return "char";
49
+			case STRING: return "String";
50
+			default:
51
+				throw new IllegalArgumentException("Unknown basic type: " + basic);
52
+		}
53
+	}
54
+
55
+	@Override
56
+	public String visitArray(ArrayTypeID array) {
57
+		StringBuilder result = new StringBuilder();
58
+		result.append(array.elementType.accept(this));
59
+		for (int i = 0; i < array.dimension; i++)
60
+			result.append("[]");
61
+		
62
+		return result.toString();
63
+	}
64
+
65
+	@Override
66
+	public String visitAssoc(AssocTypeID assoc) {
67
+		String map = file.importType("java.util.Map");
68
+		return map + "<" + assoc.keyType.accept(new JavaSourceObjectTypeVisitor(file)) + ", " + assoc.valueType.accept(new JavaSourceObjectTypeVisitor(file)) + ">";
69
+	}
70
+
71
+	@Override
72
+	public String visitGenericMap(GenericMapTypeID map) {
73
+		String javaMap = file.importType("java.util.Map");
74
+		if (map.keys.length > 1)
75
+			throw new UnsupportedOperationException("Not yet supported");
76
+		
77
+		return javaMap + "<Class<?>, " + map.value.accept(this) + ">";
78
+	}
79
+
80
+	@Override
81
+	public String visitIterator(IteratorTypeID iterator) {
82
+		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
83
+	}
84
+
85
+	@Override
86
+	public String visitFunction(FunctionTypeID function) {
87
+		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
88
+	}
89
+
90
+	@Override
91
+	public String visitDefinition(DefinitionTypeID definition) {
92
+		String javaType = file.importType(definition.definition);
93
+		StringBuilder result = new StringBuilder(javaType);
94
+		if (definition.typeParameters != null && definition.typeParameters.length > 0) {
95
+			result.append("<");
96
+			for (int i = 0; i < definition.typeParameters.length; i++) {
97
+				if (i > 0)
98
+					result.append(", ");
99
+				result.append(definition.typeParameters[i].accept(this));
100
+			}
101
+			result.append(">");
102
+		}
103
+		return result.toString();
104
+	}
105
+
106
+	@Override
107
+	public String visitGeneric(GenericTypeID generic) {
108
+		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
109
+	}
110
+
111
+	@Override
112
+	public String visitRange(RangeTypeID range) {
113
+		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
114
+	}
115
+
116
+	@Override
117
+	public String visitConst(ConstTypeID type) {
118
+		return type.baseType.accept(this);
119
+	}
120
+
121
+	@Override
122
+	public String visitOptional(OptionalTypeID optional) {
123
+		return optional.baseType.accept(new JavaSourceObjectTypeVisitor(file));
124
+	}
125
+}

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

43
 
43
 
44
 	@Override
44
 	@Override
45
 	public IPartialExpression compile(ExpressionScope scope) {
45
 	public IPartialExpression compile(ExpressionScope scope) {
46
-		Expression cValue = value.compileKey(scope);
46
+		Expression cValue = value.compile(scope).eval();
47
 		MatchExpression.Case[] cCases = new MatchExpression.Case[cases.size()];
47
 		MatchExpression.Case[] cCases = new MatchExpression.Case[cases.size()];
48
 		for (int i = 0; i < cases.size(); i++) {
48
 		for (int i = 0; i < cases.size(); i++) {
49
 			Case matchCase = cases.get(i);
49
 			Case matchCase = cases.get(i);

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

40
  * @author Hoofdgebruiker
40
  * @author Hoofdgebruiker
41
  */
41
  */
42
 public class GlobalRegistry {
42
 public class GlobalRegistry {
43
-	public final ZSPackage globals = new ZSPackage("");
44
-	private final ZSPackage rootPackage = new ZSPackage("");
43
+	public final ZSPackage globals = new ZSPackage(null, "");
44
+	private final ZSPackage rootPackage = new ZSPackage(null, "");
45
 	private final ZSPackage javaIo = rootPackage.getOrCreatePackage("java").getOrCreatePackage("io");
45
 	private final ZSPackage javaIo = rootPackage.getOrCreatePackage("java").getOrCreatePackage("io");
46
 	private final ZSPackage javaLang = rootPackage.getOrCreatePackage("java").getOrCreatePackage("lang");
46
 	private final ZSPackage javaLang = rootPackage.getOrCreatePackage("java").getOrCreatePackage("lang");
47
 	
47
 	

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

34
 		File inputDirectory = new File("scripts");
34
 		File inputDirectory = new File("scripts");
35
 		File[] inputFiles = Optional.ofNullable(inputDirectory.listFiles((dir, name) -> name.endsWith(".zs"))).orElseGet(() -> new File[0]);
35
 		File[] inputFiles = Optional.ofNullable(inputDirectory.listFiles((dir, name) -> name.endsWith(".zs"))).orElseGet(() -> new File[0]);
36
 		
36
 		
37
-		ZSPackage pkg = new ZSPackage("");
37
+		ZSPackage pkg = new ZSPackage(null, "");
38
 		ParsedFile[] parsedFiles = parse(pkg, inputFiles);
38
 		ParsedFile[] parsedFiles = parse(pkg, inputFiles);
39
 		
39
 		
40
-		ZSPackage global = new ZSPackage("");
40
+		ZSPackage global = new ZSPackage(null, "");
41
 		GlobalRegistry registry = new GlobalRegistry(global);
41
 		GlobalRegistry registry = new GlobalRegistry(global);
42
 		SemanticModule module = compileSyntaxToSemantic(parsedFiles, registry);
42
 		SemanticModule module = compileSyntaxToSemantic(parsedFiles, registry);
43
 		
43
 		
95
 	}
95
 	}
96
 	
96
 	
97
 	private static SemanticModule compileSyntaxToSemantic(ParsedFile[] files, GlobalRegistry registry) {
97
 	private static SemanticModule compileSyntaxToSemantic(ParsedFile[] files, GlobalRegistry registry) {
98
-		ZSPackage modulePackage = new ZSPackage(null);
98
+		ZSPackage modulePackage = new ZSPackage(null, "");
99
 		
99
 		
100
 		// We are considering all these files to be in the same package, so make
100
 		// We are considering all these files to be in the same package, so make
101
 		// a single PackageDefinition instance. If these files were in multiple
101
 		// a single PackageDefinition instance. If these files were in multiple
156
 		for (ScriptBlock script : module.scripts) {
156
 		for (ScriptBlock script : module.scripts) {
157
 			compiler.addScriptBlock(script);
157
 			compiler.addScriptBlock(script);
158
 		}
158
 		}
159
-		return compiler.finish();
159
+		return compiler.finishAndGetModule();
160
 	}
160
 	}
161
 }
161
 }

Loading…
Cancel
Save