diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-03-10 16:44:06 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-03-10 16:44:06 +0000 |
| commit | 91b7c07a12c15a34a2e01dd1af0f163c72f79587 (patch) | |
| tree | a44c4c270be1a957bf0344e2d8572cf6c696bc84 /src/main | |
| parent | 2a182825a88b6ee957e205862f5cf3a505b3a173 (diff) | |
Move signature(IMethodBinding) to separate class
Diffstat (limited to 'src/main')
3 files changed, 45 insertions, 33 deletions
diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java index 72766b3..096162f 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java @@ -184,7 +184,7 @@ public class JavaExpressionReader { List<ExpressionNode> arguments = readArguments( expression.resolveMethodBinding(), expression.arguments()); - MethodSignature signature = JavaReader.signature(expression.resolveMethodBinding()); + MethodSignature signature = JavaMethods.signature(expression.resolveMethodBinding()); final Type type = signature.getReturnType(); IMethodBinding methodBinding = expression.resolveMethodBinding(); diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaMethods.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaMethods.java new file mode 100644 index 0000000..42211fe --- /dev/null +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaMethods.java @@ -0,0 +1,43 @@ +package org.zwobble.couscous.frontends.java; + +import com.google.common.collect.Iterables; +import org.eclipse.jdt.core.dom.IMethodBinding; +import org.eclipse.jdt.core.dom.ITypeBinding; +import org.zwobble.couscous.ast.MethodSignature; +import org.zwobble.couscous.ast.types.BoundTypeParameter; +import org.zwobble.couscous.ast.types.Type; +import org.zwobble.couscous.ast.types.TypeParameter; + +import java.util.List; + +import static java.util.Arrays.asList; +import static org.zwobble.couscous.frontends.java.JavaTypes.typeOf; +import static org.zwobble.couscous.util.ExtraLists.eagerMap; + +class JavaMethods { + static MethodSignature signature(IMethodBinding method) { + ITypeBinding declaringClass = method.getDeclaringClass(); + ITypeBinding erasedDeclaringClass = declaringClass.getErasure(); + + List<Type> argumentTypes = eagerMap(asList(method.getParameterTypes()), JavaTypes::typeOf); + Type returnType = typeOf(method.getReturnType()); + + if (declaringClass.isEqualTo(erasedDeclaringClass)) { + return new MethodSignature(method.getName(), argumentTypes, returnType); + } else { + IMethodBinding[] erasedMethods = erasedDeclaringClass.getDeclaredMethods(); + IMethodBinding erasedMethod = Iterables.getOnlyElement(Iterables.filter( + asList(erasedMethods), + m -> m.isSubsignature(method))); + return new MethodSignature( + method.getName(), + eagerMap( + argumentTypes, + asList(erasedMethod.getParameterTypes()), + (argumentType, erasedParameterType) -> new BoundTypeParameter((TypeParameter) typeOf(erasedParameterType), argumentType)), + new BoundTypeParameter( + (TypeParameter) typeOf(erasedMethod.getReturnType()), + returnType)); + } + } +} 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 382c592..4afe02b 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java @@ -1,7 +1,6 @@ package org.zwobble.couscous.frontends.java; import com.google.common.collect.ImmutableList; -import com.google.common.collect.Iterables; import com.google.common.collect.Maps; import org.eclipse.jdt.core.compiler.IProblem; import org.eclipse.jdt.core.dom.*; @@ -9,10 +8,8 @@ import org.zwobble.couscous.ast.*; import org.zwobble.couscous.ast.sugar.AnonymousClass; import org.zwobble.couscous.ast.sugar.Lambda; import org.zwobble.couscous.ast.sugar.TypeDeclarationBody; -import org.zwobble.couscous.ast.types.BoundTypeParameter; import org.zwobble.couscous.ast.types.ScalarType; import org.zwobble.couscous.ast.types.Type; -import org.zwobble.couscous.ast.types.TypeParameter; import org.zwobble.couscous.ast.visitors.NodeTransformer; import org.zwobble.couscous.util.ExtraLists; @@ -434,38 +431,10 @@ public class JavaReader { return ExtraLists.concat(list(declaringClass), asList(declaringClass.getInterfaces())) .stream() .flatMap(type -> asList(type.getDeclaredMethods()).stream().filter(superMethod -> methodBinding.overrides(superMethod))) - .map(JavaReader::signature) + .map(JavaMethods::signature) .collect(Collectors.toList()); } - // TODO: move this elsewhere - static MethodSignature signature(IMethodBinding method) { - ITypeBinding declaringClass = method.getDeclaringClass(); - ITypeBinding erasedDeclaringClass = declaringClass.getErasure(); - - List<Type> argumentTypes = eagerMap(asList(method.getParameterTypes()), JavaTypes::typeOf); - Type returnType = typeOf(method.getReturnType()); - - if (declaringClass.isEqualTo(erasedDeclaringClass)) { - return new MethodSignature(method.getName(), argumentTypes, returnType); - } else { - IMethodBinding[] erasedMethods = erasedDeclaringClass.getDeclaredMethods(); - IMethodBinding erasedMethod = Iterables.getOnlyElement(Iterables.filter( - asList(erasedMethods), - m -> m.isSubsignature(method))); - return new MethodSignature( - method.getName(), - eagerMap( - argumentTypes, - asList(erasedMethod.getParameterTypes()), - (argumentType, erasedParameterType) -> new BoundTypeParameter((TypeParameter) typeOf(erasedParameterType), argumentType)), - new BoundTypeParameter( - (TypeParameter) typeOf(erasedMethod.getReturnType()), - returnType)); - } - } - - private List<AnnotationNode> readAnnotations(MethodDeclaration method) { return eagerMap(asList(method.resolveBinding().getAnnotations()), this::readAnnotation); } |
