mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-23 22:52:11 +02:00
Bug 225805 - Make compilation directory container return IFiles when possible.
This commit is contained in:
parent
a6387c02ef
commit
686dacabdb
3 changed files with 83 additions and 93 deletions
|
@ -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];
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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) };
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue