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 f6da4ec9426..9dc22dd559e 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 @@ -12,6 +12,8 @@ package org.eclipse.cdt.core.model; +import java.net.URI; + import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IAdaptable; @@ -350,6 +352,14 @@ public interface ICElement extends IAdaptable { * */ IPath getPath(); + + /** + * Returns an absolute URI corresponding to the innermost file enclosing this element. + * + * @since 5.0 + * @return the URI corresponding to the location + */ + URI getLocationURI(); /** * Returns the underlying resource that contains 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 311af6f0ec0..a37abddd235 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 @@ -16,6 +16,7 @@ import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; +import java.net.URI; import java.util.HashMap; import java.util.Map; @@ -323,7 +324,7 @@ public class Binary extends Openable implements IBinary { // See if this source file is already in the project. // We check this to determine if we should create a TranslationUnit or ExternalTranslationUnit IFile sourceFile = getCProject().getProject().getFile(filename); - IPath path = new Path(filename); + URI uri = sourceFile.getLocationURI(); IFile wkspFile = null; if (sourceFile.exists()) @@ -331,7 +332,7 @@ public class Binary extends Openable implements IBinary { else { IFile[] filesInWP = ResourcesPlugin .getWorkspace().getRoot() - .findFilesForLocation(path); + .findFilesForLocationURI(uri); for (int j = 0; j < filesInWP.length; j++) { if (filesInWP[j].isAccessible()) { @@ -351,7 +352,7 @@ public class Binary extends Openable implements IBinary { if (wkspFile != null) tu = new TranslationUnit(this, wkspFile, id); else - tu = new ExternalTranslationUnit(this, path, id); + tu = new ExternalTranslationUnit(this, uri, id); if (! info.includesChild(tu)) info.addChild(tu); diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CElement.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CElement.java index 71da027537f..70a85b95544 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CElement.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CElement.java @@ -12,6 +12,7 @@ package org.eclipse.cdt.internal.core.model; +import java.net.URI; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -102,6 +103,18 @@ public abstract class CElement extends PlatformObject implements ICElement { return res.getFullPath(); return new Path(getElementName()); } + + public URI getLocationURI() { + IResource res = getUnderlyingResource(); + + if(res != null) { + return res.getLocationURI(); + } + + else { + return null; + } + } public boolean exists() { try { diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelManager.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelManager.java index cd49699862f..17e8fa174a1 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelManager.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelManager.java @@ -54,6 +54,7 @@ import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.core.model.IWorkingCopy; import org.eclipse.cdt.internal.core.CCoreInternals; import org.eclipse.cdt.internal.core.LocalProjectScope; +import org.eclipse.core.filesystem.URIUtil; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; @@ -394,7 +395,9 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe if (headerContentTypeId == null) { headerContentTypeId= CoreModel.hasCCNature(project) ? CCorePlugin.CONTENT_TYPE_CXXHEADER : CCorePlugin.CONTENT_TYPE_CHEADER; } - return new ExternalTranslationUnit(includeReferences[i], path, headerContentTypeId); + + // TODO: use URI + return new ExternalTranslationUnit(includeReferences[i], URIUtil.toURI(path), headerContentTypeId); } } } catch (CModelException e) { @@ -403,7 +406,8 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe // if the file exists and it has a known C/C++ file extension then just create // an external translation unit for it. if (contentTypeId != null && path.toFile().exists()) { - return new ExternalTranslationUnit(cproject, path, contentTypeId); + // TODO: use URI + return new ExternalTranslationUnit(cproject, URIUtil.toURI(path), contentTypeId); } } else { // !path.isAbsolute() @@ -416,7 +420,9 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe if (headerContentTypeId == null) { headerContentTypeId= CoreModel.hasCCNature(project) ? CCorePlugin.CONTENT_TYPE_CXXHEADER : CCorePlugin.CONTENT_TYPE_CHEADER; } - return new ExternalTranslationUnit(includeReferences[i], includePath, headerContentTypeId); + + // TODO: use URI + return new ExternalTranslationUnit(includeReferences[i], URIUtil.toURI(includePath), headerContentTypeId); } } } catch (CModelException e) { diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CreateWorkingCopyOperation.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CreateWorkingCopyOperation.java index bf4f554791d..e516888d18e 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CreateWorkingCopyOperation.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CreateWorkingCopyOperation.java @@ -47,7 +47,7 @@ public class CreateWorkingCopyOperation extends CModelOperation { if (tu.getResource() != null) { workingCopy= new WorkingCopy(tu.getParent(), (IFile)tu.getResource(), tu.getContentTypeId(), this.factory, this.problemRequestor); } else { - workingCopy= new WorkingCopy(tu.getParent(), tu.getLocation(), tu.getContentTypeId(), this.factory); + workingCopy= new WorkingCopy(tu.getParent(), tu.getLocationURI(), tu.getContentTypeId(), this.factory); } // open the working copy now to ensure contents are that of the current state of this element // Alain: Actually no, delay the parsing 'till it is really needed. Doing the parsing here diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ExternalTranslationUnit.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ExternalTranslationUnit.java index 799b2787e20..ebeac1b4ca8 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ExternalTranslationUnit.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ExternalTranslationUnit.java @@ -12,6 +12,8 @@ package org.eclipse.cdt.internal.core.model; +import java.net.URI; + import org.eclipse.cdt.core.model.ICElement; import org.eclipse.core.runtime.IPath; @@ -24,8 +26,8 @@ public class ExternalTranslationUnit extends TranslationUnit { * @param parent * @param path */ - public ExternalTranslationUnit(ICElement parent, IPath path, String contentTypeID) { - super(parent, path, contentTypeID); + public ExternalTranslationUnit(ICElement parent, URI uri, String contentTypeID) { + super(parent, uri, contentTypeID); } public IPath getPath() { diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/IncludeReference.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/IncludeReference.java index 1ed5f411a49..76288574484 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/IncludeReference.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/IncludeReference.java @@ -24,6 +24,7 @@ import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.model.IIncludeEntry; import org.eclipse.cdt.core.model.IIncludeReference; import org.eclipse.cdt.utils.PathUtil; +import org.eclipse.core.filesystem.URIUtil; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; @@ -113,7 +114,8 @@ public class IncludeReference extends Openable implements IIncludeReference { } else if (child.isFile()){ String id = CoreModel.getRegistedContentTypeId(getCProject().getProject(), names[i]); if (id != null) { - celement = new ExternalTranslationUnit(this, path.append(names[i]), id); + // TODO: should use URI + celement = new ExternalTranslationUnit(this, URIUtil.toURI(path.append(names[i])), id); } } if (celement != null) { diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/TranslationUnit.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/TranslationUnit.java index 716d3c60777..233d7caa650 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/TranslationUnit.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/TranslationUnit.java @@ -17,6 +17,7 @@ package org.eclipse.cdt.internal.core.model; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; +import java.net.URI; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -63,6 +64,10 @@ import org.eclipse.cdt.internal.core.dom.NullCodeReaderFactory; import org.eclipse.cdt.internal.core.dom.SavedCodeReaderFactory; import org.eclipse.cdt.internal.core.index.IndexBasedCodeReaderFactory; import org.eclipse.cdt.internal.core.pdom.indexer.ProjectIndexerInputAdapter; +import org.eclipse.core.filesystem.EFS; +import org.eclipse.core.filesystem.IFileInfo; +import org.eclipse.core.filesystem.IFileStore; +import org.eclipse.core.filesystem.URIUtil; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; @@ -77,7 +82,7 @@ import org.eclipse.core.runtime.content.IContentType; */ public class TranslationUnit extends Openable implements ITranslationUnit { - private IPath location = null; + private URI location = null; private String contentTypeId; /** @@ -94,10 +99,9 @@ public class TranslationUnit extends Openable implements ITranslationUnit { setContentTypeID(idType); } - public TranslationUnit(ICElement parent, IPath path, String idType) { - super(parent, (IResource)null, path.toString(), ICElement.C_UNIT); + public TranslationUnit(ICElement parent, URI uri, String idType) { + super(parent, (IResource)null, uri.toString(), ICElement.C_UNIT); setContentTypeID(idType); - setLocation(path); } public ITranslationUnit getTranslationUnit() { @@ -290,7 +294,7 @@ public class TranslationUnit extends Openable implements ITranslationUnit { return (INamespace[]) aList.toArray(new INamespace[0]); } - protected void setLocation(IPath loc) { + protected void setLocationURI(URI loc) { location = loc; } @@ -298,9 +302,21 @@ public class TranslationUnit extends Openable implements ITranslationUnit { if (location == null) { IFile file = getFile(); if (file != null) { - location = file.getLocation(); + return file.getLocation(); } else { - return getPath(); + return null; + } + } + return URIUtil.toPath(location); + } + + public URI getLocationURI() { + if (location == null) { + IFile file = getFile(); + if (file != null) { + location = file.getLocationURI(); + } else { + return null; } } return location; @@ -465,7 +481,7 @@ public class TranslationUnit extends Openable implements ITranslationUnit { if (file != null) { workingCopy= new WorkingCopy(getParent(), file, getContentTypeId(), factory); } else { - workingCopy= new WorkingCopy(getParent(), getLocation(), getContentTypeId(), factory); + workingCopy= new WorkingCopy(getParent(), getLocationURI(), getContentTypeId(), factory); } // open the working copy now to ensure contents are that of the current state of this element workingCopy.open(monitor); @@ -678,7 +694,16 @@ public class TranslationUnit extends Openable implements ITranslationUnit { if (res != null) return res.exists(); if (location != null) { - return location.toFile().exists(); + try { + IFileStore fileStore = EFS.getStore(location); + IFileInfo info = fileStore.fetchInfo(); + + return info.exists(); + } catch (CoreException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } return false; } @@ -909,4 +934,6 @@ public class TranslationUnit extends Openable implements ITranslationUnit { final ILanguage result= fLanguageOfContext; return result != null ? result : getLanguage(); } + + } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/WorkingCopy.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/WorkingCopy.java index 76fefde0466..d4203a5059d 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/WorkingCopy.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/WorkingCopy.java @@ -15,6 +15,7 @@ package org.eclipse.cdt.internal.core.model; import java.io.ByteArrayInputStream; import java.io.IOException; +import java.net.URI; import java.util.ArrayList; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; @@ -69,8 +70,8 @@ public class WorkingCopy extends TranslationUnit implements IWorkingCopy { problemRequestor = requestor; } - public WorkingCopy(ICElement parent, IPath path, String id, IBufferFactory bufferFactory) { - super(parent, path, id); + public WorkingCopy(ICElement parent, URI uri, String id, IBufferFactory bufferFactory) { + super(parent, uri, id); this.bufferFactory = bufferFactory == null ? getBufferManager() : @@ -224,7 +225,7 @@ public class WorkingCopy extends TranslationUnit implements IWorkingCopy { if (file != null) { return new TranslationUnit(getParent(), getFile(), getContentTypeId()); } - return new ExternalTranslationUnit(getParent(), getLocation(), getContentTypeId()); + return new ExternalTranslationUnit(getParent(), getLocationURI(), getContentTypeId()); } /** 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 8ed05b1abdc..8cb5cc78ffe 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 @@ -11,6 +11,7 @@ package org.eclipse.cdt.internal.core.model.ext; +import java.net.URI; import java.util.Collections; import java.util.List; @@ -150,6 +151,10 @@ abstract class CElementHandle implements ICElementHandle, ISourceReference { return getTranslationUnit().getPath(); } + public URI getLocationURI() { + return getTranslationUnit().getLocationURI(); + } + public IResource getResource() { return getTranslationUnit().getResource(); } diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/BasicCEditorTest.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/BasicCEditorTest.java index b20ffc12801..7d497f64a48 100644 --- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/BasicCEditorTest.java +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/BasicCEditorTest.java @@ -112,7 +112,7 @@ public class BasicCEditorTest extends BaseUITestCase { } private void setUpEditor(File file) throws PartInitException, CModelException { - IEditorPart editor= EditorUtility.openInEditor(new ExternalTranslationUnit(fCProject, Path.fromOSString(file.toString()), CCorePlugin.CONTENT_TYPE_CXXSOURCE)); + IEditorPart editor= EditorUtility.openInEditor(new ExternalTranslationUnit(fCProject, file.toURI(), CCorePlugin.CONTENT_TYPE_CXXSOURCE)); assertNotNull(editor); assertTrue(editor instanceof CEditor); fEditor= (CEditor) editor; diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/sourcelookup/AbsolutePathSourceContainer.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/sourcelookup/AbsolutePathSourceContainer.java index a0ec7a6c375..860fb413043 100644 --- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/sourcelookup/AbsolutePathSourceContainer.java +++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/sourcelookup/AbsolutePathSourceContainer.java @@ -55,7 +55,7 @@ public class AbsolutePathSourceContainer extends AbstractSourceContainer { { IPath path = Path.fromOSString(file.getCanonicalPath()); String id = CoreModel.getRegistedContentTypeId(project.getProject(), path.lastSegment()); - return new ExternalTranslationUnit[] { new ExternalTranslationUnit(project, new Path(file.getCanonicalPath()), id) }; + return new ExternalTranslationUnit[] { new ExternalTranslationUnit(project, file.toURI(), id) }; } } } catch (IOException e) { // ignore if getCanonicalPath throws diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/CSourceNotFoundEditor.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/CSourceNotFoundEditor.java index dac52b2fb46..fc439b1be1e 100644 --- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/CSourceNotFoundEditor.java +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/sourcelookup/CSourceNotFoundEditor.java @@ -28,6 +28,7 @@ import org.eclipse.cdt.debug.ui.ICDebugUIConstants; import org.eclipse.cdt.internal.core.model.ExternalTranslationUnit; import org.eclipse.cdt.internal.ui.util.EditorUtility; import org.eclipse.cdt.ui.CUIPlugin; +import org.eclipse.core.filesystem.URIUtil; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; @@ -328,7 +329,9 @@ public class CSourceNotFoundEditor extends CommonSourceNotFoundEditor { { ITranslationUnit remappedTU = tu; if (tu instanceof ExternalTranslationUnit) - remappedTU = new ExternalTranslationUnit(tu.getParent(), newLocation.getFullPath(), tu.getContentTypeId()); + + // TODO: source lookup needs to be modified to use URIs + remappedTU = new ExternalTranslationUnit(tu.getParent(), URIUtil.toURI(newLocation.getFullPath()), tu.getContentTypeId()); EditorUtility.openInEditor(remappedTU); return true; }