From: Godin Date: Wed, 3 Nov 2010 16:13:06 +0000 (+0000) Subject: SONAR-1901: Fix UndocumentedApiCheck X-Git-Tag: 2.6~668 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=db1aa08abd0210d57d9f412eb1532f98d03cc08a;p=sonarqube.git SONAR-1901: Fix UndocumentedApiCheck --- diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/check/UndocumentedApiCheck.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/check/UndocumentedApiCheck.java index 0a8aa111b04..2661a204dd2 100644 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/check/UndocumentedApiCheck.java +++ b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/check/UndocumentedApiCheck.java @@ -12,7 +12,6 @@ import org.sonar.squid.api.CheckMessage; import org.sonar.squid.api.SourceClass; import org.sonar.squid.api.SourceCode; import org.sonar.squid.api.SourceFile; -import org.sonar.squid.measures.Metric; import com.puppycrawl.tools.checkstyle.api.DetailAST; @@ -40,7 +39,7 @@ public class UndocumentedApiCheck extends JavaAstCheck { SourceCode currentResource = peekSourceCode(); SourceClass sourceClass = peekParentClass(); if (PatternUtils.matches(sourceClass.getKey(), getMatchers())) { - if (currentResource.getDouble(Metric.PUBLIC_API) > 0 && currentResource.getDouble(Metric.PUBLIC_DOC_API) == 0) { + if (PublicApiVisitor.isPublicApi(ast) && !PublicApiVisitor.isDocumentedApi(ast, getFileContents())) { SourceFile sourceFile = currentResource.getParent(SourceFile.class); CheckMessage message = new CheckMessage(this, "Avoid undocumented API"); message.setLine(ast.getLineNo()); diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/PublicApiVisitor.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/PublicApiVisitor.java index 625387ba0fb..a3ef8fa608e 100644 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/PublicApiVisitor.java +++ b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/PublicApiVisitor.java @@ -19,12 +19,14 @@ */ package org.sonar.java.ast.visitor; +import org.sonar.java.ast.check.UndocumentedApiCheck; import org.sonar.squid.api.SourceCode; import org.sonar.squid.measures.Metric; import antlr.collections.AST; import com.puppycrawl.tools.checkstyle.api.DetailAST; +import com.puppycrawl.tools.checkstyle.api.FileContents; import com.puppycrawl.tools.checkstyle.api.Scope; import com.puppycrawl.tools.checkstyle.api.TokenTypes; @@ -57,19 +59,15 @@ public class PublicApiVisitor extends JavaAstVisitor { } } - private boolean isPublicApi(DetailAST ast) { - return isPublic(ast) && !isStaticFinalVariable(ast) && !isMethodWithOverrideAnnotation(ast) && !isEmptyDefaultConstructor(ast); - } - - private boolean isEmptyDefaultConstructor(DetailAST ast) { + private static boolean isEmptyDefaultConstructor(DetailAST ast) { return (isConstructorWithoutParameters(ast)) && (ast.getLastChild().getChildCount() == 1); } - private boolean isConstructorWithoutParameters(DetailAST ast) { + private static boolean isConstructorWithoutParameters(DetailAST ast) { return ast.getType() == TokenTypes.CTOR_DEF && ast.findFirstToken(TokenTypes.PARAMETERS).getChildCount() == 0; } - private boolean isMethodWithOverrideAnnotation(DetailAST ast) { + private static boolean isMethodWithOverrideAnnotation(DetailAST ast) { if (isMethod(ast)) { DetailAST modifier = ast.findFirstToken(TokenTypes.MODIFIERS); for (AST annotation = modifier.getFirstChild(); annotation != null; annotation = annotation.getNextSibling()) { @@ -82,23 +80,38 @@ public class PublicApiVisitor extends JavaAstVisitor { return false; } - private boolean isAnnotation(AST annotation) { + private static boolean isAnnotation(AST annotation) { return annotation.getType() == TokenTypes.ANNOTATION; } - private boolean isMethod(DetailAST ast) { + private static boolean isMethod(DetailAST ast) { return ast.getType() == TokenTypes.METHOD_DEF; } - private boolean isPublic(DetailAST ast) { - return (AstUtils.isScope(AstUtils.getScope(ast), Scope.PUBLIC) || AstUtils.isType(ast, TokenTypes.ANNOTATION_FIELD_DEF)); + private boolean isDocumentedApi(DetailAST ast) { + return isDocumentedApi(ast, getFileContents()); } - private boolean isDocumentedApi(DetailAST ast) { - return getFileContents().getJavadocBefore(ast.getLineNo()) != null; + private static boolean isPublic(DetailAST ast) { + return (AstUtils.isScope(AstUtils.getScope(ast), Scope.PUBLIC) || AstUtils.isType(ast, TokenTypes.ANNOTATION_FIELD_DEF)); } - private boolean isStaticFinalVariable(DetailAST ast) { + private static boolean isStaticFinalVariable(DetailAST ast) { return (AstUtils.isClassVariable(ast) || AstUtils.isInterfaceVariable(ast)) && AstUtils.isFinal(ast) && AstUtils.isStatic(ast); } + + /** + * Also used by {@link UndocumentedApiCheck} + */ + public static boolean isDocumentedApi(DetailAST ast, FileContents fileContents) { + return fileContents.getJavadocBefore(ast.getLineNo()) != null; + } + + /** + * Also used by {@link UndocumentedApiCheck} + */ + public static boolean isPublicApi(DetailAST ast) { + return isPublic(ast) && !isStaticFinalVariable(ast) && !isMethodWithOverrideAnnotation(ast) && !isEmptyDefaultConstructor(ast); + } + }