|
From: <caw...@us...> - 2007-08-02 18:59:30
|
Revision: 2926
http://rubyeclipse.svn.sourceforge.net/rubyeclipse/?rev=2926&view=rev
Author: cawilliams
Date: 2007-08-02 11:59:27 -0700 (Thu, 02 Aug 2007)
Log Message:
-----------
fix #5430 - Add code check for dynamic variable which aliases local variable
Modified Paths:
--------------
trunk/com.aptana.rdt/plugin.xml
trunk/com.aptana.rdt/src/com/aptana/rdt/AptanaRDTPlugin.java
trunk/com.aptana.rdt/src/com/aptana/rdt/internal/parser/warnings/LintOptions.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/DynamicVariableAliasesLocal.java
Modified: trunk/com.aptana.rdt/plugin.xml
===================================================================
--- trunk/com.aptana.rdt/plugin.xml 2007-08-02 18:41:26 UTC (rev 2925)
+++ trunk/com.aptana.rdt/plugin.xml 2007-08-02 18:59:27 UTC (rev 2926)
@@ -86,7 +86,11 @@
<error
categoryId="org.rubypeople.rdt.errors.potentialProblems"
label="method_missing defined without re-defined respond_to"
- prefKey="com.aptana.rdt.compiler.problem.methodMissingWithoutRespondTo"/>
+ prefKey="com.aptana.rdt.compiler.problem.methodMissingWithoutRespondTo"/>
+ <error
+ categoryId="org.rubypeople.rdt.errors.potentialProblems"
+ label="Dynamic variables Aliases Local Variable"
+ prefKey="com.aptana.rdt.compiler.problem.dynamicVariableAliasesLocal"/>
</extension>
<!-- =================================================================================== -->
Modified: trunk/com.aptana.rdt/src/com/aptana/rdt/AptanaRDTPlugin.java
===================================================================
--- trunk/com.aptana.rdt/src/com/aptana/rdt/AptanaRDTPlugin.java 2007-08-02 18:41:26 UTC (rev 2925)
+++ trunk/com.aptana.rdt/src/com/aptana/rdt/AptanaRDTPlugin.java 2007-08-02 18:59:27 UTC (rev 2926)
@@ -210,6 +210,13 @@
*/
public static final String COMPILER_PB_METHOD_MISSING_NO_RESPOND_TO = PLUGIN_ID + "com.aptana.rdt.compiler.problem.methodMissingWithoutRespondTo";
+ /**
+ * Possible configurable option ID.
+ * @see #getDefaultOptions()
+ * @since 1.0.0
+ */
+ public static final String COMPILER_PB_DYNAMIC_VARIABLE_ALIASES_LOCAL = PLUGIN_ID + "com.aptana.rdt.compiler.problem.dynamicVariableAliasesLocal";
+
// The shared instance
private static AptanaRDTPlugin plugin;
Added: trunk/com.aptana.rdt/src/com/aptana/rdt/internal/parser/warnings/DynamicVariableAliasesLocal.java
===================================================================
--- trunk/com.aptana.rdt/src/com/aptana/rdt/internal/parser/warnings/DynamicVariableAliasesLocal.java (rev 0)
+++ trunk/com.aptana.rdt/src/com/aptana/rdt/internal/parser/warnings/DynamicVariableAliasesLocal.java 2007-08-02 18:59:27 UTC (rev 2926)
@@ -0,0 +1,56 @@
+package com.aptana.rdt.internal.parser.warnings;
+
+import java.util.List;
+
+import org.jruby.ast.ArrayNode;
+import org.jruby.ast.IterNode;
+import org.jruby.ast.ListNode;
+import org.jruby.ast.LocalAsgnNode;
+import org.jruby.ast.MultipleAsgnNode;
+import org.jruby.ast.Node;
+import org.jruby.evaluator.Instruction;
+import org.rubypeople.rdt.internal.core.parser.warnings.RubyLintVisitor;
+
+import com.aptana.rdt.AptanaRDTPlugin;
+
+public class DynamicVariableAliasesLocal extends RubyLintVisitor {
+
+ public DynamicVariableAliasesLocal(String contents) {
+ super(contents);
+ }
+
+ @Override
+ protected String getOptionKey() {
+ return AptanaRDTPlugin.COMPILER_PB_DYNAMIC_VARIABLE_ALIASES_LOCAL;
+ }
+
+ @Override
+ public Instruction visitIterNode(IterNode iVisited) {
+ checkNode(iVisited.getVarNode());
+ return super.visitIterNode(iVisited);
+ }
+
+ private void checkNode(Node varNode) {
+ if (varNode == null) return;
+ if (varNode instanceof ListNode) {
+ checkListNode((ListNode)varNode);
+ } else if (varNode instanceof MultipleAsgnNode) {
+ MultipleAsgnNode multi = (MultipleAsgnNode) varNode;
+ checkList(multi.childNodes());
+ } else if (varNode instanceof LocalAsgnNode) {
+ createProblem(varNode.getPosition(), "Dynamic variable aliases local");
+ }
+ }
+
+ private void checkListNode(ListNode node) {
+ checkList(node.childNodes());
+ }
+
+ private void checkList(List list) {
+ for (Object child : list) {
+ Node childNode = (Node) child;
+ checkNode(childNode);
+ }
+
+ }
+}
Property changes on: trunk/com.aptana.rdt/src/com/aptana/rdt/internal/parser/warnings/DynamicVariableAliasesLocal.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Modified: trunk/com.aptana.rdt/src/com/aptana/rdt/internal/parser/warnings/LintOptions.java
===================================================================
--- trunk/com.aptana.rdt/src/com/aptana/rdt/internal/parser/warnings/LintOptions.java 2007-08-02 18:41:26 UTC (rev 2925)
+++ trunk/com.aptana.rdt/src/com/aptana/rdt/internal/parser/warnings/LintOptions.java 2007-08-02 18:59:27 UTC (rev 2926)
@@ -28,6 +28,7 @@
public static final long AssignmentPrecedence = 0x200000;
public static final long MethodMissingWithoutRespondTo = 0x400000;
public static final long ConstantNamingConvention = 0x800000;
+ public static final long DynamicVariableAliasesLocal = 0x1000000;
public static final String ERROR = RubyCore.ERROR;
public static final String WARNING = RubyCore.WARNING;
@@ -48,6 +49,7 @@
| SubclassDoesntCallSuper
| MethodMissingWithoutRespondTo
| ConstantNamingConvention
+ | DynamicVariableAliasesLocal
/*| NullReference -- keep RubyCore#getDefaultOptions comment in sync */;
public int maxLocals = 5;
@@ -77,6 +79,7 @@
optionsMap.put(AptanaRDTPlugin.COMPILER_PB_ENUMERABLE_MISSING_METHOD, getSeverityString(EnumerableMissingMethod));
optionsMap.put(AptanaRDTPlugin.COMPILER_PB_CONSTANT_NAMING_CONVENTION, getSeverityString(ConstantNamingConvention));
optionsMap.put(AptanaRDTPlugin.COMPILER_PB_METHOD_MISSING_NO_RESPOND_TO, getSeverityString(MethodMissingWithoutRespondTo));
+ optionsMap.put(AptanaRDTPlugin.COMPILER_PB_DYNAMIC_VARIABLE_ALIASES_LOCAL, getSeverityString(DynamicVariableAliasesLocal));
optionsMap.put(AptanaRDTPlugin.COMPILER_PB_MAX_ARGUMENTS, String.valueOf(maxArguments));
optionsMap.put(AptanaRDTPlugin.COMPILER_PB_MAX_LINES, String.valueOf(maxLines));
optionsMap.put(AptanaRDTPlugin.COMPILER_PB_MAX_LOCALS, String.valueOf(maxLocals));
@@ -114,6 +117,7 @@
if ((optionValue = optionsMap.get(AptanaRDTPlugin.COMPILER_PB_ASSIGNMENT_PRECEDENCE)) != null) updateSeverity(AssignmentPrecedence, optionValue);
if ((optionValue = optionsMap.get(AptanaRDTPlugin.COMPILER_PB_CONSTANT_NAMING_CONVENTION)) != null) updateSeverity(ConstantNamingConvention, optionValue);
if ((optionValue = optionsMap.get(AptanaRDTPlugin.COMPILER_PB_METHOD_MISSING_NO_RESPOND_TO)) != null) updateSeverity(MethodMissingWithoutRespondTo, optionValue);
+ if ((optionValue = optionsMap.get(AptanaRDTPlugin.COMPILER_PB_DYNAMIC_VARIABLE_ALIASES_LOCAL)) != null) updateSeverity(DynamicVariableAliasesLocal, optionValue);
if ((optionValue = optionsMap.get(AptanaRDTPlugin.COMPILER_PB_MAX_LOCALS)) != null) {
if (optionValue instanceof String) {
String stringValue = (String) optionValue;
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-08-02 18:41:26 UTC (rev 2925)
+++ trunk/com.aptana.rdt/src/com/aptana/rdt/internal/parser/warnings/RubyRedLint.java 2007-08-02 18:59:27 UTC (rev 2926)
@@ -84,6 +84,7 @@
visitors.add(new AndOrUsedOnRighthandAssignment(contents));
visitors.add(new ConstantNamingConvention(contents));
visitors.add(new MethodMissingWithoutRespondTo(contents));
+ visitors.add(new DynamicVariableAliasesLocal(contents));
List<RubyLintVisitor> filtered = new ArrayList<RubyLintVisitor>();
for (RubyLintVisitor visitor : visitors) {
if (visitor.isIgnored()) continue;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|