aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-04-10 20:15:08 +0100
committerMichael Williamson <mike@zwobble.org>2016-04-10 20:16:18 +0100
commite856154d732a8ea798dc679f671e0834d9cbb395 (patch)
tree9695f7e20f6faac142e63e9c15d1e3a72e7542c3 /src/main/java/org/zwobble/couscous
parente687d9cf6246bc0d1b3a407a87599039080b7b9e (diff)
Add reading of empty enums
Diffstat (limited to 'src/main/java/org/zwobble/couscous')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/EnumNode.java77
-rw-r--r--src/main/java/org/zwobble/couscous/ast/Node.java6
-rw-r--r--src/main/java/org/zwobble/couscous/ast/structure/NodeStructure.java5
-rw-r--r--src/main/java/org/zwobble/couscous/ast/visitors/NodeMapper.java1
-rw-r--r--src/main/java/org/zwobble/couscous/ast/visitors/NodeMapperWithDefault.java5
-rw-r--r--src/main/java/org/zwobble/couscous/ast/visitors/NodeTransformer.java9
-rw-r--r--src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitor.java1
-rw-r--r--src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java5
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java15
9 files changed, 122 insertions, 2 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/EnumNode.java b/src/main/java/org/zwobble/couscous/ast/EnumNode.java
new file mode 100644
index 0000000..9e7a0b7
--- /dev/null
+++ b/src/main/java/org/zwobble/couscous/ast/EnumNode.java
@@ -0,0 +1,77 @@
+package org.zwobble.couscous.ast;
+
+import org.zwobble.couscous.ast.visitors.NodeMapper;
+import org.zwobble.couscous.ast.visitors.NodeTransformer;
+import org.zwobble.couscous.types.ScalarType;
+import org.zwobble.couscous.types.Type;
+
+import java.util.List;
+import java.util.Set;
+
+import static org.zwobble.couscous.util.ExtraLists.list;
+import static org.zwobble.couscous.util.ExtraSets.set;
+
+public class EnumNode implements TypeNode {
+ public static EnumNode declareEnum(ScalarType name) {
+ return new EnumNode(name);
+ }
+
+ private final ScalarType name;
+
+ public EnumNode(ScalarType name) {
+ this.name = name;
+ }
+
+ @Override
+ public ScalarType getName() {
+ return name;
+ }
+
+ @Override
+ public List<FormalTypeParameterNode> getTypeParameters() {
+ return list();
+ }
+
+ @Override
+ public Set<Type> getSuperTypes() {
+ return set();
+ }
+
+ @Override
+ public List<MethodNode> getMethods() {
+ return list();
+ }
+
+ @Override
+ public TypeNode transform(NodeTransformer transformer) {
+ return new EnumNode(transformer.transform(name));
+ }
+
+ @Override
+ public String toString() {
+ return "EnumNode(" +
+ "name=" + name +
+ ')';
+ }
+
+ @Override
+ public <T> T accept(NodeMapper<T> visitor) {
+ return visitor.visit(this);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ EnumNode enumNode = (EnumNode) o;
+
+ return name.equals(enumNode.name);
+
+ }
+
+ @Override
+ public int hashCode() {
+ return name.hashCode();
+ }
+}
diff --git a/src/main/java/org/zwobble/couscous/ast/Node.java b/src/main/java/org/zwobble/couscous/ast/Node.java
index 89d9b75..629b93f 100644
--- a/src/main/java/org/zwobble/couscous/ast/Node.java
+++ b/src/main/java/org/zwobble/couscous/ast/Node.java
@@ -167,6 +167,12 @@ public interface Node {
visitor.visit(interfaceNode);
return null;
}
+
+ @Override
+ public Void visit(EnumNode enumNode) {
+ visitor.visit(enumNode);
+ return null;
+ }
});
}
<T> T accept(NodeMapper<T> visitor);
diff --git a/src/main/java/org/zwobble/couscous/ast/structure/NodeStructure.java b/src/main/java/org/zwobble/couscous/ast/structure/NodeStructure.java
index 3e19037..550082c 100644
--- a/src/main/java/org/zwobble/couscous/ast/structure/NodeStructure.java
+++ b/src/main/java/org/zwobble/couscous/ast/structure/NodeStructure.java
@@ -165,6 +165,11 @@ public class NodeStructure {
}
@Override
+ public Stream<? extends Node> visit(EnumNode enumNode) {
+ return Stream.empty();
+ }
+
+ @Override
public Stream<Node> visit(MethodNode methodNode) {
return concatStreams(
methodNode.getAnnotations().stream(),
diff --git a/src/main/java/org/zwobble/couscous/ast/visitors/NodeMapper.java b/src/main/java/org/zwobble/couscous/ast/visitors/NodeMapper.java
index 8b7cb3b..3edece1 100644
--- a/src/main/java/org/zwobble/couscous/ast/visitors/NodeMapper.java
+++ b/src/main/java/org/zwobble/couscous/ast/visitors/NodeMapper.java
@@ -34,4 +34,5 @@ public interface NodeMapper<T> {
T visit(FieldDeclarationNode declaration);
T visit(ClassNode classNode);
T visit(InterfaceNode interfaceNode);
+ T visit(EnumNode enumNode);
}
diff --git a/src/main/java/org/zwobble/couscous/ast/visitors/NodeMapperWithDefault.java b/src/main/java/org/zwobble/couscous/ast/visitors/NodeMapperWithDefault.java
index 6ff3c06..c67116d 100644
--- a/src/main/java/org/zwobble/couscous/ast/visitors/NodeMapperWithDefault.java
+++ b/src/main/java/org/zwobble/couscous/ast/visitors/NodeMapperWithDefault.java
@@ -135,6 +135,11 @@ public class NodeMapperWithDefault<T> implements NodeMapper<T> {
}
@Override
+ public T visit(EnumNode enumNode) {
+ return defaultValue;
+ }
+
+ @Override
public T visit(MethodNode methodNode) {
return defaultValue;
}
diff --git a/src/main/java/org/zwobble/couscous/ast/visitors/NodeTransformer.java b/src/main/java/org/zwobble/couscous/ast/visitors/NodeTransformer.java
index e86e2ee..73d0919 100644
--- a/src/main/java/org/zwobble/couscous/ast/visitors/NodeTransformer.java
+++ b/src/main/java/org/zwobble/couscous/ast/visitors/NodeTransformer.java
@@ -164,6 +164,11 @@ public class NodeTransformer {
public Node visit(InterfaceNode interfaceNode) {
return transformInterface(interfaceNode);
}
+
+ @Override
+ public Node visit(EnumNode enumNode) {
+ return transformEnum(enumNode);
+ }
});
}
@@ -283,6 +288,10 @@ public class NodeTransformer {
return interfaceNode.transform(this);
}
+ private Node transformEnum(EnumNode enumNode) {
+ return enumNode.transform(this);
+ }
+
public List<AnnotationNode> transformAnnotations(List<AnnotationNode> annotations) {
return transformList(annotations, this::transformAnnotation);
}
diff --git a/src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitor.java b/src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitor.java
index 336d016..167e89b 100644
--- a/src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitor.java
+++ b/src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitor.java
@@ -33,4 +33,5 @@ public interface NodeVisitor {
void visit(FieldDeclarationNode declaration);
void visit(ClassNode classNode);
void visit(InterfaceNode interfaceNode);
+ void visit(EnumNode enumNode);
}
diff --git a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java
index 194349f..3989cd4 100644
--- a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java
+++ b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java
@@ -467,6 +467,11 @@ public class CsharpSerializer implements NodeVisitor {
});
}
+ @Override
+ public void visit(EnumNode enumNode) {
+ throw new UnsupportedOperationException();
+ }
+
private void writeType(TypeNode node, String keyword, Action writeBody) {
writer.writeStatement(() -> {
writer.writeKeyword("namespace");
diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java
index 44cbfab..a83be40 100644
--- a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java
+++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java
@@ -88,14 +88,25 @@ public class JavaReader {
}
private void readCompilationUnit(CompilationUnit ast) {
- TypeDeclaration type = (TypeDeclaration)ast.types().get(0);
- classes.add(readTypeDeclaration(type));
+ AbstractTypeDeclaration type = (AbstractTypeDeclaration) ast.types().get(0);
+ if (type instanceof TypeDeclaration) {
+ classes.add(readTypeDeclaration((TypeDeclaration) type));
+ } else if (type instanceof EnumDeclaration) {
+ classes.add(readEnumDeclaration((EnumDeclaration)type));
+ } else {
+ throw new UnsupportedOperationException();
+ }
}
private List<TypeNode> types() {
return this.classes.build();
}
+ private TypeNode readEnumDeclaration(EnumDeclaration type) {
+ ScalarType name = (ScalarType) typeOf(type.resolveBinding());
+ return new EnumNode(name);
+ }
+
private TypeNode readTypeDeclaration(TypeDeclaration type) {
ScalarType name = erasure(typeOf(type.resolveBinding()));
Scope scope = topScope.enterClass(name);