|
From: <caw...@us...> - 2007-05-14 19:15:08
|
Revision: 2474
http://svn.sourceforge.net/rubyeclipse/?rev=2474&view=rev
Author: cawilliams
Date: 2007-05-14 12:15:03 -0700 (Mon, 14 May 2007)
Log Message:
-----------
Modified Paths:
--------------
trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/compiler/ISourceElementRequestor.java
trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/RubyMethod.java
trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/RubyMethodElementInfo.java
trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/RubyScriptStructureBuilder.java
trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/RubyTypeElementInfo.java
trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/SourceParser.java
trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/search/indexing/SourceIndexerRequestor.java
Removed Paths:
-------------
trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/RubySingletonMethod.java
Modified: trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/compiler/ISourceElementRequestor.java
===================================================================
--- trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/compiler/ISourceElementRequestor.java 2007-05-14 17:58:42 UTC (rev 2473)
+++ trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/compiler/ISourceElementRequestor.java 2007-05-14 19:15:03 UTC (rev 2474)
@@ -54,4 +54,7 @@
public void acceptUnknownReference(String name, int startOffset, int endOffset);
public void acceptProblem(CategorizedProblem problem);
public void acceptMixin(String string);
+
+ public void acceptModuleFunction(String function);
+ public void acceptMethodVisibilityChange(String methodName, int visibility);
}
Modified: trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/RubyMethod.java
===================================================================
--- trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/RubyMethod.java 2007-05-14 17:58:42 UTC (rev 2473)
+++ trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/RubyMethod.java 2007-05-14 19:15:03 UTC (rev 2474)
@@ -27,6 +27,7 @@
import org.rubypeople.rdt.core.IMethod;
import org.rubypeople.rdt.core.IRubyElement;
import org.rubypeople.rdt.core.IType;
+import org.rubypeople.rdt.core.RubyCore;
import org.rubypeople.rdt.core.RubyModelException;
import org.rubypeople.rdt.internal.core.util.Util;
@@ -111,7 +112,24 @@
}
public boolean isSingleton() {
- return isConstructor();
+ try {
+ RubyMethodElementInfo info = (RubyMethodElementInfo) getElementInfo();
+ return info.isSingleton();
+ } catch (RubyModelException e) {
+ RubyCore.log(e);
+ }
+ return isConstructor();
}
+ public static RubyMethod singleton(RubyElement currentType, String name, String[] parameterNames2) {
+ RubyMethod method = new RubyMethod(currentType, name, parameterNames2);
+ try {
+ RubyMethodElementInfo info = (RubyMethodElementInfo) method.getElementInfo();
+ info.setIsSingleton(true);
+ } catch (RubyModelException e) {
+ RubyCore.log(e);
+ }
+ return method;
+ }
+
}
\ No newline at end of file
Modified: trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/RubyMethodElementInfo.java
===================================================================
--- trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/RubyMethodElementInfo.java 2007-05-14 17:58:42 UTC (rev 2473)
+++ trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/RubyMethodElementInfo.java 2007-05-14 19:15:03 UTC (rev 2474)
@@ -27,6 +27,7 @@
* parameters.
*/
protected String[] argumentNames;
+ private boolean isSingleton;
public String[] getArgumentNames() {
return this.argumentNames;
@@ -56,4 +57,12 @@
protected void setArgumentNames(String[] names) {
this.argumentNames = names;
}
+
+ protected void setIsSingleton(boolean b) {
+ isSingleton = b;
+ }
+
+ public boolean isSingleton() {
+ return isSingleton || isConstructor();
+ }
}
Modified: trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/RubyScriptStructureBuilder.java
===================================================================
--- trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/RubyScriptStructureBuilder.java 2007-05-14 17:58:42 UTC (rev 2473)
+++ trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/RubyScriptStructureBuilder.java 2007-05-14 19:15:03 UTC (rev 2474)
@@ -32,6 +32,7 @@
import java.util.List;
import java.util.Map;
+import org.rubypeople.rdt.core.IMethod;
import org.rubypeople.rdt.core.IRubyElement;
import org.rubypeople.rdt.core.IRubyScript;
import org.rubypeople.rdt.core.RubyCore;
@@ -226,12 +227,7 @@
}
public void enterMethod(MethodInfo methodInfo) {
- RubyMethod method;
- if (methodInfo.isClassLevel) {
- method = new RubySingletonMethod(getCurrentType(), methodInfo.name, methodInfo.parameterNames);
- } else {
- method = new RubyMethod(getCurrentType(), methodInfo.name, methodInfo.parameterNames);
- }
+ RubyMethod method = new RubyMethod(getCurrentType(), methodInfo.name, methodInfo.parameterNames);
modelStack.push(method);
infoStack.peek().addChild(method);
@@ -242,6 +238,7 @@
info.setNameSourceStart(methodInfo.nameSourceStart);
info.setNameSourceEnd(methodInfo.nameSourceEnd);
info.setSourceRangeStart(methodInfo.declarationStart);
+ info.setIsSingleton(methodInfo.isClassLevel);
infoStack.push(info);
newElements.put(method, info);
}
@@ -331,4 +328,43 @@
parentType.setIncludedModuleNames(newIncludedModuleNames);
}
+ public void acceptMethodVisibilityChange(String methodName, int visibility) {
+ RubyElementInfo info = getCurrentTypeInfo();
+ if (!(info instanceof RubyTypeElementInfo)) return;
+ RubyTypeElementInfo parentType = (RubyTypeElementInfo) info;
+
+ IMethod[] methods = parentType.getMethods();
+ for (int i = 0; i < methods.length; i++) {
+ RubyMethod method = (RubyMethod) methods[i];
+ if (!method.getElementName().equals(methodName)) continue;;
+ try {
+ RubyMethodElementInfo methodInfo = (RubyMethodElementInfo) method.getElementInfo();
+ methodInfo.setVisibility(visibility);
+ return;
+ } catch (RubyModelException e) {
+ RubyCore.log(e);
+ }
+ }
+ }
+
+ public void acceptModuleFunction(String methodName) {
+ RubyElementInfo info = getCurrentTypeInfo();
+ if (!(info instanceof RubyTypeElementInfo)) return;
+ RubyTypeElementInfo parentType = (RubyTypeElementInfo) info;
+
+ IMethod[] methods = parentType.getMethods();
+ for (int i = 0; i < methods.length; i++) {
+ RubyMethod method = (RubyMethod) methods[i];
+ if (!method.getElementName().equals(methodName)) continue;
+ try {
+ RubyMethodElementInfo methodInfo = (RubyMethodElementInfo) method.getElementInfo();
+ methodInfo.setIsSingleton(true);
+ return;
+ } catch (RubyModelException e) {
+ RubyCore.log(e);
+ }
+ }
+
+ }
+
}
\ No newline at end of file
Deleted: trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/RubySingletonMethod.java
===================================================================
--- trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/RubySingletonMethod.java 2007-05-14 17:58:42 UTC (rev 2473)
+++ trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/RubySingletonMethod.java 2007-05-14 19:15:03 UTC (rev 2474)
@@ -1,47 +0,0 @@
-/*
- * Created on Jul 10, 2005
- *
- * TODO To change the template for this generated file go to
- * Window - Preferences - Java - Code Style - Code Templates
- */
-package org.rubypeople.rdt.internal.core;
-
-/**
- * RubySingletonMethod represents a singleton method in ruby. Example:
- * [code]
- * class A
- * def self.method1
- * end
- *
- * def A.method2
- * end
- *
- * class << self
- * def method3
- * end
- * end
- * end
- * [/code]
- *
- * @author zdennis
- */
-public class RubySingletonMethod extends RubyMethod {
-
- /**
- * @param parent
- * @param name
- * @param parameterNames
- */
- public RubySingletonMethod(RubyElement parent, String name, String[] parameterNames) {
- super(parent, name, parameterNames);
- }
-
- public boolean isSingleton() {
- return true;
- }
-
- public String getElementName() {
- return parent.getElementName() + "." + this.name;
- }
-
-}
Modified: trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/RubyTypeElementInfo.java
===================================================================
--- trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/RubyTypeElementInfo.java 2007-05-14 17:58:42 UTC (rev 2473)
+++ trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/RubyTypeElementInfo.java 2007-05-14 19:15:03 UTC (rev 2474)
@@ -195,19 +195,20 @@
* @see IType
*/
public IMethod[] getMethods() {
- RubyMethod[] methodHandles = getMethodHandles();
- int length = methodHandles.length;
- IMethod[] methods = new IMethod[length];
- int methodIndex = 0;
- for (int i = 0; i < length; i++) {
- try {
- IMethod method = (IMethod) methodHandles[i].getElementInfo();
- methods[methodIndex++] = method;
- } catch (RubyModelException e) {
- // ignore
- }
- }
- return methods;
+ return getMethodHandles();
+// RubyMethod[] methodHandles = getMethodHandles();
+// int length = methodHandles.length;
+// IMethod[] methods = new IMethod[length];
+// int methodIndex = 0;
+// for (int i = 0; i < length; i++) {
+// try {
+// IMethod method = (IMethod) methodHandles[i].getElementInfo();
+// methods[methodIndex++] = method;
+// } catch (RubyModelException e) {
+// // ignore
+// }
+// }
+// return methods;
}
public RubyMethod[] getMethodHandles() {
Modified: trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/SourceParser.java
===================================================================
--- trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/SourceParser.java 2007-05-14 17:58:42 UTC (rev 2473)
+++ trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/SourceParser.java 2007-05-14 19:15:03 UTC (rev 2474)
@@ -24,6 +24,7 @@
*/
package org.rubypeople.rdt.internal.core;
+import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
@@ -31,6 +32,7 @@
import org.jruby.ast.AliasNode;
import org.jruby.ast.ArrayNode;
import org.jruby.ast.AssignableNode;
+import org.jruby.ast.CallNode;
import org.jruby.ast.ClassNode;
import org.jruby.ast.ClassVarAsgnNode;
import org.jruby.ast.Colon2Node;
@@ -42,6 +44,7 @@
import org.jruby.ast.DefsNode;
import org.jruby.ast.FCallNode;
import org.jruby.ast.GlobalAsgnNode;
+import org.jruby.ast.IArgumentNode;
import org.jruby.ast.InstAsgnNode;
import org.jruby.ast.IterNode;
import org.jruby.ast.LocalAsgnNode;
@@ -70,6 +73,7 @@
*/
public class SourceParser extends InOrderVisitor { // TODO Rename to SourceElementParser
+ private static final String MODULE_FUNCTION = "module_function";
private static final String EMPTY_STRING = "";
private static final String PROTECTED = "protected";
private static final String PRIVATE = "private";
@@ -85,6 +89,7 @@
private Visibility currentVisibility = Visibility.PUBLIC;
private boolean inSingletonClass;
public ISourceElementRequestor requestor;
+ private boolean inModuleFunction;
/**
*
@@ -148,6 +153,7 @@
Instruction ins = super.visitModuleNode(iVisited);
requestor.exitType(iVisited.getPosition().getEndOffset() - 1);
+ inModuleFunction = false;
return ins;
}
@@ -165,7 +171,7 @@
} else {
methodInfo.isConstructor = false;
}
- methodInfo.isClassLevel = inSingletonClass;
+ methodInfo.isClassLevel = inSingletonClass || inModuleFunction;
methodInfo.visibility = convertVisibility(visibility);
methodInfo.parameterNames = ASTUtil.getArgs(iVisited.getArgsNode(), iVisited.getScope());
@@ -342,11 +348,31 @@
}
public Instruction visitFCallNode(FCallNode iVisited) {
- String functionName = iVisited.getName();
- if (functionName.equals(REQUIRE) || functionName.equals(LOAD)) {
+ String name = iVisited.getName();
+ if (name.equals(REQUIRE) || name.equals(LOAD)) {
addImport(iVisited);
- } else if (functionName.equals(INCLUDE)) { // Collect included mixins
+ } else if (name.equals(INCLUDE)) { // Collect included mixins
includeModule(iVisited);
+ } if (name.equals(PUBLIC)) {
+ List<String> arguments = getArgumentsFromFunctionCall(iVisited);
+ for (String methodName : arguments) {
+ requestor.acceptMethodVisibilityChange(methodName, convertVisibility(Visibility.PUBLIC));
+ }
+ } else if (name.equals(PRIVATE)) {
+ List<String> arguments = getArgumentsFromFunctionCall(iVisited);
+ for (String methodName : arguments) {
+ requestor.acceptMethodVisibilityChange(methodName, convertVisibility(Visibility.PRIVATE));
+ }
+ } else if (name.equals(PROTECTED)) {
+ List<String> arguments = getArgumentsFromFunctionCall(iVisited);
+ for (String methodName : arguments) {
+ requestor.acceptMethodVisibilityChange(methodName, convertVisibility(Visibility.PROTECTED));
+ }
+ } else if (name.equals(MODULE_FUNCTION)) {
+ List<String> arguments = getArgumentsFromFunctionCall(iVisited);
+ for (String methodName : arguments) {
+ requestor.acceptModuleFunction(methodName);
+ }
}
return super.visitFCallNode(iVisited);
}
@@ -417,10 +443,57 @@
currentVisibility = Visibility.PRIVATE;
} else if (functionName.equals(PROTECTED)) {
currentVisibility = Visibility.PROTECTED;
+ } else if (functionName.equals(MODULE_FUNCTION)) {
+ inModuleFunction = true;
}
return super.visitVCallNode(iVisited);
}
+ @Override
+ public Instruction visitCallNode(CallNode iVisited) {
+ String name = iVisited.getName();
+ if (name.equals(PUBLIC)) {
+ List<String> arguments = getArgumentsFromFunctionCall(iVisited);
+ for (String methodName : arguments) {
+ requestor.acceptMethodVisibilityChange(methodName, convertVisibility(Visibility.PUBLIC));
+ }
+ } else if (name.equals(PRIVATE)) {
+ List<String> arguments = getArgumentsFromFunctionCall(iVisited);
+ for (String methodName : arguments) {
+ requestor.acceptMethodVisibilityChange(methodName, convertVisibility(Visibility.PRIVATE));
+ }
+ } else if (name.equals(PROTECTED)) {
+ List<String> arguments = getArgumentsFromFunctionCall(iVisited);
+ for (String methodName : arguments) {
+ requestor.acceptMethodVisibilityChange(methodName, convertVisibility(Visibility.PROTECTED));
+ }
+ } else if (name.equals(MODULE_FUNCTION)) {
+ List<String> arguments = getArgumentsFromFunctionCall(iVisited);
+ for (String methodName : arguments) {
+ requestor.acceptModuleFunction(methodName);
+ }
+ }
+ return super.visitCallNode(iVisited);
+ }
+
+ private List<String> getArgumentsFromFunctionCall(IArgumentNode iVisited) {
+ List<String> arguments = new ArrayList<String>();
+ Node argsNode = iVisited.getArgsNode();
+ Iterator iter = null;
+ if (argsNode instanceof SplatNode) {
+ SplatNode splat = (SplatNode) argsNode;
+ iter = splat.childNodes().iterator();
+ } else if (argsNode instanceof ArrayNode) {
+ ArrayNode arrayNode = (ArrayNode) iVisited.getArgsNode();
+ iter = arrayNode.childNodes().iterator();
+ }
+ for (; iter.hasNext();) {
+ Node mixinNameNode = (Node) iter.next();
+ arguments.add(ASTUtil.getNameReflectively(mixinNameNode));
+ }
+ return arguments;
+ }
+
public Instruction visitAliasNode(AliasNode iVisited) {
String name = iVisited.getNewName();
MethodInfo method = new MethodInfo();
Modified: trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/search/indexing/SourceIndexerRequestor.java
===================================================================
--- trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/search/indexing/SourceIndexerRequestor.java 2007-05-14 17:58:42 UTC (rev 2473)
+++ trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/search/indexing/SourceIndexerRequestor.java 2007-05-14 19:15:03 UTC (rev 2474)
@@ -118,4 +118,14 @@
typeStack.pop();
}
+ public void acceptMethodVisibilityChange(String methodName, int visibility) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void acceptModuleFunction(String function) {
+ // TODO Auto-generated method stub
+
+ }
+
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|