Browse Source

- Refactored some formatting things to be reusable for source code translation targets

- Removed generic compare
- Rewrote the way builtins are handled and implemented nearly all operations for all supported basic / builtin types
- Added java source code compilation
- Added throw expression, allowing a throw to be formulated as expression (handy inside matches)
Stan Hebben 6 years ago
parent
commit
c939e7d204
100 changed files with 1395 additions and 323 deletions
  1. 1
    0
      CodeFormatter/build.gradle
  2. 6
    6
      CodeFormatter/src/main/java/org/openzen/zenscript/formatter/CommentFormatter.java
  3. 2
    2
      CodeFormatter/src/main/java/org/openzen/zenscript/formatter/DefinitionFormatter.java
  4. 98
    98
      CodeFormatter/src/main/java/org/openzen/zenscript/formatter/ExpressionFormatter.java
  5. 0
    33
      CodeFormatter/src/main/java/org/openzen/zenscript/formatter/ExpressionString.java
  6. 3
    2
      CodeFormatter/src/main/java/org/openzen/zenscript/formatter/FileFormatter.java
  7. 4
    4
      CodeFormatter/src/main/java/org/openzen/zenscript/formatter/FormattingUtils.java
  8. 2
    2
      CodeFormatter/src/main/java/org/openzen/zenscript/formatter/MemberFormatter.java
  9. 0
    73
      CodeFormatter/src/main/java/org/openzen/zenscript/formatter/OperatorPriority.java
  10. 15
    28
      CodeFormatter/src/main/java/org/openzen/zenscript/formatter/ScriptFormattingSettings.java
  11. 2
    2
      CodeFormatter/src/main/java/org/openzen/zenscript/formatter/StatementFormatter.java
  12. 2
    2
      CodeFormatter/src/main/java/org/openzen/zenscript/formatter/SwitchValueFormatter.java
  13. 6
    8
      CodeFormatter/src/main/java/org/openzen/zenscript/formatter/TypeFormatter.java
  14. 106
    0
      CodeFormatter/src/main/java/org/openzen/zenscript/formatter/ZenScriptOperator.java
  15. 14
    0
      CodeFormatterShared/src/main/java/org/openzen/zenscript/formattershared/CommentFormatter.java
  16. 55
    0
      CodeFormatterShared/src/main/java/org/openzen/zenscript/formattershared/ExpressionString.java
  17. 26
    0
      CodeFormatterShared/src/main/java/org/openzen/zenscript/formattershared/FormattableOperator.java
  18. 56
    0
      CodeFormatterShared/src/main/java/org/openzen/zenscript/formattershared/FormattingSettings.java
  19. 1
    1
      CodeFormatterShared/src/main/java/org/openzen/zenscript/formattershared/Importer.java
  20. 311
    0
      CodeFormatterShared/src/main/java/org/openzen/zenscript/formattershared/StatementFormatter.java
  21. 25
    0
      CodeFormatterShared/src/main/java/org/openzen/zenscript/formattershared/StatementFormattingSubBlock.java
  22. 29
    0
      CodeFormatterShared/src/main/java/org/openzen/zenscript/formattershared/StatementFormattingTarget.java
  23. 1
    3
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/CompareType.java
  24. 1
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/HighLevelDefinition.java
  25. 4
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/OperatorType.java
  26. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/definition/FunctionDefinition.java
  27. 9
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/AndAndExpression.java
  28. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ArrayExpression.java
  29. 5
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CallArguments.java
  30. 10
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CallExpression.java
  31. 7
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CallStaticExpression.java
  32. 10
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CapturedClosureExpression.java
  33. 8
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CapturedDirectExpression.java
  34. 5
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CapturedLocalVariableExpression.java
  35. 5
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CapturedParameterExpression.java
  36. 5
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CapturedThisExpression.java
  37. 8
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CastExpression.java
  38. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CheckNullExpression.java
  39. 7
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CoalesceExpression.java
  40. 15
    4
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CompareExpression.java
  41. 10
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConditionalExpression.java
  42. 5
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantBoolExpression.java
  43. 5
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantByteExpression.java
  44. 5
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantCharExpression.java
  45. 5
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantDoubleExpression.java
  46. 5
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantFloatExpression.java
  47. 5
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantIntExpression.java
  48. 5
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantLongExpression.java
  49. 5
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantSByteExpression.java
  50. 5
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantShortExpression.java
  51. 5
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantStringExpression.java
  52. 5
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantUIntExpression.java
  53. 5
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantULongExpression.java
  54. 5
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstantUShortExpression.java
  55. 7
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstructorSuperCallExpression.java
  56. 7
    3
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ConstructorThisCallExpression.java
  57. 5
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/EnumConstantExpression.java
  58. 15
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/Expression.java
  59. 14
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ExpressionTransformer.java
  60. 3
    3
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ExpressionVisitor.java
  61. 53
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/FunctionExpression.java
  62. 0
    31
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/GenericCompareExpression.java
  63. 6
    2
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/GetFieldExpression.java
  64. 5
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/GetFunctionParameterExpression.java
  65. 5
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/GetLocalVariableExpression.java
  66. 5
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/GetStaticFieldExpression.java
  67. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/GetterExpression.java
  68. 7
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/GlobalCallExpression.java
  69. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/GlobalExpression.java
  70. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/InterfaceCastExpression.java
  71. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/IsExpression.java
  72. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/MakeConstExpression.java
  73. 7
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/MapExpression.java
  74. 45
    2
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/MatchExpression.java
  75. 31
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/NewExpression.java
  76. 5
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/NullExpression.java
  77. 7
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/OrOrExpression.java
  78. 9
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/PostCallExpression.java
  79. 15
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/RangeExpression.java
  80. 7
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/SameObjectExpression.java
  81. 9
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/SetFieldExpression.java
  82. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/SetFunctionParameterExpression.java
  83. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/SetLocalVariableExpression.java
  84. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/SetStaticFieldExpression.java
  85. 7
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/SetterExpression.java
  86. 5
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/StaticGetterExpression.java
  87. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/StaticSetterExpression.java
  88. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/SupertypeCastExpression.java
  89. 5
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ThisExpression.java
  90. 34
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ThrowExpression.java
  91. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/TryConvertExpression.java
  92. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/TryRethrowAsExceptionExpression.java
  93. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/TryRethrowAsResultExpression.java
  94. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/VariantValueExpression.java
  95. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/WrapOptionalExpression.java
  96. 3
    2
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/switchvalue/VariantOptionSwitchValue.java
  97. 2
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/iterator/ForeachIteratorVisitor.java
  98. 15
    3
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/CallerMember.java
  99. 15
    3
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/CasterMember.java
  100. 0
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ConstructorMember.java

+ 1
- 0
CodeFormatter/build.gradle View File

@@ -15,4 +15,5 @@ if (!hasProperty('mainClass')) {
15 15
 
16 16
 dependencies {
17 17
 	compile project(':CodeModel')
18
+	compile project(':CodeFormatterShared')
18 19
 }

+ 6
- 6
CodeFormatter/src/main/java/org/openzen/zenscript/formatter/CommentFormatter.java View File

@@ -12,14 +12,14 @@ package org.openzen.zenscript.formatter;
12 12
 public class CommentFormatter {
13 13
 	private CommentFormatter() {}
14 14
 	
15
-	public static String[] format(String[] comments) {
16
-		if (comments.length == 0)
17
-			return comments;
15
+	public static String[] format(String[] commentLines) {
16
+		if (commentLines.length == 0)
17
+			return commentLines;
18 18
 		
19 19
 		boolean isInMultilineComment = false;
20
-		String[] result = new String[comments.length];
21
-		for (int i = 0; i < comments.length; i++) {
22
-			String comment = comments[i];
20
+		String[] result = new String[commentLines.length];
21
+		for (int i = 0; i < commentLines.length; i++) {
22
+			String comment = commentLines[i];
23 23
 			if (isInMultilineComment) {
24 24
 				if (!comment.startsWith("*"))
25 25
 					comment = "* " + comment;

+ 2
- 2
CodeFormatter/src/main/java/org/openzen/zenscript/formatter/DefinitionFormatter.java View File

@@ -24,12 +24,12 @@ import org.openzen.zenscript.codemodel.member.IDefinitionMember;
24 24
  * @author Hoofdgebruiker
25 25
  */
26 26
 public class DefinitionFormatter implements DefinitionVisitor<Void> {
27
-	private final FormattingSettings settings;
27
+	private final ScriptFormattingSettings settings;
28 28
 	private final TypeFormatter typeFormatter;
29 29
 	private final StringBuilder output = new StringBuilder();
30 30
 	private final String indent;
31 31
 	
32
-	public DefinitionFormatter(FormattingSettings settings, TypeFormatter typeFormatter, String indent) {
32
+	public DefinitionFormatter(ScriptFormattingSettings settings, TypeFormatter typeFormatter, String indent) {
33 33
 		this.settings = settings;
34 34
 		this.typeFormatter = typeFormatter;
35 35
 		this.indent = indent;

+ 98
- 98
CodeFormatter/src/main/java/org/openzen/zenscript/formatter/ExpressionFormatter.java View File

@@ -5,10 +5,11 @@
5 5
  */
6 6
 package org.openzen.zenscript.formatter;
7 7
 
8
+import org.openzen.zenscript.formattershared.ExpressionString;
8 9
 import org.openzen.zenscript.codemodel.OperatorType;
9 10
 import org.openzen.zenscript.codemodel.expression.AndAndExpression;
10 11
 import org.openzen.zenscript.codemodel.expression.ArrayExpression;
11
-import org.openzen.zenscript.codemodel.expression.BasicCompareExpression;
12
+import org.openzen.zenscript.codemodel.expression.CompareExpression;
12 13
 import org.openzen.zenscript.codemodel.expression.CallExpression;
13 14
 import org.openzen.zenscript.codemodel.expression.CallStaticExpression;
14 15
 import org.openzen.zenscript.codemodel.expression.CapturedClosureExpression;
@@ -39,7 +40,6 @@ import org.openzen.zenscript.codemodel.expression.EnumConstantExpression;
39 40
 import org.openzen.zenscript.codemodel.expression.Expression;
40 41
 import org.openzen.zenscript.codemodel.expression.ExpressionVisitor;
41 42
 import org.openzen.zenscript.codemodel.expression.FunctionExpression;
42
-import org.openzen.zenscript.codemodel.expression.GenericCompareExpression;
43 43
 import org.openzen.zenscript.codemodel.expression.GetFieldExpression;
44 44
 import org.openzen.zenscript.codemodel.expression.GetFunctionParameterExpression;
45 45
 import org.openzen.zenscript.codemodel.expression.GetLocalVariableExpression;
@@ -67,6 +67,7 @@ import org.openzen.zenscript.codemodel.expression.StaticGetterExpression;
67 67
 import org.openzen.zenscript.codemodel.expression.StaticSetterExpression;
68 68
 import org.openzen.zenscript.codemodel.expression.SupertypeCastExpression;
69 69
 import org.openzen.zenscript.codemodel.expression.ThisExpression;
70
+import org.openzen.zenscript.codemodel.expression.ThrowExpression;
70 71
 import org.openzen.zenscript.codemodel.expression.TryConvertExpression;
71 72
 import org.openzen.zenscript.codemodel.expression.TryRethrowAsExceptionExpression;
72 73
 import org.openzen.zenscript.codemodel.expression.TryRethrowAsResultExpression;
@@ -80,17 +81,17 @@ import org.openzen.zenscript.shared.StringUtils;
80 81
  * @author Hoofdgebruiker
81 82
  */
82 83
 public class ExpressionFormatter implements ExpressionVisitor<ExpressionString> {
83
-	private final FormattingSettings settings;
84
+	private final ScriptFormattingSettings settings;
84 85
 	public final TypeFormatter typeFormatter;
85 86
 	
86
-	public ExpressionFormatter(FormattingSettings settings, TypeFormatter typeFormatter) {
87
+	public ExpressionFormatter(ScriptFormattingSettings settings, TypeFormatter typeFormatter) {
87 88
 		this.settings = settings;
88 89
 		this.typeFormatter = typeFormatter;
89 90
 	}
90 91
 
91 92
 	@Override
92 93
 	public ExpressionString visitAndAnd(AndAndExpression expression) {
93
-		return binary(expression.left, expression.right, OperatorPriority.ANDAND, " && ");
94
+		return binary(expression.left, expression.right, ZenScriptOperator.ANDAND);
94 95
 	}
95 96
 
96 97
 	@Override
@@ -106,16 +107,15 @@ public class ExpressionFormatter implements ExpressionVisitor<ExpressionString>
106 107
 			index++;
107 108
 		}
108 109
 		result.append("]");
109
-		return new ExpressionString(result.toString(), OperatorPriority.PRIMARY);
110
+		return new ExpressionString(result.toString(), ZenScriptOperator.PRIMARY);
110 111
 	}
111 112
 
112 113
 	@Override
113
-	public ExpressionString visitCompare(BasicCompareExpression expression) {
114
+	public ExpressionString visitCompare(CompareExpression expression) {
114 115
 		return binary(
115 116
 				expression.left,
116 117
 				expression.right,
117
-				OperatorPriority.COMPARE,
118
-				" " + expression.operator.str + " ");
118
+				ZenScriptOperator.getComparison(expression.comparison));
119 119
 	}
120 120
 
121 121
 	@Override
@@ -124,35 +124,37 @@ public class ExpressionFormatter implements ExpressionVisitor<ExpressionString>
124 124
 			OperatorMember operator = (OperatorMember) expression.member;
125 125
 			switch (operator.operator) {
126 126
 				case NOT:
127
-					return unaryPrefix(expression.target, OperatorPriority.NOT, "!");
127
+					return unaryPrefix(expression.target, ZenScriptOperator.NOT, "!");
128 128
 				case NEG:
129
-					return unaryPrefix(expression.target, OperatorPriority.NEG, "-");
129
+					return unaryPrefix(expression.target, ZenScriptOperator.NEG, "-");
130 130
 				case CAT:
131 131
 					if (expression.arguments.arguments.length == 0) {
132
-						return unaryPrefix(expression.target, OperatorPriority.INVERT, "~");
132
+						return unaryPrefix(expression.target, ZenScriptOperator.INVERT, "~");
133 133
 					} else {
134
-						return binary(expression.target, expression.getFirstArgument(), OperatorPriority.CAT, " ~ ");
134
+						return binary(expression.target, expression.getFirstArgument(), ZenScriptOperator.CAT);
135 135
 					}
136 136
 				case ADD:
137
-					return binary(expression.target, expression.getFirstArgument(), OperatorPriority.ADD, " + ");
137
+					return binary(expression.target, expression.getFirstArgument(), ZenScriptOperator.ADD);
138 138
 				case SUB:
139
-					return binary(expression.target, expression.getFirstArgument(), OperatorPriority.SUB, " - ");
139
+					return binary(expression.target, expression.getFirstArgument(), ZenScriptOperator.SUB);
140 140
 				case MUL:
141
-					return binary(expression.target, expression.getFirstArgument(), OperatorPriority.MUL, " * ");
141
+					return binary(expression.target, expression.getFirstArgument(), ZenScriptOperator.MUL);
142 142
 				case DIV:
143
-					return binary(expression.target, expression.getFirstArgument(), OperatorPriority.DIV, " / ");
143
+					return binary(expression.target, expression.getFirstArgument(), ZenScriptOperator.DIV);
144 144
 				case MOD:
145
-					return binary(expression.target, expression.getFirstArgument(), OperatorPriority.MOD, " % ");
145
+					return binary(expression.target, expression.getFirstArgument(), ZenScriptOperator.MOD);
146 146
 				case AND:
147
-					return binary(expression.target, expression.getFirstArgument(), OperatorPriority.AND, " & ");
147
+					return binary(expression.target, expression.getFirstArgument(), ZenScriptOperator.AND);
148 148
 				case OR:
149
-					return binary(expression.target, expression.getFirstArgument(), OperatorPriority.OR, " | ");
149
+					return binary(expression.target, expression.getFirstArgument(), ZenScriptOperator.OR);
150 150
 				case XOR:
151
-					return binary(expression.target, expression.getFirstArgument(), OperatorPriority.XOR, " ^ ");
151
+					return binary(expression.target, expression.getFirstArgument(), ZenScriptOperator.XOR);
152 152
 				case CONTAINS:
153
-					return binary(expression.getFirstArgument(), expression.target, OperatorPriority.CONTAINS, " in ");
153
+					return binary(expression.getFirstArgument(), expression.target, ZenScriptOperator.CONTAINS);
154 154
 				case EQUALS:
155
-					return binary(expression.target, expression.getFirstArgument(), OperatorPriority.COMPARE, " == ");
155
+					return binary(expression.target, expression.getFirstArgument(), ZenScriptOperator.EQUALS);
156
+				case NOTEQUALS:
157
+					return binary(expression.target, expression.getFirstArgument(), ZenScriptOperator.NOTEQUALS);
156 158
 				case INDEXSET: {
157 159
 					StringBuilder result = new StringBuilder();
158 160
 					result.append(expression.target);
@@ -165,7 +167,7 @@ public class ExpressionFormatter implements ExpressionVisitor<ExpressionString>
165 167
 					}
166 168
 					result.append("] = ");
167 169
 					result.append(expression.arguments.arguments[expression.arguments.arguments.length - 1].accept(this).value);
168
-					return new ExpressionString(result.toString(), OperatorPriority.ASSIGN);
170
+					return new ExpressionString(result.toString(), ZenScriptOperator.ASSIGN);
169 171
 				}
170 172
 				case INDEXGET: {
171 173
 					StringBuilder result = new StringBuilder();
@@ -178,7 +180,7 @@ public class ExpressionFormatter implements ExpressionVisitor<ExpressionString>
178 180
 						result.append(expression.arguments.arguments[i].accept(this));
179 181
 					}
180 182
 					result.append("]");
181
-					return new ExpressionString(result.toString(), OperatorPriority.INDEX);
183
+					return new ExpressionString(result.toString(), ZenScriptOperator.INDEX);
182 184
 				}
183 185
 				case MEMBERGETTER: {
184 186
 					StringBuilder result = new StringBuilder();
@@ -186,7 +188,7 @@ public class ExpressionFormatter implements ExpressionVisitor<ExpressionString>
186 188
 					result.append(".get(");
187 189
 					result.append(expression.getFirstArgument().accept(this));
188 190
 					result.append(")");
189
-					return new ExpressionString(result.toString(), OperatorPriority.MEMBER);
191
+					return new ExpressionString(result.toString(), ZenScriptOperator.MEMBER);
190 192
 				}
191 193
 				case MEMBERSETTER: {
192 194
 					StringBuilder result = new StringBuilder();
@@ -196,41 +198,41 @@ public class ExpressionFormatter implements ExpressionVisitor<ExpressionString>
196 198
 					result.append(", ");
197 199
 					result.append(expression.arguments.arguments[1].accept(this));
198 200
 					result.append(")");
199
-					return new ExpressionString(result.toString(), OperatorPriority.MEMBER);
201
+					return new ExpressionString(result.toString(), ZenScriptOperator.MEMBER);
200 202
 				}
201 203
 				case ADDASSIGN:
202
-					return binary(expression.target, expression.getFirstArgument(), OperatorPriority.XORASSIGN, " += ");
204
+					return binary(expression.target, expression.getFirstArgument(), ZenScriptOperator.ADDASSIGN);
203 205
 				case SUBASSIGN:
204
-					return binary(expression.target, expression.getFirstArgument(), OperatorPriority.XORASSIGN, " -= ");
206
+					return binary(expression.target, expression.getFirstArgument(), ZenScriptOperator.SUBASSIGN);
205 207
 				case MULASSIGN:
206
-					return binary(expression.target, expression.getFirstArgument(), OperatorPriority.XORASSIGN, " *= ");
208
+					return binary(expression.target, expression.getFirstArgument(), ZenScriptOperator.MULASSIGN);
207 209
 				case DIVASSIGN:
208
-					return binary(expression.target, expression.getFirstArgument(), OperatorPriority.XORASSIGN, " /= ");
210
+					return binary(expression.target, expression.getFirstArgument(), ZenScriptOperator.DIVASSIGN);
209 211
 				case MODASSIGN:
210
-					return binary(expression.target, expression.getFirstArgument(), OperatorPriority.XORASSIGN, " %= ");
212
+					return binary(expression.target, expression.getFirstArgument(), ZenScriptOperator.MODASSIGN);
211 213
 				case CATASSIGN:
212
-					return binary(expression.target, expression.getFirstArgument(), OperatorPriority.XORASSIGN, " ~= ");
214
+					return binary(expression.target, expression.getFirstArgument(), ZenScriptOperator.CATASSIGN);
213 215
 				case ORASSIGN:
214
-					return binary(expression.target, expression.getFirstArgument(), OperatorPriority.XORASSIGN, " |= ");
216
+					return binary(expression.target, expression.getFirstArgument(), ZenScriptOperator.ORASSIGN);
215 217
 				case ANDASSIGN:
216
-					return binary(expression.target, expression.getFirstArgument(), OperatorPriority.XORASSIGN, " &= ");
218
+					return binary(expression.target, expression.getFirstArgument(), ZenScriptOperator.ANDASSIGN);
217 219
 				case XORASSIGN:
218
-					return binary(expression.target, expression.getFirstArgument(), OperatorPriority.XORASSIGN, " ^= ");
220
+					return binary(expression.target, expression.getFirstArgument(), ZenScriptOperator.XORASSIGN);
219 221
 				case INCREMENT:
220
-					return unaryPrefix(expression.target, OperatorPriority.DECREMENT, "++");
222
+					return unaryPrefix(expression.target, ZenScriptOperator.DECREMENT, "++");
221 223
 				case DECREMENT:
222
-					return unaryPrefix(expression.target, OperatorPriority.DECREMENT, "--");
224
+					return unaryPrefix(expression.target, ZenScriptOperator.DECREMENT, "--");
223 225
 				case CALL: {
224 226
 					StringBuilder result = new StringBuilder();
225 227
 					result.append(".");
226 228
 					FormattingUtils.formatCall(result, typeFormatter, this, expression.arguments);
227
-					return new ExpressionString(result.toString(), OperatorPriority.CALL);
229
+					return new ExpressionString(result.toString(), ZenScriptOperator.CALL);
228 230
 				}
229 231
 				case CAST: {
230 232
 					StringBuilder result = new StringBuilder();
231 233
 					result.append(" as ");
232 234
 					result.append(expression.arguments.typeArguments[0].accept(typeFormatter));
233
-					return new ExpressionString(result.toString(), OperatorPriority.CAST);
235
+					return new ExpressionString(result.toString(), ZenScriptOperator.CAST);
234 236
 				}
235 237
 				default:
236 238
 					throw new UnsupportedOperationException("Unknown operator: " + operator.operator);
@@ -241,7 +243,7 @@ public class ExpressionFormatter implements ExpressionVisitor<ExpressionString>
241 243
 			result.append(".");
242 244
 			result.append(expression.member.name);
243 245
 			FormattingUtils.formatCall(result, typeFormatter, this, expression.arguments);
244
-			return new ExpressionString(result.toString(), OperatorPriority.PRIMARY);
246
+			return new ExpressionString(result.toString(), ZenScriptOperator.PRIMARY);
245 247
 		}
246 248
 	}
247 249
 
@@ -262,7 +264,7 @@ public class ExpressionFormatter implements ExpressionVisitor<ExpressionString>
262 264
 			result.append(expression.member.name);
263 265
 		}
264 266
 		FormattingUtils.formatCall(result, typeFormatter, this, expression.arguments);
265
-		return new ExpressionString(result.toString(), OperatorPriority.PRIMARY);
267
+		return new ExpressionString(result.toString(), ZenScriptOperator.PRIMARY);
266 268
 	}
267 269
 
268 270
 	@Override
@@ -277,17 +279,17 @@ public class ExpressionFormatter implements ExpressionVisitor<ExpressionString>
277 279
 
278 280
 	@Override
279 281
 	public ExpressionString visitCapturedLocalVariable(CapturedLocalVariableExpression expression) {
280
-		return new ExpressionString(expression.variable.name, OperatorPriority.PRIMARY);
282
+		return new ExpressionString(expression.variable.name, ZenScriptOperator.PRIMARY);
281 283
 	}
282 284
 
283 285
 	@Override
284 286
 	public ExpressionString visitCapturedParameter(CapturedParameterExpression expression) {
285
-		return new ExpressionString(expression.parameter.name, OperatorPriority.PRIMARY);
287
+		return new ExpressionString(expression.parameter.name, ZenScriptOperator.PRIMARY);
286 288
 	}
287 289
 
288 290
 	@Override
289 291
 	public ExpressionString visitCapturedThis(CapturedThisExpression expression) {
290
-		return new ExpressionString("this", OperatorPriority.PRIMARY);
292
+		return new ExpressionString("this", ZenScriptOperator.PRIMARY);
291 293
 	}
292 294
 	
293 295
 	@Override
@@ -298,7 +300,7 @@ public class ExpressionFormatter implements ExpressionVisitor<ExpressionString>
298 300
 			result.append(" as ");
299 301
 			result.append(expression.member.toType.accept(typeFormatter));
300 302
 		}
301
-		return new ExpressionString(result.toString(), OperatorPriority.PRIMARY);
303
+		return new ExpressionString(result.toString(), ZenScriptOperator.PRIMARY);
302 304
 	}
303 305
 
304 306
 	@Override
@@ -308,7 +310,7 @@ public class ExpressionFormatter implements ExpressionVisitor<ExpressionString>
308 310
 
309 311
 	@Override
310 312
 	public ExpressionString visitCoalesce(CoalesceExpression expression) {
311
-		return binary(expression.left, expression.right, OperatorPriority.COALESCE, " ?? ");
313
+		return binary(expression.left, expression.right, ZenScriptOperator.COALESCE);
312 314
 	}
313 315
 
314 316
 	@Override
@@ -319,24 +321,24 @@ public class ExpressionFormatter implements ExpressionVisitor<ExpressionString>
319 321
 		result.append(expression.ifThen.accept(this));
320 322
 		result.append(" : ");
321 323
 		result.append(expression.ifElse.accept(this));
322
-		return new ExpressionString(result.toString(), OperatorPriority.TERNARY);
324
+		return new ExpressionString(result.toString(), ZenScriptOperator.TERNARY);
323 325
 	}
324 326
 
325 327
 	@Override
326 328
 	public ExpressionString visitConstantBool(ConstantBoolExpression expression) {
327
-		return new ExpressionString(expression.value ? "true" : "false", OperatorPriority.PRIMARY);
329
+		return new ExpressionString(expression.value ? "true" : "false", ZenScriptOperator.PRIMARY);
328 330
 	}
329 331
 
330 332
 	@Override
331 333
 	public ExpressionString visitConstantByte(ConstantByteExpression expression) {
332
-		return new ExpressionString(Byte.toString(expression.value) + " as byte", OperatorPriority.CAST);
334
+		return new ExpressionString(Byte.toString(expression.value) + " as byte", ZenScriptOperator.CAST);
333 335
 	}
334 336
 
335 337
 	@Override
336 338
 	public ExpressionString visitConstantChar(ConstantCharExpression expression) {
337 339
 		return new ExpressionString(
338 340
 				StringUtils.escape(Character.toString(expression.value), '\'', true),
339
-				OperatorPriority.PRIMARY);
341
+				ZenScriptOperator.PRIMARY);
340 342
 	}
341 343
 
342 344
 	@Override
@@ -351,22 +353,22 @@ public class ExpressionFormatter implements ExpressionVisitor<ExpressionString>
351 353
 
352 354
 	@Override
353 355
 	public ExpressionString visitConstantInt(ConstantIntExpression expression) {
354
-		return new ExpressionString(Integer.toString(expression.value), OperatorPriority.PRIMARY);
356
+		return new ExpressionString(Integer.toString(expression.value), ZenScriptOperator.PRIMARY);
355 357
 	}
356 358
 
357 359
 	@Override
358 360
 	public ExpressionString visitConstantLong(ConstantLongExpression expression) {
359
-		return new ExpressionString(Long.toString(expression.value), OperatorPriority.PRIMARY);
361
+		return new ExpressionString(Long.toString(expression.value), ZenScriptOperator.PRIMARY);
360 362
 	}
361 363
 
362 364
 	@Override
363 365
 	public ExpressionString visitConstantSByte(ConstantSByteExpression expression) {
364
-		return new ExpressionString(Byte.toString(expression.value) + " as sbyte", OperatorPriority.CAST);
366
+		return new ExpressionString(Byte.toString(expression.value) + " as sbyte", ZenScriptOperator.CAST);
365 367
 	}
366 368
 
367 369
 	@Override
368 370
 	public ExpressionString visitConstantShort(ConstantShortExpression expression) {
369
-		return new ExpressionString(Integer.toString(expression.value) + " as short", OperatorPriority.CAST);
371
+		return new ExpressionString(Integer.toString(expression.value) + " as short", ZenScriptOperator.CAST);
370 372
 	}
371 373
 
372 374
 	@Override
@@ -374,22 +376,22 @@ public class ExpressionFormatter implements ExpressionVisitor<ExpressionString>
374 376
 		return new ExpressionString(StringUtils.escape(
375 377
 				expression.value,
376 378
 				settings.useSingleQuotesForStrings ? '\'' : '"',
377
-				true), OperatorPriority.CAST);
379
+				true), ZenScriptOperator.CAST);
378 380
 	}
379 381
 
380 382
 	@Override
381 383
 	public ExpressionString visitConstantUInt(ConstantUIntExpression expression) {
382
-		return new ExpressionString(Integer.toString(expression.value) + " as uint", OperatorPriority.CAST);
384
+		return new ExpressionString(Integer.toString(expression.value) + " as uint", ZenScriptOperator.CAST);
383 385
 	}
384 386
 
385 387
 	@Override
386 388
 	public ExpressionString visitConstantULong(ConstantULongExpression expression) {
387
-		return new ExpressionString(Long.toString(expression.value) + " as ulong", OperatorPriority.CAST);
389
+		return new ExpressionString(Long.toString(expression.value) + " as ulong", ZenScriptOperator.CAST);
388 390
 	}
389 391
 
390 392
 	@Override
391 393
 	public ExpressionString visitConstantUShort(ConstantUShortExpression expression) {
392
-		return new ExpressionString(Integer.toString(expression.value) + " as ushort", OperatorPriority.CAST);
394
+		return new ExpressionString(Integer.toString(expression.value) + " as ushort", ZenScriptOperator.CAST);
393 395
 	}
394 396
 
395 397
 	@Override
@@ -397,7 +399,7 @@ public class ExpressionFormatter implements ExpressionVisitor<ExpressionString>
397 399
 		StringBuilder result = new StringBuilder();
398 400
 		result.append("this");
399 401
 		FormattingUtils.formatCall(result, typeFormatter, this, expression.arguments);
400
-		return new ExpressionString(result.toString(), OperatorPriority.PRIMARY);
402
+		return new ExpressionString(result.toString(), ZenScriptOperator.PRIMARY);
401 403
 	}
402 404
 
403 405
 	@Override
@@ -405,12 +407,12 @@ public class ExpressionFormatter implements ExpressionVisitor<ExpressionString>
405 407
 		StringBuilder result = new StringBuilder();
406 408
 		result.append("super");
407 409
 		FormattingUtils.formatCall(result, typeFormatter, this, expression.arguments);
408
-		return new ExpressionString(result.toString(), OperatorPriority.PRIMARY);
410
+		return new ExpressionString(result.toString(), ZenScriptOperator.PRIMARY);
409 411
 	}
410 412
 
411 413
 	@Override
412 414
 	public ExpressionString visitEnumConstant(EnumConstantExpression expression) {
413
-		return new ExpressionString(expression.type.accept(typeFormatter) + "." + expression.value.name, OperatorPriority.MEMBER);
415
+		return new ExpressionString(expression.type.accept(typeFormatter) + "." + expression.value.name, ZenScriptOperator.MEMBER);
414 416
 	}
415 417
 
416 418
 	@Override
@@ -418,28 +420,23 @@ public class ExpressionFormatter implements ExpressionVisitor<ExpressionString>
418 420
 		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
419 421
 	}
420 422
 
421
-	@Override
422
-	public ExpressionString visitGenericCompare(GenericCompareExpression expression) {
423
-		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
424
-	}
425
-
426 423
 	@Override
427 424
 	public ExpressionString visitGetField(GetFieldExpression expression) {
428 425
 		StringBuilder result = new StringBuilder();
429 426
 		result.append(expression.target.accept(this));
430 427
 		result.append('.');
431 428
 		result.append(expression.field.name);
432
-		return new ExpressionString(result.toString(), OperatorPriority.MEMBER);
429
+		return new ExpressionString(result.toString(), ZenScriptOperator.MEMBER);
433 430
 	}
434 431
 
435 432
 	@Override
436 433
 	public ExpressionString visitGetFunctionParameter(GetFunctionParameterExpression expression) {
437
-		return new ExpressionString(expression.parameter.name, OperatorPriority.PRIMARY);
434
+		return new ExpressionString(expression.parameter.name, ZenScriptOperator.PRIMARY);
438 435
 	}
439 436
 
440 437
 	@Override
441 438
 	public ExpressionString visitGetLocalVariable(GetLocalVariableExpression expression) {
442
-		return new ExpressionString(expression.variable.name, OperatorPriority.PRIMARY);
439
+		return new ExpressionString(expression.variable.name, ZenScriptOperator.PRIMARY);
443 440
 	}
444 441
 
445 442
 	@Override
@@ -448,7 +445,7 @@ public class ExpressionFormatter implements ExpressionVisitor<ExpressionString>
448 445
 		result.append(expression.type.accept(typeFormatter));
449 446
 		result.append('.');
450 447
 		result.append(expression.field.name);
451
-		return new ExpressionString(result.toString(), OperatorPriority.MEMBER);
448
+		return new ExpressionString(result.toString(), ZenScriptOperator.MEMBER);
452 449
 	}
453 450
 
454 451
 	@Override
@@ -457,12 +454,12 @@ public class ExpressionFormatter implements ExpressionVisitor<ExpressionString>
457 454
 		result.append(expression.target.accept(this));
458 455
 		result.append('.');
459 456
 		result.append(expression.getter.name);
460
-		return new ExpressionString(result.toString(), OperatorPriority.MEMBER);
457
+		return new ExpressionString(result.toString(), ZenScriptOperator.MEMBER);
461 458
 	}
462 459
 	
463 460
 	@Override
464 461
 	public ExpressionString visitGlobal(GlobalExpression expression) {
465
-		return new ExpressionString(expression.name, OperatorPriority.PRIMARY);
462
+		return new ExpressionString(expression.name, ZenScriptOperator.PRIMARY);
466 463
 	}
467 464
 	
468 465
 	@Override
@@ -470,7 +467,7 @@ public class ExpressionFormatter implements ExpressionVisitor<ExpressionString>
470 467
 		StringBuilder result = new StringBuilder();
471 468
 		result.append(expression.name);
472 469
 		FormattingUtils.formatCall(result, typeFormatter, this, expression.arguments);
473
-		return new ExpressionString(result.toString(), OperatorPriority.PRIMARY);
470
+		return new ExpressionString(result.toString(), ZenScriptOperator.PRIMARY);
474 471
 	}
475 472
 
476 473
 	@Override
@@ -479,7 +476,7 @@ public class ExpressionFormatter implements ExpressionVisitor<ExpressionString>
479 476
 		result.append(expression.value.accept(this).value);
480 477
 		result.append(" as ");
481 478
 		result.append(expression.type.accept(typeFormatter));
482
-		return new ExpressionString(result.toString(), OperatorPriority.CAST);
479
+		return new ExpressionString(result.toString(), ZenScriptOperator.CAST);
483 480
 	}
484 481
 
485 482
 	@Override
@@ -488,7 +485,7 @@ public class ExpressionFormatter implements ExpressionVisitor<ExpressionString>
488 485
 		result.append(expression.value.accept(this).value);
489 486
 		result.append(" is ");
490 487
 		result.append(expression.type.accept(typeFormatter));
491
-		return new ExpressionString(result.toString(), OperatorPriority.COMPARE);
488
+		return new ExpressionString(result.toString(), ZenScriptOperator.IS);
492 489
 	}
493 490
 
494 491
 	@Override
@@ -508,7 +505,7 @@ public class ExpressionFormatter implements ExpressionVisitor<ExpressionString>
508 505
 			result.append(expression.values[i].accept(this));
509 506
 		}
510 507
 		result.append("}");
511
-		return new ExpressionString(result.toString(), OperatorPriority.PRIMARY);
508
+		return new ExpressionString(result.toString(), ZenScriptOperator.PRIMARY);
512 509
 	}
513 510
 	
514 511
 	@Override
@@ -527,81 +524,81 @@ public class ExpressionFormatter implements ExpressionVisitor<ExpressionString>
527 524
 		result.append("new ");
528 525
 		result.append(expression.type.accept(typeFormatter));
529 526
 		FormattingUtils.formatCall(result, typeFormatter, this, expression.arguments);
530
-		return new ExpressionString(result.toString(), OperatorPriority.PRIMARY);
527
+		return new ExpressionString(result.toString(), ZenScriptOperator.PRIMARY);
531 528
 	}
532 529
 
533 530
 	@Override
534 531
 	public ExpressionString visitNull(NullExpression expression) {
535
-		return new ExpressionString("null", OperatorPriority.PRIMARY);
532
+		return new ExpressionString("null", ZenScriptOperator.PRIMARY);
536 533
 	}
537 534
 
538 535
 	@Override
539 536
 	public ExpressionString visitOrOr(OrOrExpression expression) {
540
-		return binary(expression.left, expression.right, OperatorPriority.OROR, " || ");
537
+		return binary(expression.left, expression.right, ZenScriptOperator.OROR);
541 538
 	}
542 539
 	
543 540
 	@Override
544 541
 	public ExpressionString visitPostCall(PostCallExpression expression) {
545
-		return unaryPostfix(expression.target, OperatorPriority.INCREMENT, expression.member.operator == OperatorType.INCREMENT ? "++" : "--");
542
+		return unaryPostfix(expression.target, ZenScriptOperator.INCREMENT, expression.member.operator == OperatorType.INCREMENT ? "++" : "--");
546 543
 	}
547 544
 
548 545
 	@Override
549 546
 	public ExpressionString visitRange(RangeExpression expression) {
550
-		return binary(expression.from, expression.to, OperatorPriority.RANGE, " .. ");
547
+		return binary(expression.from, expression.to, ZenScriptOperator.RANGE);
551 548
 	}
552 549
 	
553 550
 	@Override
554 551
 	public ExpressionString visitSameObject(SameObjectExpression expression) {
555
-		return binary(expression.left, expression.right, OperatorPriority.COMPARE, expression.inverted ? " !== " : " === ");
552
+		return binary(expression.left, expression.right, expression.inverted ? ZenScriptOperator.NOTSAME : ZenScriptOperator.SAME);
556 553
 	}
557 554
 
558 555
 	@Override
559 556
 	public ExpressionString visitSetField(SetFieldExpression expression) {
560 557
 		return new ExpressionString(
561 558
 				expression.target.accept(this) + "." + expression.field.name + " = " + expression.value.accept(this).value, 
562
-				OperatorPriority.ASSIGN);
559
+				ZenScriptOperator.ASSIGN);
563 560
 	}
564 561
 
565 562
 	@Override
566 563
 	public ExpressionString visitSetFunctionParameter(SetFunctionParameterExpression expression) {
567 564
 		return new ExpressionString(
568 565
 				expression.parameter.name + " = " + expression.value.accept(this).value,
569
-				OperatorPriority.ASSIGN);
566
+				ZenScriptOperator.ASSIGN);
570 567
 	}
571 568
 
572 569
 	@Override
573 570
 	public ExpressionString visitSetLocalVariable(SetLocalVariableExpression expression) {
574 571
 		return new ExpressionString(
575 572
 				expression.variable.name + " = " + expression.value.accept(this).value,
576
-				OperatorPriority.ASSIGN);
573
+				ZenScriptOperator.ASSIGN);
577 574
 	}
578 575
 
579 576
 	@Override
580 577
 	public ExpressionString visitSetStaticField(SetStaticFieldExpression expression) {
581 578
 		return new ExpressionString(
582 579
 				expression.type.accept(typeFormatter) + "." + expression.field.name + " = " + expression.value.accept(this).value,
583
-				OperatorPriority.ASSIGN);
580
+				ZenScriptOperator.ASSIGN);
584 581
 	}
585 582
 
586 583
 	@Override
587 584
 	public ExpressionString visitSetter(SetterExpression expression) {
588 585
 		return new ExpressionString(
589 586
 				expression.target.accept(this) + "." + expression.setter.name + " = " + expression.value.accept(this),
590
-				OperatorPriority.ASSIGN);
587
+				ZenScriptOperator.ASSIGN);
591 588
 	}
592 589
 
593 590
 	@Override
594 591
 	public ExpressionString visitStaticGetter(StaticGetterExpression expression) {
595 592
 		return new ExpressionString(
596 593
 				expression.type.accept(typeFormatter) + "." + expression.getter.name, 
597
-				OperatorPriority.MEMBER);
594
+				ZenScriptOperator.MEMBER);
598 595
 	}
599 596
 
600 597
 	@Override
601 598
 	public ExpressionString visitStaticSetter(StaticSetterExpression expression) {
602 599
 		return new ExpressionString(
603 600
 				expression.type.accept(typeFormatter) + "." + expression.setter.name + " = " + expression.setter.name,
604
-				OperatorPriority.ASSIGN);
601
+				ZenScriptOperator.ASSIGN);
605 602
 	}
606 603
 	
607 604
 	@Override
@@ -611,7 +608,12 @@ public class ExpressionFormatter implements ExpressionVisitor<ExpressionString>
611 608
 
612 609
 	@Override
613 610
 	public ExpressionString visitThis(ThisExpression expression) {
614
-		return new ExpressionString("this", OperatorPriority.PRIMARY);
611
+		return new ExpressionString("this", ZenScriptOperator.PRIMARY);
612
+	}
613
+
614
+	@Override
615
+	public ExpressionString visitThrow(ThrowExpression expression) {
616
+		return new ExpressionString("throw " + expression.value.accept(this), ZenScriptOperator.PRIMARY);
615 617
 	}
616 618
 
617 619
 	@Override
@@ -637,7 +639,7 @@ public class ExpressionFormatter implements ExpressionVisitor<ExpressionString>
637 639
 		StringBuilder result = new StringBuilder();
638 640
 		result.append("new ");
639 641
 		// TODO: finish this
640
-		return new ExpressionString(result.toString(), OperatorPriority.PRIMARY);
642
+		return new ExpressionString(result.toString(), ZenScriptOperator.PRIMARY);
641 643
 	}
642 644
 
643 645
 	@Override
@@ -645,17 +647,15 @@ public class ExpressionFormatter implements ExpressionVisitor<ExpressionString>
645 647
 		return expression.value.accept(this);
646 648
 	}
647 649
 	
648
-	private ExpressionString unaryPrefix(Expression value, OperatorPriority operator, String operatorString) {
650
+	private ExpressionString unaryPrefix(Expression value, ZenScriptOperator operator, String operatorString) {
649 651
 		return new ExpressionString(operatorString + value.accept(this).value, operator);
650 652
 	}
651 653
 	
652
-	private ExpressionString unaryPostfix(Expression value, OperatorPriority operator, String operatorString) {
654
+	private ExpressionString unaryPostfix(Expression value, ZenScriptOperator operator, String operatorString) {
653 655
 		return new ExpressionString(value.accept(this).value + operatorString, operator);
654 656
 	}
655 657
 	
656
-	private ExpressionString binary(Expression left, Expression right, OperatorPriority operator, String operatorString) {
657
-		String value = left.accept(this).wrapLeft(operator)
658
-				+ operatorString + right.accept(this).wrapRight(operator);
659
-		return new ExpressionString(value, operator);
658
+	private ExpressionString binary(Expression left, Expression right, ZenScriptOperator operator) {
659
+		return ExpressionString.binary(left.accept(this), right.accept(this), operator);
660 660
 	}
661 661
 }

+ 0
- 33
CodeFormatter/src/main/java/org/openzen/zenscript/formatter/ExpressionString.java View File

@@ -1,33 +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.formatter;
7
-
8
-/**
9
- *
10
- * @author Hoofdgebruiker
11
- */
12
-public class ExpressionString {
13
-	public final String value;
14
-	public final OperatorPriority priority;
15
-	
16
-	public ExpressionString(String value, OperatorPriority priority) {
17
-		this.value = value;
18
-		this.priority = priority;
19
-	}
20
-	
21
-	public String wrapLeft(OperatorPriority outer) {
22
-		return OperatorPriority.shouldWrapLeft(priority, outer) ? "(" + value + ")" : value;
23
-	}
24
-	
25
-	public String wrapRight(OperatorPriority outer) {
26
-		return OperatorPriority.shouldWrapRight(priority, outer) ? "(" + value + ")" : value;
27
-	}
28
-	
29
-	@Override
30
-	public String toString() {
31
-		return value;
32
-	}
33
-}

+ 3
- 2
CodeFormatter/src/main/java/org/openzen/zenscript/formatter/FileFormatter.java View File

@@ -5,6 +5,7 @@
5 5
  */
6 6
 package org.openzen.zenscript.formatter;
7 7
 
8
+import org.openzen.zenscript.formattershared.Importer;
8 9
 import java.util.ArrayList;
9 10
 import java.util.Collections;
10 11
 import java.util.HashMap;
@@ -21,9 +22,9 @@ import org.openzen.zenscript.codemodel.statement.Statement;
21 22
  * @author Hoofdgebruiker
22 23
  */
23 24
 public class FileFormatter {
24
-	private final FormattingSettings settings;
25
+	private final ScriptFormattingSettings settings;
25 26
 	
26
-	public FileFormatter(FormattingSettings settings) {
27
+	public FileFormatter(ScriptFormattingSettings settings) {
27 28
 		this.settings = settings;
28 29
 	}
29 30
 	

+ 4
- 4
CodeFormatter/src/main/java/org/openzen/zenscript/formatter/FormattingUtils.java View File

@@ -66,7 +66,7 @@ public class FormattingUtils {
66 66
 			output.append("const? ");
67 67
 	}
68 68
 	
69
-	public static void formatHeader(StringBuilder result, FormattingSettings settings, FunctionHeader header, TypeFormatter typeFormatter) {
69
+	public static void formatHeader(StringBuilder result, ScriptFormattingSettings settings, FunctionHeader header, TypeFormatter typeFormatter) {
70 70
 		FormattingUtils.formatTypeParameters(result, header.typeParameters, typeFormatter);
71 71
 		result.append("(");
72 72
 		int parameterIndex = 0;
@@ -115,7 +115,7 @@ public class FormattingUtils {
115 115
 		}
116 116
 	}
117 117
 	
118
-	public static void formatBody(StringBuilder output, FormattingSettings settings, String indent, TypeFormatter typeFormatter, Statement body) {
118
+	public static void formatBody(StringBuilder output, ScriptFormattingSettings settings, String indent, TypeFormatter typeFormatter, Statement body) {
119 119
 		body.accept(new BodyFormatter(output, settings, indent, typeFormatter));
120 120
 		output.append("\n");
121 121
 	}
@@ -149,12 +149,12 @@ public class FormattingUtils {
149 149
 	
150 150
 	private static class BodyFormatter implements StatementVisitor<Void> {
151 151
 		private final StringBuilder output;
152
-		private final FormattingSettings settings;
152
+		private final ScriptFormattingSettings settings;
153 153
 		private final StatementFormatter statementFormatter;
154 154
 		private final String indent;
155 155
 		private final TypeFormatter typeFormatter;
156 156
 		
157
-		public BodyFormatter(StringBuilder output, FormattingSettings settings, String indent, TypeFormatter typeFormatter) {
157
+		public BodyFormatter(StringBuilder output, ScriptFormattingSettings settings, String indent, TypeFormatter typeFormatter) {
158 158
 			this.output = output;
159 159
 			this.settings = settings;
160 160
 			this.indent = indent;

+ 2
- 2
CodeFormatter/src/main/java/org/openzen/zenscript/formatter/MemberFormatter.java View File

@@ -29,14 +29,14 @@ import org.openzen.zenscript.codemodel.statement.Statement;
29 29
  * @author Hoofdgebruiker
30 30
  */
31 31
 public class MemberFormatter implements MemberVisitor<Void> {
32
-	private final FormattingSettings settings;
32
+	private final ScriptFormattingSettings settings;
33 33
 	private final StringBuilder output;
34 34
 	private final String indent;
35 35
 	private final TypeFormatter typeFormatter;
36 36
 	private boolean isFirst = true;
37 37
 	private boolean wasField = false;
38 38
 	
39
-	public MemberFormatter(FormattingSettings settings, StringBuilder output, String indent, TypeFormatter typeFormatter) {
39
+	public MemberFormatter(ScriptFormattingSettings settings, StringBuilder output, String indent, TypeFormatter typeFormatter) {
40 40
 		this.settings = settings;
41 41
 		this.output = output;
42 42
 		this.indent = indent;

+ 0
- 73
CodeFormatter/src/main/java/org/openzen/zenscript/formatter/OperatorPriority.java View File

@@ -1,73 +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.formatter;
7
-
8
-/**
9
- *
10
- * @author Hoofdgebruiker
11
- */
12
-public enum OperatorPriority {
13
-	ADD(6),
14
-	SUB(6),
15
-	MUL(7),
16
-	DIV(7),
17
-	MOD(7),
18
-	CAT(6),
19
-	OR(4),
20
-	AND(4),
21
-	XOR(4),
22
-	NEG(8),
23
-	NOT(8),
24
-	INVERT(8),
25
-	CONTAINS(5),
26
-	COMPARE(5),
27
-	ASSIGN(0),
28
-	ADDASSIGN(0),
29
-	SUBASSIGN(0),
30
-	MULASSIGN(0),
31
-	DIVASSIGN(0),
32
-	MODASSIGN(0),
33
-	CATASSIGN(0),
34
-	ORASSIGN(0),
35
-	ANDASSIGN(0),
36
-	XORASSIGN(0),
37
-	
38
-	ANDAND(3),
39
-	OROR(2),
40
-	
41
-	TERNARY(1),
42
-	COALESCE(2),
43
-	
44
-	INCREMENT(8),
45
-	DECREMENT(8),
46
-	MEMBER(9),
47
-	RANGE(9),
48
-	INDEX(9),
49
-	CALL(9),
50
-	CAST(9),
51
-	
52
-	PRIMARY(10);
53
-	
54
-	private final int priority;
55
-	private final boolean isCommutative;
56
-	
57
-	private OperatorPriority(int priority) {
58
-		this(priority, false);
59
-	}
60
-	
61
-	private OperatorPriority(int priority, boolean isCommutative) {
62
-		this.priority = priority;
63
-		this.isCommutative = isCommutative;
64
-	}
65
-	
66
-	public static boolean shouldWrapLeft(OperatorPriority inner, OperatorPriority outer) {
67
-		return inner == outer || inner.priority <= outer.priority;
68
-	}
69
-	
70
-	public static boolean shouldWrapRight(OperatorPriority inner, OperatorPriority outer) {
71
-		return (inner == outer && inner.isCommutative) || (inner.priority <= outer.priority);
72
-	}
73
-}

CodeFormatter/src/main/java/org/openzen/zenscript/formatter/FormattingSettings.java → CodeFormatter/src/main/java/org/openzen/zenscript/formatter/ScriptFormattingSettings.java View File

@@ -5,17 +5,15 @@
5 5
  */
6 6
 package org.openzen.zenscript.formatter;
7 7
 
8
-import org.openzen.zenscript.shared.StringUtils;
8
+import org.openzen.zenscript.formattershared.FormattingSettings;
9 9
 
10 10
 /**
11 11
  *
12 12
  * @author Hoofdgebruiker
13 13
  */
14
-public class FormattingSettings {
14
+public class ScriptFormattingSettings extends FormattingSettings {
15 15
 	public final boolean showAnyInFunctionHeaders;
16 16
 	public final boolean useSingleQuotesForStrings;
17
-	public final boolean useTabs; // use tabs instead of spaces
18
-	public final int spacesPerTab; // number of spaces per tab
19 17
 	public final boolean spaceBeforeLabelColon;
20 18
 	public final boolean spaceAfterLabelColon;
21 19
 	public final boolean bracketsAroundConditions;
@@ -37,13 +35,11 @@ public class FormattingSettings {
37 35
 	public final boolean functionBracketOnSameLine;
38 36
 	public final boolean lambdaMethodOnSameLine;
39 37
 	
40
-	public final String indent;
41
-	
42
-	private FormattingSettings(Builder builder) {
38
+	private ScriptFormattingSettings(Builder builder) {
39
+		super(builder);
40
+		
43 41
 		showAnyInFunctionHeaders = builder.showAnyInFunctionHeaders;
44 42
 		useSingleQuotesForStrings = builder.useSingleQuotesForStrings;
45
-		useTabs = builder.useTabs;
46
-		spacesPerTab = builder.spacesPerTab;
47 43
 		spaceBeforeLabelColon = builder.spaceBeforeLabelColon;
48 44
 		spaceAfterLabelColon = builder.spaceAfterLabelColon;
49 45
 		bracketsAroundConditions = builder.bracketsAroundConditions;
@@ -64,12 +60,6 @@ public class FormattingSettings {
64 60
 		classBracketOnSameLine = builder.classBracketOnSameLine;
65 61
 		functionBracketOnSameLine = builder.functionBracketOnSameLine;
66 62
 		lambdaMethodOnSameLine = builder.lambdaMethodOnSameLine;
67
-		
68
-		if (useTabs) {
69
-			indent = "\t";
70
-		} else {
71
-			indent = StringUtils.times(' ', spacesPerTab);
72
-		}
73 63
 	}
74 64
 	
75 65
 	public String getSingleLineSeparator(String indent, ParentStatementType position) {
@@ -143,7 +133,7 @@ public class FormattingSettings {
143 133
 		}
144 134
 	}
145 135
 	
146
-	public static class Builder {
136
+	public static class Builder extends FormattingSettings.Builder<Builder> {
147 137
 		private boolean showAnyInFunctionHeaders = false;
148 138
 		private boolean useSingleQuotesForStrings = true;
149 139
 		private boolean useTabs = false;
@@ -169,6 +159,12 @@ public class FormattingSettings {
169 159
 		private boolean functionBracketOnSameLine = false;
170 160
 		private boolean lambdaMethodOnSameLine = false;
171 161
 		
162
+		public Builder() {
163
+			super(CommentFormatter::format);
164
+			
165
+			instance = this;
166
+		}
167
+		
172 168
 		public Builder showAnyInFunctionHeaders(boolean show) {
173 169
 			showAnyInFunctionHeaders = show;
174 170
 			return this;
@@ -179,16 +175,6 @@ public class FormattingSettings {
179 175
 			return this;
180 176
 		}
181 177
 		
182
-		public Builder useTabs(boolean tabs) {
183
-			useTabs = tabs;
184
-			return this;
185
-		}
186
-		
187
-		public Builder spacesPerTabs(int spaces) {
188
-			spacesPerTab = spaces;
189
-			return this;
190
-		}
191
-		
192 178
 		public Builder spaceBeforeLabelColon(boolean space) {
193 179
 			spaceBeforeLabelColon = space;
194 180
 			return this;
@@ -289,8 +275,9 @@ public class FormattingSettings {
289 275
 			return this;
290 276
 		}
291 277
 		
292
-		public FormattingSettings build() {
293
-			return new FormattingSettings(this);
278
+		@Override
279
+		public ScriptFormattingSettings build() {
280
+			return new ScriptFormattingSettings(this);
294 281
 		}
295 282
 	}
296 283
 }

+ 2
- 2
CodeFormatter/src/main/java/org/openzen/zenscript/formatter/StatementFormatter.java View File

@@ -33,14 +33,14 @@ import org.openzen.zenscript.codemodel.statement.WhileStatement;
33 33
  * @author Hoofdgebruiker
34 34
  */
35 35
 public class StatementFormatter implements StatementVisitor<Void> {
36
-	private final FormattingSettings settings;
36
+	private final ScriptFormattingSettings settings;
37 37
 	private final StringBuilder output;
38 38
 	private final ExpressionFormatter expressionFormatter;
39 39
 	
40 40
 	private String indent;
41 41
 	private ParentStatementType position = ParentStatementType.NONE;
42 42
 	
43
-	public StatementFormatter(StringBuilder output, String indent, FormattingSettings settings, ExpressionFormatter expressionFormatter) {
43
+	public StatementFormatter(StringBuilder output, String indent, ScriptFormattingSettings settings, ExpressionFormatter expressionFormatter) {
44 44
 		this.output = output;
45 45
 		this.indent = indent;
46 46
 		this.settings = settings;

+ 2
- 2
CodeFormatter/src/main/java/org/openzen/zenscript/formatter/SwitchValueFormatter.java View File

@@ -18,9 +18,9 @@ import org.openzen.zenscript.shared.StringUtils;
18 18
  * @author Hoofdgebruiker
19 19
  */
20 20
 public class SwitchValueFormatter implements SwitchValueVisitor<String> {
21
-	private final FormattingSettings settings;
21
+	private final ScriptFormattingSettings settings;
22 22
 	
23
-	public SwitchValueFormatter(FormattingSettings settings) {
23
+	public SwitchValueFormatter(ScriptFormattingSettings settings) {
24 24
 		this.settings = settings;
25 25
 	}
26 26
 

+ 6
- 8
CodeFormatter/src/main/java/org/openzen/zenscript/formatter/TypeFormatter.java View File

@@ -5,9 +5,7 @@
5 5
  */
6 6
 package org.openzen.zenscript.formatter;
7 7
 
8
-import org.openzen.zenscript.codemodel.FunctionHeader;
9
-import org.openzen.zenscript.codemodel.FunctionParameter;
10
-import org.openzen.zenscript.codemodel.generic.GenericParameterBound;
8
+import org.openzen.zenscript.formattershared.Importer;
11 9
 import org.openzen.zenscript.codemodel.generic.GenericParameterBoundVisitor;
12 10
 import org.openzen.zenscript.codemodel.generic.ParameterSuperBound;
13 11
 import org.openzen.zenscript.codemodel.generic.ParameterTypeBound;
@@ -32,10 +30,10 @@ import org.openzen.zenscript.shared.StringUtils;
32 30
  * @author Hoofdgebruiker
33 31
  */
34 32
 public class TypeFormatter implements ITypeVisitor<String>, GenericParameterBoundVisitor<String> {
35
-	private final FormattingSettings settings;
33
+	private final ScriptFormattingSettings settings;
36 34
 	private final Importer importer;
37 35
 	
38
-	public TypeFormatter(FormattingSettings settings, Importer importer) {
36
+	public TypeFormatter(ScriptFormattingSettings settings, Importer importer) {
39 37
 		this.settings = settings;
40 38
 		this.importer = importer;
41 39
 	}
@@ -127,9 +125,9 @@ public class TypeFormatter implements ITypeVisitor<String>, GenericParameterBoun
127 125
 	public String visitGenericMap(GenericMapTypeID map) {
128 126
 		StringBuilder result = new StringBuilder();
129 127
 		result.append(map.value.accept(this));
130
-		result.append("[");
131
-		FormattingUtils.formatTypeParameters(result, map.keys, this);
132
-		result.append("]");
128
+		result.append("[<");
129
+		FormattingUtils.formatTypeParameters(result, new TypeParameter[] { map.key }, this);
130
+		result.append("]>");
133 131
 		return result.toString();
134 132
 	}
135 133
 }

+ 106
- 0
CodeFormatter/src/main/java/org/openzen/zenscript/formatter/ZenScriptOperator.java View File

@@ -0,0 +1,106 @@
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.formatter;
7
+
8
+import org.openzen.zenscript.codemodel.CompareType;
9
+import org.openzen.zenscript.formattershared.FormattableOperator;
10
+
11
+/**
12
+ *
13
+ * @author Hoofdgebruiker
14
+ */
15
+public enum ZenScriptOperator implements FormattableOperator {
16
+	ADD(6, " + "),
17
+	SUB(6, " - "),
18
+	MUL(7, " * "),
19
+	DIV(7, " / "),
20
+	MOD(7, " % "),
21
+	CAT(6, " ~ "),
22
+	OR(4, " | "),
23
+	AND(4, " & "),
24
+	XOR(4, " ^ "),
25
+	NEG(8, "-"),
26
+	NOT(8, "!"),
27
+	INVERT(8, "~"),
28
+	CONTAINS(5, " in "),
29
+	EQUALS(6, " == "),
30
+	NOTEQUALS(6, " != "),
31
+	GREATER(6, " > "),
32
+	LESS(6, " < "),
33
+	GREATER_EQUALS(6, " >= "),
34
+	LESS_EQUALS(6, " <= "),
35
+	IS(6, " is "),
36
+	SAME(6, " === "),
37
+	NOTSAME(6, " !== "),
38
+	ASSIGN(0, " = "),
39
+	ADDASSIGN(0, " += "),
40
+	SUBASSIGN(0, " -= "),
41
+	MULASSIGN(0, " *= "),
42
+	DIVASSIGN(0, " /= "),
43
+	MODASSIGN(0, " %= "),
44
+	CATASSIGN(0, " ~= "),
45
+	ORASSIGN(0, " |= "),
46
+	ANDASSIGN(0, " &= "),
47
+	XORASSIGN(0, " ^= "),
48
+	
49
+	ANDAND(3, " && "),
50
+	OROR(2, " || "),
51
+	
52
+	TERNARY(1, null),
53
+	COALESCE(2, " ?? "),
54
+	
55
+	INCREMENT(8, "++"),
56
+	DECREMENT(8, "--"),
57
+	MEMBER(9, null),
58
+	RANGE(9, " .. "),
59
+	INDEX(9, null),
60
+	CALL(9, null),
61
+	CAST(9, null),
62
+	
63
+	PRIMARY(10, null);
64
+	
65
+	private final int priority;
66
+	private final boolean isCommutative;
67
+	private final String operatorString;
68
+	
69
+	private ZenScriptOperator(int priority, String operatorString) {
70
+		this(priority, false, operatorString);
71
+	}
72
+	
73
+	private ZenScriptOperator(int priority, boolean isCommutative, String operatorString) {
74
+		this.priority = priority;
75
+		this.isCommutative = isCommutative;
76
+		this.operatorString = operatorString;
77
+	}
78
+
79
+	@Override
80
+	public int getPriority() {
81
+		return priority;
82
+	}
83
+
84
+	@Override
85
+	public boolean isCommutative() {
86
+		return isCommutative;
87
+	}
88
+	
89
+	@Override
90
+	public String getOperatorString() {
91
+		return operatorString;
92
+	}
93
+	
94
+	public static ZenScriptOperator getComparison(CompareType compare) {
95
+		switch (compare) {
96
+			case EQ: return EQUALS;
97
+			case NE: return NOTEQUALS;
98
+			case LT: return LESS;
99
+			case GT: return GREATER;
100
+			case LE: return LESS_EQUALS;
101
+			case GE: return GREATER_EQUALS;
102
+			default:
103
+				return null;
104
+		}
105
+	}
106
+}

+ 14
- 0
CodeFormatterShared/src/main/java/org/openzen/zenscript/formattershared/CommentFormatter.java View File

@@ -0,0 +1,14 @@
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.formattershared;
7
+
8
+/**
9
+ *
10
+ * @author Hoofdgebruiker
11
+ */
12
+public interface CommentFormatter {
13
+	String[] format(String[] lines);
14
+}

+ 55
- 0
CodeFormatterShared/src/main/java/org/openzen/zenscript/formattershared/ExpressionString.java View File

@@ -0,0 +1,55 @@
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.formattershared;
7
+
8
+/**
9
+ *
10
+ * @author Hoofdgebruiker
11
+ */
12
+public class ExpressionString {
13
+	public final String value;
14
+	public final FormattableOperator priority;
15
+	
16
+	public ExpressionString(String value, FormattableOperator priority) {
17
+		this.value = value;
18
+		this.priority = priority;
19
+	}
20
+	
21
+	public String wrapLeft(FormattableOperator outer) {
22
+		return FormattableOperator.shouldWrapLeft(priority, outer) ? "(" + value + ")" : value;
23
+	}
24
+	
25
+	public String wrapRight(FormattableOperator outer) {
26
+		return FormattableOperator.shouldWrapRight(priority, outer) ? "(" + value + ")" : value;
27
+	}
28
+	
29
+	@Override
30
+	public String toString() {
31
+		return value;
32
+	}
33
+	
34
+	public static ExpressionString binary(ExpressionString left, ExpressionString right, FormattableOperator operator) {
35
+		String value = left.wrapLeft(operator)
36
+				+ operator.getOperatorString() + right.wrapRight(operator);
37
+		return new ExpressionString(value, operator);
38
+	}
39
+	
40
+	public ExpressionString unaryPrefix(FormattableOperator operator) {
41
+		return new ExpressionString(operator.getOperatorString() + value, operator);
42
+	}
43
+	
44
+	public ExpressionString unaryPostfix(FormattableOperator operator) {
45
+		return new ExpressionString(value + operator.getOperatorString(), operator);
46
+	}
47
+	
48
+	public ExpressionString unaryPrefix(FormattableOperator operator, String operatorString) {
49
+		return new ExpressionString(operatorString + value, operator);
50
+	}
51
+	
52
+	public ExpressionString unaryPostfix(FormattableOperator operator, String operatorString) {
53
+		return new ExpressionString(value + operatorString, operator);
54
+	}
55
+}

+ 26
- 0
CodeFormatterShared/src/main/java/org/openzen/zenscript/formattershared/FormattableOperator.java View File

@@ -0,0 +1,26 @@
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.formattershared;
7
+
8
+/**
9
+ *
10
+ * @author Hoofdgebruiker
11
+ */
12
+public interface FormattableOperator {
13
+	int getPriority();
14
+	
15
+	boolean isCommutative();
16
+	
17
+	String getOperatorString();
18
+	
19
+	public static boolean shouldWrapLeft(FormattableOperator inner, FormattableOperator outer) {
20
+		return inner != outer && inner.getPriority() <= outer.getPriority();
21
+	}
22
+	
23
+	public static boolean shouldWrapRight(FormattableOperator inner, FormattableOperator outer) {
24
+		return (inner == outer && inner.isCommutative()) || (inner.getPriority() <= outer.getPriority());
25
+	}
26
+}

+ 56
- 0
CodeFormatterShared/src/main/java/org/openzen/zenscript/formattershared/FormattingSettings.java View File

@@ -0,0 +1,56 @@
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.formattershared;
7
+
8
+import org.openzen.zenscript.shared.StringUtils;
9
+
10
+/**
11
+ *
12
+ * @author Hoofdgebruiker
13
+ */
14
+public class FormattingSettings {
15
+	public final boolean useTabs; // use tabs instead of spaces
16
+	public final int spacesPerTab; // number of spaces per tab
17
+	public final String indent;
18
+	public final CommentFormatter commentFormatter;
19
+	
20
+	protected FormattingSettings(Builder builder) {
21
+		useTabs = builder.useTabs;
22
+		spacesPerTab = builder.spacesPerTab;
23
+		commentFormatter = builder.commentFormatter;
24
+		
25
+		if (useTabs) {
26
+			indent = "\t";
27
+		} else {
28
+			indent = StringUtils.times(' ', spacesPerTab);
29
+		}
30
+	}
31
+	
32
+	public static class Builder<T extends Builder<T>> {
33
+		private final CommentFormatter commentFormatter;
34
+		private boolean useTabs = false;
35
+		private int spacesPerTab = 4;
36
+		protected T instance;
37
+		
38
+		public Builder(CommentFormatter commentFormatter) {
39
+			this.commentFormatter = commentFormatter;
40
+		}
41
+		
42
+		public T useTabs(boolean tabs) {
43
+			useTabs = tabs;
44
+			return instance;
45
+		}
46
+		
47
+		public T spacesPerTabs(int spaces) {
48
+			spacesPerTab = spaces;
49
+			return instance;
50
+		}
51
+		
52
+		public FormattingSettings build() {
53
+			return new FormattingSettings(this);
54
+		}
55
+	}
56
+}

CodeFormatter/src/main/java/org/openzen/zenscript/formatter/Importer.java → CodeFormatterShared/src/main/java/org/openzen/zenscript/formattershared/Importer.java View File

@@ -3,7 +3,7 @@
3 3
  * To change this template file, choose Tools | Templates
4 4
  * and open the template in the editor.
5 5
  */
6
-package org.openzen.zenscript.formatter;
6
+package org.openzen.zenscript.formattershared;
7 7
 
8 8
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
9 9
 

+ 311
- 0
CodeFormatterShared/src/main/java/org/openzen/zenscript/formattershared/StatementFormatter.java View File

@@ -0,0 +1,311 @@
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.formattershared;
7
+
8
+import java.util.List;
9
+import org.openzen.zenscript.codemodel.WhitespaceInfo;
10
+import org.openzen.zenscript.codemodel.statement.BlockStatement;
11
+import org.openzen.zenscript.codemodel.statement.BreakStatement;
12
+import org.openzen.zenscript.codemodel.statement.ContinueStatement;
13
+import org.openzen.zenscript.codemodel.statement.DoWhileStatement;
14
+import org.openzen.zenscript.codemodel.statement.EmptyStatement;
15
+import org.openzen.zenscript.codemodel.statement.ExpressionStatement;
16
+import org.openzen.zenscript.codemodel.statement.ForeachStatement;
17
+import org.openzen.zenscript.codemodel.statement.IfStatement;
18
+import org.openzen.zenscript.codemodel.statement.LockStatement;
19
+import org.openzen.zenscript.codemodel.statement.LoopStatement;
20
+import org.openzen.zenscript.codemodel.statement.ReturnStatement;
21
+import org.openzen.zenscript.codemodel.statement.Statement;
22
+import org.openzen.zenscript.codemodel.statement.StatementVisitor;
23
+import org.openzen.zenscript.codemodel.statement.SwitchStatement;
24
+import org.openzen.zenscript.codemodel.statement.ThrowStatement;
25
+import org.openzen.zenscript.codemodel.statement.TryCatchStatement;
26
+import org.openzen.zenscript.codemodel.statement.VarStatement;
27
+import org.openzen.zenscript.codemodel.statement.WhileStatement;
28
+
29
+/**
30
+ *
31
+ * @author Hoofdgebruiker
32
+ */
33
+public class StatementFormatter implements StatementVisitor<Void>, StatementFormattingTarget {
34
+	private final StringBuilder output;
35
+	private final Formatter formatter;
36
+	private final String indent;
37
+	private final FormattingSettings settings;
38
+	private final LoopStatement innerLoop;
39
+	
40
+	public StatementFormatter(StringBuilder output, FormattingSettings settings, Formatter formatter, String indent, LoopStatement innerLoop) {
41
+		this.output = output;
42
+		this.formatter = formatter;
43
+		this.indent = indent;
44
+		this.settings = settings;
45
+		this.innerLoop = innerLoop;
46
+	}
47
+
48
+	@Override
49
+	public Void visitBlock(BlockStatement statement) {
50
+		WhitespaceInfo whitespace = statement.getTag(WhitespaceInfo.class);
51
+		beginBlock(whitespace);
52
+		formatter.formatBlock(this, statement);
53
+		endBlock(whitespace);
54
+		return null;
55
+	}
56
+
57
+	@Override
58
+	public Void visitBreak(BreakStatement statement) {
59
+		WhitespaceInfo whitespace = statement.getTag(WhitespaceInfo.class);
60
+		beginSingleLine(whitespace);
61
+		formatter.formatBreak(this, statement);
62
+		endSingleLine(whitespace);
63
+		return null;
64
+	}
65
+
66
+	@Override
67
+	public Void visitContinue(ContinueStatement statement) {
68
+		WhitespaceInfo whitespace = statement.getTag(WhitespaceInfo.class);
69
+		beginSingleLine(whitespace);
70
+		formatter.formatContinue(this, statement);
71
+		endSingleLine(whitespace);
72
+		return null;
73
+	}
74
+
75
+	@Override
76
+	public Void visitDoWhile(DoWhileStatement statement) {
77
+		WhitespaceInfo whitespace = statement.getTag(WhitespaceInfo.class);
78
+		beginSingleLine(whitespace);
79
+		formatter.formatDoWhile(this, statement);
80
+		endSingleLine(whitespace);
81
+		return null;
82
+	}
83
+
84
+	@Override
85
+	public Void visitEmpty(EmptyStatement statement) {
86
+		WhitespaceInfo whitespace = statement.getTag(WhitespaceInfo.class);
87
+		beginSingleLine(whitespace);
88
+		formatter.formatEmpty(this, statement);
89
+		endSingleLine(whitespace);
90
+		return null;
91
+	}
92
+
93
+	@Override
94
+	public Void visitExpression(ExpressionStatement statement) {
95
+		WhitespaceInfo whitespace = statement.getTag(WhitespaceInfo.class);
96
+		beginSingleLine(whitespace);
97
+		formatter.formatExpression(this, statement);
98
+		endSingleLine(whitespace);
99
+		return null;
100
+	}
101
+
102
+	@Override
103
+	public Void visitForeach(ForeachStatement statement) {
104
+		WhitespaceInfo whitespace = statement.getTag(WhitespaceInfo.class);
105
+		beginSingleLine(whitespace);
106
+		formatter.formatForeach(this, statement);
107
+		endSingleLine(whitespace);
108
+		return null;
109
+	}
110
+
111
+	@Override
112
+	public Void visitIf(IfStatement statement) {
113
+		WhitespaceInfo whitespace = statement.getTag(WhitespaceInfo.class);
114
+		beginSingleLine(whitespace);
115
+		formatter.formatIf(this, statement);
116
+		endSingleLine(whitespace);
117
+		return null;
118
+	}
119
+
120
+	@Override
121
+	public Void visitLock(LockStatement statement) {
122
+		WhitespaceInfo whitespace = statement.getTag(WhitespaceInfo.class);
123
+		beginSingleLine(whitespace);
124
+		formatter.formatLock(this, statement);
125
+		endSingleLine(whitespace);
126
+		return null;
127
+	}
128
+
129
+	@Override
130
+	public Void visitReturn(ReturnStatement statement) {
131
+		WhitespaceInfo whitespace = statement.getTag(WhitespaceInfo.class);
132
+		beginSingleLine(whitespace);
133
+		formatter.formatReturn(this, statement);
134
+		endSingleLine(whitespace);
135
+		return null;
136
+	}
137
+
138
+	@Override
139
+	public Void visitSwitch(SwitchStatement statement) {
140
+		WhitespaceInfo whitespace = statement.getTag(WhitespaceInfo.class);
141
+		beginSingleLine(whitespace);
142
+		formatter.formatSwitch(this, statement);
143
+		endSingleLine(whitespace);
144
+		return null;
145
+	}
146
+
147
+	@Override
148
+	public Void visitThrow(ThrowStatement statement) {
149
+		WhitespaceInfo whitespace = statement.getTag(WhitespaceInfo.class);
150
+		beginSingleLine(whitespace);
151
+		formatter.formatThrow(this, statement);
152
+		endSingleLine(whitespace);
153
+		return null;
154
+	}
155
+
156
+	@Override
157
+	public Void visitTryCatch(TryCatchStatement statement) {
158
+		WhitespaceInfo whitespace = statement.getTag(WhitespaceInfo.class);
159
+		beginSingleLine(whitespace);
160
+		formatter.formatTryCatch(this, statement);
161
+		endSingleLine(whitespace);
162
+		return null;
163
+	}
164
+
165
+	@Override
166
+	public Void visitVar(VarStatement statement) {
167
+		WhitespaceInfo whitespace = statement.getTag(WhitespaceInfo.class);
168
+		beginSingleLine(whitespace);
169
+		formatter.formatVar(this, statement);
170
+		endSingleLine(whitespace);
171
+		return null;
172
+	}
173
+
174
+	@Override
175
+	public Void visitWhile(WhileStatement statement) {
176
+		WhitespaceInfo whitespace = statement.getTag(WhitespaceInfo.class);
177
+		beginSingleLine(whitespace);
178
+		formatter.formatWhile(this, statement);
179
+		endSingleLine(whitespace);
180
+		return null;
181
+	}
182
+	
183
+	// == StatementFormattingTarget implementation ==
184
+	
185
+	@Override
186
+	public LoopStatement getInnerLoop() {
187
+		return innerLoop;
188
+	}
189
+
190
+	@Override
191
+	public String getIndent() {
192
+		return indent;
193
+	}
194
+	
195
+	@Override
196
+	public void writeLine(String line) {
197
+		output.append('\n').append(indent).append(line);
198
+	}
199
+
200
+	@Override
201
+	public void writeInner(String lineBefore, Statement contents, LoopStatement loop, String lineAfter) {
202
+		output.append('\n').append(indent).append(lineBefore);
203
+		contents.accept(new StatementFormatter(output, settings, formatter, indent + settings.indent, loop == null ? innerLoop : loop));
204
+		
205
+		if (!lineAfter.isEmpty())
206
+			output.append('\n').append(indent).append(lineAfter);
207
+	}
208
+
209
+	@Override
210
+	public void writeInnerMulti(String lineBefore, List<StatementFormattingSubBlock> contents, LoopStatement loop, String lineAfter) {
211
+		output.append('\n').append(indent).append(lineBefore);
212
+		
213
+		String newIndent = indent + settings.indent + settings.indent;
214
+		StatementFormatter inner = new StatementFormatter(output, settings, formatter, newIndent, innerLoop);
215
+		
216
+		for (StatementFormattingSubBlock subBlock : contents) {
217
+			output.append('\n').append(indent).append(settings.indent).append(subBlock.header);
218
+			for (String literal : subBlock.literalStatements)
219
+				output.append('\n').append(newIndent).append(literal);
220
+			for (Statement statement : subBlock.statements)
221
+				statement.accept(inner);
222
+		}
223
+		
224
+		if (!lineAfter.isEmpty())
225
+			output.append('\n').append(indent).append(lineAfter);
226
+	}
227
+
228
+	@Override
229
+	public void writeBlock(String lineBefore, BlockStatement contents, String lineAfter) {
230
+		output.append(' ').append(lineBefore);
231
+		
232
+		StatementFormatter inner = new StatementFormatter(output, settings, formatter, indent, innerLoop);
233
+		for (Statement statement : contents.statements)
234
+			statement.accept(inner);
235
+		
236
+		if (!lineAfter.isEmpty())
237
+			output.append('\n').append(indent.substring(0, indent.length() - settings.indent.length())).append(lineAfter);
238
+	}
239
+	
240
+	private void beginBlock(WhitespaceInfo whitespace) {
241
+		if (whitespace != null && whitespace.emptyLine) {
242
+			output.append("\n").append(indent);
243
+		}
244
+		
245
+		if (whitespace != null)
246
+			writeComments(whitespace.commentsBefore);
247
+	}
248
+	
249
+	private void endBlock(WhitespaceInfo whitespace) {
250
+		if (whitespace != null && !whitespace.commentsAfter.isEmpty())
251
+			output.append(' ').append(whitespace.commentsAfter);
252
+	}
253
+	
254
+	private void beginSingleLine(WhitespaceInfo whitespace) {
255
+		if (whitespace != null) {
256
+			if (whitespace.emptyLine) {
257
+				output.append("\n").append(indent);
258
+			}
259
+			writeComments(whitespace.commentsBefore);
260
+		}
261
+	}
262
+	
263
+	private void endSingleLine(WhitespaceInfo whitespace) {
264
+		if (whitespace != null && !whitespace.commentsAfter.isEmpty())
265
+			output.append(' ').append(whitespace.commentsAfter);
266
+	}
267
+	
268
+	private void writeComments(String[] comments) {
269
+		for (String comment : settings.commentFormatter.format(comments)) {
270
+			output.append(comment).append("\n").append(indent);
271
+		}
272
+	}
273
+	
274
+	private void writePostComments(String[] comments) {
275
+		for (String comment : settings.commentFormatter.format(comments)) {
276
+			output.append("\n").append(indent).append(comment);
277
+		}
278
+	}
279
+	
280
+	public interface Formatter {
281
+		public void formatBlock(StatementFormattingTarget target, BlockStatement statement);
282
+	
283
+		public void formatBreak(StatementFormattingTarget target, BreakStatement statement);
284
+
285
+		public void formatContinue(StatementFormattingTarget target, ContinueStatement statement);
286
+
287
+		public void formatDoWhile(StatementFormattingTarget target, DoWhileStatement statement);
288
+
289
+		public void formatEmpty(StatementFormattingTarget target, EmptyStatement statement);
290
+
291
+		public void formatExpression(StatementFormattingTarget target, ExpressionStatement statement);
292
+
293
+		public void formatForeach(StatementFormattingTarget target, ForeachStatement statement);
294
+
295
+		public void formatIf(StatementFormattingTarget target, IfStatement statement);
296
+
297
+		public void formatLock(StatementFormattingTarget target, LockStatement statement);
298
+
299
+		public void formatReturn(StatementFormattingTarget target, ReturnStatement statement);
300
+
301
+		public void formatSwitch(StatementFormattingTarget target, SwitchStatement statement);
302
+
303
+		public void formatThrow(StatementFormattingTarget target, ThrowStatement statement);
304
+
305
+		public void formatTryCatch(StatementFormattingTarget target, TryCatchStatement statement);
306
+
307
+		public void formatVar(StatementFormattingTarget target, VarStatement statement);
308
+
309
+		public void formatWhile(StatementFormattingTarget target, WhileStatement statement);
310
+	}
311
+}

+ 25
- 0
CodeFormatterShared/src/main/java/org/openzen/zenscript/formattershared/StatementFormattingSubBlock.java View File

@@ -0,0 +1,25 @@
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.formattershared;
7
+
8
+import java.util.List;
9
+import org.openzen.zenscript.codemodel.statement.Statement;
10
+
11
+/**
12
+ *
13
+ * @author Hoofdgebruiker
14
+ */
15
+public class StatementFormattingSubBlock {
16
+	public final String header;
17
+	public final List<String> literalStatements;
18
+	public final List<Statement> statements;
19
+	
20
+	public StatementFormattingSubBlock(String header, List<String> literalStatements, List<Statement> statements) {
21
+		this.header = header;
22
+		this.literalStatements = literalStatements;
23
+		this.statements = statements;
24
+	}
25
+}

+ 29
- 0
CodeFormatterShared/src/main/java/org/openzen/zenscript/formattershared/StatementFormattingTarget.java View File

@@ -0,0 +1,29 @@
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.formattershared;
7
+
8
+import java.util.List;
9
+import org.openzen.zenscript.codemodel.statement.BlockStatement;
10
+import org.openzen.zenscript.codemodel.statement.LoopStatement;
11
+import org.openzen.zenscript.codemodel.statement.Statement;
12
+
13
+/**
14
+ *
15
+ * @author Hoofdgebruiker
16
+ */
17
+public interface StatementFormattingTarget {
18
+	LoopStatement getInnerLoop();
19
+	
20
+	String getIndent();
21
+	
22
+	void writeLine(String line);
23
+	
24
+	void writeInner(String lineBefore, Statement contents, LoopStatement loop, String lineAfter);
25
+	
26
+	void writeInnerMulti(String lineBefore, List<StatementFormattingSubBlock> contents, LoopStatement loop, String lineAfter);
27
+	
28
+	void writeBlock(String lineBefore, BlockStatement contents, String lineAfter);
29
+}

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

@@ -11,9 +11,7 @@ public enum CompareType {
11 11
 	EQ("=="),
12 12
 	NE("!="),
13 13
 	LE("<="),
14
-	GE(">="),
15
-	SAME("==="),
16
-	NOTSAME("!==");
14
+	GE(">=");
17 15
 	
18 16
 	public final String str;
19 17
 	

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

@@ -28,6 +28,7 @@ public abstract class HighLevelDefinition extends Taggable {
28 28
 	public final String name;
29 29
 	public final int modifiers;
30 30
 	public final List<IDefinitionMember> members = new ArrayList<>();
31
+	public final AccessScope access = new AccessScope();
31 32
 	public TypeParameter[] genericParameters = null;
32 33
 	
33 34
 	public HighLevelDefinition outerDefinition;

+ 4
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/OperatorType.java View File

@@ -16,6 +16,7 @@ public enum OperatorType {
16 16
 	AND("&", "and"),
17 17
 	XOR("^", "xor"),
18 18
 	NEG("-", "negate"),
19
+	INVERT("~", "invert"),
19 20
 	NOT("!", "not"),
20 21
 	INDEXSET("[]=", "setElement"),
21 22
 	INDEXGET("[]", "getElement"),
@@ -24,6 +25,9 @@ public enum OperatorType {
24 25
 	MEMBERGETTER(".", "getMember"),
25 26
 	MEMBERSETTER(".=", "setMember"),
26 27
 	EQUALS("==", "equals"),
28
+	NOTEQUALS("!=", "notEquals"),
29
+	SAME("===", "same"),
30
+	NOTSAME("!==", "notSame"),
27 31
 	SHL("<<", "shl"),
28 32
 	SHR(">>", "shr"),
29 33
 	USHR(">>>", "ushr"),

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

@@ -36,7 +36,7 @@ public class FunctionDefinition extends HighLevelDefinition {
36 36
 	
37 37
 	public void setHeader(FunctionHeader header) {
38 38
 		this.header = header;
39
-		addMember(caller = new CallerMember(position, this, modifiers | Modifiers.STATIC, header));
39
+		addMember(caller = new CallerMember(position, this, modifiers | Modifiers.STATIC, header, null));
40 40
 		callerGroup.addMethod(caller, TypeMemberPriority.SPECIFIED);
41 41
 	}
42 42
 	

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

@@ -27,4 +27,13 @@ public class AndAndExpression extends Expression {
27 27
 	public <T> T accept(ExpressionVisitor<T> visitor) {
28 28
 		return visitor.visitAndAnd(this);
29 29
 	}
30
+
31
+	@Override
32
+	public Expression transform(ExpressionTransformer transformer) {
33
+		Expression tLeft = left.transform(transformer);
34
+		Expression tRight = right.transform(transformer);
35
+		return tLeft == left && tRight == right
36
+				? this
37
+				: new AndAndExpression(position, tLeft, tRight);
38
+	}
30 39
 }

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

@@ -27,4 +27,10 @@ public class ArrayExpression extends Expression {
27 27
 	public <T> T accept(ExpressionVisitor<T> visitor) {
28 28
 		return visitor.visitArray(this);
29 29
 	}
30
+
31
+	@Override
32
+	public Expression transform(ExpressionTransformer transformer) {
33
+		Expression[] tExpressions = Expression.transform(expressions, transformer);
34
+		return tExpressions == expressions ? this : new ArrayExpression(position, tExpressions, (ArrayTypeID)type);
35
+	}
30 36
 }

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

@@ -43,6 +43,11 @@ public class CallArguments {
43 43
 		return typeArguments.length;
44 44
 	}
45 45
 	
46
+	public CallArguments transform(ExpressionTransformer transformer) {
47
+		Expression[] tArguments = Expression.transform(arguments, transformer);
48
+		return tArguments == arguments ? this : new CallArguments(typeArguments, tArguments);
49
+	}
50
+	
46 51
 	public CallArguments normalize(CodePosition position, TypeScope scope, FunctionHeader header) {
47 52
 		CallArguments result = this;
48 53
 		

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

@@ -25,7 +25,7 @@ public class CallExpression extends Expression {
25 25
 		
26 26
 		this.target = target;
27 27
 		this.member = member;
28
-		this.arguments = arguments.normalize(position, scope, instancedHeader);
28
+		this.arguments = scope == null ? arguments : arguments.normalize(position, scope, instancedHeader);
29 29
 		this.instancedHeader = instancedHeader;
30 30
 	}
31 31
 	
@@ -37,4 +37,13 @@ public class CallExpression extends Expression {
37 37
 	public <T> T accept(ExpressionVisitor<T> visitor) {
38 38
 		return visitor.visitCall(this);
39 39
 	}
40
+
41
+	@Override
42
+	public Expression transform(ExpressionTransformer transformer) {
43
+		Expression tTarget = target.transform(transformer);
44
+		CallArguments tArguments = arguments.transform(transformer);
45
+		return tTarget == target && tArguments == arguments
46
+				? this
47
+				: new CallExpression(position, tTarget, member, instancedHeader, tArguments, null);
48
+	}
40 49
 }

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

@@ -26,7 +26,7 @@ public class CallStaticExpression extends Expression {
26 26
 		
27 27
 		this.member = member;
28 28
 		this.target = target;
29
-		this.arguments = arguments.normalize(position, scope, instancedHeader);
29
+		this.arguments = scope == null ? arguments : arguments.normalize(position, scope, instancedHeader);
30 30
 		this.instancedHeader = instancedHeader;
31 31
 	}
32 32
 
@@ -34,4 +34,10 @@ public class CallStaticExpression extends Expression {
34 34
 	public <T> T accept(ExpressionVisitor<T> visitor) {
35 35
 		return visitor.visitCallStatic(this);
36 36
 	}
37
+
38
+	@Override
39
+	public Expression transform(ExpressionTransformer transformer) {
40
+		CallArguments tArguments = arguments.transform(transformer);
41
+		return arguments == tArguments ? this : new CallStaticExpression(position, target, member, tArguments, instancedHeader, null);
42
+	}
37 43
 }

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

@@ -29,4 +29,14 @@ public class CapturedClosureExpression extends CapturedExpression {
29 29
 	public <T> T accept(CapturedExpressionVisitor<T> visitor) {
30 30
 		return visitor.visitRecaptured(this);
31 31
 	}
32
+
33
+	@Override
34
+	public Expression transform(ExpressionTransformer transformer) {
35
+		Expression tValue = transformer.transform(value);
36
+		if (!(tValue instanceof CapturedExpression)) {
37
+			throw new IllegalStateException("Transformed CapturedExpression must also be a CapturedExpression!");
38
+		} else {
39
+			return tValue == value ? this : new CapturedClosureExpression(position, (CapturedExpression)tValue, closure);
40
+		}
41
+	}
32 42
 }

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

@@ -5,6 +5,8 @@
5 5
  */
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8
+import java.util.Map;
9
+import org.openzen.zenscript.codemodel.FunctionParameter;
8 10
 import org.openzen.zenscript.shared.CodePosition;
9 11
 
10 12
 /**
@@ -28,4 +30,10 @@ public class CapturedDirectExpression extends CapturedExpression {
28 30
 	public <T> T accept(CapturedExpressionVisitor<T> visitor) {
29 31
 		return visitor.visitCapturedDirect(this);
30 32
 	}
33
+
34
+	@Override
35
+	public Expression transform(ExpressionTransformer transformer) {
36
+		Expression tValue = transformer.transform(value);
37
+		return tValue == value ? this : new CapturedDirectExpression(position, closure, tValue);
38
+	}
31 39
 }

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

@@ -30,4 +30,9 @@ public class CapturedLocalVariableExpression extends CapturedExpression {
30 30
 	public <T> T accept(CapturedExpressionVisitor<T> visitor) {
31 31
 		return visitor.visitCapturedLocal(this);
32 32
 	}
33
+
34
+	@Override
35
+	public Expression transform(ExpressionTransformer transformer) {
36
+		return this;
37
+	}
33 38
 }

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

@@ -30,4 +30,9 @@ public class CapturedParameterExpression extends CapturedExpression {
30 30
 	public <T> T accept(CapturedExpressionVisitor<T> visitor) {
31 31
 		return visitor.visitCapturedParameter(this);
32 32
 	}
33
+
34
+	@Override
35
+	public Expression transform(ExpressionTransformer transformer) {
36
+		return this;
37
+	}
33 38
 }

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

@@ -26,4 +26,9 @@ public class CapturedThisExpression extends CapturedExpression {
26 26
 	public <T> T accept(CapturedExpressionVisitor<T> visitor) {
27 27
 		return visitor.visitCapturedThis(this);
28 28
 	}
29
+
30
+	@Override
31
+	public Expression transform(ExpressionTransformer transformer) {
32
+		return this;
33
+	}
29 34
 }

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

@@ -5,6 +5,8 @@
5 5
  */
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8
+import java.util.Map;
9
+import org.openzen.zenscript.codemodel.FunctionParameter;
8 10
 import org.openzen.zenscript.codemodel.member.CasterMember;
9 11
 import org.openzen.zenscript.shared.CodePosition;
10 12
 
@@ -29,4 +31,10 @@ public class CastExpression extends Expression {
29 31
 	public <T> T accept(ExpressionVisitor<T> visitor) {
30 32
 		return visitor.visitCast(this);
31 33
 	}
34
+
35
+	@Override
36
+	public Expression transform(ExpressionTransformer transformer) {
37
+		Expression tTarget = target.transform(transformer);
38
+		return target == tTarget ? this : new CastExpression(position, tTarget, member, isImplicit);
39
+	}
32 40
 }

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

@@ -25,4 +25,10 @@ public class CheckNullExpression extends Expression {
25 25
 	public <T> T accept(ExpressionVisitor<T> visitor) {
26 26
 		return visitor.visitCheckNull(this);
27 27
 	}
28
+
29
+	@Override
30
+	public Expression transform(ExpressionTransformer transformer) {
31
+		Expression tValue = transformer.transform(value);
32
+		return value == tValue ? this : new CheckNullExpression(position, tValue);
33
+	}
28 34
 }

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

@@ -26,4 +26,11 @@ public class CoalesceExpression extends Expression {
26 26
 	public <T> T accept(ExpressionVisitor<T> visitor) {
27 27
 		return visitor.visitCoalesce(this);
28 28
 	}
29
+
30
+	@Override
31
+	public Expression transform(ExpressionTransformer transformer) {
32
+		Expression tLeft = left.transform(transformer);
33
+		Expression tRight = right.transform(transformer);
34
+		return tLeft == left && tRight == right ? this : new CoalesceExpression(position, tLeft, tRight);
35
+	}
29 36
 }

CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/BasicCompareExpression.java → CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/CompareExpression.java View File

@@ -6,6 +6,8 @@
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zenscript.codemodel.CompareType;
9
+import org.openzen.zenscript.codemodel.member.FunctionalMember;
10
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9 11
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10 12
 import org.openzen.zenscript.shared.CodePosition;
11 13
 
@@ -15,21 +17,30 @@ import org.openzen.zenscript.shared.CodePosition;
15 17
  * 
16 18
  * @author Hoofdgebruiker
17 19
  */
18
-public class BasicCompareExpression extends Expression {
20
+public class CompareExpression extends Expression {
19 21
 	public final Expression left;
20 22
 	public final Expression right;
21
-	public final CompareType operator;
23
+	public final FunctionalMember operator;
24
+	public final CompareType comparison;
22 25
 	
23
-	public BasicCompareExpression(CodePosition position, Expression left, Expression right, CompareType operator) {
26
+	public CompareExpression(CodePosition position, Expression left, Expression right, FunctionalMember operator, CompareType comparison, TypeScope scope) {
24 27
 		super(position, BasicTypeID.BOOL, binaryThrow(position, left.thrownType, right.thrownType));
25 28
 		
26 29
 		this.left = left;
27
-		this.right = right;
30
+		this.right = scope == null ? right : right.castImplicit(position, scope, operator.header.parameters[0].type);
28 31
 		this.operator = operator;
32
+		this.comparison = comparison;
29 33
 	}
30 34
 
31 35
 	@Override
32 36
 	public <T> T accept(ExpressionVisitor<T> visitor) {
33 37
 		return visitor.visitCompare(this);
34 38
 	}
39
+
40
+	@Override
41
+	public Expression transform(ExpressionTransformer transformer) {
42
+		Expression tLeft = left.transform(transformer);
43
+		Expression tRight = right.transform(transformer);
44
+		return left == tLeft && right == tRight ? this : new CompareExpression(position, tLeft, tRight, operator, comparison, null);
45
+	}
35 46
 }

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

@@ -37,4 +37,14 @@ public class ConditionalExpression extends Expression {
37 37
 	public <T> T accept(ExpressionVisitor<T> visitor) {
38 38
 		return visitor.visitConditional(this);
39 39
 	}
40
+
41
+	@Override
42
+	public Expression transform(ExpressionTransformer transformer) {
43
+		Expression tCondition = transformer.transform(condition);
44
+		Expression tIfThen = transformer.transform(ifThen);
45
+		Expression tIfElse = transformer.transform(ifElse);
46
+		return tCondition == condition && tIfThen == ifThen && tIfElse == ifElse
47
+				? this
48
+				: new ConditionalExpression(position, tCondition, tIfThen, tIfElse, type);
49
+	}
40 50
 }

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

@@ -25,4 +25,9 @@ public class ConstantBoolExpression extends Expression {
25 25
 	public <T> T accept(ExpressionVisitor<T> visitor) {
26 26
 		return visitor.visitConstantBool(this);
27 27
 	}
28
+
29
+	@Override
30
+	public Expression transform(ExpressionTransformer transformer) {
31
+		return this;
32
+	}
28 33
 }

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

@@ -25,4 +25,9 @@ public class ConstantByteExpression extends Expression {
25 25
 	public <T> T accept(ExpressionVisitor<T> visitor) {
26 26
 		return visitor.visitConstantByte(this);
27 27
 	}
28
+
29
+	@Override
30
+	public Expression transform(ExpressionTransformer transformer) {
31
+		return this;
32
+	}
28 33
 }

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

@@ -25,4 +25,9 @@ public class ConstantCharExpression extends Expression {
25 25
 	public <T> T accept(ExpressionVisitor<T> visitor) {
26 26
 		return visitor.visitConstantChar(this);
27 27
 	}
28
+
29
+	@Override
30
+	public Expression transform(ExpressionTransformer transformer) {
31
+		return this;
32
+	}
28 33
 }

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

@@ -25,4 +25,9 @@ public class ConstantDoubleExpression extends Expression {
25 25
 	public <T> T accept(ExpressionVisitor<T> visitor) {
26 26
 		return visitor.visitConstantDouble(this);
27 27
 	}
28
+
29
+	@Override
30
+	public Expression transform(ExpressionTransformer transformer) {
31
+		return this;
32
+	}
28 33
 }

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

@@ -25,4 +25,9 @@ public class ConstantFloatExpression extends Expression {
25 25
 	public <T> T accept(ExpressionVisitor<T> visitor) {
26 26
 		return visitor.visitConstantFloat(this);
27 27
 	}
28
+
29
+	@Override
30
+	public Expression transform(ExpressionTransformer transformer) {
31
+		return this;
32
+	}
28 33
 }

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

@@ -25,4 +25,9 @@ public class ConstantIntExpression extends Expression {
25 25
 	public <T> T accept(ExpressionVisitor<T> visitor) {
26 26
 		return visitor.visitConstantInt(this);
27 27
 	}
28
+
29
+	@Override
30
+	public Expression transform(ExpressionTransformer transformer) {
31
+		return this;
32
+	}
28 33
 }

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

@@ -25,4 +25,9 @@ public class ConstantLongExpression extends Expression {
25 25
 	public <T> T accept(ExpressionVisitor<T> visitor) {
26 26
 		return visitor.visitConstantLong(this);
27 27
 	}
28
+
29
+	@Override
30
+	public Expression transform(ExpressionTransformer transformer) {
31
+		return this;
32
+	}
28 33
 }

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

@@ -25,4 +25,9 @@ public class ConstantSByteExpression extends Expression {
25 25
 	public <T> T accept(ExpressionVisitor<T> visitor) {
26 26
 		return visitor.visitConstantSByte(this);
27 27
 	}
28
+
29
+	@Override
30
+	public Expression transform(ExpressionTransformer transformer) {
31
+		return this;
32
+	}
28 33
 }

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

@@ -25,4 +25,9 @@ public class ConstantShortExpression extends Expression {
25 25
 	public <T> T accept(ExpressionVisitor<T> visitor) {
26 26
 		return visitor.visitConstantShort(this);
27 27
 	}
28
+
29
+	@Override
30
+	public Expression transform(ExpressionTransformer transformer) {
31
+		return this;
32
+	}
28 33
 }

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

@@ -25,4 +25,9 @@ public class ConstantStringExpression extends Expression {
25 25
 	public <T> T accept(ExpressionVisitor<T> visitor) {
26 26
 		return visitor.visitConstantString(this);
27 27
 	}
28
+
29
+	@Override
30
+	public Expression transform(ExpressionTransformer transformer) {
31
+		return this;
32
+	}
28 33
 }

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

@@ -25,4 +25,9 @@ public class ConstantUIntExpression extends Expression {
25 25
 	public <T> T accept(ExpressionVisitor<T> visitor) {
26 26
 		return visitor.visitConstantUInt(this);
27 27
 	}
28
+
29
+	@Override
30
+	public Expression transform(ExpressionTransformer transformer) {
31
+		return this;
32
+	}
28 33
 }

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

@@ -25,4 +25,9 @@ public class ConstantULongExpression extends Expression {
25 25
 	public <T> T accept(ExpressionVisitor<T> visitor) {
26 26
 		return visitor.visitConstantULong(this);
27 27
 	}
28
+
29
+	@Override
30
+	public Expression transform(ExpressionTransformer transformer) {
31
+		return this;
32
+	}
28 33
 }

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

@@ -25,4 +25,9 @@ public class ConstantUShortExpression extends Expression {
25 25
 	public <T> T accept(ExpressionVisitor<T> visitor) {
26 26
 		return visitor.visitConstantUShort(this);
27 27
 	}
28
+
29
+	@Override
30
+	public Expression transform(ExpressionTransformer transformer) {
31
+		return this;
32
+	}
28 33
 }

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

@@ -25,11 +25,17 @@ public class ConstructorSuperCallExpression extends Expression {
25 25
 		
26 26
 		this.objectType = type;
27 27
 		this.constructor = constructor;
28
-		this.arguments = arguments.normalize(position, scope, constructor.header);
28
+		this.arguments = scope == null ? arguments : arguments.normalize(position, scope, constructor.header);
29 29
 	}
30 30
 
31 31
 	@Override
32 32
 	public <T> T accept(ExpressionVisitor<T> visitor) {
33 33
 		return visitor.visitConstructorSuperCall(this);
34 34
 	}
35
+
36
+	@Override
37
+	public Expression transform(ExpressionTransformer transformer) {
38
+		CallArguments tArguments = arguments.transform(transformer);
39
+		return tArguments == arguments ? this : new ConstructorSuperCallExpression(position, type, constructor, tArguments, null);
40
+	}
35 41
 }

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

@@ -23,15 +23,19 @@ public class ConstructorThisCallExpression extends Expression {
23 23
 	public ConstructorThisCallExpression(CodePosition position, ITypeID type, ConstructorMember constructor, CallArguments arguments, TypeScope scope) {
24 24
 		super(position, BasicTypeID.VOID, binaryThrow(position, constructor.header.thrownType, multiThrow(position, arguments.arguments)));
25 25
 		
26
-		arguments = arguments.normalize(position, scope, constructor.header);
27
-		
28 26
 		this.objectType = type;
29 27
 		this.constructor = constructor;
30
-		this.arguments = arguments;
28
+		this.arguments = scope == null ? arguments : arguments.normalize(position, scope, constructor.header);
31 29
 	}
32 30
 
33 31
 	@Override
34 32
 	public <T> T accept(ExpressionVisitor<T> visitor) {
35 33
 		return visitor.visitConstructorThisCall(this);
36 34
 	}
35
+
36
+	@Override
37
+	public Expression transform(ExpressionTransformer transformer) {
38
+		CallArguments tArguments = arguments.transform(transformer);
39
+		return tArguments == arguments ? this : new ConstructorThisCallExpression(position, type, constructor, tArguments, null);
40
+	}
37 41
 }

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

@@ -34,4 +34,9 @@ public class EnumConstantExpression extends Expression {
34 34
 	public <T> T accept(ExpressionVisitor<T> visitor) {
35 35
 		return visitor.visitEnumConstant(this);
36 36
 	}
37
+
38
+	@Override
39
+	public Expression transform(ExpressionTransformer transformer) {
40
+		return this;
41
+	}
37 42
 }

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

@@ -7,8 +7,10 @@ package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import java.util.Collections;
9 9
 import java.util.List;
10
+import java.util.Map;
10 11
 import java.util.stream.Collectors;
11 12
 import org.openzen.zenscript.codemodel.FunctionHeader;
13
+import org.openzen.zenscript.codemodel.FunctionParameter;
12 14
 import org.openzen.zenscript.codemodel.OperatorType;
13 15
 import org.openzen.zenscript.codemodel.partial.IPartialExpression;
14 16
 import org.openzen.zenscript.codemodel.type.GenericName;
@@ -36,6 +38,8 @@ public abstract class Expression implements IPartialExpression {
36 38
 	
37 39
 	public abstract <T> T accept(ExpressionVisitor<T> visitor);
38 40
 	
41
+	public abstract Expression transform(ExpressionTransformer transformer);
42
+	
39 43
 	@Override
40 44
 	public List<ITypeID> getAssignHints() {
41 45
 		return Collections.singletonList(type);
@@ -102,4 +106,15 @@ public abstract class Expression implements IPartialExpression {
102 106
 			result = binaryThrow(position, result, expression.thrownType);
103 107
 		return result;
104 108
 	}
109
+	
110
+	public static Expression[] transform(Expression[] expressions, ExpressionTransformer transformer) {
111
+		Expression[] tExpressions = new Expression[expressions.length];
112
+		boolean changed = false;
113
+		for (int i = 0; i < tExpressions.length; i++) {
114
+			Expression tExpression = expressions[i].transform(transformer);
115
+			changed |= tExpression != expressions[i];
116
+			tExpressions[i] = tExpression;
117
+		}
118
+		return changed ? tExpressions : expressions;
119
+	}
105 120
 }

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

@@ -0,0 +1,14 @@
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
+/**
9
+ *
10
+ * @author Hoofdgebruiker
11
+ */
12
+public interface ExpressionTransformer {
13
+	Expression transform(Expression original);
14
+}

+ 3
- 3
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/ExpressionVisitor.java View File

@@ -14,7 +14,7 @@ public interface ExpressionVisitor<T> {
14 14
 	
15 15
 	public T visitArray(ArrayExpression expression);
16 16
 	
17
-	public T visitCompare(BasicCompareExpression expression);
17
+	public T visitCompare(CompareExpression expression);
18 18
 	
19 19
 	public T visitCall(CallExpression expression);
20 20
 	
@@ -72,8 +72,6 @@ public interface ExpressionVisitor<T> {
72 72
 	
73 73
 	public T visitFunction(FunctionExpression expression);
74 74
 	
75
-	public T visitGenericCompare(GenericCompareExpression expression);
76
-	
77 75
 	public T visitGetField(GetFieldExpression expression);
78 76
 	
79 77
 	public T visitGetFunctionParameter(GetFunctionParameterExpression expression);
@@ -128,6 +126,8 @@ public interface ExpressionVisitor<T> {
128 126
 	
129 127
 	public T visitThis(ThisExpression expression);
130 128
 	
129
+	public T visitThrow(ThrowExpression expression);
130
+	
131 131
 	public T visitTryConvert(TryConvertExpression expression);
132 132
 	
133 133
 	public T visitTryRethrowAsException(TryRethrowAsExceptionExpression expression);

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

@@ -5,10 +5,16 @@
5 5
  */
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8
+import java.util.HashMap;
9
+import java.util.Map;
8 10
 import org.openzen.zenscript.codemodel.FunctionHeader;
11
+import org.openzen.zenscript.codemodel.FunctionParameter;
12
+import org.openzen.zenscript.codemodel.statement.ExpressionStatement;
13
+import org.openzen.zenscript.codemodel.statement.ReturnStatement;
9 14
 import org.openzen.zenscript.codemodel.statement.Statement;
10 15
 import org.openzen.zenscript.codemodel.type.FunctionTypeID;
11 16
 import org.openzen.zenscript.shared.CodePosition;
17
+import org.openzen.zenscript.shared.ConcatMap;
12 18
 
13 19
 /**
14 20
  *
@@ -35,4 +41,51 @@ public class FunctionExpression extends Expression {
35 41
 	public <T> T accept(ExpressionVisitor<T> visitor) {
36 42
 		return visitor.visitFunction(this);
37 43
 	}
44
+
45
+	@Override
46
+	public FunctionExpression transform(ExpressionTransformer transformer) {
47
+		Statement tBody = body.transform(transformer, ConcatMap.empty());
48
+		return tBody == body ? this : new FunctionExpression(position, (FunctionTypeID)type, closure, tBody);
49
+	}
50
+	
51
+	/**
52
+	 * Checks if this is a simple function expression. A simple function
53
+	 * expression consists of a body with just a expression or return statement.
54
+	 * 
55
+	 * @return 
56
+	 */
57
+	public boolean isSimple() {
58
+		return body instanceof ReturnStatement || body instanceof ExpressionStatement;
59
+	}
60
+	
61
+	public Expression asReturnExpression(Expression... arguments) {
62
+		Map<FunctionParameter, Expression> filledArguments = new HashMap<>();
63
+		if (body instanceof ReturnStatement) {
64
+			return ((ReturnStatement)body).value.transform(new ReturnExpressionTransformer(closure, filledArguments));
65
+		} else {
66
+			return null;
67
+		}
68
+	}
69
+	
70
+	private static class ReturnExpressionTransformer implements ExpressionTransformer {
71
+		private final LambdaClosure closure;
72
+		private final Map<FunctionParameter, Expression> filledArguments;
73
+		
74
+		public ReturnExpressionTransformer(LambdaClosure closure, Map<FunctionParameter, Expression> filledArguments) {
75
+			this.closure = closure;
76
+			this.filledArguments = filledArguments;
77
+		}
78
+		
79
+		@Override
80
+		public Expression transform(Expression original) {
81
+			if (original instanceof GetFunctionParameterExpression) {
82
+				GetFunctionParameterExpression getParameter = (GetFunctionParameterExpression)original;
83
+				if (filledArguments.containsKey(getParameter.parameter)) {
84
+					return filledArguments.get(getParameter.parameter);
85
+				}
86
+			}
87
+			
88
+			return original;
89
+		}
90
+	}
38 91
 }

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

@@ -1,31 +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.codemodel.expression;
7
-
8
-import org.openzen.zenscript.codemodel.CompareType;
9
-import org.openzen.zenscript.codemodel.type.BasicTypeID;
10
-import org.openzen.zenscript.shared.CodePosition;
11
-
12
-/**
13
- *
14
- * @author Hoofdgebruiker
15
- */
16
-public class GenericCompareExpression extends Expression {
17
-	public final Expression value;
18
-	public final CompareType operator;
19
-	
20
-	public GenericCompareExpression(CodePosition position, Expression value, CompareType operator) {
21
-		super(position, BasicTypeID.BOOL, value.thrownType);
22
-		
23
-		this.value = value;
24
-		this.operator = operator;
25
-	}
26
-
27
-	@Override
28
-	public <T> T accept(ExpressionVisitor<T> visitor) {
29
-		return visitor.visitGenericCompare(this);
30
-	}
31
-}

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

@@ -11,8 +11,6 @@ import org.openzen.zenscript.codemodel.member.FieldMember;
11 11
 import org.openzen.zenscript.codemodel.scope.TypeScope;
12 12
 import org.openzen.zenscript.codemodel.type.ITypeID;
13 13
 import org.openzen.zenscript.shared.CodePosition;
14
-import org.openzen.zenscript.shared.CompileException;
15
-import org.openzen.zenscript.shared.CompileExceptionCode;
16 14
 
17 15
 /**
18 16
  *
@@ -48,4 +46,10 @@ public class GetFieldExpression extends Expression {
48 46
 	public <T> T accept(ExpressionVisitor<T> visitor) {
49 47
 		return visitor.visitGetField(this);
50 48
 	}
49
+
50
+	@Override
51
+	public Expression transform(ExpressionTransformer transformer) {
52
+		Expression tTarget = target.transform(transformer);
53
+		return tTarget == target ? this : new GetFieldExpression(position, tTarget, field);
54
+	}
51 55
 }

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

@@ -38,4 +38,9 @@ public class GetFunctionParameterExpression extends Expression {
38 38
 	public <T> T accept(ExpressionVisitor<T> visitor) {
39 39
 		return visitor.visitGetFunctionParameter(this);
40 40
 	}
41
+
42
+	@Override
43
+	public Expression transform(ExpressionTransformer transformer) {
44
+		return this;
45
+	}
41 46
 }

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

@@ -38,4 +38,9 @@ public class GetLocalVariableExpression extends Expression {
38 38
 	public <T> T accept(ExpressionVisitor<T> visitor) {
39 39
 		return visitor.visitGetLocalVariable(this);
40 40
 	}
41
+
42
+	@Override
43
+	public Expression transform(ExpressionTransformer transformer) {
44
+		return this;
45
+	}
41 46
 }

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

@@ -38,4 +38,9 @@ public class GetStaticFieldExpression extends Expression {
38 38
 	public <T> T accept(ExpressionVisitor<T> visitor) {
39 39
 		return visitor.visitGetStaticField(this);
40 40
 	}
41
+
42
+	@Override
43
+	public Expression transform(ExpressionTransformer transformer) {
44
+		return this;
45
+	}
41 46
 }

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

@@ -27,4 +27,10 @@ public class GetterExpression extends Expression {
27 27
 	public <T> T accept(ExpressionVisitor<T> visitor) {
28 28
 		return visitor.visitGetter(this);
29 29
 	}
30
+
31
+	@Override
32
+	public Expression transform(ExpressionTransformer transformer) {
33
+		Expression tTarget = target.transform(transformer);
34
+		return target == tTarget ? this : new GetterExpression(position, tTarget, getter);
35
+	}
30 36
 }

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

@@ -28,4 +28,11 @@ public class GlobalCallExpression extends Expression {
28 28
 	public <T> T accept(ExpressionVisitor<T> visitor) {
29 29
 		return visitor.visitGlobalCall(this);
30 30
 	}
31
+
32
+	@Override
33
+	public Expression transform(ExpressionTransformer transformer) {
34
+		CallArguments tArguments = arguments.transform(transformer);
35
+		Expression tResolution = resolution.transform(transformer);
36
+		return tArguments == arguments && tResolution == resolution ? this : new GlobalCallExpression(position, name, tArguments, tResolution);
37
+	}
31 38
 }

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

@@ -26,4 +26,10 @@ public class GlobalExpression extends Expression {
26 26
 	public <T> T accept(ExpressionVisitor<T> visitor) {
27 27
 		return visitor.visitGlobal(this);
28 28
 	}
29
+
30
+	@Override
31
+	public Expression transform(ExpressionTransformer transformer) {
32
+		Expression tResolution = resolution.transform(transformer);
33
+		return resolution == tResolution ? this : new GlobalExpression(position, name, resolution);
34
+	}
29 35
 }

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

@@ -25,4 +25,10 @@ public class InterfaceCastExpression extends Expression {
25 25
 	public <T> T accept(ExpressionVisitor<T> visitor) {
26 26
 		return visitor.visitInterfaceCast(this);
27 27
 	}
28
+
29
+	@Override
30
+	public Expression transform(ExpressionTransformer transformer) {
31
+		Expression tValue = value.transform(transformer);
32
+		return value == tValue ? this : new InterfaceCastExpression(position, tValue, type);
33
+	}
28 34
 }

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

@@ -28,4 +28,10 @@ public class IsExpression extends Expression {
28 28
 	public <T> T accept(ExpressionVisitor<T> visitor) {
29 29
 		return visitor.visitIs(this);
30 30
 	}
31
+
32
+	@Override
33
+	public Expression transform(ExpressionTransformer transformer) {
34
+		Expression tValue = value.transform(transformer);
35
+		return tValue == value ? this : new IsExpression(position, tValue, type);
36
+	}
31 37
 }

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

@@ -25,4 +25,10 @@ public class MakeConstExpression extends Expression {
25 25
 	public <T> T accept(ExpressionVisitor<T> visitor) {
26 26
 		return visitor.visitMakeConst(this);
27 27
 	}
28
+
29
+	@Override
30
+	public Expression transform(ExpressionTransformer transformer) {
31
+		Expression tValue = value.transform(transformer);
32
+		return tValue == value ? this : new MakeConstExpression(position, tValue, type);
33
+	}
28 34
 }

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

@@ -31,4 +31,11 @@ public class MapExpression extends Expression {
31 31
 	public <T> T accept(ExpressionVisitor<T> visitor) {
32 32
 		return visitor.visitMap(this);
33 33
 	}
34
+
35
+	@Override
36
+	public Expression transform(ExpressionTransformer transformer) {
37
+		Expression[] tKeys = Expression.transform(keys, transformer);
38
+		Expression[] tValues = Expression.transform(values, transformer);
39
+		return tKeys == keys && tValues == values ? this : new MapExpression(position, tKeys, tValues, type);
40
+	}
34 41
 }

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

@@ -5,7 +5,12 @@
5 5
  */
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8
+import java.util.Collections;
8 9
 import org.openzen.zenscript.codemodel.expression.switchvalue.SwitchValue;
10
+import org.openzen.zenscript.codemodel.statement.ExpressionStatement;
11
+import org.openzen.zenscript.codemodel.statement.SwitchCase;
12
+import org.openzen.zenscript.codemodel.statement.SwitchStatement;
13
+import org.openzen.zenscript.codemodel.statement.VarStatement;
9 14
 import org.openzen.zenscript.codemodel.type.ITypeID;
10 15
 import org.openzen.zenscript.shared.CodePosition;
11 16
 
@@ -28,15 +33,53 @@ public class MatchExpression extends Expression {
28 33
 	public <T> T accept(ExpressionVisitor<T> visitor) {
29 34
 		return visitor.visitMatch(this);
30 35
 	}
36
+
37
+	@Override
38
+	public Expression transform(ExpressionTransformer transformer) {
39
+		Expression tValue = value.transform(transformer);
40
+		Case[] tCases = new Case[cases.length];
41
+		boolean unmodified = true;
42
+		for (int i = 0; i < tCases.length; i++) {
43
+			tCases[i] = cases[i].transform(transformer);
44
+			unmodified &= tCases[i] == cases[i];
45
+		}
46
+		return unmodified && tValue == value ? this : new MatchExpression(position, tValue, type, tCases);
47
+	}
48
+	
49
+	public SwitchedMatch convertToSwitch(String tempVariable) {
50
+		VarStatement result = new VarStatement(position, tempVariable, type, null, false);
51
+		SwitchStatement switchStatement = new SwitchStatement(position, null, value);
52
+		for (MatchExpression.Case matchCase : cases) {
53
+			Expression caseExpression = new SetLocalVariableExpression(matchCase.value.position, result, matchCase.value);
54
+			SwitchCase switchCase = new SwitchCase(matchCase.key, Collections.singletonList(new ExpressionStatement(matchCase.value.position, caseExpression)));
55
+			switchStatement.cases.add(switchCase);
56
+		}
57
+		return new SwitchedMatch(result, switchStatement);
58
+	}
59
+	
60
+	public static class SwitchedMatch {
61
+		public final VarStatement result;
62
+		public final SwitchStatement switchStatement;
63
+		
64
+		public SwitchedMatch(VarStatement temp, SwitchStatement switchStatement) {
65
+			this.result = temp;
66
+			this.switchStatement = switchStatement;
67
+		}
68
+	}
31 69
 	
32 70
 	public static class Case {
33 71
 		public final SwitchValue key;
34
-		public final FunctionExpression value;
72
+		public final Expression value;
35 73
 		
36
-		public Case(SwitchValue key, FunctionExpression value) {
74
+		public Case(SwitchValue key, Expression value) {
37 75
 			this.key = key;
38 76
 			this.value = value;
39 77
 		}
78
+		
79
+		public Case transform(ExpressionTransformer transformer) {
80
+			Expression tValue = value.transform(transformer);
81
+			return tValue == value ? this : new Case(key, tValue);
82
+		}
40 83
 	}
41 84
 	
42 85
 	private static ITypeID getThrownType(CodePosition position, Case[] cases) {

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

@@ -5,7 +5,9 @@
5 5
  */
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8
+import org.openzen.zenscript.codemodel.FunctionHeader;
8 9
 import org.openzen.zenscript.codemodel.member.ConstructorMember;
10
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9 11
 import org.openzen.zenscript.codemodel.type.ITypeID;
10 12
 import org.openzen.zenscript.shared.CodePosition;
11 13
 
@@ -16,16 +18,44 @@ import org.openzen.zenscript.shared.CodePosition;
16 18
 public class NewExpression extends Expression {
17 19
 	public final ConstructorMember constructor;
18 20
 	public final CallArguments arguments;
21
+	public final FunctionHeader instancedHeader;
19 22
 	
20
-	public NewExpression(CodePosition position, ITypeID type, ConstructorMember constructor, CallArguments arguments) {
23
+	public NewExpression(
24
+			CodePosition position,
25
+			ITypeID type,
26
+			ConstructorMember constructor,
27
+			CallArguments arguments)
28
+	{
21 29
 		super(position, type, binaryThrow(position, constructor.header.thrownType, multiThrow(position, arguments.arguments)));
22 30
 		
23 31
 		this.constructor = constructor;
24 32
 		this.arguments = arguments;
33
+		this.instancedHeader = constructor.header;
34
+	}
35
+	
36
+	public NewExpression(
37
+			CodePosition position,
38
+			ITypeID type,
39
+			ConstructorMember constructor,
40
+			CallArguments arguments,
41
+			FunctionHeader instancedHeader,
42
+			TypeScope scope)
43
+	{
44
+		super(position, type, binaryThrow(position, constructor.header.thrownType, multiThrow(position, arguments.arguments)));
45
+		
46
+		this.constructor = constructor;
47
+		this.arguments = scope == null ? arguments : arguments.normalize(position, scope, instancedHeader);
48
+		this.instancedHeader = instancedHeader;
25 49
 	}
26 50
 
27 51
 	@Override
28 52
 	public <T> T accept(ExpressionVisitor<T> visitor) {
29 53
 		return visitor.visitNew(this);
30 54
 	}
55
+
56
+	@Override
57
+	public Expression transform(ExpressionTransformer transformer) {
58
+		CallArguments tArguments = arguments.transform(transformer);
59
+		return tArguments == arguments ? this : new NewExpression(position, type, constructor, tArguments, instancedHeader, null);
60
+	}
31 61
 }

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

@@ -26,4 +26,9 @@ public class NullExpression extends Expression {
26 26
 	public <T> T accept(ExpressionVisitor<T> visitor) {
27 27
 		return visitor.visitNull(this);
28 28
 	}
29
+
30
+	@Override
31
+	public Expression transform(ExpressionTransformer transformer) {
32
+		return this;
33
+	}
29 34
 }

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

@@ -27,4 +27,11 @@ public class OrOrExpression extends Expression {
27 27
 	public <T> T accept(ExpressionVisitor<T> visitor) {
28 28
 		return visitor.visitOrOr(this);
29 29
 	}
30
+
31
+	@Override
32
+	public Expression transform(ExpressionTransformer transformer) {
33
+		Expression tLeft = left.transform(transformer);
34
+		Expression tRight = right.transform(transformer);
35
+		return tLeft == left && tRight == right ? this : new OrOrExpression(position, tLeft, tRight);
36
+	}
30 37
 }

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

@@ -18,19 +18,27 @@ import org.openzen.zenscript.shared.CodePosition;
18 18
 public class PostCallExpression extends Expression {
19 19
 	public final Expression target;
20 20
 	public final OperatorMember member;
21
+	public final FunctionHeader instancedHeader;
21 22
 	
22 23
 	public PostCallExpression(CodePosition position, Expression target, OperatorMember member, FunctionHeader instancedHeader) {
23
-		super(position, instancedHeader.returnType, binaryThrow(position, member.header.thrownType, target.thrownType));
24
+		super(position, instancedHeader.returnType, binaryThrow(position, instancedHeader.thrownType, target.thrownType));
24 25
 		
25 26
 		if (member.operator != OperatorType.DECREMENT && member.operator != OperatorType.INCREMENT)
26 27
 			throw new IllegalArgumentException("Operator must be increment or decrement");
27 28
 		
28 29
 		this.target = target;
29 30
 		this.member = member;
31
+		this.instancedHeader = instancedHeader;
30 32
 	}
31 33
 
32 34
 	@Override
33 35
 	public <T> T accept(ExpressionVisitor<T> visitor) {
34 36
 		return visitor.visitPostCall(this);
35 37
 	}
38
+
39
+	@Override
40
+	public Expression transform(ExpressionTransformer transformer) {
41
+		Expression tTarget = target.transform(transformer);
42
+		return target == tTarget ? this : new PostCallExpression(position, tTarget, member, instancedHeader);
43
+	}
36 44
 }

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

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
9
+import org.openzen.zenscript.codemodel.type.ITypeID;
9 10
 import org.openzen.zenscript.shared.CodePosition;
10 11
 
11 12
 /**
@@ -22,9 +23,23 @@ public class RangeExpression extends Expression {
22 23
 		this.from = from;
23 24
 		this.to = to;
24 25
 	}
26
+	
27
+	private RangeExpression(CodePosition position, ITypeID type, Expression from, Expression to, ITypeID thrownType) {
28
+		super(position, type, thrownType);
29
+		
30
+		this.from = from;
31
+		this.to = to;
32
+	}
25 33
 
26 34
 	@Override
27 35
 	public <T> T accept(ExpressionVisitor<T> visitor) {
28 36
 		return visitor.visitRange(this);
29 37
 	}
38
+
39
+	@Override
40
+	public Expression transform(ExpressionTransformer transformer) {
41
+		Expression tFrom = from.transform(transformer);
42
+		Expression tTo = to.transform(transformer);
43
+		return tFrom == from && tTo == to ? this : new RangeExpression(position, type, tFrom, tTo, thrownType);
44
+	}
30 45
 }

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

@@ -29,4 +29,11 @@ public class SameObjectExpression extends Expression {
29 29
 	public <T> T accept(ExpressionVisitor<T> visitor) {
30 30
 		return visitor.visitSameObject(this);
31 31
 	}
32
+
33
+	@Override
34
+	public Expression transform(ExpressionTransformer transformer) {
35
+		Expression tLeft = left.transform(transformer);
36
+		Expression tRight = right.transform(transformer);
37
+		return tLeft == left && tRight == right ? this : new SameObjectExpression(position, tLeft, tRight, inverted);
38
+	}
32 39
 }

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

@@ -29,4 +29,13 @@ public class SetFieldExpression extends Expression {
29 29
 	public <T> T accept(ExpressionVisitor<T> visitor) {
30 30
 		return visitor.visitSetField(this);
31 31
 	}
32
+
33
+	@Override
34
+	public Expression transform(ExpressionTransformer transformer) {
35
+		Expression tTarget = target.transform(transformer);
36
+		Expression tValue = value.transform(transformer);
37
+		return tTarget == target && tValue == value
38
+				? this
39
+				: new SetFieldExpression(position, tTarget, field, tValue);
40
+	}
32 41
 }

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

@@ -27,4 +27,10 @@ public class SetFunctionParameterExpression extends Expression {
27 27
 	public <T> T accept(ExpressionVisitor<T> visitor) {
28 28
 		return visitor.visitSetFunctionParameter(this);
29 29
 	}
30
+
31
+	@Override
32
+	public Expression transform(ExpressionTransformer transformer) {
33
+		Expression tValue = value.transform(transformer);
34
+		return tValue == value ? this : new SetFunctionParameterExpression(position, parameter, tValue);
35
+	}
30 36
 }

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

@@ -27,4 +27,10 @@ public class SetLocalVariableExpression extends Expression {
27 27
 	public <T> T accept(ExpressionVisitor<T> visitor) {
28 28
 		return visitor.visitSetLocalVariable(this);
29 29
 	}
30
+
31
+	@Override
32
+	public Expression transform(ExpressionTransformer transformer) {
33
+		Expression tValue = value.transform(transformer);
34
+		return tValue == value ? this : new SetLocalVariableExpression(position, variable, tValue);
35
+	}
30 36
 }

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

@@ -27,4 +27,10 @@ public class SetStaticFieldExpression extends Expression {
27 27
 	public <T> T accept(ExpressionVisitor<T> visitor) {
28 28
 		return visitor.visitSetStaticField(this);
29 29
 	}
30
+
31
+	@Override
32
+	public Expression transform(ExpressionTransformer transformer) {
33
+		Expression tValue = value.transform(transformer);
34
+		return value == tValue ? this : new SetStaticFieldExpression(position, field, tValue);
35
+	}
30 36
 }

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

@@ -29,4 +29,11 @@ public class SetterExpression extends Expression {
29 29
 	public <T> T accept(ExpressionVisitor<T> visitor) {
30 30
 		return visitor.visitSetter(this);
31 31
 	}
32
+
33
+	@Override
34
+	public Expression transform(ExpressionTransformer transformer) {
35
+		Expression tTarget = target.transform(transformer);
36
+		Expression tValue = value.transform(transformer);
37
+		return tTarget == target && tValue == value ? this : new SetterExpression(position, tTarget, setter, tValue);
38
+	}
32 39
 }

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

@@ -25,4 +25,9 @@ public class StaticGetterExpression extends Expression {
25 25
 	public <T> T accept(ExpressionVisitor<T> visitor) {
26 26
 		return visitor.visitStaticGetter(this);
27 27
 	}
28
+
29
+	@Override
30
+	public Expression transform(ExpressionTransformer transformer) {
31
+		return this;
32
+	}
28 33
 }

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

@@ -27,4 +27,10 @@ public class StaticSetterExpression extends Expression {
27 27
 	public <T> T accept(ExpressionVisitor<T> visitor) {
28 28
 		return visitor.visitStaticSetter(this);
29 29
 	}
30
+
31
+	@Override
32
+	public Expression transform(ExpressionTransformer transformer) {
33
+		Expression tValue = value.transform(transformer);
34
+		return tValue == value ? this : new StaticSetterExpression(position, setter, tValue);
35
+	}
30 36
 }

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

@@ -26,4 +26,10 @@ public class SupertypeCastExpression extends Expression {
26 26
 	public <T> T accept(ExpressionVisitor<T> visitor) {
27 27
 		return visitor.visitSupertypeCast(this);
28 28
 	}
29
+
30
+	@Override
31
+	public Expression transform(ExpressionTransformer transformer) {
32
+		Expression tValue = value.transform(transformer);
33
+		return tValue == value ? this : new SupertypeCastExpression(position, tValue, type);
34
+	}
29 35
 }

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

@@ -29,4 +29,9 @@ public class ThisExpression extends Expression {
29 29
 	public <T> T accept(ExpressionVisitor<T> visitor) {
30 30
 		return visitor.visitThis(this);
31 31
 	}
32
+
33
+	@Override
34
+	public Expression transform(ExpressionTransformer transformer) {
35
+		return this;
36
+	}
32 37
 }

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

@@ -0,0 +1,34 @@
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 org.openzen.zenscript.codemodel.type.ITypeID;
9
+import org.openzen.zenscript.shared.CodePosition;
10
+
11
+/**
12
+ *
13
+ * @author Hoofdgebruiker
14
+ */
15
+public class ThrowExpression extends Expression {
16
+	public final Expression value;
17
+	
18
+	public ThrowExpression(CodePosition position, ITypeID type, Expression value) {
19
+		super(position, type, value.type);
20
+		
21
+		this.value = value;
22
+	}
23
+
24
+	@Override
25
+	public <T> T accept(ExpressionVisitor<T> visitor) {
26
+		return visitor.visitThrow(this);
27
+	}
28
+
29
+	@Override
30
+	public Expression transform(ExpressionTransformer transformer) {
31
+		Expression tValue = transformer.transform(value);
32
+		return tValue == value ? this : new ThrowExpression(position, type, value);
33
+	}
34
+}

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

@@ -25,4 +25,10 @@ public class TryConvertExpression extends Expression {
25 25
 	public <T> T accept(ExpressionVisitor<T> visitor) {
26 26
 		return visitor.visitTryConvert(this);
27 27
 	}
28
+
29
+	@Override
30
+	public Expression transform(ExpressionTransformer transformer) {
31
+		Expression tValue = value.transform(transformer);
32
+		return tValue == value ? this : new TryConvertExpression(position, type, tValue);
33
+	}
28 34
 }

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

@@ -25,4 +25,10 @@ public class TryRethrowAsExceptionExpression extends Expression {
25 25
 	public <T> T accept(ExpressionVisitor<T> visitor) {
26 26
 		return visitor.visitTryRethrowAsException(this);
27 27
 	}
28
+
29
+	@Override
30
+	public Expression transform(ExpressionTransformer transformer) {
31
+		Expression tValue = value.transform(transformer);
32
+		return tValue == value ? this : new TryRethrowAsExceptionExpression(position, type, tValue, thrownType);
33
+	}
28 34
 }

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

@@ -25,4 +25,10 @@ public class TryRethrowAsResultExpression extends Expression {
25 25
 	public <T> T accept(ExpressionVisitor<T> visitor) {
26 26
 		return visitor.visitTryRethrowAsResult(this);
27 27
 	}
28
+
29
+	@Override
30
+	public Expression transform(ExpressionTransformer transformer) {
31
+		Expression tValue = value.transform(transformer);
32
+		return tValue == value ? this : new TryRethrowAsResultExpression(position, type, tValue);
33
+	}
28 34
 }

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

@@ -46,4 +46,10 @@ public class VariantValueExpression extends Expression {
46 46
 	public <T> T accept(ExpressionVisitor<T> visitor) {
47 47
 		return visitor.visitVariantValue(this);
48 48
 	}
49
+
50
+	@Override
51
+	public Expression transform(ExpressionTransformer transformer) {
52
+		Expression[] tArguments = Expression.transform(arguments, transformer);
53
+		return tArguments == arguments ? this : new VariantValueExpression(position, type, option, tArguments);
54
+	}
49 55
 }

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

@@ -28,4 +28,10 @@ public class WrapOptionalExpression extends Expression {
28 28
 	public <T> T accept(ExpressionVisitor<T> visitor) {
29 29
 		return visitor.visitWrapOptional(this);
30 30
 	}
31
+
32
+	@Override
33
+	public Expression transform(ExpressionTransformer transformer) {
34
+		Expression tValue = value.transform(transformer);
35
+		return tValue == value ? this : new WrapOptionalExpression(position, tValue, type);
36
+	}
31 37
 }

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

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.codemodel.expression.switchvalue;
7 7
 
8 8
 import org.openzen.zenscript.codemodel.definition.VariantDefinition;
9
+import org.openzen.zenscript.codemodel.statement.VarStatement;
9 10
 
10 11
 /**
11 12
  *
@@ -13,9 +14,9 @@ import org.openzen.zenscript.codemodel.definition.VariantDefinition;
13 14
  */
14 15
 public class VariantOptionSwitchValue implements SwitchValue {
15 16
 	public final VariantDefinition.Option option;
16
-	public final String[] parameters;
17
+	public final VarStatement[] parameters;
17 18
 	
18
-	public VariantOptionSwitchValue(VariantDefinition.Option option, String[] parameters) {
19
+	public VariantOptionSwitchValue(VariantDefinition.Option option, VarStatement[] parameters) {
19 20
 		this.option = option;
20 21
 		this.parameters = parameters;
21 22
 	}

+ 2
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/iterator/ForeachIteratorVisitor.java View File

@@ -16,5 +16,7 @@ public interface ForeachIteratorVisitor<T> {
16 16
 	
17 17
 	T visitArrayKeyValueIterator();
18 18
 	
19
+	T visitStringCharacterIterator();
20
+	
19 21
 	T visitCustomIterator();
20 22
 }

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

@@ -11,6 +11,7 @@ import org.openzen.zenscript.codemodel.HighLevelDefinition;
11 11
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
12 12
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
13 13
 import org.openzen.zenscript.codemodel.type.ITypeID;
14
+import org.openzen.zenscript.codemodel.type.member.BuiltinID;
14 15
 import org.openzen.zenscript.codemodel.type.member.TypeMemberPriority;
15 16
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
16 17
 import org.openzen.zenscript.shared.CodePosition;
@@ -20,8 +21,14 @@ import org.openzen.zenscript.shared.CodePosition;
20 21
  * @author Hoofdgebruiker
21 22
  */
22 23
 public class CallerMember extends FunctionalMember {
23
-	public CallerMember(CodePosition position, HighLevelDefinition definition, int modifiers, FunctionHeader header) {
24
-		super(position, definition, modifiers, "()", header);
24
+	public CallerMember(
25
+			CodePosition position,
26
+			HighLevelDefinition definition,
27
+			int modifiers,
28
+			FunctionHeader header,
29
+			BuiltinID builtin)
30
+	{
31
+		super(position, definition, modifiers, "()", header, builtin);
25 32
 	}
26 33
 	
27 34
 	@Override
@@ -36,7 +43,12 @@ public class CallerMember extends FunctionalMember {
36 43
 
37 44
 	@Override
38 45
 	public DefinitionMember instance(GlobalTypeRegistry registry, Map<TypeParameter, ITypeID> mapping) {
39
-		return new CallerMember(position, definition, modifiers, header.instance(registry, mapping));
46
+		return new CallerMember(
47
+				position,
48
+				definition,
49
+				modifiers,
50
+				header.instance(registry, mapping),
51
+				builtin);
40 52
 	}
41 53
 
42 54
 	@Override

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

@@ -17,6 +17,7 @@ import org.openzen.zenscript.codemodel.scope.TypeScope;
17 17
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
18 18
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
19 19
 import org.openzen.zenscript.codemodel.type.ITypeID;
20
+import org.openzen.zenscript.codemodel.type.member.BuiltinID;
20 21
 import org.openzen.zenscript.codemodel.type.member.TypeMemberPriority;
21 22
 import org.openzen.zenscript.shared.CodePosition;
22 23
 
@@ -27,8 +28,14 @@ import org.openzen.zenscript.shared.CodePosition;
27 28
 public class CasterMember extends FunctionalMember implements ICasterMember {
28 29
 	public final ITypeID toType;
29 30
 	
30
-	public CasterMember(CodePosition position, HighLevelDefinition definition, int modifiers, ITypeID toType) {
31
-		super(position, definition, modifiers, "as", new FunctionHeader(toType));
31
+	public CasterMember(
32
+			CodePosition position,
33
+			HighLevelDefinition definition,
34
+			int modifiers,
35
+			ITypeID toType,
36
+			BuiltinID builtin)
37
+	{
38
+		super(position, definition, modifiers, "as", new FunctionHeader(toType), builtin);
32 39
 		
33 40
 		this.toType = toType;
34 41
 	}
@@ -50,7 +57,12 @@ public class CasterMember extends FunctionalMember implements ICasterMember {
50 57
 
51 58
 	@Override
52 59
 	public DefinitionMember instance(GlobalTypeRegistry registry, Map<TypeParameter, ITypeID> mapping) {
53
-		return new CasterMember(position, definition, modifiers, toType.withGenericArguments(registry, mapping));
60
+		return new CasterMember(
61
+				position,
62
+				definition,
63
+				modifiers,
64
+				toType.withGenericArguments(registry, mapping),
65
+				builtin);
54 66
 	}
55 67
 	
56 68
 	@Override

+ 0
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ConstructorMember.java View File


Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save