private static ClassTree getTopLevelClassTree(VisitorState state) { return (ClassTree) Streams.findLast( Streams.stream(state.getPath().iterator()) .filter((Tree t) -> t.getKind() == Kind.CLASS)) .orElseThrow(() -> new IllegalArgumentException("No enclosing class found")); }
private ClassTree getTopLevelClass(VisitorState state) { return (ClassTree) Streams.findLast( Streams.stream(state.getPath().iterator()) .filter((Tree t) -> t.getKind() == Kind.CLASS)) .orElseThrow(() -> new IllegalArgumentException("No enclosing class found")); }
@Override public Description matchMethodInvocation( MethodInvocationTree methodInvocationTree, VisitorState visitorState) { if (GOOGLE_OPTIONAL_PRESENT.matches(methodInvocationTree, visitorState) || OPTIONAL_PRESENT.matches(methodInvocationTree, visitorState)) { ExpressionTree optionalVar = ASTHelpers.getReceiver(methodInvocationTree); // using an iterator to make sure that only !optional.isPresent() matches and not // !(optional.isPresent() || foo == 7) Iterator<Tree> iter = visitorState.getPath().iterator(); iter.next(); Tree upTree = iter.next(); if (!(upTree instanceof UnaryTree) || upTree.getKind() != Kind.LOGICAL_COMPLEMENT) { return Description.NO_MATCH; } IfTree ifTree = null; ifTree = possibleIf(ifTree, upTree, iter); if (ifTree == null) { return Description.NO_MATCH; } TreeScannerInside treeScannerInside = new TreeScannerInside(); treeScannerInside.scan(ifTree.getThenStatement(), optionalVar); if (treeScannerInside.hasGet && !treeScannerInside.hasAssignment) { return describeMatch(methodInvocationTree); } } return Description.NO_MATCH; }
@Override public Description matchBinary(BinaryTree tree, VisitorState state) { switch (tree.getKind()) { case AND: case OR: break; default: return NO_MATCH; } if (!isSameType(getType(tree), state.getSymtab().booleanType, state)) { return NO_MATCH; } Iterator<Tree> stateIterator = state.getPath().getParentPath().iterator(); Tree parent = stateIterator.next(); if (parent instanceof BinaryTree && (parent.getKind() == Kind.AND || parent.getKind() == Kind.OR)) { return NO_MATCH; } else { SuggestedFix.Builder fix = SuggestedFix.builder(); new TreeScannerBinary(state).scan(tree, fix); return describeMatch(tree, fix.build()); } }
private ClassTree getTopLevelClass(VisitorState state) { return (ClassTree) Streams.findLast( Streams.stream(state.getPath().iterator()) .filter((Tree t) -> t.getKind() == Kind.CLASS)) .orElseThrow(() -> new IllegalArgumentException("No enclosing class found")); }
private static ClassTree getTopLevelClassTree(VisitorState state) { return (ClassTree) Streams.findLast( Streams.stream(state.getPath().iterator()) .filter((Tree t) -> t.getKind() == Kind.CLASS)) .orElseThrow(() -> new IllegalArgumentException("No enclosing class found")); }
@Override public Description matchMethodInvocation( MethodInvocationTree methodInvocationTree, VisitorState visitorState) { if (GOOGLE_OPTIONAL_PRESENT.matches(methodInvocationTree, visitorState) || OPTIONAL_PRESENT.matches(methodInvocationTree, visitorState)) { ExpressionTree optionalVar = ASTHelpers.getReceiver(methodInvocationTree); // using an iterator to make sure that only !optional.isPresent() matches and not // !(optional.isPresent() || foo == 7) Iterator<Tree> iter = visitorState.getPath().iterator(); iter.next(); Tree upTree = iter.next(); if (!(upTree instanceof UnaryTree) || upTree.getKind() != Kind.LOGICAL_COMPLEMENT) { return Description.NO_MATCH; } IfTree ifTree = null; ifTree = possibleIf(ifTree, upTree, iter); if (ifTree == null) { return Description.NO_MATCH; } TreeScannerInside treeScannerInside = new TreeScannerInside(); treeScannerInside.scan(ifTree.getThenStatement(), optionalVar); if (treeScannerInside.hasGet && !treeScannerInside.hasAssignment) { return describeMatch(methodInvocationTree); } } return Description.NO_MATCH; }
@Override public Description matchBinary(BinaryTree tree, VisitorState state) { switch (tree.getKind()) { case AND: case OR: break; default: return NO_MATCH; } if (!isSameType(getType(tree), state.getSymtab().booleanType, state)) { return NO_MATCH; } Iterator<Tree> stateIterator = state.getPath().getParentPath().iterator(); Tree parent = stateIterator.next(); if (parent instanceof BinaryTree && (parent.getKind() == Kind.AND || parent.getKind() == Kind.OR)) { return NO_MATCH; } else { SuggestedFix.Builder fix = SuggestedFix.builder(); new TreeScannerBinary(state).scan(tree, fix); return describeMatch(tree, fix.build()); } }