Skip to main content
summaryrefslogtreecommitdiffstats
path: root/debug
diff options
context:
space:
mode:
authorSergey Prigogin2010-12-14 21:23:32 -0500
committerSergey Prigogin2010-12-14 21:23:32 -0500
commit686dacabdb81948ab919fd96f1210735d398b975 (patch)
treeb5e6a1eb294a38655e8cf58f16a51185abaf5a70 /debug
parenta6387c02ef4f8d46a12a48886b61b4bbe7aeb511 (diff)
downloadorg.eclipse.cdt-686dacabdb81948ab919fd96f1210735d398b975.tar.gz
org.eclipse.cdt-686dacabdb81948ab919fd96f1210735d398b975.tar.xz
org.eclipse.cdt-686dacabdb81948ab919fd96f1210735d398b975.zip
Bug 225805 - Make compilation directory container return IFiles when possible.
Diffstat (limited to 'debug')
-rw-r--r--debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/sourcelookup/AbsolutePathSourceContainer.java81
-rw-r--r--debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/CompilationDirectorySourceContainer.java30
-rw-r--r--debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/SourceUtils.java65
3 files changed, 83 insertions, 93 deletions
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 f07010fc38..3102863ced 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
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2006, 2009 Nokia and others.
+ * Copyright (c) 2006, 2010 Nokia 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
@@ -8,29 +8,17 @@
* Contributors:
* Nokia - Initial implementation (159833)
* Broadcom - http://bugs.eclipse.org/247853
+ * Sergey Prigogin (Google)
*******************************************************************************/
package org.eclipse.cdt.debug.core.sourcelookup;
import java.io.File;
-import java.io.IOException;
-import org.eclipse.cdt.core.model.CoreModel;
-import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.debug.core.CDebugCorePlugin;
-import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
-import org.eclipse.cdt.internal.core.model.ExternalTranslationUnit;
-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.ResourcesPlugin;
+import org.eclipse.cdt.debug.internal.core.sourcelookup.SourceUtils;
import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.sourcelookup.ISourceContainerType;
-import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
import org.eclipse.debug.core.sourcelookup.containers.AbstractSourceContainer;
-import org.eclipse.debug.core.sourcelookup.containers.LocalFileStorage;
public class AbsolutePathSourceContainer extends AbstractSourceContainer {
/**
@@ -39,67 +27,6 @@ public class AbsolutePathSourceContainer extends AbstractSourceContainer {
*/
public static final String TYPE_ID = CDebugCorePlugin.getUniqueIdentifier() + ".containerType.absolutePath"; //$NON-NLS-1$
- private Object[] findSourceElementByFile(File file) {
- IFile[] wfiles = ResourceLookup.findFilesForLocation(new Path(file.getAbsolutePath()));
- if (wfiles.length > 0) {
- ResourceLookup.sortFilesByRelevance(wfiles, getProject());
- return wfiles;
- }
-
- try {
- // Check the canonical path as well to support case insensitive file
- // systems like Windows.
- wfiles = ResourceLookup.findFilesForLocation(new Path(file.getCanonicalPath()));
- if (wfiles.length > 0) {
- ResourceLookup.sortFilesByRelevance(wfiles, getProject());
- return wfiles;
- }
-
- // The file is not already in the workspace so try to create an external translation unit for it.
- ISourceLookupDirector director = getDirector();
- if (director != null) {
- ILaunchConfiguration launchConfiguration = director.getLaunchConfiguration();
- if (launchConfiguration != null) {
- String projectName = launchConfiguration.getAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, ""); //$NON-NLS-1$
- if (projectName.length() > 0) {
- ICProject project = CoreModel.getDefault().getCModel().getCProject(projectName);
- if (project != null) {
- IPath path = Path.fromOSString(file.getCanonicalPath());
- String id = CoreModel.getRegistedContentTypeId(project.getProject(), path.lastSegment());
- return new ExternalTranslationUnit[] { new ExternalTranslationUnit(project, path, id) };
- }
- }
- }
- }
- } catch (IOException e) { // ignore if getCanonicalPath throws
- } catch (CoreException e) {
- }
-
- // If we can't create an ETU then fall back on LocalFileStorage.
- return new LocalFileStorage[] { new LocalFileStorage(file) };
- }
-
- /**
- * Find the project associated with the current launch configuration
- * @return IProject or null
- */
- private IProject getProject() {
- ISourceLookupDirector director = getDirector();
- if (director != null) {
- ILaunchConfiguration config = director.getLaunchConfiguration();
- if (config != null) {
- try {
- String name = config.getAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, ""); //$NON-NLS-1$
- if (name.length() > 0)
- return ResourcesPlugin.getWorkspace().getRoot().getProject(name);
- } catch (CoreException e) {
- // Don't care carry on search using other heuristics
- }
- }
- }
- return null;
- }
-
public boolean isValidAbsoluteFilePath(String name) {
return isValidAbsoluteFilePath(new File(name));
}
@@ -112,7 +39,7 @@ public class AbsolutePathSourceContainer extends AbstractSourceContainer {
if (name != null) {
File file = new File(name);
if (isValidAbsoluteFilePath(file)) {
- return findSourceElementByFile(file);
+ return SourceUtils.findSourceElements(file, getDirector());
}
}
return new Object[0];
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/CompilationDirectorySourceContainer.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/CompilationDirectorySourceContainer.java
index dc5d71ac12..cf14bcba27 100644
--- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/CompilationDirectorySourceContainer.java
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/CompilationDirectorySourceContainer.java
@@ -12,6 +12,7 @@ package org.eclipse.cdt.debug.internal.core.sourcelookup;
import java.io.File;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
import org.eclipse.cdt.debug.core.CDebugCorePlugin;
@@ -22,7 +23,6 @@ import org.eclipse.core.runtime.Path;
import org.eclipse.debug.core.sourcelookup.ISourceContainer;
import org.eclipse.debug.core.sourcelookup.ISourceContainerType;
import org.eclipse.debug.core.sourcelookup.containers.CompositeSourceContainer;
-import org.eclipse.debug.core.sourcelookup.containers.LocalFileStorage;
/**
* A directory in the local file system that is used for running the C/C++ compiler. This container
@@ -33,7 +33,7 @@ import org.eclipse.debug.core.sourcelookup.containers.LocalFileStorage;
* the source container list.
*
* Source elements returned from <code>findSourceElements(...)</code> are instances of
- * <code>LocalFileStorage</code>.
+ * <code>IFile</code> or <code>LocalFileStorage</code>.
* <p>
* Clients may instantiate this class.
* </p>
@@ -104,30 +104,30 @@ public class CompilationDirectorySourceContainer extends CompositeSourceContaine
}
/**
- * Source elements returned from this method are instances of <code>LocalFileStorage</code>.
+ * Source elements returned from this method are instances of <code>IFile</code> or <code>LocalFileStorage</code>.
* @see org.eclipse.debug.core.sourcelookup.ISourceContainer#findSourceElements(String)
*/
public Object[] findSourceElements(String name) throws CoreException {
- ArrayList<Object> sources = new ArrayList<Object>();
- File directory = getDirectory();
- File file = new File(directory, name);
+ File file = new File(fDirectory, name);
+ List<Object> sources;
if (file.exists() && file.isFile()) {
- sources.add(new LocalFileStorage(file));
+ sources = Arrays.asList(SourceUtils.findSourceElements(file, getDirector()));
+ } else {
+ sources = new ArrayList<Object>();
}
// Check sub-folders
- if ((isFindDuplicates() && fSubfolders) || (sources.isEmpty() && fSubfolders)) {
- ISourceContainer[] containers = getSourceContainers();
- for (int i = 0; i < containers.length; i++) {
- Object[] objects = containers[i].findSourceElements(name);
- if (objects == null || objects.length == 0) {
+ if (fSubfolders && (isFindDuplicates() || sources.isEmpty())) {
+ for (ISourceContainer container : getSourceContainers()) {
+ Object[] elements = container.findSourceElements(name);
+ if (elements == null || elements.length == 0) {
continue;
}
if (isFindDuplicates()) {
- for (int j = 0; j < objects.length; j++)
- sources.add(objects[j]);
+ for (Object element : elements)
+ sources.add(element);
} else {
- sources.add(objects[0]);
+ sources.add(elements[0]);
break;
}
}
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/SourceUtils.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/SourceUtils.java
index cb3841d18d..272d5d8f58 100644
--- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/SourceUtils.java
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/SourceUtils.java
@@ -11,6 +11,7 @@
*******************************************************************************/
package org.eclipse.cdt.debug.internal.core.sourcelookup;
+import java.io.File;
import java.io.IOException;
import java.io.StringReader;
import com.ibm.icu.text.MessageFormat;
@@ -24,6 +25,9 @@ import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;
+
+import org.eclipse.cdt.core.model.CoreModel;
+import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.debug.core.CDebugCorePlugin;
import org.eclipse.cdt.debug.core.CDebugUtils;
import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
@@ -33,16 +37,21 @@ import org.eclipse.cdt.debug.core.sourcelookup.IDirectorySourceLocation;
import org.eclipse.cdt.debug.core.sourcelookup.IMappingSourceContainer;
import org.eclipse.cdt.debug.core.sourcelookup.IProjectSourceLocation;
import org.eclipse.cdt.debug.core.sourcelookup.MappingSourceContainer;
+import org.eclipse.cdt.internal.core.model.ExternalTranslationUnit;
+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.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.sourcelookup.ISourceContainer;
import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
import org.eclipse.debug.core.sourcelookup.containers.DirectorySourceContainer;
+import org.eclipse.debug.core.sourcelookup.containers.LocalFileStorage;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
@@ -217,17 +226,71 @@ public class SourceUtils {
}
}
+ /**
+ * Returns the project from the launch configuration, or {@code null} if it's not available.
+ */
public static IProject getLaunchConfigurationProject(ISourceLookupDirector director) {
+ String name = getLaunchConfigurationProjectName(director);
+ return name != null ? ResourcesPlugin.getWorkspace().getRoot().getProject(name) : null;
+ }
+
+ /**
+ * Returns the project name from the launch configuration, or {@code null} if it's not available.
+ */
+ public static String getLaunchConfigurationProjectName(ISourceLookupDirector director) {
ILaunchConfiguration config = director.getLaunchConfiguration();
if (config != null) {
try {
String name = config.getAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, ""); //$NON-NLS-1$
if (name.length() > 0)
- return ResourcesPlugin.getWorkspace().getRoot().getProject(name);
+ return name;
} catch (CoreException e) {
CDebugCorePlugin.log(e);
}
}
return null;
}
+
+ /**
+ * Returns source elements corresponding to a file.
+ * @param file A source or header file.
+ * @param director A source lookup director.
+ * @return An array of source elements sorted in relevance order. The elements of the array can
+ * be either instances of IFile or LocalFileStorage. The returned array can be empty if
+ * no source elements match the given file.
+ */
+ public static Object[] findSourceElements(File file, ISourceLookupDirector director) {
+ IFile[] wfiles = ResourceLookup.findFilesForLocation(new Path(file.getAbsolutePath()));
+ if (wfiles.length > 0) {
+ ResourceLookup.sortFilesByRelevance(wfiles, getLaunchConfigurationProject(director));
+ return wfiles;
+ }
+
+ try {
+ // Check the canonical path as well to support case insensitive file
+ // systems like Windows.
+ wfiles = ResourceLookup.findFilesForLocation(new Path(file.getCanonicalPath()));
+ if (wfiles.length > 0) {
+ ResourceLookup.sortFilesByRelevance(wfiles, getLaunchConfigurationProject(director));
+ return wfiles;
+ }
+
+ // The file is not already in the workspace so try to create an external translation unit for it.
+ if (director != null) {
+ String projectName = getLaunchConfigurationProjectName(director);
+ if (projectName != null) {
+ ICProject project = CoreModel.getDefault().getCModel().getCProject(projectName);
+ if (project != null) {
+ IPath path = Path.fromOSString(file.getCanonicalPath());
+ String id = CoreModel.getRegistedContentTypeId(project.getProject(), path.lastSegment());
+ return new ExternalTranslationUnit[] { new ExternalTranslationUnit(project, path, id) };
+ }
+ }
+ }
+ } catch (IOException e) { // ignore if getCanonicalPath throws
+ }
+
+ // If we can't create an ETU then fall back on LocalFileStorage.
+ return new LocalFileStorage[] { new LocalFileStorage(file) };
+ }
}

Back to the top