|
From: <caw...@us...> - 2007-05-03 17:27:40
|
Revision: 2426
http://svn.sourceforge.net/rubyeclipse/?rev=2426&view=rev
Author: cawilliams
Date: 2007-05-03 10:27:38 -0700 (Thu, 03 May 2007)
Log Message:
-----------
Added Paths:
-----------
trunk/com.aptana.rdt.tests/.classpath
trunk/com.aptana.rdt.tests/.project
trunk/com.aptana.rdt.tests/META-INF/
trunk/com.aptana.rdt.tests/META-INF/MANIFEST.MF
trunk/com.aptana.rdt.tests/build.properties
trunk/com.aptana.rdt.tests/src/
trunk/com.aptana.rdt.tests/src/com/
trunk/com.aptana.rdt.tests/src/com/aptana/
trunk/com.aptana.rdt.tests/src/com/aptana/rdt/
trunk/com.aptana.rdt.tests/src/com/aptana/rdt/internal/
trunk/com.aptana.rdt.tests/src/com/aptana/rdt/internal/core/
trunk/com.aptana.rdt.tests/src/com/aptana/rdt/internal/core/parser/
trunk/com.aptana.rdt.tests/src/com/aptana/rdt/internal/core/parser/warnings/
trunk/com.aptana.rdt.tests/src/com/aptana/rdt/internal/core/parser/warnings/MockProblemRequestor.java
trunk/com.aptana.rdt.tests/src/com/aptana/rdt/internal/core/parser/warnings/TC_CodeComplexity.java
trunk/com.aptana.rdt.tests/src/com/aptana/rdt/internal/core/parser/warnings/TC_ComparableInclusionVisitor.java
trunk/com.aptana.rdt.tests/src/com/aptana/rdt/internal/core/parser/warnings/TC_EnumerableInclusionVisitor.java
trunk/com.aptana.rdt.tests/src/com/aptana/rdt/internal/core/parser/warnings/TC_SimilarVariableNameVisitor.java
trunk/com.aptana.rdt.tests/src/com/aptana/rdt/internal/core/parser/warnings/TC_UnecessaryElseVisitor.java
trunk/com.aptana.rdt.tests/src/com/aptana/rdt/internal/core/parser/warnings/TS_ParserWarnings.java
trunk/com.aptana.rdt.tests/src/com/aptana/rdt/internal/core/parser/warnings/WarningVisitorTest.java
Added: trunk/com.aptana.rdt.tests/.classpath
===================================================================
--- trunk/com.aptana.rdt.tests/.classpath (rev 0)
+++ trunk/com.aptana.rdt.tests/.classpath 2007-05-03 17:27:38 UTC (rev 2426)
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
Added: trunk/com.aptana.rdt.tests/.project
===================================================================
--- trunk/com.aptana.rdt.tests/.project (rev 0)
+++ trunk/com.aptana.rdt.tests/.project 2007-05-03 17:27:38 UTC (rev 2426)
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>com.aptana.rdt.tests</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ </natures>
+</projectDescription>
Added: trunk/com.aptana.rdt.tests/META-INF/MANIFEST.MF
===================================================================
--- trunk/com.aptana.rdt.tests/META-INF/MANIFEST.MF (rev 0)
+++ trunk/com.aptana.rdt.tests/META-INF/MANIFEST.MF 2007-05-03 17:27:38 UTC (rev 2426)
@@ -0,0 +1,12 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Tests
+Bundle-SymbolicName: com.aptana.rdt.tests
+Bundle-Version: 1.0.0
+Bundle-Localization: plugin
+Require-Bundle: com.aptana.rdt,
+ org.rubypeople.rdt.core,
+ org.jruby,
+ org.eclipse.core.resources,
+ org.eclipse.core.runtime,
+ org.junit
Added: trunk/com.aptana.rdt.tests/build.properties
===================================================================
--- trunk/com.aptana.rdt.tests/build.properties (rev 0)
+++ trunk/com.aptana.rdt.tests/build.properties 2007-05-03 17:27:38 UTC (rev 2426)
@@ -0,0 +1,3 @@
+source.. = src/
+bin.includes = META-INF/,\
+ .
Added: trunk/com.aptana.rdt.tests/src/com/aptana/rdt/internal/core/parser/warnings/MockProblemRequestor.java
===================================================================
--- trunk/com.aptana.rdt.tests/src/com/aptana/rdt/internal/core/parser/warnings/MockProblemRequestor.java (rev 0)
+++ trunk/com.aptana.rdt.tests/src/com/aptana/rdt/internal/core/parser/warnings/MockProblemRequestor.java 2007-05-03 17:27:38 UTC (rev 2426)
@@ -0,0 +1,41 @@
+package com.aptana.rdt.internal.core.parser.warnings;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.rubypeople.rdt.core.IProblemRequestor;
+import org.rubypeople.rdt.core.compiler.IProblem;
+
+public class MockProblemRequestor implements IProblemRequestor {
+
+ private boolean active;
+ private Set<IProblem> problems = new HashSet<IProblem>();
+
+ public void acceptProblem(IProblem problem) {
+ problems.add(problem);
+ }
+
+ public void beginReporting() {
+ active = true;
+ }
+
+ public void endReporting() {
+ active = false;
+ }
+
+ public boolean isActive() {
+ return active;
+ }
+
+ public int numberOfProblems() {
+ return problems.size();
+ }
+
+ public IProblem getProblemAtLine(int i) {
+ for (IProblem problem : problems) {
+ if (problem.getSourceLineNumber() == i) return problem;
+ }
+ return null;
+ }
+
+}
Added: trunk/com.aptana.rdt.tests/src/com/aptana/rdt/internal/core/parser/warnings/TC_CodeComplexity.java
===================================================================
--- trunk/com.aptana.rdt.tests/src/com/aptana/rdt/internal/core/parser/warnings/TC_CodeComplexity.java (rev 0)
+++ trunk/com.aptana.rdt.tests/src/com/aptana/rdt/internal/core/parser/warnings/TC_CodeComplexity.java 2007-05-03 17:27:38 UTC (rev 2426)
@@ -0,0 +1,61 @@
+package com.aptana.rdt.internal.core.parser.warnings;
+
+import org.rubypeople.rdt.internal.core.parser.warnings.RubyLintVisitor;
+
+import com.aptana.rdt.internal.parser.warnings.CodeComplexityVisitor;
+
+
+public class TC_CodeComplexity extends WarningVisitorTest {
+
+ private static final int MAX_LINES = 20;
+
+ @Override
+ protected RubyLintVisitor createVisitor(String code) {
+ return new CodeComplexityVisitor(code);
+ }
+
+ // TODO Add tests for max branches
+ // TODO Add tests for max method params
+ // TODO Add tests for max locals
+ // TODO Add tests for max returns
+
+ public void testTooManyLines() throws Exception {
+ StringBuffer buffer = new StringBuffer();
+ buffer.append("def method\n");
+ for (int i = 1; i <= MAX_LINES + 1; i++) {
+ buffer.append(" # line ");
+ buffer.append(i);
+ buffer.append("\n");
+ }
+ buffer.append("end\n");
+ parse(buffer.toString());
+ assertEquals(1, numberOfProblems());
+ }
+
+ public void testEqualToMaxLines() throws Exception {
+ StringBuffer buffer = new StringBuffer();
+ buffer.append("def method\n");
+ for (int i = 1; i <= MAX_LINES; i++) {
+ buffer.append(" # line ");
+ buffer.append(i);
+ buffer.append("\n");
+ }
+ buffer.append("end\n");
+ parse(buffer.toString());
+ assertEquals(0, numberOfProblems());
+ }
+
+ public void testLessThanMaxLines() throws Exception {
+ StringBuffer buffer = new StringBuffer();
+ buffer.append("def method\n");
+ for (int i = 1; i <= MAX_LINES - 1; i++) {
+ buffer.append(" # line ");
+ buffer.append(i);
+ buffer.append("\n");
+ }
+ buffer.append("end\n");
+ parse(buffer.toString());
+ assertEquals(0, numberOfProblems());
+ }
+
+}
Added: trunk/com.aptana.rdt.tests/src/com/aptana/rdt/internal/core/parser/warnings/TC_ComparableInclusionVisitor.java
===================================================================
--- trunk/com.aptana.rdt.tests/src/com/aptana/rdt/internal/core/parser/warnings/TC_ComparableInclusionVisitor.java (rev 0)
+++ trunk/com.aptana.rdt.tests/src/com/aptana/rdt/internal/core/parser/warnings/TC_ComparableInclusionVisitor.java 2007-05-03 17:27:38 UTC (rev 2426)
@@ -0,0 +1,31 @@
+package com.aptana.rdt.internal.core.parser.warnings;
+
+import org.rubypeople.rdt.internal.core.parser.warnings.RubyLintVisitor;
+
+import com.aptana.rdt.internal.parser.warnings.ComparableInclusionVisitor;
+
+public class TC_ComparableInclusionVisitor extends WarningVisitorTest {
+
+ @Override
+ protected RubyLintVisitor createVisitor(String code) {
+ return new ComparableInclusionVisitor(code);
+ }
+
+ public void testBasicCase() {
+ parse("class Chris\n" +
+ " include Comparable\n" +
+ "end\n");
+ assertEquals(1, numberOfProblems());
+ }
+
+ public void testNoFalsePositive() {
+ parse("class Chris\n" +
+ " include Comparable\n" +
+ " def <=>(other)\n" +
+ " @var <=> other.var\n" +
+ " end\n" +
+ "end\n");
+ assertEquals(0, numberOfProblems());
+ }
+
+}
Added: trunk/com.aptana.rdt.tests/src/com/aptana/rdt/internal/core/parser/warnings/TC_EnumerableInclusionVisitor.java
===================================================================
--- trunk/com.aptana.rdt.tests/src/com/aptana/rdt/internal/core/parser/warnings/TC_EnumerableInclusionVisitor.java (rev 0)
+++ trunk/com.aptana.rdt.tests/src/com/aptana/rdt/internal/core/parser/warnings/TC_EnumerableInclusionVisitor.java 2007-05-03 17:27:38 UTC (rev 2426)
@@ -0,0 +1,31 @@
+package com.aptana.rdt.internal.core.parser.warnings;
+
+import org.rubypeople.rdt.internal.core.parser.warnings.RubyLintVisitor;
+
+import com.aptana.rdt.internal.parser.warnings.EnumerableInclusionVisitor;
+
+public class TC_EnumerableInclusionVisitor extends WarningVisitorTest {
+
+ @Override
+ protected RubyLintVisitor createVisitor(String code) {
+ return new EnumerableInclusionVisitor(code);
+ }
+
+ public void testBasicCase() {
+ parse("class Chris\n" +
+ " include Enumerable\n" +
+ "end\n");
+ assertEquals(1, numberOfProblems());
+ }
+
+ public void testNoFalsePositive() {
+ parse("class Chris\n" +
+ " include Enumerable\n" +
+ " def each\n" +
+ " yield 1\n" +
+ " end\n" +
+ "end\n");
+ assertEquals(0, numberOfProblems());
+ }
+
+}
Added: trunk/com.aptana.rdt.tests/src/com/aptana/rdt/internal/core/parser/warnings/TC_SimilarVariableNameVisitor.java
===================================================================
--- trunk/com.aptana.rdt.tests/src/com/aptana/rdt/internal/core/parser/warnings/TC_SimilarVariableNameVisitor.java (rev 0)
+++ trunk/com.aptana.rdt.tests/src/com/aptana/rdt/internal/core/parser/warnings/TC_SimilarVariableNameVisitor.java 2007-05-03 17:27:38 UTC (rev 2426)
@@ -0,0 +1,132 @@
+package com.aptana.rdt.internal.core.parser.warnings;
+
+import org.rubypeople.rdt.internal.core.parser.warnings.RubyLintVisitor;
+
+import com.aptana.rdt.internal.parser.warnings.SimilarVariableNameVisitor;
+
+public class TC_SimilarVariableNameVisitor extends WarningVisitorTest {
+
+ @Override
+ protected RubyLintVisitor createVisitor(String code) {
+ return new SimilarVariableNameVisitor(code);
+ }
+
+ public void testEmptyHasNoProblems() throws Exception {
+ String code = "";
+ parse(code);
+ assertEquals(0, numberOfProblems());
+ }
+
+ public void testReferToLocalWithSimilarName() throws Exception {
+ String code = "class Ralph\n" +
+ " def name\n" +
+ " local = 1\n" +
+ " puts lcal\n" +
+ " end\n" +
+ "end\n";
+ parse(code);
+ assertEquals(1, numberOfProblems());
+ }
+
+ public void testTranspositionDoesntPushSmallVariablesAboveThreshold() throws Exception {
+ String code = "class Ralph\n" +
+ " def name\n" +
+ " local = 1\n" +
+ " puts lcoal\n" +
+ " end\n" +
+ "end\n";
+ parse(code);
+ assertEquals(1, numberOfProblems());
+ }
+
+ public void testLocalDoesntClashWithInstance() throws Exception {
+ String code = "class Ralph\n" +
+ " def name\n" +
+ " local = 1\n" +
+ " puts @local\n" +
+ " end\n" +
+ "end\n";
+ parse(code);
+ assertEquals(0, numberOfProblems());
+ }
+
+ public void testLocalDoesntClashWithClassVar() throws Exception {
+ String code = "class Ralph\n" +
+ " def name\n" +
+ " localcalifragillistic = 1\n" +
+ " puts @@localcalifragillistic\n" +
+ " end\n" +
+ "end\n";
+ parse(code);
+ assertEquals(0, numberOfProblems());
+ }
+
+ public void testInstanceDoesntClashWithClassVar() throws Exception {
+ String code = "class Ralph\n" +
+ " def name\n" +
+ " @localcalifragillistic = 1\n" +
+ " puts @@localcalifragillistic\n" +
+ " end\n" +
+ "end\n";
+ parse(code);
+ assertEquals(0, numberOfProblems());
+ }
+
+ public void testReallySmallVariablesDontTriggerProblem() throws Exception {
+ String code = "class Ralph\n" +
+ " def name\n" +
+ " @ca = 1\n" +
+ " puts @cb\n" +
+ " end\n" +
+ "end\n";
+ parse(code);
+ assertEquals(0, numberOfProblems());
+ }
+
+ public void testReallySmallClassVariablesDontTriggerProblem() throws Exception {
+ String code = "class Ralph\n" +
+ " def name\n" +
+ " @@a = 1\n" +
+ " puts @@b\n" +
+ " end\n" +
+ "end\n";
+ parse(code);
+ assertEquals(0, numberOfProblems());
+ }
+
+ public void testTooDisimilarNameWontTriggerProblem() throws Exception {
+ String code = "class Ralph\n" +
+ " def name\n" +
+ " local = 1\n" +
+ " puts llal\n" +
+ " end\n" +
+ "end\n";
+ parse(code);
+ assertEquals(0, numberOfProblems());
+ }
+
+// TODO Also watch for similarity in constant names?
+
+ public void testReferToInstanceVarWithSimilarName() throws Exception {
+ String code = "class Ralph\n" +
+ " def name\n" +
+ " @local = 1\n" +
+ " puts @lcal\n" +
+ " end\n" +
+ "end\n";
+ parse(code);
+ assertEquals(1, numberOfProblems());
+ }
+
+ public void testReferToClassVarWithSimilarName() throws Exception {
+ String code = "class Ralph\n" +
+ " def self.name\n" +
+ " @@local = 1\n" +
+ " puts @@lcal\n" +
+ " end\n" +
+ "end\n";
+ parse(code);
+ assertEquals(1, numberOfProblems());
+ }
+
+}
Added: trunk/com.aptana.rdt.tests/src/com/aptana/rdt/internal/core/parser/warnings/TC_UnecessaryElseVisitor.java
===================================================================
--- trunk/com.aptana.rdt.tests/src/com/aptana/rdt/internal/core/parser/warnings/TC_UnecessaryElseVisitor.java (rev 0)
+++ trunk/com.aptana.rdt.tests/src/com/aptana/rdt/internal/core/parser/warnings/TC_UnecessaryElseVisitor.java 2007-05-03 17:27:38 UTC (rev 2426)
@@ -0,0 +1,146 @@
+package com.aptana.rdt.internal.core.parser.warnings;
+
+import org.rubypeople.rdt.core.IProblemRequestor;
+import org.rubypeople.rdt.internal.core.parser.warnings.RubyLintVisitor;
+
+import com.aptana.rdt.internal.parser.warnings.UnecessaryElseVisitor;
+
+
+public class TC_UnecessaryElseVisitor extends WarningVisitorTest {
+
+ @Override
+ protected RubyLintVisitor createVisitor(String code) {
+ return new UnecessaryElseVisitor(code);
+ }
+
+ public void testSimpleIfElse() throws Exception {
+ parse("if true\nreturn\nelse\nputs 'Hi'\nend\n");
+ assertEquals(1, numberOfProblems());
+ }
+
+ public void testIfWithNoElseDoesntGetMarked() throws Exception {
+ parse("if true\nputs 'Hi'\nend\n");
+ assertEquals(0, numberOfProblems());
+ }
+
+ public void testIfElseWithNoExplicitReturnDoesntGetMarked() throws Exception {
+ parse("if true\n'Hi'\nelse\n'Hello'\nend\n");
+ assertEquals(0, numberOfProblems());
+ }
+
+ public void testNestedIfs() throws Exception {
+ parse("if true\n" +
+ " if false\n" +
+ " return\n" +
+ " end\n" +
+ " 'Hi'\n" +
+ "else\n" +
+ " 'Hello'\n" +
+ "end\n");
+ assertEquals(0, numberOfProblems());
+ }
+
+ public void testNestedIfsB() throws Exception {
+ parse("if true\n" +
+ " if false\n" +
+ " return\n" +
+ " end\n" +
+ "else\n" +
+ " 'Hello'\n" +
+ "end\n");
+ assertEquals(0, numberOfProblems());
+ }
+
+ public void testNestedIfsAllWithExplicitReturns() throws Exception {
+ parse("if true\n" +
+ " if false\n" +
+ " return\n" +
+ " else\n" +
+ " return\n" +
+ " end\n" +
+ "else\n" +
+ " 'Hello'\n" +
+ "end\n");
+ assertEquals(2, numberOfProblems());
+ }
+
+ public void testIfModifierIsntProblem() throws Exception {
+ parse("puts 'hello' if true\n");
+ assertEquals(0, numberOfProblems());
+ }
+
+ public void testUnlessModifierIsntProblem() throws Exception {
+ parse("puts 'hello' unless true\n");
+ assertEquals(0, numberOfProblems());
+ }
+
+ public void testUnlessWithEachCanHaveProblem() throws Exception {
+ parse("unless true\n" +
+ " if false\n" +
+ " return\n" +
+ " else\n" +
+ " return\n" +
+ " end\n" +
+ "else\n" +
+ " 'Hello'\n" +
+ "end\n");
+ assertEquals(2, numberOfProblems());
+ }
+
+ public void testSwitchInsideIfWithAllExplicitReturns() throws Exception {
+ parse("if true\n" +
+ " case thing\n" +
+ " when comparison1\n" +
+ " return\n" +
+ " when comparison2\n" +
+ " return\n" +
+ " end\n" +
+ "else\n" +
+ " 'Hello'\n" +
+ "end\n");
+ assertEquals(1, numberOfProblems());
+ }
+
+ public void testSwitchInsideIfWithoutAllHavingExplicitReturns() throws Exception {
+ parse("if true\n" +
+ " case thing\n" +
+ " when comparison1\n" +
+ " return\n" +
+ " when comparison2\n" +
+ " puts 'Hello world!'\n" +
+ " end\n" +
+ "else\n" +
+ " 'Hello'\n" +
+ "end\n");
+ assertEquals(0, numberOfProblems());
+ }
+
+ public void testSwitchInsideUnlessWithAllExplicitReturns() throws Exception {
+ parse("unless true\n" +
+ " case thing\n" +
+ " when comparison1\n" +
+ " return\n" +
+ " when comparison2\n" +
+ " return\n" +
+ " end\n" +
+ "else\n" +
+ " 'Hello'\n" +
+ "end\n");
+ assertEquals(1, numberOfProblems());
+ }
+
+ public void testSwitchInsideUnlessWithoutAllHavingExplicitReturns() throws Exception {
+ parse("unless true\n" +
+ " case thing\n" +
+ " when comparison1\n" +
+ " return\n" +
+ " when comparison2\n" +
+ " puts 'Hello world!'\n" +
+ " end\n" +
+ "else\n" +
+ " 'Hello'\n" +
+ "end\n");
+ assertEquals(0, numberOfProblems());
+ }
+
+}
Added: trunk/com.aptana.rdt.tests/src/com/aptana/rdt/internal/core/parser/warnings/TS_ParserWarnings.java
===================================================================
--- trunk/com.aptana.rdt.tests/src/com/aptana/rdt/internal/core/parser/warnings/TS_ParserWarnings.java (rev 0)
+++ trunk/com.aptana.rdt.tests/src/com/aptana/rdt/internal/core/parser/warnings/TS_ParserWarnings.java 2007-05-03 17:27:38 UTC (rev 2426)
@@ -0,0 +1,22 @@
+package com.aptana.rdt.internal.core.parser.warnings;
+
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+public class TS_ParserWarnings {
+
+ public static Test suite() {
+ TestSuite suite = new TestSuite(
+ "Parser warnings");
+ //$JUnit-BEGIN$
+ suite.addTestSuite(TC_SimilarVariableNameVisitor.class);
+ suite.addTestSuite(TC_UnecessaryElseVisitor.class);
+ suite.addTestSuite(TC_CodeComplexity.class);
+ suite.addTestSuite(TC_ComparableInclusionVisitor.class);
+ suite.addTestSuite(TC_EnumerableInclusionVisitor.class);
+ //$JUnit-END$
+ return suite;
+ }
+
+}
Added: trunk/com.aptana.rdt.tests/src/com/aptana/rdt/internal/core/parser/warnings/WarningVisitorTest.java
===================================================================
--- trunk/com.aptana.rdt.tests/src/com/aptana/rdt/internal/core/parser/warnings/WarningVisitorTest.java (rev 0)
+++ trunk/com.aptana.rdt.tests/src/com/aptana/rdt/internal/core/parser/warnings/WarningVisitorTest.java 2007-05-03 17:27:38 UTC (rev 2426)
@@ -0,0 +1,43 @@
+package com.aptana.rdt.internal.core.parser.warnings;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.jruby.ast.Node;
+import org.rubypeople.rdt.core.compiler.IProblem;
+import org.rubypeople.rdt.internal.core.parser.RubyParser;
+import org.rubypeople.rdt.internal.core.parser.warnings.DelegatingVisitor;
+import org.rubypeople.rdt.internal.core.parser.warnings.RubyLintVisitor;
+
+public abstract class WarningVisitorTest extends TestCase {
+
+ private MockProblemRequestor problemRequestor;
+ private RubyParser parser;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ problemRequestor = new MockProblemRequestor();
+ parser = new RubyParser();
+ }
+
+ protected void parse(String code) {
+ Node root = parser.parse(code);
+ List<RubyLintVisitor> visitors = new ArrayList<RubyLintVisitor>();
+ visitors.add(createVisitor(code));
+ DelegatingVisitor visitor = new DelegatingVisitor(visitors);
+ root.accept(visitor);
+ }
+
+ public int numberOfProblems() {
+ return problemRequestor.numberOfProblems();
+ }
+
+ protected IProblem getProblemAtLine(int i) {
+ return problemRequestor.getProblemAtLine(i);
+ }
+
+ abstract protected RubyLintVisitor createVisitor(String code);
+}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|