I'm working on a custom check, to make sure a call to `initialResult()` is done whenever a call to `updates()` is done on the same symbol. Most of the check works fine but I have trouble with method references. I based my check hugely on ByteBufferBackingArray check that is already in errorprone.
example code in test ;
// CORRECT
Mono.defer(() -> Mono.just(queryGateway.subscriptionQuery(
new Object(), Void.class, Object.class)))
.doOnNext(SubscriptionQueryResult::initialResult)
.flatMapMany(SubscriptionQueryResult::updates);
// INCORRECT
Mono.defer(() -> Mono.just(queryGateway.subscriptionQuery(
new Object(), Void.class, Object.class)))
// BUG: Diagnostic matches: X
.flatMapMany(SubscriptionQueryResult::updates);
the part of the code to check this;
@Override
matchMemberReference(){
...
if (updateSymbol instanceof ClassSymbol) {
MethodTree enclosingMethod = ASTHelpers.findEnclosingMethod(state);
if (enclosingMethod == null || ValidSubscriptionQueryScanner.scan(enclosingMethod,
state,
updateSymbol)
) {
return Description.NO_MATCH;
}
}
}
....
private static class ValidSubscriptionQueryScanner extends TreeScanner<Void, VisitorState> {
private final Symbol searchedUpdateSymbol;
private boolean valid;
private ValidSubscriptionQueryScanner(Symbol searchedUpdateSymbol) {
this.searchedUpdateSymbol = searchedUpdateSymbol;
}
static boolean scan(Tree tree, VisitorState state, Symbol searchedBufferSymbol) {
ValidSubscriptionQueryScanner visitor = new ValidSubscriptionQueryScanner(
searchedBufferSymbol);
tree.accept(visitor, state);
return visitor.valid;
}
@Override
public Void visitMethodInvocation(MethodInvocationTree tree, VisitorState state) {
return matches(tree, state) ? null : super.visitMethodInvocation(tree, state);
}
@Override
public Void visitMemberReference(MemberReferenceTree tree, VisitorState state) {
return matches(tree, state) ? null :super.visitMemberReference(tree,state);
}
private boolean matches(ExpressionTree tree, VisitorState state) {
if (valid) {
return true;
}
Symbol updateSymbol = ASTHelpers.getSymbol(ASTHelpers.getReceiver(tree));
if (searchedUpdateSymbol.equals(updateSymbol) && SQ_INITIALRESULT_MATCHER.matches(tree,
state)) {
valid = true;
}
return false;
}
}
The problem is that the updates() in the incorrect piece is mapping to the initialResult in the correct one. How can I make sure that these are compared separately and that the test will fail.