diff options
author | Sergey Prigogin | 2010-12-15 02:23:32 +0000 |
---|---|---|
committer | Sergey Prigogin | 2010-12-15 02:23:32 +0000 |
commit | 686dacabdb81948ab919fd96f1210735d398b975 (patch) | |
tree | b5e6a1eb294a38655e8cf58f16a51185abaf5a70 /debug | |
parent | a6387c02ef4f8d46a12a48886b61b4bbe7aeb511 (diff) | |
download | org.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')
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 f07010fc382..3102863ced6 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 dc5d71ac12f..cf14bcba272 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 cb3841d18d8..272d5d8f58c 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) }; + } } |