Ver código fonte

- Changed class hierarchy for getters and setters.

- Rewrote iterator implementation
Stan Hebben 6 anos atrás
pai
commit
1b08f6187a
42 arquivos alterados com 506 adições e 828 exclusões
  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 Ver arquivo

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

18
 import org.openzen.zenscript.codemodel.member.CasterMember;
18
 import org.openzen.zenscript.codemodel.member.CasterMember;
19
 import org.openzen.zenscript.codemodel.member.ConstMember;
19
 import org.openzen.zenscript.codemodel.member.ConstMember;
20
 import org.openzen.zenscript.codemodel.member.ConstructorMember;
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
 import org.openzen.zenscript.codemodel.member.DestructorMember;
22
 import org.openzen.zenscript.codemodel.member.DestructorMember;
23
 import org.openzen.zenscript.codemodel.member.FieldMember;
23
 import org.openzen.zenscript.codemodel.member.FieldMember;
24
 import org.openzen.zenscript.codemodel.member.FunctionalMember;
24
 import org.openzen.zenscript.codemodel.member.FunctionalMember;
32
 import org.openzen.zenscript.codemodel.member.SetterMember;
32
 import org.openzen.zenscript.codemodel.member.SetterMember;
33
 import org.openzen.zenscript.codemodel.member.StaticInitializerMember;
33
 import org.openzen.zenscript.codemodel.member.StaticInitializerMember;
34
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
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
 import org.openzen.zenscript.codemodel.scope.DefinitionScope;
37
 import org.openzen.zenscript.codemodel.scope.DefinitionScope;
36
 import org.openzen.zenscript.codemodel.scope.FileScope;
38
 import org.openzen.zenscript.codemodel.scope.FileScope;
37
 import org.openzen.zenscript.codemodel.scope.FunctionScope;
39
 import org.openzen.zenscript.codemodel.scope.FunctionScope;
130
 
132
 
131
 		@Override
133
 		@Override
132
 		public Void visitGetter(GetterMember member) {
134
 		public Void visitGetter(GetterMember member) {
133
-			return functional(member);
135
+			return getter(member);
134
 		}
136
 		}
135
 
137
 
136
 		@Override
138
 		@Override
137
 		public Void visitSetter(SetterMember member) {
139
 		public Void visitSetter(SetterMember member) {
138
-			return functional(member);
140
+			return setter(member);
139
 		}
141
 		}
140
 
142
 
141
 		@Override
143
 		@Override
149
 		}
151
 		}
150
 
152
 
151
 		@Override
153
 		@Override
152
-		public Void visitCustomIterator(CustomIteratorMember member) {
154
+		public Void visitCustomIterator(IteratorMember member) {
153
 			return functional(member);
155
 			return functional(member);
154
 		}
156
 		}
155
 
157
 
199
 			return null;
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
 		private void functional(FunctionalMember member, DefinitionMemberRef overrides) {
236
 		private void functional(FunctionalMember member, DefinitionMemberRef overrides) {
203
 			for (MemberAnnotation annotation : overrides.getAnnotations())
237
 			for (MemberAnnotation annotation : overrides.getAnnotations())
204
 				annotation.applyOnOverridingMethod(member, scope);
238
 				annotation.applyOnOverridingMethod(member, scope);
207
 				functional(member, overrides.getOverrides());
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 Ver arquivo

6
 package org.openzen.zenscript.codemodel.annotations;
6
 package org.openzen.zenscript.codemodel.annotations;
7
 
7
 
8
 import org.openzen.zenscript.codemodel.member.FunctionalMember;
8
 import org.openzen.zenscript.codemodel.member.FunctionalMember;
9
+import org.openzen.zenscript.codemodel.member.GetterMember;
9
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
10
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
11
+import org.openzen.zenscript.codemodel.member.SetterMember;
10
 import org.openzen.zenscript.codemodel.scope.BaseScope;
12
 import org.openzen.zenscript.codemodel.scope.BaseScope;
11
 
13
 
12
 /**
14
 /**
19
 	public void apply(IDefinitionMember member, BaseScope scope);
21
 	public void apply(IDefinitionMember member, BaseScope scope);
20
 	
22
 	
21
 	public void applyOnOverridingMethod(FunctionalMember member, BaseScope scope);
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 Ver arquivo

6
 package org.openzen.zenscript.codemodel.annotations;
6
 package org.openzen.zenscript.codemodel.annotations;
7
 
7
 
8
 import org.openzen.zenscript.codemodel.member.FunctionalMember;
8
 import org.openzen.zenscript.codemodel.member.FunctionalMember;
9
+import org.openzen.zenscript.codemodel.member.GetterMember;
9
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
10
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
11
+import org.openzen.zenscript.codemodel.member.SetterMember;
10
 import org.openzen.zenscript.codemodel.scope.BaseScope;
12
 import org.openzen.zenscript.codemodel.scope.BaseScope;
11
 
13
 
12
 /**
14
 /**
29
 	public void applyOnOverridingMethod(FunctionalMember member, BaseScope scope) {
31
 	public void applyOnOverridingMethod(FunctionalMember member, BaseScope scope) {
30
 		// not inherited
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 Ver arquivo

12
 import org.openzen.zenscript.codemodel.expression.ExpressionBuilder;
12
 import org.openzen.zenscript.codemodel.expression.ExpressionBuilder;
13
 import org.openzen.zenscript.codemodel.expression.PanicExpression;
13
 import org.openzen.zenscript.codemodel.expression.PanicExpression;
14
 import org.openzen.zenscript.codemodel.member.FunctionalMember;
14
 import org.openzen.zenscript.codemodel.member.FunctionalMember;
15
+import org.openzen.zenscript.codemodel.member.GetterMember;
15
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
16
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
17
+import org.openzen.zenscript.codemodel.member.SetterMember;
16
 import org.openzen.zenscript.codemodel.scope.BaseScope;
18
 import org.openzen.zenscript.codemodel.scope.BaseScope;
17
 import org.openzen.zenscript.codemodel.scope.ExpressionScope;
19
 import org.openzen.zenscript.codemodel.scope.ExpressionScope;
18
 import org.openzen.zenscript.codemodel.statement.BlockStatement;
20
 import org.openzen.zenscript.codemodel.statement.BlockStatement;
44
 
46
 
45
 	@Override
47
 	@Override
46
 	public void apply(IDefinitionMember member, BaseScope scope) {
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
 	@Override
58
 	@Override
51
 	public void applyOnOverridingMethod(FunctionalMember member, BaseScope scope) {
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
 		ExpressionScope expressionScope = new ExpressionScope(scope, BasicTypeID.BOOL);
77
 		ExpressionScope expressionScope = new ExpressionScope(scope, BasicTypeID.BOOL);
56
 		List<Statement> statements = new ArrayList<>();
78
 		List<Statement> statements = new ArrayList<>();
58
 		Expression inverseCondition = expressionBuilder.not(condition);
80
 		Expression inverseCondition = expressionBuilder.not(condition);
59
 		Statement throwStatement = new ExpressionStatement(position, new PanicExpression(position, BasicTypeID.VOID, message));
81
 		Statement throwStatement = new ExpressionStatement(position, new PanicExpression(position, BasicTypeID.VOID, message));
60
 		statements.add(new IfStatement(position, inverseCondition, throwStatement, null));
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
 		} else {
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 Ver arquivo

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

+ 0
- 26
CodeModel/src/main/java/org/openzen/zenscript/codemodel/iterator/ForeachIteratorVisitor.java Ver arquivo

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 Ver arquivo

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

+ 15
- 18
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/GetterMember.java Ver arquivo

6
 package org.openzen.zenscript.codemodel.member;
6
 package org.openzen.zenscript.codemodel.member;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zencode.shared.ConcatMap;
9
 import org.openzen.zenscript.codemodel.FunctionHeader;
10
 import org.openzen.zenscript.codemodel.FunctionHeader;
10
 import org.openzen.zenscript.codemodel.GenericMapper;
11
 import org.openzen.zenscript.codemodel.GenericMapper;
11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
 import org.openzen.zenscript.codemodel.member.ref.GetterMemberRef;
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
 import org.openzen.zenscript.codemodel.statement.Statement;
16
 import org.openzen.zenscript.codemodel.statement.Statement;
14
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
17
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
15
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
18
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
21
  *
24
  *
22
  * @author Hoofdgebruiker
25
  * @author Hoofdgebruiker
23
  */
26
  */
24
-public class GetterMember extends FunctionalMember implements IPropertyMember {
27
+public class GetterMember extends PropertyMember {
25
 	public final String name;
28
 	public final String name;
26
-	public ITypeID type;
27
 	private GetterMemberRef overrides;
29
 	private GetterMemberRef overrides;
30
+	public Statement body = null;
28
 	
31
 	
29
 	public GetterMember(
32
 	public GetterMember(
30
 			CodePosition position,
33
 			CodePosition position,
33
 			String name,
36
 			String name,
34
 			ITypeID type,
37
 			ITypeID type,
35
 			BuiltinID builtin) {
38
 			BuiltinID builtin) {
36
-		super(position, definition, modifiers, new FunctionHeader(type), builtin);
39
+		super(position, definition, modifiers, type, builtin);
37
 		
40
 		
38
 		this.name = name;
41
 		this.name = name;
39
-		this.type = type;
40
 	}
42
 	}
41
 	
43
 	
42
-	@Override
43
 	public void setBody(Statement body) {
44
 	public void setBody(Statement body) {
44
-		super.setBody(body);
45
+		this.body = body;
45
 		
46
 		
46
 		if (type == BasicTypeID.UNDETERMINED)
47
 		if (type == BasicTypeID.UNDETERMINED)
47
 			type = body.getReturnType();
48
 			type = body.getReturnType();
48
 	}
49
 	}
49
 	
50
 	
50
 	@Override
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
 	@Override
56
 	@Override
81
 	public GetterMemberRef getOverrides() {
72
 	public GetterMemberRef getOverrides() {
82
 		return overrides;
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
 	public void setOverrides(GetterMemberRef override) {
82
 	public void setOverrides(GetterMemberRef override) {
86
 		this.overrides = override;
83
 		this.overrides = override;

+ 0
- 21
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/IIteratorMember.java Ver arquivo

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 Ver arquivo

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 Ver arquivo

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

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/MemberVisitor.java Ver arquivo

28
 	
28
 	
29
 	public T visitCaster(CasterMember member);
29
 	public T visitCaster(CasterMember member);
30
 	
30
 	
31
-	public T visitCustomIterator(CustomIteratorMember member);
31
+	public T visitCustomIterator(IteratorMember member);
32
 	
32
 	
33
 	public T visitCaller(CallerMember member);
33
 	public T visitCaller(CallerMember member);
34
 	
34
 	

+ 6
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/PropertyMember.java Ver arquivo

14
  *
14
  *
15
  * @author Hoofdgebruiker
15
  * @author Hoofdgebruiker
16
  */
16
  */
17
-public abstract class PropertyMember extends DefinitionMember implements IPropertyMember {
17
+public abstract class PropertyMember extends DefinitionMember {
18
 	public ITypeID type;
18
 	public ITypeID type;
19
 	public final BuiltinID builtin;
19
 	public final BuiltinID builtin;
20
 	
20
 	
25
 		this.builtin = builtin;
25
 		this.builtin = builtin;
26
 	}
26
 	}
27
 	
27
 	
28
-	@Override
29
 	public ITypeID getType() {
28
 	public ITypeID getType() {
30
 		return type;
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 Ver arquivo

14
 import org.openzen.zenscript.codemodel.member.ref.SetterMemberRef;
14
 import org.openzen.zenscript.codemodel.member.ref.SetterMemberRef;
15
 import org.openzen.zenscript.codemodel.scope.TypeScope;
15
 import org.openzen.zenscript.codemodel.scope.TypeScope;
16
 import org.openzen.zenscript.codemodel.statement.LoopStatement;
16
 import org.openzen.zenscript.codemodel.statement.LoopStatement;
17
+import org.openzen.zenscript.codemodel.statement.Statement;
17
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
18
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
18
 import org.openzen.zenscript.codemodel.type.ITypeID;
19
 import org.openzen.zenscript.codemodel.type.ITypeID;
19
 import org.openzen.zenscript.codemodel.type.member.BuiltinID;
20
 import org.openzen.zenscript.codemodel.type.member.BuiltinID;
24
  *
25
  *
25
  * @author Hoofdgebruiker
26
  * @author Hoofdgebruiker
26
  */
27
  */
27
-public class SetterMember extends FunctionalMember implements IPropertyMember {
28
-	public ITypeID type;
28
+public class SetterMember extends PropertyMember {
29
 	public final String name;
29
 	public final String name;
30
 	private SetterMemberRef overrides;
30
 	private SetterMemberRef overrides;
31
+	public Statement body;
32
+	public final FunctionParameter parameter;
31
 	
33
 	
32
 	public SetterMember(
34
 	public SetterMember(
33
 			CodePosition position,
35
 			CodePosition position,
40
 		super(position,
42
 		super(position,
41
 				definition,
43
 				definition,
42
 				modifiers,
44
 				modifiers,
43
-				new FunctionHeader(BasicTypeID.VOID, new FunctionParameter(type, "$")),
45
+				type,
44
 				builtin);
46
 				builtin);
45
 		
47
 		
46
-		this.type = type;
47
 		this.name = name;
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
 	@Override
56
 	@Override
88
 			body = body.normalize(scope, ConcatMap.empty(LoopStatement.class, LoopStatement.class));
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
 	public void setOverrides(SetterMemberRef overrides) {
87
 	public void setOverrides(SetterMemberRef overrides) {
92
 		this.overrides = overrides;
88
 		this.overrides = overrides;
93
 		
89
 		

+ 4
- 11
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/StaticInitializerMember.java Ver arquivo

7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
 import org.openzen.zencode.shared.ConcatMap;
9
 import org.openzen.zencode.shared.ConcatMap;
10
-import org.openzen.zencode.shared.Taggable;
11
 import org.openzen.zenscript.codemodel.GenericMapper;
10
 import org.openzen.zenscript.codemodel.GenericMapper;
11
+import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
 import org.openzen.zenscript.codemodel.annotations.MemberAnnotation;
12
 import org.openzen.zenscript.codemodel.annotations.MemberAnnotation;
13
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
13
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
14
 import org.openzen.zenscript.codemodel.scope.TypeScope;
14
 import org.openzen.zenscript.codemodel.scope.TypeScope;
22
  *
22
  *
23
  * @author Hoofdgebruiker
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
 	public Statement body;
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
 	@Override
32
 	@Override

+ 0
- 95
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/builtin/ArrayIteratorKeyValues.java Ver arquivo

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 Ver arquivo

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 Ver arquivo

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 Ver arquivo

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 Ver arquivo

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 Ver arquivo

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

+ 5
- 6
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/IteratorMemberRef.java Ver arquivo

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

+ 3
- 3
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/PropertyRef.java Ver arquivo

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

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/SetterMemberRef.java Ver arquivo

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

+ 8
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/member/BuiltinID.java Ver arquivo

444
 	
444
 	
445
 	OPTIONAL_IS_NULL,
445
 	OPTIONAL_IS_NULL,
446
 	OPTIONAL_IS_NOT_NULL,
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 Ver arquivo

47
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
47
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
48
 import org.openzen.zenscript.codemodel.member.MethodMember;
48
 import org.openzen.zenscript.codemodel.member.MethodMember;
49
 import org.openzen.zenscript.codemodel.member.OperatorMember;
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
 import org.openzen.zenscript.codemodel.member.ref.CasterMemberRef;
50
 import org.openzen.zenscript.codemodel.member.ref.CasterMemberRef;
56
 import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
51
 import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
57
 import org.openzen.zenscript.codemodel.member.ref.TranslatedOperatorMemberRef;
52
 import org.openzen.zenscript.codemodel.member.ref.TranslatedOperatorMemberRef;
74
 import org.openzen.zencode.shared.CompileException;
69
 import org.openzen.zencode.shared.CompileException;
75
 import org.openzen.zencode.shared.CompileExceptionCode;
70
 import org.openzen.zencode.shared.CompileExceptionCode;
76
 import org.openzen.zenscript.codemodel.definition.InterfaceDefinition;
71
 import org.openzen.zenscript.codemodel.definition.InterfaceDefinition;
72
+import org.openzen.zenscript.codemodel.member.IteratorMember;
77
 
73
 
78
 /**
74
 /**
79
  *
75
  *
286
 
282
 
287
 		getter(definition, ARRAY_ISEMPTY, "isEmpty", BOOL);
283
 		getter(definition, ARRAY_ISEMPTY, "isEmpty", BOOL);
288
 		getter(definition, ARRAY_HASHCODE, "objectHashCode", INT);
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
 		equals(definition, ARRAY_EQUALS, array);
288
 		equals(definition, ARRAY_EQUALS, array);
293
 		notequals(definition, ARRAY_NOTEQUALS, array);
289
 		notequals(definition, ARRAY_NOTEQUALS, array);
324
 		getter(builtin, BuiltinID.ASSOC_VALUES, "values", cache.getRegistry().getArray(valueType, 1));
320
 		getter(builtin, BuiltinID.ASSOC_VALUES, "values", cache.getRegistry().getArray(valueType, 1));
325
 		getter(builtin, BuiltinID.ASSOC_HASHCODE, "objectHashCode", BasicTypeID.INT);
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
 		equals(builtin, BuiltinID.ASSOC_EQUALS, assoc);
326
 		equals(builtin, BuiltinID.ASSOC_EQUALS, assoc);
330
 		notequals(builtin, BuiltinID.ASSOC_NOTEQUALS, assoc);
327
 		notequals(builtin, BuiltinID.ASSOC_NOTEQUALS, assoc);
499
 		ClassDefinition definition = new ClassDefinition(BUILTIN, null, "", Modifiers.EXPORT);
496
 		ClassDefinition definition = new ClassDefinition(BUILTIN, null, "", Modifiers.EXPORT);
500
 		getter(definition, RANGE_FROM, "from", fromType);
497
 		getter(definition, RANGE_FROM, "from", fromType);
501
 		getter(definition, RANGE_TO, "to", toType);
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
 				|| range.from == SBYTE
501
 				|| range.from == SBYTE
504
 				|| range.from == SHORT
502
 				|| range.from == SHORT
505
 				|| range.from == USHORT
503
 				|| range.from == USHORT
507
 				|| range.from == UINT
505
 				|| range.from == UINT
508
 				|| range.from == LONG
506
 				|| range.from == LONG
509
 				|| range.from == ULONG)) {
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
 		processType(definition, range);
512
 		processType(definition, range);
1116
 		method(builtin, STRING_TO_LOWER_CASE, "toLowerCase", STRING);
1115
 		method(builtin, STRING_TO_LOWER_CASE, "toLowerCase", STRING);
1117
 		method(builtin, STRING_TO_UPPER_CASE, "toUpperCase", STRING);
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
 		processType(builtin, STRING);
1120
 		processType(builtin, STRING);
1122
 	}
1121
 	}
1557
 				new FunctionHeader(BOOL, new FunctionParameter(type)),
1556
 				new FunctionHeader(BOOL, new FunctionParameter(type)),
1558
 				id).registerTo(members, TypeMemberPriority.SPECIFIED, null);
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 Ver arquivo

1
 package org.openzen.zenscript.javabytecode.compiler;
1
 package org.openzen.zenscript.javabytecode.compiler;
2
 
2
 
3
 import org.objectweb.asm.Label;
3
 import org.objectweb.asm.Label;
4
-import org.openzen.zenscript.codemodel.iterator.ForeachIteratorVisitor;
5
 import org.openzen.zenscript.codemodel.statement.Statement;
4
 import org.openzen.zenscript.codemodel.statement.Statement;
6
 import org.openzen.zenscript.codemodel.statement.VarStatement;
5
 import org.openzen.zenscript.codemodel.statement.VarStatement;
7
 import org.openzen.zenscript.javabytecode.JavaLocalVariableInfo;
6
 import org.openzen.zenscript.javabytecode.JavaLocalVariableInfo;
8
 
7
 
9
-public class JavaForeachVisitor implements ForeachIteratorVisitor<Void> {
8
+public class JavaForeachWriter {
10
 
9
 
11
 	private final JavaWriter javaWriter;
10
 	private final JavaWriter javaWriter;
12
 	private final VarStatement[] variables;
11
 	private final VarStatement[] variables;
15
 	private final Label endLabel;
14
 	private final Label endLabel;
16
 	private final JavaStatementVisitor statementVisitor;
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
 		this.statementVisitor = statementVisitor;
18
 		this.statementVisitor = statementVisitor;
20
 		this.javaWriter = statementVisitor.getJavaWriter();
19
 		this.javaWriter = statementVisitor.getJavaWriter();
21
 		this.variables = variables;
20
 		this.variables = variables;
23
 		this.startLabel = start;
22
 		this.startLabel = start;
24
 		this.endLabel = end;
23
 		this.endLabel = end;
25
 	}
24
 	}
26
-
27
-	@Override
28
-	public Void visitIntRange() {
25
+	
26
+	public void visitIntRange() {
29
 		javaWriter.dup();
27
 		javaWriter.dup();
30
 		javaWriter.getField("zsynthetic/IntRange", "to", "I");
28
 		javaWriter.getField("zsynthetic/IntRange", "to", "I");
31
 		javaWriter.swap();
29
 		javaWriter.swap();
40
 
38
 
41
 		content.accept(statementVisitor);
39
 		content.accept(statementVisitor);
42
 		javaWriter.iinc(z);
40
 		javaWriter.iinc(z);
43
-
44
-
45
-		return null;
46
 	}
41
 	}
47
 
42
 
48
-	@Override
49
-	public Void visitArrayValueIterator() {
43
+	public void visitArrayValueIterator() {
50
 		handleArray(javaWriter.local(int.class), variables[0].getTag(JavaLocalVariableInfo.class));
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
 		handleArray(variables[0].getTag(JavaLocalVariableInfo.class).local, variables[1].getTag(JavaLocalVariableInfo.class));
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
 		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
52
 		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
64
 	}
53
 	}
65
 
54
 
83
 		javaWriter.iinc(z);
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
 		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
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
 		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
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 Ver arquivo

108
         }
108
         }
109
 
109
 
110
 		//javaWriter.label(min);
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
 		javaWriter.goTo(start);
139
 		javaWriter.goTo(start);
113
 		javaWriter.label(end);
140
 		javaWriter.label(end);
114
 		return false;
141
 		return false;

+ 1
- 1
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/definitions/JavaMemberVisitor.java Ver arquivo

164
 	}
164
 	}
165
 
165
 
166
 	@Override
166
 	@Override
167
-	public Void visitCustomIterator(CustomIteratorMember member) {
167
+	public Void visitCustomIterator(IteratorMember member) {
168
 		return null;
168
 		return null;
169
 	}
169
 	}
170
 
170
 

+ 17
- 16
JavaShared/src/main/java/org/openzen/zenscript/javashared/prepare/JavaPrepareClassMethodVisitor.java Ver arquivo

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

+ 15
- 14
JavaShared/src/main/java/org/openzen/zenscript/javashared/prepare/JavaPrepareExpansionMethodVisitor.java Ver arquivo

7
 
7
 
8
 import org.openzen.zenscript.javashared.JavaNativeClass;
8
 import org.openzen.zenscript.javashared.JavaNativeClass;
9
 import org.openzen.zencode.shared.StringExpansion;
9
 import org.openzen.zencode.shared.StringExpansion;
10
+import org.openzen.zenscript.codemodel.FunctionHeader;
10
 import org.openzen.zenscript.codemodel.OperatorType;
11
 import org.openzen.zenscript.codemodel.OperatorType;
11
 import org.openzen.zenscript.codemodel.annotations.NativeTag;
12
 import org.openzen.zenscript.codemodel.annotations.NativeTag;
12
 import org.openzen.zenscript.codemodel.member.CallerMember;
13
 import org.openzen.zenscript.codemodel.member.CallerMember;
13
 import org.openzen.zenscript.codemodel.member.CasterMember;
14
 import org.openzen.zenscript.codemodel.member.CasterMember;
14
 import org.openzen.zenscript.codemodel.member.ConstMember;
15
 import org.openzen.zenscript.codemodel.member.ConstMember;
15
 import org.openzen.zenscript.codemodel.member.ConstructorMember;
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
 import org.openzen.zenscript.codemodel.member.DefinitionMember;
18
 import org.openzen.zenscript.codemodel.member.DefinitionMember;
18
 import org.openzen.zenscript.codemodel.member.DestructorMember;
19
 import org.openzen.zenscript.codemodel.member.DestructorMember;
19
 import org.openzen.zenscript.codemodel.member.FieldMember;
20
 import org.openzen.zenscript.codemodel.member.FieldMember;
20
-import org.openzen.zenscript.codemodel.member.FunctionalMember;
21
 import org.openzen.zenscript.codemodel.member.GetterMember;
21
 import org.openzen.zenscript.codemodel.member.GetterMember;
22
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
22
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
23
 import org.openzen.zenscript.codemodel.member.ImplementationMember;
23
 import org.openzen.zenscript.codemodel.member.ImplementationMember;
27
 import org.openzen.zenscript.codemodel.member.OperatorMember;
27
 import org.openzen.zenscript.codemodel.member.OperatorMember;
28
 import org.openzen.zenscript.codemodel.member.SetterMember;
28
 import org.openzen.zenscript.codemodel.member.SetterMember;
29
 import org.openzen.zenscript.codemodel.member.StaticInitializerMember;
29
 import org.openzen.zenscript.codemodel.member.StaticInitializerMember;
30
+import org.openzen.zenscript.codemodel.type.BasicTypeID;
30
 import org.openzen.zenscript.codemodel.type.GenericTypeID;
31
 import org.openzen.zenscript.codemodel.type.GenericTypeID;
31
 import org.openzen.zenscript.javashared.JavaTypeNameVisitor;
32
 import org.openzen.zenscript.javashared.JavaTypeNameVisitor;
32
 import org.openzen.zenscript.javashared.JavaClass;
33
 import org.openzen.zenscript.javashared.JavaClass;
76
 
77
 
77
 	@Override
78
 	@Override
78
 	public Void visitConstructor(ConstructorMember member) {
79
 	public Void visitConstructor(ConstructorMember member) {
79
-		visitFunctional(member, "");
80
+		visitFunctional(member, member.header, "");
80
 		return null;
81
 		return null;
81
 	}
82
 	}
82
 
83
 
85
 		if (nativeClass != null && nativeClass.nonDestructible)
86
 		if (nativeClass != null && nativeClass.nonDestructible)
86
 			return null;
87
 			return null;
87
 		
88
 		
88
-		visitFunctional(member, "");
89
+		visitFunctional(member, member.header, "");
89
 		return null;
90
 		return null;
90
 	}
91
 	}
91
 
92
 
92
 	@Override
93
 	@Override
93
 	public Void visitMethod(MethodMember member) {
94
 	public Void visitMethod(MethodMember member) {
94
-		visitFunctional(member, member.name);
95
+		visitFunctional(member, member.header, member.name);
95
 		return null;
96
 		return null;
96
 	}
97
 	}
97
 
98
 
98
 	@Override
99
 	@Override
99
 	public Void visitGetter(GetterMember member) {
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
 		return null;
102
 		return null;
102
 	}
103
 	}
103
 
104
 
104
 	@Override
105
 	@Override
105
 	public Void visitSetter(SetterMember member) {
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
 		return null;
108
 		return null;
108
 	}
109
 	}
109
 
110
 
110
 	@Override
111
 	@Override
111
 	public Void visitOperator(OperatorMember member) {
112
 	public Void visitOperator(OperatorMember member) {
112
-		visitFunctional(member, getOperatorName(member.operator));
113
+		visitFunctional(member, member.header, getOperatorName(member.operator));
113
 		return null;
114
 		return null;
114
 	}
115
 	}
115
 
116
 
116
 	@Override
117
 	@Override
117
 	public Void visitCaster(CasterMember member) {
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
 		return null;
120
 		return null;
120
 	}
121
 	}
121
 
122
 
122
 	@Override
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
 		return null;
126
 		return null;
126
 	}
127
 	}
127
 
128
 
128
 	@Override
129
 	@Override
129
 	public Void visitCaller(CallerMember member) {
130
 	public Void visitCaller(CallerMember member) {
130
-		visitFunctional(member, "call");
131
+		visitFunctional(member, member.header, "call");
131
 		return null;
132
 		return null;
132
 	}
133
 	}
133
 
134
 
154
 		return null;
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
 		NativeTag nativeTag = member.getTag(NativeTag.class);
159
 		NativeTag nativeTag = member.getTag(NativeTag.class);
159
 		JavaMethod method = null;
160
 		JavaMethod method = null;
160
 		if (nativeTag != null && nativeClass != null)
161
 		if (nativeTag != null && nativeClass != null)
161
 			method = nativeClass.getMethod(nativeTag.value);
162
 			method = nativeClass.getMethod(nativeTag.value);
162
 		if (method == null)
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
 		if (method.compile) {
166
 		if (method.compile) {
166
 			if (DEBUG_EMPTY && cls.empty)
167
 			if (DEBUG_EMPTY && cls.empty)

+ 3
- 3
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaExpansionMemberCompiler.java Ver arquivo

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

+ 3
- 3
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaMemberCompiler.java Ver arquivo

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

+ 92
- 89
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceStatementFormatter.java Ver arquivo

18
 import org.openzen.zenscript.codemodel.expression.switchvalue.StringSwitchValue;
18
 import org.openzen.zenscript.codemodel.expression.switchvalue.StringSwitchValue;
19
 import org.openzen.zenscript.codemodel.expression.switchvalue.SwitchValueVisitor;
19
 import org.openzen.zenscript.codemodel.expression.switchvalue.SwitchValueVisitor;
20
 import org.openzen.zenscript.codemodel.expression.switchvalue.VariantOptionSwitchValue;
20
 import org.openzen.zenscript.codemodel.expression.switchvalue.VariantOptionSwitchValue;
21
-import org.openzen.zenscript.codemodel.iterator.ForeachIteratorVisitor;
22
 import org.openzen.zenscript.codemodel.statement.BlockStatement;
21
 import org.openzen.zenscript.codemodel.statement.BlockStatement;
23
 import org.openzen.zenscript.codemodel.statement.BreakStatement;
22
 import org.openzen.zenscript.codemodel.statement.BreakStatement;
24
 import org.openzen.zenscript.codemodel.statement.CatchClause;
23
 import org.openzen.zenscript.codemodel.statement.CatchClause;
100
 
99
 
101
 	@Override
100
 	@Override
102
 	public void formatForeach(StatementFormattingTarget target, ForeachStatement statement) {
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
 	@Override
131
 	@Override
230
 		return value.option.getName();
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
 			target.writeInner(
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
 					statement.content,
267
 					statement.content,
273
 					statement,
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
 			target.writeInner(
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
 					statement.content,
274
 					statement.content,
288
 					statement,
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
 					statement.content,
304
 					statement.content,
315
 					statement,
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 Ver arquivo

108
 				.append(result.cls.getName())
108
 				.append(result.cls.getName())
109
 				.append("(")
109
 				.append("(")
110
 				.append(type.from.accept(typeVisitor))
110
 				.append(type.from.accept(typeVisitor))
111
-				.append(", ")
111
+				.append(" from, ")
112
 				.append(type.to.accept(typeVisitor))
112
 				.append(type.to.accept(typeVisitor))
113
-				.append(") {\n");
113
+				.append(" to) {\n");
114
 		contents.append(settings.indent).append(settings.indent).append("this.from = from;\n");
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
 		contents.append(settings.indent).append("}\n");
116
 		contents.append(settings.indent).append("}\n");
117
 		contents.append("}\n");
117
 		contents.append("}\n");
118
 		
118
 		

+ 14
- 1
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceTypeVisitor.java Ver arquivo

152
 
152
 
153
 	@Override
153
 	@Override
154
 	public String visitRange(RangeTypeID range) {
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
 	@Override
171
 	@Override

+ 51
- 14
Parser/src/main/java/org/openzen/zenscript/parser/member/ParsedGetter.java Ver arquivo

6
 package org.openzen.zenscript.parser.member;
6
 package org.openzen.zenscript.parser.member;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
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
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
13
+import org.openzen.zenscript.codemodel.Modifiers;
10
 import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
14
 import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
11
-import org.openzen.zenscript.codemodel.member.FunctionalMember;
12
 import org.openzen.zenscript.codemodel.member.GetterMember;
15
 import org.openzen.zenscript.codemodel.member.GetterMember;
13
 import org.openzen.zenscript.codemodel.scope.BaseScope;
16
 import org.openzen.zenscript.codemodel.scope.BaseScope;
17
+import org.openzen.zenscript.codemodel.scope.FunctionScope;
14
 import org.openzen.zenscript.codemodel.scope.TypeScope;
18
 import org.openzen.zenscript.codemodel.scope.TypeScope;
19
+import org.openzen.zenscript.codemodel.type.BasicTypeID;
15
 import org.openzen.zenscript.codemodel.type.ITypeID;
20
 import org.openzen.zenscript.codemodel.type.ITypeID;
16
 import org.openzen.zenscript.parser.ParsedAnnotation;
21
 import org.openzen.zenscript.parser.ParsedAnnotation;
17
-import org.openzen.zenscript.parser.PrecompilationState;
18
 import org.openzen.zenscript.parser.statements.ParsedFunctionBody;
22
 import org.openzen.zenscript.parser.statements.ParsedFunctionBody;
19
 import org.openzen.zenscript.parser.type.IParsedType;
23
 import org.openzen.zenscript.parser.type.IParsedType;
20
-import org.openzen.zenscript.parser.type.ParsedTypeBasic;
21
 
24
 
22
 /**
25
 /**
23
  *
26
  *
24
  * @author Hoofdgebruiker
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
 	private final String name;
35
 	private final String name;
28
 	private final IParsedType type;
36
 	private final IParsedType type;
29
 	private GetterMember compiled;
37
 	private GetterMember compiled;
38
+	private boolean isCompiled = false;
30
 	
39
 	
31
 	public ParsedGetter(
40
 	public ParsedGetter(
32
 			CodePosition position,
41
 			CodePosition position,
38
 			IParsedType type,
47
 			IParsedType type,
39
 			ParsedFunctionBody body)
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
 		this.name = name;
57
 		this.name = name;
44
 		this.type = type;
58
 		this.type = type;
48
 	public void linkTypes(TypeResolutionContext context) {
62
 	public void linkTypes(TypeResolutionContext context) {
49
 		compiled = new GetterMember(position, definition, modifiers, name, type.compile(context), null);
63
 		compiled = new GetterMember(position, definition, modifiers, name, type.compile(context), null);
50
 	}
64
 	}
51
-
65
+	
52
 	@Override
66
 	@Override
53
-	public FunctionalMember getCompiled() {
67
+	public GetterMember getCompiled() {
54
 		return compiled;
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
 		compiled.setOverrides(scope.getTypeMembers(baseType).getOrCreateGroup(name, false).getGetter());
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 Ver arquivo

9
 import org.openzen.zenscript.codemodel.FunctionHeader;
9
 import org.openzen.zenscript.codemodel.FunctionHeader;
10
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
10
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
11
 import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
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
 import org.openzen.zenscript.codemodel.type.ITypeID;
13
 import org.openzen.zenscript.codemodel.type.ITypeID;
14
 import org.openzen.zenscript.codemodel.scope.BaseScope;
14
 import org.openzen.zenscript.codemodel.scope.BaseScope;
15
 import org.openzen.zenscript.codemodel.scope.FunctionScope;
15
 import org.openzen.zenscript.codemodel.scope.FunctionScope;
29
 	private final ParsedFunctionHeader header;
29
 	private final ParsedFunctionHeader header;
30
 	private final ParsedFunctionBody body;
30
 	private final ParsedFunctionBody body;
31
 	
31
 	
32
-	private CustomIteratorMember compiled;
32
+	private IteratorMember compiled;
33
 	
33
 	
34
 	public ParsedIterator(
34
 	public ParsedIterator(
35
 			CodePosition position,
35
 			CodePosition position,
53
 		for (int i = 0; i < loopVariableTypes.length; i++)
53
 		for (int i = 0; i < loopVariableTypes.length; i++)
54
 			loopVariableTypes[i] = header.parameters.get(i).type.compile(context);
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
 	@Override
59
 	@Override
60
-	public CustomIteratorMember getCompiled() {
60
+	public IteratorMember getCompiled() {
61
 		return compiled;
61
 		return compiled;
62
 	}
62
 	}
63
 
63
 

+ 48
- 5
Parser/src/main/java/org/openzen/zenscript/parser/member/ParsedSetter.java Ver arquivo

6
 package org.openzen.zenscript.parser.member;
6
 package org.openzen.zenscript.parser.member;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
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
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
13
+import org.openzen.zenscript.codemodel.Modifiers;
10
 import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
14
 import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
11
 import org.openzen.zenscript.codemodel.member.SetterMember;
15
 import org.openzen.zenscript.codemodel.member.SetterMember;
12
 import org.openzen.zenscript.codemodel.scope.BaseScope;
16
 import org.openzen.zenscript.codemodel.scope.BaseScope;
17
+import org.openzen.zenscript.codemodel.scope.FunctionScope;
13
 import org.openzen.zenscript.codemodel.scope.TypeScope;
18
 import org.openzen.zenscript.codemodel.scope.TypeScope;
14
 import org.openzen.zenscript.codemodel.type.ITypeID;
19
 import org.openzen.zenscript.codemodel.type.ITypeID;
15
 import org.openzen.zenscript.parser.ParsedAnnotation;
20
 import org.openzen.zenscript.parser.ParsedAnnotation;
16
-import org.openzen.zenscript.parser.PrecompilationState;
17
 import org.openzen.zenscript.parser.statements.ParsedFunctionBody;
21
 import org.openzen.zenscript.parser.statements.ParsedFunctionBody;
18
 import org.openzen.zenscript.parser.type.IParsedType;
22
 import org.openzen.zenscript.parser.type.IParsedType;
19
 
23
 
21
  *
25
  *
22
  * @author Hoofdgebruiker
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
 	private final String name;
34
 	private final String name;
26
 	private final IParsedType type;
35
 	private final IParsedType type;
27
 	private SetterMember compiled;
36
 	private SetterMember compiled;
37
+	private boolean isCompiled = false;
28
 	
38
 	
29
 	public ParsedSetter(
39
 	public ParsedSetter(
30
 			CodePosition position,
40
 			CodePosition position,
36
 			IParsedType type,
46
 			IParsedType type,
37
 			ParsedFunctionBody body)
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
 		this.name = name;
56
 		this.name = name;
42
 		this.type = type;
57
 		this.type = type;
51
 	public SetterMember getCompiled() {
66
 	public SetterMember getCompiled() {
52
 		return compiled;
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
 		compiled.setOverrides(scope.getTypeMembers(baseType).getOrCreateGroup(name, true).getSetter());
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 Ver arquivo

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

+ 28
- 10
Validator/src/main/java/org/openzen/zenscript/validator/visitors/DefinitionMemberValidator.java Ver arquivo

16
 import org.openzen.zenscript.codemodel.member.CasterMember;
16
 import org.openzen.zenscript.codemodel.member.CasterMember;
17
 import org.openzen.zenscript.codemodel.member.ConstMember;
17
 import org.openzen.zenscript.codemodel.member.ConstMember;
18
 import org.openzen.zenscript.codemodel.member.ConstructorMember;
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
 import org.openzen.zenscript.codemodel.member.DestructorMember;
21
 import org.openzen.zenscript.codemodel.member.DestructorMember;
21
 import org.openzen.zenscript.codemodel.member.EnumConstantMember;
22
 import org.openzen.zenscript.codemodel.member.EnumConstantMember;
22
 import org.openzen.zenscript.codemodel.member.FieldMember;
23
 import org.openzen.zenscript.codemodel.member.FieldMember;
28
 import org.openzen.zenscript.codemodel.member.MemberVisitor;
29
 import org.openzen.zenscript.codemodel.member.MemberVisitor;
29
 import org.openzen.zenscript.codemodel.member.MethodMember;
30
 import org.openzen.zenscript.codemodel.member.MethodMember;
30
 import org.openzen.zenscript.codemodel.member.OperatorMember;
31
 import org.openzen.zenscript.codemodel.member.OperatorMember;
32
+import org.openzen.zenscript.codemodel.member.PropertyMember;
31
 import org.openzen.zenscript.codemodel.member.SetterMember;
33
 import org.openzen.zenscript.codemodel.member.SetterMember;
32
 import org.openzen.zenscript.codemodel.member.StaticInitializerMember;
34
 import org.openzen.zenscript.codemodel.member.StaticInitializerMember;
33
 import org.openzen.zenscript.codemodel.scope.TypeScope;
35
 import org.openzen.zenscript.codemodel.scope.TypeScope;
36
+import org.openzen.zenscript.codemodel.statement.Statement;
34
 import org.openzen.zenscript.codemodel.statement.VarStatement;
37
 import org.openzen.zenscript.codemodel.statement.VarStatement;
35
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
38
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
36
 import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
39
 import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
117
 		} else {
120
 		} else {
118
 			StatementValidator statementValidator = new StatementValidator(validator, new ConstructorStatementScope(member.header));
121
 			StatementValidator statementValidator = new StatementValidator(validator, new ConstructorStatementScope(member.header));
119
 			member.body.accept(statementValidator);
122
 			member.body.accept(statementValidator);
120
-			validateThrow(member);
123
+			validateThrow(member, member.header, member.body);
121
 			
124
 			
122
 			if (member.definition.getSuperType() != null && !statementValidator.constructorForwarded) {
125
 			if (member.definition.getSuperType() != null && !statementValidator.constructorForwarded) {
123
 				validator.logError(ValidationLogEntry.Code.CONSTRUCTOR_FORWARD_MISSING, member.position, "Constructor not forwarded to base type");
126
 				validator.logError(ValidationLogEntry.Code.CONSTRUCTOR_FORWARD_MISSING, member.position, "Constructor not forwarded to base type");
152
 	public Void visitGetter(GetterMember member) {
155
 	public Void visitGetter(GetterMember member) {
153
 		ValidationUtils.validateIdentifier(validator, member.position, member.name);
156
 		ValidationUtils.validateIdentifier(validator, member.position, member.name);
154
 		member.type.accept(new TypeValidator(validator, member.position));
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
 		return null;
159
 		return null;
157
 	}
160
 	}
158
 
161
 
160
 	public Void visitSetter(SetterMember member) {
163
 	public Void visitSetter(SetterMember member) {
161
 		ValidationUtils.validateIdentifier(validator, member.position, member.name);
164
 		ValidationUtils.validateIdentifier(validator, member.position, member.name);
162
 		member.type.accept(new TypeValidator(validator, member.position));
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
 		return null;
167
 		return null;
165
 	}
168
 	}
166
 	
169
 	
191
 	}
194
 	}
192
 
195
 
193
 	@Override
196
 	@Override
194
-	public Void visitCustomIterator(CustomIteratorMember member) {
197
+	public Void visitCustomIterator(IteratorMember member) {
195
 		for (ITypeID type : member.getLoopVariableTypes())
198
 		for (ITypeID type : member.getLoopVariableTypes())
196
 			type.accept(new TypeValidator(validator, member.position));
199
 			type.accept(new TypeValidator(validator, member.position));
197
 		validateFunctional(member, new MethodStatementScope(new FunctionHeader(scope.getTypeRegistry().getIterator(member.getLoopVariableTypes()))));
200
 		validateFunctional(member, new MethodStatementScope(new FunctionHeader(scope.getTypeRegistry().getIterator(member.getLoopVariableTypes()))));
277
 		return null;
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
 			validator.logError(ValidationLogEntry.Code.THROW_WITHOUT_THROWS, member.position, "Method is throwing but doesn't declare throws type");
285
 			validator.logError(ValidationLogEntry.Code.THROW_WITHOUT_THROWS, member.position, "Method is throwing but doesn't declare throws type");
283
 	}
286
 	}
284
 	
287
 	
294
 		if (member.body != null) {
297
 		if (member.body != null) {
295
 			StatementValidator statementValidator = new StatementValidator(validator, scope);
298
 			StatementValidator statementValidator = new StatementValidator(validator, scope);
296
 			member.body.accept(statementValidator);
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
 		if (Modifiers.isOverride(member.modifiers) || (context == DefinitionMemberContext.IMPLEMENTATION && !member.isPrivate())) {
305
 		if (Modifiers.isOverride(member.modifiers) || (context == DefinitionMemberContext.IMPLEMENTATION && !member.isPrivate())) {
303
 			if (member.getOverrides() == null) {
306
 			if (member.getOverrides() == null) {
304
 				validator.logError(ValidationLogEntry.Code.OVERRIDE_MISSING_BASE, member.position, "Overridden method not identified");
307
 				validator.logError(ValidationLogEntry.Code.OVERRIDE_MISSING_BASE, member.position, "Overridden method not identified");
308
 		if (member.body != null) {
311
 		if (member.body != null) {
309
 			StatementValidator statementValidator = new StatementValidator(validator, scope);
312
 			StatementValidator statementValidator = new StatementValidator(validator, scope);
310
 			member.body.accept(statementValidator);
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
 	

Carregando…
Cancelar
Salvar