diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/ICElement.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/ICElement.java
index 9963020c566..ea2348481d5 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/ICElement.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/ICElement.java
@@ -382,7 +382,7 @@ public interface ICElement extends IAdaptable {
* @exception CModelException if this element does not exist or if an
* exception occurs while accessing its resource
*/
- IResource getResource() ;
+ IResource getResource();
/**
* Returns whether this C element is read-only. An element is read-only
* if its structure cannot be modified by the C model.
@@ -417,12 +417,17 @@ public interface ICElement extends IAdaptable {
/**
- * Returns a string representation of this element handle. The format of
- * the string is not specified; however, the identifier is stable across
+ * Returns a string representation of this element handle. The format of the
+ * string is not specified; however, the identifier is stable across
* workspace sessions, and can be used to recreate this handle via the
* CoreModel.create(String)
method.
- *
- * @return the string handle identifier
+ *
+ * Some element types, like binaries, do not support handle identifiers and
+ * return null
.
+ *
null
if the
+ * element type is not supported
* @see CoreModel#create(java.lang.String)
*
* @since 5.0
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Archive.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Archive.java
index 9da6f64580d..0daefa700d8 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Archive.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Archive.java
@@ -126,8 +126,8 @@ public class Archive extends Openable implements IArchive {
}
@Override
- public void getHandleMemento(StringBuilder buff) {
- ((CElement)getParent()).getHandleMemento(buff);
+ public String getHandleMemento() {
+ return null;
}
@Override
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ArchiveContainer.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ArchiveContainer.java
index cafc06fc329..7f546176792 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ArchiveContainer.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ArchiveContainer.java
@@ -57,8 +57,8 @@ public class ArchiveContainer extends Openable implements IArchiveContainer {
}
@Override
- public void getHandleMemento(StringBuilder buff) {
- ((CElement)getParent()).getHandleMemento(buff);
+ public String getHandleMemento() {
+ return null;
}
@Override
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Binary.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Binary.java
index 9fc627b2750..8f0388c9918 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Binary.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Binary.java
@@ -515,8 +515,8 @@ public class Binary extends Openable implements IBinary {
}
@Override
- public void getHandleMemento(StringBuilder buff) {
- ((CElement)getParent()).getHandleMemento(buff);
+ public String getHandleMemento() {
+ return null;
}
@Override
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryContainer.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryContainer.java
index bdbdd6cc737..c4cdd9dd07b 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryContainer.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryContainer.java
@@ -74,8 +74,8 @@ public class BinaryContainer extends Openable implements IBinaryContainer {
}
@Override
- public void getHandleMemento(StringBuilder buff) {
- ((CElement)getParent()).getHandleMemento(buff);
+ public String getHandleMemento() {
+ return null;
}
@Override
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryElement.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryElement.java
index 88cacc6fb84..43a49c8784a 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryElement.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryElement.java
@@ -256,8 +256,8 @@ public class BinaryElement extends CElement implements IBinaryElement, ISourceMa
}
@Override
- public void getHandleMemento(StringBuilder buff) {
- ((CElement)getParent()).getHandleMemento(buff);
+ public String getHandleMemento() {
+ return null;
}
@Override
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryModule.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryModule.java
index 2cf00c80ee1..6c465d6f1b3 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryModule.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryModule.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2006 QNX Software Systems and others.
+ * Copyright (c) 2000, 2008 QNX Software Systems 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
@@ -7,6 +7,7 @@
*
* Contributors:
* QNX Software Systems - Initial API and implementation
+ * Anton Leherbauer (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.model;
@@ -107,8 +108,8 @@ public class BinaryModule extends Parent implements IBinaryModule {
}
@Override
- public void getHandleMemento(StringBuilder buff) {
- ((CElement)getParent()).getHandleMemento(buff);
+ public String getHandleMemento() {
+ return null;
}
@Override
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CContainer.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CContainer.java
index 3a84513cc2b..9e32ad1210c 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CContainer.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CContainer.java
@@ -274,13 +274,37 @@ public class CContainer extends Openable implements ICContainer {
@Override
public ICElement getHandleFromMemento(String token, MementoTokenizer memento) {
switch (token.charAt(0)) {
- case CEM_TRANSLATIONUNIT:
- if (!memento.hasMoreTokens()) return this;
- String tuName = memento.nextToken();
- CElement tu = (CElement) getTranslationUnit(tuName);
- if (tu != null) {
- return tu.getHandleFromMemento(memento);
+ case CEM_SOURCEFOLDER:
+ String name;
+ if (memento.hasMoreTokens()) {
+ name = memento.nextToken();
+ char firstChar = name.charAt(0);
+ if (firstChar == CEM_TRANSLATIONUNIT) {
+ token = name;
+ name = ""; //$NON-NLS-1$
+ } else {
+ token = null;
}
+ } else {
+ name = ""; //$NON-NLS-1$
+ token = null;
+ }
+ CElement folder = (CElement)getCContainer(name);
+ if (folder != null) {
+ if (token == null) {
+ return folder.getHandleFromMemento(memento);
+ } else {
+ return folder.getHandleFromMemento(token, memento);
+ }
+ }
+ break;
+ case CEM_TRANSLATIONUNIT:
+ if (!memento.hasMoreTokens()) return this;
+ String tuName = memento.nextToken();
+ CElement tu = (CElement) getTranslationUnit(tuName);
+ if (tu != null) {
+ return tu.getHandleFromMemento(memento);
+ }
}
return null;
}
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/LibraryReference.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/LibraryReference.java
index 93a60a1b094..e6181c476d6 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/LibraryReference.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/LibraryReference.java
@@ -75,8 +75,8 @@ public class LibraryReference extends Parent implements ILibraryReference {
}
@Override
- public void getHandleMemento(StringBuilder buff) {
- ((CElement)getParent()).getHandleMemento(buff);
+ public String getHandleMemento() {
+ return null;
}
@Override
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/SourceRoot.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/SourceRoot.java
index 1e69711047b..bbd82e3299b 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/SourceRoot.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/SourceRoot.java
@@ -17,7 +17,6 @@ import org.eclipse.cdt.core.model.CoreModelUtil;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ISourceRoot;
import org.eclipse.cdt.core.settings.model.ICSourceEntry;
-import org.eclipse.cdt.internal.core.util.MementoTokenizer;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
@@ -72,40 +71,7 @@ public class SourceRoot extends CContainer implements ISourceRoot {
return false;
}
- /*
- * @see CElement
- */
- public ICElement getHandleFromMemento(String token, MementoTokenizer memento) {
- switch (token.charAt(0)) {
- case CEM_SOURCEFOLDER:
- String name;
- if (memento.hasMoreTokens()) {
- name = memento.nextToken();
- char firstChar = name.charAt(0);
- if (firstChar == CEM_TRANSLATIONUNIT) {
- token = name;
- name = ""; //$NON-NLS-1$
- } else {
- token = null;
- }
- } else {
- name = ""; //$NON-NLS-1$
- token = null;
- }
- CElement folder = (CElement)getCContainer(name);
- if (token == null) {
- return folder.getHandleFromMemento(memento);
- } else {
- return folder.getHandleFromMemento(token, memento);
- }
- case CEM_TRANSLATIONUNIT:
- return super.getHandleFromMemento(token, memento);
- }
- return null;
- }
- /**
- * @see CElement#getHandleMemento(StringBuilder)
- */
+ @Override
public void getHandleMemento(StringBuilder buff) {
IPath path;
IResource underlyingResource = getResource();
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ext/CElementHandle.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ext/CElementHandle.java
index fc549228c72..4313e8c0753 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ext/CElementHandle.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ext/CElementHandle.java
@@ -299,34 +299,20 @@ abstract class CElementHandle implements ICElementHandle, ISourceReference {
* @see ICElement
*/
public String getHandleIdentifier() {
- return getHandleMemento();
- }
-
- public String getHandleMemento(){
- StringBuilder buff = new StringBuilder();
- getHandleMemento(buff);
- return buff.toString();
- }
-
- protected void getHandleMemento(StringBuilder buff) {
- final ICElement parent= getParent();
- if (parent instanceof CElement) {
- ((CElement)parent).getHandleMemento(buff);
- } else if (parent instanceof CElementHandle) {
- ((CElementHandle)parent).getHandleMemento(buff);
+ ICElement cModelElement= mapToModelElement();
+ if (cModelElement != null) {
+ return cModelElement.getHandleIdentifier();
}
- buff.append(getHandleMementoDelimiter());
- CElement.escapeMementoName(buff, getElementName());
- buff.append(CElement.CEM_ELEMENTTYPE);
- buff.append(Integer.toString(getElementType()));
+ return null;
}
- /**
- * Returns the char
that marks the start of this handles
- * contribution to a memento.
- */
- protected char getHandleMementoDelimiter() {
- return CElement.CEM_SOURCEELEMENT;
+ private ICElement mapToModelElement() {
+ try {
+ ISourceRange range= getSourceRange();
+ return getTranslationUnit().getElementAtOffset(range.getIdStartPos());
+ } catch (CModelException exc) {
+ return null;
+ }
}
}
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ext/FunctionDeclarationHandle.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ext/FunctionDeclarationHandle.java
index 6aa39b806ef..722e5552e2b 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ext/FunctionDeclarationHandle.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ext/FunctionDeclarationHandle.java
@@ -18,7 +18,6 @@ import org.eclipse.cdt.core.dom.ast.IFunction;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.IFunctionDeclaration;
-import org.eclipse.cdt.internal.core.model.CElement;
import org.eclipse.cdt.internal.core.model.FunctionDeclaration;
public class FunctionDeclarationHandle extends CElementHandle implements org.eclipse.cdt.core.model.IFunctionDeclaration {
@@ -64,12 +63,4 @@ public class FunctionDeclarationHandle extends CElementHandle implements org.ecl
return fIsStatic;
}
- public void getHandleMemento(StringBuilder buff) {
- super.getHandleMemento(buff);
- for (int i = 0; i < fParameterTypes.length; i++) {
- buff.append(CElement.CEM_PARAMETER);
- CElement.escapeMementoName(buff, fParameterTypes[i]);
- }
- }
-
}
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ext/MethodDeclarationHandle.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ext/MethodDeclarationHandle.java
index 4da108c6b46..8d849a4d5c2 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ext/MethodDeclarationHandle.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ext/MethodDeclarationHandle.java
@@ -19,7 +19,6 @@ import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.IMethodDeclaration;
import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility;
-import org.eclipse.cdt.internal.core.model.CElement;
import org.eclipse.cdt.internal.core.model.FunctionDeclaration;
import org.eclipse.cdt.internal.core.model.MethodDeclaration;
@@ -84,11 +83,4 @@ public class MethodDeclarationHandle extends CElementHandle implements IMethodDe
return fIsDestructor;
}
- public void getHandleMemento(StringBuilder buff) {
- super.getHandleMemento(buff);
- for (int i = 0; i < fParameterTypes.length; i++) {
- buff.append(CElement.CEM_PARAMETER);
- CElement.escapeMementoName(buff, fParameterTypes[i]);
- }
- }
}
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ext/StructureTemplateHandle.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ext/StructureTemplateHandle.java
index 8c9bf34bbde..0fbe5656862 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ext/StructureTemplateHandle.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ext/StructureTemplateHandle.java
@@ -19,7 +19,6 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.IStructureTemplate;
-import org.eclipse.cdt.internal.core.model.CElement;
import org.eclipse.cdt.internal.core.model.Template;
public class StructureTemplateHandle extends StructureHandle implements IStructureTemplate {
@@ -53,14 +52,4 @@ public class StructureTemplateHandle extends StructureHandle implements IStructu
return fTemplate.getTemplateSignature();
}
- public void getHandleMemento(StringBuilder buff) {
- super.getHandleMemento(buff);
- if (fTemplate.getNumberOfTemplateParameters() > 0) {
- final String[] parameterTypes= fTemplate.getTemplateParameterTypes();
- for (int i = 0; i < parameterTypes.length; i++) {
- buff.append(CElement.CEM_PARAMETER);
- CElement.escapeMementoName(buff, parameterTypes[i]);
- }
- }
- }
}