Pārlūkot izejas kodu

- Changed class hierarchy for getters and setters.

- Rewrote iterator implementation
Stan Hebben 6 gadus atpakaļ
vecāks
revīzija
1b08f6187a
42 mainītis faili ar 506 papildinājumiem un 828 dzēšanām
  1. 2
    2
      CodeFormatter/src/main/java/org/openzen/zenscript/formatter/MemberFormatter.java
  2. 56
    4
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/AnnotationProcessor.java
  3. 6
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/MemberAnnotation.java
  4. 12
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/NativeMemberAnnotation.java
  5. 30
    7
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/PreconditionForMethod.java
  6. 3
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/SetFieldExpression.java
  7. 0
    26
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/iterator/ForeachIteratorVisitor.java
  8. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/FieldMember.java
  9. 15
    18
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/GetterMember.java
  10. 0
    21
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/IIteratorMember.java
  11. 0
    23
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/IPropertyMember.java
  12. 5
    18
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/IteratorMember.java
  13. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/MemberVisitor.java
  14. 6
    2
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/PropertyMember.java
  15. 13
    17
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/SetterMember.java
  16. 4
    11
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/StaticInitializerMember.java
  17. 0
    95
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/builtin/ArrayIteratorKeyValues.java
  18. 0
    90
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/builtin/ArrayIteratorValues.java
  19. 0
    93
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/builtin/AssocIterator.java
  20. 0
    101
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/builtin/RangeIterator.java
  21. 0
    84
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/builtin/StringCharIterator.java
  22. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/GetterMemberRef.java
  23. 5
    6
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/IteratorMemberRef.java
  24. 3
    3
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/PropertyRef.java
  25. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/SetterMemberRef.java
  26. 8
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/member/BuiltinID.java
  27. 15
    11
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/member/TypeMemberBuilder.java
  28. 11
    25
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaForeachWriter.java
  29. 28
    1
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaStatementVisitor.java
  30. 1
    1
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/definitions/JavaMemberVisitor.java
  31. 17
    16
      JavaShared/src/main/java/org/openzen/zenscript/javashared/prepare/JavaPrepareClassMethodVisitor.java
  32. 15
    14
      JavaShared/src/main/java/org/openzen/zenscript/javashared/prepare/JavaPrepareExpansionMethodVisitor.java
  33. 3
    3
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaExpansionMemberCompiler.java
  34. 3
    3
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaMemberCompiler.java
  35. 92
    89
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceStatementFormatter.java
  36. 3
    3
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceSyntheticTypeGenerator.java
  37. 14
    1
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceTypeVisitor.java
  38. 51
    14
      Parser/src/main/java/org/openzen/zenscript/parser/member/ParsedGetter.java
  39. 4
    4
      Parser/src/main/java/org/openzen/zenscript/parser/member/ParsedIterator.java
  40. 48
    5
      Parser/src/main/java/org/openzen/zenscript/parser/member/ParsedSetter.java
  41. 1
    2
      Parser/src/main/java/org/openzen/zenscript/parser/member/ParsedStaticInitializer.java
  42. 28
    10
      Validator/src/main/java/org/openzen/zenscript/validator/visitors/DefinitionMemberValidator.java

+ 2
- 2
CodeFormatter/src/main/java/org/openzen/zenscript/formatter/MemberFormatter.java Parādīt failu

@@ -10,7 +10,7 @@ import org.openzen.zenscript.codemodel.member.CallerMember;
10 10
 import org.openzen.zenscript.codemodel.member.CasterMember;
11 11
 import org.openzen.zenscript.codemodel.member.ConstMember;
12 12
 import org.openzen.zenscript.codemodel.member.ConstructorMember;
13
-import org.openzen.zenscript.codemodel.member.CustomIteratorMember;
13
+import org.openzen.zenscript.codemodel.member.IteratorMember;
14 14
 import org.openzen.zenscript.codemodel.member.DestructorMember;
15 15
 import org.openzen.zenscript.codemodel.member.FieldMember;
16 16
 import org.openzen.zenscript.codemodel.member.GetterMember;
@@ -192,7 +192,7 @@ public class MemberFormatter implements MemberVisitor<Void> {
192 192
 	}
193 193
 
194 194
 	@Override
195
-	public Void visitCustomIterator(CustomIteratorMember member) {
195
+	public Void visitCustomIterator(IteratorMember member) {
196 196
 		visit(false);
197 197
 		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
198 198
 	}

+ 56
- 4
CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/AnnotationProcessor.java Parādīt failu

@@ -18,7 +18,7 @@ import org.openzen.zenscript.codemodel.member.CallerMember;
18 18
 import org.openzen.zenscript.codemodel.member.CasterMember;
19 19
 import org.openzen.zenscript.codemodel.member.ConstMember;
20 20
 import org.openzen.zenscript.codemodel.member.ConstructorMember;
21
-import org.openzen.zenscript.codemodel.member.CustomIteratorMember;
21
+import org.openzen.zenscript.codemodel.member.IteratorMember;
22 22
 import org.openzen.zenscript.codemodel.member.DestructorMember;
23 23
 import org.openzen.zenscript.codemodel.member.FieldMember;
24 24
 import org.openzen.zenscript.codemodel.member.FunctionalMember;
@@ -32,6 +32,8 @@ import org.openzen.zenscript.codemodel.member.OperatorMember;
32 32
 import org.openzen.zenscript.codemodel.member.SetterMember;
33 33
 import org.openzen.zenscript.codemodel.member.StaticInitializerMember;
34 34
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
35
+import org.openzen.zenscript.codemodel.member.ref.GetterMemberRef;
36
+import org.openzen.zenscript.codemodel.member.ref.SetterMemberRef;
35 37
 import org.openzen.zenscript.codemodel.scope.DefinitionScope;
36 38
 import org.openzen.zenscript.codemodel.scope.FileScope;
37 39
 import org.openzen.zenscript.codemodel.scope.FunctionScope;
@@ -130,12 +132,12 @@ public class AnnotationProcessor implements ModuleProcessor {
130 132
 
131 133
 		@Override
132 134
 		public Void visitGetter(GetterMember member) {
133
-			return functional(member);
135
+			return getter(member);
134 136
 		}
135 137
 
136 138
 		@Override
137 139
 		public Void visitSetter(SetterMember member) {
138
-			return functional(member);
140
+			return setter(member);
139 141
 		}
140 142
 
141 143
 		@Override
@@ -149,7 +151,7 @@ public class AnnotationProcessor implements ModuleProcessor {
149 151
 		}
150 152
 
151 153
 		@Override
152
-		public Void visitCustomIterator(CustomIteratorMember member) {
154
+		public Void visitCustomIterator(IteratorMember member) {
153 155
 			return functional(member);
154 156
 		}
155 157
 
@@ -199,6 +201,38 @@ public class AnnotationProcessor implements ModuleProcessor {
199 201
 			return null;
200 202
 		}
201 203
 		
204
+		private Void getter(GetterMember member) {
205
+			for (MemberAnnotation annotation : member.annotations)
206
+				annotation.apply(member, scope);
207
+			
208
+			if (member.getOverrides() != null) {
209
+				getter(member, member.getOverrides());
210
+			}
211
+			
212
+			if (member.body == null)
213
+				return null;
214
+			
215
+			StatementScope scope = new FunctionScope(this.scope, new FunctionHeader(member.type));
216
+			member.body = process(member.body, scope);
217
+			return null;
218
+		}
219
+		
220
+		private Void setter(SetterMember member) {
221
+			for (MemberAnnotation annotation : member.annotations)
222
+				annotation.apply(member, scope);
223
+			
224
+			if (member.getOverrides() != null) {
225
+				setter(member, member.getOverrides());
226
+			}
227
+			
228
+			if (member.body == null)
229
+				return null;
230
+			
231
+			StatementScope scope = new FunctionScope(this.scope, new FunctionHeader(BasicTypeID.VOID, member.parameter));
232
+			member.body = process(member.body, scope);
233
+			return null;
234
+		}
235
+		
202 236
 		private void functional(FunctionalMember member, DefinitionMemberRef overrides) {
203 237
 			for (MemberAnnotation annotation : overrides.getAnnotations())
204 238
 				annotation.applyOnOverridingMethod(member, scope);
@@ -207,5 +241,23 @@ public class AnnotationProcessor implements ModuleProcessor {
207 241
 				functional(member, overrides.getOverrides());
208 242
 			}
209 243
 		}
244
+		
245
+		private void getter(GetterMember member, GetterMemberRef overrides) {
246
+			for (MemberAnnotation annotation : overrides.getAnnotations())
247
+				annotation.applyOnOverridingGetter(member, scope);
248
+			
249
+			if (overrides.getOverrides() != null) {
250
+				getter(member, overrides.getOverrides());
251
+			}
252
+		}
253
+		
254
+		private void setter(SetterMember member, SetterMemberRef overrides) {
255
+			for (MemberAnnotation annotation : overrides.getAnnotations())
256
+				annotation.applyOnOverridingSetter(member, scope);
257
+			
258
+			if (overrides.getOverrides() != null) {
259
+				setter(member, overrides.getOverrides());
260
+			}
261
+		}
210 262
 	}
211 263
 }

+ 6
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/MemberAnnotation.java Parādīt failu

@@ -6,7 +6,9 @@
6 6
 package org.openzen.zenscript.codemodel.annotations;
7 7
 
8 8
 import org.openzen.zenscript.codemodel.member.FunctionalMember;
9
+import org.openzen.zenscript.codemodel.member.GetterMember;
9 10
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
11
+import org.openzen.zenscript.codemodel.member.SetterMember;
10 12
 import org.openzen.zenscript.codemodel.scope.BaseScope;
11 13
 
12 14
 /**
@@ -19,4 +21,8 @@ public interface MemberAnnotation {
19 21
 	public void apply(IDefinitionMember member, BaseScope scope);
20 22
 	
21 23
 	public void applyOnOverridingMethod(FunctionalMember member, BaseScope scope);
24
+	
25
+	public void applyOnOverridingGetter(GetterMember member, BaseScope scope);
26
+	
27
+	public void applyOnOverridingSetter(SetterMember member, BaseScope scope);
22 28
 }

+ 12
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/NativeMemberAnnotation.java Parādīt failu

@@ -6,7 +6,9 @@
6 6
 package org.openzen.zenscript.codemodel.annotations;
7 7
 
8 8
 import org.openzen.zenscript.codemodel.member.FunctionalMember;
9
+import org.openzen.zenscript.codemodel.member.GetterMember;
9 10
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
11
+import org.openzen.zenscript.codemodel.member.SetterMember;
10 12
 import org.openzen.zenscript.codemodel.scope.BaseScope;
11 13
 
12 14
 /**
@@ -29,4 +31,14 @@ public class NativeMemberAnnotation implements MemberAnnotation {
29 31
 	public void applyOnOverridingMethod(FunctionalMember member, BaseScope scope) {
30 32
 		// not inherited
31 33
 	}
34
+
35
+	@Override
36
+	public void applyOnOverridingGetter(GetterMember member, BaseScope scope) {
37
+		// not inherited
38
+	}
39
+
40
+	@Override
41
+	public void applyOnOverridingSetter(SetterMember member, BaseScope scope) {
42
+		// not inherited
43
+	}
32 44
 }

+ 30
- 7
CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/PreconditionForMethod.java Parādīt failu

@@ -12,7 +12,9 @@ import org.openzen.zenscript.codemodel.expression.Expression;
12 12
 import org.openzen.zenscript.codemodel.expression.ExpressionBuilder;
13 13
 import org.openzen.zenscript.codemodel.expression.PanicExpression;
14 14
 import org.openzen.zenscript.codemodel.member.FunctionalMember;
15
+import org.openzen.zenscript.codemodel.member.GetterMember;
15 16
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
17
+import org.openzen.zenscript.codemodel.member.SetterMember;
16 18
 import org.openzen.zenscript.codemodel.scope.BaseScope;
17 19
 import org.openzen.zenscript.codemodel.scope.ExpressionScope;
18 20
 import org.openzen.zenscript.codemodel.statement.BlockStatement;
@@ -44,13 +46,33 @@ public class PreconditionForMethod implements MemberAnnotation {
44 46
 
45 47
 	@Override
46 48
 	public void apply(IDefinitionMember member, BaseScope scope) {
47
-		applyOnOverridingMethod((FunctionalMember)member, scope);
49
+		if (member instanceof GetterMember) {
50
+			applyOnOverridingGetter((GetterMember)member, scope);
51
+		} else if (member instanceof SetterMember) {
52
+			applyOnOverridingSetter((SetterMember)member, scope);
53
+		} else if (member instanceof FunctionalMember) {
54
+			applyOnOverridingMethod((FunctionalMember)member, scope);
55
+		}
48 56
 	}
49 57
 
50 58
 	@Override
51 59
 	public void applyOnOverridingMethod(FunctionalMember member, BaseScope scope) {
52
-		if (member.body == null)
53
-			return;
60
+		member.body = applyOnOverride(member.body, scope);
61
+	}
62
+
63
+	@Override
64
+	public void applyOnOverridingGetter(GetterMember member, BaseScope scope) {
65
+		member.body = applyOnOverride(member.body, scope);
66
+	}
67
+
68
+	@Override
69
+	public void applyOnOverridingSetter(SetterMember member, BaseScope scope) {
70
+		member.body = applyOnOverride(member.body, scope);
71
+	}
72
+	
73
+	private Statement applyOnOverride(Statement body, BaseScope scope) {
74
+		if (body == null)
75
+			return body;
54 76
 		
55 77
 		ExpressionScope expressionScope = new ExpressionScope(scope, BasicTypeID.BOOL);
56 78
 		List<Statement> statements = new ArrayList<>();
@@ -58,11 +80,12 @@ public class PreconditionForMethod implements MemberAnnotation {
58 80
 		Expression inverseCondition = expressionBuilder.not(condition);
59 81
 		Statement throwStatement = new ExpressionStatement(position, new PanicExpression(position, BasicTypeID.VOID, message));
60 82
 		statements.add(new IfStatement(position, inverseCondition, throwStatement, null));
61
-		if (member.body instanceof BlockStatement) {
62
-			statements.addAll(((BlockStatement)member.body).statements);
83
+		
84
+		if (body instanceof BlockStatement) {
85
+			statements.addAll(((BlockStatement)body).statements);
63 86
 		} else {
64
-			statements.add(member.body);
87
+			statements.add(body);
65 88
 		}
66
-		member.body = new BlockStatement(position, statements);
89
+		return new BlockStatement(position, statements);
67 90
 	}
68 91
 }

+ 3
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/SetFieldExpression.java Parādīt failu

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.codemodel.expression;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.FunctionParameter;
9 10
 import org.openzen.zenscript.codemodel.member.ref.FieldMemberRef;
10 11
 import org.openzen.zenscript.codemodel.scope.TypeScope;
11 12
 
@@ -17,6 +18,7 @@ public class SetFieldExpression extends Expression {
17 18
 	public final Expression target;
18 19
 	public final FieldMemberRef field;
19 20
 	public final Expression value;
21
+	public final FunctionParameter parameter;
20 22
 	
21 23
 	public SetFieldExpression(CodePosition position, Expression target, FieldMemberRef field, Expression value) {
22 24
 		super(position, field.getType(), binaryThrow(position, target.thrownType, value.thrownType));
@@ -24,6 +26,7 @@ public class SetFieldExpression extends Expression {
24 26
 		this.target = target;
25 27
 		this.field = field;
26 28
 		this.value = value;
29
+		this.parameter = new FunctionParameter(type);
27 30
 	}
28 31
 
29 32
 	@Override

+ 0
- 26
CodeModel/src/main/java/org/openzen/zenscript/codemodel/iterator/ForeachIteratorVisitor.java Parādīt failu

@@ -1,26 +0,0 @@
1
-/*
2
- * To change this license header, choose License Headers in Project Properties.
3
- * To change this template file, choose Tools | Templates
4
- * and open the template in the editor.
5
- */
6
-package org.openzen.zenscript.codemodel.iterator;
7
-
8
-/**
9
- *
10
- * @author Hoofdgebruiker
11
- */
12
-public interface ForeachIteratorVisitor<T> {
13
-	T visitIntRange();
14
-	
15
-	T visitArrayValueIterator();
16
-	
17
-	T visitArrayKeyValueIterator();
18
-	
19
-	T visitAssocKeyIterator();
20
-	
21
-	T visitAssocKeyValueIterator();
22
-	
23
-	T visitStringCharacterIterator();
24
-	
25
-	T visitCustomIterator();
26
-}

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/FieldMember.java Parādīt failu

@@ -77,7 +77,7 @@ public class FieldMember extends PropertyMember {
77 77
 					position,
78 78
 					new ThisExpression(position, thisType),
79 79
 					new FieldMemberRef(this, null),
80
-					new GetFunctionParameterExpression(position, this.autoSetter.header.parameters[0]))));
80
+					new GetFunctionParameterExpression(position, this.autoSetter.parameter))));
81 81
 		} else {
82 82
 			this.autoSetter = null;
83 83
 		}

+ 15
- 18
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/GetterMember.java Parādīt failu

@@ -6,10 +6,13 @@
6 6
 package org.openzen.zenscript.codemodel.member;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zencode.shared.ConcatMap;
9 10
 import org.openzen.zenscript.codemodel.FunctionHeader;
10 11
 import org.openzen.zenscript.codemodel.GenericMapper;
11 12
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12 13
 import org.openzen.zenscript.codemodel.member.ref.GetterMemberRef;
14
+import org.openzen.zenscript.codemodel.scope.TypeScope;
15
+import org.openzen.zenscript.codemodel.statement.LoopStatement;
13 16
 import org.openzen.zenscript.codemodel.statement.Statement;
14 17
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
15 18
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
@@ -21,10 +24,10 @@ import org.openzen.zenscript.codemodel.type.member.TypeMemberPriority;
21 24
  *
22 25
  * @author Hoofdgebruiker
23 26
  */
24
-public class GetterMember extends FunctionalMember implements IPropertyMember {
27
+public class GetterMember extends PropertyMember {
25 28
 	public final String name;
26
-	public ITypeID type;
27 29
 	private GetterMemberRef overrides;
30
+	public Statement body = null;
28 31
 	
29 32
 	public GetterMember(
30 33
 			CodePosition position,
@@ -33,33 +36,21 @@ public class GetterMember extends FunctionalMember implements IPropertyMember {
33 36
 			String name,
34 37
 			ITypeID type,
35 38
 			BuiltinID builtin) {
36
-		super(position, definition, modifiers, new FunctionHeader(type), builtin);
39
+		super(position, definition, modifiers, type, builtin);
37 40
 		
38 41
 		this.name = name;
39
-		this.type = type;
40 42
 	}
41 43
 	
42
-	@Override
43 44
 	public void setBody(Statement body) {
44
-		super.setBody(body);
45
+		this.body = body;
45 46
 		
46 47
 		if (type == BasicTypeID.UNDETERMINED)
47 48
 			type = body.getReturnType();
48 49
 	}
49 50
 	
50 51
 	@Override
51
-	public ITypeID getType() {
52
-		return type;
53
-	}
54
-	
55
-	@Override
56
-	public String getCanonicalName() {
57
-		return definition.getFullName() + ":getter:" + name;
58
-	}
59
-	
60
-	@Override
61
-	public FunctionalKind getKind() {
62
-		return FunctionalKind.GETTER;
52
+	public boolean isAbstract() {
53
+		return body == null && builtin == null;
63 54
 	}
64 55
 	
65 56
 	@Override
@@ -81,6 +72,12 @@ public class GetterMember extends FunctionalMember implements IPropertyMember {
81 72
 	public GetterMemberRef getOverrides() {
82 73
 		return overrides;
83 74
 	}
75
+
76
+	@Override
77
+	public void normalize(TypeScope scope) {
78
+		if (body != null)
79
+			body = body.normalize(scope, ConcatMap.empty(LoopStatement.class, LoopStatement.class));
80
+	}
84 81
 	
85 82
 	public void setOverrides(GetterMemberRef override) {
86 83
 		this.overrides = override;

+ 0
- 21
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/IIteratorMember.java Parādīt failu

@@ -1,21 +0,0 @@
1
-/*
2
- * To change this license header, choose License Headers in Project Properties.
3
- * To change this template file, choose Tools | Templates
4
- * and open the template in the editor.
5
- */
6
-package org.openzen.zenscript.codemodel.member;
7
-
8
-import org.openzen.zenscript.codemodel.iterator.ForeachIteratorVisitor;
9
-import org.openzen.zenscript.codemodel.type.ITypeID;
10
-
11
-/**
12
- *
13
- * @author Hoofdgebruiker
14
- */
15
-public interface IIteratorMember extends IDefinitionMember {
16
-	public int getLoopVariableCount();
17
-	
18
-	public ITypeID[] getLoopVariableTypes();
19
-	
20
-	public <T> T acceptForIterator(ForeachIteratorVisitor<T> visitor);
21
-}

+ 0
- 23
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/IPropertyMember.java Parādīt failu

@@ -1,23 +0,0 @@
1
-/*
2
- * To change this license header, choose License Headers in Project Properties.
3
- * To change this template file, choose Tools | Templates
4
- * and open the template in the editor.
5
- */
6
-package org.openzen.zenscript.codemodel.member;
7
-
8
-import org.openzen.zenscript.codemodel.annotations.MemberAnnotation;
9
-import org.openzen.zenscript.codemodel.type.ITypeID;
10
-
11
-/**
12
- *
13
- * @author Hoofdgebruiker
14
- */
15
-public interface IPropertyMember extends IDefinitionMember {
16
-	ITypeID getType();
17
-	
18
-	boolean isStatic();
19
-	
20
-	boolean isFinal();
21
-	
22
-	MemberAnnotation[] getAnnotations();
23
-}

CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/CustomIteratorMember.java → CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/IteratorMember.java Parādīt failu

@@ -9,7 +9,6 @@ import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.FunctionHeader;
10 10
 import org.openzen.zenscript.codemodel.GenericMapper;
11 11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
-import org.openzen.zenscript.codemodel.iterator.ForeachIteratorVisitor;
13 12
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
14 13
 import org.openzen.zenscript.codemodel.member.ref.IteratorMemberRef;
15 14
 import org.openzen.zenscript.codemodel.statement.Statement;
@@ -23,12 +22,12 @@ import org.openzen.zenscript.codemodel.type.member.TypeMembers;
23 22
  *
24 23
  * @author Hoofdgebruiker
25 24
  */
26
-public class CustomIteratorMember extends FunctionalMember implements IIteratorMember {
25
+public class IteratorMember extends FunctionalMember {
27 26
 	private final ITypeID[] iteratorTypes;
28 27
 	public Statement body;
29 28
 	public IteratorMemberRef overrides;
30 29
 	
31
-	public CustomIteratorMember(CodePosition position, HighLevelDefinition definition, int modifiers, ITypeID[] iteratorTypes, GlobalTypeRegistry registry, BuiltinID builtin) {
30
+	public IteratorMember(CodePosition position, HighLevelDefinition definition, int modifiers, ITypeID[] iteratorTypes, GlobalTypeRegistry registry, BuiltinID builtin) {
32 31
 		super(position, definition, modifiers, createIteratorHeader(registry, iteratorTypes), builtin);
33 32
 		
34 33
 		this.iteratorTypes = iteratorTypes;
@@ -42,25 +41,18 @@ public class CustomIteratorMember extends FunctionalMember implements IIteratorM
42 41
 	public String getCanonicalName() {
43 42
 		return definition.getFullName() + ":iterator:" + iteratorTypes.length;
44 43
 	}
45
-
46
-	@Override
44
+	
47 45
 	public int getLoopVariableCount() {
48 46
 		return iteratorTypes.length;
49 47
 	}
50
-
51
-	@Override
48
+	
52 49
 	public ITypeID[] getLoopVariableTypes() {
53 50
 		return iteratorTypes;
54 51
 	}
55
-	
56
-	@Override
57
-	public BuiltinID getBuiltin() {
58
-		return null;
59
-	}
60 52
 
61 53
 	@Override
62 54
 	public void registerTo(TypeMembers type, TypeMemberPriority priority, GenericMapper mapper) {
63
-		type.addIterator(new IteratorMemberRef(this, mapper.map(iteratorTypes)), priority);
55
+		type.addIterator(new IteratorMemberRef(this, mapper == null ? iteratorTypes : mapper.map(iteratorTypes)), priority);
64 56
 	}
65 57
 
66 58
 	@Override
@@ -72,11 +64,6 @@ public class CustomIteratorMember extends FunctionalMember implements IIteratorM
72 64
 	public <T> T accept(MemberVisitor<T> visitor) {
73 65
 		return visitor.visitCustomIterator(this);
74 66
 	}
75
-
76
-	@Override
77
-	public <T> T acceptForIterator(ForeachIteratorVisitor<T> visitor) {
78
-		return visitor.visitCustomIterator();
79
-	}
80 67
 	
81 68
 	public void setOverrides(IteratorMemberRef overrides) {
82 69
 		this.overrides = overrides;

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/MemberVisitor.java Parādīt failu

@@ -28,7 +28,7 @@ public interface MemberVisitor<T> {
28 28
 	
29 29
 	public T visitCaster(CasterMember member);
30 30
 	
31
-	public T visitCustomIterator(CustomIteratorMember member);
31
+	public T visitCustomIterator(IteratorMember member);
32 32
 	
33 33
 	public T visitCaller(CallerMember member);
34 34
 	

+ 6
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/PropertyMember.java Parādīt failu

@@ -14,7 +14,7 @@ import org.openzen.zenscript.codemodel.type.member.BuiltinID;
14 14
  *
15 15
  * @author Hoofdgebruiker
16 16
  */
17
-public abstract class PropertyMember extends DefinitionMember implements IPropertyMember {
17
+public abstract class PropertyMember extends DefinitionMember {
18 18
 	public ITypeID type;
19 19
 	public final BuiltinID builtin;
20 20
 	
@@ -25,8 +25,12 @@ public abstract class PropertyMember extends DefinitionMember implements IProper
25 25
 		this.builtin = builtin;
26 26
 	}
27 27
 	
28
-	@Override
29 28
 	public ITypeID getType() {
30 29
 		return type;
31 30
 	}
31
+	
32
+	@Override
33
+	public BuiltinID getBuiltin() {
34
+		return builtin;
35
+	}
32 36
 }

+ 13
- 17
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/SetterMember.java Parādīt failu

@@ -14,6 +14,7 @@ import org.openzen.zenscript.codemodel.HighLevelDefinition;
14 14
 import org.openzen.zenscript.codemodel.member.ref.SetterMemberRef;
15 15
 import org.openzen.zenscript.codemodel.scope.TypeScope;
16 16
 import org.openzen.zenscript.codemodel.statement.LoopStatement;
17
+import org.openzen.zenscript.codemodel.statement.Statement;
17 18
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
18 19
 import org.openzen.zenscript.codemodel.type.ITypeID;
19 20
 import org.openzen.zenscript.codemodel.type.member.BuiltinID;
@@ -24,10 +25,11 @@ import org.openzen.zenscript.codemodel.type.member.TypeMembers;
24 25
  *
25 26
  * @author Hoofdgebruiker
26 27
  */
27
-public class SetterMember extends FunctionalMember implements IPropertyMember {
28
-	public ITypeID type;
28
+public class SetterMember extends PropertyMember {
29 29
 	public final String name;
30 30
 	private SetterMemberRef overrides;
31
+	public Statement body;
32
+	public final FunctionParameter parameter;
31 33
 	
32 34
 	public SetterMember(
33 35
 			CodePosition position,
@@ -40,26 +42,15 @@ public class SetterMember extends FunctionalMember implements IPropertyMember {
40 42
 		super(position,
41 43
 				definition,
42 44
 				modifiers,
43
-				new FunctionHeader(BasicTypeID.VOID, new FunctionParameter(type, "$")),
45
+				type,
44 46
 				builtin);
45 47
 		
46
-		this.type = type;
47 48
 		this.name = name;
49
+		this.parameter = new FunctionParameter(type, "value");
48 50
 	}
49 51
 	
50
-	@Override
51
-	public ITypeID getType() {
52
-		return type;
53
-	}
54
-	
55
-	@Override
56
-	public String getCanonicalName() {
57
-		return definition.getFullName() + ":setter:" + name;
58
-	}
59
-
60
-	@Override
61
-	public FunctionalKind getKind() {
62
-		return FunctionalKind.SETTER;
52
+	public void setBody(Statement body) {
53
+		this.body = body;
63 54
 	}
64 55
 
65 56
 	@Override
@@ -88,6 +79,11 @@ public class SetterMember extends FunctionalMember implements IPropertyMember {
88 79
 			body = body.normalize(scope, ConcatMap.empty(LoopStatement.class, LoopStatement.class));
89 80
 	}
90 81
 	
82
+	@Override
83
+	public boolean isAbstract() {
84
+		return body == null && builtin == null;
85
+	}
86
+	
91 87
 	public void setOverrides(SetterMemberRef overrides) {
92 88
 		this.overrides = overrides;
93 89
 		

+ 4
- 11
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/StaticInitializerMember.java Parādīt failu

@@ -7,8 +7,8 @@ package org.openzen.zenscript.codemodel.member;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zencode.shared.ConcatMap;
10
-import org.openzen.zencode.shared.Taggable;
11 10
 import org.openzen.zenscript.codemodel.GenericMapper;
11
+import org.openzen.zenscript.codemodel.HighLevelDefinition;
12 12
 import org.openzen.zenscript.codemodel.annotations.MemberAnnotation;
13 13
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
14 14
 import org.openzen.zenscript.codemodel.scope.TypeScope;
@@ -22,18 +22,11 @@ import org.openzen.zenscript.codemodel.type.member.TypeMembers;
22 22
  *
23 23
  * @author Hoofdgebruiker
24 24
  */
25
-public class StaticInitializerMember extends Taggable implements IDefinitionMember {
26
-	public final CodePosition position;
25
+public class StaticInitializerMember extends DefinitionMember {
27 26
 	public Statement body;
28
-	public MemberAnnotation[] annotations = MemberAnnotation.NONE;
29 27
 	
30
-	public StaticInitializerMember(CodePosition position) {
31
-		this.position = position;
32
-	}
33
-	
34
-	@Override
35
-	public CodePosition getPosition() {
36
-		return position;
28
+	public StaticInitializerMember(CodePosition position, HighLevelDefinition definition) {
29
+		super(position, definition, 0);
37 30
 	}
38 31
 	
39 32
 	@Override

+ 0
- 95
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/builtin/ArrayIteratorKeyValues.java Parādīt failu

@@ -1,95 +0,0 @@
1
-/*
2
- * To change this license header, choose License Headers in Project Properties.
3
- * To change this template file, choose Tools | Templates
4
- * and open the template in the editor.
5
- */
6
-package org.openzen.zenscript.codemodel.member.builtin;
7
-
8
-import org.openzen.zencode.shared.CodePosition;
9
-import org.openzen.zencode.shared.Taggable;
10
-import org.openzen.zenscript.codemodel.GenericMapper;
11
-import org.openzen.zenscript.codemodel.iterator.ForeachIteratorVisitor;
12
-import org.openzen.zenscript.codemodel.member.IIteratorMember;
13
-import org.openzen.zenscript.codemodel.member.MemberVisitor;
14
-import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
15
-import org.openzen.zenscript.codemodel.member.ref.IteratorMemberRef;
16
-import org.openzen.zenscript.codemodel.scope.TypeScope;
17
-import org.openzen.zenscript.codemodel.type.ArrayTypeID;
18
-import org.openzen.zenscript.codemodel.type.BasicTypeID;
19
-import org.openzen.zenscript.codemodel.type.ITypeID;
20
-import org.openzen.zenscript.codemodel.type.member.BuiltinID;
21
-import org.openzen.zenscript.codemodel.type.member.TypeMemberPriority;
22
-import org.openzen.zenscript.codemodel.type.member.TypeMembers;
23
-
24
-/**
25
- *
26
- * @author Hoofdgebruiker
27
- */
28
-public class ArrayIteratorKeyValues extends Taggable implements IIteratorMember {
29
-	private ArrayTypeID type;
30
-	private final ITypeID[] loopVariableTypes;
31
-	
32
-	public ArrayIteratorKeyValues(ArrayTypeID type) {
33
-		this.type = type;
34
-		
35
-		loopVariableTypes = new ITypeID[type.dimension + 1];
36
-		for (int i = 0; i < type.dimension; i++)
37
-			loopVariableTypes[i] = BasicTypeID.INT;
38
-		loopVariableTypes[type.dimension] = type.elementType;
39
-	}
40
-	
41
-	@Override
42
-	public CodePosition getPosition() {
43
-		return CodePosition.BUILTIN;
44
-	}
45
-	
46
-	@Override
47
-	public BuiltinID getBuiltin() {
48
-		return null;
49
-	}
50
-
51
-	@Override
52
-	public int getLoopVariableCount() {
53
-		return loopVariableTypes.length;
54
-	}
55
-
56
-	@Override
57
-	public ITypeID[] getLoopVariableTypes() {
58
-		return loopVariableTypes;
59
-	}
60
-
61
-	@Override
62
-	public String describe() {
63
-		return "iterator for array elements with index";
64
-	}
65
-
66
-	@Override
67
-	public void registerTo(TypeMembers members, TypeMemberPriority priority, GenericMapper mapper) {
68
-		members.addIterator(new IteratorMemberRef(this, mapper == null ? loopVariableTypes : mapper.map(loopVariableTypes)), priority);
69
-	}
70
-
71
-	@Override
72
-	public <T> T accept(MemberVisitor<T> visitor) {
73
-		throw new UnsupportedOperationException("Not a compilable member");
74
-	}
75
-
76
-	@Override
77
-	public <T> T acceptForIterator(ForeachIteratorVisitor<T> visitor) {
78
-		return visitor.visitArrayKeyValueIterator();
79
-	}
80
-
81
-	@Override
82
-	public DefinitionMemberRef getOverrides() {
83
-		return null;
84
-	}
85
-
86
-	@Override
87
-	public void normalize(TypeScope scope) {
88
-		
89
-	}
90
-
91
-	@Override
92
-	public boolean isAbstract() {
93
-		return false;
94
-	}
95
-}

+ 0
- 90
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/builtin/ArrayIteratorValues.java Parādīt failu

@@ -1,90 +0,0 @@
1
-/*
2
- * To change this license header, choose License Headers in Project Properties.
3
- * To change this template file, choose Tools | Templates
4
- * and open the template in the editor.
5
- */
6
-package org.openzen.zenscript.codemodel.member.builtin;
7
-
8
-import org.openzen.zencode.shared.CodePosition;
9
-import org.openzen.zencode.shared.Taggable;
10
-import org.openzen.zenscript.codemodel.GenericMapper;
11
-import org.openzen.zenscript.codemodel.iterator.ForeachIteratorVisitor;
12
-import org.openzen.zenscript.codemodel.member.IIteratorMember;
13
-import org.openzen.zenscript.codemodel.member.MemberVisitor;
14
-import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
15
-import org.openzen.zenscript.codemodel.member.ref.IteratorMemberRef;
16
-import org.openzen.zenscript.codemodel.scope.TypeScope;
17
-import org.openzen.zenscript.codemodel.type.ArrayTypeID;
18
-import org.openzen.zenscript.codemodel.type.ITypeID;
19
-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.TypeMembers;
22
-
23
-/**
24
- *
25
- * @author Hoofdgebruiker
26
- */
27
-public class ArrayIteratorValues extends Taggable implements IIteratorMember {
28
-	private final ArrayTypeID type;
29
-	private final ITypeID[] loopVariableTypes;
30
-	
31
-	public ArrayIteratorValues(ArrayTypeID type) {
32
-		this.type = type;
33
-		loopVariableTypes = new ITypeID[] { type.elementType };
34
-	}
35
-	
36
-	@Override
37
-	public CodePosition getPosition() {
38
-		return CodePosition.BUILTIN;
39
-	}
40
-	
41
-	@Override
42
-	public BuiltinID getBuiltin() {
43
-		return null;
44
-	}
45
-
46
-	@Override
47
-	public int getLoopVariableCount() {
48
-		return 1;
49
-	}
50
-
51
-	@Override
52
-	public ITypeID[] getLoopVariableTypes() {
53
-		return loopVariableTypes;
54
-	}
55
-
56
-	@Override
57
-	public String describe() {
58
-		return "iterator for array values";
59
-	}
60
-
61
-	@Override
62
-	public void registerTo(TypeMembers members, TypeMemberPriority priority, GenericMapper mapper) {
63
-		members.addIterator(new IteratorMemberRef(this, mapper == null ? loopVariableTypes : mapper.map(loopVariableTypes)), priority);
64
-	}
65
-
66
-	@Override
67
-	public <T> T accept(MemberVisitor<T> visitor) {
68
-		throw new UnsupportedOperationException("Not a compilable member");
69
-	}
70
-
71
-	@Override
72
-	public <T> T acceptForIterator(ForeachIteratorVisitor<T> visitor) {
73
-		return visitor.visitArrayValueIterator();
74
-	}
75
-
76
-	@Override
77
-	public DefinitionMemberRef getOverrides() {
78
-		return null;
79
-	}
80
-
81
-	@Override
82
-	public void normalize(TypeScope scope) {
83
-		
84
-	}
85
-
86
-	@Override
87
-	public boolean isAbstract() {
88
-		return false;
89
-	}
90
-}

+ 0
- 93
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/builtin/AssocIterator.java Parādīt failu

@@ -1,93 +0,0 @@
1
-/*
2
- * To change this license header, choose License Headers in Project Properties.
3
- * To change this template file, choose Tools | Templates
4
- * and open the template in the editor.
5
- */
6
-package org.openzen.zenscript.codemodel.member.builtin;
7
-
8
-import org.openzen.zencode.shared.CodePosition;
9
-import org.openzen.zencode.shared.Taggable;
10
-import org.openzen.zenscript.codemodel.GenericMapper;
11
-import org.openzen.zenscript.codemodel.iterator.ForeachIteratorVisitor;
12
-import org.openzen.zenscript.codemodel.member.IIteratorMember;
13
-import org.openzen.zenscript.codemodel.member.MemberVisitor;
14
-import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
15
-import org.openzen.zenscript.codemodel.member.ref.IteratorMemberRef;
16
-import org.openzen.zenscript.codemodel.scope.TypeScope;
17
-import org.openzen.zenscript.codemodel.type.AssocTypeID;
18
-import org.openzen.zenscript.codemodel.type.ITypeID;
19
-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.TypeMembers;
22
-
23
-/**
24
- *
25
- * @author Hoofdgebruiker
26
- */
27
-public class AssocIterator extends Taggable implements IIteratorMember {
28
-	private final AssocTypeID type;
29
-	private final ITypeID[] loopVariableTypes;
30
-	
31
-	public AssocIterator(AssocTypeID type) {
32
-		this.type = type;
33
-		
34
-		loopVariableTypes = new ITypeID[2];
35
-		loopVariableTypes[0] = type.keyType;
36
-		loopVariableTypes[1] = type.valueType;
37
-	}
38
-	
39
-	@Override
40
-	public CodePosition getPosition() {
41
-		return CodePosition.BUILTIN;
42
-	}
43
-	
44
-	@Override
45
-	public BuiltinID getBuiltin() {
46
-		return null;
47
-	}
48
-
49
-	@Override
50
-	public int getLoopVariableCount() {
51
-		return loopVariableTypes.length;
52
-	}
53
-
54
-	@Override
55
-	public ITypeID[] getLoopVariableTypes() {
56
-		return loopVariableTypes;
57
-	}
58
-
59
-	@Override
60
-	public String describe() {
61
-		return "iterator for key/value pairs in an associative array";
62
-	}
63
-
64
-	@Override
65
-	public void registerTo(TypeMembers type, TypeMemberPriority priority, GenericMapper mapper) {
66
-		type.addIterator(new IteratorMemberRef(this, mapper == null ? loopVariableTypes : mapper.map(loopVariableTypes)), priority);
67
-	}
68
-
69
-	@Override
70
-	public <T> T accept(MemberVisitor<T> visitor) {
71
-		throw new UnsupportedOperationException("Not a compilable member");
72
-	}
73
-
74
-	@Override
75
-	public <T> T acceptForIterator(ForeachIteratorVisitor<T> visitor) {
76
-		return visitor.visitAssocKeyValueIterator();
77
-	}
78
-
79
-	@Override
80
-	public DefinitionMemberRef getOverrides() {
81
-		return null;
82
-	}
83
-
84
-	@Override
85
-	public void normalize(TypeScope scope) {
86
-		
87
-	}
88
-
89
-	@Override
90
-	public boolean isAbstract() {
91
-		return false;
92
-	}
93
-}

+ 0
- 101
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/builtin/RangeIterator.java Parādīt failu

@@ -1,101 +0,0 @@
1
-/*
2
- * To change this license header, choose License Headers in Project Properties.
3
- * To change this template file, choose Tools | Templates
4
- * and open the template in the editor.
5
- */
6
-package org.openzen.zenscript.codemodel.member.builtin;
7
-
8
-import org.openzen.zencode.shared.CodePosition;
9
-import org.openzen.zencode.shared.Taggable;
10
-import org.openzen.zenscript.codemodel.GenericMapper;
11
-import org.openzen.zenscript.codemodel.iterator.ForeachIteratorVisitor;
12
-import org.openzen.zenscript.codemodel.member.IIteratorMember;
13
-import org.openzen.zenscript.codemodel.member.MemberVisitor;
14
-import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
15
-import org.openzen.zenscript.codemodel.member.ref.IteratorMemberRef;
16
-import org.openzen.zenscript.codemodel.scope.TypeScope;
17
-import org.openzen.zenscript.codemodel.type.BasicTypeID;
18
-import org.openzen.zenscript.codemodel.type.ITypeID;
19
-import org.openzen.zenscript.codemodel.type.RangeTypeID;
20
-import org.openzen.zenscript.codemodel.type.member.BuiltinID;
21
-import org.openzen.zenscript.codemodel.type.member.TypeMemberPriority;
22
-import org.openzen.zenscript.codemodel.type.member.TypeMembers;
23
-
24
-/**
25
- *
26
- * @author Hoofdgebruiker
27
- */
28
-public class RangeIterator extends Taggable implements IIteratorMember {
29
-	private final ITypeID[] loopVariableTypes;
30
-	
31
-	public RangeIterator(RangeTypeID type) {
32
-		if (type.from != type.to)
33
-			throw new UnsupportedOperationException("Cannot iterator over a range with different from and to types");
34
-		if (type.from != BasicTypeID.BYTE
35
-				&& type.from != BasicTypeID.SBYTE
36
-				&& type.from != BasicTypeID.SHORT
37
-				&& type.from != BasicTypeID.USHORT
38
-				&& type.from != BasicTypeID.INT
39
-				&& type.from != BasicTypeID.UINT
40
-				&& type.from != BasicTypeID.LONG
41
-				&& type.from != BasicTypeID.ULONG)
42
-			throw new UnsupportedOperationException("Can only use range iterator over integer types");
43
-		
44
-		loopVariableTypes = new ITypeID[] { type.from };
45
-	}
46
-	
47
-	@Override
48
-	public CodePosition getPosition() {
49
-		return CodePosition.BUILTIN;
50
-	}
51
-	
52
-	@Override
53
-	public BuiltinID getBuiltin() {
54
-		return null;
55
-	}
56
-
57
-	@Override
58
-	public int getLoopVariableCount() {
59
-		return 1;
60
-	}
61
-
62
-	@Override
63
-	public ITypeID[] getLoopVariableTypes() {
64
-		return loopVariableTypes;
65
-	}
66
-
67
-	@Override
68
-	public String describe() {
69
-		return "range iterator";
70
-	}
71
-
72
-	@Override
73
-	public void registerTo(TypeMembers type, TypeMemberPriority priority, GenericMapper mapper) {
74
-		type.addIterator(new IteratorMemberRef(this, mapper == null ? loopVariableTypes : mapper.map(loopVariableTypes)), priority);
75
-	}
76
-
77
-	@Override
78
-	public <T> T accept(MemberVisitor<T> visitor) {
79
-		throw new UnsupportedOperationException("Not a compilable member");
80
-	}
81
-
82
-	@Override
83
-	public <T> T acceptForIterator(ForeachIteratorVisitor<T> visitor) {
84
-		return visitor.visitIntRange();
85
-	}
86
-
87
-	@Override
88
-	public DefinitionMemberRef getOverrides() {
89
-		return null;
90
-	}
91
-
92
-	@Override
93
-	public void normalize(TypeScope scope) {
94
-		
95
-	}
96
-
97
-	@Override
98
-	public boolean isAbstract() {
99
-		return false;
100
-	}
101
-}

+ 0
- 84
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/builtin/StringCharIterator.java Parādīt failu

@@ -1,84 +0,0 @@
1
-/*
2
- * To change this license header, choose License Headers in Project Properties.
3
- * To change this template file, choose Tools | Templates
4
- * and open the template in the editor.
5
- */
6
-package org.openzen.zenscript.codemodel.member.builtin;
7
-
8
-import org.openzen.zencode.shared.CodePosition;
9
-import org.openzen.zencode.shared.Taggable;
10
-import org.openzen.zenscript.codemodel.GenericMapper;
11
-import org.openzen.zenscript.codemodel.iterator.ForeachIteratorVisitor;
12
-import org.openzen.zenscript.codemodel.member.IIteratorMember;
13
-import org.openzen.zenscript.codemodel.member.MemberVisitor;
14
-import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
15
-import org.openzen.zenscript.codemodel.member.ref.IteratorMemberRef;
16
-import org.openzen.zenscript.codemodel.scope.TypeScope;
17
-import org.openzen.zenscript.codemodel.type.BasicTypeID;
18
-import org.openzen.zenscript.codemodel.type.ITypeID;
19
-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.TypeMembers;
22
-
23
-/**
24
- *
25
- * @author Hoofdgebruiker
26
- */
27
-public class StringCharIterator extends Taggable implements IIteratorMember {
28
-	private static final ITypeID[] TYPES = new ITypeID[] { BasicTypeID.CHAR };
29
-
30
-	@Override
31
-	public int getLoopVariableCount() {
32
-		return 1;
33
-	}
34
-	
35
-	@Override
36
-	public BuiltinID getBuiltin() {
37
-		return null;
38
-	}
39
-
40
-	@Override
41
-	public ITypeID[] getLoopVariableTypes() {
42
-		return TYPES;
43
-	}
44
-
45
-	@Override
46
-	public <T> T acceptForIterator(ForeachIteratorVisitor<T> visitor) {
47
-		return visitor.visitStringCharacterIterator();
48
-	}
49
-
50
-	@Override
51
-	public CodePosition getPosition() {
52
-		return CodePosition.BUILTIN;
53
-	}
54
-
55
-	@Override
56
-	public String describe() {
57
-		return "string character iterator";
58
-	}
59
-
60
-	@Override
61
-	public void registerTo(TypeMembers type, TypeMemberPriority priority, GenericMapper mapper) {
62
-		type.addIterator(new IteratorMemberRef(this, TYPES), priority);
63
-	}
64
-
65
-	@Override
66
-	public <T> T accept(MemberVisitor<T> visitor) {
67
-		throw new UnsupportedOperationException("Not a compilable member");
68
-	}
69
-
70
-	@Override
71
-	public DefinitionMemberRef getOverrides() {
72
-		return null;
73
-	}
74
-
75
-	@Override
76
-	public void normalize(TypeScope scope) {
77
-		
78
-	}
79
-
80
-	@Override
81
-	public boolean isAbstract() {
82
-		return false;
83
-	}
84
-}

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/GetterMemberRef.java Parādīt failu

@@ -34,7 +34,7 @@ public class GetterMemberRef extends PropertyRef {
34 34
 	}
35 35
 
36 36
 	@Override
37
-	public DefinitionMemberRef getOverrides() {
37
+	public GetterMemberRef getOverrides() {
38 38
 		return member.getOverrides();
39 39
 	}
40 40
 }

+ 5
- 6
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/IteratorMemberRef.java Parādīt failu

@@ -8,9 +8,8 @@ package org.openzen.zenscript.codemodel.member.ref;
8 8
 import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.FunctionHeader;
10 10
 import org.openzen.zenscript.codemodel.annotations.MemberAnnotation;
11
-import org.openzen.zenscript.codemodel.member.CustomIteratorMember;
11
+import org.openzen.zenscript.codemodel.member.IteratorMember;
12 12
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
13
-import org.openzen.zenscript.codemodel.member.IIteratorMember;
14 13
 import org.openzen.zenscript.codemodel.type.ITypeID;
15 14
 
16 15
 /**
@@ -18,10 +17,10 @@ import org.openzen.zenscript.codemodel.type.ITypeID;
18 17
  * @author Hoofdgebruiker
19 18
  */
20 19
 public class IteratorMemberRef implements DefinitionMemberRef {
21
-	public final IIteratorMember target;
20
+	public final IteratorMember target;
22 21
 	public final ITypeID[] types;
23 22
 	
24
-	public IteratorMemberRef(IIteratorMember target, ITypeID... types) {
23
+	public IteratorMemberRef(IteratorMember target, ITypeID... types) {
25 24
 		this.target = target;
26 25
 		this.types = types;
27 26
 	}
@@ -57,8 +56,8 @@ public class IteratorMemberRef implements DefinitionMemberRef {
57 56
 
58 57
 	@Override
59 58
 	public MemberAnnotation[] getAnnotations() {
60
-		if (target instanceof CustomIteratorMember) {
61
-			return ((CustomIteratorMember)target).annotations;
59
+		if (target instanceof IteratorMember) {
60
+			return ((IteratorMember)target).annotations;
62 61
 		} else {
63 62
 			return null;
64 63
 		}

+ 3
- 3
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/PropertyRef.java Parādīt failu

@@ -10,7 +10,7 @@ import org.openzen.zenscript.codemodel.FunctionHeader;
10 10
 import org.openzen.zenscript.codemodel.GenericMapper;
11 11
 import org.openzen.zenscript.codemodel.annotations.MemberAnnotation;
12 12
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
13
-import org.openzen.zenscript.codemodel.member.IPropertyMember;
13
+import org.openzen.zenscript.codemodel.member.PropertyMember;
14 14
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
15 15
 import org.openzen.zenscript.codemodel.type.ITypeID;
16 16
 
@@ -19,12 +19,12 @@ import org.openzen.zenscript.codemodel.type.ITypeID;
19 19
  * @author Hoofdgebruiker
20 20
  */
21 21
 public abstract class PropertyRef implements DefinitionMemberRef {
22
-	private final IPropertyMember member;
22
+	private final PropertyMember member;
23 23
 	
24 24
 	private ITypeID type;
25 25
 	private GenericMapper mapper;
26 26
 	
27
-	public PropertyRef(IPropertyMember member, GenericMapper mapper) {
27
+	public PropertyRef(PropertyMember member, GenericMapper mapper) {
28 28
 		this.member = member;
29 29
 		
30 30
 		if (member.getType() == BasicTypeID.UNDETERMINED) {

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/SetterMemberRef.java Parādīt failu

@@ -22,7 +22,7 @@ public class SetterMemberRef extends PropertyRef {
22 22
 	}
23 23
 
24 24
 	@Override
25
-	public DefinitionMemberRef getOverrides() {
25
+	public SetterMemberRef getOverrides() {
26 26
 		return member.getOverrides();
27 27
 	}
28 28
 }

+ 8
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/member/BuiltinID.java Parādīt failu

@@ -444,5 +444,12 @@ public enum BuiltinID {
444 444
 	
445 445
 	OPTIONAL_IS_NULL,
446 446
 	OPTIONAL_IS_NOT_NULL,
447
-	AUTOOP_NOTEQUALS
447
+	AUTOOP_NOTEQUALS,
448
+	
449
+	ITERATOR_INT_RANGE,
450
+	ITERATOR_ARRAY_VALUES,
451
+	ITERATOR_ARRAY_KEY_VALUES,
452
+	ITERATOR_ASSOC_KEYS,
453
+	ITERATOR_ASSOC_KEY_VALUES,
454
+	ITERATOR_STRING_CHARS
448 455
 }

+ 15
- 11
CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/member/TypeMemberBuilder.java Parādīt failu

@@ -47,11 +47,6 @@ import org.openzen.zenscript.codemodel.member.GetterMember;
47 47
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
48 48
 import org.openzen.zenscript.codemodel.member.MethodMember;
49 49
 import org.openzen.zenscript.codemodel.member.OperatorMember;
50
-import org.openzen.zenscript.codemodel.member.builtin.ArrayIteratorKeyValues;
51
-import org.openzen.zenscript.codemodel.member.builtin.ArrayIteratorValues;
52
-import org.openzen.zenscript.codemodel.member.builtin.AssocIterator;
53
-import org.openzen.zenscript.codemodel.member.builtin.RangeIterator;
54
-import org.openzen.zenscript.codemodel.member.builtin.StringCharIterator;
55 50
 import org.openzen.zenscript.codemodel.member.ref.CasterMemberRef;
56 51
 import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
57 52
 import org.openzen.zenscript.codemodel.member.ref.TranslatedOperatorMemberRef;
@@ -74,6 +69,7 @@ import static org.openzen.zencode.shared.CodePosition.BUILTIN;
74 69
 import org.openzen.zencode.shared.CompileException;
75 70
 import org.openzen.zencode.shared.CompileExceptionCode;
76 71
 import org.openzen.zenscript.codemodel.definition.InterfaceDefinition;
72
+import org.openzen.zenscript.codemodel.member.IteratorMember;
77 73
 
78 74
 /**
79 75
  *
@@ -286,8 +282,8 @@ public class TypeMemberBuilder implements ITypeVisitor<Void> {
286 282
 
287 283
 		getter(definition, ARRAY_ISEMPTY, "isEmpty", BOOL);
288 284
 		getter(definition, ARRAY_HASHCODE, "objectHashCode", INT);
289
-		new ArrayIteratorKeyValues(array).registerTo(members, TypeMemberPriority.SPECIFIED, null);
290
-		new ArrayIteratorValues(array).registerTo(members, TypeMemberPriority.SPECIFIED, null);
285
+		iterator(definition, ITERATOR_ARRAY_VALUES, baseType);
286
+		iterator(definition, ITERATOR_ARRAY_KEY_VALUES, INT, baseType);
291 287
 		
292 288
 		equals(definition, ARRAY_EQUALS, array);
293 289
 		notequals(definition, ARRAY_NOTEQUALS, array);
@@ -324,7 +320,8 @@ public class TypeMemberBuilder implements ITypeVisitor<Void> {
324 320
 		getter(builtin, BuiltinID.ASSOC_VALUES, "values", cache.getRegistry().getArray(valueType, 1));
325 321
 		getter(builtin, BuiltinID.ASSOC_HASHCODE, "objectHashCode", BasicTypeID.INT);
326 322
 		
327
-		new AssocIterator(assoc).registerTo(members, TypeMemberPriority.SPECIFIED, null);
323
+		iterator(builtin, ITERATOR_ASSOC_KEYS, keyType);
324
+		iterator(builtin, ITERATOR_ASSOC_KEY_VALUES, keyType, valueType);
328 325
 		
329 326
 		equals(builtin, BuiltinID.ASSOC_EQUALS, assoc);
330 327
 		notequals(builtin, BuiltinID.ASSOC_NOTEQUALS, assoc);
@@ -499,7 +496,8 @@ public class TypeMemberBuilder implements ITypeVisitor<Void> {
499 496
 		ClassDefinition definition = new ClassDefinition(BUILTIN, null, "", Modifiers.EXPORT);
500 497
 		getter(definition, RANGE_FROM, "from", fromType);
501 498
 		getter(definition, RANGE_TO, "to", toType);
502
-		if (range.from == range.to && (range.from == BasicTypeID.BYTE
499
+		if (range.from == range.to && (
500
+				   range.from == BYTE
503 501
 				|| range.from == SBYTE
504 502
 				|| range.from == SHORT
505 503
 				|| range.from == USHORT
@@ -507,7 +505,8 @@ public class TypeMemberBuilder implements ITypeVisitor<Void> {
507 505
 				|| range.from == UINT
508 506
 				|| range.from == LONG
509 507
 				|| range.from == ULONG)) {
510
-			new RangeIterator(range).registerTo(members, TypeMemberPriority.SPECIFIED, null);
508
+			
509
+			iterator(definition, ITERATOR_INT_RANGE, range.from);
511 510
 		}
512 511
 		
513 512
 		processType(definition, range);
@@ -1116,7 +1115,7 @@ public class TypeMemberBuilder implements ITypeVisitor<Void> {
1116 1115
 		method(builtin, STRING_TO_LOWER_CASE, "toLowerCase", STRING);
1117 1116
 		method(builtin, STRING_TO_UPPER_CASE, "toUpperCase", STRING);
1118 1117
 		
1119
-		new StringCharIterator().registerTo(members, TypeMemberPriority.SPECIFIED, null);
1118
+		iterator(builtin, ITERATOR_STRING_CHARS, CHAR);
1120 1119
 		
1121 1120
 		processType(builtin, STRING);
1122 1121
 	}
@@ -1557,4 +1556,9 @@ public class TypeMemberBuilder implements ITypeVisitor<Void> {
1557 1556
 				new FunctionHeader(BOOL, new FunctionParameter(type)),
1558 1557
 				id).registerTo(members, TypeMemberPriority.SPECIFIED, null);
1559 1558
 	}
1559
+	
1560
+	private void iterator(HighLevelDefinition cls, BuiltinID builtin, ITypeID... types) {
1561
+		new IteratorMember(BUILTIN, cls, Modifiers.PUBLIC, types, registry, builtin)
1562
+				.registerTo(members, TypeMemberPriority.SPECIFIED, null);
1563
+	}
1560 1564
 }

JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaForeachVisitor.java → JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaForeachWriter.java Parādīt failu

@@ -1,12 +1,11 @@
1 1
 package org.openzen.zenscript.javabytecode.compiler;
2 2
 
3 3
 import org.objectweb.asm.Label;
4
-import org.openzen.zenscript.codemodel.iterator.ForeachIteratorVisitor;
5 4
 import org.openzen.zenscript.codemodel.statement.Statement;
6 5
 import org.openzen.zenscript.codemodel.statement.VarStatement;
7 6
 import org.openzen.zenscript.javabytecode.JavaLocalVariableInfo;
8 7
 
9
-public class JavaForeachVisitor implements ForeachIteratorVisitor<Void> {
8
+public class JavaForeachWriter {
10 9
 
11 10
 	private final JavaWriter javaWriter;
12 11
 	private final VarStatement[] variables;
@@ -15,7 +14,7 @@ public class JavaForeachVisitor implements ForeachIteratorVisitor<Void> {
15 14
 	private final Label endLabel;
16 15
 	private final JavaStatementVisitor statementVisitor;
17 16
 
18
-	public JavaForeachVisitor(JavaStatementVisitor statementVisitor, VarStatement[] variables, Statement content, Label start, Label end) {
17
+	public JavaForeachWriter(JavaStatementVisitor statementVisitor, VarStatement[] variables, Statement content, Label start, Label end) {
19 18
 		this.statementVisitor = statementVisitor;
20 19
 		this.javaWriter = statementVisitor.getJavaWriter();
21 20
 		this.variables = variables;
@@ -23,9 +22,8 @@ public class JavaForeachVisitor implements ForeachIteratorVisitor<Void> {
23 22
 		this.startLabel = start;
24 23
 		this.endLabel = end;
25 24
 	}
26
-
27
-	@Override
28
-	public Void visitIntRange() {
25
+	
26
+	public void visitIntRange() {
29 27
 		javaWriter.dup();
30 28
 		javaWriter.getField("zsynthetic/IntRange", "to", "I");
31 29
 		javaWriter.swap();
@@ -40,26 +38,17 @@ public class JavaForeachVisitor implements ForeachIteratorVisitor<Void> {
40 38
 
41 39
 		content.accept(statementVisitor);
42 40
 		javaWriter.iinc(z);
43
-
44
-
45
-		return null;
46 41
 	}
47 42
 
48
-	@Override
49
-	public Void visitArrayValueIterator() {
43
+	public void visitArrayValueIterator() {
50 44
 		handleArray(javaWriter.local(int.class), variables[0].getTag(JavaLocalVariableInfo.class));
51
-		return null;
52 45
 	}
53 46
 
54
-	@Override
55
-	public Void visitArrayKeyValueIterator() {
47
+	public void visitArrayKeyValueIterator() {
56 48
 		handleArray(variables[0].getTag(JavaLocalVariableInfo.class).local, variables[1].getTag(JavaLocalVariableInfo.class));
57
-		return null;
58 49
 	}
59 50
 
60
-	@Override
61
-	public Void visitStringCharacterIterator() {
62
-		// TODO: implement this one
51
+	public void visitStringCharacterIterator() {
63 52
 		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
64 53
 	}
65 54
 
@@ -83,18 +72,15 @@ public class JavaForeachVisitor implements ForeachIteratorVisitor<Void> {
83 72
 		javaWriter.iinc(z);
84 73
 	}
85 74
 
86
-	@Override
87
-	public Void visitCustomIterator() {
88
-		return null;
75
+	public void visitCustomIterator() {
76
+		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
89 77
 	}
90 78
 
91
-	@Override
92
-	public Void visitAssocKeyIterator() {
79
+	public void visitAssocKeyIterator() {
93 80
 		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
94 81
 	}
95 82
 
96
-	@Override
97
-	public Void visitAssocKeyValueIterator() {
83
+	public void visitAssocKeyValueIterator() {
98 84
 		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
99 85
 	}
100 86
 }

+ 28
- 1
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaStatementVisitor.java Parādīt failu

@@ -108,7 +108,34 @@ public class JavaStatementVisitor implements StatementVisitor<Boolean> {
108 108
         }
109 109
 
110 110
 		//javaWriter.label(min);
111
-		statement.iterator.target.acceptForIterator(new JavaForeachVisitor(this, statement.loopVariables, statement.content, start, end));
111
+		JavaForeachWriter iteratorWriter = new JavaForeachWriter(this, statement.loopVariables, statement.content, start, end);
112
+		if (statement.iterator.target.getBuiltin() == null) {
113
+			iteratorWriter.visitCustomIterator();
114
+		} else {
115
+			switch (statement.iterator.target.getBuiltin()) {
116
+				case ITERATOR_INT_RANGE:
117
+					iteratorWriter.visitIntRange();
118
+					break;
119
+				case ITERATOR_ARRAY_VALUES:
120
+					iteratorWriter.visitArrayValueIterator();
121
+					break;
122
+				case ITERATOR_ARRAY_KEY_VALUES:
123
+					iteratorWriter.visitArrayKeyValueIterator();
124
+					break;
125
+				case ITERATOR_ASSOC_KEYS:
126
+					iteratorWriter.visitAssocKeyIterator();
127
+					break;
128
+				case ITERATOR_ASSOC_KEY_VALUES:
129
+					iteratorWriter.visitAssocKeyValueIterator();
130
+					break;
131
+				case ITERATOR_STRING_CHARS:
132
+					iteratorWriter.visitStringCharacterIterator();
133
+					break;
134
+				default:
135
+					throw new IllegalArgumentException("Invalid iterator: " + statement.iterator.target.getBuiltin());
136
+			}
137
+		}
138
+		
112 139
 		javaWriter.goTo(start);
113 140
 		javaWriter.label(end);
114 141
 		return false;

+ 1
- 1
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/definitions/JavaMemberVisitor.java Parādīt failu

@@ -164,7 +164,7 @@ public class JavaMemberVisitor implements MemberVisitor<Void> {
164 164
 	}
165 165
 
166 166
 	@Override
167
-	public Void visitCustomIterator(CustomIteratorMember member) {
167
+	public Void visitCustomIterator(IteratorMember member) {
168 168
 		return null;
169 169
 	}
170 170
 

+ 17
- 16
JavaShared/src/main/java/org/openzen/zenscript/javashared/prepare/JavaPrepareClassMethodVisitor.java Parādīt failu

@@ -7,17 +7,17 @@ package org.openzen.zenscript.javashared.prepare;
7 7
 
8 8
 import org.openzen.zenscript.javashared.JavaNativeClass;
9 9
 import org.openzen.zencode.shared.StringExpansion;
10
+import org.openzen.zenscript.codemodel.FunctionHeader;
10 11
 import org.openzen.zenscript.codemodel.OperatorType;
11 12
 import org.openzen.zenscript.codemodel.annotations.NativeTag;
12 13
 import org.openzen.zenscript.codemodel.member.CallerMember;
13 14
 import org.openzen.zenscript.codemodel.member.CasterMember;
14 15
 import org.openzen.zenscript.codemodel.member.ConstMember;
15 16
 import org.openzen.zenscript.codemodel.member.ConstructorMember;
16
-import org.openzen.zenscript.codemodel.member.CustomIteratorMember;
17
+import org.openzen.zenscript.codemodel.member.IteratorMember;
17 18
 import org.openzen.zenscript.codemodel.member.DefinitionMember;
18 19
 import org.openzen.zenscript.codemodel.member.DestructorMember;
19 20
 import org.openzen.zenscript.codemodel.member.FieldMember;
20
-import org.openzen.zenscript.codemodel.member.FunctionalMember;
21 21
 import org.openzen.zenscript.codemodel.member.GetterMember;
22 22
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
23 23
 import org.openzen.zenscript.codemodel.member.ImplementationMember;
@@ -28,6 +28,7 @@ import org.openzen.zenscript.codemodel.member.OperatorMember;
28 28
 import org.openzen.zenscript.codemodel.member.SetterMember;
29 29
 import org.openzen.zenscript.codemodel.member.StaticInitializerMember;
30 30
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
31
+import org.openzen.zenscript.codemodel.type.BasicTypeID;
31 32
 import org.openzen.zenscript.codemodel.type.GenericTypeID;
32 33
 import org.openzen.zenscript.javashared.JavaTypeNameVisitor;
33 34
 import org.openzen.zenscript.javashared.JavaClass;
@@ -86,7 +87,7 @@ public class JavaPrepareClassMethodVisitor implements MemberVisitor<Void> {
86 87
 
87 88
 	@Override
88 89
 	public Void visitConstructor(ConstructorMember member) {
89
-		visitFunctional(member, "<init>");
90
+		visitFunctional(member, member.header, "<init>");
90 91
 		return null;
91 92
 	}
92 93
 
@@ -101,43 +102,43 @@ public class JavaPrepareClassMethodVisitor implements MemberVisitor<Void> {
101 102
 
102 103
 	@Override
103 104
 	public Void visitMethod(MethodMember member) {
104
-		visitFunctional(member, member.name);
105
+		visitFunctional(member, member.header, member.name);
105 106
 		return null;
106 107
 	}
107 108
 
108 109
 	@Override
109 110
 	public Void visitGetter(GetterMember member) {
110
-		visitFunctional(member, "get" + StringExpansion.capitalize(member.name));
111
+		visitFunctional(member, new FunctionHeader(member.type), "get" + StringExpansion.capitalize(member.name));
111 112
 		return null;
112 113
 	}
113 114
 
114 115
 	@Override
115 116
 	public Void visitSetter(SetterMember member) {
116
-		visitFunctional(member, "set" + StringExpansion.capitalize(member.name));
117
+		visitFunctional(member, new FunctionHeader(BasicTypeID.VOID, member.type), "set" + StringExpansion.capitalize(member.name));
117 118
 		return null;
118 119
 	}
119 120
 
120 121
 	@Override
121 122
 	public Void visitOperator(OperatorMember member) {
122
-		visitFunctional(member, getOperatorName(member.operator));
123
+		visitFunctional(member, member.header, getOperatorName(member.operator));
123 124
 		return null;
124 125
 	}
125 126
 
126 127
 	@Override
127 128
 	public Void visitCaster(CasterMember member) {
128
-		visitFunctional(member, "to" + member.toType.accept(new JavaTypeNameVisitor()));
129
+		visitFunctional(member, member.header, "to" + member.toType.accept(new JavaTypeNameVisitor()));
129 130
 		return null;
130 131
 	}
131 132
 
132 133
 	@Override
133
-	public Void visitCustomIterator(CustomIteratorMember member) {
134
-		visitFunctional(member, member.getLoopVariableCount() == 1 ? "iterator" : "iterator" + member.getLoopVariableCount());
134
+	public Void visitCustomIterator(IteratorMember member) {
135
+		visitFunctional(member, member.header, member.getLoopVariableCount() == 1 ? "iterator" : "iterator" + member.getLoopVariableCount());
135 136
 		return null;
136 137
 	}
137 138
 
138 139
 	@Override
139 140
 	public Void visitCaller(CallerMember member) {
140
-		visitFunctional(member, "call");
141
+		visitFunctional(member, member.header, "call");
141 142
 		return null;
142 143
 	}
143 144
 
@@ -279,7 +280,7 @@ public class JavaPrepareClassMethodVisitor implements MemberVisitor<Void> {
279 280
 		}
280 281
 	}
281 282
 	
282
-	private void visitFunctional(FunctionalMember member, String name) {
283
+	private void visitFunctional(DefinitionMember member, FunctionHeader header, String name) {
283 284
 		NativeTag nativeTag = member.getTag(NativeTag.class);
284 285
 		JavaMethod method = null;
285 286
 		if (nativeTag != null && nativeClass != null)
@@ -296,18 +297,18 @@ public class JavaPrepareClassMethodVisitor implements MemberVisitor<Void> {
296 297
 					baseMethod.kind,
297 298
 					baseMethod.name,
298 299
 					true,
299
-					context.getMethodDescriptor(member.header),
300
+					context.getMethodDescriptor(header),
300 301
 					JavaModifiers.getJavaModifiers(member.modifiers),
301
-					member.header.returnType instanceof GenericTypeID);
302
+					header.returnType instanceof GenericTypeID);
302 303
 		} else if (method == null) {
303 304
 			method = new JavaMethod(
304 305
 					cls,
305 306
 					getKind(member),
306 307
 					name,
307 308
 					true,
308
-					context.getMethodDescriptor(member.header),
309
+					context.getMethodDescriptor(header),
309 310
 					JavaModifiers.getJavaModifiers(member.modifiers),
310
-					member.header.returnType instanceof GenericTypeID);
311
+					header.returnType instanceof GenericTypeID);
311 312
 		}
312 313
 		
313 314
 		if (method.compile) {

+ 15
- 14
JavaShared/src/main/java/org/openzen/zenscript/javashared/prepare/JavaPrepareExpansionMethodVisitor.java Parādīt failu

@@ -7,17 +7,17 @@ package org.openzen.zenscript.javashared.prepare;
7 7
 
8 8
 import org.openzen.zenscript.javashared.JavaNativeClass;
9 9
 import org.openzen.zencode.shared.StringExpansion;
10
+import org.openzen.zenscript.codemodel.FunctionHeader;
10 11
 import org.openzen.zenscript.codemodel.OperatorType;
11 12
 import org.openzen.zenscript.codemodel.annotations.NativeTag;
12 13
 import org.openzen.zenscript.codemodel.member.CallerMember;
13 14
 import org.openzen.zenscript.codemodel.member.CasterMember;
14 15
 import org.openzen.zenscript.codemodel.member.ConstMember;
15 16
 import org.openzen.zenscript.codemodel.member.ConstructorMember;
16
-import org.openzen.zenscript.codemodel.member.CustomIteratorMember;
17
+import org.openzen.zenscript.codemodel.member.IteratorMember;
17 18
 import org.openzen.zenscript.codemodel.member.DefinitionMember;
18 19
 import org.openzen.zenscript.codemodel.member.DestructorMember;
19 20
 import org.openzen.zenscript.codemodel.member.FieldMember;
20
-import org.openzen.zenscript.codemodel.member.FunctionalMember;
21 21
 import org.openzen.zenscript.codemodel.member.GetterMember;
22 22
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
23 23
 import org.openzen.zenscript.codemodel.member.ImplementationMember;
@@ -27,6 +27,7 @@ import org.openzen.zenscript.codemodel.member.MethodMember;
27 27
 import org.openzen.zenscript.codemodel.member.OperatorMember;
28 28
 import org.openzen.zenscript.codemodel.member.SetterMember;
29 29
 import org.openzen.zenscript.codemodel.member.StaticInitializerMember;
30
+import org.openzen.zenscript.codemodel.type.BasicTypeID;
30 31
 import org.openzen.zenscript.codemodel.type.GenericTypeID;
31 32
 import org.openzen.zenscript.javashared.JavaTypeNameVisitor;
32 33
 import org.openzen.zenscript.javashared.JavaClass;
@@ -76,7 +77,7 @@ public class JavaPrepareExpansionMethodVisitor implements MemberVisitor<Void> {
76 77
 
77 78
 	@Override
78 79
 	public Void visitConstructor(ConstructorMember member) {
79
-		visitFunctional(member, "");
80
+		visitFunctional(member, member.header, "");
80 81
 		return null;
81 82
 	}
82 83
 
@@ -85,49 +86,49 @@ public class JavaPrepareExpansionMethodVisitor implements MemberVisitor<Void> {
85 86
 		if (nativeClass != null && nativeClass.nonDestructible)
86 87
 			return null;
87 88
 		
88
-		visitFunctional(member, "");
89
+		visitFunctional(member, member.header, "");
89 90
 		return null;
90 91
 	}
91 92
 
92 93
 	@Override
93 94
 	public Void visitMethod(MethodMember member) {
94
-		visitFunctional(member, member.name);
95
+		visitFunctional(member, member.header, member.name);
95 96
 		return null;
96 97
 	}
97 98
 
98 99
 	@Override
99 100
 	public Void visitGetter(GetterMember member) {
100
-		visitFunctional(member, "get" + StringExpansion.capitalize(member.name));
101
+		visitFunctional(member, new FunctionHeader(member.type), "get" + StringExpansion.capitalize(member.name));
101 102
 		return null;
102 103
 	}
103 104
 
104 105
 	@Override
105 106
 	public Void visitSetter(SetterMember member) {
106
-		visitFunctional(member, "set" + StringExpansion.capitalize(member.name));
107
+		visitFunctional(member, new FunctionHeader(BasicTypeID.VOID, member.type), "set" + StringExpansion.capitalize(member.name));
107 108
 		return null;
108 109
 	}
109 110
 
110 111
 	@Override
111 112
 	public Void visitOperator(OperatorMember member) {
112
-		visitFunctional(member, getOperatorName(member.operator));
113
+		visitFunctional(member, member.header, getOperatorName(member.operator));
113 114
 		return null;
114 115
 	}
115 116
 
116 117
 	@Override
117 118
 	public Void visitCaster(CasterMember member) {
118
-		visitFunctional(member, "to" + member.toType.accept(new JavaTypeNameVisitor()));
119
+		visitFunctional(member, member.header, "to" + member.toType.accept(new JavaTypeNameVisitor()));
119 120
 		return null;
120 121
 	}
121 122
 
122 123
 	@Override
123
-	public Void visitCustomIterator(CustomIteratorMember member) {
124
-		visitFunctional(member, member.getLoopVariableCount() == 1 ? "iterator" : "iterator" + member.getLoopVariableCount());
124
+	public Void visitCustomIterator(IteratorMember member) {
125
+		visitFunctional(member, member.header, member.getLoopVariableCount() == 1 ? "iterator" : "iterator" + member.getLoopVariableCount());
125 126
 		return null;
126 127
 	}
127 128
 
128 129
 	@Override
129 130
 	public Void visitCaller(CallerMember member) {
130
-		visitFunctional(member, "call");
131
+		visitFunctional(member, member.header, "call");
131 132
 		return null;
132 133
 	}
133 134
 
@@ -154,13 +155,13 @@ public class JavaPrepareExpansionMethodVisitor implements MemberVisitor<Void> {
154 155
 		return null;
155 156
 	}
156 157
 	
157
-	private void visitFunctional(FunctionalMember member, String name) {
158
+	private void visitFunctional(DefinitionMember member, FunctionHeader header, String name) {
158 159
 		NativeTag nativeTag = member.getTag(NativeTag.class);
159 160
 		JavaMethod method = null;
160 161
 		if (nativeTag != null && nativeClass != null)
161 162
 			method = nativeClass.getMethod(nativeTag.value);
162 163
 		if (method == null)
163
-			method = new JavaMethod(cls, getKind(member), name, true, context.getMethodDescriptor(member.header), JavaModifiers.getJavaModifiers(member.modifiers), member.header.returnType instanceof GenericTypeID); 
164
+			method = new JavaMethod(cls, getKind(member), name, true, context.getMethodDescriptor(header), JavaModifiers.getJavaModifiers(member.modifiers), header.returnType instanceof GenericTypeID); 
164 165
 		
165 166
 		if (method.compile) {
166 167
 			if (DEBUG_EMPTY && cls.empty)

+ 3
- 3
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaExpansionMemberCompiler.java Parādīt failu

@@ -16,7 +16,7 @@ import org.openzen.zenscript.codemodel.member.CallerMember;
16 16
 import org.openzen.zenscript.codemodel.member.CasterMember;
17 17
 import org.openzen.zenscript.codemodel.member.ConstMember;
18 18
 import org.openzen.zenscript.codemodel.member.ConstructorMember;
19
-import org.openzen.zenscript.codemodel.member.CustomIteratorMember;
19
+import org.openzen.zenscript.codemodel.member.IteratorMember;
20 20
 import org.openzen.zenscript.codemodel.member.DefinitionMember;
21 21
 import org.openzen.zenscript.codemodel.member.DestructorMember;
22 22
 import org.openzen.zenscript.codemodel.member.FieldMember;
@@ -140,7 +140,7 @@ public class JavaExpansionMemberCompiler extends BaseMemberCompiler {
140 140
 
141 141
 	@Override
142 142
 	public Void visitGetter(GetterMember member) {
143
-		compileMethod(member, member.header, member.body);
143
+		compileMethod(member, new FunctionHeader(member.type), member.body);
144 144
 		return null;
145 145
 	}
146 146
 
@@ -163,7 +163,7 @@ public class JavaExpansionMemberCompiler extends BaseMemberCompiler {
163 163
 	}
164 164
 
165 165
 	@Override
166
-	public Void visitCustomIterator(CustomIteratorMember member) {
166
+	public Void visitCustomIterator(IteratorMember member) {
167 167
 		compileMethod(member, new FunctionHeader(scope.semanticScope.getTypeRegistry().getIterator(member.getLoopVariableTypes())), member.body);
168 168
 		return null;
169 169
 	}

+ 3
- 3
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaMemberCompiler.java Parādīt failu

@@ -19,7 +19,7 @@ import org.openzen.zenscript.codemodel.member.CallerMember;
19 19
 import org.openzen.zenscript.codemodel.member.CasterMember;
20 20
 import org.openzen.zenscript.codemodel.member.ConstMember;
21 21
 import org.openzen.zenscript.codemodel.member.ConstructorMember;
22
-import org.openzen.zenscript.codemodel.member.CustomIteratorMember;
22
+import org.openzen.zenscript.codemodel.member.IteratorMember;
23 23
 import org.openzen.zenscript.codemodel.member.DefinitionMember;
24 24
 import org.openzen.zenscript.codemodel.member.DestructorMember;
25 25
 import org.openzen.zenscript.codemodel.member.FieldMember;
@@ -186,7 +186,7 @@ public class JavaMemberCompiler extends BaseMemberCompiler {
186 186
 
187 187
 	@Override
188 188
 	public Void visitGetter(GetterMember member) {
189
-		compileMethod(member, member.header, member.body);
189
+		compileMethod(member, new FunctionHeader(member.type), member.body);
190 190
 		return null;
191 191
 	}
192 192
 
@@ -209,7 +209,7 @@ public class JavaMemberCompiler extends BaseMemberCompiler {
209 209
 	}
210 210
 
211 211
 	@Override
212
-	public Void visitCustomIterator(CustomIteratorMember member) {
212
+	public Void visitCustomIterator(IteratorMember member) {
213 213
 		compileMethod(member, new FunctionHeader(scope.semanticScope.getTypeRegistry().getIterator(member.getLoopVariableTypes())), member.body);
214 214
 		return null;
215 215
 	}

+ 92
- 89
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceStatementFormatter.java Parādīt failu

@@ -18,7 +18,6 @@ import org.openzen.zenscript.codemodel.expression.switchvalue.IntSwitchValue;
18 18
 import org.openzen.zenscript.codemodel.expression.switchvalue.StringSwitchValue;
19 19
 import org.openzen.zenscript.codemodel.expression.switchvalue.SwitchValueVisitor;
20 20
 import org.openzen.zenscript.codemodel.expression.switchvalue.VariantOptionSwitchValue;
21
-import org.openzen.zenscript.codemodel.iterator.ForeachIteratorVisitor;
22 21
 import org.openzen.zenscript.codemodel.statement.BlockStatement;
23 22
 import org.openzen.zenscript.codemodel.statement.BreakStatement;
24 23
 import org.openzen.zenscript.codemodel.statement.CatchClause;
@@ -100,7 +99,33 @@ public class JavaSourceStatementFormatter implements StatementFormatter.Formatte
100 99
 
101 100
 	@Override
102 101
 	public void formatForeach(StatementFormattingTarget target, ForeachStatement statement) {
103
-		statement.iterator.target.acceptForIterator(new ForeachFormatter(scope, target, statement));
102
+		if (statement.iterator.target.getBuiltin() == null) {
103
+			iterateOverCustomIterator(target, statement);
104
+			return;
105
+		}
106
+		
107
+		switch (statement.iterator.target.getBuiltin()) {
108
+			case ITERATOR_INT_RANGE:
109
+				iterateOverIntRange(target, statement);
110
+				break;
111
+			case ITERATOR_ARRAY_VALUES:
112
+				iterateOverArrayValues(target, statement);
113
+				break;
114
+			case ITERATOR_ARRAY_KEY_VALUES:
115
+				iteratorOverArrayKeyValues(target, statement);
116
+				break;
117
+			case ITERATOR_ASSOC_KEYS:
118
+				iterateOverAssocKeys(target, statement);
119
+				break;
120
+			case ITERATOR_ASSOC_KEY_VALUES:
121
+				iterateOverAssocKeyValues(target, statement);
122
+				break;
123
+			case ITERATOR_STRING_CHARS:
124
+				iterateOverStringCharacters(target, statement);
125
+				break;
126
+			default:
127
+				throw new IllegalArgumentException("Invalid iterator: " + statement.iterator.target.getBuiltin());
128
+		}
104 129
 	}
105 130
 
106 131
 	@Override
@@ -230,108 +255,86 @@ public class JavaSourceStatementFormatter implements StatementFormatter.Formatte
230 255
 		return value.option.getName();
231 256
 	}
232 257
 	
233
-	private static class ForeachFormatter implements ForeachIteratorVisitor<Void> {
234
-		private final JavaSourceStatementScope scope;
235
-		private final StatementFormattingTarget target;
236
-		private final ForeachStatement statement;
237
-		
238
-		public ForeachFormatter(JavaSourceStatementScope scope, StatementFormattingTarget target, ForeachStatement statement) {
239
-			this.scope = scope;
240
-			this.target = target;
241
-			this.statement = statement;
242
-		}
258
+	private void iterateOverIntRange(StatementFormattingTarget target, ForeachStatement statement) {
259
+		String name = statement.loopVariables[0].name;
243 260
 
244
-		@Override
245
-		public Void visitIntRange() {
246
-			String name = statement.loopVariables[0].name;
247
-			
248
-			if (statement.list instanceof RangeExpression) {
249
-				String limitName = "limitFor" + StringExpansion.capitalize(name);
250
-				RangeExpression range = (RangeExpression)(statement.list);
251
-				target.writeLine("int " + limitName + " = " + scope.expression(target, range.to) + ";");
252
-				target.writeInner(
253
-						"for (int " + name + " = " + scope.expression(target, range.from) + "; " + name + " < " + limitName + "; " + name + "++)",
254
-						statement.content,
255
-						statement,
256
-						"");
257
-			} else {
258
-				target.writeLine("IntRange rangeFor" + name + " = " + scope.expression(target, statement.list) + ";");
259
-				target.writeInner(
260
-						"for (int " + name + " = rangeFor" + name + ".from; i < rangeFor" + name + ".to; " + name + "++)",
261
-						statement.content,
262
-						statement,
263
-						"");
264
-			}
265
-			return null;
266
-		}
267
-
268
-		@Override
269
-		public Void visitArrayValueIterator() {
261
+		if (statement.list instanceof RangeExpression) {
262
+			String limitName = "limitFor" + StringExpansion.capitalize(name);
263
+			RangeExpression range = (RangeExpression)(statement.list);
264
+			target.writeLine("int " + limitName + " = " + scope.expression(target, range.to) + ";");
270 265
 			target.writeInner(
271
-					"for (" + scope.type(statement.loopVariables[0].type) + " " + statement.loopVariables[0].name + " : " + scope.expression(target, statement.list) + ")",
266
+					"for (int " + name + " = " + scope.expression(target, range.from) + "; " + name + " < " + limitName + "; " + name + "++)",
272 267
 					statement.content,
273 268
 					statement,
274 269
 					"");
275
-			return null;
276
-		}
277
-
278
-		@Override
279
-		public Void visitArrayKeyValueIterator() {
280
-			ExpressionString list = scope.expression(target, scope.duplicable(target, statement.list));
281
-			
270
+		} else {
271
+			target.writeLine("IntRange rangeFor" + name + " = " + scope.expression(target, statement.list) + ";");
282 272
 			target.writeInner(
283
-					"for (int " + statement.loopVariables[0].name + " = 0; i < " + list.value + ".length; i++) {",
284
-					new String[] {
285
-						scope.type(statement.loopVariables[1].type) + " " + statement.loopVariables[1].name + " = " + list.value + "[" + statement.loopVariables[0].name + "];"
286
-					},
273
+					"for (int " + name + " = rangeFor" + name + ".from; i < rangeFor" + name + ".to; " + name + "++)",
287 274
 					statement.content,
288 275
 					statement,
289
-					"}");
290
-			
291
-			return null;
276
+					"");
292 277
 		}
278
+	}
293 279
 
294
-		@Override
295
-		public Void visitCustomIterator() {
296
-			throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
297
-		}
280
+	private void iterateOverArrayValues(StatementFormattingTarget target, ForeachStatement statement) {
281
+		target.writeInner(
282
+				"for (" + scope.type(statement.loopVariables[0].type) + " " + statement.loopVariables[0].name + " : " + scope.expression(target, statement.list) + ")",
283
+				statement.content,
284
+				statement,
285
+				"");
286
+	}
298 287
 
299
-		@Override
300
-		public Void visitStringCharacterIterator() {
301
-			target.writeInner(
302
-					"for (char " + statement.loopVariables[0].name + " : " + scope.expression(target, statement.list).value + ".toCharArray())",
303
-					statement.content,
304
-					statement,
305
-					"");
306
-			return null;
307
-		}
288
+	private void iteratorOverArrayKeyValues(StatementFormattingTarget target, ForeachStatement statement) {
289
+		ExpressionString list = scope.expression(target, scope.duplicable(target, statement.list));
308 290
 
309
-		@Override
310
-		public Void visitAssocKeyIterator() {
311
-			VarStatement key = statement.loopVariables[0];
312
-			target.writeInner(
313
-					"for (" + scope.type(key.type) + " " + key + " : " + scope.expression(target, statement.list).value + ".keySet())",
291
+		target.writeInner(
292
+				"for (int " + statement.loopVariables[0].name + " = 0; i < " + list.value + ".length; i++) {",
293
+				new String[] {
294
+					scope.type(statement.loopVariables[1].type) + " " + statement.loopVariables[1].name + " = " + list.value + "[" + statement.loopVariables[0].name + "];"
295
+				},
296
+				statement.content,
297
+				statement,
298
+				"}");
299
+	}
300
+
301
+	private void iterateOverCustomIterator(StatementFormattingTarget target, ForeachStatement statement) {
302
+		target.writeInner(
303
+					"for (" + scope.type(statement.loopVariables[0].type) + " " + statement.loopVariables[0].name + " : " + scope.expression(target, statement.list) + ")",
314 304
 					statement.content,
315 305
 					statement,
316 306
 					"");
317
-			return null;
318
-		}
307
+	}
319 308
 
320
-		@Override
321
-		public Void visitAssocKeyValueIterator() {
322
-			String temp = scope.createTempVariable();
323
-			VarStatement key = statement.loopVariables[0];
324
-			VarStatement value = statement.loopVariables[1];
325
-			target.writeInner(
326
-					"for (Map.Entry<" + scope.type(key.type) + ", " + scope.type(value.type) + "> " + temp + " : " + scope.expression(target, statement.list).value + ".entrySet()) {",
327
-					new String[] {
328
-						scope.type(key.type) + " " + key.name + " = " + temp + ".getKey();",
329
-						scope.type(value.type) + " " + value.name + " = " + temp + ".getValue();"
330
-					},
331
-					statement.content,
332
-					statement,
333
-					"}");
334
-			return null;
335
-		}
309
+	private void iterateOverStringCharacters(StatementFormattingTarget target, ForeachStatement statement) {
310
+		target.writeInner(
311
+				"for (char " + statement.loopVariables[0].name + " : " + scope.expression(target, statement.list).value + ".toCharArray())",
312
+				statement.content,
313
+				statement,
314
+				"");
315
+	}
316
+
317
+	private void iterateOverAssocKeys(StatementFormattingTarget target, ForeachStatement statement) {
318
+		VarStatement key = statement.loopVariables[0];
319
+		target.writeInner(
320
+				"for (" + scope.type(key.type) + " " + key + " : " + scope.expression(target, statement.list).value + ".keySet())",
321
+				statement.content,
322
+				statement,
323
+				"");
324
+	}
325
+
326
+	private void iterateOverAssocKeyValues(StatementFormattingTarget target, ForeachStatement statement) {
327
+		String temp = scope.createTempVariable();
328
+		VarStatement key = statement.loopVariables[0];
329
+		VarStatement value = statement.loopVariables[1];
330
+		target.writeInner(
331
+				"for (Map.Entry<" + scope.type(key.type) + ", " + scope.type(value.type) + "> " + temp + " : " + scope.expression(target, statement.list).value + ".entrySet()) {",
332
+				new String[] {
333
+					scope.type(key.type) + " " + key.name + " = " + temp + ".getKey();",
334
+					scope.type(value.type) + " " + value.name + " = " + temp + ".getValue();"
335
+				},
336
+				statement.content,
337
+				statement,
338
+				"}");
336 339
 	}
337 340
 }

+ 3
- 3
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceSyntheticTypeGenerator.java Parādīt failu

@@ -108,11 +108,11 @@ public class JavaSourceSyntheticTypeGenerator implements JavaSyntheticClassGener
108 108
 				.append(result.cls.getName())
109 109
 				.append("(")
110 110
 				.append(type.from.accept(typeVisitor))
111
-				.append(", ")
111
+				.append(" from, ")
112 112
 				.append(type.to.accept(typeVisitor))
113
-				.append(") {\n");
113
+				.append(" to) {\n");
114 114
 		contents.append(settings.indent).append(settings.indent).append("this.from = from;\n");
115
-		contents.append(settings.indent).append(settings.indent).append("this.to = top;\n");
115
+		contents.append(settings.indent).append(settings.indent).append("this.to = to;\n");
116 116
 		contents.append(settings.indent).append("}\n");
117 117
 		contents.append("}\n");
118 118
 		

+ 14
- 1
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceTypeVisitor.java Parādīt failu

@@ -152,7 +152,20 @@ public class JavaSourceTypeVisitor implements ITypeVisitor<String>, GenericParam
152 152
 
153 153
 	@Override
154 154
 	public String visitRange(RangeTypeID range) {
155
-		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
155
+		JavaSynthesizedClass synthetic = typeGenerator.synthesizeRange(range);
156
+		StringBuilder result = new StringBuilder();
157
+		result.append(importer.importType(synthetic.cls));
158
+		if (synthetic.typeParameters.length > 0) {
159
+			result.append('<');
160
+			for (int i = 0; i < synthetic.typeParameters.length; i++) {
161
+				if (i > 0)
162
+					result.append(", ");
163
+				
164
+				result.append(synthetic.typeParameters[i].name);
165
+			}
166
+			result.append('>');
167
+		}
168
+		return result.toString();
156 169
 	}
157 170
 
158 171
 	@Override

+ 51
- 14
Parser/src/main/java/org/openzen/zenscript/parser/member/ParsedGetter.java Parādīt failu

@@ -6,27 +6,36 @@
6 6
 package org.openzen.zenscript.parser.member;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zencode.shared.CompileException;
10
+import org.openzen.zencode.shared.CompileExceptionCode;
11
+import org.openzen.zenscript.codemodel.FunctionHeader;
9 12
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
13
+import org.openzen.zenscript.codemodel.Modifiers;
10 14
 import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
11
-import org.openzen.zenscript.codemodel.member.FunctionalMember;
12 15
 import org.openzen.zenscript.codemodel.member.GetterMember;
13 16
 import org.openzen.zenscript.codemodel.scope.BaseScope;
17
+import org.openzen.zenscript.codemodel.scope.FunctionScope;
14 18
 import org.openzen.zenscript.codemodel.scope.TypeScope;
19
+import org.openzen.zenscript.codemodel.type.BasicTypeID;
15 20
 import org.openzen.zenscript.codemodel.type.ITypeID;
16 21
 import org.openzen.zenscript.parser.ParsedAnnotation;
17
-import org.openzen.zenscript.parser.PrecompilationState;
18 22
 import org.openzen.zenscript.parser.statements.ParsedFunctionBody;
19 23
 import org.openzen.zenscript.parser.type.IParsedType;
20
-import org.openzen.zenscript.parser.type.ParsedTypeBasic;
21 24
 
22 25
 /**
23 26
  *
24 27
  * @author Hoofdgebruiker
25 28
  */
26
-public class ParsedGetter extends ParsedFunctionalMember {
29
+public class ParsedGetter extends ParsedDefinitionMember {
30
+	private final CodePosition position;
31
+	private final int modifiers;
32
+	private final ParsedImplementation implementation;
33
+	private final ParsedFunctionBody body;
34
+	
27 35
 	private final String name;
28 36
 	private final IParsedType type;
29 37
 	private GetterMember compiled;
38
+	private boolean isCompiled = false;
30 39
 	
31 40
 	public ParsedGetter(
32 41
 			CodePosition position,
@@ -38,7 +47,12 @@ public class ParsedGetter extends ParsedFunctionalMember {
38 47
 			IParsedType type,
39 48
 			ParsedFunctionBody body)
40 49
 	{
41
-		super(position, definition, implementation, modifiers, annotations, body);
50
+		super(definition, annotations);
51
+		
52
+		this.implementation = implementation;
53
+		this.position = position;
54
+		this.modifiers = modifiers;
55
+		this.body = body;
42 56
 		
43 57
 		this.name = name;
44 58
 		this.type = type;
@@ -48,22 +62,45 @@ public class ParsedGetter extends ParsedFunctionalMember {
48 62
 	public void linkTypes(TypeResolutionContext context) {
49 63
 		compiled = new GetterMember(position, definition, modifiers, name, type.compile(context), null);
50 64
 	}
51
-
65
+	
52 66
 	@Override
53
-	public FunctionalMember getCompiled() {
67
+	public GetterMember getCompiled() {
54 68
 		return compiled;
55 69
 	}
56 70
 	
57
-	@Override
58
-	protected void inferHeaders(BaseScope scope) {
59
-		super.inferHeaders(scope);
71
+	private void inferHeaders(BaseScope scope) {
72
+		if ((implementation != null && !Modifiers.isPrivate(modifiers))) {
73
+			fillOverride(scope, implementation.getCompiled().type);
74
+			compiled.modifiers |= Modifiers.PUBLIC;
75
+		} else if (implementation == null && Modifiers.isOverride(modifiers)) {
76
+			if (definition.getSuperType() == null)
77
+				throw new CompileException(position, CompileExceptionCode.OVERRIDE_WITHOUT_BASE, "Override specified without base type");
78
+			
79
+			fillOverride(scope, definition.getSuperType());
80
+		}
60 81
 		
61
-		if (type == ParsedTypeBasic.UNDETERMINED)
62
-			compiled.type = compiled.header.returnType;
82
+		if (compiled == null)
83
+			throw new IllegalStateException("Types not yet linked");
63 84
 	}
64 85
 
65
-	@Override
66
-	protected void fillOverride(TypeScope scope, ITypeID baseType) {
86
+	private void fillOverride(TypeScope scope, ITypeID baseType) {
67 87
 		compiled.setOverrides(scope.getTypeMembers(baseType).getOrCreateGroup(name, false).getGetter());
68 88
 	}
89
+	
90
+	@Override
91
+	public final void compile(BaseScope scope) {
92
+		if (isCompiled)
93
+			return;
94
+		isCompiled = true;
95
+		
96
+		inferHeaders(scope);
97
+		
98
+		FunctionHeader header = new FunctionHeader(compiled.type);
99
+		FunctionScope innerScope = new FunctionScope(scope, header);
100
+		compiled.annotations = ParsedAnnotation.compileForMember(annotations, getCompiled(), scope);
101
+		compiled.setBody(body.compile(innerScope, header));
102
+		
103
+		if (compiled.type == BasicTypeID.UNDETERMINED)
104
+			compiled.type = compiled.body.getReturnType();
105
+	}
69 106
 }

+ 4
- 4
Parser/src/main/java/org/openzen/zenscript/parser/member/ParsedIterator.java Parādīt failu

@@ -9,7 +9,7 @@ import org.openzen.zencode.shared.CodePosition;
9 9
 import org.openzen.zenscript.codemodel.FunctionHeader;
10 10
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
11 11
 import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
12
-import org.openzen.zenscript.codemodel.member.CustomIteratorMember;
12
+import org.openzen.zenscript.codemodel.member.IteratorMember;
13 13
 import org.openzen.zenscript.codemodel.type.ITypeID;
14 14
 import org.openzen.zenscript.codemodel.scope.BaseScope;
15 15
 import org.openzen.zenscript.codemodel.scope.FunctionScope;
@@ -29,7 +29,7 @@ public class ParsedIterator extends ParsedDefinitionMember {
29 29
 	private final ParsedFunctionHeader header;
30 30
 	private final ParsedFunctionBody body;
31 31
 	
32
-	private CustomIteratorMember compiled;
32
+	private IteratorMember compiled;
33 33
 	
34 34
 	public ParsedIterator(
35 35
 			CodePosition position,
@@ -53,11 +53,11 @@ public class ParsedIterator extends ParsedDefinitionMember {
53 53
 		for (int i = 0; i < loopVariableTypes.length; i++)
54 54
 			loopVariableTypes[i] = header.parameters.get(i).type.compile(context);
55 55
 		
56
-		compiled = new CustomIteratorMember(position, definition, modifiers, loopVariableTypes, context.getTypeRegistry(), null);
56
+		compiled = new IteratorMember(position, definition, modifiers, loopVariableTypes, context.getTypeRegistry(), null);
57 57
 	}
58 58
 
59 59
 	@Override
60
-	public CustomIteratorMember getCompiled() {
60
+	public IteratorMember getCompiled() {
61 61
 		return compiled;
62 62
 	}
63 63
 

+ 48
- 5
Parser/src/main/java/org/openzen/zenscript/parser/member/ParsedSetter.java Parādīt failu

@@ -6,14 +6,18 @@
6 6
 package org.openzen.zenscript.parser.member;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zencode.shared.CompileException;
10
+import org.openzen.zencode.shared.CompileExceptionCode;
11
+import org.openzen.zenscript.codemodel.FunctionHeader;
9 12
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
13
+import org.openzen.zenscript.codemodel.Modifiers;
10 14
 import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
11 15
 import org.openzen.zenscript.codemodel.member.SetterMember;
12 16
 import org.openzen.zenscript.codemodel.scope.BaseScope;
17
+import org.openzen.zenscript.codemodel.scope.FunctionScope;
13 18
 import org.openzen.zenscript.codemodel.scope.TypeScope;
14 19
 import org.openzen.zenscript.codemodel.type.ITypeID;
15 20
 import org.openzen.zenscript.parser.ParsedAnnotation;
16
-import org.openzen.zenscript.parser.PrecompilationState;
17 21
 import org.openzen.zenscript.parser.statements.ParsedFunctionBody;
18 22
 import org.openzen.zenscript.parser.type.IParsedType;
19 23
 
@@ -21,10 +25,16 @@ import org.openzen.zenscript.parser.type.IParsedType;
21 25
  *
22 26
  * @author Hoofdgebruiker
23 27
  */
24
-public class ParsedSetter extends ParsedFunctionalMember {
28
+public class ParsedSetter extends ParsedDefinitionMember {
29
+	private final CodePosition position;
30
+	private final int modifiers;
31
+	private final ParsedImplementation implementation;
32
+	private final ParsedFunctionBody body;
33
+	
25 34
 	private final String name;
26 35
 	private final IParsedType type;
27 36
 	private SetterMember compiled;
37
+	private boolean isCompiled = false;
28 38
 	
29 39
 	public ParsedSetter(
30 40
 			CodePosition position,
@@ -36,7 +46,12 @@ public class ParsedSetter extends ParsedFunctionalMember {
36 46
 			IParsedType type,
37 47
 			ParsedFunctionBody body)
38 48
 	{
39
-		super(position, definition, implementation, modifiers, annotations, body);
49
+		super(definition, annotations);
50
+		
51
+		this.implementation = implementation;
52
+		this.position = position;
53
+		this.modifiers = modifiers;
54
+		this.body = body;
40 55
 		
41 56
 		this.name = name;
42 57
 		this.type = type;
@@ -51,9 +66,37 @@ public class ParsedSetter extends ParsedFunctionalMember {
51 66
 	public SetterMember getCompiled() {
52 67
 		return compiled;
53 68
 	}
69
+	
70
+	private void inferHeaders(BaseScope scope) {
71
+		if ((implementation != null && !Modifiers.isPrivate(modifiers))) {
72
+			fillOverride(scope, implementation.getCompiled().type);
73
+			compiled.modifiers |= Modifiers.PUBLIC;
74
+		} else if (implementation == null && Modifiers.isOverride(modifiers)) {
75
+			if (definition.getSuperType() == null)
76
+				throw new CompileException(position, CompileExceptionCode.OVERRIDE_WITHOUT_BASE, "Override specified without base type");
77
+			
78
+			fillOverride(scope, definition.getSuperType());
79
+		}
80
+		
81
+		if (compiled == null)
82
+			throw new IllegalStateException("Types not yet linked");
83
+	}
54 84
 
55
-	@Override
56
-	protected void fillOverride(TypeScope scope, ITypeID baseType) {
85
+	private void fillOverride(TypeScope scope, ITypeID baseType) {
57 86
 		compiled.setOverrides(scope.getTypeMembers(baseType).getOrCreateGroup(name, true).getSetter());
58 87
 	}
88
+	
89
+	@Override
90
+	public final void compile(BaseScope scope) {
91
+		if (isCompiled)
92
+			return;
93
+		isCompiled = true;
94
+		
95
+		inferHeaders(scope);
96
+		
97
+		FunctionHeader header = new FunctionHeader(compiled.type);
98
+		FunctionScope innerScope = new FunctionScope(scope, header);
99
+		compiled.annotations = ParsedAnnotation.compileForMember(annotations, getCompiled(), scope);
100
+		compiled.setBody(body.compile(innerScope, header));
101
+	}
59 102
 }

+ 1
- 2
Parser/src/main/java/org/openzen/zenscript/parser/member/ParsedStaticInitializer.java Parādīt failu

@@ -15,7 +15,6 @@ import org.openzen.zenscript.codemodel.type.BasicTypeID;
15 15
 import org.openzen.zenscript.codemodel.scope.BaseScope;
16 16
 import org.openzen.zenscript.codemodel.scope.FunctionScope;
17 17
 import org.openzen.zenscript.parser.ParsedAnnotation;
18
-import org.openzen.zenscript.parser.PrecompilationState;
19 18
 import org.openzen.zenscript.parser.statements.ParsedStatement;
20 19
 
21 20
 /**
@@ -31,7 +30,7 @@ public class ParsedStaticInitializer extends ParsedDefinitionMember {
31 30
 		super(definition, annotations);
32 31
 		
33 32
 		this.body = body;
34
-		compiled = new StaticInitializerMember(position);
33
+		compiled = new StaticInitializerMember(position, definition);
35 34
 	}
36 35
 
37 36
 	@Override

+ 28
- 10
Validator/src/main/java/org/openzen/zenscript/validator/visitors/DefinitionMemberValidator.java Parādīt failu

@@ -16,7 +16,8 @@ import org.openzen.zenscript.codemodel.member.CallerMember;
16 16
 import org.openzen.zenscript.codemodel.member.CasterMember;
17 17
 import org.openzen.zenscript.codemodel.member.ConstMember;
18 18
 import org.openzen.zenscript.codemodel.member.ConstructorMember;
19
-import org.openzen.zenscript.codemodel.member.CustomIteratorMember;
19
+import org.openzen.zenscript.codemodel.member.DefinitionMember;
20
+import org.openzen.zenscript.codemodel.member.IteratorMember;
20 21
 import org.openzen.zenscript.codemodel.member.DestructorMember;
21 22
 import org.openzen.zenscript.codemodel.member.EnumConstantMember;
22 23
 import org.openzen.zenscript.codemodel.member.FieldMember;
@@ -28,9 +29,11 @@ import org.openzen.zenscript.codemodel.member.InnerDefinitionMember;
28 29
 import org.openzen.zenscript.codemodel.member.MemberVisitor;
29 30
 import org.openzen.zenscript.codemodel.member.MethodMember;
30 31
 import org.openzen.zenscript.codemodel.member.OperatorMember;
32
+import org.openzen.zenscript.codemodel.member.PropertyMember;
31 33
 import org.openzen.zenscript.codemodel.member.SetterMember;
32 34
 import org.openzen.zenscript.codemodel.member.StaticInitializerMember;
33 35
 import org.openzen.zenscript.codemodel.scope.TypeScope;
36
+import org.openzen.zenscript.codemodel.statement.Statement;
34 37
 import org.openzen.zenscript.codemodel.statement.VarStatement;
35 38
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
36 39
 import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
@@ -117,7 +120,7 @@ public class DefinitionMemberValidator implements MemberVisitor<Void> {
117 120
 		} else {
118 121
 			StatementValidator statementValidator = new StatementValidator(validator, new ConstructorStatementScope(member.header));
119 122
 			member.body.accept(statementValidator);
120
-			validateThrow(member);
123
+			validateThrow(member, member.header, member.body);
121 124
 			
122 125
 			if (member.definition.getSuperType() != null && !statementValidator.constructorForwarded) {
123 126
 				validator.logError(ValidationLogEntry.Code.CONSTRUCTOR_FORWARD_MISSING, member.position, "Constructor not forwarded to base type");
@@ -152,7 +155,7 @@ public class DefinitionMemberValidator implements MemberVisitor<Void> {
152 155
 	public Void visitGetter(GetterMember member) {
153 156
 		ValidationUtils.validateIdentifier(validator, member.position, member.name);
154 157
 		member.type.accept(new TypeValidator(validator, member.position));
155
-		validateProperty(member, new MethodStatementScope(member.header));
158
+		validateGetter(member, new MethodStatementScope(new FunctionHeader(member.type)));
156 159
 		return null;
157 160
 	}
158 161
 
@@ -160,7 +163,7 @@ public class DefinitionMemberValidator implements MemberVisitor<Void> {
160 163
 	public Void visitSetter(SetterMember member) {
161 164
 		ValidationUtils.validateIdentifier(validator, member.position, member.name);
162 165
 		member.type.accept(new TypeValidator(validator, member.position));
163
-		validateProperty(member, new MethodStatementScope(member.header));
166
+		validateSetter(member, new MethodStatementScope(new FunctionHeader(BasicTypeID.VOID, member.parameter)));
164 167
 		return null;
165 168
 	}
166 169
 	
@@ -191,7 +194,7 @@ public class DefinitionMemberValidator implements MemberVisitor<Void> {
191 194
 	}
192 195
 
193 196
 	@Override
194
-	public Void visitCustomIterator(CustomIteratorMember member) {
197
+	public Void visitCustomIterator(IteratorMember member) {
195 198
 		for (ITypeID type : member.getLoopVariableTypes())
196 199
 			type.accept(new TypeValidator(validator, member.position));
197 200
 		validateFunctional(member, new MethodStatementScope(new FunctionHeader(scope.getTypeRegistry().getIterator(member.getLoopVariableTypes()))));
@@ -277,8 +280,8 @@ public class DefinitionMemberValidator implements MemberVisitor<Void> {
277 280
 		return null;
278 281
 	}
279 282
 	
280
-	private void validateThrow(FunctionalMember member) {
281
-		if (member.body.thrownType != null && member.header.thrownType == null) // TODO: validate thrown type
283
+	private void validateThrow(DefinitionMember member, FunctionHeader header, Statement body) {
284
+		if (body.thrownType != null && header.thrownType == null) // TODO: validate thrown type
282 285
 			validator.logError(ValidationLogEntry.Code.THROW_WITHOUT_THROWS, member.position, "Method is throwing but doesn't declare throws type");
283 286
 	}
284 287
 	
@@ -294,11 +297,11 @@ public class DefinitionMemberValidator implements MemberVisitor<Void> {
294 297
 		if (member.body != null) {
295 298
 			StatementValidator statementValidator = new StatementValidator(validator, scope);
296 299
 			member.body.accept(statementValidator);
297
-			validateThrow(member);
300
+			validateThrow(member, member.header, member.body);
298 301
 		}
299 302
 	}
300 303
 	
301
-	private void validateProperty(FunctionalMember member, StatementScope scope) {
304
+	private void validateGetter(GetterMember member, StatementScope scope) {
302 305
 		if (Modifiers.isOverride(member.modifiers) || (context == DefinitionMemberContext.IMPLEMENTATION && !member.isPrivate())) {
303 306
 			if (member.getOverrides() == null) {
304 307
 				validator.logError(ValidationLogEntry.Code.OVERRIDE_MISSING_BASE, member.position, "Overridden method not identified");
@@ -308,7 +311,22 @@ public class DefinitionMemberValidator implements MemberVisitor<Void> {
308 311
 		if (member.body != null) {
309 312
 			StatementValidator statementValidator = new StatementValidator(validator, scope);
310 313
 			member.body.accept(statementValidator);
311
-			validateThrow(member);
314
+			
315
+			validateThrow(member, new FunctionHeader(member.type), member.body);
316
+		}
317
+	}
318
+	
319
+	private void validateSetter(SetterMember member, StatementScope scope) {
320
+		if (Modifiers.isOverride(member.modifiers) || (context == DefinitionMemberContext.IMPLEMENTATION && !member.isPrivate())) {
321
+			if (member.getOverrides() == null) {
322
+				validator.logError(ValidationLogEntry.Code.OVERRIDE_MISSING_BASE, member.position, "Overridden method not identified");
323
+			}
324
+		}
325
+		
326
+		if (member.body != null) {
327
+			StatementValidator statementValidator = new StatementValidator(validator, scope);
328
+			member.body.accept(statementValidator);
329
+			validateThrow(member, new FunctionHeader(BasicTypeID.VOID, member.type), member.body);
312 330
 		}
313 331
 	}
314 332
 	

Notiek ielāde…
Atcelt
Saglabāt