1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2024-08-03 01:29:04 +00:00

Now serializing all symbol types

This commit is contained in:
Jesper Gravgaard 2017-07-18 23:13:24 +02:00
parent 819c904419
commit 6e087e9a1c
5 changed files with 73 additions and 9 deletions

View File

@ -1,5 +1,6 @@
package dk.camelot64.kickc.icl; package dk.camelot64.kickc.icl;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonProperty;
@ -18,7 +19,8 @@ public class Procedure extends Scope {
this.returnType = returnType; this.returnType = returnType;
} }
public Procedure( @JsonCreator
private Procedure(
@JsonProperty("name") String name, @JsonProperty("name") String name,
@JsonProperty("returntype") SymbolType returnType, @JsonProperty("returntype") SymbolType returnType,
@JsonProperty("parameterNames") List<String> parameterNames, @JsonProperty("parameterNames") List<String> parameterNames,

View File

@ -15,7 +15,7 @@ public class ProgramScope extends Scope {
} }
@JsonCreator @JsonCreator
public ProgramScope( private ProgramScope(
@JsonProperty("name") String name, @JsonProperty("name") String name,
@JsonProperty("symbols") HashMap<String, Symbol> symbols, @JsonProperty("symbols") HashMap<String, Symbol> symbols,
@JsonProperty("intermediateVarCount") int intermediateVarCount, @JsonProperty("intermediateVarCount") int intermediateVarCount,

View File

@ -1,11 +1,17 @@
package dk.camelot64.kickc.icl; package dk.camelot64.kickc.icl;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
/** A fixed size array of another type */ /** A fixed size array of another type */
public class SymbolTypeArray extends SymbolTypePointer { public class SymbolTypeArray extends SymbolTypePointer {
private int size; private int size;
public SymbolTypeArray(SymbolType elementType, int size) { @JsonCreator
public SymbolTypeArray(
@JsonProperty("elementType") SymbolType elementType,
@JsonProperty("size") int size) {
super(elementType); super(elementType);
this.size = size; this.size = size;
} }
@ -14,8 +20,36 @@ public class SymbolTypeArray extends SymbolTypePointer {
return size; return size;
} }
public void setSize(int size) {
this.size = size;
}
@Override @Override
public String getTypeName() { public String getTypeName() {
return getElementType().getTypeName()+"["+size+"]"; return getElementType().getTypeName()+"["+size+"]";
} }
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
if (!super.equals(o)) {
return false;
}
SymbolTypeArray that = (SymbolTypeArray) o;
return size == that.size;
}
@Override
public int hashCode() {
int result = super.hashCode();
result = 31 * result + size;
return result;
}
} }

View File

@ -1,11 +1,17 @@
package dk.camelot64.kickc.icl; package dk.camelot64.kickc.icl;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
/** A pointer */ /** A pointer */
public class SymbolTypePointer implements SymbolType { public class SymbolTypePointer implements SymbolType {
private SymbolType elementType; private SymbolType elementType;
public SymbolTypePointer(SymbolType elementType) { @JsonCreator
public SymbolTypePointer(
@JsonProperty("elementType") SymbolType elementType) {
this.elementType = elementType; this.elementType = elementType;
} }
@ -13,10 +19,32 @@ public class SymbolTypePointer implements SymbolType {
return elementType; return elementType;
} }
public void setElementType(SymbolType elementType) {
this.elementType = elementType;
}
@Override @Override
@JsonIgnore
public String getTypeName() { public String getTypeName() {
return elementType.getTypeName()+"*"; return elementType.getTypeName()+"*";
} }
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
SymbolTypePointer that = (SymbolTypePointer) o;
return elementType != null ? elementType.equals(that.elementType) : that.elementType == null;
}
@Override
public int hashCode() {
return elementType != null ? elementType.hashCode() : 0;
}
} }

View File

@ -24,26 +24,26 @@ public class TestIclJson extends TestCase {
VariableUnversioned v1 = scope.addVariable("v1", SymbolTypeBasic.BYTE); VariableUnversioned v1 = scope.addVariable("v1", SymbolTypeBasic.BYTE);
v1.createVersion(); v1.createVersion();
scope.addVariableIntermediate(); scope.addVariableIntermediate();
scope.addVariable("v2", new SymbolTypePointer(SymbolTypeBasic.BYTE));
scope.addVariable("v3", new SymbolTypeArray(SymbolTypeBasic.WORD, 4));
scope.addLabel("main"); scope.addLabel("main");
scope.addLabelIntermediate(); scope.addLabelIntermediate();
String json = "{\"@type\":\"program\",\"name\":\"\",\"symbols\":{\"v1\":{\"@type\":\"variable_unversioned\",\"name\":\"v1\",\"type\":{\"@type\":\"basic\",\"typeName\":\"byte\"},\"nextVersionNumber\":1,\"inferredType\":false},\"v1#0\":{\"@type\":\"variable_versioned\",\"name\":\"v1#0\",\"type\":{\"@type\":\"basic\",\"typeName\":\"byte\"},\"versionOfName\":\"v1\",\"inferredType\":false},\"$0\":{\"@type\":\"variable_intermediate\",\"name\":\"$0\",\"type\":{\"@type\":\"basic\",\"typeName\":\"var\"},\"inferredType\":false},\"main\":{\"@type\":\"label\",\"name\":\"main\",\"intermediate\":false},\"@1\":{\"@type\":\"label\",\"name\":\"@1\",\"intermediate\":true}},\"intermediateVarCount\":1,\"intermediateLabelCount\":2,\"allocation\":null}"; String json = "{\"@type\":\"program\",\"name\":\"\",\"symbols\":{\"v1\":{\"@type\":\"variable_unversioned\",\"name\":\"v1\",\"type\":{\"@type\":\"basic\",\"typeName\":\"byte\"},\"nextVersionNumber\":1,\"inferredType\":false},\"v1#0\":{\"@type\":\"variable_versioned\",\"name\":\"v1#0\",\"type\":{\"@type\":\"basic\",\"typeName\":\"byte\"},\"versionOfName\":\"v1\",\"inferredType\":false},\"$0\":{\"@type\":\"variable_intermediate\",\"name\":\"$0\",\"type\":{\"@type\":\"basic\",\"typeName\":\"var\"},\"inferredType\":false},\"v2\":{\"@type\":\"variable_unversioned\",\"name\":\"v2\",\"type\":{\"@type\":\"pointer\",\"elementType\":{\"@type\":\"basic\",\"typeName\":\"byte\"}},\"nextVersionNumber\":0,\"inferredType\":false},\"v3\":{\"@type\":\"variable_unversioned\",\"name\":\"v3\",\"type\":{\"@type\":\"array\",\"elementType\":{\"@type\":\"basic\",\"typeName\":\"word\"},\"size\":4},\"nextVersionNumber\":0,\"inferredType\":false},\"main\":{\"@type\":\"label\",\"name\":\"main\",\"intermediate\":false},\"@1\":{\"@type\":\"label\",\"name\":\"@1\",\"intermediate\":true}},\"intermediateVarCount\":1,\"intermediateLabelCount\":2,\"allocation\":null}";
assertJsonSerialization(scope, json, Scope.class); assertJsonSerialization(scope, json, Scope.class);
} }
public void testJsonScopeProcedure() throws IOException { public void testJsonScopeProcedure() throws IOException {
Scope scope = new ProgramScope(); Scope scope = new ProgramScope();
scope.addVariable("v1", SymbolTypeBasic.BYTE);
Procedure procedure = scope.addProcedure("main", SymbolTypeBasic.VOID); Procedure procedure = scope.addProcedure("main", SymbolTypeBasic.VOID);
procedure.addVariable("v2", SymbolTypeBasic.BYTE); procedure.addVariable("v2", SymbolTypeBasic.BYTE);
ArrayList<Variable> parameters = new ArrayList<>(); ArrayList<Variable> parameters = new ArrayList<>();
parameters.add(new VariableUnversioned("p1", procedure, SymbolTypeBasic.BYTE)); parameters.add(new VariableUnversioned("p1", procedure, SymbolTypeBasic.BYTE));
parameters.add(new VariableUnversioned("p2", procedure, SymbolTypeBasic.BYTE)); parameters.add(new VariableUnversioned("p2", procedure, SymbolTypeBasic.BOOLEAN));
procedure.setParameters(parameters); procedure.setParameters(parameters);
String json = "{\"@type\":\"program\",\"name\":\"\",\"symbols\":{\"v1\":{\"@type\":\"variable_unversioned\",\"name\":\"v1\",\"type\":{\"@type\":\"basic\",\"typeName\":\"byte\"},\"nextVersionNumber\":0,\"inferredType\":false},\"main\":{\"@type\":\"procedure\",\"name\":\"main\",\"parameterNames\":[\"p1\",\"p2\"],\"symbols\":{\"v2\":{\"@type\":\"variable_unversioned\",\"name\":\"v2\",\"type\":{\"@type\":\"basic\",\"typeName\":\"byte\"},\"nextVersionNumber\":0,\"inferredType\":false},\"p1\":{\"@type\":\"variable_unversioned\",\"name\":\"p1\",\"type\":{\"@type\":\"basic\",\"typeName\":\"byte\"},\"nextVersionNumber\":0,\"inferredType\":false},\"p2\":{\"@type\":\"variable_unversioned\",\"name\":\"p2\",\"type\":{\"@type\":\"basic\",\"typeName\":\"byte\"},\"nextVersionNumber\":0,\"inferredType\":false}},\"intermediateVarCount\":0,\"intermediateLabelCount\":1,\"returnType\":{\"@type\":\"basic\",\"typeName\":\"void\"}}},\"intermediateVarCount\":0,\"intermediateLabelCount\":1,\"allocation\":null}"; String json = "{\"@type\":\"program\",\"name\":\"\",\"symbols\":{\"main\":{\"@type\":\"procedure\",\"name\":\"main\",\"parameterNames\":[\"p1\",\"p2\"],\"symbols\":{\"v2\":{\"@type\":\"variable_unversioned\",\"name\":\"v2\",\"type\":{\"@type\":\"basic\",\"typeName\":\"byte\"},\"nextVersionNumber\":0,\"inferredType\":false},\"p1\":{\"@type\":\"variable_unversioned\",\"name\":\"p1\",\"type\":{\"@type\":\"basic\",\"typeName\":\"byte\"},\"nextVersionNumber\":0,\"inferredType\":false},\"p2\":{\"@type\":\"variable_unversioned\",\"name\":\"p2\",\"type\":{\"@type\":\"basic\",\"typeName\":\"boolean\"},\"nextVersionNumber\":0,\"inferredType\":false}},\"intermediateVarCount\":0,\"intermediateLabelCount\":1,\"returnType\":{\"@type\":\"basic\",\"typeName\":\"void\"}}},\"intermediateVarCount\":0,\"intermediateLabelCount\":1,\"allocation\":null}";
assertJsonSerialization(scope, json, Scope.class); assertJsonSerialization(scope, json, Scope.class);
} }
public static void assertJsonSerialization( public static void assertJsonSerialization(
Object object, Object object,
String json, String json,