|
From: <caw...@us...> - 2007-07-30 18:52:17
|
Revision: 2902
http://rubyeclipse.svn.sourceforge.net/rubyeclipse/?rev=2902&view=rev
Author: cawilliams
Date: 2007-07-30 11:52:14 -0700 (Mon, 30 Jul 2007)
Log Message:
-----------
if we hit class_eval, grab receiver and act like it's another declaration of the receiver. (so when Rails performs class_eval on ActiveRecord::Base to mixin modules, we should catch it now)
Modified Paths:
--------------
trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/SourceElementParser.java
Modified: trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/SourceElementParser.java
===================================================================
--- trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/SourceElementParser.java 2007-07-30 18:48:50 UTC (rev 2901)
+++ trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/SourceElementParser.java 2007-07-30 18:52:14 UTC (rev 2902)
@@ -52,6 +52,7 @@
import org.jruby.ast.IterNode;
import org.jruby.ast.LocalAsgnNode;
import org.jruby.ast.ModuleNode;
+import org.jruby.ast.NewlineNode;
import org.jruby.ast.Node;
import org.jruby.ast.RootNode;
import org.jruby.ast.SClassNode;
@@ -74,7 +75,7 @@
* @author Chris
*
*/
-public class SourceElementParser extends InOrderVisitor { // TODO Rename to SourceElementParser
+public class SourceElementParser extends InOrderVisitor {
private static final String MODULE_FUNCTION = "module_function";
private static final String EMPTY_STRING = "";
@@ -473,6 +474,9 @@
if (mixinNameNode instanceof ConstNode) {
mixins.add(((ConstNode) mixinNameNode).getName());
}
+ if (mixinNameNode instanceof Colon2Node) {
+ mixins.add(ASTUtil.getFullyQualifiedName((Colon2Node) mixinNameNode));
+ }
}
for (String string : mixins) {
requestor.acceptMixin(string);
@@ -523,6 +527,39 @@
for (String methodName : arguments) {
requestor.acceptModuleFunction(methodName);
}
+ } else if (name.equals("class_eval")) {
+ Node receiver = iVisited.getReceiverNode();
+ if (receiver instanceof ConstNode || receiver instanceof Colon2Node) {
+ String receiverName = null;
+ if (receiver instanceof Colon2Node) {
+ receiverName = ASTUtil
+ .getFullyQualifiedName((Colon2Node) receiver);
+ } else {
+ receiverName = ASTUtil.getNameReflectively(receiver);
+ }
+ requestor.acceptMethodReference(name, arguments.size(),
+ iVisited.getPosition().getStartOffset());
+
+ pushVisibility(Visibility.PUBLIC);
+
+ TypeInfo typeInfo = new TypeInfo();
+ typeInfo.name = receiverName;
+ typeInfo.declarationStart = iVisited.getPosition()
+ .getStartOffset();
+ typeInfo.nameSourceStart = receiver.getPosition()
+ .getStartOffset();
+ typeInfo.nameSourceEnd = receiver.getPosition().getEndOffset() - 1;
+ typeInfo.isModule = false;
+ typeInfo.modules = new String[0];
+ typeInfo.secondary = false;
+ requestor.enterType(typeInfo);
+
+ Instruction ins = super.visitCallNode(iVisited);
+ popVisibility();
+ requestor.exitType(iVisited.getPosition().getEndOffset() - 2);
+
+ return ins;
+ }
}
requestor.acceptMethodReference(name, arguments.size(), iVisited.getPosition().getStartOffset());
return super.visitCallNode(iVisited);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|