diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/changegenerator/ChangeGenerator.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/changegenerator/ChangeGenerator.java index e302bbffa04..e7523157cad 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/changegenerator/ChangeGenerator.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/changegenerator/ChangeGenerator.java @@ -43,8 +43,8 @@ import org.eclipse.cdt.internal.core.dom.rewrite.commenthandler.NodeCommentMap; import org.eclipse.cdt.internal.core.dom.rewrite.util.FileContentHelper; import org.eclipse.cdt.internal.core.dom.rewrite.util.FileHelper; import org.eclipse.cdt.internal.core.parser.scanner.ILocationResolver; +import org.eclipse.cdt.internal.core.resources.ResourceLookup; import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.ltk.core.refactoring.Change; @@ -230,13 +230,10 @@ public class ChangeGenerator extends CPPASTVisitor { targetLocation = getFileLocationOfEmptyTranslationUnit(modification.getTargetNode()); String currentFile = targetLocation.getFileName(); IPath implPath = new Path(currentFile); - IFile[] relevantFiles = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocation(implPath); - if (relevantFiles.length == 0) { // if not in workspace or local file system + IFile relevantFile= ResourceLookup.selectFileForLocation(implPath, null); + if (relevantFile == null) { // if not in workspace or local file system throw new UnhandledASTModificationException(modification); } - // There may be multiple links to the same file, but since their contents are the - // same, just use the first one. - IFile relevantFile = relevantFiles[0]; MultiTextEdit edit; if (changes.containsKey(relevantFile)) { edit = changes.get(relevantFile); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/commenthandler/NodeCommenter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/commenthandler/NodeCommenter.java index 4fdf8068f74..6128784898a 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/commenthandler/NodeCommenter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/commenthandler/NodeCommenter.java @@ -35,8 +35,8 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTTemplateDeclaration; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTWhileStatement; import org.eclipse.cdt.internal.core.dom.parser.cpp.GPPASTExplicitTemplateInstantiation; import org.eclipse.cdt.internal.core.dom.rewrite.util.OffsetHelper; +import org.eclipse.cdt.internal.core.resources.ResourceLookup; import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; @@ -150,8 +150,7 @@ public class NodeCommenter { return true; } IPath path = new Path(node.getContainingFilename()); - IFile[] files = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocation(path); - IFile file = files.length > 0 ? files[0] : null; // NPE thrown below, like original behavior + IFile file = ResourceLookup.selectFileForLocation(path, null); // NPE thrown below, like original behavior //XXX HSR Guido: Possible Performance Issue (File access) try { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/util/FileHelper.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/util/FileHelper.java index 6bffa2e3f7d..d9005af663e 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/util/FileHelper.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/util/FileHelper.java @@ -18,6 +18,7 @@ import java.io.InputStream; import org.eclipse.cdt.core.dom.ast.IASTFileLocation; import org.eclipse.cdt.core.dom.ast.IASTNode; +import org.eclipse.cdt.internal.core.resources.ResourceLookup; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.ProjectScope; @@ -36,8 +37,7 @@ public class FileHelper { public static IFile getIFilefromIASTNode(IASTNode node) { IPath implPath = new Path(node.getContainingFilename()); - IFile[] files = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocation(implPath); - return files.length > 0 ? files[0] : null; + return ResourceLookup.selectFileForLocation(implPath, null); } public static boolean isFirstWithinSecondLocation(IASTFileLocation loc1, IASTFileLocation loc2){ diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/resources/LocationAdapter.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/resources/LocationAdapter.java index e7eddacffa0..a61f5083f21 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/resources/LocationAdapter.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/resources/LocationAdapter.java @@ -14,7 +14,9 @@ import java.io.File; import java.io.IOException; import java.net.URI; +import org.eclipse.core.filesystem.URIUtil; import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IPath; @@ -36,7 +38,8 @@ abstract class LocationAdapter { @Override public IFile[] platformsFindFilesForLocation(IPath location) { - return ResourcesPlugin.getWorkspace().getRoot().findFilesForLocation(location); + final IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); + return root.findFilesForLocationURI(URIUtil.toURI(location.makeAbsolute())); } @Override diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/resources/ResourceLookup.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/resources/ResourceLookup.java index 0f9da490046..e30566d4307 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/resources/ResourceLookup.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/resources/ResourceLookup.java @@ -79,11 +79,11 @@ public class ResourceLookup { /** * Uses {@link #findFilesForLocation(IPath)} and selects the most relevant file - * from the result. Files form the first project, from cdt-projects and those on source + * from the result. Files form the preferred project, from cdt-projects and those on source * roots are preferred, see {@link FileRelevance}. * @param location a path for the location of the files to search for. * @param preferredProject a project to be preferred over others, or null. - * @return a file for the location in one of the given projects, or null. + * @return a file for the location or null. */ public static IFile selectFileForLocation(IPath location, IProject preferredProject) { return selectFile(findFilesForLocation(location), preferredProject); diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/resources/ResourceLookupTree.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/resources/ResourceLookupTree.java index 66d801e3d49..b83db880fe5 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/resources/ResourceLookupTree.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/resources/ResourceLookupTree.java @@ -653,20 +653,16 @@ class ResourceLookupTree implements IResourceChangeListener, IResourceDeltaVisit synchronized (fLock) { initializeProjects(ResourcesPlugin.getWorkspace().getRoot().getProjects()); Object obj= fNodeMap.get(hashCode(name.toCharArray())); - if (obj == null) { - if (fDefaultExtensions.isRelevant(name)) - return NO_FILES; - } else { + if (obj != null) { candidates= convert(obj); + IFile[] result= extractMatchesForLocation(candidates, location, adapter); + if (result.length > 0) + return result; } } // fall back to platform functionality - if (candidates == null) { - return adapter.platformsFindFilesForLocation(location); - } - - return extractMatchesForLocation(candidates, location, adapter); + return adapter.platformsFindFilesForLocation(location); } private Node[] convert(Object obj) {