Browse Source

Continue work on the deserializer and fix serialization and deserialization bugs

Stan Hebben 6 years ago
parent
commit
34f34fb5df
18 changed files with 552 additions and 132 deletions
  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 View File

10
  * @author Hoofdgebruiker
10
  * @author Hoofdgebruiker
11
  */
11
  */
12
 public interface DecodingOperation {
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 View File

3
  * To change this template file, choose Tools | Templates
3
  * To change this template file, choose Tools | Templates
4
  * and open the template in the editor.
4
  * and open the template in the editor.
5
  */
5
  */
6
-package org.openzen.zenscript.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 View File

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

+ 36
- 15
ModuleDeserializer/src/main/java/org/openzen/zenscript/moduledeserializer/CodeReader.java View File

158
 
158
 
159
 	@Override
159
 	@Override
160
 	public int readInt() {
160
 	public int readInt() {
161
-		return input.readInt();
161
+		return input.readVarInt();
162
 	}
162
 	}
163
 
163
 
164
 	@Override
164
 	@Override
165
 	public int readUInt() {
165
 	public int readUInt() {
166
-		return input.readUInt();
166
+		return input.readVarUInt();
167
 	}
167
 	}
168
 
168
 
169
 	@Override
169
 	@Override
170
 	public long readLong() {
170
 	public long readLong() {
171
-		return input.readLong();
171
+		return input.readVarLong();
172
 	}
172
 	}
173
 
173
 
174
 	@Override
174
 	@Override
175
 	public long readULong() {
175
 	public long readULong() {
176
-		return input.readULong();
176
+		return input.readVarULong();
177
 	}
177
 	}
178
 	
178
 	
179
 	@Override
179
 	@Override
193
 
193
 
194
 	@Override
194
 	@Override
195
 	public String readString() {
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
 	@Override
203
 	@Override
200
 	public HighLevelDefinition readDefinition() {
204
 	public HighLevelDefinition readDefinition() {
201
-		return definitions.get(input.readUInt());
205
+		return definitions.get(input.readVarUInt());
202
 	}
206
 	}
203
 
207
 
204
 	@Override
208
 	@Override
325
 
329
 
326
 	@Override
330
 	@Override
327
 	public CodePosition deserializePosition() {
331
 	public CodePosition deserializePosition() {
328
-		int flags = input.readVarUInt();
332
+		int flags = readUInt();
329
 		SourceFile file = lastPosition.file;
333
 		SourceFile file = lastPosition.file;
330
 		int fromLine = lastPosition.fromLine;
334
 		int fromLine = lastPosition.fromLine;
331
 		int fromLineOffset = lastPosition.fromLineOffset;
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
 		if ((flags & CodePositionEncoding.FLAG_FROM_LINE) > 0)
343
 		if ((flags & CodePositionEncoding.FLAG_FROM_LINE) > 0)
335
 			fromLine = input.readVarUInt();
344
 			fromLine = input.readVarUInt();
336
 		if ((flags & CodePositionEncoding.FLAG_FROM_OFFSET) > 0)
345
 		if ((flags & CodePositionEncoding.FLAG_FROM_OFFSET) > 0)
337
 			fromLineOffset = input.readVarUInt();
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
 		return lastPosition = new CodePosition(file, fromLine, fromLineOffset, toLine, toLineOffset);
353
 		return lastPosition = new CodePosition(file, fromLine, fromLineOffset, toLine, toLineOffset);
341
 	}
354
 	}
342
-
355
+	
343
 	@Override
356
 	@Override
344
 	public FunctionHeader deserializeHeader(TypeContext context) {
357
 	public FunctionHeader deserializeHeader(TypeContext context) {
345
 		TypeParameter[] typeParameters = TypeParameter.NONE;
358
 		TypeParameter[] typeParameters = TypeParameter.NONE;
422
 			result[i] = new TypeParameter(position, name);
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
 		TypeContext inner = new TypeContext(context, context.thisType, result);
448
 		TypeContext inner = new TypeContext(context, context.thisType, result);
426
 		for (int i = 0; i < result.length; i++) {
449
 		for (int i = 0; i < result.length; i++) {
427
-			int flags = allflags[i];
450
+			int flags = allFlags[i];
428
 			if ((flags & TypeParameterEncoding.FLAG_BOUNDS) > 0) {
451
 			if ((flags & TypeParameterEncoding.FLAG_BOUNDS) > 0) {
429
 				int bounds = readUInt();
452
 				int bounds = readUInt();
430
 				for (int j = 0; j < bounds; j++)
453
 				for (int j = 0; j < bounds; j++)
431
 					result[i].bounds.add(deserializeTypeParameterBound(inner));
454
 					result[i].bounds.add(deserializeTypeParameterBound(inner));
432
 			}
455
 			}
433
 		}
456
 		}
434
-		
435
-		return result;
436
 	}
457
 	}
437
 
458
 
438
 	@Override
459
 	@Override

+ 2
- 1
ModuleDeserializer/src/main/java/org/openzen/zenscript/moduledeserializer/DecodingStage.java View File

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

+ 311
- 8
ModuleDeserializer/src/main/java/org/openzen/zenscript/moduledeserializer/DefinitionMemberDeserializer.java View File

5
  */
5
  */
6
 package org.openzen.zenscript.moduledeserializer;
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
 import org.openzen.zenscript.codemodel.context.TypeContext;
13
 import org.openzen.zenscript.codemodel.context.TypeContext;
9
 import org.openzen.zenscript.codemodel.definition.AliasDefinition;
14
 import org.openzen.zenscript.codemodel.definition.AliasDefinition;
10
 import org.openzen.zenscript.codemodel.definition.ClassDefinition;
15
 import org.openzen.zenscript.codemodel.definition.ClassDefinition;
15
 import org.openzen.zenscript.codemodel.definition.InterfaceDefinition;
20
 import org.openzen.zenscript.codemodel.definition.InterfaceDefinition;
16
 import org.openzen.zenscript.codemodel.definition.StructDefinition;
21
 import org.openzen.zenscript.codemodel.definition.StructDefinition;
17
 import org.openzen.zenscript.codemodel.definition.VariantDefinition;
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
 	public DefinitionMemberDeserializer(CodeReader reader) {
57
 	public DefinitionMemberDeserializer(CodeReader reader) {
27
 		this.reader = reader;
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
 	@Override
290
 	@Override
31
 	public Void visitClass(TypeContext context, ClassDefinition definition) {
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
 	@Override
296
 	@Override
36
 	public Void visitInterface(TypeContext context, InterfaceDefinition definition) {
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
 	@Override
307
 	@Override
41
 	public Void visitEnum(TypeContext context, EnumDefinition definition) {
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
 	@Override
331
 	@Override
46
 	public Void visitStruct(TypeContext context, StructDefinition definition) {
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
 	@Override
337
 	@Override
51
 	public Void visitFunction(TypeContext context, FunctionDefinition definition) {
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
 	@Override
343
 	@Override
56
 	public Void visitExpansion(TypeContext context, ExpansionDefinition definition) {
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
 	@Override
350
 	@Override
61
 	public Void visitAlias(TypeContext context, AliasDefinition definition) {
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
 	@Override
356
 	@Override
66
 	public Void visitVariant(TypeContext context, VariantDefinition variant) {
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 View File

7
 
7
 
8
 import java.util.ArrayList;
8
 import java.util.ArrayList;
9
 import java.util.List;
9
 import java.util.List;
10
+import org.openzen.zenscript.codemodel.HighLevelDefinition;
10
 import org.openzen.zenscript.codemodel.Module;
11
 import org.openzen.zenscript.codemodel.Module;
11
 import org.openzen.zenscript.codemodel.PackageDefinitions;
12
 import org.openzen.zenscript.codemodel.PackageDefinitions;
12
 import org.openzen.zenscript.codemodel.ScriptBlock;
13
 import org.openzen.zenscript.codemodel.ScriptBlock;
55
 		this.annotations = annotations;
56
 		this.annotations = annotations;
56
 		
57
 		
57
 		expansions = new ArrayList<>();
58
 		expansions = new ArrayList<>();
58
-		context = new ModuleContext(registry, expansions, rootPackage);
59
+		context = new ModuleContext(registry, module, expansions, rootPackage);
59
 	}
60
 	}
60
 	
61
 	
61
 	public DeserializingModule(SemanticModule module) 
62
 	public DeserializingModule(SemanticModule module) 
96
 				expansions,
97
 				expansions,
97
 				annotations);
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 View File

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

+ 95
- 44
ModuleDeserializer/src/main/java/org/openzen/zenscript/moduledeserializer/ModuleDeserializer.java View File

5
  */
5
  */
6
 package org.openzen.zenscript.moduledeserializer;
6
 package org.openzen.zenscript.moduledeserializer;
7
 
7
 
8
+import org.openzen.zenscript.codemodel.serialization.DeserializationException;
8
 import compactio.CompactBytesDataInput;
9
 import compactio.CompactBytesDataInput;
9
 import compactio.CompactDataInput;
10
 import compactio.CompactDataInput;
11
+import java.util.ArrayList;
10
 import java.util.Arrays;
12
 import java.util.Arrays;
13
+import java.util.List;
11
 import org.openzen.zencode.shared.CodePosition;
14
 import org.openzen.zencode.shared.CodePosition;
12
 import org.openzen.zencode.shared.SourceFile;
15
 import org.openzen.zencode.shared.SourceFile;
13
 import org.openzen.zencode.shared.VirtualSourceFile;
16
 import org.openzen.zencode.shared.VirtualSourceFile;
14
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
17
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
18
+import org.openzen.zenscript.codemodel.ScriptBlock;
15
 import org.openzen.zenscript.codemodel.annotations.AnnotationDefinition;
19
 import org.openzen.zenscript.codemodel.annotations.AnnotationDefinition;
16
 import org.openzen.zenscript.codemodel.context.ModuleContext;
20
 import org.openzen.zenscript.codemodel.context.ModuleContext;
21
+import org.openzen.zenscript.codemodel.context.StatementContext;
17
 import org.openzen.zenscript.codemodel.context.TypeContext;
22
 import org.openzen.zenscript.codemodel.context.TypeContext;
23
+import org.openzen.zenscript.codemodel.definition.AliasDefinition;
18
 import org.openzen.zenscript.codemodel.definition.ClassDefinition;
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
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
31
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
20
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
32
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
33
+import org.openzen.zenscript.codemodel.member.InnerDefinitionMember;
21
 import org.openzen.zenscript.codemodel.serialization.CodeSerializationInput;
34
 import org.openzen.zenscript.codemodel.serialization.CodeSerializationInput;
22
 import org.openzen.zenscript.codemodel.serialization.DecodingOperation;
35
 import org.openzen.zenscript.codemodel.serialization.DecodingOperation;
36
+import org.openzen.zenscript.codemodel.statement.Statement;
23
 import org.openzen.zenscript.compiler.CompilationUnit;
37
 import org.openzen.zenscript.compiler.CompilationUnit;
24
 import org.openzen.zenscript.compiler.ModuleRegistry;
38
 import org.openzen.zenscript.compiler.ModuleRegistry;
25
 import org.openzen.zenscript.compiler.SemanticModule;
39
 import org.openzen.zenscript.compiler.SemanticModule;
67
 				sourceFiles,
81
 				sourceFiles,
68
 				compilationUnit.globalTypeRegistry);
82
 				compilationUnit.globalTypeRegistry);
69
 		
83
 		
70
-		DeserializingModule[] packagedModules = new DeserializingModule[input.readVarUInt()];
84
+		DeserializingModule[] packagedModules = new DeserializingModule[decoder.readUInt()];
71
 		String[][] dependencyNames = new String[packagedModules.length][];
85
 		String[][] dependencyNames = new String[packagedModules.length][];
72
 		for (int i = 0; i < packagedModules.length; i++) {
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
 			ZSPackage modulePackage = rootPackage;
90
 			ZSPackage modulePackage = rootPackage;
77
-			int packageNameParts = input.readVarUInt();
91
+			int packageNameParts = decoder.readUInt();
78
 			for (int j = 0; j < packageNameParts; j++)
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
 			String[] dependencyNames2 = new String[dependencies.length];
96
 			String[] dependencyNames2 = new String[dependencies.length];
83
 			dependencyNames[i] = dependencyNames2;
97
 			dependencyNames[i] = dependencyNames2;
84
 			for (int j = 0; j < dependencyNames2.length; j++)
98
 			for (int j = 0; j < dependencyNames2.length; j++)
85
-				dependencyNames2[j] = input.readString();
99
+				dependencyNames2[j] = decoder.readString();
86
 			
100
 			
87
 			packagedModules[i] = new DeserializingModule(
101
 			packagedModules[i] = new DeserializingModule(
88
 					name,
102
 					name,
95
 			decoder.classes.enqueue(new ModuleDecodeClassesOperation(packagedModules[i], decoder));
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
 		for (int i = packagedModules.length; i < allModules.length; i++) {
113
 		for (int i = packagedModules.length; i < allModules.length; i++) {
100
 			int flags = input.readVarUInt();
114
 			int flags = input.readVarUInt();
101
 			String name = input.readString();
115
 			String name = input.readString();
131
 		}
145
 		}
132
 
146
 
133
 		@Override
147
 		@Override
134
-		public void decode(CodeSerializationInput input) {
148
+		public void decode(CodeSerializationInput input) throws DeserializationException {
135
 			int numDefinitions = input.readUInt();
149
 			int numDefinitions = input.readUInt();
136
 			DefinitionMemberDeserializer memberDeserializer = new DefinitionMemberDeserializer(reader);
150
 			DefinitionMemberDeserializer memberDeserializer = new DefinitionMemberDeserializer(reader);
137
 			for (int i = 0; i < numDefinitions; i++) {
151
 			for (int i = 0; i < numDefinitions; i++) {
138
-				HighLevelDefinition definition = deserializeDefinition(reader, module.context);
152
+				HighLevelDefinition definition = deserializeDefinition(reader, module.context, null);
139
 				reader.add(definition);
153
 				reader.add(definition);
154
+				module.add(definition);
140
 				
155
 				
141
 				TypeContext typeContext = new TypeContext(module.context, definition.typeParameters, module.context.registry.getForMyDefinition(definition));
156
 				TypeContext typeContext = new TypeContext(module.context, definition.typeParameters, module.context.registry.getForMyDefinition(definition));
142
 				reader.members.enqueue(in -> definition.accept(typeContext, memberDeserializer));
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
 	private void decodeMembers(
213
 	private void decodeMembers(
178
 			CodeReader reader,
214
 			CodeReader reader,
179
 			ModuleContext moduleContext,
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
 		reader.enqueueMembers(input -> {
226
 		reader.enqueueMembers(input -> {
183
 			TypeContext context = new TypeContext(moduleContext, definition.typeParameters, moduleContext.registry.getForMyDefinition(definition));
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
 	private class ModuleDecodeScriptsOperation implements DecodingOperation {
233
 	private class ModuleDecodeScriptsOperation implements DecodingOperation {
197
 
239
 
198
 		@Override
240
 		@Override
199
 		public void decode(CodeSerializationInput input) {
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 View File

14
 	
14
 	
15
 	public static final int FLAG_POSITION = 1;
15
 	public static final int FLAG_POSITION = 1;
16
 	public static final int FLAG_NAME = 2;
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
 	public static final int TYPE_BUILTIN = 1;
20
 	public static final int TYPE_BUILTIN = 1;
19
 	public static final int TYPE_CONST = 2;
21
 	public static final int TYPE_CONST = 2;

+ 25
- 19
ModuleSerializer/src/main/java/org/openzen/zenscript/moduleserializer/CodeWriter.java View File

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

+ 6
- 2
ModuleSerializer/src/main/java/org/openzen/zenscript/moduleserializer/EncodingDefinition.java View File

43
 		this.definition = definition;
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
 			members.add(member);
48
 			members.add(member);
49
+			return true;
50
+		} else {
51
+			return false;
52
+		}
49
 	}
53
 	}
50
 	
54
 	
51
 	public void mark(EnumConstantMember member) {
55
 	public void mark(EnumConstantMember member) {

+ 1
- 1
ModuleSerializer/src/main/java/org/openzen/zenscript/moduleserializer/Main.java View File

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

+ 18
- 15
ModuleSerializer/src/main/java/org/openzen/zenscript/moduleserializer/ModuleSerializer.java View File

19
 import org.openzen.zenscript.moduleserializer.encoder.DefinitionSerializer;
19
 import org.openzen.zenscript.moduleserializer.encoder.DefinitionSerializer;
20
 import org.openzen.zenscript.codemodel.context.StatementContext;
20
 import org.openzen.zenscript.codemodel.context.StatementContext;
21
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
21
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
22
+import org.openzen.zenscript.codemodel.member.IDefinitionMember;
22
 import org.openzen.zenscript.codemodel.serialization.CodeSerializationOutput;
23
 import org.openzen.zenscript.codemodel.serialization.CodeSerializationOutput;
23
 
24
 
24
 /**
25
 /**
46
 		
47
 		
47
 		for (SemanticModule module : modules) {
48
 		for (SemanticModule module : modules) {
48
 			EncodingModule encodedModule = tableBuilder.register(module.module, module.getContext());
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
 			for (HighLevelDefinition definition : module.definitions.getAll()) {
51
 			for (HighLevelDefinition definition : module.definitions.getAll()) {
51
 				encodedModule.add(EncodingDefinition.complete(definition));
52
 				encodedModule.add(EncodingDefinition.complete(definition));
52
 				tableBuilder.serialize(moduleContext, definition);
53
 				tableBuilder.serialize(moduleContext, definition);
62
 		
63
 		
63
 		SourceFile[] sourceFiles = tableBuilder.getSourceFileList();
64
 		SourceFile[] sourceFiles = tableBuilder.getSourceFileList();
64
 		String[] strings = tableBuilder.getStrings();
65
 		String[] strings = tableBuilder.getStrings();
66
+		List<IDefinitionMember> members = tableBuilder.getMembers();
65
 		
67
 		
66
 		CompactBytesDataOutput output = new CompactBytesDataOutput();
68
 		CompactBytesDataOutput output = new CompactBytesDataOutput();
67
 		CodeWriter encoder = new CodeWriter(
69
 		CodeWriter encoder = new CodeWriter(
68
 				output,
70
 				output,
69
 				options,
71
 				options,
70
 				strings,
72
 				strings,
71
-				sourceFiles);
73
+				sourceFiles,
74
+				members);
72
 		
75
 		
73
 		output.writeInt(0x5A43424D); // 'ZCBM' = ZenCode Binary Module
76
 		output.writeInt(0x5A43424D); // 'ZCBM' = ZenCode Binary Module
74
 		output.writeVarUInt(0); // version
77
 		output.writeVarUInt(0); // version
77
 		for (SourceFile file : sourceFiles)
80
 		for (SourceFile file : sourceFiles)
78
 			output.writeString(file.getFilename());
81
 			output.writeString(file.getFilename());
79
 		
82
 		
80
-		output.writeVarUInt(encodingModules.size());
83
+		encoder.writeUInt(encodingModules.size());
81
 		System.out.println("Encoding list of modules");
84
 		System.out.println("Encoding list of modules");
82
 		for (int i = 0; i < encodingModules.size(); i++) {
85
 		for (int i = 0; i < encodingModules.size(); i++) {
83
 			EncodingModule encodingModule = encodingModules.get(i);
86
 			EncodingModule encodingModule = encodingModules.get(i);
84
 			SemanticModule module = modules.get(i);
87
 			SemanticModule module = modules.get(i);
85
 			
88
 			
86
 			int flags = ModuleEncoding.FLAG_CODE;
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
 			String[] packageName = getPackageName(module.modulePackage);
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
 			for (SemanticModule dependency : module.dependencies)
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
 			encoder.code.enqueue(new ModuleEncodeScriptsOperation(moduleContext, module.scripts));
102
 			encoder.code.enqueue(new ModuleEncodeScriptsOperation(moduleContext, module.scripts));
101
 			encoder.classes.enqueue(new ModuleEncodeClassesOperation(options, encodingModule, encoder));
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
 		for (int i = encodingModules.size(); i < tableBuilder.modules.size(); i++) {
107
 		for (int i = encodingModules.size(); i < tableBuilder.modules.size(); i++) {
106
 			EncodingModule encodingModule = tableBuilder.modules.get(i);
108
 			EncodingModule encodingModule = tableBuilder.modules.get(i);
107
 			System.out.println("Encoding dependency module " + encodingModule.getName());
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
 			encoder.classes.enqueue(new ModuleEncodeClassesOperation(options, encodingModule, encoder));
113
 			encoder.classes.enqueue(new ModuleEncodeClassesOperation(options, encodingModule, encoder));
112
 		}
114
 		}
113
 		
115
 		
120
 		System.out.println("Encoding code");
122
 		System.out.println("Encoding code");
121
 		encoder.startCode();
123
 		encoder.startCode();
122
 		encoder.code.encode(encoder);
124
 		encoder.code.encode(encoder);
125
+		
123
 		return output.asByteArray();
126
 		return output.asByteArray();
124
 	}
127
 	}
125
 	
128
 	

+ 11
- 3
ModuleSerializer/src/main/java/org/openzen/zenscript/moduleserializer/TableBuilder.java View File

54
 	private final Set<Module> moduleSet = new HashSet<>();
54
 	private final Set<Module> moduleSet = new HashSet<>();
55
 	private final Set<SourceFile> sourceFiles = new HashSet<>();
55
 	private final Set<SourceFile> sourceFiles = new HashSet<>();
56
 	public final List<EncodingModule> modules = new ArrayList<>();
56
 	public final List<EncodingModule> modules = new ArrayList<>();
57
+	private final List<IDefinitionMember> members = new ArrayList<>();
57
 	
58
 	
58
 	private final SerializationOptions options;
59
 	private final SerializationOptions options;
59
 	
60
 	
104
 		return result;
105
 		return result;
105
 	}
106
 	}
106
 	
107
 	
108
+	public List<IDefinitionMember> getMembers() {
109
+		return members;
110
+	}
111
+	
107
 	private EncodingDefinition prepare(HighLevelDefinition definition) {
112
 	private EncodingDefinition prepare(HighLevelDefinition definition) {
108
 		register(definition.module, null);
113
 		register(definition.module, null);
109
 		
114
 		
184
 
189
 
185
 	@Override
190
 	@Override
186
 	public void write(TypeContext context, DefinitionMemberRef member) {
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
 	@Override
198
 	@Override
221
 	
228
 	
222
 	@Override
229
 	@Override
223
 	public void serialize(TypeContext context, TypeParameter[] parameters) {
230
 	public void serialize(TypeContext context, TypeParameter[] parameters) {
231
+		TypeContext inner = new TypeContext(context, context.thisType, parameters);
224
 		for (TypeParameter parameter : parameters)
232
 		for (TypeParameter parameter : parameters)
225
-			serialize(context, parameter);
233
+			serialize(inner, parameter);
226
 	}
234
 	}
227
 
235
 
228
 	@Override
236
 	@Override

+ 1
- 9
ModuleSerializer/src/main/java/org/openzen/zenscript/moduleserializer/encoder/DefinitionMemberSerializer.java View File

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

+ 8
- 5
ModuleSerializer/src/main/java/org/openzen/zenscript/moduleserializer/encoder/DefinitionSerializer.java View File

57
 		if (definition.name != null)
57
 		if (definition.name != null)
58
 			output.writeString(definition.name);
58
 			output.writeString(definition.name);
59
 		if (definition.typeParameters.length > 0) {
59
 		if (definition.typeParameters.length > 0) {
60
-			output.writeUInt(definition.typeParameters.length);
61
 			TypeContext typeContext = new TypeContext(context, TypeParameter.NONE, null);
60
 			TypeContext typeContext = new TypeContext(context, TypeParameter.NONE, null);
62
 			output.serialize(typeContext, definition.typeParameters);
61
 			output.serialize(typeContext, definition.typeParameters);
63
 		}
62
 		}
69
 			if ((member instanceof InnerDefinitionMember))
68
 			if ((member instanceof InnerDefinitionMember))
70
 				innerDefinitions.add((InnerDefinitionMember)member);
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
 		output.enqueueMembers(output -> {
79
 		output.enqueueMembers(output -> {
73
 			DefinitionMemberSerializer memberEncoder = new DefinitionMemberSerializer(options, output);
80
 			DefinitionMemberSerializer memberEncoder = new DefinitionMemberSerializer(options, output);
74
 			TypeContext context = new TypeContext(moduleContext, definition.typeParameters, moduleContext.registry.getForMyDefinition(definition));
81
 			TypeContext context = new TypeContext(moduleContext, definition.typeParameters, moduleContext.registry.getForMyDefinition(definition));
75
 			definition.accept(context, memberEncoder);
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
 	@Override
86
 	@Override

+ 23
- 4
ModuleSerializer/src/main/java/org/openzen/zenscript/moduleserializer/encoder/MemberSerializer.java View File

61
 		
61
 		
62
 		output.writeUInt(member.getModifiers());
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
 	@Override
70
 	@Override
66
 	public Void visitConst(TypeContext context, ConstMember member) {
71
 	public Void visitConst(TypeContext context, ConstMember member) {
86
 		int flags = getFlags(member);
91
 		int flags = getFlags(member);
87
 		if (member.name != null)
92
 		if (member.name != null)
88
 			flags |= MemberEncoding.FLAG_NAME;
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
 		serialize(flags, member);
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
 		output.serialize(context, member.type);
106
 		output.serialize(context, member.type);
95
 		output.enqueueCode(encoder -> encoder.serialize(new StatementContext(context), member.initializer));
107
 		output.enqueueCode(encoder -> encoder.serialize(new StatementContext(context), member.initializer));
129
 	public Void visitMethod(TypeContext context, MethodMember member) {
141
 	public Void visitMethod(TypeContext context, MethodMember member) {
130
 		output.writeUInt(MemberEncoding.TYPE_METHOD);
142
 		output.writeUInt(MemberEncoding.TYPE_METHOD);
131
 		int flags = getFlags(member);
143
 		int flags = getFlags(member);
144
+		if (member.name != null)
145
+			flags |= MemberEncoding.FLAG_NAME;
132
 		serialize(flags, member);
146
 		serialize(flags, member);
147
+		writeName(flags, member.name);
133
 		
148
 		
134
 		StatementContext inner = new StatementContext(context, member.header);
149
 		StatementContext inner = new StatementContext(context, member.header);
135
 		output.serialize(inner, member.header);
150
 		output.serialize(inner, member.header);
145
 	public Void visitGetter(TypeContext context, GetterMember member) {
160
 	public Void visitGetter(TypeContext context, GetterMember member) {
146
 		output.writeUInt(MemberEncoding.TYPE_GETTER);
161
 		output.writeUInt(MemberEncoding.TYPE_GETTER);
147
 		int flags = getFlags(member);
162
 		int flags = getFlags(member);
163
+		if (member.name != null)
164
+			flags |= MemberEncoding.FLAG_NAME;
148
 		serialize(flags, member);
165
 		serialize(flags, member);
149
 		output.serialize(context, member.type);
166
 		output.serialize(context, member.type);
167
+		writeName(flags, member.name);
150
 		
168
 		
151
 		output.enqueueCode(encoder -> {
169
 		output.enqueueCode(encoder -> {
152
 			encoder.write(context, member.getOverrides());
170
 			encoder.write(context, member.getOverrides());
161
 		int flags = getFlags(member);
179
 		int flags = getFlags(member);
162
 		serialize(flags, member);
180
 		serialize(flags, member);
163
 		output.serialize(context, member.type);
181
 		output.serialize(context, member.type);
182
+		writeName(flags, member.name);
164
 		
183
 		
165
 		output.enqueueCode(encoder -> {
184
 		output.enqueueCode(encoder -> {
166
 			encoder.write(context, member.getOverrides());
185
 			encoder.write(context, member.getOverrides());
167
 			encoder.serialize(new StatementContext(
186
 			encoder.serialize(new StatementContext(
168
 					context,
187
 					context,
169
-					new FunctionHeader(BasicTypeID.VOID, member.type)),
188
+					new FunctionHeader(BasicTypeID.VOID, member.parameter)),
170
 					member.body);
189
 					member.body);
171
 		});
190
 		});
172
 		return null;
191
 		return null;
217
 		output.enqueueCode(encoder -> {
236
 		output.enqueueCode(encoder -> {
218
 			encoder.write(context, member.getOverrides());
237
 			encoder.write(context, member.getOverrides());
219
 			encoder.serialize(
238
 			encoder.serialize(
220
-					new StatementContext(context, new FunctionHeader(new IteratorTypeID(null, member.getLoopVariableTypes()))),
239
+					new StatementContext(context, member.header),
221
 					member.body);
240
 					member.body);
222
 		});
241
 		});
223
 		return null;
242
 		return null;

Loading…
Cancel
Save