Added RuleContext, modified rules to support passing in multiple ASTCompilationUnits

git-svn-id: https://pmd.svn.sourceforge.net/svnroot/pmd/trunk@75 51baf565-9d33-0410-a72c-fc3788e3496d
This commit is contained in:
Tom Copeland
2002-06-26 21:05:58 +00:00
parent 4b57f1b3ae
commit a6df460439
18 changed files with 102 additions and 53 deletions

View File

@@ -184,9 +184,10 @@ TODO - this tests unused variables in nested classes
private Report process(String file) {
try {
PMD p = new PMD();
Report report = new Report("xml", file);
p.processFile(file, getClass().getClassLoader().getResourceAsStream(file), RuleFactory.ALL, report);
return report;
RuleContext ctx = new RuleContext();
ctx.setReport(new Report("xml", file));
p.processFile(file, getClass().getClassLoader().getResourceAsStream(file), RuleFactory.ALL, ctx);
return ctx.getReport();
} catch (FileNotFoundException fnfe) {
throw new RuntimeException("File " + file + " not found");
}

View File

@@ -0,0 +1,25 @@
/*
* User: tom
* Date: Jun 26, 2002
* Time: 4:30:42 PM
*/
package test.net.sourceforge.pmd;
import junit.framework.TestCase;
import net.sourceforge.pmd.RuleContext;
import net.sourceforge.pmd.Report;
public class RuleContextTest extends TestCase {
public RuleContextTest(String name) {
super(name);
}
public void testReport() {
RuleContext ctx = new RuleContext();
assertNull(ctx.getReport());
Report r = new Report("xml");
ctx.setReport(r);
Report r2 = ctx.getReport();
assertEquals(r, r2);
}
}

View File

@@ -10,7 +10,10 @@ public class RuleViolationTest extends TestCase {
public RuleViolationTest(String name) {
super(name);
}
public void testStub() {
}
/*
public void testBasic() {
RuleViolation r = new RuleViolation(new Rule() {
public String getName() {return "name";}
@@ -35,4 +38,5 @@ public class RuleViolationTest extends TestCase {
assertTrue(r.getXML().indexOf("foo") != -1);
assertTrue(r.getXML().indexOf("2") != -1);
}
*/
}

View File

@@ -6,6 +6,10 @@
package net.sourceforge.pmd;
import net.sourceforge.pmd.ast.JavaParserVisitorAdapter;
import net.sourceforge.pmd.ast.SimpleNode;
import java.util.List;
import java.util.Iterator;
public abstract class AbstractRule extends JavaParserVisitorAdapter {
@@ -21,4 +25,15 @@ public abstract class AbstractRule extends JavaParserVisitorAdapter {
public int hashCode() {
return getName().hashCode();
}
protected void visitAll( List acus, RuleContext ctx ) {
for (Iterator i = acus.iterator(); i.hasNext();) {
SimpleNode node = (SimpleNode)i.next();
node.childrenAccept( this, ctx );
}
}
public void apply( List acus, RuleContext ctx ) {
visitAll( acus, ctx );
}
}

View File

@@ -13,10 +13,11 @@ import net.sourceforge.pmd.ast.ParseException;
import java.io.*;
import java.util.List;
import java.util.Iterator;
import java.util.ArrayList;
public class PMD {
public void processFile(String filename, InputStream is, String ruleSetType, Report report)
public void processFile(String filename, InputStream is, String ruleSetType, RuleContext ctx)
throws FileNotFoundException {
List rules = RuleFactory.createRules(ruleSetType);
@@ -24,9 +25,12 @@ public class PMD {
InputStreamReader reader = new InputStreamReader(is);
JavaParser parser = new JavaParser(reader);
ASTCompilationUnit c = parser.CompilationUnit();
List acus = new ArrayList();
acus.add(c);
//c.dump("");
for (Iterator iterator = rules.iterator(); iterator.hasNext();) {
c.childrenAccept((JavaParserVisitor)iterator.next(), report);
Rule rule = (Rule)iterator.next();
rule.apply(acus, ctx);
}
reader.close();
} catch (ParseException pe) {
@@ -37,8 +41,8 @@ public class PMD {
}
}
public void processFile(File file, String ruleSetType, Report report) throws FileNotFoundException{
processFile(file.getAbsolutePath(), new FileInputStream(file), ruleSetType, report);
public void processFile(File file, String ruleSetType, RuleContext ctx) throws FileNotFoundException{
processFile(file.getAbsolutePath(), new FileInputStream(file), ruleSetType, ctx);
}
public static void main(String[] args) {
@@ -51,8 +55,10 @@ public class PMD {
}
PMD pmd = new PMD();
Report report = new Report(args[1], input.getAbsolutePath());
RuleContext ctx = new RuleContext();
ctx.setReport(report);
try {
pmd.processFile(input, RuleFactory.ALL, report);
pmd.processFile(input, RuleFactory.ALL, ctx);
System.out.println(report.render());
} catch (FileNotFoundException fnfe) {
fnfe.printStackTrace();

View File

@@ -51,6 +51,8 @@ public class PMDTask extends Task {
PMD pmd = new PMD();
Report report = new Report(format);
RuleContext ctx = new RuleContext();
ctx.setReport(report);
for (Iterator i = filesets.iterator(); i.hasNext();) {
FileSet fs = (FileSet) i.next();
@@ -61,7 +63,7 @@ public class PMDTask extends Task {
File file = new File(ds.getBasedir() + System.getProperty("file.separator") + srcFiles[j]);
report.setCurrentFile(file.getAbsolutePath());
if (verbose) System.out.println(file.getAbsoluteFile());
pmd.processFile(file, ruleSetType, report);
pmd.processFile(file, ruleSetType, ctx);
} catch (FileNotFoundException fnfe) {
throw new BuildException(fnfe);
}
@@ -70,7 +72,7 @@ public class PMDTask extends Task {
StringBuffer buf = new StringBuffer();
if (!report.isEmpty()) {
buf.append(report.render());
buf.append(ctx.getReport().render());
buf.append(System.getProperty("line.separator"));
}
try {

View File

@@ -5,4 +5,5 @@ import java.util.*;
public interface Rule {
public String getName();
public String getDescription();
public void apply(List astCompilationUnits, RuleContext ctx);
}

View File

@@ -0,0 +1,19 @@
/*
* User: tom
* Date: Jun 26, 2002
* Time: 4:30:03 PM
*/
package net.sourceforge.pmd;
public class RuleContext {
private Report report;
public Report getReport() {
return report;
}
public void setReport(Report report) {
this.report = report;
}
}

View File

@@ -3,10 +3,7 @@ package net.sourceforge.pmd.rules;
import net.sourceforge.pmd.ast.JavaParserVisitorAdapter;
import net.sourceforge.pmd.ast.ASTAllocationExpression;
import net.sourceforge.pmd.ast.ASTName;
import net.sourceforge.pmd.AbstractRule;
import net.sourceforge.pmd.Rule;
import net.sourceforge.pmd.Report;
import net.sourceforge.pmd.RuleViolation;
import net.sourceforge.pmd.*;
import java.util.*;
@@ -17,7 +14,7 @@ public class DontCreateThreadsRule extends AbstractRule implements Rule {
public Object visit(ASTAllocationExpression node, Object data){
if ((node.jjtGetChild(0) instanceof ASTName) // this avoids "new <primitive-type>", i.e., "new int[]"
&& ((ASTName)node.jjtGetChild(0)).getImage().equals("Thread")) {
((Report)data).addRuleViolation(new RuleViolation(this, node.getBeginLine()));
(((RuleContext)data).getReport()).addRuleViolation(new RuleViolation(this, node.getBeginLine()));
}
return super.visit(node, data);
}

View File

@@ -3,10 +3,7 @@ package net.sourceforge.pmd.rules;
import net.sourceforge.pmd.ast.JavaParserVisitorAdapter;
import net.sourceforge.pmd.ast.ASTAllocationExpression;
import net.sourceforge.pmd.ast.ASTName;
import net.sourceforge.pmd.AbstractRule;
import net.sourceforge.pmd.Rule;
import net.sourceforge.pmd.Report;
import net.sourceforge.pmd.RuleViolation;
import net.sourceforge.pmd.*;
import java.util.*;
@@ -17,7 +14,7 @@ public class DontCreateTimersRule extends AbstractRule implements Rule {
public Object visit(ASTAllocationExpression node, Object data){
if ((node.jjtGetChild(0) instanceof ASTName) // this avoids "new <primitive-type>", i.e., "new int[]"
&& ((ASTName)node.jjtGetChild(0)).getImage().equals("Timer")) {
((Report)data).addRuleViolation(new RuleViolation(this, node.getBeginLine()));
(((RuleContext)data).getReport()).addRuleViolation(new RuleViolation(this, node.getBeginLine()));
}
return super.visit(node, data);
}

View File

@@ -7,10 +7,7 @@ package net.sourceforge.pmd.rules;
import net.sourceforge.pmd.ast.ASTBlock;
import net.sourceforge.pmd.ast.ASTTryStatement;
import net.sourceforge.pmd.AbstractRule;
import net.sourceforge.pmd.Rule;
import net.sourceforge.pmd.Report;
import net.sourceforge.pmd.RuleViolation;
import net.sourceforge.pmd.*;
public class EmptyCatchBlockRule extends AbstractRule implements Rule {
@@ -18,7 +15,7 @@ public class EmptyCatchBlockRule extends AbstractRule implements Rule {
public Object visit(ASTBlock node, Object data){
if ((node.jjtGetParent() instanceof ASTTryStatement) && node.jjtGetNumChildren()==0) {
((Report)data).addRuleViolation(new RuleViolation(this, node.getBeginLine()));
(((RuleContext)data).getReport()).addRuleViolation(new RuleViolation(this, node.getBeginLine()));
}
return super.visit(node, data);

View File

@@ -9,17 +9,14 @@ import net.sourceforge.pmd.ast.JavaParserVisitorAdapter;
import net.sourceforge.pmd.ast.ASTBlock;
import net.sourceforge.pmd.ast.ASTTryStatement;
import net.sourceforge.pmd.ast.ASTIfStatement;
import net.sourceforge.pmd.AbstractRule;
import net.sourceforge.pmd.Rule;
import net.sourceforge.pmd.Report;
import net.sourceforge.pmd.RuleViolation;
import net.sourceforge.pmd.*;
public class EmptyIfStmtRule extends AbstractRule implements Rule {
public String getDescription() {return "Avoid empty IF statements";}
public Object visit(ASTBlock node, Object data){
if ((node.jjtGetParent().jjtGetParent() instanceof ASTIfStatement) && node.jjtGetNumChildren()==0) {
((Report)data).addRuleViolation(new RuleViolation(this, node.getBeginLine()));
(((RuleContext)data).getReport()).addRuleViolation(new RuleViolation(this, node.getBeginLine()));
}
return super.visit(node, data);

View File

@@ -8,10 +8,7 @@ package net.sourceforge.pmd.rules;
import net.sourceforge.pmd.ast.ASTIfStatement;
import net.sourceforge.pmd.ast.SimpleNode;
import net.sourceforge.pmd.ast.ASTBlock;
import net.sourceforge.pmd.AbstractRule;
import net.sourceforge.pmd.Rule;
import net.sourceforge.pmd.Report;
import net.sourceforge.pmd.RuleViolation;
import net.sourceforge.pmd.*;
public class IfElseStmtsMustUseBracesRule extends AbstractRule implements Rule {
@@ -62,7 +59,7 @@ public class IfElseStmtsMustUseBracesRule extends AbstractRule implements Rule {
if (!hasBlockAsFirstChild(firstStmt) && !hasBlockAsFirstChild(secondStmt)) {
if (node.getBeginLine() != this.lineNumberOfLastViolation) {
Report rpt = (Report)data;
Report rpt = ((RuleContext)data).getReport();
rpt.addRuleViolation(new RuleViolation(this, node.getBeginLine()));
this.lineNumberOfLastViolation = node.getBeginLine();
}

View File

@@ -2,10 +2,7 @@ package net.sourceforge.pmd.rules;
import net.sourceforge.pmd.ast.JavaParserVisitorAdapter;
import net.sourceforge.pmd.ast.ASTName;
import net.sourceforge.pmd.AbstractRule;
import net.sourceforge.pmd.Rule;
import net.sourceforge.pmd.Report;
import net.sourceforge.pmd.RuleViolation;
import net.sourceforge.pmd.*;
import java.util.*;
@@ -15,7 +12,7 @@ public class SystemOutRule extends AbstractRule implements Rule {
public Object visit(ASTName node, Object data){
if (node.getImage() != null && (node.getImage().startsWith("System.out") || node.getImage().startsWith("System.err") || node.getImage().startsWith("System.in"))) {
((Report)data).addRuleViolation(new RuleViolation(this, node.getBeginLine()));
(((RuleContext)data).getReport()).addRuleViolation(new RuleViolation(this, node.getBeginLine()));
}
return super.visit(node,data);
}

View File

@@ -3,10 +3,7 @@ package net.sourceforge.pmd.rules;
import net.sourceforge.pmd.ast.ASTName;
import net.sourceforge.pmd.ast.JavaParserVisitorAdapter;
import net.sourceforge.pmd.ast.SimpleNode;
import net.sourceforge.pmd.AbstractRule;
import net.sourceforge.pmd.Rule;
import net.sourceforge.pmd.Report;
import net.sourceforge.pmd.RuleViolation;
import net.sourceforge.pmd.*;
import java.util.*;
@@ -16,7 +13,7 @@ public class SystemPropsRule extends AbstractRule implements Rule {
public Object visit(ASTName node, Object data){
if (node.getImage() != null && (node.getImage().startsWith("System.getProperty") || node.getImage().startsWith("System.setProperty") || node.getImage().startsWith("System.getProperties"))) {
((Report)data).addRuleViolation(new RuleViolation(this, node.getBeginLine()));
(((RuleContext)data).getReport()).addRuleViolation(new RuleViolation(this, node.getBeginLine()));
}
return super.visit(node,data);
}

View File

@@ -6,10 +6,7 @@
package net.sourceforge.pmd.rules;
import net.sourceforge.pmd.ast.*;
import net.sourceforge.pmd.AbstractRule;
import net.sourceforge.pmd.Rule;
import net.sourceforge.pmd.Report;
import net.sourceforge.pmd.RuleViolation;
import net.sourceforge.pmd.*;
import java.util.Set;
import java.util.HashSet;
@@ -66,7 +63,7 @@ public class UnnecessaryConversionTemporaryRule extends AbstractRule implements
return super.visit(node, data);
}
if (node.getImage() != null && node.getImage().equals("toString")) {
((Report)data).addRuleViolation(new RuleViolation(this, node.getBeginLine()));
(((RuleContext)data).getReport()).addRuleViolation(new RuleViolation(this, node.getBeginLine()));
}
return super.visit(node, data);
}

View File

@@ -82,7 +82,7 @@ public class UnusedLocalVariableRule extends AbstractRule implements Rule{
Namespace group = (Namespace)tableGroups.peek();
group.addTable();
super.visit(node, data);
reportUnusedLocals((Report)data, group.peek());
reportUnusedLocals(((RuleContext)data).getReport(), group.peek());
group.removeTable();
return data;
}

View File

@@ -48,7 +48,7 @@ public class UnusedPrivateInstanceVariableRule extends AbstractRule implements R
doingIDTraversal = false;
super.visit(node, null);
reportUnusedInstanceVars((Report)data, nameSpace.peek());
reportUnusedInstanceVars(((RuleContext)data).getReport(), nameSpace.peek());
nameSpace.removeTable();
nameSpaces.pop();