|
From: <caw...@us...> - 2007-03-12 20:12:40
|
Revision: 2139
http://svn.sourceforge.net/rubyeclipse/?rev=2139&view=rev
Author: cawilliams
Date: 2007-03-12 13:12:36 -0700 (Mon, 12 Mar 2007)
Log Message:
-----------
use memento tokens to save and re-create open external ruby scripts.
Now when we open an "external" script which is on laodpath we use a special editor input which allows us to do outline and other things on it.
Also, when the file is still open and user closes workspace, it will save tokens to be able to re-create the portion of the model necessary for that script.
Finally, we can take those tokens and re-create the actual model objects from it. Yeah!
Modified Paths:
--------------
trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/core/IRubyElement.java
trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/core/ISourceFolderRoot.java
trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/core/RubyCore.java
trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/codeassist/CompletionEngine.java
trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/ExternalSourceFolder.java
trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/ImportContainer.java
trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/Member.java
trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/RubyElement.java
trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/RubyImport.java
trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/RubyModel.java
trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/RubyProject.java
trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/RubyScript.java
trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/RubyType.java
trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/SourceFolder.java
trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/SourceFolderRoot.java
trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/SourceRefElement.java
trunk/org.rubypeople.rdt.ui/plugin.xml
trunk/org.rubypeople.rdt.ui/src/org/rubypeople/rdt/internal/ui/rubyeditor/RubyScriptEditorInput.java
Added Paths:
-----------
trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/util/MementoTokenizer.java
trunk/org.rubypeople.rdt.ui/src/org/rubypeople/rdt/internal/ui/rubyeditor/RubyScriptEditorInputFactory.java
Modified: trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/core/IRubyElement.java
===================================================================
--- trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/core/IRubyElement.java 2007-03-12 19:30:56 UTC (rev 2138)
+++ trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/core/IRubyElement.java 2007-03-12 20:12:36 UTC (rev 2139)
@@ -252,4 +252,6 @@
// TODO (philippe) predicate shouldn't throw an exception
boolean isStructureKnown() throws RubyModelException;
+ public String getHandleIdentifier();
+
}
\ No newline at end of file
Modified: trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/core/ISourceFolderRoot.java
===================================================================
--- trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/core/ISourceFolderRoot.java 2007-03-12 19:30:56 UTC (rev 2138)
+++ trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/core/ISourceFolderRoot.java 2007-03-12 20:12:36 UTC (rev 2139)
@@ -3,7 +3,13 @@
import org.eclipse.core.runtime.IProgressMonitor;
public interface ISourceFolderRoot extends IParent, IRubyElement, IOpenable {
+
/**
+ * Empty root path
+ */
+ String DEFAULT_PACKAGEROOT_PATH = ""; //$NON-NLS-1$
+
+ /**
* Returns whether this package fragment root is external
* to the workbench (that is, a local file), and has no
* underlying resource.
Modified: trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/core/RubyCore.java
===================================================================
--- trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/core/RubyCore.java 2007-03-12 19:30:56 UTC (rev 2138)
+++ trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/core/RubyCore.java 2007-03-12 20:12:36 UTC (rev 2139)
@@ -43,6 +43,7 @@
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.rubypeople.rdt.internal.core.BatchOperation;
+import org.rubypeople.rdt.internal.core.DefaultWorkingCopyOwner;
import org.rubypeople.rdt.internal.core.LoadpathAttribute;
import org.rubypeople.rdt.internal.core.LoadpathEntry;
import org.rubypeople.rdt.internal.core.RubyCorePreferenceInitializer;
@@ -58,6 +59,7 @@
import org.rubypeople.rdt.internal.core.search.ExperimentalIndex;
import org.rubypeople.rdt.internal.core.symbols.ISymbolFinder;
import org.rubypeople.rdt.internal.core.symbols.SymbolIndex;
+import org.rubypeople.rdt.internal.core.util.MementoTokenizer;
import org.rubypeople.rdt.internal.core.util.Util;
public class RubyCore extends Plugin {
@@ -1370,4 +1372,39 @@
return newContainerEntry(path, LoadpathEntry.NO_EXTRA_ATTRIBUTES, isExported);
}
+ /**
+ * Returns the Ruby model element corresponding to the given handle identifier
+ * generated by <code>IRubyElement.getHandleIdentifier()</code>, or
+ * <code>null</code> if unable to create the associated element.
+ *
+ * @param handleIdentifier the given handle identifier
+ * @return the Ruby element corresponding to the handle identifier
+ */
+ public static IRubyElement create(String handleIdentifier) {
+ return create(handleIdentifier, DefaultWorkingCopyOwner.PRIMARY);
+ }
+
+ /**
+ * Returns the Ruby model element corresponding to the given handle identifier
+ * generated by <code>IRubyElement.getHandleIdentifier()</code>, or
+ * <code>null</code> if unable to create the associated element.
+ * If the returned Ruby element is an <code>ICompilationUnit</code>, its owner
+ * is the given owner if such a working copy exists, otherwise the compilation unit
+ * is a primary compilation unit.
+ *
+ * @param handleIdentifier the given handle identifier
+ * @param owner the owner of the returned compilation unit, ignored if the returned
+ * element is not a compilation unit
+ * @return the Ruby element corresponding to the handle identifier
+ * @since 3.0
+ */
+ public static IRubyElement create(String handleIdentifier, WorkingCopyOwner owner) {
+ if (handleIdentifier == null) {
+ return null;
+ }
+ MementoTokenizer memento = new MementoTokenizer(handleIdentifier);
+ RubyModel model = RubyModelManager.getRubyModelManager().getRubyModel();
+ return model.getHandleFromMemento(memento, owner);
+ }
+
}
\ No newline at end of file
Modified: trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/codeassist/CompletionEngine.java
===================================================================
--- trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/codeassist/CompletionEngine.java 2007-03-12 19:30:56 UTC (rev 2138)
+++ trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/codeassist/CompletionEngine.java 2007-03-12 20:12:36 UTC (rev 2139)
@@ -646,5 +646,10 @@
return false;
}
+ public String getHandleIdentifier() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
}
}
Modified: trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/ExternalSourceFolder.java
===================================================================
--- trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/ExternalSourceFolder.java 2007-03-12 19:30:56 UTC (rev 2138)
+++ trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/ExternalSourceFolder.java 2007-03-12 20:12:36 UTC (rev 2139)
@@ -8,6 +8,8 @@
import org.rubypeople.rdt.core.IRubyElement;
import org.rubypeople.rdt.core.IRubyScript;
import org.rubypeople.rdt.core.RubyModelException;
+import org.rubypeople.rdt.core.WorkingCopyOwner;
+import org.rubypeople.rdt.internal.core.util.MementoTokenizer;
import org.rubypeople.rdt.internal.core.util.Messages;
import org.rubypeople.rdt.internal.core.util.Util;
@@ -62,4 +64,18 @@
}
return new ExternalRubyScript(this, name, DefaultWorkingCopyOwner.PRIMARY);
}
+
+ /*
+ * @see RubyElement
+ */
+ public IRubyElement getHandleFromMemento(String token, MementoTokenizer memento, WorkingCopyOwner owner) {
+ switch (token.charAt(0)) {
+ case JEM_RUBYSCRIPT:
+ if (!memento.hasMoreTokens()) return this;
+ String classFileName = memento.nextToken();
+ RubyElement classFile = new ExternalRubyScript(this, classFileName, owner);
+ return classFile.getHandleFromMemento(memento, owner);
+ }
+ return null;
+ }
}
Modified: trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/ImportContainer.java
===================================================================
--- trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/ImportContainer.java 2007-03-12 19:30:56 UTC (rev 2138)
+++ trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/ImportContainer.java 2007-03-12 20:12:36 UTC (rev 2139)
@@ -12,10 +12,13 @@
import org.rubypeople.rdt.core.IImportContainer;
import org.rubypeople.rdt.core.IImportDeclaration;
+import org.rubypeople.rdt.core.IParent;
import org.rubypeople.rdt.core.IRubyElement;
import org.rubypeople.rdt.core.ISourceRange;
import org.rubypeople.rdt.core.ISourceReference;
import org.rubypeople.rdt.core.RubyModelException;
+import org.rubypeople.rdt.core.WorkingCopyOwner;
+import org.rubypeople.rdt.internal.core.util.MementoTokenizer;
/**
@@ -101,4 +104,29 @@
buffer.append(" (not open)"); //$NON-NLS-1$
}
}
+
+/*
+ * @see RubyElement
+ */
+public IRubyElement getHandleFromMemento(String token, MementoTokenizer memento, WorkingCopyOwner workingCopyOwner) {
+ switch (token.charAt(0)) {
+ case JEM_COUNT:
+ return getHandleUpdatingCountFromMemento(memento, workingCopyOwner);
+ case JEM_IMPORTDECLARATION:
+ if (memento.hasMoreTokens()) {
+ String importName = memento.nextToken();
+ RubyElement importDecl = (RubyElement)getImport(importName);
+ return importDecl.getHandleFromMemento(memento, workingCopyOwner);
+ } else {
+ return this;
+ }
+ }
+ return null;
}
+/**
+ * @see RubyElement#getHandleMemento()
+ */
+protected char getHandleMementoDelimiter() {
+ return RubyElement.JEM_IMPORTDECLARATION;
+}
+}
Modified: trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/Member.java
===================================================================
--- trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/Member.java 2007-03-12 19:30:56 UTC (rev 2138)
+++ trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/Member.java 2007-03-12 20:12:36 UTC (rev 2139)
@@ -12,9 +12,11 @@
import org.rubypeople.rdt.core.IMember;
import org.rubypeople.rdt.core.IRubyElement;
+import org.rubypeople.rdt.core.ISourceRange;
import org.rubypeople.rdt.core.IType;
-import org.rubypeople.rdt.core.ISourceRange;
import org.rubypeople.rdt.core.RubyModelException;
+import org.rubypeople.rdt.core.WorkingCopyOwner;
+import org.rubypeople.rdt.internal.core.util.MementoTokenizer;
/**
* @see IMember
@@ -117,4 +119,66 @@
return;
}
}
+
+ /*
+ * @see RubyElement
+ */
+ public IRubyElement getHandleFromMemento(String token, MementoTokenizer memento, WorkingCopyOwner workingCopyOwner) {
+ switch (token.charAt(0)) {
+ case JEM_COUNT:
+ return getHandleUpdatingCountFromMemento(memento, workingCopyOwner);
+ case JEM_TYPE:
+ String typeName;
+ if (memento.hasMoreTokens()) {
+ typeName = memento.nextToken();
+ char firstChar = typeName.charAt(0);
+ if (firstChar == JEM_FIELD || firstChar == JEM_METHOD || firstChar == JEM_TYPE || firstChar == JEM_COUNT) {
+ token = typeName;
+ typeName = ""; //$NON-NLS-1$
+ } else {
+ token = null;
+ }
+ } else {
+ typeName = ""; //$NON-NLS-1$
+ token = null;
+ }
+ RubyElement type = (RubyElement)getType(typeName, 1);
+ if (token == null) {
+ return type.getHandleFromMemento(memento, workingCopyOwner);
+ } else {
+ return type.getHandleFromMemento(token, memento, workingCopyOwner);
+ }
+// case JEM_LOCALVARIABLE:
+// if (!memento.hasMoreTokens()) return this;
+// String varName = memento.nextToken();
+// if (!memento.hasMoreTokens()) return this;
+// memento.nextToken(); // JEM_COUNT
+// if (!memento.hasMoreTokens()) return this;
+// int declarationStart = Integer.parseInt(memento.nextToken());
+// if (!memento.hasMoreTokens()) return this;
+// memento.nextToken(); // JEM_COUNT
+// if (!memento.hasMoreTokens()) return this;
+// int declarationEnd = Integer.parseInt(memento.nextToken());
+// if (!memento.hasMoreTokens()) return this;
+// memento.nextToken(); // JEM_COUNT
+// if (!memento.hasMoreTokens()) return this;
+// int nameStart = Integer.parseInt(memento.nextToken());
+// if (!memento.hasMoreTokens()) return this;
+// memento.nextToken(); // JEM_COUNT
+// if (!memento.hasMoreTokens()) return this;
+// int nameEnd = Integer.parseInt(memento.nextToken());
+// if (!memento.hasMoreTokens()) return this;
+// memento.nextToken(); // JEM_COUNT
+// if (!memento.hasMoreTokens()) return this;
+// String typeSignature = memento.nextToken();
+// return new LocalVariable(this, varName, declarationStart, declarationEnd, nameStart, nameEnd, typeSignature);
+ }
+ return null;
+ }
+ /**
+ * @see JavaElement#getHandleMemento()
+ */
+ protected char getHandleMementoDelimiter() {
+ return RubyElement.JEM_TYPE;
+ }
}
Modified: trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/RubyElement.java
===================================================================
--- trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/RubyElement.java 2007-03-12 19:30:56 UTC (rev 2138)
+++ trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/RubyElement.java 2007-03-12 20:12:36 UTC (rev 2139)
@@ -43,6 +43,8 @@
import org.rubypeople.rdt.core.ISourceRange;
import org.rubypeople.rdt.core.ISourceReference;
import org.rubypeople.rdt.core.RubyModelException;
+import org.rubypeople.rdt.core.WorkingCopyOwner;
+import org.rubypeople.rdt.internal.core.util.MementoTokenizer;
import org.rubypeople.rdt.internal.core.util.Util;
/**
@@ -51,6 +53,18 @@
*/
public abstract class RubyElement extends PlatformObject implements IRubyElement {
+ public static final char JEM_ESCAPE = '\\';
+ public static final char JEM_RUBYPROJECT = '=';
+ public static final char JEM_SOURCEFOLDERROOT = '/';
+ public static final char JEM_SOURCE_FOLDER = '<';
+ public static final char JEM_FIELD = '^';
+ public static final char JEM_METHOD = '~';
+ public static final char JEM_RUBYSCRIPT = '{';
+ public static final char JEM_TYPE = '[';
+ public static final char JEM_IMPORTDECLARATION = '#';
+ public static final char JEM_COUNT = '!';
+ public static final char JEM_LOCALVARIABLE = '@';
+
public static final IRubyElement[] NO_ELEMENTS = new IRubyElement[0];
protected static final Object NO_INFO = new Object();
@@ -529,4 +543,65 @@
public Node findNode(Node cuAST) {
return null; // works only inside a ruby script
}
+
+ /*
+ * Creates a Ruby element handle from the given memento.
+ * The given token is the current delimiter indicating the type of the next token(s).
+ * The given working copy owner is used only for ruby script handles.
+ */
+ public abstract IRubyElement getHandleFromMemento(String token, MementoTokenizer memento, WorkingCopyOwner owner);
+ /*
+ * Creates a Ruby element handle from the given memento.
+ * The given working copy owner is used only for ruby script handles.
+ */
+ public IRubyElement getHandleFromMemento(MementoTokenizer memento, WorkingCopyOwner owner) {
+ if (!memento.hasMoreTokens()) return this;
+ String token = memento.nextToken();
+ return getHandleFromMemento(token, memento, owner);
+ }
+ /**
+ * @see IJavaElement
+ */
+ public String getHandleIdentifier() {
+ return getHandleMemento();
+ }
+ /**
+ * @see JavaElement#getHandleMemento()
+ */
+ public String getHandleMemento(){
+ StringBuffer buff = new StringBuffer();
+ getHandleMemento(buff);
+ return buff.toString();
+ }
+ protected void getHandleMemento(StringBuffer buff) {
+ ((RubyElement)getParent()).getHandleMemento(buff);
+ buff.append(getHandleMementoDelimiter());
+ escapeMementoName(buff, getElementName());
+ }
+ /**
+ * Returns the <code>char</code> that marks the start of this handles
+ * contribution to a memento.
+ */
+ protected abstract char getHandleMementoDelimiter();
+
+ protected void escapeMementoName(StringBuffer buffer, String mementoName) {
+ for (int i = 0, length = mementoName.length(); i < length; i++) {
+ char character = mementoName.charAt(i);
+ switch (character) {
+ case JEM_ESCAPE:
+ case JEM_COUNT:
+ case JEM_RUBYPROJECT:
+ case JEM_SOURCEFOLDERROOT:
+ case JEM_SOURCE_FOLDER:
+ case JEM_FIELD:
+ case JEM_METHOD:
+ case JEM_RUBYSCRIPT:
+ case JEM_TYPE:
+ case JEM_IMPORTDECLARATION:
+ case JEM_LOCALVARIABLE:
+ buffer.append(JEM_ESCAPE);
+ }
+ buffer.append(character);
+ }
+ }
}
Modified: trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/RubyImport.java
===================================================================
--- trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/RubyImport.java 2007-03-12 19:30:56 UTC (rev 2138)
+++ trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/RubyImport.java 2007-03-12 20:12:36 UTC (rev 2139)
@@ -24,6 +24,7 @@
*/
package org.rubypeople.rdt.internal.core;
+import org.eclipse.core.runtime.Assert;
import org.rubypeople.rdt.core.IImportDeclaration;
import org.rubypeople.rdt.core.IRubyElement;
@@ -60,5 +61,26 @@
public String getElementName() {
return this.name;
}
+
+ /**
+ * @see RubyElement#getHandleMemento(StringBuffer)
+ * For import declarations, the handle delimiter is associated to the import container already
+ */
+ protected void getHandleMemento(StringBuffer buff) {
+ ((RubyElement)getParent()).getHandleMemento(buff);
+ escapeMementoName(buff, getElementName());
+ if (this.occurrenceCount > 1) {
+ buff.append(JEM_COUNT);
+ buff.append(this.occurrenceCount);
+ }
+ }
+ /**
+ * @see RubyElement#getHandleMemento()
+ */
+ protected char getHandleMementoDelimiter() {
+ // For import declarations, the handle delimiter is associated to the import container already
+ Assert.isTrue(false, "Should not be called"); //$NON-NLS-1$
+ return 0;
+ }
}
Modified: trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/RubyModel.java
===================================================================
--- trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/RubyModel.java 2007-03-12 19:30:56 UTC (rev 2138)
+++ trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/RubyModel.java 2007-03-12 20:12:36 UTC (rev 2139)
@@ -16,6 +16,7 @@
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
@@ -24,6 +25,8 @@
import org.rubypeople.rdt.core.IRubyModel;
import org.rubypeople.rdt.core.IRubyProject;
import org.rubypeople.rdt.core.RubyModelException;
+import org.rubypeople.rdt.core.WorkingCopyOwner;
+import org.rubypeople.rdt.internal.core.util.MementoTokenizer;
import org.rubypeople.rdt.internal.core.util.Messages;
/**
@@ -256,4 +259,32 @@
return null;
}
+/*
+ * @see RubyElement
+ */
+public IRubyElement getHandleFromMemento(String token, MementoTokenizer memento, WorkingCopyOwner owner) {
+ switch (token.charAt(0)) {
+ case JEM_RUBYPROJECT:
+ if (!memento.hasMoreTokens()) return this;
+ String projectName = memento.nextToken();
+ RubyElement project = (RubyElement)getRubyProject(projectName);
+ return project.getHandleFromMemento(memento, owner);
+ }
+ return null;
}
+/**
+ * @see RubyElement#getHandleMemento(StringBuffer)
+ */
+protected void getHandleMemento(StringBuffer buff) {
+ buff.append(getElementName());
+}
+/**
+ * Returns the <code>char</code> that marks the start of this handles
+ * contribution to a memento.
+ */
+protected char getHandleMementoDelimiter(){
+ Assert.isTrue(false, "Should not be called"); //$NON-NLS-1$
+ return 0;
+}
+
+}
Modified: trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/RubyProject.java
===================================================================
--- trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/RubyProject.java 2007-03-12 19:30:56 UTC (rev 2138)
+++ trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/RubyProject.java 2007-03-12 20:12:36 UTC (rev 2139)
@@ -57,8 +57,10 @@
import org.rubypeople.rdt.core.IType;
import org.rubypeople.rdt.core.RubyCore;
import org.rubypeople.rdt.core.RubyModelException;
+import org.rubypeople.rdt.core.WorkingCopyOwner;
import org.rubypeople.rdt.internal.compiler.CategorizedProblem;
import org.rubypeople.rdt.internal.compiler.util.ObjectVector;
+import org.rubypeople.rdt.internal.core.util.MementoTokenizer;
import org.rubypeople.rdt.internal.core.util.Messages;
import org.rubypeople.rdt.internal.core.util.Util;
import org.w3c.dom.Element;
@@ -2408,4 +2410,44 @@
return getAllSourceFolderRoots(null /*no reverse map*/);
}
+
+ /*
+ * @see RubyElement
+ */
+ public IRubyElement getHandleFromMemento(String token, MementoTokenizer memento, WorkingCopyOwner owner) {
+ switch (token.charAt(0)) {
+ case JEM_SOURCEFOLDERROOT:
+ String rootPath = ISourceFolderRoot.DEFAULT_PACKAGEROOT_PATH;
+ token = null;
+ while (memento.hasMoreTokens()) {
+ token = memento.nextToken();
+ char firstChar = token.charAt(0);
+ if (firstChar != JEM_SOURCE_FOLDER && firstChar != JEM_COUNT) {
+ rootPath += token;
+ } else {
+ break;
+ }
+ }
+ IPath path = new Path(rootPath);
+ RubyElement root;
+ if(path.isAbsolute()) {
+ root = (RubyElement) getPackageFragmentRoot0(path);
+ } else
+ root = (RubyElement)getSourceFolderRoot(path);
+ if (token != null && token.charAt(0) == JEM_SOURCE_FOLDER) {
+ return root.getHandleFromMemento(token, memento, owner);
+ } else {
+ return root.getHandleFromMemento(memento, owner);
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Returns the <code>char</code> that marks the start of this handles
+ * contribution to a memento.
+ */
+ protected char getHandleMementoDelimiter() {
+ return JEM_RUBYPROJECT;
+ }
}
Modified: trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/RubyScript.java
===================================================================
--- trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/RubyScript.java 2007-03-12 19:30:56 UTC (rev 2138)
+++ trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/RubyScript.java 2007-03-12 20:12:36 UTC (rev 2139)
@@ -58,6 +58,7 @@
import org.rubypeople.rdt.internal.codeassist.CompletionEngine;
import org.rubypeople.rdt.internal.core.buffer.BufferManager;
import org.rubypeople.rdt.internal.core.parser.RubyParser;
+import org.rubypeople.rdt.internal.core.util.MementoTokenizer;
import org.rubypeople.rdt.internal.core.util.Util;
@@ -644,4 +645,28 @@
CompletionEngine engine = new CompletionEngine(requestor);
engine.complete(this, offset);
}
+
+ /*
+ * @see RubyElement
+ */
+ public IRubyElement getHandleFromMemento(String token, MementoTokenizer memento, WorkingCopyOwner workingCopyOwner) {
+ switch (token.charAt(0)) {
+ case JEM_IMPORTDECLARATION:
+ RubyElement container = (RubyElement)getImportContainer();
+ return container.getHandleFromMemento(token, memento, workingCopyOwner);
+ case JEM_TYPE:
+ if (!memento.hasMoreTokens()) return this;
+ String typeName = memento.nextToken();
+ RubyElement type = (RubyElement)getType(typeName);
+ return type.getHandleFromMemento(memento, workingCopyOwner);
+ }
+ return null;
+ }
+
+ /**
+ * @see RubyElement#getHandleMementoDelimiter()
+ */
+ protected char getHandleMementoDelimiter() {
+ return RubyElement.JEM_RUBYSCRIPT;
+ }
}
Modified: trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/RubyType.java
===================================================================
--- trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/RubyType.java 2007-03-12 19:30:56 UTC (rev 2138)
+++ trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/RubyType.java 2007-03-12 20:12:36 UTC (rev 2139)
@@ -36,6 +36,8 @@
import org.rubypeople.rdt.core.ISourceFolder;
import org.rubypeople.rdt.core.IType;
import org.rubypeople.rdt.core.RubyModelException;
+import org.rubypeople.rdt.core.WorkingCopyOwner;
+import org.rubypeople.rdt.internal.core.util.MementoTokenizer;
/**
* @author Chris
@@ -212,5 +214,71 @@
}
return getElementName();
}
+
+ /*
+ * @see RubyElement
+ */
+ public IRubyElement getHandleFromMemento(String token, MementoTokenizer memento, WorkingCopyOwner workingCopyOwner) {
+ switch (token.charAt(0)) {
+ case JEM_COUNT:
+ return getHandleUpdatingCountFromMemento(memento, workingCopyOwner);
+ case JEM_FIELD:
+ if (!memento.hasMoreTokens()) return this;
+ String fieldName = memento.nextToken();
+ RubyElement field = (RubyElement)getField(fieldName);
+ return field.getHandleFromMemento(memento, workingCopyOwner);
+ case JEM_METHOD:
+ if (!memento.hasMoreTokens()) return this;
+ String selector = memento.nextToken();
+ ArrayList params = new ArrayList();
+ nextParam: while (memento.hasMoreTokens()) {
+ token = memento.nextToken();
+ switch (token.charAt(0)) {
+ case JEM_TYPE:
+ break nextParam;
+ case JEM_METHOD:
+ if (!memento.hasMoreTokens()) return this;
+ String param = memento.nextToken();
+ StringBuffer buffer = new StringBuffer();
+ params.add(buffer.toString() + param);
+ break;
+ default:
+ break nextParam;
+ }
+ }
+ String[] parameters = new String[params.size()];
+ params.toArray(parameters);
+ RubyElement method = (RubyElement)getMethod(selector, parameters);
+ switch (token.charAt(0)) {
+ case JEM_TYPE:
+ case JEM_LOCALVARIABLE:
+ return method.getHandleFromMemento(token, memento, workingCopyOwner);
+ default:
+ return method;
+ }
+ case JEM_TYPE:
+ String typeName;
+ if (memento.hasMoreTokens()) {
+ typeName = memento.nextToken();
+ char firstChar = typeName.charAt(0);
+ if (firstChar == JEM_FIELD || firstChar == JEM_METHOD || firstChar == JEM_TYPE || firstChar == JEM_COUNT) {
+ token = typeName;
+ typeName = ""; //$NON-NLS-1$
+ } else {
+ token = null;
+ }
+ } else {
+ typeName = ""; //$NON-NLS-1$
+ token = null;
+ }
+ RubyElement type = (RubyElement)getType(typeName);
+ if (token == null) {
+ return type.getHandleFromMemento(memento, workingCopyOwner);
+ } else {
+ return type.getHandleFromMemento(token, memento, workingCopyOwner);
+ }
+ }
+ return null;
+ }
}
\ No newline at end of file
Modified: trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/SourceFolder.java
===================================================================
--- trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/SourceFolder.java 2007-03-12 19:30:56 UTC (rev 2138)
+++ trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/SourceFolder.java 2007-03-12 20:12:36 UTC (rev 2139)
@@ -17,6 +17,7 @@
import org.rubypeople.rdt.core.ISourceFolder;
import org.rubypeople.rdt.core.RubyModelException;
import org.rubypeople.rdt.core.WorkingCopyOwner;
+import org.rubypeople.rdt.internal.core.util.MementoTokenizer;
import org.rubypeople.rdt.internal.core.util.Messages;
import org.rubypeople.rdt.internal.core.util.Util;
@@ -221,5 +222,25 @@
}
return new RubyScript(this, name, DefaultWorkingCopyOwner.PRIMARY);
}
+
+ /*
+ * @see RubyElement
+ */
+ public IRubyElement getHandleFromMemento(String token, MementoTokenizer memento, WorkingCopyOwner owner) {
+ switch (token.charAt(0)) {
+ case JEM_RUBYSCRIPT:
+ if (!memento.hasMoreTokens()) return this;
+ String cuName = memento.nextToken();
+ RubyElement cu = new RubyScript(this, cuName, owner);
+ return cu.getHandleFromMemento(memento, owner);
+ }
+ return null;
+ }
+ /**
+ * @see RubyElement#getHandleMementoDelimiter()
+ */
+ protected char getHandleMementoDelimiter() {
+ return RubyElement.JEM_SOURCE_FOLDER;
+ }
}
Modified: trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/SourceFolderRoot.java
===================================================================
--- trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/SourceFolderRoot.java 2007-03-12 19:30:56 UTC (rev 2138)
+++ trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/SourceFolderRoot.java 2007-03-12 20:12:36 UTC (rev 2139)
@@ -18,7 +18,9 @@
import org.rubypeople.rdt.core.ISourceFolder;
import org.rubypeople.rdt.core.ISourceFolderRoot;
import org.rubypeople.rdt.core.RubyModelException;
+import org.rubypeople.rdt.core.WorkingCopyOwner;
import org.rubypeople.rdt.internal.core.util.CharOperation;
+import org.rubypeople.rdt.internal.core.util.MementoTokenizer;
import org.rubypeople.rdt.internal.core.util.Util;
public class SourceFolderRoot extends Openable implements ISourceFolderRoot {
@@ -278,4 +280,61 @@
String[] names = Util.getTrimmedSimpleNames(packName);
return getSourceFolder(names);
}
+
+ /**
+ * @see RubyElement#getHandleMemento()
+ */
+ protected char getHandleMementoDelimiter() {
+ return RubyElement.JEM_SOURCEFOLDERROOT;
+ }
+ /*
+ * @see RubyElement
+ */
+ public IRubyElement getHandleFromMemento(String token, MementoTokenizer memento, WorkingCopyOwner owner) {
+ switch (token.charAt(0)) {
+ case JEM_SOURCE_FOLDER:
+ String pkgName;
+ if (memento.hasMoreTokens()) {
+ pkgName = memento.nextToken();
+ char firstChar = pkgName.charAt(0);
+ if (firstChar == JEM_RUBYSCRIPT || firstChar == JEM_COUNT) {
+ token = pkgName;
+ pkgName = ISourceFolder.DEFAULT_PACKAGE_NAME;
+ } else {
+ token = null;
+ }
+ } else {
+ pkgName = ISourceFolder.DEFAULT_PACKAGE_NAME;
+ token = null;
+ }
+ RubyElement pkg = (RubyElement)getSourceFolder(pkgName);
+ if (token == null) {
+ return pkg.getHandleFromMemento(memento, owner);
+ } else {
+ return pkg.getHandleFromMemento(token, memento, owner);
+ }
+ }
+ return null;
+ }
+ /**
+ * @see RubyElement#getHandleMemento(StringBuffer)
+ */
+ protected void getHandleMemento(StringBuffer buff) {
+ IPath path;
+ IResource underlyingResource = getResource();
+ if (underlyingResource != null) {
+ // internal jar or regular root
+ if (getResource().getProject().equals(getRubyProject().getProject())) {
+ path = underlyingResource.getProjectRelativePath();
+ } else {
+ path = underlyingResource.getFullPath();
+ }
+ } else {
+ // external jar
+ path = getPath();
+ }
+ ((RubyElement)getParent()).getHandleMemento(buff);
+ buff.append(getHandleMementoDelimiter());
+ escapeMementoName(buff, path.toString());
+ }
}
Modified: trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/SourceRefElement.java
===================================================================
--- trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/SourceRefElement.java 2007-03-12 19:30:56 UTC (rev 2138)
+++ trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/SourceRefElement.java 2007-03-12 20:12:36 UTC (rev 2139)
@@ -17,7 +17,9 @@
import org.rubypeople.rdt.core.ISourceRange;
import org.rubypeople.rdt.core.ISourceReference;
import org.rubypeople.rdt.core.RubyModelException;
+import org.rubypeople.rdt.core.WorkingCopyOwner;
import org.rubypeople.rdt.internal.core.util.DOMFinder;
+import org.rubypeople.rdt.internal.core.util.MementoTokenizer;
/**
* @author cawilliams
@@ -173,5 +175,35 @@
if (!(o instanceof SourceRefElement)) return false;
return this.occurrenceCount == ((SourceRefElement) o).occurrenceCount && super.equals(o);
}
+
+ /*
+ * Update the occurence count of the receiver and creates a Ruby element handle from the given memento.
+ * The given working copy owner is used only for compilation unit handles.
+ */
+ public IRubyElement getHandleUpdatingCountFromMemento(MementoTokenizer memento, WorkingCopyOwner owner) {
+ if (!memento.hasMoreTokens()) return this;
+ this.occurrenceCount = Integer.parseInt(memento.nextToken());
+ if (!memento.hasMoreTokens()) return this;
+ String token = memento.nextToken();
+ return getHandleFromMemento(token, memento, owner);
+ }
+
+ /*
+ * @see RubyElement
+ */
+ public IRubyElement getHandleFromMemento(String token, MementoTokenizer memento, WorkingCopyOwner workingCopyOwner) {
+ switch (token.charAt(0)) {
+ case JEM_COUNT:
+ return getHandleUpdatingCountFromMemento(memento, workingCopyOwner);
+ }
+ return this;
+ }
+ protected void getHandleMemento(StringBuffer buff) {
+ super.getHandleMemento(buff);
+ if (this.occurrenceCount > 1) {
+ buff.append(JEM_COUNT);
+ buff.append(this.occurrenceCount);
+ }
+ }
}
Added: trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/util/MementoTokenizer.java
===================================================================
--- trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/util/MementoTokenizer.java (rev 0)
+++ trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/core/util/MementoTokenizer.java 2007-03-12 20:12:36 UTC (rev 2139)
@@ -0,0 +1,99 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.rubypeople.rdt.internal.core.util;
+
+import org.rubypeople.rdt.internal.core.RubyElement;
+
+public class MementoTokenizer {
+ private static final String COUNT = Character.toString(RubyElement.JEM_COUNT);
+ private static final String JAVAPROJECT = Character.toString(RubyElement.JEM_RUBYPROJECT);
+ private static final String PACKAGEFRAGMENTROOT = Character.toString(RubyElement.JEM_SOURCEFOLDERROOT);
+ private static final String PACKAGEFRAGMENT = Character.toString(RubyElement.JEM_SOURCE_FOLDER);
+ private static final String FIELD = Character.toString(RubyElement.JEM_FIELD);
+ private static final String METHOD = Character.toString(RubyElement.JEM_METHOD);
+ private static final String COMPILATIONUNIT = Character.toString(RubyElement.JEM_RUBYSCRIPT);
+ private static final String TYPE = Character.toString(RubyElement.JEM_TYPE);
+ private static final String IMPORTDECLARATION = Character.toString(RubyElement.JEM_IMPORTDECLARATION);
+ private static final String LOCALVARIABLE = Character.toString(RubyElement.JEM_LOCALVARIABLE);
+
+ private final char[] memento;
+ private final int length;
+ private int index = 0;
+
+ public MementoTokenizer(String memento) {
+ this.memento = memento.toCharArray();
+ this.length = this.memento.length;
+ }
+
+ public boolean hasMoreTokens() {
+ return this.index < this.length;
+ }
+
+ public String nextToken() {
+ int start = this.index;
+ StringBuffer buffer = null;
+ switch (this.memento[this.index++]) {
+ case RubyElement.JEM_ESCAPE:
+ buffer = new StringBuffer();
+ buffer.append(this.memento[this.index]);
+ start = ++this.index;
+ break;
+ case RubyElement.JEM_COUNT:
+ return COUNT;
+ case RubyElement.JEM_RUBYPROJECT:
+ return JAVAPROJECT;
+ case RubyElement.JEM_SOURCEFOLDERROOT:
+ return PACKAGEFRAGMENTROOT;
+ case RubyElement.JEM_SOURCE_FOLDER:
+ return PACKAGEFRAGMENT;
+ case RubyElement.JEM_FIELD:
+ return FIELD;
+ case RubyElement.JEM_METHOD:
+ return METHOD;
+ case RubyElement.JEM_RUBYSCRIPT:
+ return COMPILATIONUNIT;
+ case RubyElement.JEM_TYPE:
+ return TYPE;
+ case RubyElement.JEM_IMPORTDECLARATION:
+ return IMPORTDECLARATION;
+ case RubyElement.JEM_LOCALVARIABLE:
+ return LOCALVARIABLE;
+ }
+ loop: while (this.index < this.length) {
+ switch (this.memento[this.index]) {
+ case RubyElement.JEM_ESCAPE:
+ if (buffer == null) buffer = new StringBuffer();
+ buffer.append(this.memento, start, this.index - start);
+ start = ++this.index;
+ break;
+ case RubyElement.JEM_COUNT:
+ case RubyElement.JEM_RUBYPROJECT:
+ case RubyElement.JEM_SOURCEFOLDERROOT:
+ case RubyElement.JEM_SOURCE_FOLDER:
+ case RubyElement.JEM_FIELD:
+ case RubyElement.JEM_METHOD:
+ case RubyElement.JEM_RUBYSCRIPT:
+ case RubyElement.JEM_TYPE:
+ case RubyElement.JEM_IMPORTDECLARATION:
+ case RubyElement.JEM_LOCALVARIABLE:
+ break loop;
+ }
+ this.index++;
+ }
+ if (buffer != null) {
+ buffer.append(this.memento, start, this.index - start);
+ return buffer.toString();
+ } else {
+ return new String(this.memento, start, this.index - start);
+ }
+ }
+
+}
Modified: trunk/org.rubypeople.rdt.ui/plugin.xml
===================================================================
--- trunk/org.rubypeople.rdt.ui/plugin.xml 2007-03-12 19:30:56 UTC (rev 2138)
+++ trunk/org.rubypeople.rdt.ui/plugin.xml 2007-03-12 20:12:36 UTC (rev 2139)
@@ -367,6 +367,27 @@
class="org.rubypeople.rdt.internal.ui.infoviews.RIView"
id="org.rubypeople.rdt.ui.views.RIView">
</view>
+ <view
+ name="Rails API"
+ icon="icons/full/elcl16/help.gif"
+ category="org.rubypeople.rdt.ui.ruby"
+ class="org.rubypeople.rdt.internal.ui.infoviews.RailsAPIView"
+ id="org.rubypeople.rdt.ui.views.RailsAPIView">
+ </view>
+ <view
+ name="Ruby Core API"
+ icon="icons/full/elcl16/help.gif"
+ category="org.rubypeople.rdt.ui.ruby"
+ class="org.rubypeople.rdt.internal.ui.infoviews.RubyCoreAPIView"
+ id="org.rubypeople.rdt.ui.views.RubyCoreAPIView">
+ </view>
+ <view
+ name="Ruby Standard Library API"
+ icon="icons/full/elcl16/help.gif"
+ category="org.rubypeople.rdt.ui.ruby"
+ class="org.rubypeople.rdt.internal.ui.infoviews.RubyStdLibAPIView"
+ id="org.rubypeople.rdt.ui.views.RubyStdLibAPIView">
+ </view>
</extension>
<extension point="org.eclipse.ui.editors">
<editor
@@ -840,6 +861,9 @@
<factory
id="org.rubypeople.rdt.ui.externalRubyFileEditorInputFactory"
class="org.rubypeople.rdt.internal.ui.rubyeditor.RubyExternalEditorFactory"/>
+ <factory
+ id="org.rubypeople.rdt.ui.RubyScriptEditorInputFactory"
+ class="org.rubypeople.rdt.internal.ui.rubyeditor.RubyScriptEditorInputFactory"/>
</extension>
<extension
Modified: trunk/org.rubypeople.rdt.ui/src/org/rubypeople/rdt/internal/ui/rubyeditor/RubyScriptEditorInput.java
===================================================================
--- trunk/org.rubypeople.rdt.ui/src/org/rubypeople/rdt/internal/ui/rubyeditor/RubyScriptEditorInput.java 2007-03-12 19:30:56 UTC (rev 2138)
+++ trunk/org.rubypeople.rdt.ui/src/org/rubypeople/rdt/internal/ui/rubyeditor/RubyScriptEditorInput.java 2007-03-12 20:12:36 UTC (rev 2139)
@@ -83,10 +83,10 @@
}
public String getFactoryId() {
- return RubyExternalEditorFactory.FACTORY_ID;
+ return RubyScriptEditorInputFactory.ID;
}
public void saveState(IMemento memento) {
- memento.putString(RubyExternalEditorFactory.MEMENTO_ABSOLUTE_PATH_KEY, fScript.getFile().getAbsolutePath()); //$NON-NLS-1$
+ RubyScriptEditorInputFactory.saveState(memento, this);
}
}
Added: trunk/org.rubypeople.rdt.ui/src/org/rubypeople/rdt/internal/ui/rubyeditor/RubyScriptEditorInputFactory.java
===================================================================
--- trunk/org.rubypeople.rdt.ui/src/org/rubypeople/rdt/internal/ui/rubyeditor/RubyScriptEditorInputFactory.java (rev 0)
+++ trunk/org.rubypeople.rdt.ui/src/org/rubypeople/rdt/internal/ui/rubyeditor/RubyScriptEditorInputFactory.java 2007-03-12 20:12:36 UTC (rev 2139)
@@ -0,0 +1,35 @@
+package org.rubypeople.rdt.internal.ui.rubyeditor;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.ui.IElementFactory;
+import org.eclipse.ui.IMemento;
+import org.rubypeople.rdt.core.IRubyElement;
+import org.rubypeople.rdt.core.IRubyScript;
+import org.rubypeople.rdt.core.RubyCore;
+import org.rubypeople.rdt.core.RubyModelException;
+
+public class RubyScriptEditorInputFactory implements IElementFactory {
+
+ public final static String ID= "org.rubypeople.rdt.ui.RubyScriptEditorInputFactory"; //$NON-NLS-1$
+ public final static String KEY= "org.rubypeople.rdt.ui.RubyScriptIdentifier"; //$NON-NLS-1$
+
+ /**
+ * @see IElementFactory#createElement
+ */
+ public IAdaptable createElement(IMemento memento) {
+ String identifier= memento.getString(KEY);
+ if (identifier != null) {
+ IRubyElement element= RubyCore.create(identifier);
+ try {
+ return EditorUtility.getEditorInput(element);
+ } catch (RubyModelException x) {
+ }
+ }
+ return null;
+ }
+
+ public static void saveState(IMemento memento, RubyScriptEditorInput input) {
+ IRubyScript c= input.getRubyScript();
+ memento.putString(KEY, c.getHandleIdentifier());
+ }
+}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|