|
From: <caw...@us...> - 2007-08-10 15:16:51
|
Revision: 2959
http://rubyeclipse.svn.sourceforge.net/rubyeclipse/?rev=2959&view=rev
Author: cawilliams
Date: 2007-08-10 08:16:49 -0700 (Fri, 10 Aug 2007)
Log Message:
-----------
Fix #5517 - Add warning check for local variable assignment that may intend to be attribute access
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/LocalVariablePossibleAttributeAccess.java
Modified: trunk/com.aptana.rdt/plugin.xml
===================================================================
--- trunk/com.aptana.rdt/plugin.xml 2007-08-10 15:16:40 UTC (rev 2958)
+++ trunk/com.aptana.rdt/plugin.xml 2007-08-10 15:16:49 UTC (rev 2959)
@@ -90,7 +90,11 @@
<error
categoryId="org.rubypeople.rdt.errors.potentialProblems"
label="Dynamic variables Aliases Local Variable"
- prefKey="com.aptana.rdt.compiler.problem.dynamicVariableAliasesLocal"/>
+ prefKey="com.aptana.rdt.compiler.problem.dynamicVariableAliasesLocal"/>
+ <error
+ categoryId="org.rubypeople.rdt.errors.potentialProblems"
+ label="Local Variable assignment possibly intended to access attribute"
+ prefKey="com.aptana.rdt.compiler.problem.localVariablePossibleAttributeAccess"/>
</extension>
<!-- =================================================================================== -->
Modified: trunk/com.aptana.rdt/src/com/aptana/rdt/AptanaRDTPlugin.java
===================================================================
--- trunk/com.aptana.rdt/src/com/aptana/rdt/AptanaRDTPlugin.java 2007-08-10 15:16:40 UTC (rev 2958)
+++ trunk/com.aptana.rdt/src/com/aptana/rdt/AptanaRDTPlugin.java 2007-08-10 15:16:49 UTC (rev 2959)
@@ -208,15 +208,22 @@
* @see #getDefaultOptions()
* @since 1.0.0
*/
- public static final String COMPILER_PB_METHOD_MISSING_NO_RESPOND_TO = PLUGIN_ID + ".compiler.problem.methodMissingWithoutRespondTo";
+ public static final String COMPILER_PB_METHOD_MISSING_NO_RESPOND_TO = PLUGIN_ID + ".compiler.problem.methodMissingWithoutRespondTo"; //$NON-NLS-1$
/**
* Possible configurable option ID.
* @see #getDefaultOptions()
* @since 1.0.0
*/
- public static final String COMPILER_PB_DYNAMIC_VARIABLE_ALIASES_LOCAL = PLUGIN_ID + ".compiler.problem.dynamicVariableAliasesLocal";
+ public static final String COMPILER_PB_DYNAMIC_VARIABLE_ALIASES_LOCAL = PLUGIN_ID + ".compiler.problem.dynamicVariableAliasesLocal"; //$NON-NLS-1$
+ /**
+ * Possible configurable option ID.
+ * @see #getDefaultOptions()
+ * @since 1.0.0
+ */
+ public static final String COMPILER_PB_LOCAL_VARIABLE_POSSIBLE_ATTRIBUTE_ACCESS = PLUGIN_ID + ".compiler.problem.localVariablePossibleAttributeAccess"; //$NON-NLS-1$
+
// The shared instance
private static AptanaRDTPlugin plugin;
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-10 15:16:40 UTC (rev 2958)
+++ trunk/com.aptana.rdt/src/com/aptana/rdt/internal/parser/warnings/LintOptions.java 2007-08-10 15:16:49 UTC (rev 2959)
@@ -29,6 +29,7 @@
public static final long MethodMissingWithoutRespondTo = 0x400000;
public static final long ConstantNamingConvention = 0x800000;
public static final long DynamicVariableAliasesLocal = 0x1000000;
+ public static final long LocalVariablePossibleAttributeAccess = 0x2000000;
public static final String ERROR = RubyCore.ERROR;
public static final String WARNING = RubyCore.WARNING;
@@ -50,6 +51,7 @@
| MethodMissingWithoutRespondTo
| ConstantNamingConvention
| DynamicVariableAliasesLocal
+ | LocalVariablePossibleAttributeAccess
/*| NullReference -- keep RubyCore#getDefaultOptions comment in sync */;
public int maxLocals = 5;
@@ -59,7 +61,7 @@
public int maxArguments = 10;
public Map getMap() {
- Map optionsMap = new HashMap(30);
+ Map<String, String> optionsMap = new HashMap<String, String>(30);
optionsMap.put(AptanaRDTPlugin.COMPILER_PB_UNUSED_PRIVATE_MEMBER, getSeverityString(UnusedPrivateMember));
optionsMap.put(AptanaRDTPlugin.COMPILER_PB_SUBCLASS_DOESNT_CALL_SUPER, getSeverityString(SubclassDoesntCallSuper));
optionsMap.put(AptanaRDTPlugin.COMPILER_PB_ASSIGNMENT_PRECEDENCE, getSeverityString(AssignmentPrecedence));
@@ -80,6 +82,7 @@
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_LOCAL_VARIABLE_POSSIBLE_ATTRIBUTE_ACCESS, getSeverityString(LocalVariablePossibleAttributeAccess));
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));
@@ -118,6 +121,7 @@
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_LOCAL_VARIABLE_POSSIBLE_ATTRIBUTE_ACCESS)) != null) updateSeverity(LocalVariablePossibleAttributeAccess, optionValue);
if ((optionValue = optionsMap.get(AptanaRDTPlugin.COMPILER_PB_MAX_LOCALS)) != null) {
if (optionValue instanceof String) {
String stringValue = (String) optionValue;
Added: trunk/com.aptana.rdt/src/com/aptana/rdt/internal/parser/warnings/LocalVariablePossibleAttributeAccess.java
===================================================================
--- trunk/com.aptana.rdt/src/com/aptana/rdt/internal/parser/warnings/LocalVariablePossibleAttributeAccess.java (rev 0)
+++ trunk/com.aptana.rdt/src/com/aptana/rdt/internal/parser/warnings/LocalVariablePossibleAttributeAccess.java 2007-08-10 15:16:49 UTC (rev 2959)
@@ -0,0 +1,73 @@
+package com.aptana.rdt.internal.parser.warnings;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.jruby.ast.ClassNode;
+import org.jruby.ast.FCallNode;
+import org.jruby.ast.LocalAsgnNode;
+import org.jruby.evaluator.Instruction;
+import org.rubypeople.rdt.core.parser.warnings.RubyLintVisitor;
+import org.rubypeople.rdt.internal.core.util.ASTUtil;
+
+import com.aptana.rdt.AptanaRDTPlugin;
+
+public class LocalVariablePossibleAttributeAccess extends RubyLintVisitor {
+
+ private List<LocalAsgnNode> locals = new ArrayList<LocalAsgnNode>();
+
+ private List<String> attributes = new ArrayList<String>();
+
+ public LocalVariablePossibleAttributeAccess(String contents) {
+ super(AptanaRDTPlugin.getDefault().getOptions(), contents);
+ }
+
+ @Override
+ protected String getOptionKey() {
+ return AptanaRDTPlugin.COMPILER_PB_LOCAL_VARIABLE_POSSIBLE_ATTRIBUTE_ACCESS;
+ }
+
+ @Override
+ public Instruction visitClassNode(ClassNode iVisited) {
+ locals.clear();
+ attributes.clear();
+ return super.visitClassNode(iVisited);
+ }
+
+ @Override
+ public Instruction visitLocalAsgnNode(LocalAsgnNode iVisited) {
+ locals.add(iVisited);
+ return super.visitLocalAsgnNode(iVisited);
+ }
+
+ @Override
+ public Instruction visitFCallNode(FCallNode iVisited) {
+ String name = iVisited.getName();
+ if (name.equals("attr_accessor") || name.equals("attr_writer")
+ || name.equals("attr")) {
+ List<String> args = ASTUtil.getArgumentsFromFunctionCall(iVisited);
+ if (name.equals("attr")) {
+ // second arg must be "true"
+ if (args.size() < 2) {
+ return super.visitFCallNode(iVisited);
+ }
+ if (!args.get(1).equals("true")) return super.visitFCallNode(iVisited);
+ attributes.add(args.get(0));
+ return super.visitFCallNode(iVisited);
+ }
+ attributes.addAll(args);
+ }
+ return super.visitFCallNode(iVisited);
+ }
+
+ @Override
+ public void exitClassNode(ClassNode iVisited) {
+ for (LocalAsgnNode local : locals) {
+ if (attributes.contains(local.getName())) {
+ createProblem(local.getPosition(), "Local variable assignment might be possible attribute access attempt?");
+ }
+ }
+ super.exitClassNode(iVisited);
+ }
+
+}
Property changes on: trunk/com.aptana.rdt/src/com/aptana/rdt/internal/parser/warnings/LocalVariablePossibleAttributeAccess.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
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-10 15:16:40 UTC (rev 2958)
+++ trunk/com.aptana.rdt/src/com/aptana/rdt/internal/parser/warnings/RubyRedLint.java 2007-08-10 15:16:49 UTC (rev 2959)
@@ -85,6 +85,7 @@
visitors.add(new ConstantNamingConvention(contents));
visitors.add(new MethodMissingWithoutRespondTo(contents));
visitors.add(new DynamicVariableAliasesLocal(contents));
+ visitors.add(new LocalVariablePossibleAttributeAccess(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.
|