private static boolean isDescendant(Tree descendant, Tree target) { Tree parent = descendant; while (parent != null) { if (parent.equals(target)) { return true; } parent = parent.parent(); } return false; }
private static boolean isPartOfExpression(IdentifierTree identifier, ExpressionTree lastAssignment) { Tree parent = identifier; do { parent = parent.parent(); } while (parent != null && !parent.equals(lastAssignment)); return parent != null; }
private static Tree biggestTreeWithSameEvaluation(Tree booleanExpr, boolean isTrue) { Tree child = booleanExpr; Tree parent = booleanExpr.parent(); while (isBiggerTreeWithSameTruthiness(parent, child, isTrue)) { child = parent; parent = parent.parent(); } Preconditions.checkState(parent != null, "Error getting parent tree with same evaluation, parent is null"); return parent; }
@CheckForNull private static MethodTree getParentMethod(Tree tree) { Tree result = tree; while (result != null && !result.is(Tree.Kind.METHOD)) { result = result.parent(); } return (MethodTree) result; }
@CheckForNull private static SynchronizedStatementTree getParentSynchronizedStatement(IdentifierTree usage) { Tree parent = usage.parent(); while (parent != null && !parent.is(Tree.Kind.SYNCHRONIZED_STATEMENT)) { parent = parent.parent(); } if (parent == null) { return null; } return (SynchronizedStatementTree) parent; }
private void checkUsage(IdentifierTree parameterUsage, MethodTree methodTree) { Tree parameterParent = parameterUsage.parent(); while (!parameterParent.equals(methodTree) && !assertReported.contains(parameterParent)) { if (parameterParent.is(Tree.Kind.ASSERT_STATEMENT)) { assertReported.add((AssertStatementTree) parameterParent); reportIssue(parameterParent, "Replace this assert with a proper check."); return; } parameterParent = parameterParent.parent(); } } }
private static boolean invocationInMethod(MethodInvocationTree mit) { Tree parent = mit.parent(); while (parent != null && !parent.is(Tree.Kind.METHOD)) { parent = parent.parent(); } return parent != null; }
private static boolean isPartOfAnnotation(AssignmentExpressionTree tree) { Tree parent = tree.parent(); while (parent != null) { if (parent.is(Tree.Kind.ANNOTATION)) { return true; } parent = parent.parent(); } return false; }
@CheckForNull private static MethodInvocationTree parentMethodInvocation(MethodInvocationTree method) { Tree parent = method.parent(); if (parent.is(Tree.Kind.MEMBER_SELECT)) { parent = parent.parent(); if (parent.is(Tree.Kind.METHOD_INVOCATION)) { return (MethodInvocationTree) parent; } } return null; }
private static boolean isWithinTryHeader(Tree syntaxNode) { Tree parent = syntaxNode; while (parent != null && !parent.is(Tree.Kind.VARIABLE) ) { parent = parent.parent(); } if (parent != null && parent.is(Tree.Kind.VARIABLE)) { return isTryStatementResource(parent); } return false; }
private static boolean isInCatch(Tree tree) { Tree parent = tree.parent(); return parent != null && !parent.is(Kind.METHOD) && (parent.is(Kind.CATCH) || isInCatch(parent)); } }
private static boolean isAnnotationOnClassOrField(AnnotationTree annotationTree) { if (annotationTree.parent().is(Tree.Kind.MODIFIERS)) { Tree modifiers = annotationTree.parent(); return modifiers.parent().is(Tree.Kind.CLASS, Tree.Kind.VARIABLE); } return false; }
@CheckForNull private static ExpressionTree enumExpressionFromSwitchOnEnum(CaseLabelTree tree) { Tree parent = tree.parent(); while (!parent.is(Tree.Kind.SWITCH_STATEMENT)) { parent = parent.parent(); } ExpressionTree enumExpression = ((SwitchStatementTree) parent).expression(); return enumExpression.symbolType().symbol().isEnum() ? enumExpression : null; }
private void checkBooleanToggling(Tree tree, Symbol identifierSymbol) { Tree parent = tree.parent(); if (parent.is(Tree.Kind.PARENTHESIZED_EXPRESSION)) { checkBooleanToggling(parent, identifierSymbol); } else if (parent.is(Tree.Kind.ASSIGNMENT)) { IdentifierTree variableIdentifier = getVariableIdentifier(((AssignmentExpressionTree) parent).variable()); if (variableIdentifier != null && identifierSymbol.equals(variableIdentifier.symbol())) { reportIssueIfNotInExcludedContext(tree, "AtomicBoolean"); } } }
@Override protected void onMethodInvocationFound(MethodInvocationTree mit) { Tree parent = mit.parent(); while (parent != null && !parent.is(Tree.Kind.METHOD)) { parent = parent.parent(); } if (parent != null && THREAD_RUN_METHOD_MATCHER.matches((MethodTree) parent)) { return; } reportIssue(ExpressionUtils.methodName(mit), "Call the method Thread.start() to execute the content of the run() method in a dedicated thread."); }
private static boolean isInsideIfStatementWithNullCheckWithoutElse(MethodInvocationTree mit) { Tree parent = mit.parent(); while (parent != null && !parent.is(Tree.Kind.IF_STATEMENT)) { parent = parent.parent(); } if (parent == null) { return false; } IfStatementTree ifStatementTree = (IfStatementTree) parent; return ifStatementTree.elseStatement() == null && isNullCheck(ExpressionUtils.skipParentheses(ifStatementTree.condition())); }
private static boolean isCastToHttpUrlConnection(Tree parent) { if (parent.is(Tree.Kind.PARENTHESIZED_EXPRESSION)) { return isCastToHttpUrlConnection(parent.parent()); } else if (parent.is(Tree.Kind.TYPE_CAST)) { return ((TypeCastTree) parent).type().symbolType().is("java.net.HttpURLConnection"); } return false; }
private static boolean isEnclosingClassFinal(ExpressionTree expressionTree) { if (expressionTree.is(IDENTIFIER)) { Tree parent = expressionTree.parent(); while (!parent.is(METHOD, CONSTRUCTOR)) { parent = parent.parent(); } return ((MethodTree) parent).symbol().owner().isFinal(); } return ((MemberSelectExpressionTree) expressionTree).expression().symbolType().symbol().isFinal(); } }