ソースを参照

Continue work on the deserializer and fix serialization and deserialization bugs

Stan Hebben 6年前
コミット
34f34fb5df
18個のファイルの変更552行の追加132行の削除
  1. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/serialization/DecodingOperation.java
  2. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/serialization/DeserializationException.java
  3. 0
    3
      IDE/src/main/java/org/openzen/zenscript/ide/Main.java
  4. 36
    15
      ModuleDeserializer/src/main/java/org/openzen/zenscript/moduledeserializer/CodeReader.java
  5. 2
    1
      ModuleDeserializer/src/main/java/org/openzen/zenscript/moduledeserializer/DecodingStage.java
  6. 311
    8
      ModuleDeserializer/src/main/java/org/openzen/zenscript/moduledeserializer/DefinitionMemberDeserializer.java
  7. 10
    1
      ModuleDeserializer/src/main/java/org/openzen/zenscript/moduledeserializer/DeserializingModule.java
  8. 1
    0
      ModuleDeserializer/src/main/java/org/openzen/zenscript/moduledeserializer/Main.java
  9. 95
    44
      ModuleDeserializer/src/main/java/org/openzen/zenscript/moduledeserializer/ModuleDeserializer.java
  10. 2
    0
      ModuleSerializationShared/src/main/java/org/openzen/zenscript/moduleserialization/MemberEncoding.java
  11. 25
    19
      ModuleSerializer/src/main/java/org/openzen/zenscript/moduleserializer/CodeWriter.java
  12. 6
    2
      ModuleSerializer/src/main/java/org/openzen/zenscript/moduleserializer/EncodingDefinition.java
  13. 1
    1
      ModuleSerializer/src/main/java/org/openzen/zenscript/moduleserializer/Main.java
  14. 18
    15
      ModuleSerializer/src/main/java/org/openzen/zenscript/moduleserializer/ModuleSerializer.java
  15. 11
    3
      ModuleSerializer/src/main/java/org/openzen/zenscript/moduleserializer/TableBuilder.java
  16. 1
    9
      ModuleSerializer/src/main/java/org/openzen/zenscript/moduleserializer/encoder/DefinitionMemberSerializer.java
  17. 8
    5
      ModuleSerializer/src/main/java/org/openzen/zenscript/moduleserializer/encoder/DefinitionSerializer.java
  18. 23
    4
      ModuleSerializer/src/main/java/org/openzen/zenscript/moduleserializer/encoder/MemberSerializer.java

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/serialization/DecodingOperation.java ファイルの表示

@@ -10,5 +10,5 @@ package org.openzen.zenscript.codemodel.serialization;
10 10
  * @author Hoofdgebruiker
11 11
  */
12 12
 public interface DecodingOperation {
13
-	void decode(CodeSerializationInput input);
13
+	void decode(CodeSerializationInput input) throws DeserializationException;
14 14
 }

ModuleDeserializer/src/main/java/org/openzen/zenscript/moduledeserializer/DeserializationException.java → CodeModel/src/main/java/org/openzen/zenscript/codemodel/serialization/DeserializationException.java ファイルの表示

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

+ 0
- 3
IDE/src/main/java/org/openzen/zenscript/ide/Main.java ファイルの表示

@@ -2,14 +2,11 @@ package org.openzen.zenscript.ide;
2 2
 
3 3
 import java.io.File;
4 4
 import java.io.IOException;
5
-import java.util.Arrays;
6 5
 import javax.swing.JFrame;
7 6
 import org.openzen.drawablegui.DUIWindow;
8 7
 import org.openzen.zenscript.ide.host.DevelopmentHost;
9 8
 import org.openzen.zenscript.ide.host.local.LocalProjectDevelopmentHost;
10 9
 import org.openzen.drawablegui.swing.SwingWindow;
11
-import org.openzen.zenscript.compiler.CompilationUnit;
12
-import org.openzen.zenscript.constructor.ModuleLoader;
13 10
 import org.openzen.zenscript.constructor.Project;
14 11
 import org.openzen.zenscript.ide.host.IDEPropertyDirectory;
15 12
 import org.openzen.zenscript.ide.host.IDEPropertyStore;

+ 36
- 15
ModuleDeserializer/src/main/java/org/openzen/zenscript/moduledeserializer/CodeReader.java ファイルの表示

@@ -158,22 +158,22 @@ public class CodeReader implements CodeSerializationInput {
158 158
 
159 159
 	@Override
160 160
 	public int readInt() {
161
-		return input.readInt();
161
+		return input.readVarInt();
162 162
 	}
163 163
 
164 164
 	@Override
165 165
 	public int readUInt() {
166
-		return input.readUInt();
166
+		return input.readVarUInt();
167 167
 	}
168 168
 
169 169
 	@Override
170 170
 	public long readLong() {
171
-		return input.readLong();
171
+		return input.readVarLong();
172 172
 	}
173 173
 
174 174
 	@Override
175 175
 	public long readULong() {
176
-		return input.readULong();
176
+		return input.readVarULong();
177 177
 	}
178 178
 	
179 179
 	@Override
@@ -193,12 +193,16 @@ public class CodeReader implements CodeSerializationInput {
193 193
 
194 194
 	@Override
195 195
 	public String readString() {
196
-		return strings[input.readUInt()];
196
+		int index = input.readVarUInt();
197
+		if (index >= strings.length)
198
+			throw new RuntimeException("Invalid string id");
199
+		
200
+		return strings[index];
197 201
 	}
198 202
 
199 203
 	@Override
200 204
 	public HighLevelDefinition readDefinition() {
201
-		return definitions.get(input.readUInt());
205
+		return definitions.get(input.readVarUInt());
202 206
 	}
203 207
 
204 208
 	@Override
@@ -325,21 +329,30 @@ public class CodeReader implements CodeSerializationInput {
325 329
 
326 330
 	@Override
327 331
 	public CodePosition deserializePosition() {
328
-		int flags = input.readVarUInt();
332
+		int flags = readUInt();
329 333
 		SourceFile file = lastPosition.file;
330 334
 		int fromLine = lastPosition.fromLine;
331 335
 		int fromLineOffset = lastPosition.fromLineOffset;
332
-		if ((flags & CodePositionEncoding.FLAG_FILE) > 0)
333
-			file = sourceFiles[input.readVarUInt()];
336
+		if ((flags & CodePositionEncoding.FLAG_FILE) > 0) {
337
+			int fileIndex = input.readVarUInt();
338
+			if (fileIndex >= sourceFiles.length)
339
+				throw new IllegalArgumentException("Invalid file index: " + fileIndex);
340
+			
341
+			file = sourceFiles[fileIndex];
342
+		}
334 343
 		if ((flags & CodePositionEncoding.FLAG_FROM_LINE) > 0)
335 344
 			fromLine = input.readVarUInt();
336 345
 		if ((flags & CodePositionEncoding.FLAG_FROM_OFFSET) > 0)
337 346
 			fromLineOffset = input.readVarUInt();
338
-		int toLine = (flags & CodePositionEncoding.FLAG_TO_LINE) == 0 ? lastPosition.toLine : fromLine + input.readVarUInt();
339
-		int toLineOffset = (flags & CodePositionEncoding.FLAG_TO_OFFSET) == 0 ? lastPosition.toLineOffset : input.readVarUInt();
347
+		int toLine = lastPosition.toLine;
348
+		if ((flags & CodePositionEncoding.FLAG_TO_LINE) > 0)
349
+			toLine = fromLine + input.readVarUInt();
350
+		int toLineOffset = lastPosition.toLineOffset;
351
+		if ((flags & CodePositionEncoding.FLAG_TO_OFFSET) > 0)
352
+			toLineOffset = input.readVarUInt();
340 353
 		return lastPosition = new CodePosition(file, fromLine, fromLineOffset, toLine, toLineOffset);
341 354
 	}
342
-
355
+	
343 356
 	@Override
344 357
 	public FunctionHeader deserializeHeader(TypeContext context) {
345 358
 		TypeParameter[] typeParameters = TypeParameter.NONE;
@@ -422,17 +435,25 @@ public class CodeReader implements CodeSerializationInput {
422 435
 			result[i] = new TypeParameter(position, name);
423 436
 		}
424 437
 		
438
+		if (currentStage == code || currentStage == members) {
439
+			readTypeParameterBounds(context, allflags, result);
440
+		} else {
441
+			members.enqueue(input -> readTypeParameterBounds(context, allflags, result));
442
+		}
443
+		
444
+		return result;
445
+	}
446
+	
447
+	private void readTypeParameterBounds(TypeContext context, int[] allFlags, TypeParameter[] result) {
425 448
 		TypeContext inner = new TypeContext(context, context.thisType, result);
426 449
 		for (int i = 0; i < result.length; i++) {
427
-			int flags = allflags[i];
450
+			int flags = allFlags[i];
428 451
 			if ((flags & TypeParameterEncoding.FLAG_BOUNDS) > 0) {
429 452
 				int bounds = readUInt();
430 453
 				for (int j = 0; j < bounds; j++)
431 454
 					result[i].bounds.add(deserializeTypeParameterBound(inner));
432 455
 			}
433 456
 		}
434
-		
435
-		return result;
436 457
 	}
437 458
 
438 459
 	@Override

+ 2
- 1
ModuleDeserializer/src/main/java/org/openzen/zenscript/moduledeserializer/DecodingStage.java ファイルの表示

@@ -8,6 +8,7 @@ package org.openzen.zenscript.moduledeserializer;
8 8
 import org.openzen.zenscript.codemodel.serialization.DecodingOperation;
9 9
 import java.util.ArrayList;
10 10
 import java.util.List;
11
+import org.openzen.zenscript.codemodel.serialization.DeserializationException;
11 12
 
12 13
 /**
13 14
  *
@@ -17,7 +18,7 @@ public class DecodingStage {
17 18
 	private final List<DecodingOperation> operations = new ArrayList<>();
18 19
 	private boolean locked = false;
19 20
 	
20
-	public void decode(CodeReader encoder) {
21
+	public void decode(CodeReader encoder) throws DeserializationException {
21 22
 		locked = true;
22 23
 		for (DecodingOperation operation : operations) {
23 24
 			operation.decode(encoder);

+ 311
- 8
ModuleDeserializer/src/main/java/org/openzen/zenscript/moduledeserializer/DefinitionMemberDeserializer.java ファイルの表示

@@ -5,6 +5,11 @@
5 5
  */
6 6
 package org.openzen.zenscript.moduledeserializer;
7 7
 
8
+import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.FunctionHeader;
10
+import org.openzen.zenscript.codemodel.HighLevelDefinition;
11
+import org.openzen.zenscript.codemodel.OperatorType;
12
+import org.openzen.zenscript.codemodel.context.StatementContext;
8 13
 import org.openzen.zenscript.codemodel.context.TypeContext;
9 14
 import org.openzen.zenscript.codemodel.definition.AliasDefinition;
10 15
 import org.openzen.zenscript.codemodel.definition.ClassDefinition;
@@ -15,6 +20,32 @@ import org.openzen.zenscript.codemodel.definition.FunctionDefinition;
15 20
 import org.openzen.zenscript.codemodel.definition.InterfaceDefinition;
16 21
 import org.openzen.zenscript.codemodel.definition.StructDefinition;
17 22
 import org.openzen.zenscript.codemodel.definition.VariantDefinition;
23
+import org.openzen.zenscript.codemodel.expression.CallArguments;
24
+import org.openzen.zenscript.codemodel.expression.NewExpression;
25
+import org.openzen.zenscript.codemodel.member.CallerMember;
26
+import org.openzen.zenscript.codemodel.member.CasterMember;
27
+import org.openzen.zenscript.codemodel.member.ConstMember;
28
+import org.openzen.zenscript.codemodel.member.ConstructorMember;
29
+import org.openzen.zenscript.codemodel.member.DestructorMember;
30
+import org.openzen.zenscript.codemodel.member.EnumConstantMember;
31
+import org.openzen.zenscript.codemodel.member.FieldMember;
32
+import org.openzen.zenscript.codemodel.member.GetterMember;
33
+import org.openzen.zenscript.codemodel.member.IDefinitionMember;
34
+import org.openzen.zenscript.codemodel.member.ImplementationMember;
35
+import org.openzen.zenscript.codemodel.member.IteratorMember;
36
+import org.openzen.zenscript.codemodel.member.MethodMember;
37
+import org.openzen.zenscript.codemodel.member.OperatorMember;
38
+import org.openzen.zenscript.codemodel.member.SetterMember;
39
+import org.openzen.zenscript.codemodel.member.StaticInitializerMember;
40
+import org.openzen.zenscript.codemodel.member.ref.CasterMemberRef;
41
+import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
42
+import org.openzen.zenscript.codemodel.member.ref.GetterMemberRef;
43
+import org.openzen.zenscript.codemodel.member.ref.IteratorMemberRef;
44
+import org.openzen.zenscript.codemodel.member.ref.SetterMemberRef;
45
+import org.openzen.zenscript.codemodel.type.BasicTypeID;
46
+import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
47
+import org.openzen.zenscript.codemodel.type.ITypeID;
48
+import org.openzen.zenscript.moduleserialization.MemberEncoding;
18 49
 
19 50
 /**
20 51
  *
@@ -26,44 +57,316 @@ public class DefinitionMemberDeserializer implements DefinitionVisitorWithContex
26 57
 	public DefinitionMemberDeserializer(CodeReader reader) {
27 58
 		this.reader = reader;
28 59
 	}
60
+	
61
+	private void visit(TypeContext context, HighLevelDefinition definition) {
62
+		ITypeID superType = reader.deserializeType(context);
63
+		definition.setSuperType(superType);
64
+		
65
+		IDefinitionMember[] members = new IDefinitionMember[reader.readUInt()];
66
+		for (int i = 0; i < members.length; i++) {
67
+			IDefinitionMember member = deserializeMember(context, definition, superType);
68
+			if (member != null) {
69
+				definition.members.add(member);
70
+				reader.add(member);
71
+			}
72
+			members[i] = member;
73
+		}
74
+	}
75
+	
76
+	private CodePosition readPosition(int flags) {
77
+		if ((flags & MemberEncoding.FLAG_POSITION) == 0)
78
+			return CodePosition.UNKNOWN;
79
+		
80
+		return reader.deserializePosition();
81
+	}
82
+	
83
+	private String readName(int flags) {
84
+		if ((flags & MemberEncoding.FLAG_NAME) == 0)
85
+			return null;
86
+		
87
+		return reader.readString();
88
+	}
89
+	
90
+	private IDefinitionMember deserializeMember(TypeContext context, HighLevelDefinition definition, ITypeID supertype) {
91
+		int kind = reader.readUInt();
92
+		int flags = 0;
93
+		CodePosition position = CodePosition.UNKNOWN;
94
+		int modifiers = 0;
95
+		
96
+		if (kind != MemberEncoding.TYPE_INNER_DEFINITION) {
97
+			flags = reader.readUInt();
98
+			position = readPosition(flags);
99
+			modifiers = reader.readUInt();
100
+		}
101
+		
102
+		switch (kind) {
103
+			case MemberEncoding.TYPE_CONST: {
104
+				String name = readName(flags);
105
+				ITypeID type = reader.deserializeType(context);
106
+				
107
+				ConstMember result = new ConstMember(position, definition, modifiers, name, type, null);
108
+				reader.enqueueCode(reader -> result.value = reader.deserializeExpression(new StatementContext(context)));
109
+				return result;
110
+			}
111
+			case MemberEncoding.TYPE_FIELD: {
112
+				String name = readName(flags);
113
+				int autoGetterAccess = (flags & MemberEncoding.FLAG_AUTO_GETTER) > 0 ? reader.readUInt() : 0;
114
+				int autoSetterAccess = (flags & MemberEncoding.FLAG_AUTO_SETTER) > 0 ? reader.readUInt() : 0;
115
+				ITypeID type = reader.deserializeType(context);
116
+				
117
+				FieldMember result = new FieldMember(position, definition, flags, name, context.thisType, type, context.moduleContext.registry, autoGetterAccess, autoSetterAccess, null);
118
+				reader.enqueueCode(reader -> result.initializer = reader.deserializeExpression(new StatementContext(context)));
119
+				return result;
120
+			}
121
+			case MemberEncoding.TYPE_CONSTRUCTOR: {
122
+				FunctionHeader header = reader.deserializeHeader(context);
123
+				ConstructorMember result = new ConstructorMember(position, definition, modifiers, header, null);
124
+				reader.enqueueCode(reader -> {
125
+					result.setBody(reader.deserializeStatement(new StatementContext(context, header)));
126
+				});
127
+				return result;
128
+			}
129
+			case MemberEncoding.TYPE_DESTRUCTOR: {
130
+				DestructorMember result = new DestructorMember(position, definition, modifiers);
131
+				reader.enqueueCode(reader -> {
132
+					result.overrides = (FunctionalMemberRef)reader.readMember(context, supertype);
133
+					result.setBody(reader.deserializeStatement(new StatementContext(context, result.header)));
134
+				});
135
+				return result;
136
+			}
137
+			case MemberEncoding.TYPE_METHOD: {
138
+				String name = readName(flags);
139
+				FunctionHeader header = reader.deserializeHeader(context);
140
+				MethodMember result = new MethodMember(position, definition, modifiers, name, header, null);
141
+				reader.enqueueCode(reader -> {
142
+					result.setOverrides(context.moduleContext.registry, (FunctionalMemberRef)reader.readMember(context, supertype));
143
+					result.setBody(reader.deserializeStatement(new StatementContext(context, header)));
144
+				});
145
+				return result;
146
+			}
147
+			case MemberEncoding.TYPE_GETTER: {
148
+				ITypeID type = reader.deserializeType(context);
149
+				String name = readName(flags);
150
+				
151
+				GetterMember result = new GetterMember(position, definition, modifiers, name, type, null);
152
+				reader.enqueueCode(reader -> {
153
+					result.setOverrides((GetterMemberRef)reader.readMember(context, supertype));
154
+					FunctionHeader header = new FunctionHeader(type);
155
+					result.setBody(reader.deserializeStatement(new StatementContext(context, header)));
156
+				});
157
+				return result;
158
+			}
159
+			case MemberEncoding.TYPE_SETTER: {
160
+				ITypeID type = reader.deserializeType(context);
161
+				String name = readName(flags);
162
+				
163
+				SetterMember result = new SetterMember(position, definition, modifiers, name, type, null);
164
+				reader.enqueueCode(reader -> {
165
+					result.setOverrides((SetterMemberRef)reader.readMember(context, supertype));
166
+					FunctionHeader header = new FunctionHeader(BasicTypeID.VOID, result.parameter);
167
+					result.setBody(reader.deserializeStatement(new StatementContext(context, header)));
168
+				});
169
+				return result;
170
+			}
171
+			case MemberEncoding.TYPE_OPERATOR: {
172
+				OperatorType operator = readOperator();
173
+				FunctionHeader header = reader.deserializeHeader(context);
174
+				
175
+				OperatorMember result = new OperatorMember(position, definition, modifiers, operator, header, null);
176
+				reader.enqueueCode(reader -> {
177
+					result.setOverrides(context.moduleContext.registry, (FunctionalMemberRef)reader.readMember(context, supertype));
178
+					result.setBody(reader.deserializeStatement(new StatementContext(context, header)));
179
+				});
180
+				return result;
181
+			}
182
+			case MemberEncoding.TYPE_CASTER: {
183
+				ITypeID toType = reader.deserializeType(context);
184
+				
185
+				CasterMember result = new CasterMember(position, definition, modifiers, toType, null);
186
+				reader.enqueueCode(reader -> {
187
+					result.setOverrides(context.moduleContext.registry, (CasterMemberRef)reader.readMember(context, supertype));
188
+					result.setBody(reader.deserializeStatement(new StatementContext(context, new FunctionHeader(toType))));
189
+				});
190
+				return result;
191
+			}
192
+			case MemberEncoding.TYPE_ITERATOR: {
193
+				ITypeID[] types = new ITypeID[reader.readUInt()];
194
+				for (int i = 0; i < types.length; i++)
195
+					types[i] = reader.deserializeType(context);
196
+				
197
+				IteratorMember result = new IteratorMember(position, definition, modifiers, types, context.moduleContext.registry, null);
198
+				reader.enqueueCode(reader -> {
199
+					result.setOverrides((IteratorMemberRef)reader.readMember(context, supertype));
200
+					result.setBody(reader.deserializeStatement(new StatementContext(context, result.header)));
201
+				});
202
+				return result;
203
+			}
204
+			case MemberEncoding.TYPE_CALLER: {
205
+				FunctionHeader header = reader.deserializeHeader(context);
206
+				CallerMember result = new CallerMember(position, definition, modifiers, header, null);
207
+				
208
+				reader.enqueueCode(reader -> {
209
+					result.setOverrides(context.moduleContext.registry, (FunctionalMemberRef)reader.readMember(context, supertype));
210
+					result.setBody(reader.deserializeStatement(new StatementContext(context, header)));
211
+				});
212
+				return result;
213
+			}
214
+			case MemberEncoding.TYPE_IMPLEMENTATION: {
215
+				ITypeID type = reader.deserializeType(context);
216
+				ImplementationMember result = new ImplementationMember(position, definition, modifiers, type);
217
+				
218
+				int members = reader.readUInt();
219
+				for (int i = 0; i < members; i++) {
220
+					IDefinitionMember member = deserializeMember(context, definition, type);
221
+					result.addMember(member);
222
+					reader.add(member);
223
+				}
224
+				
225
+				return result;
226
+			}
227
+			case MemberEncoding.TYPE_INNER_DEFINITION:
228
+				return null;
229
+			case MemberEncoding.TYPE_STATIC_INITIALIZER: {
230
+				StaticInitializerMember result = new StaticInitializerMember(position, definition);
231
+				reader.enqueueCode(reader -> {
232
+					result.body = reader.deserializeStatement(new StatementContext(context, new FunctionHeader(BasicTypeID.VOID)));
233
+				});
234
+				return result;
235
+			}
236
+			default:
237
+				throw new RuntimeException("Invalid member type: " + kind);
238
+		}
239
+	}
240
+	
241
+	private OperatorType readOperator() {
242
+		int operator = reader.readUInt();
243
+		switch (operator) {
244
+			case MemberEncoding.OPERATOR_ADD: return OperatorType.ADD;
245
+			case MemberEncoding.OPERATOR_SUB: return OperatorType.SUB;
246
+			case MemberEncoding.OPERATOR_MUL: return OperatorType.MUL;
247
+			case MemberEncoding.OPERATOR_DIV: return OperatorType.DIV;
248
+			case MemberEncoding.OPERATOR_MOD: return OperatorType.MOD;
249
+			case MemberEncoding.OPERATOR_CAT: return OperatorType.CAT;
250
+			case MemberEncoding.OPERATOR_OR: return OperatorType.OR;
251
+			case MemberEncoding.OPERATOR_XOR: return OperatorType.XOR;
252
+			case MemberEncoding.OPERATOR_NEG: return OperatorType.NEG;
253
+			case MemberEncoding.OPERATOR_INVERT: return OperatorType.INVERT;
254
+			case MemberEncoding.OPERATOR_NOT: return OperatorType.NOT;
255
+			case MemberEncoding.OPERATOR_INDEXSET: return OperatorType.INDEXSET;
256
+			case MemberEncoding.OPERATOR_INDEXGET: return OperatorType.INDEXGET;
257
+			case MemberEncoding.OPERATOR_CONTAINS: return OperatorType.CONTAINS;
258
+			case MemberEncoding.OPERATOR_COMPARE: return OperatorType.COMPARE;
259
+			case MemberEncoding.OPERATOR_MEMBERGETTER: return OperatorType.MEMBERGETTER;
260
+			case MemberEncoding.OPERATOR_MEMBERSETTER: return OperatorType.MEMBERSETTER;
261
+			case MemberEncoding.OPERATOR_EQUALS: return OperatorType.EQUALS;
262
+			case MemberEncoding.OPERATOR_NOTEQUALS: return OperatorType.NOTEQUALS;
263
+			case MemberEncoding.OPERATOR_SAME: return OperatorType.SAME;
264
+			case MemberEncoding.OPERATOR_NOTSAME: return OperatorType.NOTSAME;
265
+			case MemberEncoding.OPERATOR_SHL: return OperatorType.SHL;
266
+			case MemberEncoding.OPERATOR_SHR: return OperatorType.SHR;
267
+			case MemberEncoding.OPERATOR_USHR: return OperatorType.USHR;
268
+			
269
+			case MemberEncoding.OPERATOR_ADDASSIGN: return OperatorType.ADDASSIGN;
270
+			case MemberEncoding.OPERATOR_SUBASSIGN: return OperatorType.ADDASSIGN;
271
+			case MemberEncoding.OPERATOR_MULASSIGN: return OperatorType.ADDASSIGN;
272
+			case MemberEncoding.OPERATOR_DIVASSIGN: return OperatorType.ADDASSIGN;
273
+			case MemberEncoding.OPERATOR_MODASSIGN: return OperatorType.ADDASSIGN;
274
+			case MemberEncoding.OPERATOR_CATASSIGN: return OperatorType.ADDASSIGN;
275
+			case MemberEncoding.OPERATOR_ORASSIGN: return OperatorType.ADDASSIGN;
276
+			case MemberEncoding.OPERATOR_XORASSIGN: return OperatorType.ADDASSIGN;
277
+			case MemberEncoding.OPERATOR_SHLASSIGN: return OperatorType.ADDASSIGN;
278
+			case MemberEncoding.OPERATOR_SHRASSIGN: return OperatorType.ADDASSIGN;
279
+			case MemberEncoding.OPERATOR_USHRASSIGN: return OperatorType.ADDASSIGN;
280
+			
281
+			case MemberEncoding.OPERATOR_INCREMENT: return OperatorType.INCREMENT;
282
+			case MemberEncoding.OPERATOR_DECREMENT: return OperatorType.DECREMENT;
283
+			
284
+			case MemberEncoding.OPERATOR_RANGE: return OperatorType.RANGE;
285
+			
286
+			default: throw new RuntimeException("Invalid operator: " + operator);
287
+		}
288
+	}
29 289
 
30 290
 	@Override
31 291
 	public Void visitClass(TypeContext context, ClassDefinition definition) {
32
-		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
292
+		visit(context, definition);
293
+		return null;
33 294
 	}
34 295
 
35 296
 	@Override
36 297
 	public Void visitInterface(TypeContext context, InterfaceDefinition definition) {
37
-		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
298
+		visit(context, definition);
299
+		
300
+		int baseInterfaces = reader.readUInt();
301
+		for (int i = 0; i < baseInterfaces; i++)
302
+			definition.baseInterfaces.add(reader.deserializeType(context));
303
+		
304
+		return null;
38 305
 	}
39 306
 
40 307
 	@Override
41 308
 	public Void visitEnum(TypeContext context, EnumDefinition definition) {
42
-		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
309
+		visit(context, definition);
310
+		
311
+		int constants = reader.readUInt();
312
+		DefinitionTypeID type = context.moduleContext.registry.getForMyDefinition(definition);
313
+		StatementContext initContext = new StatementContext(context);
314
+		for (int i = 0; i < constants; i++) {
315
+			int flags = reader.readUInt();
316
+			String name = reader.readString();
317
+			CodePosition position = readPosition(flags);
318
+			
319
+			EnumConstantMember constant = new EnumConstantMember(position, definition, name, i);
320
+			reader.enqueueCode(input -> {
321
+				FunctionalMemberRef constructor = (FunctionalMemberRef)reader.readMember(context, type);
322
+				CallArguments arguments = reader.deserializeArguments(initContext);
323
+				constant.constructor = new NewExpression(position, type, constructor, arguments);
324
+			});
325
+			definition.enumConstants.add(constant);
326
+		}
327
+		
328
+		return null;
43 329
 	}
44 330
 
45 331
 	@Override
46 332
 	public Void visitStruct(TypeContext context, StructDefinition definition) {
47
-		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
333
+		visit(context, definition);
334
+		return null;
48 335
 	}
49 336
 
50 337
 	@Override
51 338
 	public Void visitFunction(TypeContext context, FunctionDefinition definition) {
52
-		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
339
+		visit(context, definition);
340
+		return null;
53 341
 	}
54 342
 
55 343
 	@Override
56 344
 	public Void visitExpansion(TypeContext context, ExpansionDefinition definition) {
57
-		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
345
+		visit(context, definition);
346
+		definition.target = reader.deserializeType(context);
347
+		return null;
58 348
 	}
59 349
 
60 350
 	@Override
61 351
 	public Void visitAlias(TypeContext context, AliasDefinition definition) {
62
-		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
352
+		definition.type = reader.deserializeType(context);
353
+		return null;
63 354
 	}
64 355
 
65 356
 	@Override
66 357
 	public Void visitVariant(TypeContext context, VariantDefinition variant) {
67
-		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
358
+		visit(context, variant);
359
+		
360
+		int options = reader.readUInt();
361
+		for (int i = 0; i < options; i++) {
362
+			String name = reader.readString();
363
+			ITypeID[] types = new ITypeID[reader.readUInt()];
364
+			for (int j = 0; j < types.length; j++)
365
+				types[i] = reader.deserializeType(context);
366
+			
367
+			variant.options.add(new VariantDefinition.Option(variant, name, i, types));
368
+		}
369
+		
370
+		return null;
68 371
 	}
69 372
 }

+ 10
- 1
ModuleDeserializer/src/main/java/org/openzen/zenscript/moduledeserializer/DeserializingModule.java ファイルの表示

@@ -7,6 +7,7 @@ package org.openzen.zenscript.moduledeserializer;
7 7
 
8 8
 import java.util.ArrayList;
9 9
 import java.util.List;
10
+import org.openzen.zenscript.codemodel.HighLevelDefinition;
10 11
 import org.openzen.zenscript.codemodel.Module;
11 12
 import org.openzen.zenscript.codemodel.PackageDefinitions;
12 13
 import org.openzen.zenscript.codemodel.ScriptBlock;
@@ -55,7 +56,7 @@ public class DeserializingModule {
55 56
 		this.annotations = annotations;
56 57
 		
57 58
 		expansions = new ArrayList<>();
58
-		context = new ModuleContext(registry, expansions, rootPackage);
59
+		context = new ModuleContext(registry, module, expansions, rootPackage);
59 60
 	}
60 61
 	
61 62
 	public DeserializingModule(SemanticModule module) 
@@ -96,4 +97,12 @@ public class DeserializingModule {
96 97
 				expansions,
97 98
 				annotations);
98 99
 	}
100
+	
101
+	public void add(HighLevelDefinition definition) {
102
+		definitions.add(definition);
103
+	}
104
+	
105
+	public void add(ScriptBlock script) {
106
+		scripts.add(script);
107
+	}
99 108
 }

+ 1
- 0
ModuleDeserializer/src/main/java/org/openzen/zenscript/moduledeserializer/Main.java ファイルの表示

@@ -5,6 +5,7 @@
5 5
  */
6 6
 package org.openzen.zenscript.moduledeserializer;
7 7
 
8
+import org.openzen.zenscript.codemodel.serialization.DeserializationException;
8 9
 import java.io.File;
9 10
 import java.io.IOException;
10 11
 import java.nio.file.Files;

+ 95
- 44
ModuleDeserializer/src/main/java/org/openzen/zenscript/moduledeserializer/ModuleDeserializer.java ファイルの表示

@@ -5,21 +5,35 @@
5 5
  */
6 6
 package org.openzen.zenscript.moduledeserializer;
7 7
 
8
+import org.openzen.zenscript.codemodel.serialization.DeserializationException;
8 9
 import compactio.CompactBytesDataInput;
9 10
 import compactio.CompactDataInput;
11
+import java.util.ArrayList;
10 12
 import java.util.Arrays;
13
+import java.util.List;
11 14
 import org.openzen.zencode.shared.CodePosition;
12 15
 import org.openzen.zencode.shared.SourceFile;
13 16
 import org.openzen.zencode.shared.VirtualSourceFile;
14 17
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
18
+import org.openzen.zenscript.codemodel.ScriptBlock;
15 19
 import org.openzen.zenscript.codemodel.annotations.AnnotationDefinition;
16 20
 import org.openzen.zenscript.codemodel.context.ModuleContext;
21
+import org.openzen.zenscript.codemodel.context.StatementContext;
17 22
 import org.openzen.zenscript.codemodel.context.TypeContext;
23
+import org.openzen.zenscript.codemodel.definition.AliasDefinition;
18 24
 import org.openzen.zenscript.codemodel.definition.ClassDefinition;
25
+import org.openzen.zenscript.codemodel.definition.EnumDefinition;
26
+import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
27
+import org.openzen.zenscript.codemodel.definition.FunctionDefinition;
28
+import org.openzen.zenscript.codemodel.definition.InterfaceDefinition;
29
+import org.openzen.zenscript.codemodel.definition.StructDefinition;
30
+import org.openzen.zenscript.codemodel.definition.VariantDefinition;
19 31
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
20 32
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
33
+import org.openzen.zenscript.codemodel.member.InnerDefinitionMember;
21 34
 import org.openzen.zenscript.codemodel.serialization.CodeSerializationInput;
22 35
 import org.openzen.zenscript.codemodel.serialization.DecodingOperation;
36
+import org.openzen.zenscript.codemodel.statement.Statement;
23 37
 import org.openzen.zenscript.compiler.CompilationUnit;
24 38
 import org.openzen.zenscript.compiler.ModuleRegistry;
25 39
 import org.openzen.zenscript.compiler.SemanticModule;
@@ -67,22 +81,22 @@ public class ModuleDeserializer {
67 81
 				sourceFiles,
68 82
 				compilationUnit.globalTypeRegistry);
69 83
 		
70
-		DeserializingModule[] packagedModules = new DeserializingModule[input.readVarUInt()];
84
+		DeserializingModule[] packagedModules = new DeserializingModule[decoder.readUInt()];
71 85
 		String[][] dependencyNames = new String[packagedModules.length][];
72 86
 		for (int i = 0; i < packagedModules.length; i++) {
73
-			int flags = input.readVarUInt();
74
-			String name = input.readString();
87
+			int flags = decoder.readUInt();
88
+			String name = decoder.readString();
75 89
 			
76 90
 			ZSPackage modulePackage = rootPackage;
77
-			int packageNameParts = input.readVarUInt();
91
+			int packageNameParts = decoder.readUInt();
78 92
 			for (int j = 0; j < packageNameParts; j++)
79
-				modulePackage = modulePackage.getOrCreatePackage(input.readString());
93
+				modulePackage = modulePackage.getOrCreatePackage(decoder.readString());
80 94
 
81
-			DeserializingModule[] dependencies = new DeserializingModule[input.readVarUInt()];
95
+			DeserializingModule[] dependencies = new DeserializingModule[decoder.readUInt()];
82 96
 			String[] dependencyNames2 = new String[dependencies.length];
83 97
 			dependencyNames[i] = dependencyNames2;
84 98
 			for (int j = 0; j < dependencyNames2.length; j++)
85
-				dependencyNames2[j] = input.readString();
99
+				dependencyNames2[j] = decoder.readString();
86 100
 			
87 101
 			packagedModules[i] = new DeserializingModule(
88 102
 					name,
@@ -95,7 +109,7 @@ public class ModuleDeserializer {
95 109
 			decoder.classes.enqueue(new ModuleDecodeClassesOperation(packagedModules[i], decoder));
96 110
 		}
97 111
 		
98
-		DeserializingModule[] allModules = Arrays.copyOf(packagedModules, input.readVarUInt());
112
+		DeserializingModule[] allModules = Arrays.copyOf(packagedModules, packagedModules.length + input.readVarUInt());
99 113
 		for (int i = packagedModules.length; i < allModules.length; i++) {
100 114
 			int flags = input.readVarUInt();
101 115
 			String name = input.readString();
@@ -131,61 +145,89 @@ public class ModuleDeserializer {
131 145
 		}
132 146
 
133 147
 		@Override
134
-		public void decode(CodeSerializationInput input) {
148
+		public void decode(CodeSerializationInput input) throws DeserializationException {
135 149
 			int numDefinitions = input.readUInt();
136 150
 			DefinitionMemberDeserializer memberDeserializer = new DefinitionMemberDeserializer(reader);
137 151
 			for (int i = 0; i < numDefinitions; i++) {
138
-				HighLevelDefinition definition = deserializeDefinition(reader, module.context);
152
+				HighLevelDefinition definition = deserializeDefinition(reader, module.context, null);
139 153
 				reader.add(definition);
154
+				module.add(definition);
140 155
 				
141 156
 				TypeContext typeContext = new TypeContext(module.context, definition.typeParameters, module.context.registry.getForMyDefinition(definition));
142 157
 				reader.members.enqueue(in -> definition.accept(typeContext, memberDeserializer));
143 158
 			}
144 159
 		}
160
+	}
145 161
 		
146
-		private HighLevelDefinition deserializeDefinition(CodeReader reader, ModuleContext context) {
147
-			int type = reader.readUInt();
148
-			int flags = reader.readUInt();
149
-			CodePosition position = CodePosition.UNKNOWN;
150
-			String name = null;
151
-			TypeParameter[] typeParameters = TypeParameter.NONE;
152
-			if ((flags & DefinitionEncoding.FLAG_POSITION) > 0)
153
-				position = reader.deserializePosition();
154
-			ZSPackage pkg = context.root.getRecursive(reader.readString());
155
-			if ((flags & DefinitionEncoding.FLAG_NAME) > 0)
156
-				name = reader.readString();
157
-			if ((flags & DefinitionEncoding.FLAG_TYPE_PARAMETERS) > 0)
158
-				typeParameters = reader.deserializeTypeParameters(new TypeContext(context, TypeParameter.NONE, null));
159
-			
160
-			switch (type) { 
161
-				case DefinitionEncoding.TYPE_CLASS: {
162
-					ClassDefinition result = new ClassDefinition(position, context.module, pkg, name, flags);
163
-					decodeMembers(reader, context, result);
164
-					return result;
165
-				}
166
-				case DefinitionEncoding.TYPE_STRUCT:
167
-				case DefinitionEncoding.TYPE_INTERFACE:
168
-				case DefinitionEncoding.TYPE_ENUM:
169
-				case DefinitionEncoding.TYPE_VARIANT:
170
-				case DefinitionEncoding.TYPE_FUNCTION:
171
-				case DefinitionEncoding.TYPE_ALIAS:
172
-				case DefinitionEncoding.TYPE_EXPANSION:
173
-			}
162
+	private HighLevelDefinition deserializeDefinition(CodeReader reader, ModuleContext context, HighLevelDefinition outer) throws DeserializationException {
163
+		int type = reader.readUInt();
164
+		int flags = reader.readUInt();
165
+		CodePosition position = CodePosition.UNKNOWN;
166
+		String name = null;
167
+		TypeParameter[] typeParameters = TypeParameter.NONE;
168
+		int modifiers = reader.readUInt();
169
+		if ((flags & DefinitionEncoding.FLAG_POSITION) > 0)
170
+			position = reader.deserializePosition();
171
+		ZSPackage pkg = context.root.getRecursive(reader.readString());
172
+		if ((flags & DefinitionEncoding.FLAG_NAME) > 0)
173
+			name = reader.readString();
174
+		if ((flags & DefinitionEncoding.FLAG_TYPE_PARAMETERS) > 0)
175
+			typeParameters = reader.deserializeTypeParameters(new TypeContext(context, TypeParameter.NONE, null));
176
+
177
+		HighLevelDefinition result;
178
+		switch (type) { 
179
+			case DefinitionEncoding.TYPE_CLASS:
180
+				result = new ClassDefinition(position, context.module, pkg, name, modifiers, outer);
181
+				break;
182
+			case DefinitionEncoding.TYPE_STRUCT:
183
+				result = new StructDefinition(position, context.module, pkg, name, modifiers, outer);
184
+				break;
185
+			case DefinitionEncoding.TYPE_INTERFACE:
186
+				result = new InterfaceDefinition(position, context.module, pkg, name, modifiers, outer);
187
+				break;
188
+			case DefinitionEncoding.TYPE_ENUM:
189
+				result = new EnumDefinition(position, context.module, pkg, name, modifiers, outer);
190
+				break;
191
+			case DefinitionEncoding.TYPE_VARIANT:
192
+				result = new VariantDefinition(position, context.module, pkg, name, modifiers, outer);
193
+				break;
194
+			case DefinitionEncoding.TYPE_FUNCTION:
195
+				result = new FunctionDefinition(position, context.module, pkg, name, modifiers, outer);
196
+				break;
197
+			case DefinitionEncoding.TYPE_ALIAS:
198
+				result = new AliasDefinition(position, context.module, pkg, name, modifiers, outer);
199
+				break;
200
+			case DefinitionEncoding.TYPE_EXPANSION:
201
+				result = new ExpansionDefinition(position, context.module, pkg, modifiers, outer);
202
+				break;
203
+			default:
204
+				throw new DeserializationException("Invalid definition type: " + type);
174 205
 		}
206
+		
207
+		result.typeParameters = typeParameters;
208
+		decodeMembers(reader, context, result);
209
+		reader.add(result);
210
+		return result;
175 211
 	}
176 212
 	
177 213
 	private void decodeMembers(
178 214
 			CodeReader reader,
179 215
 			ModuleContext moduleContext,
180
-			HighLevelDefinition definition)
216
+			HighLevelDefinition definition) throws DeserializationException
181 217
 	{
218
+		int innerClasses = reader.readUInt();
219
+		for (int i = 0; i < innerClasses; i++) {
220
+			CodePosition position = reader.deserializePosition();
221
+			int modifiers = reader.readUInt();
222
+			HighLevelDefinition inner = deserializeDefinition(reader, moduleContext, definition);
223
+			definition.addMember(new InnerDefinitionMember(position, inner, modifiers, definition));
224
+		}
225
+		
182 226
 		reader.enqueueMembers(input -> {
183 227
 			TypeContext context = new TypeContext(moduleContext, definition.typeParameters, moduleContext.registry.getForMyDefinition(definition));
184
-			definition.addMember(reader.deserializeMember(context));
228
+			DefinitionMemberDeserializer memberDeserializer = new DefinitionMemberDeserializer(reader);
229
+			definition.accept(context, memberDeserializer);
185 230
 		});
186
-		
187
-		int innerMembers = reader.readUInt();
188
-		
189 231
 	}
190 232
 	
191 233
 	private class ModuleDecodeScriptsOperation implements DecodingOperation {
@@ -197,7 +239,16 @@ public class ModuleDeserializer {
197 239
 
198 240
 		@Override
199 241
 		public void decode(CodeSerializationInput input) {
200
-			
242
+			int numberOfScripts = input.readUInt();
243
+			for (int i = 0; i < numberOfScripts; i++) {
244
+				List<Statement> statements = new ArrayList<>();
245
+				StatementContext context = new StatementContext(module.context, null);
246
+				int numStatements = input.readUInt();
247
+				for (int j = 0; j < numStatements; j++)
248
+					statements.add(input.deserializeStatement(context));
249
+				
250
+				module.add(new ScriptBlock(rootPackage, statements));
251
+			}
201 252
 		}
202 253
 	}
203 254
 }

+ 2
- 0
ModuleSerializationShared/src/main/java/org/openzen/zenscript/moduleserialization/MemberEncoding.java ファイルの表示

@@ -14,6 +14,8 @@ public class MemberEncoding {
14 14
 	
15 15
 	public static final int FLAG_POSITION = 1;
16 16
 	public static final int FLAG_NAME = 2;
17
+	public static final int FLAG_AUTO_GETTER = 4;
18
+	public static final int FLAG_AUTO_SETTER = 8;
17 19
 	
18 20
 	public static final int TYPE_BUILTIN = 1;
19 21
 	public static final int TYPE_CONST = 2;

+ 25
- 19
ModuleSerializer/src/main/java/org/openzen/zenscript/moduleserializer/CodeWriter.java ファイルの表示

@@ -54,6 +54,8 @@ public class CodeWriter implements CodeSerializationOutput {
54 54
 	private final List<HighLevelDefinition> definitions = new ArrayList<>();
55 55
 	private final Map<HighLevelDefinition, Integer> definitionsMap = new HashMap<>();
56 56
 	
57
+	private final Map<IDefinitionMember, Integer> memberMap = new HashMap<>();
58
+	
57 59
 	public final EncodingStage classes = new EncodingStage();
58 60
 	public final EncodingStage members = new EncodingStage();
59 61
 	public final EncodingStage code = new EncodingStage();
@@ -75,7 +77,8 @@ public class CodeWriter implements CodeSerializationOutput {
75 77
 			CompactDataOutput output,
76 78
 			SerializationOptions options,
77 79
 			String[] strings,
78
-			SourceFile[] sourceFiles)
80
+			SourceFile[] sourceFiles,
81
+			List<IDefinitionMember> members)
79 82
 	{
80 83
 		this.output = output;
81 84
 		this.options = options;
@@ -90,6 +93,8 @@ public class CodeWriter implements CodeSerializationOutput {
90 93
 			stringMap.put(string, stringMap.size());
91 94
 		for (SourceFile sourceFile : sourceFiles)
92 95
 			sourceFileMap.put(sourceFile, sourceFileMap.size());
96
+		for (IDefinitionMember member : members)
97
+			memberMap.put(member, memberMap.size());
93 98
 	}
94 99
 	
95 100
 	public void startClasses() {
@@ -202,21 +207,18 @@ public class CodeWriter implements CodeSerializationOutput {
202 207
 			throw new IllegalStateException("members not yet available!");
203 208
 		
204 209
 		if (member == null) {
205
-			writeUInt(0);
210
+			writeInt(0);
206 211
 			return;
207 212
 		} else if (member.getTarget().getBuiltin() != null) {
208
-			writeUInt(1);
209
-			writeUInt(member.getTarget().getBuiltin().ordinal()); // TODO: use something else?
213
+			writeInt(-member.getTarget().getBuiltin().ordinal() - 1); // TODO: use something else?
210 214
 			return;
211 215
 		}
212 216
 		
213 217
 		IDefinitionMember member_ = member.getTarget();
214
-		EncodingDefinition definition = member_.getDefinition().getTag(EncodingDefinition.class);
215
-		
216
-		int index = definition.members.indexOf(member_);
217
-		if (index < 0)
218
+		Integer index = memberMap.get(member_);
219
+		if (index == null)
218 220
 			throw new IllegalStateException("Member not registered!");
219
-		output.writeVarUInt(index);
221
+		writeInt(index + 1);
220 222
 	}
221 223
 	
222 224
 	@Override
@@ -250,12 +252,14 @@ public class CodeWriter implements CodeSerializationOutput {
250 252
 	
251 253
 	@Override
252 254
 	public void serialize(TypeContext context, TypeParameter[] parameters) {
253
-		output.writeVarUInt(parameters.length);
255
+		writeUInt(parameters.length);
254 256
 		int[] flags = new int[parameters.length];
255 257
 		for (int i = 0; i < parameters.length; i++)
256 258
 			flags[i] = serializeInitial(parameters[i]);
259
+		
260
+		TypeContext inner = new TypeContext(context, context.thisType, parameters);
257 261
 		for (int i = 0; i < parameters.length; i++)
258
-			serializeRemaining(flags[i], context, parameters[i]);
262
+			serializeRemaining(flags[i], inner, parameters[i]);
259 263
 	}
260 264
 	
261 265
 	private int serializeInitial(TypeParameter parameter) {
@@ -269,7 +273,7 @@ public class CodeWriter implements CodeSerializationOutput {
269 273
 		if ((flags & TypeParameterEncoding.FLAG_POSITION) > 0)
270 274
 			serialize(parameter.position);
271 275
 		if ((flags & TypeParameterEncoding.FLAG_NAME) > 0)
272
-			output.writeString(parameter.name);
276
+			writeString(parameter.name);
273 277
 		
274 278
 		return flags;
275 279
 	}
@@ -280,10 +284,12 @@ public class CodeWriter implements CodeSerializationOutput {
280 284
 			for (TypeParameterBound bound : parameter.bounds)
281 285
 				bound.accept(context, typeParameterEncoder);
282 286
 		} else {
283
-			code.enqueue(encoder -> {
284
-				output.writeVarUInt(parameter.bounds.size());
285
-				for (TypeParameterBound bound : parameter.bounds)
286
-					bound.accept(context, typeParameterEncoder);
287
+			members.enqueue(encoder -> {
288
+				if ((flags & TypeParameterEncoding.FLAG_BOUNDS) > 0) {
289
+					output.writeVarUInt(parameter.bounds.size());
290
+					for (TypeParameterBound bound : parameter.bounds)
291
+						bound.accept(context, typeParameterEncoder);
292
+				}
287 293
 			});
288 294
 		}
289 295
 	}
@@ -351,13 +357,13 @@ public class CodeWriter implements CodeSerializationOutput {
351 357
 			flags |= FunctionHeaderEncoding.FLAG_TYPE_PARAMETERS;
352 358
 		if (header.getReturnType() != BasicTypeID.VOID)
353 359
 			flags |= FunctionHeaderEncoding.FLAG_RETURN_TYPE;
354
-		if (header.parameters.length > 0)
360
+		if (header.thrownType != null)
355 361
 			flags |= FunctionHeaderEncoding.FLAG_THROWS;
356
-		if (header.hasAnyDefaultValues())
362
+		if (header.parameters.length > 0)
357 363
 			flags |= FunctionHeaderEncoding.FLAG_PARAMETERS;
358 364
 		if (header.parameters.length > 0 && header.parameters[header.parameters.length - 1].variadic)
359 365
 			flags |= FunctionHeaderEncoding.FLAG_VARIADIC;
360
-		if (header.thrownType != null)
366
+		if (header.hasAnyDefaultValues())
361 367
 			flags |= FunctionHeaderEncoding.FLAG_DEFAULT_VALUES;
362 368
 		
363 369
 		writeUInt(flags);

+ 6
- 2
ModuleSerializer/src/main/java/org/openzen/zenscript/moduleserializer/EncodingDefinition.java ファイルの表示

@@ -43,9 +43,13 @@ public class EncodingDefinition {
43 43
 		this.definition = definition;
44 44
 	}
45 45
 	
46
-	public void mark(IDefinitionMember member) {
47
-		if (memberSet.add(member))
46
+	public boolean mark(IDefinitionMember member) {
47
+		if (memberSet.add(member)) {
48 48
 			members.add(member);
49
+			return true;
50
+		} else {
51
+			return false;
52
+		}
49 53
 	}
50 54
 	
51 55
 	public void mark(EnumConstantMember member) {

+ 1
- 1
ModuleSerializer/src/main/java/org/openzen/zenscript/moduleserializer/Main.java ファイルの表示

@@ -28,7 +28,7 @@ public class Main {
28 28
 		ModuleSerializer serializer = new ModuleSerializer(new SerializationOptions(
29 29
 				true,
30 30
 				false,
31
-				false,
31
+				true,
32 32
 				true,
33 33
 				false));
34 34
 		byte[] encoded = serializer.serialize(Collections.singletonList(module));

+ 18
- 15
ModuleSerializer/src/main/java/org/openzen/zenscript/moduleserializer/ModuleSerializer.java ファイルの表示

@@ -19,6 +19,7 @@ import org.openzen.zenscript.moduleserialization.ModuleEncoding;
19 19
 import org.openzen.zenscript.moduleserializer.encoder.DefinitionSerializer;
20 20
 import org.openzen.zenscript.codemodel.context.StatementContext;
21 21
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
22
+import org.openzen.zenscript.codemodel.member.IDefinitionMember;
22 23
 import org.openzen.zenscript.codemodel.serialization.CodeSerializationOutput;
23 24
 
24 25
 /**
@@ -46,7 +47,7 @@ public class ModuleSerializer {
46 47
 		
47 48
 		for (SemanticModule module : modules) {
48 49
 			EncodingModule encodedModule = tableBuilder.register(module.module, module.getContext());
49
-			ModuleContext moduleContext = new ModuleContext(module.compilationUnit.globalTypeRegistry, module.expansions, module.rootPackage);
50
+			ModuleContext moduleContext = module.getContext();
50 51
 			for (HighLevelDefinition definition : module.definitions.getAll()) {
51 52
 				encodedModule.add(EncodingDefinition.complete(definition));
52 53
 				tableBuilder.serialize(moduleContext, definition);
@@ -62,13 +63,15 @@ public class ModuleSerializer {
62 63
 		
63 64
 		SourceFile[] sourceFiles = tableBuilder.getSourceFileList();
64 65
 		String[] strings = tableBuilder.getStrings();
66
+		List<IDefinitionMember> members = tableBuilder.getMembers();
65 67
 		
66 68
 		CompactBytesDataOutput output = new CompactBytesDataOutput();
67 69
 		CodeWriter encoder = new CodeWriter(
68 70
 				output,
69 71
 				options,
70 72
 				strings,
71
-				sourceFiles);
73
+				sourceFiles,
74
+				members);
72 75
 		
73 76
 		output.writeInt(0x5A43424D); // 'ZCBM' = ZenCode Binary Module
74 77
 		output.writeVarUInt(0); // version
@@ -77,37 +80,36 @@ public class ModuleSerializer {
77 80
 		for (SourceFile file : sourceFiles)
78 81
 			output.writeString(file.getFilename());
79 82
 		
80
-		output.writeVarUInt(encodingModules.size());
83
+		encoder.writeUInt(encodingModules.size());
81 84
 		System.out.println("Encoding list of modules");
82 85
 		for (int i = 0; i < encodingModules.size(); i++) {
83 86
 			EncodingModule encodingModule = encodingModules.get(i);
84 87
 			SemanticModule module = modules.get(i);
85 88
 			
86 89
 			int flags = ModuleEncoding.FLAG_CODE;
87
-			output.writeVarUInt(flags);
88
-			output.writeString(encodingModule.getName());
90
+			encoder.writeUInt(flags);
91
+			encoder.writeString(encodingModule.getName());
89 92
 			String[] packageName = getPackageName(module.modulePackage);
90
-			output.writeStringArray(packageName);
93
+			encoder.writeUInt(packageName.length);
94
+			for (String element : packageName)
95
+				encoder.writeString(element);
91 96
 			
92
-			output.writeVarUInt(module.dependencies.length);
97
+			encoder.writeUInt(module.dependencies.length);
93 98
 			for (SemanticModule dependency : module.dependencies)
94
-				output.writeString(dependency.name);
99
+				encoder.writeString(dependency.name);
95 100
 			
96
-			ModuleContext moduleContext = new ModuleContext(
97
-					module.compilationUnit.globalTypeRegistry,
98
-					module.expansions,
99
-					module.rootPackage);
101
+			ModuleContext moduleContext = module.getContext();
100 102
 			encoder.code.enqueue(new ModuleEncodeScriptsOperation(moduleContext, module.scripts));
101 103
 			encoder.classes.enqueue(new ModuleEncodeClassesOperation(options, encodingModule, encoder));
102 104
 		}
103 105
 		
104
-		output.writeVarUInt(tableBuilder.modules.size() - encodingModules.size()); // number of modules defined (first is always the current module)
106
+		encoder.writeUInt(tableBuilder.modules.size() - encodingModules.size()); // number of modules defined (first is always the current module)
105 107
 		for (int i = encodingModules.size(); i < tableBuilder.modules.size(); i++) {
106 108
 			EncodingModule encodingModule = tableBuilder.modules.get(i);
107 109
 			System.out.println("Encoding dependency module " + encodingModule.getName());
108 110
 			
109
-			output.writeVarUInt(0);
110
-			output.writeString(encodingModule.getName());
111
+			encoder.writeUInt(0);
112
+			encoder.writeString(encodingModule.getName());
111 113
 			encoder.classes.enqueue(new ModuleEncodeClassesOperation(options, encodingModule, encoder));
112 114
 		}
113 115
 		
@@ -120,6 +122,7 @@ public class ModuleSerializer {
120 122
 		System.out.println("Encoding code");
121 123
 		encoder.startCode();
122 124
 		encoder.code.encode(encoder);
125
+		
123 126
 		return output.asByteArray();
124 127
 	}
125 128
 	

+ 11
- 3
ModuleSerializer/src/main/java/org/openzen/zenscript/moduleserializer/TableBuilder.java ファイルの表示

@@ -54,6 +54,7 @@ public class TableBuilder implements CodeSerializationOutput {
54 54
 	private final Set<Module> moduleSet = new HashSet<>();
55 55
 	private final Set<SourceFile> sourceFiles = new HashSet<>();
56 56
 	public final List<EncodingModule> modules = new ArrayList<>();
57
+	private final List<IDefinitionMember> members = new ArrayList<>();
57 58
 	
58 59
 	private final SerializationOptions options;
59 60
 	
@@ -104,6 +105,10 @@ public class TableBuilder implements CodeSerializationOutput {
104 105
 		return result;
105 106
 	}
106 107
 	
108
+	public List<IDefinitionMember> getMembers() {
109
+		return members;
110
+	}
111
+	
107 112
 	private EncodingDefinition prepare(HighLevelDefinition definition) {
108 113
 		register(definition.module, null);
109 114
 		
@@ -184,8 +189,10 @@ public class TableBuilder implements CodeSerializationOutput {
184 189
 
185 190
 	@Override
186 191
 	public void write(TypeContext context, DefinitionMemberRef member) {
187
-		if (member != null)
188
-			prepare(member.getTarget().getDefinition()).mark(member.getTarget());
192
+		if (member != null && member.getTarget().getBuiltin() == null) {
193
+			if (prepare(member.getTarget().getDefinition()).mark(member.getTarget()))
194
+				members.add(member.getTarget());
195
+		}
189 196
 	}
190 197
 
191 198
 	@Override
@@ -221,8 +228,9 @@ public class TableBuilder implements CodeSerializationOutput {
221 228
 	
222 229
 	@Override
223 230
 	public void serialize(TypeContext context, TypeParameter[] parameters) {
231
+		TypeContext inner = new TypeContext(context, context.thisType, parameters);
224 232
 		for (TypeParameter parameter : parameters)
225
-			serialize(context, parameter);
233
+			serialize(inner, parameter);
226 234
 	}
227 235
 
228 236
 	@Override

+ 1
- 9
ModuleSerializer/src/main/java/org/openzen/zenscript/moduleserializer/encoder/DefinitionMemberSerializer.java ファイルの表示

@@ -58,14 +58,12 @@ public class DefinitionMemberSerializer implements DefinitionVisitorWithContext<
58 58
 
59 59
 	@Override
60 60
 	public Void visitClass(TypeContext context, ClassDefinition definition) {
61
-		output.writeUInt(DefinitionEncoding.TYPE_CLASS);
62 61
 		visit(context, definition);
63 62
 		return null;
64 63
 	}
65 64
 
66 65
 	@Override
67 66
 	public Void visitInterface(TypeContext context, InterfaceDefinition definition) {
68
-		output.writeUInt(DefinitionEncoding.TYPE_INTERFACE);
69 67
 		visit(context, definition);
70 68
 		
71 69
 		output.writeUInt(definition.baseInterfaces.size());
@@ -77,7 +75,6 @@ public class DefinitionMemberSerializer implements DefinitionVisitorWithContext<
77 75
 
78 76
 	@Override
79 77
 	public Void visitEnum(TypeContext context, EnumDefinition definition) {
80
-		output.writeUInt(DefinitionEncoding.TYPE_ENUM);
81 78
 		visit(context, definition);
82 79
 		
83 80
 		output.writeUInt(definition.enumConstants.size());
@@ -102,29 +99,25 @@ public class DefinitionMemberSerializer implements DefinitionVisitorWithContext<
102 99
 
103 100
 	@Override
104 101
 	public Void visitStruct(TypeContext context, StructDefinition definition) {
105
-		output.writeUInt(DefinitionEncoding.TYPE_STRUCT);
106 102
 		visit(context, definition);
107 103
 		return null;
108 104
 	}
109 105
 
110 106
 	@Override
111 107
 	public Void visitFunction(TypeContext context, FunctionDefinition definition) {
112
-		output.writeUInt(DefinitionEncoding.TYPE_FUNCTION);
113 108
 		visit(context, definition);
114 109
 		return null;
115 110
 	}
116 111
 
117 112
 	@Override
118 113
 	public Void visitExpansion(TypeContext context, ExpansionDefinition definition) {
119
-		output.writeUInt(DefinitionEncoding.TYPE_EXPANSION);
120 114
 		visit(context, definition);
115
+		output.serialize(context, definition.target);
121 116
 		return null;
122 117
 	}
123 118
 
124 119
 	@Override
125 120
 	public Void visitAlias(TypeContext context, AliasDefinition definition) {
126
-		output.writeUInt(DefinitionEncoding.TYPE_ALIAS);
127
-		
128 121
 		EncodingDefinition encoding = definition.getTag(EncodingDefinition.class);
129 122
 		for (DefinitionAnnotation annotation : definition.annotations) {
130 123
 			// TODO: how to serialize annotations?
@@ -136,7 +129,6 @@ public class DefinitionMemberSerializer implements DefinitionVisitorWithContext<
136 129
 
137 130
 	@Override
138 131
 	public Void visitVariant(TypeContext context, VariantDefinition variant) {
139
-		output.writeUInt(DefinitionEncoding.TYPE_VARIANT);
140 132
 		visit(context, variant);
141 133
 		
142 134
 		output.writeUInt(variant.options.size());

+ 8
- 5
ModuleSerializer/src/main/java/org/openzen/zenscript/moduleserializer/encoder/DefinitionSerializer.java ファイルの表示

@@ -57,7 +57,6 @@ public class DefinitionSerializer implements DefinitionVisitorWithContext<Module
57 57
 		if (definition.name != null)
58 58
 			output.writeString(definition.name);
59 59
 		if (definition.typeParameters.length > 0) {
60
-			output.writeUInt(definition.typeParameters.length);
61 60
 			TypeContext typeContext = new TypeContext(context, TypeParameter.NONE, null);
62 61
 			output.serialize(typeContext, definition.typeParameters);
63 62
 		}
@@ -69,15 +68,19 @@ public class DefinitionSerializer implements DefinitionVisitorWithContext<Module
69 68
 			if ((member instanceof InnerDefinitionMember))
70 69
 				innerDefinitions.add((InnerDefinitionMember)member);
71 70
 		
71
+		output.writeUInt(innerDefinitions.size());
72
+		for (InnerDefinitionMember innerDefinition : innerDefinitions) {
73
+			System.out.println("Inner definition: " + innerDefinition.definition.name);
74
+			output.serialize(innerDefinition.position);
75
+			output.writeUInt(innerDefinition.modifiers);
76
+			innerDefinition.innerDefinition.accept(moduleContext, this);
77
+		}
78
+		
72 79
 		output.enqueueMembers(output -> {
73 80
 			DefinitionMemberSerializer memberEncoder = new DefinitionMemberSerializer(options, output);
74 81
 			TypeContext context = new TypeContext(moduleContext, definition.typeParameters, moduleContext.registry.getForMyDefinition(definition));
75 82
 			definition.accept(context, memberEncoder);
76 83
 		});
77
-		
78
-		output.writeUInt(innerDefinitions.size());
79
-		for (InnerDefinitionMember innerDefinition : innerDefinitions)
80
-			innerDefinition.innerDefinition.accept(moduleContext, this);
81 84
 	}
82 85
 	
83 86
 	@Override

+ 23
- 4
ModuleSerializer/src/main/java/org/openzen/zenscript/moduleserializer/encoder/MemberSerializer.java ファイルの表示

@@ -61,6 +61,11 @@ public class MemberSerializer implements MemberVisitorWithContext<TypeContext, V
61 61
 		
62 62
 		output.writeUInt(member.getModifiers());
63 63
 	}
64
+	
65
+	private void writeName(int flags, String name) {
66
+		if ((flags & MemberEncoding.FLAG_NAME) > 0)
67
+			output.writeString(name);
68
+	}
64 69
 
65 70
 	@Override
66 71
 	public Void visitConst(TypeContext context, ConstMember member) {
@@ -86,10 +91,17 @@ public class MemberSerializer implements MemberVisitorWithContext<TypeContext, V
86 91
 		int flags = getFlags(member);
87 92
 		if (member.name != null)
88 93
 			flags |= MemberEncoding.FLAG_NAME;
94
+		if (member.autoGetterAccess != 0)
95
+			flags |= MemberEncoding.FLAG_AUTO_GETTER;
96
+		if (member.autoSetterAccess != 0)
97
+			flags |= MemberEncoding.FLAG_AUTO_SETTER;
89 98
 		
90 99
 		serialize(flags, member);
91
-		if ((flags & MemberEncoding.FLAG_NAME) > 0)
92
-			output.writeString(member.name);
100
+		writeName(flags, member.name);
101
+		if ((flags & MemberEncoding.FLAG_AUTO_GETTER) > 0)
102
+			output.writeUInt(member.autoGetterAccess);
103
+		if ((flags & MemberEncoding.FLAG_AUTO_SETTER) > 0)
104
+			output.writeUInt(member.autoSetterAccess);
93 105
 		
94 106
 		output.serialize(context, member.type);
95 107
 		output.enqueueCode(encoder -> encoder.serialize(new StatementContext(context), member.initializer));
@@ -129,7 +141,10 @@ public class MemberSerializer implements MemberVisitorWithContext<TypeContext, V
129 141
 	public Void visitMethod(TypeContext context, MethodMember member) {
130 142
 		output.writeUInt(MemberEncoding.TYPE_METHOD);
131 143
 		int flags = getFlags(member);
144
+		if (member.name != null)
145
+			flags |= MemberEncoding.FLAG_NAME;
132 146
 		serialize(flags, member);
147
+		writeName(flags, member.name);
133 148
 		
134 149
 		StatementContext inner = new StatementContext(context, member.header);
135 150
 		output.serialize(inner, member.header);
@@ -145,8 +160,11 @@ public class MemberSerializer implements MemberVisitorWithContext<TypeContext, V
145 160
 	public Void visitGetter(TypeContext context, GetterMember member) {
146 161
 		output.writeUInt(MemberEncoding.TYPE_GETTER);
147 162
 		int flags = getFlags(member);
163
+		if (member.name != null)
164
+			flags |= MemberEncoding.FLAG_NAME;
148 165
 		serialize(flags, member);
149 166
 		output.serialize(context, member.type);
167
+		writeName(flags, member.name);
150 168
 		
151 169
 		output.enqueueCode(encoder -> {
152 170
 			encoder.write(context, member.getOverrides());
@@ -161,12 +179,13 @@ public class MemberSerializer implements MemberVisitorWithContext<TypeContext, V
161 179
 		int flags = getFlags(member);
162 180
 		serialize(flags, member);
163 181
 		output.serialize(context, member.type);
182
+		writeName(flags, member.name);
164 183
 		
165 184
 		output.enqueueCode(encoder -> {
166 185
 			encoder.write(context, member.getOverrides());
167 186
 			encoder.serialize(new StatementContext(
168 187
 					context,
169
-					new FunctionHeader(BasicTypeID.VOID, member.type)),
188
+					new FunctionHeader(BasicTypeID.VOID, member.parameter)),
170 189
 					member.body);
171 190
 		});
172 191
 		return null;
@@ -217,7 +236,7 @@ public class MemberSerializer implements MemberVisitorWithContext<TypeContext, V
217 236
 		output.enqueueCode(encoder -> {
218 237
 			encoder.write(context, member.getOverrides());
219 238
 			encoder.serialize(
220
-					new StatementContext(context, new FunctionHeader(new IteratorTypeID(null, member.getLoopVariableTypes()))),
239
+					new StatementContext(context, member.header),
221 240
 					member.body);
222 241
 		});
223 242
 		return null;

読み込み中…
キャンセル
保存