|
From: <caw...@us...> - 2007-09-10 18:40:56
|
Revision: 3124
http://rubyeclipse.svn.sourceforge.net/rubyeclipse/?rev=3124&view=rev
Author: cawilliams
Date: 2007-09-10 11:40:55 -0700 (Mon, 10 Sep 2007)
Log Message:
-----------
fix resolution of some constants (modules who are referred to by their simple name and we must deduce the fully qualified name)
Modified Paths:
--------------
trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/codeassist/SelectionEngine.java
trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/util/ASTUtil.java
Modified: trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/codeassist/SelectionEngine.java
===================================================================
--- trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/codeassist/SelectionEngine.java 2007-09-10 18:29:05 UTC (rev 3123)
+++ trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/codeassist/SelectionEngine.java 2007-09-10 18:40:55 UTC (rev 3124)
@@ -155,7 +155,7 @@
RubyElementRequestor completer = new RubyElementRequestor(script);
IType[] types = completer.findType(name);
if (types != null && types.length > 0) return types;
- String fullyQualifiedName = getFullyQualifiedName(root, name);
+ String fullyQualifiedName = getFullyQualifiedName(root, constNode.getPosition().getStartOffset(), name);
if (fullyQualifiedName == null) return new IRubyElement[0];
return completer.findType(fullyQualifiedName); // get fully qualified name of surrounding type!
}
@@ -222,31 +222,12 @@
return new IRubyElement[0];
}
- private String getFullyQualifiedName(Node root, String name) {
- List<Node> surrounding = ScopedNodeLocator.Instance().findNodesInScope(root, new INodeAcceptor() {
-
- public boolean doesAccept(Node node) {
- return node instanceof ModuleNode || node instanceof ClassNode;
- }
-
- });
- // drop last class/module
- if (surrounding.size() < 2) return null;
- surrounding.remove(surrounding.size() - 1);
- StringBuffer buffer = new StringBuffer();
- boolean first = true;
- for (Node node : surrounding) {
- if (!first) {
- buffer.append("::");
- }
- buffer.append(ASTUtil.getNameReflectively(node));
- if (first) {
- first = false;
- }
+ private String getFullyQualifiedName(Node root, int offset, String name) {
+ String namespace = ASTUtil.getNamespace(root, offset);
+ if (namespace == null || namespace.trim().length() == 0) {
+ return name;
}
- buffer.append("::");
- buffer.append(name);
- return buffer.toString();
+ return namespace + "::" + name;
}
private List<SearchMatch> search(int type, String patternString, int limitTo, int matchRule) throws CoreException {
Modified: trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/util/ASTUtil.java
===================================================================
--- trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/util/ASTUtil.java 2007-09-10 18:29:05 UTC (rev 3123)
+++ trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/util/ASTUtil.java 2007-09-10 18:40:55 UTC (rev 3124)
@@ -43,6 +43,8 @@
import org.jruby.ast.types.INameNode;
import org.jruby.lexer.yacc.ISourcePosition;
import org.jruby.parser.StaticScope;
+import org.rubypeople.rdt.internal.ti.util.ClosestSpanningNodeLocator;
+import org.rubypeople.rdt.internal.ti.util.INodeAcceptor;
public abstract class ASTUtil {
private static final boolean VERBOSE = false;
@@ -299,4 +301,40 @@
return EMPTY_STRING;
}
+ public static String getNamespace(Node root, int offset) {
+ List<Node> surrounding = new ArrayList<Node>();
+ Node typeNode = ClosestSpanningNodeLocator.Instance().findClosestSpanner(root, offset, new INodeAcceptor() {
+
+ public boolean doesAccept(Node node) {
+ return node instanceof ModuleNode || node instanceof ClassNode;
+ }
+
+ });
+ while (typeNode != null) {
+ surrounding.add(0, typeNode);
+ typeNode = ClosestSpanningNodeLocator.Instance().findClosestSpanner(root, typeNode.getPosition().getStartOffset() - 1, new INodeAcceptor() {
+
+ public boolean doesAccept(Node node) {
+ return node instanceof ModuleNode || node instanceof ClassNode;
+ }
+
+ });
+ }
+ // drop last class/module
+ if (surrounding.size() < 2) return "";
+ surrounding.remove(surrounding.size() - 1);
+ StringBuffer buffer = new StringBuffer();
+ boolean first = true;
+ for (Node node : surrounding) {
+ if (!first) {
+ buffer.append("::");
+ }
+ buffer.append(getNameReflectively(node));
+ if (first) {
+ first = false;
+ }
+ }
+ return buffer.toString();
+ }
+
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|