public Measurer(Project project, SensorContext context, boolean separateAccessorsFromMethods) { this.project = project; this.sensorContext = context; this.separateAccessorsFromMethods = separateAccessorsFromMethods; accessorVisitor = new AccessorVisitor(); }
private boolean isGetter(ClassTree classTree, MethodTree methodTree) { return methodTree.parameters().isEmpty() && hasOneReturnStatement(methodTree, classTree) && (isValidGetter(methodTree) || isBooleanGetter(methodTree)); }
private boolean isAccessor(MethodTree methodTree) { return analyseAccessors && accessorVisitor.isAccessor(classTrees.peek(), methodTree); }
public boolean isAccessor(ClassTree classTree, MethodTree methodTree) { return isPublicMethod(methodTree) && methodTree.block() != null && (isGetter(classTree, methodTree) || isSetter(classTree, methodTree)); }
private boolean isSetter(ClassTree classTree, MethodTree methodTree) { return methodTree.simpleName().name().startsWith("set") && methodTree.parameters().size() == 1 && returnTypeIs(methodTree, "void") && hasOneAssignementStatement(methodTree, classTree); }
private boolean referencePrivateProperty(AssignmentExpressionTree assignmentExpressionTree, ClassTree classTree) { return referencePrivateProperty(assignmentExpressionTree.variable(), classTree); }
private boolean hasOneReturnStatement(MethodTree methodTree, ClassTree classTree) { List<StatementTree> body = methodTree.block().body(); return body.size() == 1 && body.get(0).is(Tree.Kind.RETURN_STATEMENT) && referencePrivateProperty((ReturnStatementTree) body.get(0), classTree); }
private boolean referencePrivateProperty(ReturnStatementTree returnStatementTree, ClassTree classTree) { ExpressionTree expression = returnStatementTree.expression(); String variableName = ""; if (expression == null) { return false; } else if(expression.is(Tree.Kind.IDENTIFIER)) { variableName = ((IdentifierTree)expression).name(); } return !StringUtils.isEmpty(variableName) && referencePrivateProperty(variableName, classTree); }
@Override public void visitNode(Tree tree) { if (isClassTree(tree)) { classes++; classTrees.push((ClassTree) tree); } if (tree.is(Tree.Kind.NEW_CLASS) && ((NewClassTree) tree).classBody() != null) { classes--; } if (tree.is(Tree.Kind.METHOD, Tree.Kind.CONSTRUCTOR) && classTrees.peek().simpleName() != null) { //don't count methods in anonymous classes. MethodTree methodTree = (MethodTree) tree; if (separateAccessorsFromMethods && accessorVisitor.isAccessor(classTrees.peek(), methodTree)) { accessors++; } else { methods++; int methodComplexity = context.getMethodComplexity(classTrees.peek(), methodTree); methodComplexityDistribution.add(methodComplexity); complexityInMethods += methodComplexity; } } }
private PublicApiChecker(boolean separateAccessorsFromMethods) { this.separateAccessorsFromMethods = separateAccessorsFromMethods; this.accessorVisitor = new AccessorVisitor(); }
private boolean hasOneAssignementStatement(MethodTree methodTree, ClassTree classTree) { List<StatementTree> body = methodTree.block().body(); return body.size() == 1 && body.get(0).is(Tree.Kind.EXPRESSION_STATEMENT) && ((ExpressionStatementTree) body.get(0)).expression().is(Tree.Kind.ASSIGNMENT) && referencePrivateProperty((AssignmentExpressionTree) ((ExpressionStatementTree) body.get(0)).expression(), classTree); }
public boolean isPublicApi(ClassTree classTree, MethodTree methodTree) { Preconditions.checkNotNull(classTree); if (separateAccessorsFromMethods && accessorVisitor.isAccessor(classTree, methodTree)) { return false; } else if (isPublicInterface(classTree)) { return !hasOverrideAnnotation(methodTree); } else if (isEmptyDefaultConstructor(methodTree) || hasOverrideAnnotation(methodTree) || classTree.is(Tree.Kind.INTERFACE, Tree.Kind.ANNOTATION_TYPE)) { return false; } return hasPublic(methodTree.modifiers()); }
private boolean referencePrivateProperty(ExpressionTree expression, ClassTree classTree) { String variableReturned = ""; if (expression.is(Tree.Kind.IDENTIFIER)) { variableReturned = ((IdentifierTree) expression).name(); } else if (expression.is(Tree.Kind.MEMBER_SELECT)) { variableReturned = ((MemberSelectExpressionTree) expression).identifier().name(); } return !StringUtils.isEmpty(variableReturned) && referencePrivateProperty(variableReturned, classTree); }