Skip to content

Commit dfb45f3

Browse files
committed
Split method parser
1 parent e31bf61 commit dfb45f3

1 file changed

Lines changed: 34 additions & 5 deletions

File tree

src/main/java/com/garciat/typeclasses/processor/WitnessResolutionChecker.java

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import com.sun.source.util.TreePathScanner;
2020
import com.sun.source.util.Trees;
2121
import java.lang.reflect.Method;
22+
import javax.lang.model.element.Element;
2223
import javax.lang.model.element.ExecutableElement;
2324
import javax.lang.model.element.TypeElement;
2425
import javax.lang.model.type.DeclaredType;
@@ -72,7 +73,10 @@ private WitnessCallScanner(Trees trees) {
7273

7374
@Override
7475
public Void visitMethodInvocation(MethodInvocationTree node, Void arg) {
75-
Parser.unaryMethodCallArgument(WITNESS_METHOD)
76+
Parser.unaryCallArgument()
77+
.guard(
78+
Parser.<MethodInvocationTree>currentElement()
79+
.flatMap(Parser.methodMatches(WITNESS_METHOD)))
7680
.flatMap(Parser.newAnonymousClassBody())
7781
.flatMap(Parser.singleImplementsClause())
7882
.flatMap(Parser.treeTypeMirror())
@@ -110,13 +114,38 @@ default <S> Parser<T, S> flatMap(Parser<R, S> next) {
110114
this.parse(trees, current, input).flatMap(r -> next.parse(trees, current, r));
111115
}
112116

113-
static Parser<MethodInvocationTree, ExpressionTree> unaryMethodCallArgument(Method target) {
117+
default Parser<T, R> guard(Parser<T, ?> predicate) {
118+
return (trees, current, input) ->
119+
predicate.parse(trees, current, input).flatMap(ignore -> this.parse(trees, current, input));
120+
}
121+
122+
static <A> Parser<A, Element> currentElement() {
114123
return (trees, current, input) -> {
115-
if (trees.getElement(current) instanceof ExecutableElement method
124+
Element element = trees.getElement(current);
125+
if (element != null) {
126+
return Maybe.just(element);
127+
} else {
128+
return Maybe.nothing();
129+
}
130+
};
131+
}
132+
133+
static Parser<Element, ExecutableElement> methodMatches(Method target) {
134+
return (trees, current, input) -> {
135+
if (input instanceof ExecutableElement method
116136
&& method.getSimpleName().contentEquals(target.getName())
117137
&& method.getEnclosingElement() instanceof TypeElement methodOwner
118-
&& methodOwner.getQualifiedName().contentEquals(target.getDeclaringClass().getName())
119-
&& input.getArguments().size() == 1) {
138+
&& methodOwner.getQualifiedName().contentEquals(target.getDeclaringClass().getName())) {
139+
return Maybe.just(method);
140+
} else {
141+
return Maybe.nothing();
142+
}
143+
};
144+
}
145+
146+
static Parser<MethodInvocationTree, ExpressionTree> unaryCallArgument() {
147+
return (trees, current, input) -> {
148+
if (input.getArguments().size() == 1) {
120149
return Maybe.just(input.getArguments().getFirst());
121150
} else {
122151
return Maybe.nothing();

0 commit comments

Comments
 (0)