@Override public String toString() { if (elements.isEmpty()) { return "empty"; } Tree firstElement = elements.get(0); if (firstElement.is(Tree.Kind.LABEL)) { firstElement = elements.get(1); } return firstElement.toString(); } }
@Override public String toString() { if (elements.isEmpty()) { return "empty"; } Tree firstElement = elements.get(0); if (firstElement.is(Tree.Kind.LABEL)) { firstElement = elements.get(1); } return firstElement.toString(); } }
@Nullable private static String getName(Tree member) { // Skipping other complex expression return member.is(Kind.NAME_IDENTIFIER) ? ((NameIdentifierTree) member).text() : null; }
private static boolean isMemberAccess(Tree tree, Set<String> expectedNames) { if (tree.is(Tree.Kind.OBJECT_MEMBER_ACCESS)) { Tree member = ((MemberAccessTree) tree).member(); if (member.is(Tree.Kind.NAME_IDENTIFIER)) { return expectedNames.contains(((NameIdentifierTree) member).text().toLowerCase(Locale.ROOT)); } } return false; } }
private static boolean isIgnoredJump(Tree tree) { if (tree.is(Kind.RETURN_STATEMENT) && (((ReturnStatementTree) tree).expression() != null || tree.getParent().is(Kind.CASE_CLAUSE, Kind.DEFAULT_CLAUSE))) { return true; } // ignore jumps in try statement because CFG is not precise Tree tryAncestor = TreeUtils.findAncestorWithKind(tree, ImmutableList.of(Kind.TRY_STATEMENT)); return tryAncestor != null; } }
private static List<String> getVariablesFromList(ListExpressionTree listExpressionTree) { List<String> names = new ArrayList<>(); for (Optional<ArrayAssignmentPatternElementTree> element : listExpressionTree.elements()) { if (element.isPresent() && element.get().variable().is(Kind.VARIABLE_IDENTIFIER)) { names.add(((VariableIdentifierTree) element.get().variable()).variableExpression().text()); } } return names; }
private boolean visitAssignedVariable(Tree tree) { if (!tree.is(Tree.Kind.VARIABLE_IDENTIFIER)) { return false; } Symbol varSym = symbols.getSymbol(tree); if (isLocalVariable(varSym)) { VariableUsage usage = variables.computeIfAbsent(varSym, s -> new VariableUsage()); usage.isWrite = true; return true; } return false; }
private boolean visitAssignedVariable(Tree tree) { if (!tree.is(Tree.Kind.VARIABLE_IDENTIFIER)) { return false; } Symbol varSym = symbols.getSymbol(tree); if (isLocalVariable(varSym)) { VariableUsage usage = variables.computeIfAbsent(varSym, s -> new VariableUsage()); usage.isWrite = true; return true; } return false; }
private static String getValue(Tree tree) { if (tree.is(Tree.Kind.NUMERIC_LITERAL) || tree.is(Tree.Kind.REGULAR_STRING_LITERAL)) { return ((LiteralTree) tree).value(); } if (tree.is(Tree.Kind.NAMESPACE_NAME)) { return ((NamespaceNameTree) tree).fullName(); } throw new IllegalArgumentException("Cannot get literal value from tree"); } }
@Override public void visitNode(Tree tree) { if (tree.is(Kind.COMPILATION_UNIT)) { fileMeasures.setFileComplexity(ComplexityVisitor.complexity(tree)); fileMeasures.setFileCognitiveComplexity(CognitiveComplexityVisitor.complexity((CompilationUnitTree) tree)); } else if (tree.is(CLASS_NODES)) { fileMeasures.addClassComplexity(ComplexityVisitor.complexity(tree)); } else if (tree.is(FUNCTION_NODES)) { fileMeasures.addFunctionComplexity(ComplexityVisitor.complexity(tree)); } }
@Override public void visitNode(Tree tree) { if (tree.is(Kind.COMPILATION_UNIT)) { fileMeasures.setFileComplexity(ComplexityVisitor.complexity(tree)); fileMeasures.setFileCognitiveComplexity(CognitiveComplexityVisitor.complexity((CompilationUnitTree) tree)); } else if (tree.is(CLASS_NODES)) { fileMeasures.addClassComplexity(ComplexityVisitor.complexity(tree)); } else if (tree.is(FUNCTION_NODES)) { fileMeasures.addFunctionComplexity(ComplexityVisitor.complexity(tree)); } }
@Override public void visitAssignmentExpression(AssignmentExpressionTree tree) { Tree parent = getParent(tree); if (!parent.is(ALLOWED_PARENTS)) { SyntaxToken toReport = getToken(tree); context().newIssue(this, toReport, String.format("Extract the assignment of \"%s\" from this expression.", tree.variable().toString())); } super.visitAssignmentExpression(tree); }
private void checkBlock(Tree body, SyntaxToken prevToken) { if (body.is(Kind.BLOCK)) { BlockTree blockTree = (BlockTree)body; SyntaxToken nextToken = getFirstToken(blockTree.statements()); if (nextToken == null) { nextToken = blockTree.closeCurlyBraceToken(); } checkOpenCurlyBrace(blockTree.openCurlyBraceToken(), blockTree.closeCurlyBraceToken(), prevToken, nextToken); } }
private void checkBlock(Tree body, SyntaxToken prevToken) { if (body.is(Kind.BLOCK)) { BlockTree blockTree = (BlockTree)body; SyntaxToken nextToken = getFirstToken(blockTree.statements()); if (nextToken == null) { nextToken = blockTree.closeCurlyBraceToken(); } checkOpenCurlyBrace(blockTree.openCurlyBraceToken(), blockTree.closeCurlyBraceToken(), prevToken, nextToken); } }
private boolean isSuspiciousStaticFunction(ExpressionTree callee) { if (callee.is(Tree.Kind.CLASS_MEMBER_ACCESS)) { MemberAccessTreeImpl memberAccess = (MemberAccessTreeImpl) callee; if (memberAccess.object().is(Tree.Kind.NAMESPACE_NAME) && memberAccess.member().is(Tree.Kind.NAME_IDENTIFIER)) { QualifiedName className = getFullyQualifiedName((NamespaceNameTree) memberAccess.object()); String memberName = ((NameIdentifierTree) memberAccess.member()).text(); return SUSPICIOUS_STATIC_FUNCTIONS.stream().anyMatch(staticFunctionCall -> staticFunctionCall.matches(className, memberName)); } } return false; }
private boolean isSuspiciousStaticFunction(ExpressionTree callee) { if (callee.is(Tree.Kind.CLASS_MEMBER_ACCESS)) { MemberAccessTreeImpl memberAccess = (MemberAccessTreeImpl) callee; if (memberAccess.object().is(Tree.Kind.NAMESPACE_NAME) && memberAccess.member().is(Tree.Kind.NAME_IDENTIFIER)) { QualifiedName className = getFullyQualifiedName((NamespaceNameTree) memberAccess.object()); String memberName = ((NameIdentifierTree) memberAccess.member()).text(); return SUSPICIOUS_STATIC_FUNCTIONS.stream().anyMatch(staticFunctionCall -> staticFunctionCall.matches(className, memberName)); } } return false; }
@Override public void visitMethodDeclaration(MethodDeclarationTree tree) { if (tree.body().is(Tree.Kind.BLOCK)) { checkDeclarationOpenCurly(getPreviousToken(tree.parameters()), ((BlockTree) tree.body()).openCurlyBraceToken()); } super.visitMethodDeclaration(tree); }
@Override public void visitAssignmentExpression(AssignmentExpressionTree tree) { boolean isCompoundAssignment = tree.getKind() != Tree.Kind.ASSIGNMENT; boolean isUsedAsNamedParameterOrReturn = tree.getParent().is(Tree.Kind.FUNCTION_CALL, Tree.Kind.RETURN_STATEMENT); if (isCompoundAssignment || isUsedAsNamedParameterOrReturn) { visitReadVariable(tree.variable()); } if (!visitAssignedVariable(tree.variable())) { tree.variable().accept(this); } tree.value().accept(this); }
@Override public void visitAssignmentExpression(AssignmentExpressionTree tree) { boolean isCompoundAssignment = tree.getKind() != Tree.Kind.ASSIGNMENT; boolean isUsedAsNamedParameterOrReturn = tree.getParent().is(Tree.Kind.FUNCTION_CALL, Tree.Kind.RETURN_STATEMENT); if (isCompoundAssignment || isUsedAsNamedParameterOrReturn) { visitReadVariable(tree.variable()); } if (!visitAssignedVariable(tree.variable())) { tree.variable().accept(this); } tree.value().accept(this); }