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
 
15
 
16
 dependencies {
16
 dependencies {
17
 	compile project(':CodeModel')
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
 public class CommentFormatter {
12
 public class CommentFormatter {
13
 	private CommentFormatter() {}
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
 		boolean isInMultilineComment = false;
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
 			if (isInMultilineComment) {
23
 			if (isInMultilineComment) {
24
 				if (!comment.startsWith("*"))
24
 				if (!comment.startsWith("*"))
25
 					comment = "* " + comment;
25
 					comment = "* " + comment;

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

24
  * @author Hoofdgebruiker
24
  * @author Hoofdgebruiker
25
  */
25
  */
26
 public class DefinitionFormatter implements DefinitionVisitor<Void> {
26
 public class DefinitionFormatter implements DefinitionVisitor<Void> {
27
-	private final FormattingSettings settings;
27
+	private final ScriptFormattingSettings settings;
28
 	private final TypeFormatter typeFormatter;
28
 	private final TypeFormatter typeFormatter;
29
 	private final StringBuilder output = new StringBuilder();
29
 	private final StringBuilder output = new StringBuilder();
30
 	private final String indent;
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
 		this.settings = settings;
33
 		this.settings = settings;
34
 		this.typeFormatter = typeFormatter;
34
 		this.typeFormatter = typeFormatter;
35
 		this.indent = indent;
35
 		this.indent = indent;

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

5
  */
5
  */
6
 package org.openzen.zenscript.formatter;
6
 package org.openzen.zenscript.formatter;
7
 
7
 
8
+import org.openzen.zenscript.formattershared.ExpressionString;
8
 import org.openzen.zenscript.codemodel.OperatorType;
9
 import org.openzen.zenscript.codemodel.OperatorType;
9
 import org.openzen.zenscript.codemodel.expression.AndAndExpression;
10
 import org.openzen.zenscript.codemodel.expression.AndAndExpression;
10
 import org.openzen.zenscript.codemodel.expression.ArrayExpression;
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
 import org.openzen.zenscript.codemodel.expression.CallExpression;
13
 import org.openzen.zenscript.codemodel.expression.CallExpression;
13
 import org.openzen.zenscript.codemodel.expression.CallStaticExpression;
14
 import org.openzen.zenscript.codemodel.expression.CallStaticExpression;
14
 import org.openzen.zenscript.codemodel.expression.CapturedClosureExpression;
15
 import org.openzen.zenscript.codemodel.expression.CapturedClosureExpression;
39
 import org.openzen.zenscript.codemodel.expression.Expression;
40
 import org.openzen.zenscript.codemodel.expression.Expression;
40
 import org.openzen.zenscript.codemodel.expression.ExpressionVisitor;
41
 import org.openzen.zenscript.codemodel.expression.ExpressionVisitor;
41
 import org.openzen.zenscript.codemodel.expression.FunctionExpression;
42
 import org.openzen.zenscript.codemodel.expression.FunctionExpression;
42
-import org.openzen.zenscript.codemodel.expression.GenericCompareExpression;
43
 import org.openzen.zenscript.codemodel.expression.GetFieldExpression;
43
 import org.openzen.zenscript.codemodel.expression.GetFieldExpression;
44
 import org.openzen.zenscript.codemodel.expression.GetFunctionParameterExpression;
44
 import org.openzen.zenscript.codemodel.expression.GetFunctionParameterExpression;
45
 import org.openzen.zenscript.codemodel.expression.GetLocalVariableExpression;
45
 import org.openzen.zenscript.codemodel.expression.GetLocalVariableExpression;
67
 import org.openzen.zenscript.codemodel.expression.StaticSetterExpression;
67
 import org.openzen.zenscript.codemodel.expression.StaticSetterExpression;
68
 import org.openzen.zenscript.codemodel.expression.SupertypeCastExpression;
68
 import org.openzen.zenscript.codemodel.expression.SupertypeCastExpression;
69
 import org.openzen.zenscript.codemodel.expression.ThisExpression;
69
 import org.openzen.zenscript.codemodel.expression.ThisExpression;
70
+import org.openzen.zenscript.codemodel.expression.ThrowExpression;
70
 import org.openzen.zenscript.codemodel.expression.TryConvertExpression;
71
 import org.openzen.zenscript.codemodel.expression.TryConvertExpression;
71
 import org.openzen.zenscript.codemodel.expression.TryRethrowAsExceptionExpression;
72
 import org.openzen.zenscript.codemodel.expression.TryRethrowAsExceptionExpression;
72
 import org.openzen.zenscript.codemodel.expression.TryRethrowAsResultExpression;
73
 import org.openzen.zenscript.codemodel.expression.TryRethrowAsResultExpression;
80
  * @author Hoofdgebruiker
81
  * @author Hoofdgebruiker
81
  */
82
  */
82
 public class ExpressionFormatter implements ExpressionVisitor<ExpressionString> {
83
 public class ExpressionFormatter implements ExpressionVisitor<ExpressionString> {
83
-	private final FormattingSettings settings;
84
+	private final ScriptFormattingSettings settings;
84
 	public final TypeFormatter typeFormatter;
85
 	public final TypeFormatter typeFormatter;
85
 	
86
 	
86
-	public ExpressionFormatter(FormattingSettings settings, TypeFormatter typeFormatter) {
87
+	public ExpressionFormatter(ScriptFormattingSettings settings, TypeFormatter typeFormatter) {
87
 		this.settings = settings;
88
 		this.settings = settings;
88
 		this.typeFormatter = typeFormatter;
89
 		this.typeFormatter = typeFormatter;
89
 	}
90
 	}
90
 
91
 
91
 	@Override
92
 	@Override
92
 	public ExpressionString visitAndAnd(AndAndExpression expression) {
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
 	@Override
97
 	@Override
106
 			index++;
107
 			index++;
107
 		}
108
 		}
108
 		result.append("]");
109
 		result.append("]");
109
-		return new ExpressionString(result.toString(), OperatorPriority.PRIMARY);
110
+		return new ExpressionString(result.toString(), ZenScriptOperator.PRIMARY);
110
 	}
111
 	}
111
 
112
 
112
 	@Override
113
 	@Override
113
-	public ExpressionString visitCompare(BasicCompareExpression expression) {
114
+	public ExpressionString visitCompare(CompareExpression expression) {
114
 		return binary(
115
 		return binary(
115
 				expression.left,
116
 				expression.left,
116
 				expression.right,
117
 				expression.right,
117
-				OperatorPriority.COMPARE,
118
-				" " + expression.operator.str + " ");
118
+				ZenScriptOperator.getComparison(expression.comparison));
119
 	}
119
 	}
120
 
120
 
121
 	@Override
121
 	@Override
124
 			OperatorMember operator = (OperatorMember) expression.member;
124
 			OperatorMember operator = (OperatorMember) expression.member;
125
 			switch (operator.operator) {
125
 			switch (operator.operator) {
126
 				case NOT:
126
 				case NOT:
127
-					return unaryPrefix(expression.target, OperatorPriority.NOT, "!");
127
+					return unaryPrefix(expression.target, ZenScriptOperator.NOT, "!");
128
 				case NEG:
128
 				case NEG:
129
-					return unaryPrefix(expression.target, OperatorPriority.NEG, "-");
129
+					return unaryPrefix(expression.target, ZenScriptOperator.NEG, "-");
130
 				case CAT:
130
 				case CAT:
131
 					if (expression.arguments.arguments.length == 0) {
131
 					if (expression.arguments.arguments.length == 0) {
132
-						return unaryPrefix(expression.target, OperatorPriority.INVERT, "~");
132
+						return unaryPrefix(expression.target, ZenScriptOperator.INVERT, "~");
133
 					} else {
133
 					} else {
134
-						return binary(expression.target, expression.getFirstArgument(), OperatorPriority.CAT, " ~ ");
134
+						return binary(expression.target, expression.getFirstArgument(), ZenScriptOperator.CAT);
135
 					}
135
 					}
136
 				case ADD:
136
 				case ADD:
137
-					return binary(expression.target, expression.getFirstArgument(), OperatorPriority.ADD, " + ");
137
+					return binary(expression.target, expression.getFirstArgument(), ZenScriptOperator.ADD);
138
 				case SUB:
138
 				case SUB:
139
-					return binary(expression.target, expression.getFirstArgument(), OperatorPriority.SUB, " - ");
139
+					return binary(expression.target, expression.getFirstArgument(), ZenScriptOperator.SUB);
140
 				case MUL:
140
 				case MUL:
141
-					return binary(expression.target, expression.getFirstArgument(), OperatorPriority.MUL, " * ");
141
+					return binary(expression.target, expression.getFirstArgument(), ZenScriptOperator.MUL);
142
 				case DIV:
142
 				case DIV:
143
-					return binary(expression.target, expression.getFirstArgument(), OperatorPriority.DIV, " / ");
143
+					return binary(expression.target, expression.getFirstArgument(), ZenScriptOperator.DIV);
144
 				case MOD:
144
 				case MOD:
145
-					return binary(expression.target, expression.getFirstArgument(), OperatorPriority.MOD, " % ");
145
+					return binary(expression.target, expression.getFirstArgument(), ZenScriptOperator.MOD);
146
 				case AND:
146
 				case AND:
147
-					return binary(expression.target, expression.getFirstArgument(), OperatorPriority.AND, " & ");
147
+					return binary(expression.target, expression.getFirstArgument(), ZenScriptOperator.AND);
148
 				case OR:
148
 				case OR:
149
-					return binary(expression.target, expression.getFirstArgument(), OperatorPriority.OR, " | ");
149
+					return binary(expression.target, expression.getFirstArgument(), ZenScriptOperator.OR);
150
 				case XOR:
150
 				case XOR:
151
-					return binary(expression.target, expression.getFirstArgument(), OperatorPriority.XOR, " ^ ");
151
+					return binary(expression.target, expression.getFirstArgument(), ZenScriptOperator.XOR);
152
 				case CONTAINS:
152
 				case CONTAINS:
153
-					return binary(expression.getFirstArgument(), expression.target, OperatorPriority.CONTAINS, " in ");
153
+					return binary(expression.getFirstArgument(), expression.target, ZenScriptOperator.CONTAINS);
154
 				case EQUALS:
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
 				case INDEXSET: {
158
 				case INDEXSET: {
157
 					StringBuilder result = new StringBuilder();
159
 					StringBuilder result = new StringBuilder();
158
 					result.append(expression.target);
160
 					result.append(expression.target);
165
 					}
167
 					}
166
 					result.append("] = ");
168
 					result.append("] = ");
167
 					result.append(expression.arguments.arguments[expression.arguments.arguments.length - 1].accept(this).value);
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
 				case INDEXGET: {
172
 				case INDEXGET: {
171
 					StringBuilder result = new StringBuilder();
173
 					StringBuilder result = new StringBuilder();
178
 						result.append(expression.arguments.arguments[i].accept(this));
180
 						result.append(expression.arguments.arguments[i].accept(this));
179
 					}
181
 					}
180
 					result.append("]");
182
 					result.append("]");
181
-					return new ExpressionString(result.toString(), OperatorPriority.INDEX);
183
+					return new ExpressionString(result.toString(), ZenScriptOperator.INDEX);
182
 				}
184
 				}
183
 				case MEMBERGETTER: {
185
 				case MEMBERGETTER: {
184
 					StringBuilder result = new StringBuilder();
186
 					StringBuilder result = new StringBuilder();
186
 					result.append(".get(");
188
 					result.append(".get(");
187
 					result.append(expression.getFirstArgument().accept(this));
189
 					result.append(expression.getFirstArgument().accept(this));
188
 					result.append(")");
190
 					result.append(")");
189
-					return new ExpressionString(result.toString(), OperatorPriority.MEMBER);
191
+					return new ExpressionString(result.toString(), ZenScriptOperator.MEMBER);
190
 				}
192
 				}
191
 				case MEMBERSETTER: {
193
 				case MEMBERSETTER: {
192
 					StringBuilder result = new StringBuilder();
194
 					StringBuilder result = new StringBuilder();
196
 					result.append(", ");
198
 					result.append(", ");
197
 					result.append(expression.arguments.arguments[1].accept(this));
199
 					result.append(expression.arguments.arguments[1].accept(this));
198
 					result.append(")");
200
 					result.append(")");
199
-					return new ExpressionString(result.toString(), OperatorPriority.MEMBER);
201
+					return new ExpressionString(result.toString(), ZenScriptOperator.MEMBER);
200
 				}
202
 				}
201
 				case ADDASSIGN:
203
 				case ADDASSIGN:
202
-					return binary(expression.target, expression.getFirstArgument(), OperatorPriority.XORASSIGN, " += ");
204
+					return binary(expression.target, expression.getFirstArgument(), ZenScriptOperator.ADDASSIGN);
203
 				case SUBASSIGN:
205
 				case SUBASSIGN:
204
-					return binary(expression.target, expression.getFirstArgument(), OperatorPriority.XORASSIGN, " -= ");
206
+					return binary(expression.target, expression.getFirstArgument(), ZenScriptOperator.SUBASSIGN);
205
 				case MULASSIGN:
207
 				case MULASSIGN:
206
-					return binary(expression.target, expression.getFirstArgument(), OperatorPriority.XORASSIGN, " *= ");
208
+					return binary(expression.target, expression.getFirstArgument(), ZenScriptOperator.MULASSIGN);
207
 				case DIVASSIGN:
209
 				case DIVASSIGN:
208
-					return binary(expression.target, expression.getFirstArgument(), OperatorPriority.XORASSIGN, " /= ");
210
+					return binary(expression.target, expression.getFirstArgument(), ZenScriptOperator.DIVASSIGN);
209
 				case MODASSIGN:
211
 				case MODASSIGN:
210
-					return binary(expression.target, expression.getFirstArgument(), OperatorPriority.XORASSIGN, " %= ");
212
+					return binary(expression.target, expression.getFirstArgument(), ZenScriptOperator.MODASSIGN);
211
 				case CATASSIGN:
213
 				case CATASSIGN:
212
-					return binary(expression.target, expression.getFirstArgument(), OperatorPriority.XORASSIGN, " ~= ");
214
+					return binary(expression.target, expression.getFirstArgument(), ZenScriptOperator.CATASSIGN);
213
 				case ORASSIGN:
215
 				case ORASSIGN:
214
-					return binary(expression.target, expression.getFirstArgument(), OperatorPriority.XORASSIGN, " |= ");
216
+					return binary(expression.target, expression.getFirstArgument(), ZenScriptOperator.ORASSIGN);
215
 				case ANDASSIGN:
217
 				case ANDASSIGN:
216
-					return binary(expression.target, expression.getFirstArgument(), OperatorPriority.XORASSIGN, " &= ");
218
+					return binary(expression.target, expression.getFirstArgument(), ZenScriptOperator.ANDASSIGN);
217
 				case XORASSIGN:
219
 				case XORASSIGN:
218
-					return binary(expression.target, expression.getFirstArgument(), OperatorPriority.XORASSIGN, " ^= ");
220
+					return binary(expression.target, expression.getFirstArgument(), ZenScriptOperator.XORASSIGN);
219
 				case INCREMENT:
221
 				case INCREMENT:
220
-					return unaryPrefix(expression.target, OperatorPriority.DECREMENT, "++");
222
+					return unaryPrefix(expression.target, ZenScriptOperator.DECREMENT, "++");
221
 				case DECREMENT:
223
 				case DECREMENT:
222
-					return unaryPrefix(expression.target, OperatorPriority.DECREMENT, "--");
224
+					return unaryPrefix(expression.target, ZenScriptOperator.DECREMENT, "--");
223
 				case CALL: {
225
 				case CALL: {
224
 					StringBuilder result = new StringBuilder();
226
 					StringBuilder result = new StringBuilder();
225
 					result.append(".");
227
 					result.append(".");
226
 					FormattingUtils.formatCall(result, typeFormatter, this, expression.arguments);
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
 				case CAST: {
231
 				case CAST: {
230
 					StringBuilder result = new StringBuilder();
232
 					StringBuilder result = new StringBuilder();
231
 					result.append(" as ");
233
 					result.append(" as ");
232
 					result.append(expression.arguments.typeArguments[0].accept(typeFormatter));
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
 				default:
237
 				default:
236
 					throw new UnsupportedOperationException("Unknown operator: " + operator.operator);
238
 					throw new UnsupportedOperationException("Unknown operator: " + operator.operator);
241
 			result.append(".");
243
 			result.append(".");
242
 			result.append(expression.member.name);
244
 			result.append(expression.member.name);
243
 			FormattingUtils.formatCall(result, typeFormatter, this, expression.arguments);
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
 			result.append(expression.member.name);
264
 			result.append(expression.member.name);
263
 		}
265
 		}
264
 		FormattingUtils.formatCall(result, typeFormatter, this, expression.arguments);
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
 	@Override
270
 	@Override
277
 
279
 
278
 	@Override
280
 	@Override
279
 	public ExpressionString visitCapturedLocalVariable(CapturedLocalVariableExpression expression) {
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
 	@Override
285
 	@Override
284
 	public ExpressionString visitCapturedParameter(CapturedParameterExpression expression) {
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
 	@Override
290
 	@Override
289
 	public ExpressionString visitCapturedThis(CapturedThisExpression expression) {
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
 	@Override
295
 	@Override
298
 			result.append(" as ");
300
 			result.append(" as ");
299
 			result.append(expression.member.toType.accept(typeFormatter));
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
 	@Override
306
 	@Override
308
 
310
 
309
 	@Override
311
 	@Override
310
 	public ExpressionString visitCoalesce(CoalesceExpression expression) {
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
 	@Override
316
 	@Override
319
 		result.append(expression.ifThen.accept(this));
321
 		result.append(expression.ifThen.accept(this));
320
 		result.append(" : ");
322
 		result.append(" : ");
321
 		result.append(expression.ifElse.accept(this));
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
 	@Override
327
 	@Override
326
 	public ExpressionString visitConstantBool(ConstantBoolExpression expression) {
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
 	@Override
332
 	@Override
331
 	public ExpressionString visitConstantByte(ConstantByteExpression expression) {
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
 	@Override
337
 	@Override
336
 	public ExpressionString visitConstantChar(ConstantCharExpression expression) {
338
 	public ExpressionString visitConstantChar(ConstantCharExpression expression) {
337
 		return new ExpressionString(
339
 		return new ExpressionString(
338
 				StringUtils.escape(Character.toString(expression.value), '\'', true),
340
 				StringUtils.escape(Character.toString(expression.value), '\'', true),
339
-				OperatorPriority.PRIMARY);
341
+				ZenScriptOperator.PRIMARY);
340
 	}
342
 	}
341
 
343
 
342
 	@Override
344
 	@Override
351
 
353
 
352
 	@Override
354
 	@Override
353
 	public ExpressionString visitConstantInt(ConstantIntExpression expression) {
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
 	@Override
359
 	@Override
358
 	public ExpressionString visitConstantLong(ConstantLongExpression expression) {
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
 	@Override
364
 	@Override
363
 	public ExpressionString visitConstantSByte(ConstantSByteExpression expression) {
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
 	@Override
369
 	@Override
368
 	public ExpressionString visitConstantShort(ConstantShortExpression expression) {
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
 	@Override
374
 	@Override
374
 		return new ExpressionString(StringUtils.escape(
376
 		return new ExpressionString(StringUtils.escape(
375
 				expression.value,
377
 				expression.value,
376
 				settings.useSingleQuotesForStrings ? '\'' : '"',
378
 				settings.useSingleQuotesForStrings ? '\'' : '"',
377
-				true), OperatorPriority.CAST);
379
+				true), ZenScriptOperator.CAST);
378
 	}
380
 	}
379
 
381
 
380
 	@Override
382
 	@Override
381
 	public ExpressionString visitConstantUInt(ConstantUIntExpression expression) {
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
 	@Override
387
 	@Override
386
 	public ExpressionString visitConstantULong(ConstantULongExpression expression) {
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
 	@Override
392
 	@Override
391
 	public ExpressionString visitConstantUShort(ConstantUShortExpression expression) {
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
 	@Override
397
 	@Override
397
 		StringBuilder result = new StringBuilder();
399
 		StringBuilder result = new StringBuilder();
398
 		result.append("this");
400
 		result.append("this");
399
 		FormattingUtils.formatCall(result, typeFormatter, this, expression.arguments);
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
 	@Override
405
 	@Override
405
 		StringBuilder result = new StringBuilder();
407
 		StringBuilder result = new StringBuilder();
406
 		result.append("super");
408
 		result.append("super");
407
 		FormattingUtils.formatCall(result, typeFormatter, this, expression.arguments);
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
 	@Override
413
 	@Override
412
 	public ExpressionString visitEnumConstant(EnumConstantExpression expression) {
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
 	@Override
418
 	@Override
418
 		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
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
 	@Override
423
 	@Override
427
 	public ExpressionString visitGetField(GetFieldExpression expression) {
424
 	public ExpressionString visitGetField(GetFieldExpression expression) {
428
 		StringBuilder result = new StringBuilder();
425
 		StringBuilder result = new StringBuilder();
429
 		result.append(expression.target.accept(this));
426
 		result.append(expression.target.accept(this));
430
 		result.append('.');
427
 		result.append('.');
431
 		result.append(expression.field.name);
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
 	@Override
432
 	@Override
436
 	public ExpressionString visitGetFunctionParameter(GetFunctionParameterExpression expression) {
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
 	@Override
437
 	@Override
441
 	public ExpressionString visitGetLocalVariable(GetLocalVariableExpression expression) {
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
 	@Override
442
 	@Override
448
 		result.append(expression.type.accept(typeFormatter));
445
 		result.append(expression.type.accept(typeFormatter));
449
 		result.append('.');
446
 		result.append('.');
450
 		result.append(expression.field.name);
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
 	@Override
451
 	@Override
457
 		result.append(expression.target.accept(this));
454
 		result.append(expression.target.accept(this));
458
 		result.append('.');
455
 		result.append('.');
459
 		result.append(expression.getter.name);
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
 	@Override
460
 	@Override
464
 	public ExpressionString visitGlobal(GlobalExpression expression) {
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
 	@Override
465
 	@Override
470
 		StringBuilder result = new StringBuilder();
467
 		StringBuilder result = new StringBuilder();
471
 		result.append(expression.name);
468
 		result.append(expression.name);
472
 		FormattingUtils.formatCall(result, typeFormatter, this, expression.arguments);
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
 	@Override
473
 	@Override
479
 		result.append(expression.value.accept(this).value);
476
 		result.append(expression.value.accept(this).value);
480
 		result.append(" as ");
477
 		result.append(" as ");
481
 		result.append(expression.type.accept(typeFormatter));
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
 	@Override
482
 	@Override
488
 		result.append(expression.value.accept(this).value);
485
 		result.append(expression.value.accept(this).value);
489
 		result.append(" is ");
486
 		result.append(" is ");
490
 		result.append(expression.type.accept(typeFormatter));
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
 	@Override
491
 	@Override
508
 			result.append(expression.values[i].accept(this));
505
 			result.append(expression.values[i].accept(this));
509
 		}
506
 		}
510
 		result.append("}");
507
 		result.append("}");
511
-		return new ExpressionString(result.toString(), OperatorPriority.PRIMARY);
508
+		return new ExpressionString(result.toString(), ZenScriptOperator.PRIMARY);
512
 	}
509
 	}
513
 	
510
 	
514
 	@Override
511
 	@Override
527
 		result.append("new ");
524
 		result.append("new ");
528
 		result.append(expression.type.accept(typeFormatter));
525
 		result.append(expression.type.accept(typeFormatter));
529
 		FormattingUtils.formatCall(result, typeFormatter, this, expression.arguments);
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
 	@Override
530
 	@Override
534
 	public ExpressionString visitNull(NullExpression expression) {
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
 	@Override
535
 	@Override
539
 	public ExpressionString visitOrOr(OrOrExpression expression) {
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
 	@Override
540
 	@Override
544
 	public ExpressionString visitPostCall(PostCallExpression expression) {
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
 	@Override
545
 	@Override
549
 	public ExpressionString visitRange(RangeExpression expression) {
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
 	@Override
550
 	@Override
554
 	public ExpressionString visitSameObject(SameObjectExpression expression) {
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
 	@Override
555
 	@Override
559
 	public ExpressionString visitSetField(SetFieldExpression expression) {
556
 	public ExpressionString visitSetField(SetFieldExpression expression) {
560
 		return new ExpressionString(
557
 		return new ExpressionString(
561
 				expression.target.accept(this) + "." + expression.field.name + " = " + expression.value.accept(this).value, 
558
 				expression.target.accept(this) + "." + expression.field.name + " = " + expression.value.accept(this).value, 
562
-				OperatorPriority.ASSIGN);
559
+				ZenScriptOperator.ASSIGN);
563
 	}
560
 	}
564
 
561
 
565
 	@Override
562
 	@Override
566
 	public ExpressionString visitSetFunctionParameter(SetFunctionParameterExpression expression) {
563
 	public ExpressionString visitSetFunctionParameter(SetFunctionParameterExpression expression) {
567
 		return new ExpressionString(
564
 		return new ExpressionString(
568
 				expression.parameter.name + " = " + expression.value.accept(this).value,
565
 				expression.parameter.name + " = " + expression.value.accept(this).value,
569
-				OperatorPriority.ASSIGN);
566
+				ZenScriptOperator.ASSIGN);
570
 	}
567
 	}
571
 
568
 
572
 	@Override
569
 	@Override
573
 	public ExpressionString visitSetLocalVariable(SetLocalVariableExpression expression) {
570
 	public ExpressionString visitSetLocalVariable(SetLocalVariableExpression expression) {
574
 		return new ExpressionString(
571
 		return new ExpressionString(
575
 				expression.variable.name + " = " + expression.value.accept(this).value,
572
 				expression.variable.name + " = " + expression.value.accept(this).value,
576
-				OperatorPriority.ASSIGN);
573
+				ZenScriptOperator.ASSIGN);
577
 	}
574
 	}
578
 
575
 
579
 	@Override
576
 	@Override
580
 	public ExpressionString visitSetStaticField(SetStaticFieldExpression expression) {
577
 	public ExpressionString visitSetStaticField(SetStaticFieldExpression expression) {
581
 		return new ExpressionString(
578
 		return new ExpressionString(
582
 				expression.type.accept(typeFormatter) + "." + expression.field.name + " = " + expression.value.accept(this).value,
579
 				expression.type.accept(typeFormatter) + "." + expression.field.name + " = " + expression.value.accept(this).value,
583
-				OperatorPriority.ASSIGN);
580
+				ZenScriptOperator.ASSIGN);
584
 	}
581
 	}
585
 
582
 
586
 	@Override
583
 	@Override
587
 	public ExpressionString visitSetter(SetterExpression expression) {
584
 	public ExpressionString visitSetter(SetterExpression expression) {
588
 		return new ExpressionString(
585
 		return new ExpressionString(
589
 				expression.target.accept(this) + "." + expression.setter.name + " = " + expression.value.accept(this),
586
 				expression.target.accept(this) + "." + expression.setter.name + " = " + expression.value.accept(this),
590
-				OperatorPriority.ASSIGN);
587
+				ZenScriptOperator.ASSIGN);
591
 	}
588
 	}
592
 
589
 
593
 	@Override
590
 	@Override
594
 	public ExpressionString visitStaticGetter(StaticGetterExpression expression) {
591
 	public ExpressionString visitStaticGetter(StaticGetterExpression expression) {
595
 		return new ExpressionString(
592
 		return new ExpressionString(
596
 				expression.type.accept(typeFormatter) + "." + expression.getter.name, 
593
 				expression.type.accept(typeFormatter) + "." + expression.getter.name, 
597
-				OperatorPriority.MEMBER);
594
+				ZenScriptOperator.MEMBER);
598
 	}
595
 	}
599
 
596
 
600
 	@Override
597
 	@Override
601
 	public ExpressionString visitStaticSetter(StaticSetterExpression expression) {
598
 	public ExpressionString visitStaticSetter(StaticSetterExpression expression) {
602
 		return new ExpressionString(
599
 		return new ExpressionString(
603
 				expression.type.accept(typeFormatter) + "." + expression.setter.name + " = " + expression.setter.name,
600
 				expression.type.accept(typeFormatter) + "." + expression.setter.name + " = " + expression.setter.name,
604
-				OperatorPriority.ASSIGN);
601
+				ZenScriptOperator.ASSIGN);
605
 	}
602
 	}
606
 	
603
 	
607
 	@Override
604
 	@Override
611
 
608
 
612
 	@Override
609
 	@Override
613
 	public ExpressionString visitThis(ThisExpression expression) {
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
 	@Override
619
 	@Override
637
 		StringBuilder result = new StringBuilder();
639
 		StringBuilder result = new StringBuilder();
638
 		result.append("new ");
640
 		result.append("new ");
639
 		// TODO: finish this
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
 	@Override
645
 	@Override
645
 		return expression.value.accept(this);
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
 		return new ExpressionString(operatorString + value.accept(this).value, operator);
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
 		return new ExpressionString(value.accept(this).value + operatorString, operator);
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
-/*
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
  */
5
  */
6
 package org.openzen.zenscript.formatter;
6
 package org.openzen.zenscript.formatter;
7
 
7
 
8
+import org.openzen.zenscript.formattershared.Importer;
8
 import java.util.ArrayList;
9
 import java.util.ArrayList;
9
 import java.util.Collections;
10
 import java.util.Collections;
10
 import java.util.HashMap;
11
 import java.util.HashMap;
21
  * @author Hoofdgebruiker
22
  * @author Hoofdgebruiker
22
  */
23
  */
23
 public class FileFormatter {
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
 		this.settings = settings;
28
 		this.settings = settings;
28
 	}
29
 	}
29
 	
30
 	

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

66
 			output.append("const? ");
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
 		FormattingUtils.formatTypeParameters(result, header.typeParameters, typeFormatter);
70
 		FormattingUtils.formatTypeParameters(result, header.typeParameters, typeFormatter);
71
 		result.append("(");
71
 		result.append("(");
72
 		int parameterIndex = 0;
72
 		int parameterIndex = 0;
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
 		body.accept(new BodyFormatter(output, settings, indent, typeFormatter));
119
 		body.accept(new BodyFormatter(output, settings, indent, typeFormatter));
120
 		output.append("\n");
120
 		output.append("\n");
121
 	}
121
 	}
149
 	
149
 	
150
 	private static class BodyFormatter implements StatementVisitor<Void> {
150
 	private static class BodyFormatter implements StatementVisitor<Void> {
151
 		private final StringBuilder output;
151
 		private final StringBuilder output;
152
-		private final FormattingSettings settings;
152
+		private final ScriptFormattingSettings settings;
153
 		private final StatementFormatter statementFormatter;
153
 		private final StatementFormatter statementFormatter;
154
 		private final String indent;
154
 		private final String indent;
155
 		private final TypeFormatter typeFormatter;
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
 			this.output = output;
158
 			this.output = output;
159
 			this.settings = settings;
159
 			this.settings = settings;
160
 			this.indent = indent;
160
 			this.indent = indent;

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

29
  * @author Hoofdgebruiker
29
  * @author Hoofdgebruiker
30
  */
30
  */
31
 public class MemberFormatter implements MemberVisitor<Void> {
31
 public class MemberFormatter implements MemberVisitor<Void> {
32
-	private final FormattingSettings settings;
32
+	private final ScriptFormattingSettings settings;
33
 	private final StringBuilder output;
33
 	private final StringBuilder output;
34
 	private final String indent;
34
 	private final String indent;
35
 	private final TypeFormatter typeFormatter;
35
 	private final TypeFormatter typeFormatter;
36
 	private boolean isFirst = true;
36
 	private boolean isFirst = true;
37
 	private boolean wasField = false;
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
 		this.settings = settings;
40
 		this.settings = settings;
41
 		this.output = output;
41
 		this.output = output;
42
 		this.indent = indent;
42
 		this.indent = indent;

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

1
-/*
2
- * To change this license header, choose License Headers in Project Properties.
3
- * To change this template file, choose Tools | Templates
4
- * and open the template in the editor.
5
- */
6
-package org.openzen.zenscript.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
  */
5
  */
6
 package org.openzen.zenscript.formatter;
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
  * @author Hoofdgebruiker
12
  * @author Hoofdgebruiker
13
  */
13
  */
14
-public class FormattingSettings {
14
+public class ScriptFormattingSettings extends FormattingSettings {
15
 	public final boolean showAnyInFunctionHeaders;
15
 	public final boolean showAnyInFunctionHeaders;
16
 	public final boolean useSingleQuotesForStrings;
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
 	public final boolean spaceBeforeLabelColon;
17
 	public final boolean spaceBeforeLabelColon;
20
 	public final boolean spaceAfterLabelColon;
18
 	public final boolean spaceAfterLabelColon;
21
 	public final boolean bracketsAroundConditions;
19
 	public final boolean bracketsAroundConditions;
37
 	public final boolean functionBracketOnSameLine;
35
 	public final boolean functionBracketOnSameLine;
38
 	public final boolean lambdaMethodOnSameLine;
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
 		showAnyInFunctionHeaders = builder.showAnyInFunctionHeaders;
41
 		showAnyInFunctionHeaders = builder.showAnyInFunctionHeaders;
44
 		useSingleQuotesForStrings = builder.useSingleQuotesForStrings;
42
 		useSingleQuotesForStrings = builder.useSingleQuotesForStrings;
45
-		useTabs = builder.useTabs;
46
-		spacesPerTab = builder.spacesPerTab;
47
 		spaceBeforeLabelColon = builder.spaceBeforeLabelColon;
43
 		spaceBeforeLabelColon = builder.spaceBeforeLabelColon;
48
 		spaceAfterLabelColon = builder.spaceAfterLabelColon;
44
 		spaceAfterLabelColon = builder.spaceAfterLabelColon;
49
 		bracketsAroundConditions = builder.bracketsAroundConditions;
45
 		bracketsAroundConditions = builder.bracketsAroundConditions;
64
 		classBracketOnSameLine = builder.classBracketOnSameLine;
60
 		classBracketOnSameLine = builder.classBracketOnSameLine;
65
 		functionBracketOnSameLine = builder.functionBracketOnSameLine;
61
 		functionBracketOnSameLine = builder.functionBracketOnSameLine;
66
 		lambdaMethodOnSameLine = builder.lambdaMethodOnSameLine;
62
 		lambdaMethodOnSameLine = builder.lambdaMethodOnSameLine;
67
-		
68
-		if (useTabs) {
69
-			indent = "\t";
70
-		} else {
71
-			indent = StringUtils.times(' ', spacesPerTab);
72
-		}
73
 	}
63
 	}
74
 	
64
 	
75
 	public String getSingleLineSeparator(String indent, ParentStatementType position) {
65
 	public String getSingleLineSeparator(String indent, ParentStatementType position) {
143
 		}
133
 		}
144
 	}
134
 	}
145
 	
135
 	
146
-	public static class Builder {
136
+	public static class Builder extends FormattingSettings.Builder<Builder> {
147
 		private boolean showAnyInFunctionHeaders = false;
137
 		private boolean showAnyInFunctionHeaders = false;
148
 		private boolean useSingleQuotesForStrings = true;
138
 		private boolean useSingleQuotesForStrings = true;
149
 		private boolean useTabs = false;
139
 		private boolean useTabs = false;
169
 		private boolean functionBracketOnSameLine = false;
159
 		private boolean functionBracketOnSameLine = false;
170
 		private boolean lambdaMethodOnSameLine = false;
160
 		private boolean lambdaMethodOnSameLine = false;
171
 		
161
 		
162
+		public Builder() {
163
+			super(CommentFormatter::format);
164
+			
165
+			instance = this;
166
+		}
167
+		
172
 		public Builder showAnyInFunctionHeaders(boolean show) {
168
 		public Builder showAnyInFunctionHeaders(boolean show) {
173
 			showAnyInFunctionHeaders = show;
169
 			showAnyInFunctionHeaders = show;
174
 			return this;
170
 			return this;
179
 			return this;
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
 		public Builder spaceBeforeLabelColon(boolean space) {
178
 		public Builder spaceBeforeLabelColon(boolean space) {
193
 			spaceBeforeLabelColon = space;
179
 			spaceBeforeLabelColon = space;
194
 			return this;
180
 			return this;
289
 			return this;
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
  * @author Hoofdgebruiker
33
  * @author Hoofdgebruiker
34
  */
34
  */
35
 public class StatementFormatter implements StatementVisitor<Void> {
35
 public class StatementFormatter implements StatementVisitor<Void> {
36
-	private final FormattingSettings settings;
36
+	private final ScriptFormattingSettings settings;
37
 	private final StringBuilder output;
37
 	private final StringBuilder output;
38
 	private final ExpressionFormatter expressionFormatter;
38
 	private final ExpressionFormatter expressionFormatter;
39
 	
39
 	
40
 	private String indent;
40
 	private String indent;
41
 	private ParentStatementType position = ParentStatementType.NONE;
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
 		this.output = output;
44
 		this.output = output;
45
 		this.indent = indent;
45
 		this.indent = indent;
46
 		this.settings = settings;
46
 		this.settings = settings;

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

18
  * @author Hoofdgebruiker
18
  * @author Hoofdgebruiker
19
  */
19
  */
20
 public class SwitchValueFormatter implements SwitchValueVisitor<String> {
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
 		this.settings = settings;
24
 		this.settings = settings;
25
 	}
25
 	}
26
 
26
 

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

5
  */
5
  */
6
 package org.openzen.zenscript.formatter;
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
 import org.openzen.zenscript.codemodel.generic.GenericParameterBoundVisitor;
9
 import org.openzen.zenscript.codemodel.generic.GenericParameterBoundVisitor;
12
 import org.openzen.zenscript.codemodel.generic.ParameterSuperBound;
10
 import org.openzen.zenscript.codemodel.generic.ParameterSuperBound;
13
 import org.openzen.zenscript.codemodel.generic.ParameterTypeBound;
11
 import org.openzen.zenscript.codemodel.generic.ParameterTypeBound;
32
  * @author Hoofdgebruiker
30
  * @author Hoofdgebruiker
33
  */
31
  */
34
 public class TypeFormatter implements ITypeVisitor<String>, GenericParameterBoundVisitor<String> {
32
 public class TypeFormatter implements ITypeVisitor<String>, GenericParameterBoundVisitor<String> {
35
-	private final FormattingSettings settings;
33
+	private final ScriptFormattingSettings settings;
36
 	private final Importer importer;
34
 	private final Importer importer;
37
 	
35
 	
38
-	public TypeFormatter(FormattingSettings settings, Importer importer) {
36
+	public TypeFormatter(ScriptFormattingSettings settings, Importer importer) {
39
 		this.settings = settings;
37
 		this.settings = settings;
40
 		this.importer = importer;
38
 		this.importer = importer;
41
 	}
39
 	}
127
 	public String visitGenericMap(GenericMapTypeID map) {
125
 	public String visitGenericMap(GenericMapTypeID map) {
128
 		StringBuilder result = new StringBuilder();
126
 		StringBuilder result = new StringBuilder();
129
 		result.append(map.value.accept(this));
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
 		return result.toString();
131
 		return result.toString();
134
 	}
132
 	}
135
 }
133
 }

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

1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.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

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

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

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

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

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

1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.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

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

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
 	EQ("=="),
11
 	EQ("=="),
12
 	NE("!="),
12
 	NE("!="),
13
 	LE("<="),
13
 	LE("<="),
14
-	GE(">="),
15
-	SAME("==="),
16
-	NOTSAME("!==");
14
+	GE(">=");
17
 	
15
 	
18
 	public final String str;
16
 	public final String str;
19
 	
17
 	

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

28
 	public final String name;
28
 	public final String name;
29
 	public final int modifiers;
29
 	public final int modifiers;
30
 	public final List<IDefinitionMember> members = new ArrayList<>();
30
 	public final List<IDefinitionMember> members = new ArrayList<>();
31
+	public final AccessScope access = new AccessScope();
31
 	public TypeParameter[] genericParameters = null;
32
 	public TypeParameter[] genericParameters = null;
32
 	
33
 	
33
 	public HighLevelDefinition outerDefinition;
34
 	public HighLevelDefinition outerDefinition;

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

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

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

36
 	
36
 	
37
 	public void setHeader(FunctionHeader header) {
37
 	public void setHeader(FunctionHeader header) {
38
 		this.header = header;
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
 		callerGroup.addMethod(caller, TypeMemberPriority.SPECIFIED);
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
 	public <T> T accept(ExpressionVisitor<T> visitor) {
27
 	public <T> T accept(ExpressionVisitor<T> visitor) {
28
 		return visitor.visitAndAnd(this);
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
 	public <T> T accept(ExpressionVisitor<T> visitor) {
27
 	public <T> T accept(ExpressionVisitor<T> visitor) {
28
 		return visitor.visitArray(this);
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
 		return typeArguments.length;
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
 	public CallArguments normalize(CodePosition position, TypeScope scope, FunctionHeader header) {
51
 	public CallArguments normalize(CodePosition position, TypeScope scope, FunctionHeader header) {
47
 		CallArguments result = this;
52
 		CallArguments result = this;
48
 		
53
 		

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

25
 		
25
 		
26
 		this.target = target;
26
 		this.target = target;
27
 		this.member = member;
27
 		this.member = member;
28
-		this.arguments = arguments.normalize(position, scope, instancedHeader);
28
+		this.arguments = scope == null ? arguments : arguments.normalize(position, scope, instancedHeader);
29
 		this.instancedHeader = instancedHeader;
29
 		this.instancedHeader = instancedHeader;
30
 	}
30
 	}
31
 	
31
 	
37
 	public <T> T accept(ExpressionVisitor<T> visitor) {
37
 	public <T> T accept(ExpressionVisitor<T> visitor) {
38
 		return visitor.visitCall(this);
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
 		
26
 		
27
 		this.member = member;
27
 		this.member = member;
28
 		this.target = target;
28
 		this.target = target;
29
-		this.arguments = arguments.normalize(position, scope, instancedHeader);
29
+		this.arguments = scope == null ? arguments : arguments.normalize(position, scope, instancedHeader);
30
 		this.instancedHeader = instancedHeader;
30
 		this.instancedHeader = instancedHeader;
31
 	}
31
 	}
32
 
32
 
34
 	public <T> T accept(ExpressionVisitor<T> visitor) {
34
 	public <T> T accept(ExpressionVisitor<T> visitor) {
35
 		return visitor.visitCallStatic(this);
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
 	public <T> T accept(CapturedExpressionVisitor<T> visitor) {
29
 	public <T> T accept(CapturedExpressionVisitor<T> visitor) {
30
 		return visitor.visitRecaptured(this);
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
  */
5
  */
6
 package org.openzen.zenscript.codemodel.expression;
6
 package org.openzen.zenscript.codemodel.expression;
7
 
7
 
8
+import java.util.Map;
9
+import org.openzen.zenscript.codemodel.FunctionParameter;
8
 import org.openzen.zenscript.shared.CodePosition;
10
 import org.openzen.zenscript.shared.CodePosition;
9
 
11
 
10
 /**
12
 /**
28
 	public <T> T accept(CapturedExpressionVisitor<T> visitor) {
30
 	public <T> T accept(CapturedExpressionVisitor<T> visitor) {
29
 		return visitor.visitCapturedDirect(this);
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
 	public <T> T accept(CapturedExpressionVisitor<T> visitor) {
30
 	public <T> T accept(CapturedExpressionVisitor<T> visitor) {
31
 		return visitor.visitCapturedLocal(this);
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
 	public <T> T accept(CapturedExpressionVisitor<T> visitor) {
30
 	public <T> T accept(CapturedExpressionVisitor<T> visitor) {
31
 		return visitor.visitCapturedParameter(this);
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
 	public <T> T accept(CapturedExpressionVisitor<T> visitor) {
26
 	public <T> T accept(CapturedExpressionVisitor<T> visitor) {
27
 		return visitor.visitCapturedThis(this);
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
  */
5
  */
6
 package org.openzen.zenscript.codemodel.expression;
6
 package org.openzen.zenscript.codemodel.expression;
7
 
7
 
8
+import java.util.Map;
9
+import org.openzen.zenscript.codemodel.FunctionParameter;
8
 import org.openzen.zenscript.codemodel.member.CasterMember;
10
 import org.openzen.zenscript.codemodel.member.CasterMember;
9
 import org.openzen.zenscript.shared.CodePosition;
11
 import org.openzen.zenscript.shared.CodePosition;
10
 
12
 
29
 	public <T> T accept(ExpressionVisitor<T> visitor) {
31
 	public <T> T accept(ExpressionVisitor<T> visitor) {
30
 		return visitor.visitCast(this);
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
 	public <T> T accept(ExpressionVisitor<T> visitor) {
25
 	public <T> T accept(ExpressionVisitor<T> visitor) {
26
 		return visitor.visitCheckNull(this);
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
 	public <T> T accept(ExpressionVisitor<T> visitor) {
26
 	public <T> T accept(ExpressionVisitor<T> visitor) {
27
 		return visitor.visitCoalesce(this);
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
 package org.openzen.zenscript.codemodel.expression;
6
 package org.openzen.zenscript.codemodel.expression;
7
 
7
 
8
 import org.openzen.zenscript.codemodel.CompareType;
8
 import org.openzen.zenscript.codemodel.CompareType;
9
+import org.openzen.zenscript.codemodel.member.FunctionalMember;
10
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
11
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
10
 import org.openzen.zenscript.shared.CodePosition;
12
 import org.openzen.zenscript.shared.CodePosition;
11
 
13
 
15
  * 
17
  * 
16
  * @author Hoofdgebruiker
18
  * @author Hoofdgebruiker
17
  */
19
  */
18
-public class BasicCompareExpression extends Expression {
20
+public class CompareExpression extends Expression {
19
 	public final Expression left;
21
 	public final Expression left;
20
 	public final Expression right;
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
 		super(position, BasicTypeID.BOOL, binaryThrow(position, left.thrownType, right.thrownType));
27
 		super(position, BasicTypeID.BOOL, binaryThrow(position, left.thrownType, right.thrownType));
25
 		
28
 		
26
 		this.left = left;
29
 		this.left = left;
27
-		this.right = right;
30
+		this.right = scope == null ? right : right.castImplicit(position, scope, operator.header.parameters[0].type);
28
 		this.operator = operator;
31
 		this.operator = operator;
32
+		this.comparison = comparison;
29
 	}
33
 	}
30
 
34
 
31
 	@Override
35
 	@Override
32
 	public <T> T accept(ExpressionVisitor<T> visitor) {
36
 	public <T> T accept(ExpressionVisitor<T> visitor) {
33
 		return visitor.visitCompare(this);
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
 	public <T> T accept(ExpressionVisitor<T> visitor) {
37
 	public <T> T accept(ExpressionVisitor<T> visitor) {
38
 		return visitor.visitConditional(this);
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
 	public <T> T accept(ExpressionVisitor<T> visitor) {
25
 	public <T> T accept(ExpressionVisitor<T> visitor) {
26
 		return visitor.visitConstantBool(this);
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
 	public <T> T accept(ExpressionVisitor<T> visitor) {
25
 	public <T> T accept(ExpressionVisitor<T> visitor) {
26
 		return visitor.visitConstantByte(this);
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
 	public <T> T accept(ExpressionVisitor<T> visitor) {
25
 	public <T> T accept(ExpressionVisitor<T> visitor) {
26
 		return visitor.visitConstantChar(this);
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
 	public <T> T accept(ExpressionVisitor<T> visitor) {
25
 	public <T> T accept(ExpressionVisitor<T> visitor) {
26
 		return visitor.visitConstantDouble(this);
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
 	public <T> T accept(ExpressionVisitor<T> visitor) {
25
 	public <T> T accept(ExpressionVisitor<T> visitor) {
26
 		return visitor.visitConstantFloat(this);
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
 	public <T> T accept(ExpressionVisitor<T> visitor) {
25
 	public <T> T accept(ExpressionVisitor<T> visitor) {
26
 		return visitor.visitConstantInt(this);
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
 	public <T> T accept(ExpressionVisitor<T> visitor) {
25
 	public <T> T accept(ExpressionVisitor<T> visitor) {
26
 		return visitor.visitConstantLong(this);
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
 	public <T> T accept(ExpressionVisitor<T> visitor) {
25
 	public <T> T accept(ExpressionVisitor<T> visitor) {
26
 		return visitor.visitConstantSByte(this);
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
 	public <T> T accept(ExpressionVisitor<T> visitor) {
25
 	public <T> T accept(ExpressionVisitor<T> visitor) {
26
 		return visitor.visitConstantShort(this);
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
 	public <T> T accept(ExpressionVisitor<T> visitor) {
25
 	public <T> T accept(ExpressionVisitor<T> visitor) {
26
 		return visitor.visitConstantString(this);
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
 	public <T> T accept(ExpressionVisitor<T> visitor) {
25
 	public <T> T accept(ExpressionVisitor<T> visitor) {
26
 		return visitor.visitConstantUInt(this);
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
 	public <T> T accept(ExpressionVisitor<T> visitor) {
25
 	public <T> T accept(ExpressionVisitor<T> visitor) {
26
 		return visitor.visitConstantULong(this);
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
 	public <T> T accept(ExpressionVisitor<T> visitor) {
25
 	public <T> T accept(ExpressionVisitor<T> visitor) {
26
 		return visitor.visitConstantUShort(this);
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
 		
25
 		
26
 		this.objectType = type;
26
 		this.objectType = type;
27
 		this.constructor = constructor;
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
 	@Override
31
 	@Override
32
 	public <T> T accept(ExpressionVisitor<T> visitor) {
32
 	public <T> T accept(ExpressionVisitor<T> visitor) {
33
 		return visitor.visitConstructorSuperCall(this);
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
 	public ConstructorThisCallExpression(CodePosition position, ITypeID type, ConstructorMember constructor, CallArguments arguments, TypeScope scope) {
23
 	public ConstructorThisCallExpression(CodePosition position, ITypeID type, ConstructorMember constructor, CallArguments arguments, TypeScope scope) {
24
 		super(position, BasicTypeID.VOID, binaryThrow(position, constructor.header.thrownType, multiThrow(position, arguments.arguments)));
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
 		this.objectType = type;
26
 		this.objectType = type;
29
 		this.constructor = constructor;
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
 	@Override
31
 	@Override
34
 	public <T> T accept(ExpressionVisitor<T> visitor) {
32
 	public <T> T accept(ExpressionVisitor<T> visitor) {
35
 		return visitor.visitConstructorThisCall(this);
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
 	public <T> T accept(ExpressionVisitor<T> visitor) {
34
 	public <T> T accept(ExpressionVisitor<T> visitor) {
35
 		return visitor.visitEnumConstant(this);
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
 
7
 
8
 import java.util.Collections;
8
 import java.util.Collections;
9
 import java.util.List;
9
 import java.util.List;
10
+import java.util.Map;
10
 import java.util.stream.Collectors;
11
 import java.util.stream.Collectors;
11
 import org.openzen.zenscript.codemodel.FunctionHeader;
12
 import org.openzen.zenscript.codemodel.FunctionHeader;
13
+import org.openzen.zenscript.codemodel.FunctionParameter;
12
 import org.openzen.zenscript.codemodel.OperatorType;
14
 import org.openzen.zenscript.codemodel.OperatorType;
13
 import org.openzen.zenscript.codemodel.partial.IPartialExpression;
15
 import org.openzen.zenscript.codemodel.partial.IPartialExpression;
14
 import org.openzen.zenscript.codemodel.type.GenericName;
16
 import org.openzen.zenscript.codemodel.type.GenericName;
36
 	
38
 	
37
 	public abstract <T> T accept(ExpressionVisitor<T> visitor);
39
 	public abstract <T> T accept(ExpressionVisitor<T> visitor);
38
 	
40
 	
41
+	public abstract Expression transform(ExpressionTransformer transformer);
42
+	
39
 	@Override
43
 	@Override
40
 	public List<ITypeID> getAssignHints() {
44
 	public List<ITypeID> getAssignHints() {
41
 		return Collections.singletonList(type);
45
 		return Collections.singletonList(type);
102
 			result = binaryThrow(position, result, expression.thrownType);
106
 			result = binaryThrow(position, result, expression.thrownType);
103
 		return result;
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

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

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

5
  */
5
  */
6
 package org.openzen.zenscript.codemodel.expression;
6
 package org.openzen.zenscript.codemodel.expression;
7
 
7
 
8
+import java.util.HashMap;
9
+import java.util.Map;
8
 import org.openzen.zenscript.codemodel.FunctionHeader;
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
 import org.openzen.zenscript.codemodel.statement.Statement;
14
 import org.openzen.zenscript.codemodel.statement.Statement;
10
 import org.openzen.zenscript.codemodel.type.FunctionTypeID;
15
 import org.openzen.zenscript.codemodel.type.FunctionTypeID;
11
 import org.openzen.zenscript.shared.CodePosition;
16
 import org.openzen.zenscript.shared.CodePosition;
17
+import org.openzen.zenscript.shared.ConcatMap;
12
 
18
 
13
 /**
19
 /**
14
  *
20
  *
35
 	public <T> T accept(ExpressionVisitor<T> visitor) {
41
 	public <T> T accept(ExpressionVisitor<T> visitor) {
36
 		return visitor.visitFunction(this);
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
-/*
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
 import org.openzen.zenscript.codemodel.scope.TypeScope;
11
 import org.openzen.zenscript.codemodel.scope.TypeScope;
12
 import org.openzen.zenscript.codemodel.type.ITypeID;
12
 import org.openzen.zenscript.codemodel.type.ITypeID;
13
 import org.openzen.zenscript.shared.CodePosition;
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
 	public <T> T accept(ExpressionVisitor<T> visitor) {
46
 	public <T> T accept(ExpressionVisitor<T> visitor) {
49
 		return visitor.visitGetField(this);
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
 	public <T> T accept(ExpressionVisitor<T> visitor) {
38
 	public <T> T accept(ExpressionVisitor<T> visitor) {
39
 		return visitor.visitGetFunctionParameter(this);
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
 	public <T> T accept(ExpressionVisitor<T> visitor) {
38
 	public <T> T accept(ExpressionVisitor<T> visitor) {
39
 		return visitor.visitGetLocalVariable(this);
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
 	public <T> T accept(ExpressionVisitor<T> visitor) {
38
 	public <T> T accept(ExpressionVisitor<T> visitor) {
39
 		return visitor.visitGetStaticField(this);
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
 	public <T> T accept(ExpressionVisitor<T> visitor) {
27
 	public <T> T accept(ExpressionVisitor<T> visitor) {
28
 		return visitor.visitGetter(this);
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
 	public <T> T accept(ExpressionVisitor<T> visitor) {
28
 	public <T> T accept(ExpressionVisitor<T> visitor) {
29
 		return visitor.visitGlobalCall(this);
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
 	public <T> T accept(ExpressionVisitor<T> visitor) {
26
 	public <T> T accept(ExpressionVisitor<T> visitor) {
27
 		return visitor.visitGlobal(this);
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
 	public <T> T accept(ExpressionVisitor<T> visitor) {
25
 	public <T> T accept(ExpressionVisitor<T> visitor) {
26
 		return visitor.visitInterfaceCast(this);
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
 	public <T> T accept(ExpressionVisitor<T> visitor) {
28
 	public <T> T accept(ExpressionVisitor<T> visitor) {
29
 		return visitor.visitIs(this);
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
 	public <T> T accept(ExpressionVisitor<T> visitor) {
25
 	public <T> T accept(ExpressionVisitor<T> visitor) {
26
 		return visitor.visitMakeConst(this);
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
 	public <T> T accept(ExpressionVisitor<T> visitor) {
31
 	public <T> T accept(ExpressionVisitor<T> visitor) {
32
 		return visitor.visitMap(this);
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
  */
5
  */
6
 package org.openzen.zenscript.codemodel.expression;
6
 package org.openzen.zenscript.codemodel.expression;
7
 
7
 
8
+import java.util.Collections;
8
 import org.openzen.zenscript.codemodel.expression.switchvalue.SwitchValue;
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
 import org.openzen.zenscript.codemodel.type.ITypeID;
14
 import org.openzen.zenscript.codemodel.type.ITypeID;
10
 import org.openzen.zenscript.shared.CodePosition;
15
 import org.openzen.zenscript.shared.CodePosition;
11
 
16
 
28
 	public <T> T accept(ExpressionVisitor<T> visitor) {
33
 	public <T> T accept(ExpressionVisitor<T> visitor) {
29
 		return visitor.visitMatch(this);
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
 	public static class Case {
70
 	public static class Case {
33
 		public final SwitchValue key;
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
 			this.key = key;
75
 			this.key = key;
38
 			this.value = value;
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
 	private static ITypeID getThrownType(CodePosition position, Case[] cases) {
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
  */
5
  */
6
 package org.openzen.zenscript.codemodel.expression;
6
 package org.openzen.zenscript.codemodel.expression;
7
 
7
 
8
+import org.openzen.zenscript.codemodel.FunctionHeader;
8
 import org.openzen.zenscript.codemodel.member.ConstructorMember;
9
 import org.openzen.zenscript.codemodel.member.ConstructorMember;
10
+import org.openzen.zenscript.codemodel.scope.TypeScope;
9
 import org.openzen.zenscript.codemodel.type.ITypeID;
11
 import org.openzen.zenscript.codemodel.type.ITypeID;
10
 import org.openzen.zenscript.shared.CodePosition;
12
 import org.openzen.zenscript.shared.CodePosition;
11
 
13
 
16
 public class NewExpression extends Expression {
18
 public class NewExpression extends Expression {
17
 	public final ConstructorMember constructor;
19
 	public final ConstructorMember constructor;
18
 	public final CallArguments arguments;
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
 		super(position, type, binaryThrow(position, constructor.header.thrownType, multiThrow(position, arguments.arguments)));
29
 		super(position, type, binaryThrow(position, constructor.header.thrownType, multiThrow(position, arguments.arguments)));
22
 		
30
 		
23
 		this.constructor = constructor;
31
 		this.constructor = constructor;
24
 		this.arguments = arguments;
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
 	@Override
51
 	@Override
28
 	public <T> T accept(ExpressionVisitor<T> visitor) {
52
 	public <T> T accept(ExpressionVisitor<T> visitor) {
29
 		return visitor.visitNew(this);
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
 	public <T> T accept(ExpressionVisitor<T> visitor) {
26
 	public <T> T accept(ExpressionVisitor<T> visitor) {
27
 		return visitor.visitNull(this);
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
 	public <T> T accept(ExpressionVisitor<T> visitor) {
27
 	public <T> T accept(ExpressionVisitor<T> visitor) {
28
 		return visitor.visitOrOr(this);
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
 public class PostCallExpression extends Expression {
18
 public class PostCallExpression extends Expression {
19
 	public final Expression target;
19
 	public final Expression target;
20
 	public final OperatorMember member;
20
 	public final OperatorMember member;
21
+	public final FunctionHeader instancedHeader;
21
 	
22
 	
22
 	public PostCallExpression(CodePosition position, Expression target, OperatorMember member, FunctionHeader instancedHeader) {
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
 		if (member.operator != OperatorType.DECREMENT && member.operator != OperatorType.INCREMENT)
26
 		if (member.operator != OperatorType.DECREMENT && member.operator != OperatorType.INCREMENT)
26
 			throw new IllegalArgumentException("Operator must be increment or decrement");
27
 			throw new IllegalArgumentException("Operator must be increment or decrement");
27
 		
28
 		
28
 		this.target = target;
29
 		this.target = target;
29
 		this.member = member;
30
 		this.member = member;
31
+		this.instancedHeader = instancedHeader;
30
 	}
32
 	}
31
 
33
 
32
 	@Override
34
 	@Override
33
 	public <T> T accept(ExpressionVisitor<T> visitor) {
35
 	public <T> T accept(ExpressionVisitor<T> visitor) {
34
 		return visitor.visitPostCall(this);
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
 package org.openzen.zenscript.codemodel.expression;
6
 package org.openzen.zenscript.codemodel.expression;
7
 
7
 
8
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
8
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
9
+import org.openzen.zenscript.codemodel.type.ITypeID;
9
 import org.openzen.zenscript.shared.CodePosition;
10
 import org.openzen.zenscript.shared.CodePosition;
10
 
11
 
11
 /**
12
 /**
22
 		this.from = from;
23
 		this.from = from;
23
 		this.to = to;
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
 	@Override
34
 	@Override
27
 	public <T> T accept(ExpressionVisitor<T> visitor) {
35
 	public <T> T accept(ExpressionVisitor<T> visitor) {
28
 		return visitor.visitRange(this);
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
 	public <T> T accept(ExpressionVisitor<T> visitor) {
29
 	public <T> T accept(ExpressionVisitor<T> visitor) {
30
 		return visitor.visitSameObject(this);
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
 	public <T> T accept(ExpressionVisitor<T> visitor) {
29
 	public <T> T accept(ExpressionVisitor<T> visitor) {
30
 		return visitor.visitSetField(this);
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
 	public <T> T accept(ExpressionVisitor<T> visitor) {
27
 	public <T> T accept(ExpressionVisitor<T> visitor) {
28
 		return visitor.visitSetFunctionParameter(this);
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
 	public <T> T accept(ExpressionVisitor<T> visitor) {
27
 	public <T> T accept(ExpressionVisitor<T> visitor) {
28
 		return visitor.visitSetLocalVariable(this);
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
 	public <T> T accept(ExpressionVisitor<T> visitor) {
27
 	public <T> T accept(ExpressionVisitor<T> visitor) {
28
 		return visitor.visitSetStaticField(this);
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
 	public <T> T accept(ExpressionVisitor<T> visitor) {
29
 	public <T> T accept(ExpressionVisitor<T> visitor) {
30
 		return visitor.visitSetter(this);
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
 	public <T> T accept(ExpressionVisitor<T> visitor) {
25
 	public <T> T accept(ExpressionVisitor<T> visitor) {
26
 		return visitor.visitStaticGetter(this);
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
 	public <T> T accept(ExpressionVisitor<T> visitor) {
27
 	public <T> T accept(ExpressionVisitor<T> visitor) {
28
 		return visitor.visitStaticSetter(this);
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
 	public <T> T accept(ExpressionVisitor<T> visitor) {
26
 	public <T> T accept(ExpressionVisitor<T> visitor) {
27
 		return visitor.visitSupertypeCast(this);
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
 	public <T> T accept(ExpressionVisitor<T> visitor) {
29
 	public <T> T accept(ExpressionVisitor<T> visitor) {
30
 		return visitor.visitThis(this);
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

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
 	public <T> T accept(ExpressionVisitor<T> visitor) {
25
 	public <T> T accept(ExpressionVisitor<T> visitor) {
26
 		return visitor.visitTryConvert(this);
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
 	public <T> T accept(ExpressionVisitor<T> visitor) {
25
 	public <T> T accept(ExpressionVisitor<T> visitor) {
26
 		return visitor.visitTryRethrowAsException(this);
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
 	public <T> T accept(ExpressionVisitor<T> visitor) {
25
 	public <T> T accept(ExpressionVisitor<T> visitor) {
26
 		return visitor.visitTryRethrowAsResult(this);
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
 	public <T> T accept(ExpressionVisitor<T> visitor) {
46
 	public <T> T accept(ExpressionVisitor<T> visitor) {
47
 		return visitor.visitVariantValue(this);
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
 	public <T> T accept(ExpressionVisitor<T> visitor) {
28
 	public <T> T accept(ExpressionVisitor<T> visitor) {
29
 		return visitor.visitWrapOptional(this);
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
 package org.openzen.zenscript.codemodel.expression.switchvalue;
6
 package org.openzen.zenscript.codemodel.expression.switchvalue;
7
 
7
 
8
 import org.openzen.zenscript.codemodel.definition.VariantDefinition;
8
 import org.openzen.zenscript.codemodel.definition.VariantDefinition;
9
+import org.openzen.zenscript.codemodel.statement.VarStatement;
9
 
10
 
10
 /**
11
 /**
11
  *
12
  *
13
  */
14
  */
14
 public class VariantOptionSwitchValue implements SwitchValue {
15
 public class VariantOptionSwitchValue implements SwitchValue {
15
 	public final VariantDefinition.Option option;
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
 		this.option = option;
20
 		this.option = option;
20
 		this.parameters = parameters;
21
 		this.parameters = parameters;
21
 	}
22
 	}

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

16
 	
16
 	
17
 	T visitArrayKeyValueIterator();
17
 	T visitArrayKeyValueIterator();
18
 	
18
 	
19
+	T visitStringCharacterIterator();
20
+	
19
 	T visitCustomIterator();
21
 	T visitCustomIterator();
20
 }
22
 }

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

11
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
11
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
12
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
12
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
13
 import org.openzen.zenscript.codemodel.type.ITypeID;
13
 import org.openzen.zenscript.codemodel.type.ITypeID;
14
+import org.openzen.zenscript.codemodel.type.member.BuiltinID;
14
 import org.openzen.zenscript.codemodel.type.member.TypeMemberPriority;
15
 import org.openzen.zenscript.codemodel.type.member.TypeMemberPriority;
15
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
16
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
16
 import org.openzen.zenscript.shared.CodePosition;
17
 import org.openzen.zenscript.shared.CodePosition;
20
  * @author Hoofdgebruiker
21
  * @author Hoofdgebruiker
21
  */
22
  */
22
 public class CallerMember extends FunctionalMember {
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
 	@Override
34
 	@Override
36
 
43
 
37
 	@Override
44
 	@Override
38
 	public DefinitionMember instance(GlobalTypeRegistry registry, Map<TypeParameter, ITypeID> mapping) {
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
 	@Override
54
 	@Override

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

17
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
17
 import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
18
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
18
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
19
 import org.openzen.zenscript.codemodel.type.ITypeID;
19
 import org.openzen.zenscript.codemodel.type.ITypeID;
20
+import org.openzen.zenscript.codemodel.type.member.BuiltinID;
20
 import org.openzen.zenscript.codemodel.type.member.TypeMemberPriority;
21
 import org.openzen.zenscript.codemodel.type.member.TypeMemberPriority;
21
 import org.openzen.zenscript.shared.CodePosition;
22
 import org.openzen.zenscript.shared.CodePosition;
22
 
23
 
27
 public class CasterMember extends FunctionalMember implements ICasterMember {
28
 public class CasterMember extends FunctionalMember implements ICasterMember {
28
 	public final ITypeID toType;
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
 		this.toType = toType;
40
 		this.toType = toType;
34
 	}
41
 	}
50
 
57
 
51
 	@Override
58
 	@Override
52
 	public DefinitionMember instance(GlobalTypeRegistry registry, Map<TypeParameter, ITypeID> mapping) {
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
 	@Override
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