summaryrefslogtreecommitdiffstats
path: root/plugins
diff options
context:
space:
mode:
authorGodin <mandrikov@gmail.com>2010-10-28 22:07:58 +0000
committerGodin <mandrikov@gmail.com>2010-10-28 22:07:58 +0000
commit0c700ae7431a1460d4e615c249299d88ba135768 (patch)
treeaf22d34f773f6dbabe27c8779ba5b05cb9d56c14 /plugins
parent952024c39260ccc98757ee2e1df7c33f2150772f (diff)
downloadsonarqube-0c700ae7431a1460d4e615c249299d88ba135768.tar.gz
sonarqube-0c700ae7431a1460d4e615c249299d88ba135768.zip
SONAR-1901: Add new rule to report on "Undocumented API"
Diffstat (limited to 'plugins')
-rw-r--r--plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/JavaAstScanner.java41
-rw-r--r--plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/PublicApiVisitor.java14
-rw-r--r--plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/BytecodeScanner.java33
-rw-r--r--plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/check/BytecodeChecks.java37
-rw-r--r--plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidExecutor.java8
-rw-r--r--plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidRuleRepository.java18
-rw-r--r--plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidSensor.java3
7 files changed, 61 insertions, 93 deletions
diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/JavaAstScanner.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/JavaAstScanner.java
index 290fbc80805..5a5094dae57 100644
--- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/JavaAstScanner.java
+++ b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/JavaAstScanner.java
@@ -19,40 +19,16 @@
*/
package org.sonar.java.ast;
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.InputStream;
-import java.nio.charset.Charset;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-import java.util.Stack;
-
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.io.filefilter.FileFilterUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.sonar.java.ast.visitor.AccessorVisitor;
-import org.sonar.java.ast.visitor.AnonymousInnerClassVisitor;
-import org.sonar.java.ast.visitor.BlankLinesVisitor;
-import org.sonar.java.ast.visitor.BranchVisitor;
-import org.sonar.java.ast.visitor.ClassVisitor;
-import org.sonar.java.ast.visitor.CommentVisitor;
-import org.sonar.java.ast.visitor.ComplexityVisitor;
-import org.sonar.java.ast.visitor.EndAtLineVisitor;
-import org.sonar.java.ast.visitor.FileVisitor;
-import org.sonar.java.ast.visitor.JavaAstVisitor;
-import org.sonar.java.ast.visitor.LinesOfCodeVisitor;
-import org.sonar.java.ast.visitor.LinesVisitor;
-import org.sonar.java.ast.visitor.MethodVisitor;
-import org.sonar.java.ast.visitor.PackageVisitor;
-import org.sonar.java.ast.visitor.PublicApiVisitor;
-import org.sonar.java.ast.visitor.StatementVisitor;
+import org.sonar.java.ast.visitor.*;
import org.sonar.java.squid.JavaSquidConfiguration;
import org.sonar.squid.api.AnalysisException;
import org.sonar.squid.api.CodeScanner;
+import org.sonar.squid.api.CodeVisitor;
import org.sonar.squid.api.SourceCode;
import org.xml.sax.InputSource;
@@ -61,6 +37,12 @@ import com.puppycrawl.tools.checkstyle.ConfigurationLoader;
import com.puppycrawl.tools.checkstyle.PropertiesExpander;
import com.puppycrawl.tools.checkstyle.api.Configuration;
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.InputStream;
+import java.nio.charset.Charset;
+import java.util.*;
+
/**
* Squid uses Checkstyle to get an out-of-the-box java parser with AST generation and visitor pattern support.
*/
@@ -179,4 +161,11 @@ public class JavaAstScanner extends CodeScanner<JavaAstVisitor> {
visitorClasses.add(LinesOfCodeVisitor.class);
return visitorClasses;
}
+
+ @Override
+ public void accept(CodeVisitor visitor) {
+ if (visitor instanceof JavaAstVisitor) {
+ super.accept(visitor);
+ }
+ }
}
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 896b9260482..92e3fd25112 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,9 +19,6 @@
*/
package org.sonar.java.ast.visitor;
-import java.util.Arrays;
-import java.util.List;
-
import org.sonar.squid.api.SourceCode;
import org.sonar.squid.measures.Metric;
@@ -31,6 +28,9 @@ import com.puppycrawl.tools.checkstyle.api.DetailAST;
import com.puppycrawl.tools.checkstyle.api.Scope;
import com.puppycrawl.tools.checkstyle.api.TokenTypes;
+import java.util.Arrays;
+import java.util.List;
+
public class PublicApiVisitor extends JavaAstVisitor {
final static String OVERRIDE_ANNOTATION_KEYWORD = "Override";
@@ -49,7 +49,7 @@ public class PublicApiVisitor extends JavaAstVisitor {
@Override
public void visitToken(DetailAST ast) {
SourceCode currentResource = peekSourceCode();
- if (isPublic(ast) && !isStaticFinalVariable(ast) && !isMethodWithOverrideAnnotation(ast) && !isEmptyDefaultConstructor(ast)) {
+ if (isPublicApi(ast)) {
currentResource.add(Metric.PUBLIC_API, 1);
if (isDocumentedApi(ast)) {
currentResource.add(Metric.PUBLIC_DOC_API, 1);
@@ -57,6 +57,10 @@ public class PublicApiVisitor extends JavaAstVisitor {
}
}
+ protected boolean isPublicApi(DetailAST ast) {
+ return isPublic(ast) && !isStaticFinalVariable(ast) && !isMethodWithOverrideAnnotation(ast) && !isEmptyDefaultConstructor(ast);
+ }
+
private boolean isEmptyDefaultConstructor(DetailAST ast) {
return (isConstructorWithoutParameters(ast)) && (ast.getLastChild().getChildCount() == 1);
}
@@ -90,7 +94,7 @@ public class PublicApiVisitor extends JavaAstVisitor {
return (AstUtils.isScope(AstUtils.getScope(ast), Scope.PUBLIC) || AstUtils.isType(ast, TokenTypes.ANNOTATION_FIELD_DEF));
}
- private boolean isDocumentedApi(DetailAST ast) {
+ protected boolean isDocumentedApi(DetailAST ast) {
return getFileContents().getJavadocBefore(ast.getLineNo()) != null;
}
diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/BytecodeScanner.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/BytecodeScanner.java
index b3716013c90..fde4fddf9b6 100644
--- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/BytecodeScanner.java
+++ b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/BytecodeScanner.java
@@ -19,30 +19,22 @@
*/
package org.sonar.java.bytecode;
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-
-import org.sonar.java.bytecode.asm.AsmClass;
-import org.sonar.java.bytecode.asm.AsmClassProvider;
-import org.sonar.java.bytecode.asm.AsmClassProviderImpl;
-import org.sonar.java.bytecode.asm.AsmMethod;
+import org.sonar.java.bytecode.asm.*;
import org.sonar.java.bytecode.asm.AsmClassProvider.DETAIL_LEVEL;
-import org.sonar.java.bytecode.visitor.AccessorVisitor;
-import org.sonar.java.bytecode.visitor.BytecodeVisitor;
-import org.sonar.java.bytecode.visitor.DITVisitor;
-import org.sonar.java.bytecode.visitor.DependenciesVisitor;
-import org.sonar.java.bytecode.visitor.LCOM4Visitor;
-import org.sonar.java.bytecode.visitor.NOCVisitor;
-import org.sonar.java.bytecode.visitor.RFCVisitor;
+import org.sonar.java.bytecode.visitor.*;
import org.sonar.squid.api.CodeScanner;
+import org.sonar.squid.api.CodeVisitor;
import org.sonar.squid.api.SourceClass;
import org.sonar.squid.api.SourceCode;
import org.sonar.squid.indexer.QueryByType;
import org.sonar.squid.indexer.SquidIndex;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+
public class BytecodeScanner extends CodeScanner<BytecodeVisitor> {
private SquidIndex indexer;
@@ -103,4 +95,11 @@ public class BytecodeScanner extends CodeScanner<BytecodeVisitor> {
visitorClasses.add(DependenciesVisitor.class);
return visitorClasses;
}
+
+ @Override
+ public void accept(CodeVisitor visitor) {
+ if (visitor instanceof BytecodeVisitor) {
+ super.accept(visitor);
+ }
+ }
}
diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/check/BytecodeChecks.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/check/BytecodeChecks.java
deleted file mode 100644
index 96b921f9769..00000000000
--- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/check/BytecodeChecks.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Sonar, open source software quality management tool.
- * Copyright (C) 2009 SonarSource SA
- * mailto:contact AT sonarsource DOT com
- *
- * Sonar is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * Sonar is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with Sonar; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02
- */
-package org.sonar.java.bytecode.check;
-
-import java.util.Arrays;
-import java.util.List;
-
-public final class BytecodeChecks {
-
- private BytecodeChecks() {
- }
-
- public static List<Class> getCheckClasses() {
- return Arrays.asList(
- (Class) CallToDeprecatedMethodCheck.class,
- UnusedPrivateMethodCheck.class,
- UnusedProtectedMethodCheck.class,
- ArchitectureCheck.class);
- }
-}
diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidExecutor.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidExecutor.java
index d151511bb9f..bab76dee513 100644
--- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidExecutor.java
+++ b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidExecutor.java
@@ -28,12 +28,12 @@ import org.sonar.api.resources.Resource;
import org.sonar.api.utils.TimeProfiler;
import org.sonar.java.ast.JavaAstScanner;
import org.sonar.java.bytecode.BytecodeScanner;
-import org.sonar.java.bytecode.check.BytecodeCheck;
import org.sonar.java.squid.JavaSquidConfiguration;
import org.sonar.plugins.squid.bridges.Bridge;
import org.sonar.plugins.squid.bridges.BridgeFactory;
import org.sonar.plugins.squid.bridges.ResourceIndex;
import org.sonar.squid.Squid;
+import org.sonar.squid.api.CodeVisitor;
import org.sonar.squid.api.SourceCode;
import org.sonar.squid.api.SourceFile;
import org.sonar.squid.api.SourcePackage;
@@ -79,11 +79,11 @@ public final class SquidExecutor {
}
public void scan(Collection<File> sourceFiles, Collection<File> bytecodeFilesOrDirectories) {
+ for (Object checker : checkFactory.getChecks()) {
+ squid.registerVisitor((CodeVisitor) checker);
+ }
scanSources(sourceFiles);
if (sourceScanned) {
- for (Object checker : checkFactory.getChecks()) {
- squid.registerVisitor((BytecodeCheck) checker);
- }
scanBytecode(bytecodeFilesOrDirectories);
}
squid.decorateSourceCodeTreeWith(Metric.values());
diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidRuleRepository.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidRuleRepository.java
index e4af4723946..74078394435 100644
--- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidRuleRepository.java
+++ b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidRuleRepository.java
@@ -4,8 +4,13 @@ import org.sonar.api.resources.Java;
import org.sonar.api.rules.AnnotationRuleParser;
import org.sonar.api.rules.Rule;
import org.sonar.api.rules.RuleRepository;
-import org.sonar.java.bytecode.check.BytecodeChecks;
+import org.sonar.java.ast.check.UndocumentedApiCheck;
+import org.sonar.java.bytecode.check.ArchitectureCheck;
+import org.sonar.java.bytecode.check.CallToDeprecatedMethodCheck;
+import org.sonar.java.bytecode.check.UnusedPrivateMethodCheck;
+import org.sonar.java.bytecode.check.UnusedProtectedMethodCheck;
+import java.util.Arrays;
import java.util.List;
public final class SquidRuleRepository extends RuleRepository {
@@ -19,6 +24,15 @@ public final class SquidRuleRepository extends RuleRepository {
@Override
public List<Rule> createRules() {
- return ruleParser.parse(SquidConstants.REPOSITORY_KEY, BytecodeChecks.getCheckClasses());
+ return ruleParser.parse(SquidConstants.REPOSITORY_KEY, getCheckClasses());
+ }
+
+ public static List<Class> getCheckClasses() {
+ return Arrays.asList(
+ (Class) CallToDeprecatedMethodCheck.class,
+ UnusedPrivateMethodCheck.class,
+ UnusedProtectedMethodCheck.class,
+ ArchitectureCheck.class,
+ UndocumentedApiCheck.class);
}
}
diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidSensor.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidSensor.java
index 4804d306d4a..e2f58dca855 100644
--- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidSensor.java
+++ b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidSensor.java
@@ -36,7 +36,6 @@ import org.sonar.api.profiles.RulesProfile;
import org.sonar.api.resources.Java;
import org.sonar.api.resources.Project;
import org.sonar.api.utils.SonarException;
-import org.sonar.java.bytecode.check.BytecodeChecks;
import java.io.File;
import java.nio.charset.Charset;
@@ -73,7 +72,7 @@ public class SquidSensor implements Sensor {
SquidPluginProperties.FIELDS_TO_EXCLUDE_FROM_LCOM4_COMPUTATION_DEFAULT_VALUE);
Charset charset = project.getFileSystem().getSourceCharset();
- AnnotationCheckFactory factory = AnnotationCheckFactory.create(profile, SquidConstants.REPOSITORY_KEY, BytecodeChecks.getCheckClasses());
+ AnnotationCheckFactory factory = AnnotationCheckFactory.create(profile, SquidConstants.REPOSITORY_KEY, SquidRuleRepository.getCheckClasses());
SquidExecutor squidExecutor = new SquidExecutor(analyzePropertyAccessors, fieldNamesToExcludeFromLcom4Computation, factory, charset);
squidExecutor.scan(getSourceFiles(project), getBytecodeFiles(project));