|
From: <caw...@us...> - 2007-08-21 14:05:16
|
Revision: 3013
http://rubyeclipse.svn.sourceforge.net/rubyeclipse/?rev=3013&view=rev
Author: cawilliams
Date: 2007-08-21 07:05:14 -0700 (Tue, 21 Aug 2007)
Log Message:
-----------
enable finding occurrences of method calls in file
Modified Paths:
--------------
trunk/org.rubypeople.rdt.ui/src/org/rubypeople/rdt/internal/ui/search/OccurrencesFinder.java
Modified: trunk/org.rubypeople.rdt.ui/src/org/rubypeople/rdt/internal/ui/search/OccurrencesFinder.java
===================================================================
--- trunk/org.rubypeople.rdt.ui/src/org/rubypeople/rdt/internal/ui/search/OccurrencesFinder.java 2007-08-21 13:48:10 UTC (rev 3012)
+++ trunk/org.rubypeople.rdt.ui/src/org/rubypeople/rdt/internal/ui/search/OccurrencesFinder.java 2007-08-21 14:05:14 UTC (rev 3013)
@@ -16,6 +16,7 @@
import org.jruby.ast.ArgumentNode;
import org.jruby.ast.BlockArgNode;
import org.jruby.ast.BlockNode;
+import org.jruby.ast.CallNode;
import org.jruby.ast.ClassNode;
import org.jruby.ast.ClassVarAsgnNode;
import org.jruby.ast.ClassVarDeclNode;
@@ -27,6 +28,7 @@
import org.jruby.ast.DVarNode;
import org.jruby.ast.DefnNode;
import org.jruby.ast.DefsNode;
+import org.jruby.ast.FCallNode;
import org.jruby.ast.GlobalAsgnNode;
import org.jruby.ast.GlobalVarNode;
import org.jruby.ast.InstAsgnNode;
@@ -37,6 +39,8 @@
import org.jruby.ast.Node;
import org.jruby.ast.ReturnNode;
import org.jruby.ast.SymbolNode;
+import org.jruby.ast.VCallNode;
+import org.jruby.ast.types.INameNode;
import org.jruby.lexer.yacc.IDESourcePosition;
import org.jruby.lexer.yacc.ISourcePosition;
import org.jruby.lexer.yacc.SyntaxException;
@@ -197,9 +201,9 @@
pushSymbolRefs(root, fSelectedNode, fUsages);
}
- // if ( isMethodRefNode(fSelectedNode)) {
- // pushMethodRefs( root, fSelectedNode, occurrences );
- // }
+ if ( fMarkMethodOccurrences && isMethodRefNode(fSelectedNode)) {
+ pushMethodRefs( root, fSelectedNode, fUsages );
+ }
if (fMarkConstantOccurrences && isConstRef(fSelectedNode)) {
pushConstRefs(root, fSelectedNode, fUsages);
@@ -232,6 +236,10 @@
return positions;
}
+ private boolean isMethodRefNode(Node selectedNode) {
+ return selectedNode instanceof VCallNode || selectedNode instanceof FCallNode || selectedNode instanceof CallNode;
+ }
+
// ****************************************************************************
// *
// * Reference kind definitions
@@ -602,7 +610,30 @@
if (searchResult instanceof ConstDeclNode) fWriteUsages.add(searchResult);
}
}
+
+ /**
+ * Collects all pertinent method calls
+ */
+ private void pushMethodRefs(Node root, Node orig, List<Node> occurrences) {
+ if (!isMethodRefNode(orig)) {
+ return;
+ }
+ final String matchName = ASTUtil.getNameReflectively(orig);
+ List<Node> searchResults = ScopedNodeLocator.Instance().findNodesInScope(root, new INodeAcceptor() {
+ public boolean doesAccept(Node node) {
+ if (isMethodRefNode(node)) {
+ return ASTUtil.getNameReflectively(node).equals(matchName);
+ }
+ return false;
+ }
+ });
+
+ for (Node searchResult : searchResults) {
+ occurrences.add(searchResult);
+ }
+ }
+
/**
* Collects all pertinent type ref occurrences
*/
@@ -698,8 +729,17 @@
// one
name = ((SymbolNode) node).getName();
return new IDESourcePosition(pos.getFile(), pos.getStartLine(), pos.getEndLine(), pos.getStartOffset(), pos.getStartOffset() + name.length() + 1);
+ } else if (node instanceof CallNode) {
+ CallNode vcall = (CallNode) node;
+ name = vcall.getName();
+ String receiver = ASTUtil.stringRepresentation(vcall.getReceiverNode());
+ int start = pos.getStartOffset() + receiver.length() + 1;
+ return new IDESourcePosition(pos.getFile(), pos.getStartLine(), pos.getEndLine(), start, start + name.length());
+ } else if (node instanceof INameNode) {
+ INameNode vcall = (INameNode) node;
+ name = vcall.getName();
+ return new IDESourcePosition(pos.getFile(), pos.getStartLine(), pos.getEndLine(), pos.getStartOffset(), pos.getStartOffset() + name.length());
}
-
if (name == null) {
throw new RuntimeException("Couldn't get the name for: " + node.toString());
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|