|
From: <caw...@us...> - 2007-06-14 19:16:57
|
Revision: 2617
http://svn.sourceforge.net/rubyeclipse/?rev=2617&view=rev
Author: cawilliams
Date: 2007-06-14 12:16:55 -0700 (Thu, 14 Jun 2007)
Log Message:
-----------
break out each thing we track in code complexity into separate visitor. This way the getOptionKey() method works and all of them aren't pegged to the severity of one key.
Modified Paths:
--------------
trunk/com.aptana.rdt/src/com/aptana/rdt/internal/parser/warnings/CodeComplexityVisitor.java
trunk/com.aptana.rdt/src/com/aptana/rdt/internal/parser/warnings/RubyRedLint.java
Added Paths:
-----------
trunk/com.aptana.rdt/src/com/aptana/rdt/internal/parser/warnings/TooManyArgumentsVisitor.java
trunk/com.aptana.rdt/src/com/aptana/rdt/internal/parser/warnings/TooManyBranchesVisitor.java
trunk/com.aptana.rdt/src/com/aptana/rdt/internal/parser/warnings/TooManyLinesVisitor.java
trunk/com.aptana.rdt/src/com/aptana/rdt/internal/parser/warnings/TooManyReturnsVisitor.java
Modified: trunk/com.aptana.rdt/src/com/aptana/rdt/internal/parser/warnings/CodeComplexityVisitor.java
===================================================================
--- trunk/com.aptana.rdt/src/com/aptana/rdt/internal/parser/warnings/CodeComplexityVisitor.java 2007-06-13 19:09:54 UTC (rev 2616)
+++ trunk/com.aptana.rdt/src/com/aptana/rdt/internal/parser/warnings/CodeComplexityVisitor.java 2007-06-14 19:16:55 UTC (rev 2617)
@@ -4,29 +4,18 @@
import java.util.Map;
import java.util.Set;
-import org.jruby.ast.CaseNode;
import org.jruby.ast.DefnNode;
-import org.jruby.ast.IfNode;
+import org.jruby.ast.DefsNode;
import org.jruby.ast.LocalAsgnNode;
-import org.jruby.ast.ReturnNode;
-import org.jruby.ast.WhenNode;
import org.jruby.evaluator.Instruction;
-import org.jruby.lexer.yacc.ISourcePosition;
-import org.rubypeople.rdt.internal.core.RubyModelManager;
import org.rubypeople.rdt.internal.core.parser.warnings.RubyLintVisitor;
-import org.rubypeople.rdt.internal.core.util.ASTUtil;
import com.aptana.rdt.AptanaRDTPlugin;
public class CodeComplexityVisitor extends RubyLintVisitor {
- private int maxArgLength;
- private int maxLines;
- private int maxReturns;
- private int maxBranches;
+
private int maxLocals;
- private int returnCount;
- private int branchCount;
private Set locals;
private Map fOptions;
@@ -37,13 +26,7 @@
public CodeComplexityVisitor(Map options, String contents) {
super(contents);
fOptions = options;
- maxArgLength = getInt(AptanaRDTPlugin.COMPILER_PB_MAX_ARGUMENTS, 5);
- maxLines = getInt(AptanaRDTPlugin.COMPILER_PB_MAX_LINES, 20);
- maxReturns = getInt(AptanaRDTPlugin.COMPILER_PB_MAX_RETURNS, 5);
- maxBranches = getInt(AptanaRDTPlugin.COMPILER_PB_MAX_BRANCHES, 5);
maxLocals = getInt(AptanaRDTPlugin.COMPILER_PB_MAX_LOCALS, 4);
- returnCount = 0;
- branchCount = 0;
}
private int getInt(String key, int defaultValue) {
try {
@@ -55,75 +38,40 @@
@Override
protected String getOptionKey() {
- // TODO Break this visitor up into multiple! One for each key.
- return AptanaRDTPlugin.COMPILER_PB_MAX_ARGUMENTS;
+ return AptanaRDTPlugin.COMPILER_PB_MAX_LOCALS;
}
@Override
+ public Instruction visitDefsNode(DefsNode iVisited) {
+ locals = new HashSet();
+ return super.visitDefsNode(iVisited);
+ }
+
+ @Override
public Instruction visitDefnNode(DefnNode iVisited) {
- returnCount = 0;
- branchCount = 0;
locals = new HashSet();
-
- String[] args = ASTUtil.getArgs(iVisited.getArgsNode(), iVisited.getScope());
- if (args != null && args.length > maxArgLength) {
- createProblem(iVisited.getArgsNode().getPosition(), "Too many method arguments: " + args.length);
- }
- ISourcePosition pos = iVisited.getPosition();
- int lines = (pos.getEndLine() - pos.getStartLine()) - 1;
- if (lines > maxLines) {
- createProblem(iVisited.getNameNode().getPosition(), "Too many lines in method: " + lines);
- }
return super.visitDefnNode(iVisited);
}
@Override
- public Instruction visitIfNode(IfNode iVisited) {
- // TODO Make sure this doesn't count modifiers
- if (iVisited.getThenBody() != null) {
- branchCount++;
- }
- if (iVisited.getElseBody() != null) {
- branchCount++;
- }
- return super.visitIfNode(iVisited);
- }
-
- @Override
- public Instruction visitCaseNode(CaseNode iVisited) {
- WhenNode when = (WhenNode) iVisited.getFirstWhenNode();
- while (when != null) {
- branchCount++;
- when = (WhenNode) when.getNextCase();
- }
- return super.visitCaseNode(iVisited);
- }
-
- @Override
public Instruction visitLocalAsgnNode(LocalAsgnNode iVisited) {
locals.add(iVisited.getName());
return super.visitLocalAsgnNode(iVisited);
}
public void exitDefnNode(DefnNode iVisited) {
- if (returnCount > maxReturns) {
- createProblem(iVisited.getNameNode().getPosition(), "Too many explicit returns: " + returnCount);
- }
- if (branchCount > maxBranches) {
- createProblem(iVisited.getNameNode().getPosition(), "Too many branches: " + branchCount);
- }
if (locals.size() > maxLocals) {
createProblem(iVisited.getNameNode().getPosition(), "Too many local variables: " + locals.size());
}
- returnCount = 0;
- branchCount = 0;
locals.clear();
}
-
+
@Override
- public Instruction visitReturnNode(ReturnNode iVisited) {
- returnCount++;
- return super.visitReturnNode(iVisited);
+ public void exitDefsNode(DefsNode iVisited) {
+ if (locals.size() > maxLocals) {
+ createProblem(iVisited.getNameNode().getPosition(), "Too many local variables: " + locals.size());
+ }
+ locals.clear();
+ super.exitDefsNode(iVisited);
}
-
}
Modified: trunk/com.aptana.rdt/src/com/aptana/rdt/internal/parser/warnings/RubyRedLint.java
===================================================================
--- trunk/com.aptana.rdt/src/com/aptana/rdt/internal/parser/warnings/RubyRedLint.java 2007-06-13 19:09:54 UTC (rev 2616)
+++ trunk/com.aptana.rdt/src/com/aptana/rdt/internal/parser/warnings/RubyRedLint.java 2007-06-14 19:16:55 UTC (rev 2617)
@@ -73,6 +73,10 @@
visitors.add(new UnusedParameterVisitor(contents));
visitors.add(new UnecessaryElseVisitor(contents));
visitors.add(new CodeComplexityVisitor(contents));
+ visitors.add(new TooManyLinesVisitor(contents));
+ visitors.add(new TooManyBranchesVisitor(contents));
+ visitors.add(new TooManyArgumentsVisitor(contents));
+ visitors.add(new TooManyReturnsVisitor(contents));
visitors.add(new SimilarVariableNameVisitor(contents));
visitors.add(new SubclassCallsSuper(contents));
visitors.add(new ComparableInclusionVisitor(contents));
Added: trunk/com.aptana.rdt/src/com/aptana/rdt/internal/parser/warnings/TooManyArgumentsVisitor.java
===================================================================
--- trunk/com.aptana.rdt/src/com/aptana/rdt/internal/parser/warnings/TooManyArgumentsVisitor.java (rev 0)
+++ trunk/com.aptana.rdt/src/com/aptana/rdt/internal/parser/warnings/TooManyArgumentsVisitor.java 2007-06-14 19:16:55 UTC (rev 2617)
@@ -0,0 +1,57 @@
+package com.aptana.rdt.internal.parser.warnings;
+
+import java.util.Map;
+
+import org.jruby.ast.DefnNode;
+import org.jruby.ast.DefsNode;
+import org.jruby.evaluator.Instruction;
+import org.rubypeople.rdt.internal.core.parser.warnings.RubyLintVisitor;
+import org.rubypeople.rdt.internal.core.util.ASTUtil;
+
+import com.aptana.rdt.AptanaRDTPlugin;
+
+public class TooManyArgumentsVisitor extends RubyLintVisitor {
+
+ private int maxArgLength;
+ private Map fOptions;
+
+ public TooManyArgumentsVisitor(String contents) {
+ this(AptanaRDTPlugin.getDefault().getOptions(), contents);
+ }
+
+ public TooManyArgumentsVisitor(Map options, String contents) {
+ super(contents);
+ fOptions = options;
+ maxArgLength = getInt(AptanaRDTPlugin.COMPILER_PB_MAX_ARGUMENTS, 5);
+ }
+ private int getInt(String key, int defaultValue) {
+ try {
+ return Integer.parseInt((String) fOptions.get(key));
+ } catch (NumberFormatException e) {
+ return defaultValue;
+ }
+ }
+
+ @Override
+ protected String getOptionKey() {
+ return AptanaRDTPlugin.COMPILER_PB_MAX_ARGUMENTS;
+ }
+
+ @Override
+ public Instruction visitDefsNode(DefsNode iVisited) {
+ String[] args = ASTUtil.getArgs(iVisited.getArgsNode(), iVisited.getScope());
+ if (args != null && args.length > maxArgLength) {
+ createProblem(iVisited.getArgsNode().getPosition(), "Too many method arguments: " + args.length);
+ }
+ return super.visitDefsNode(iVisited);
+ }
+
+ @Override
+ public Instruction visitDefnNode(DefnNode iVisited) {
+ String[] args = ASTUtil.getArgs(iVisited.getArgsNode(), iVisited.getScope());
+ if (args != null && args.length > maxArgLength) {
+ createProblem(iVisited.getArgsNode().getPosition(), "Too many method arguments: " + args.length);
+ }
+ return super.visitDefnNode(iVisited);
+ }
+}
Added: trunk/com.aptana.rdt/src/com/aptana/rdt/internal/parser/warnings/TooManyBranchesVisitor.java
===================================================================
--- trunk/com.aptana.rdt/src/com/aptana/rdt/internal/parser/warnings/TooManyBranchesVisitor.java (rev 0)
+++ trunk/com.aptana.rdt/src/com/aptana/rdt/internal/parser/warnings/TooManyBranchesVisitor.java 2007-06-14 19:16:55 UTC (rev 2617)
@@ -0,0 +1,93 @@
+package com.aptana.rdt.internal.parser.warnings;
+
+import java.util.Map;
+
+import org.jruby.ast.CaseNode;
+import org.jruby.ast.DefnNode;
+import org.jruby.ast.DefsNode;
+import org.jruby.ast.IfNode;
+import org.jruby.ast.WhenNode;
+import org.jruby.evaluator.Instruction;
+import org.rubypeople.rdt.internal.core.parser.warnings.RubyLintVisitor;
+
+import com.aptana.rdt.AptanaRDTPlugin;
+
+public class TooManyBranchesVisitor extends RubyLintVisitor {
+
+ private int maxBranches;
+ private int branchCount;
+ private Map fOptions;
+
+ public TooManyBranchesVisitor(String contents) {
+ this(AptanaRDTPlugin.getDefault().getOptions(), contents);
+ }
+
+ public TooManyBranchesVisitor(Map options, String contents) {
+ super(contents);
+ fOptions = options;
+ maxBranches = getInt(AptanaRDTPlugin.COMPILER_PB_MAX_BRANCHES, 5);
+ branchCount = 0;
+ }
+ private int getInt(String key, int defaultValue) {
+ try {
+ return Integer.parseInt((String) fOptions.get(key));
+ } catch (NumberFormatException e) {
+ return defaultValue;
+ }
+ }
+
+ @Override
+ protected String getOptionKey() {
+ return AptanaRDTPlugin.COMPILER_PB_MAX_BRANCHES;
+ }
+
+ @Override
+ public Instruction visitDefsNode(DefsNode iVisited) {
+ branchCount = 0;
+ return super.visitDefsNode(iVisited);
+ }
+
+ @Override
+ public Instruction visitDefnNode(DefnNode iVisited) {
+ branchCount = 0;
+ return super.visitDefnNode(iVisited);
+ }
+
+ @Override
+ public Instruction visitIfNode(IfNode iVisited) {
+ // TODO Make sure this doesn't count modifiers
+ if (iVisited.getThenBody() != null) {
+ branchCount++;
+ }
+ if (iVisited.getElseBody() != null) {
+ branchCount++;
+ }
+ return super.visitIfNode(iVisited);
+ }
+
+ @Override
+ public Instruction visitCaseNode(CaseNode iVisited) {
+ WhenNode when = (WhenNode) iVisited.getFirstWhenNode();
+ while (when != null) {
+ branchCount++;
+ when = (WhenNode) when.getNextCase();
+ }
+ return super.visitCaseNode(iVisited);
+ }
+
+ public void exitDefnNode(DefnNode iVisited) {
+ if (branchCount > maxBranches) {
+ createProblem(iVisited.getNameNode().getPosition(), "Too many branches: " + branchCount);
+ }
+ branchCount = 0;
+ }
+
+ @Override
+ public void exitDefsNode(DefsNode iVisited) {
+ if (branchCount > maxBranches) {
+ createProblem(iVisited.getNameNode().getPosition(), "Too many branches: " + branchCount);
+ }
+ branchCount = 0;
+ super.exitDefsNode(iVisited);
+ }
+}
Added: trunk/com.aptana.rdt/src/com/aptana/rdt/internal/parser/warnings/TooManyLinesVisitor.java
===================================================================
--- trunk/com.aptana.rdt/src/com/aptana/rdt/internal/parser/warnings/TooManyLinesVisitor.java (rev 0)
+++ trunk/com.aptana.rdt/src/com/aptana/rdt/internal/parser/warnings/TooManyLinesVisitor.java 2007-06-14 19:16:55 UTC (rev 2617)
@@ -0,0 +1,59 @@
+package com.aptana.rdt.internal.parser.warnings;
+
+import java.util.Map;
+
+import org.jruby.ast.DefnNode;
+import org.jruby.ast.DefsNode;
+import org.jruby.evaluator.Instruction;
+import org.jruby.lexer.yacc.ISourcePosition;
+import org.rubypeople.rdt.internal.core.parser.warnings.RubyLintVisitor;
+
+import com.aptana.rdt.AptanaRDTPlugin;
+
+public class TooManyLinesVisitor extends RubyLintVisitor {
+
+ private int maxLines;
+ private Map fOptions;
+
+ public TooManyLinesVisitor(String contents) {
+ this(AptanaRDTPlugin.getDefault().getOptions(), contents);
+ }
+
+ public TooManyLinesVisitor(Map options, String contents) {
+ super(contents);
+ fOptions = options;
+ maxLines = getInt(AptanaRDTPlugin.COMPILER_PB_MAX_LINES, 20);
+ }
+ private int getInt(String key, int defaultValue) {
+ try {
+ return Integer.parseInt((String) fOptions.get(key));
+ } catch (NumberFormatException e) {
+ return defaultValue;
+ }
+ }
+
+ @Override
+ protected String getOptionKey() {
+ return AptanaRDTPlugin.COMPILER_PB_MAX_LINES;
+ }
+
+ @Override
+ public Instruction visitDefsNode(DefsNode iVisited) {
+ ISourcePosition pos = iVisited.getPosition();
+ int lines = (pos.getEndLine() - pos.getStartLine()) - 1;
+ if (lines > maxLines) {
+ createProblem(iVisited.getNameNode().getPosition(), "Too many lines in method: " + lines);
+ }
+ return super.visitDefsNode(iVisited);
+ }
+
+ @Override
+ public Instruction visitDefnNode(DefnNode iVisited) {
+ ISourcePosition pos = iVisited.getPosition();
+ int lines = (pos.getEndLine() - pos.getStartLine()) - 1;
+ if (lines > maxLines) {
+ createProblem(iVisited.getNameNode().getPosition(), "Too many lines in method: " + lines);
+ }
+ return super.visitDefnNode(iVisited);
+ }
+}
Added: trunk/com.aptana.rdt/src/com/aptana/rdt/internal/parser/warnings/TooManyReturnsVisitor.java
===================================================================
--- trunk/com.aptana.rdt/src/com/aptana/rdt/internal/parser/warnings/TooManyReturnsVisitor.java (rev 0)
+++ trunk/com.aptana.rdt/src/com/aptana/rdt/internal/parser/warnings/TooManyReturnsVisitor.java 2007-06-14 19:16:55 UTC (rev 2617)
@@ -0,0 +1,76 @@
+package com.aptana.rdt.internal.parser.warnings;
+
+import java.util.Map;
+
+import org.jruby.ast.DefnNode;
+import org.jruby.ast.DefsNode;
+import org.jruby.ast.ReturnNode;
+import org.jruby.evaluator.Instruction;
+import org.rubypeople.rdt.internal.core.parser.warnings.RubyLintVisitor;
+
+import com.aptana.rdt.AptanaRDTPlugin;
+
+public class TooManyReturnsVisitor extends RubyLintVisitor {
+
+ private int maxReturns;
+ private int returnCount;
+ private Map fOptions;
+
+ public TooManyReturnsVisitor(String contents) {
+ this(AptanaRDTPlugin.getDefault().getOptions(), contents);
+ }
+
+ public TooManyReturnsVisitor(Map options, String contents) {
+ super(contents);
+ fOptions = options;
+ maxReturns = getInt(AptanaRDTPlugin.COMPILER_PB_MAX_RETURNS, 5);
+ returnCount = 0;
+ }
+ private int getInt(String key, int defaultValue) {
+ try {
+ return Integer.parseInt((String) fOptions.get(key));
+ } catch (NumberFormatException e) {
+ return defaultValue;
+ }
+ }
+
+ @Override
+ protected String getOptionKey() {
+ return AptanaRDTPlugin.COMPILER_PB_MAX_RETURNS;
+ }
+
+ @Override
+ public Instruction visitDefsNode(DefsNode iVisited) {
+ returnCount = 0;
+ return super.visitDefsNode(iVisited);
+ }
+
+ @Override
+ public Instruction visitDefnNode(DefnNode iVisited) {
+ returnCount = 0;
+ return super.visitDefnNode(iVisited);
+ }
+
+ public void exitDefnNode(DefnNode iVisited) {
+ if (returnCount > maxReturns) {
+ createProblem(iVisited.getNameNode().getPosition(), "Too many explicit returns: " + returnCount);
+ }
+ returnCount = 0;
+ }
+
+ @Override
+ public void exitDefsNode(DefsNode iVisited) {
+ if (returnCount > maxReturns) {
+ createProblem(iVisited.getNameNode().getPosition(), "Too many explicit returns: " + returnCount);
+ }
+ returnCount = 0;
+ super.exitDefsNode(iVisited);
+ }
+
+ @Override
+ public Instruction visitReturnNode(ReturnNode iVisited) {
+ returnCount++;
+ return super.visitReturnNode(iVisited);
+ }
+
+}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|