diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-02-28 11:42:34 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-02-28 11:42:34 +0000 |
| commit | 4330f93c6e694b546b7f3e7bfd2e18b93b15fbab (patch) | |
| tree | 410b118f06476f609b07c76ee2e5df5b7203e8c0 | |
| parent | 4e4f98062c07afdeef14d4031ca69668649e5873 (diff) | |
Support reading of empty interfaces
3 files changed, 47 insertions, 8 deletions
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 6e7f3fc..4eb7c7d 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java @@ -17,6 +17,7 @@ import java.nio.file.Path; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.Set; import java.util.function.Function; import static com.google.common.collect.Iterables.concat; @@ -65,18 +66,24 @@ public class JavaReader { classes = ImmutableList.builder(); } - private ClassNode readCompilationUnit(CompilationUnit ast) { + private TypeNode readCompilationUnit(CompilationUnit ast) { TypeName name = generateClassName(ast); Scope scope = Scope.create().enterClass(name); TypeDeclaration type = (TypeDeclaration)ast.types().get(0); TypeDeclarationBody body = readTypeDeclarationBody(scope, name, type.bodyDeclarations()); - return ClassNode.declareClass( - name, - superTypes(type), - body.getFields(), - body.getStaticConstructor(), - body.getConstructor(), - body.getMethods()); + Set<TypeName> superTypes = superTypes(type); + if (type.isInterface()) { + // TODO: throw exception if other parts of body are declared + return InterfaceNode.declareInterface(name, superTypes, body.getMethods()); + } else { + return ClassNode.declareClass( + name, + superTypes, + body.getFields(), + body.getStaticConstructor(), + body.getConstructor(), + body.getMethods()); + } } GeneratedClosure readExpressionMethodReference(Scope outerScope, ExpressionMethodReference expression) { diff --git a/src/main/java/org/zwobble/couscous/util/ExtraSets.java b/src/main/java/org/zwobble/couscous/util/ExtraSets.java new file mode 100644 index 0000000..ab3dd16 --- /dev/null +++ b/src/main/java/org/zwobble/couscous/util/ExtraSets.java @@ -0,0 +1,17 @@ +package org.zwobble.couscous.util; + +import com.google.common.collect.ImmutableSet; + +import java.util.Set; + +public class ExtraSets { + private ExtraSets() {} + + public static <T> Set<T> set() { + return ImmutableSet.of(); + } + + public static <T> Set<T> set(T value1) { + return ImmutableSet.of(value1); + } +} diff --git a/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java b/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java index dc5965a..e6a7a3e 100644 --- a/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java +++ b/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java @@ -8,7 +8,9 @@ import org.zwobble.couscous.values.StringValue; import java.util.List; +import static org.hamcrest.Matchers.hasSize; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; import static org.zwobble.couscous.ast.AnnotationNode.annotation; import static org.zwobble.couscous.ast.AssignmentNode.assign; import static org.zwobble.couscous.ast.AssignmentNode.assignStatement; @@ -27,6 +29,7 @@ import static org.zwobble.couscous.ast.VariableReferenceNode.reference; import static org.zwobble.couscous.ast.WhileNode.whileLoop; import static org.zwobble.couscous.tests.frontends.java.JavaReading.*; import static org.zwobble.couscous.util.ExtraLists.list; +import static org.zwobble.couscous.util.ExtraSets.set; public class JavaReaderTests { @Test @@ -296,4 +299,16 @@ public class JavaReaderTests { list(returns(boxInt(literal(1)))), method.getBody()); } + + @Test + public void canReadEmptyInterface() { + String source = "package com.example;" + + "public interface Example {}"; + List<TypeNode> classes = readSource("com/example/Example.java", source); + assertThat(classes, hasSize(1)); + InterfaceNode classNode = (InterfaceNode) classes.get(0); + assertEquals(TypeName.of("com.example.Example"), classNode.getName()); + assertEquals(list(), classNode.getMethods()); + assertEquals(set(ObjectValues.OBJECT), classNode.getSuperTypes()); + } } |
