aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous/frontends
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-03-08 11:01:29 +0000
committerMichael Williamson <mike@zwobble.org>2016-03-08 11:01:29 +0000
commit95669601271985c89a10d673571dd89133f1e2e8 (patch)
tree866d294696522f721cab97b8a1fb020945cf1d75 /src/main/java/org/zwobble/couscous/frontends
parentc532706e0f20a07be960e4d2ca4d89d850312174 (diff)
Read formal type parameters
Diffstat (limited to 'src/main/java/org/zwobble/couscous/frontends')
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java13
1 files changed, 12 insertions, 1 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 a071127..73cf749 100644
--- a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java
+++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java
@@ -25,6 +25,7 @@ import static org.zwobble.couscous.ast.AssignmentNode.assignStatement;
import static org.zwobble.couscous.ast.ConstructorNode.constructor;
import static org.zwobble.couscous.ast.FieldAccessNode.fieldAccess;
import static org.zwobble.couscous.ast.FieldDeclarationNode.field;
+import static org.zwobble.couscous.ast.FormalTypeParameterNode.formalTypeParameter;
import static org.zwobble.couscous.ast.InstanceReceiver.instanceReceiver;
import static org.zwobble.couscous.ast.StaticReceiver.staticReceiver;
import static org.zwobble.couscous.ast.ThisReferenceNode.thisReference;
@@ -82,14 +83,16 @@ public class JavaReader {
private TypeNode readTypeDeclaration(TypeDeclaration type) {
TypeName name = typeOf(type.resolveBinding());
Scope scope = topScope.enterClass(name);
+ List<FormalTypeParameterNode> typeParameters = readTypeParameters(type);
TypeDeclarationBody body = readTypeDeclarationBody(scope, name, type.bodyDeclarations());
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());
+ return InterfaceNode.declareInterface(name, typeParameters, superTypes, body.getMethods());
} else {
return ClassNode.declareClass(
name,
+ typeParameters,
superTypes,
body.getFields(),
body.getStaticConstructor(),
@@ -98,6 +101,12 @@ public class JavaReader {
}
}
+ private List<FormalTypeParameterNode> readTypeParameters(TypeDeclaration typeDeclaration) {
+ return eagerMap(
+ asList(typeDeclaration.resolveBinding().getTypeParameters()),
+ parameter -> formalTypeParameter(parameter.getName()));
+ }
+
GeneratedClosure readExpressionMethodReference(Scope outerScope, ExpressionMethodReference expression) {
return readLambda(
outerScope,
@@ -226,6 +235,7 @@ public class JavaReader {
ClassNode generatedClass = new ClassNode(
classNode.getName(),
+ classNode.getTypeParameters(),
classNode.getSuperTypes(),
fields,
list(),
@@ -248,6 +258,7 @@ public class JavaReader {
) {
return classWithCapture(scope, ClassNode.declareClass(
className,
+ list(),
anonymousClass.getSuperTypes(),
anonymousClass.getFields(),
list(),