mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-28 11:25:35 +02:00
Move the persistency of the PathEntry in a different class
and provide an extension point for it.
This commit is contained in:
parent
e0706f6786
commit
d83f3ab70e
9 changed files with 639 additions and 325 deletions
|
@ -1,3 +1,17 @@
|
||||||
|
2004-04-26 Alain Magloire
|
||||||
|
|
||||||
|
Move the persistency of the IPathEntry in a differenct
|
||||||
|
class and provide an extension point for it.
|
||||||
|
|
||||||
|
* plugin.xml
|
||||||
|
* model/org/eclipse/cdt/internal/core/model/CProject.java
|
||||||
|
* model/org/eclipse/cdt/internal/core/model/PathEntryManager.java
|
||||||
|
* model/org/eclipse/cdt/internal/core/model/PathEntryStore.java
|
||||||
|
|
||||||
|
* src/org/eclipe/cdt/core/CCorePlugin.java
|
||||||
|
* src/org/eclipse/cdt/internal/core/resources/IPathEntryStore.java
|
||||||
|
* src/org/eclipse/cdt/internal/core/resources/IPathEntryStoreListener.java
|
||||||
|
* src/org/eclipse/cdt/internal/core/resources/PathEntryStoreChangedEvent.java
|
||||||
2004-04-23 Alain Magloire
|
2004-04-23 Alain Magloire
|
||||||
|
|
||||||
Tentative fix for PR 59098.
|
Tentative fix for PR 59098.
|
||||||
|
|
|
@ -13,10 +13,10 @@ import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.BinaryParserConfig;
|
||||||
import org.eclipse.cdt.core.CCProjectNature;
|
import org.eclipse.cdt.core.CCProjectNature;
|
||||||
import org.eclipse.cdt.core.CCorePlugin;
|
import org.eclipse.cdt.core.CCorePlugin;
|
||||||
import org.eclipse.cdt.core.CProjectNature;
|
import org.eclipse.cdt.core.CProjectNature;
|
||||||
import org.eclipse.cdt.core.IBinaryParser;
|
|
||||||
import org.eclipse.cdt.core.IBinaryParser.IBinaryArchive;
|
import org.eclipse.cdt.core.IBinaryParser.IBinaryArchive;
|
||||||
import org.eclipse.cdt.core.IBinaryParser.IBinaryFile;
|
import org.eclipse.cdt.core.IBinaryParser.IBinaryFile;
|
||||||
import org.eclipse.cdt.core.IBinaryParser.IBinaryObject;
|
import org.eclipse.cdt.core.IBinaryParser.IBinaryObject;
|
||||||
|
@ -150,17 +150,13 @@ public class CProject extends Openable implements ICProject {
|
||||||
}
|
}
|
||||||
|
|
||||||
public ILibraryReference[] getLibraryReferences() throws CModelException {
|
public ILibraryReference[] getLibraryReferences() throws CModelException {
|
||||||
IBinaryParser[] binParsers = null;
|
BinaryParserConfig[] binConfigs = CModelManager.getDefault().getBinaryParser(getProject());
|
||||||
try {
|
|
||||||
binParsers = CCorePlugin.getDefault().getBinaryParser(getProject());
|
|
||||||
} catch (CoreException e) {
|
|
||||||
}
|
|
||||||
IPathEntry[] entries = getResolvedPathEntries();
|
IPathEntry[] entries = getResolvedPathEntries();
|
||||||
ArrayList list = new ArrayList(entries.length);
|
ArrayList list = new ArrayList(entries.length);
|
||||||
for (int i = 0; i < entries.length; i++) {
|
for (int i = 0; i < entries.length; i++) {
|
||||||
if (entries[i].getEntryKind() == IPathEntry.CDT_LIBRARY) {
|
if (entries[i].getEntryKind() == IPathEntry.CDT_LIBRARY) {
|
||||||
ILibraryEntry entry = (ILibraryEntry) entries[i];
|
ILibraryEntry entry = (ILibraryEntry) entries[i];
|
||||||
ILibraryReference lib = getLibraryReference(this, binParsers, entry);
|
ILibraryReference lib = getLibraryReference(this, binConfigs, entry);
|
||||||
if (lib != null) {
|
if (lib != null) {
|
||||||
list.add(lib);
|
list.add(lib);
|
||||||
}
|
}
|
||||||
|
@ -169,19 +165,16 @@ public class CProject extends Openable implements ICProject {
|
||||||
return (ILibraryReference[]) list.toArray(new ILibraryReference[0]);
|
return (ILibraryReference[]) list.toArray(new ILibraryReference[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ILibraryReference getLibraryReference(ICProject cproject, IBinaryParser[] binParsers, ILibraryEntry entry) {
|
public static ILibraryReference getLibraryReference(ICProject cproject, BinaryParserConfig[] binConfigs, ILibraryEntry entry) {
|
||||||
if (binParsers == null) {
|
if (binConfigs == null) {
|
||||||
try {
|
binConfigs = CModelManager.getDefault().getBinaryParser(cproject.getProject());
|
||||||
binParsers = CCorePlugin.getDefault().getBinaryParser(cproject.getProject());
|
|
||||||
} catch (CoreException e) {
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
ILibraryReference lib = null;
|
ILibraryReference lib = null;
|
||||||
if (binParsers != null) {
|
if (binConfigs != null) {
|
||||||
for (int i = 0; i < binParsers.length; i++) {
|
for (int i = 0; i < binConfigs.length; i++) {
|
||||||
IBinaryFile bin;
|
IBinaryFile bin;
|
||||||
try {
|
try {
|
||||||
bin = binParsers[i].getBinary(entry.getPath());
|
bin = binConfigs[i].getBinaryParser().getBinary(entry.getPath());
|
||||||
if (bin != null) {
|
if (bin != null) {
|
||||||
if (bin.getType() == IBinaryFile.ARCHIVE) {
|
if (bin.getType() == IBinaryFile.ARCHIVE) {
|
||||||
lib = new LibraryReferenceArchive(cproject, entry, (IBinaryArchive)bin);
|
lib = new LibraryReferenceArchive(cproject, entry, (IBinaryArchive)bin);
|
||||||
|
|
|
@ -16,17 +16,14 @@ import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import org.eclipse.cdt.core.CCorePlugin;
|
import org.eclipse.cdt.core.CCorePlugin;
|
||||||
import org.eclipse.cdt.core.CDescriptorEvent;
|
|
||||||
import org.eclipse.cdt.core.ICDescriptor;
|
|
||||||
import org.eclipse.cdt.core.ICDescriptorListener;
|
|
||||||
import org.eclipse.cdt.core.model.CModelException;
|
import org.eclipse.cdt.core.model.CModelException;
|
||||||
import org.eclipse.cdt.core.model.CoreModel;
|
import org.eclipse.cdt.core.model.CoreModel;
|
||||||
import org.eclipse.cdt.core.model.ElementChangedEvent;
|
import org.eclipse.cdt.core.model.ElementChangedEvent;
|
||||||
import org.eclipse.cdt.core.model.ICElement;
|
import org.eclipse.cdt.core.model.ICElement;
|
||||||
import org.eclipse.cdt.core.model.ICElementDelta;
|
import org.eclipse.cdt.core.model.ICElementDelta;
|
||||||
import org.eclipse.cdt.core.model.ICModelStatus;
|
|
||||||
import org.eclipse.cdt.core.model.ICProject;
|
import org.eclipse.cdt.core.model.ICProject;
|
||||||
import org.eclipse.cdt.core.model.IContainerEntry;
|
import org.eclipse.cdt.core.model.IContainerEntry;
|
||||||
|
import org.eclipse.cdt.core.model.IElementChangedListener;
|
||||||
import org.eclipse.cdt.core.model.IIncludeEntry;
|
import org.eclipse.cdt.core.model.IIncludeEntry;
|
||||||
import org.eclipse.cdt.core.model.ILibraryEntry;
|
import org.eclipse.cdt.core.model.ILibraryEntry;
|
||||||
import org.eclipse.cdt.core.model.IMacroEntry;
|
import org.eclipse.cdt.core.model.IMacroEntry;
|
||||||
|
@ -36,7 +33,9 @@ import org.eclipse.cdt.core.model.IPathEntryContainer;
|
||||||
import org.eclipse.cdt.core.model.IProjectEntry;
|
import org.eclipse.cdt.core.model.IProjectEntry;
|
||||||
import org.eclipse.cdt.core.model.ISourceEntry;
|
import org.eclipse.cdt.core.model.ISourceEntry;
|
||||||
import org.eclipse.cdt.core.model.PathEntryContainerInitializer;
|
import org.eclipse.cdt.core.model.PathEntryContainerInitializer;
|
||||||
import org.eclipse.cdt.internal.core.CharOperation;
|
import org.eclipse.cdt.core.resources.IPathEntryStore;
|
||||||
|
import org.eclipse.cdt.core.resources.IPathEntryStoreListener;
|
||||||
|
import org.eclipse.cdt.core.resources.PathEntryStoreChangedEvent;
|
||||||
import org.eclipse.core.resources.IProject;
|
import org.eclipse.core.resources.IProject;
|
||||||
import org.eclipse.core.resources.IWorkspaceRunnable;
|
import org.eclipse.core.resources.IWorkspaceRunnable;
|
||||||
import org.eclipse.core.runtime.CoreException;
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
@ -49,35 +48,14 @@ import org.eclipse.core.runtime.ISafeRunnable;
|
||||||
import org.eclipse.core.runtime.Path;
|
import org.eclipse.core.runtime.Path;
|
||||||
import org.eclipse.core.runtime.Platform;
|
import org.eclipse.core.runtime.Platform;
|
||||||
import org.eclipse.core.runtime.Plugin;
|
import org.eclipse.core.runtime.Plugin;
|
||||||
import org.w3c.dom.Document;
|
|
||||||
import org.w3c.dom.Element;
|
|
||||||
import org.w3c.dom.Node;
|
|
||||||
import org.w3c.dom.NodeList;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author alain
|
* @author alain
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class PathEntryManager implements ICDescriptorListener {
|
public class PathEntryManager implements IPathEntryStoreListener, IElementChangedListener {
|
||||||
|
|
||||||
static String CONTAINER_INITIALIZER_EXTPOINT_ID = "pathEntryContainerInitializer"; //$NON-NLS-1$
|
static String CONTAINER_INITIALIZER_EXTPOINT_ID = "pathEntryContainerInitializer"; //$NON-NLS-1$
|
||||||
static String PATH_ENTRY = "pathentry"; //$NON-NLS-1$
|
|
||||||
static String PATH_ENTRY_ID = "org.eclipse.cdt.core.pathentry"; //$NON-NLS-1$
|
|
||||||
static String ATTRIBUTE_KIND = "kind"; //$NON-NLS-1$
|
|
||||||
static String ATTRIBUTE_PATH = "path"; //$NON-NLS-1$
|
|
||||||
static String ATTRIBUTE_BASE_PATH = "base-path"; //$NON-NLS-1$
|
|
||||||
static String ATTRIBUTE_BASE_REF = "base-ref"; //$NON-NLS-1$
|
|
||||||
static String ATTRIBUTE_EXPORTED = "exported"; //$NON-NLS-1$
|
|
||||||
static String ATTRIBUTE_SOURCEPATH = "sourcepath"; //$NON-NLS-1$
|
|
||||||
static String ATTRIBUTE_ROOTPATH = "roopath"; //$NON-NLS-1$
|
|
||||||
static String ATTRIBUTE_PREFIXMAPPING = "prefixmapping"; //$NON-NLS-1$
|
|
||||||
static String ATTRIBUTE_EXCLUDING = "excluding"; //$NON-NLS-1$
|
|
||||||
static String ATTRIBUTE_INCLUDE = "include"; //$NON-NLS-1$
|
|
||||||
static String ATTRIBUTE_SYSTEM = "system"; //$NON-NLS-1$
|
|
||||||
static String ATTRIBUTE_NAME = "name"; //$NON-NLS-1$
|
|
||||||
static String ATTRIBUTE_VALUE = "value"; //$NON-NLS-1$
|
|
||||||
static String VALUE_TRUE = "true"; //$NON-NLS-1$
|
|
||||||
final static IPathEntry[] EMPTY = {};
|
|
||||||
/**
|
/**
|
||||||
* An empty array of strings indicating that a project doesn't have any prerequesite projects.
|
* An empty array of strings indicating that a project doesn't have any prerequesite projects.
|
||||||
*/
|
*/
|
||||||
|
@ -90,8 +68,10 @@ public class PathEntryManager implements ICDescriptorListener {
|
||||||
static final IPathEntry[] NO_PATHENTRIES = new IPathEntry[0];
|
static final IPathEntry[] NO_PATHENTRIES = new IPathEntry[0];
|
||||||
|
|
||||||
HashMap resolvedMap = new HashMap();
|
HashMap resolvedMap = new HashMap();
|
||||||
private static PathEntryManager pathEntryManager;
|
|
||||||
|
|
||||||
|
HashMap storeMap = new HashMap();
|
||||||
|
|
||||||
|
private static PathEntryManager pathEntryManager;
|
||||||
private PathEntryManager() {
|
private PathEntryManager() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -101,10 +81,7 @@ public class PathEntryManager implements ICDescriptorListener {
|
||||||
public static PathEntryManager getDefault() {
|
public static PathEntryManager getDefault() {
|
||||||
if (pathEntryManager == null) {
|
if (pathEntryManager == null) {
|
||||||
pathEntryManager = new PathEntryManager();
|
pathEntryManager = new PathEntryManager();
|
||||||
// Register the Core Model on the Descriptor
|
CoreModel.getDefault().addElementChangedListener(pathEntryManager);
|
||||||
// Manager, it needs to know about changes.
|
|
||||||
CCorePlugin.getDefault().getCDescriptorManager().addDescriptorListener(pathEntryManager);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
return pathEntryManager;
|
return pathEntryManager;
|
||||||
}
|
}
|
||||||
|
@ -228,23 +205,14 @@ public class PathEntryManager implements ICDescriptorListener {
|
||||||
}
|
}
|
||||||
|
|
||||||
public IPathEntry[] getRawPathEntries(ICProject cproject) throws CModelException {
|
public IPathEntry[] getRawPathEntries(ICProject cproject) throws CModelException {
|
||||||
CModelManager factory = CModelManager.getDefault();
|
IProject project = cproject.getProject();
|
||||||
if (!(CoreModel.hasCNature(cproject.getProject()) || CoreModel.hasCCNature(cproject.getProject()))) {
|
if (!(CoreModel.hasCNature(project) || CoreModel.hasCCNature(project))) {
|
||||||
return NO_PATHENTRIES;
|
return NO_PATHENTRIES;
|
||||||
}
|
}
|
||||||
ArrayList pathEntries = new ArrayList();
|
IPathEntry[] pathEntries = NO_PATHENTRIES;
|
||||||
try {
|
try {
|
||||||
ICDescriptor cdesc = CCorePlugin.getDefault().getCProjectDescription(cproject.getProject());
|
IPathEntryStore store = getPathEntryStore(project);
|
||||||
Element element = cdesc.getProjectData(PATH_ENTRY_ID);
|
pathEntries = store.getRawPathEntries(project);
|
||||||
NodeList list = element.getChildNodes();
|
|
||||||
for (int i = 0; i < list.getLength(); i++) {
|
|
||||||
Node childNode = list.item(i);
|
|
||||||
if (childNode.getNodeType() == Node.ELEMENT_NODE) {
|
|
||||||
if (childNode.getNodeName().equals(PATH_ENTRY)) {
|
|
||||||
pathEntries.add(decodePathEntry(cproject, (Element) childNode));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (CoreException e) {
|
} catch (CoreException e) {
|
||||||
throw new CModelException(e);
|
throw new CModelException(e);
|
||||||
}
|
}
|
||||||
|
@ -254,8 +222,8 @@ public class PathEntryManager implements ICDescriptorListener {
|
||||||
// if no source is specified we return the project
|
// if no source is specified we return the project
|
||||||
boolean foundSource = false;
|
boolean foundSource = false;
|
||||||
boolean foundOutput = false;
|
boolean foundOutput = false;
|
||||||
for (int i = 0; i < pathEntries.size(); i++) {
|
for (int i = 0; i < pathEntries.length; i++) {
|
||||||
IPathEntry rawEntry = (IPathEntry) pathEntries.get(i);
|
IPathEntry rawEntry = (IPathEntry) pathEntries[i];
|
||||||
if (rawEntry.getEntryKind() == IPathEntry.CDT_SOURCE) {
|
if (rawEntry.getEntryKind() == IPathEntry.CDT_SOURCE) {
|
||||||
foundSource = true;
|
foundSource = true;
|
||||||
}
|
}
|
||||||
|
@ -265,12 +233,18 @@ public class PathEntryManager implements ICDescriptorListener {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!foundSource) {
|
if (!foundSource) {
|
||||||
pathEntries.add(CoreModel.newSourceEntry(cproject.getPath()));
|
IPathEntry[] newEntries = new IPathEntry[pathEntries.length + 1];
|
||||||
|
System.arraycopy(pathEntries, 0, newEntries, 0, pathEntries.length);
|
||||||
|
newEntries[pathEntries.length] = CoreModel.newSourceEntry(cproject.getPath());
|
||||||
|
pathEntries = newEntries;
|
||||||
}
|
}
|
||||||
if (!foundOutput) {
|
if (!foundOutput) {
|
||||||
pathEntries.add(CoreModel.newOutputEntry(cproject.getPath()));
|
IPathEntry[] newEntries = new IPathEntry[pathEntries.length + 1];
|
||||||
|
System.arraycopy(pathEntries, 0, newEntries, 0, pathEntries.length);
|
||||||
|
newEntries[pathEntries.length] = CoreModel.newOutputEntry(cproject.getPath());
|
||||||
|
pathEntries = newEntries;
|
||||||
}
|
}
|
||||||
return (IPathEntry[]) pathEntries.toArray(EMPTY);
|
return pathEntries;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setPathEntryContainer(ICProject[] affectedProjects, IPathEntryContainer newContainer, IProgressMonitor monitor)
|
public void setPathEntryContainer(ICProject[] affectedProjects, IPathEntryContainer newContainer, IProgressMonitor monitor)
|
||||||
|
@ -486,21 +460,9 @@ public class PathEntryManager implements ICDescriptorListener {
|
||||||
|
|
||||||
public void saveRawPathEntries(ICProject cproject, IPathEntry[] newRawEntries) throws CModelException {
|
public void saveRawPathEntries(ICProject cproject, IPathEntry[] newRawEntries) throws CModelException {
|
||||||
try {
|
try {
|
||||||
ICDescriptor descriptor = CCorePlugin.getDefault().getCProjectDescription(cproject.getProject());
|
IProject project = cproject.getProject();
|
||||||
Element rootElement = descriptor.getProjectData(PATH_ENTRY_ID);
|
IPathEntryStore store = getPathEntryStore(project);
|
||||||
// Clear out all current children
|
store.setRawPathEntries(project, newRawEntries);
|
||||||
Node child = rootElement.getFirstChild();
|
|
||||||
while (child != null) {
|
|
||||||
rootElement.removeChild(child);
|
|
||||||
child = rootElement.getFirstChild();
|
|
||||||
}
|
|
||||||
// Save the entries
|
|
||||||
if (newRawEntries != null && newRawEntries.length > 0) {
|
|
||||||
// Serialize the include paths
|
|
||||||
Document doc = rootElement.getOwnerDocument();
|
|
||||||
encodePathEntries(cproject.getPath(), doc, rootElement, newRawEntries);
|
|
||||||
}
|
|
||||||
descriptor.saveProjectData();
|
|
||||||
resolvedMap.remove(cproject);
|
resolvedMap.remove(cproject);
|
||||||
} catch (CoreException e) {
|
} catch (CoreException e) {
|
||||||
throw new CModelException(e);
|
throw new CModelException(e);
|
||||||
|
@ -653,255 +615,70 @@ public class PathEntryManager implements ICDescriptorListener {
|
||||||
return containerIDs;
|
return containerIDs;
|
||||||
}
|
}
|
||||||
|
|
||||||
static IPathEntry decodePathEntry(ICProject cProject, Element element) throws CModelException {
|
IPathEntryStore getPathEntryStore(IProject project) throws CoreException {
|
||||||
IPath projectPath = cProject.getProject().getFullPath();
|
IPathEntryStore store = (IPathEntryStore)storeMap.get(project);
|
||||||
|
if (store == null) {
|
||||||
// kind
|
store = CCorePlugin.getDefault().getPathEntryStore(project);
|
||||||
String kindAttr = element.getAttribute(ATTRIBUTE_KIND);
|
storeMap.put(project, store);
|
||||||
int kind = PathEntry.kindFromString(kindAttr);
|
store.addPathEntryStoreListener(this);
|
||||||
|
|
||||||
// exported flag
|
|
||||||
boolean isExported = false;
|
|
||||||
if (element.hasAttribute(ATTRIBUTE_EXPORTED)) {
|
|
||||||
isExported = element.getAttribute(ATTRIBUTE_EXPORTED).equals(VALUE_TRUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
// get path and ensure it is absolute
|
|
||||||
//String pathAttr = element.getAttribute(ATTRIBUTE_PATH);
|
|
||||||
IPath path = new Path(element.getAttribute(ATTRIBUTE_PATH));
|
|
||||||
if (!path.isAbsolute()) {
|
|
||||||
path = projectPath.append(path);
|
|
||||||
}
|
|
||||||
|
|
||||||
// check fo the base path
|
|
||||||
IPath basePath = new Path(element.getAttribute(ATTRIBUTE_BASE_PATH));
|
|
||||||
|
|
||||||
// get the base ref
|
|
||||||
IPath baseRef = new Path(element.getAttribute(ATTRIBUTE_BASE_REF));
|
|
||||||
|
|
||||||
// source attachment info (optional)
|
|
||||||
IPath sourceAttachmentPath = element.hasAttribute(ATTRIBUTE_SOURCEPATH) ? new Path(
|
|
||||||
element.getAttribute(ATTRIBUTE_SOURCEPATH)) : null;
|
|
||||||
IPath sourceAttachmentRootPath = element.hasAttribute(ATTRIBUTE_ROOTPATH) ? new Path(
|
|
||||||
element.getAttribute(ATTRIBUTE_ROOTPATH)) : null;
|
|
||||||
IPath sourceAttachmentPrefixMapping = element.hasAttribute(ATTRIBUTE_PREFIXMAPPING) ? new Path(
|
|
||||||
element.getAttribute(ATTRIBUTE_PREFIXMAPPING)) : null;
|
|
||||||
|
|
||||||
// exclusion patterns (optional)
|
|
||||||
String exclusion = element.getAttribute(ATTRIBUTE_EXCLUDING);
|
|
||||||
IPath[] exclusionPatterns = APathEntry.NO_EXCLUSION_PATTERNS;
|
|
||||||
if (!exclusion.equals("")) { //$NON-NLS-1$
|
|
||||||
char[][] patterns = CharOperation.splitOn('|', exclusion.toCharArray());
|
|
||||||
int patternCount;
|
|
||||||
if ((patternCount = patterns.length) > 0) {
|
|
||||||
exclusionPatterns = new IPath[patternCount];
|
|
||||||
for (int j = 0; j < patterns.length; j++) {
|
|
||||||
exclusionPatterns[j] = new Path(new String(patterns[j]));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// recreate the entry
|
|
||||||
switch (kind) {
|
|
||||||
case IPathEntry.CDT_PROJECT :
|
|
||||||
return CoreModel.newProjectEntry(path, isExported);
|
|
||||||
case IPathEntry.CDT_LIBRARY :
|
|
||||||
if (!baseRef.isEmpty()) {
|
|
||||||
return CoreModel.newLibraryRefEntry(baseRef, path);
|
|
||||||
}
|
|
||||||
return CoreModel.newLibraryEntry(basePath, path, sourceAttachmentPath, sourceAttachmentRootPath,
|
|
||||||
sourceAttachmentPrefixMapping, isExported);
|
|
||||||
case IPathEntry.CDT_SOURCE :
|
|
||||||
{
|
|
||||||
// must be an entry in this project or specify another
|
|
||||||
// project
|
|
||||||
String projSegment = path.segment(0);
|
|
||||||
if (projSegment != null && projSegment.equals(cProject.getElementName())) { // this
|
|
||||||
// project
|
|
||||||
return CoreModel.newSourceEntry(path, exclusionPatterns);
|
|
||||||
} else { // another project
|
|
||||||
return CoreModel.newProjectEntry(path, isExported);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case IPathEntry.CDT_OUTPUT :
|
|
||||||
{
|
|
||||||
return CoreModel.newOutputEntry(path, exclusionPatterns);
|
|
||||||
}
|
|
||||||
case IPathEntry.CDT_INCLUDE :
|
|
||||||
{
|
|
||||||
// include path info
|
|
||||||
IPath includePath = new Path(element.getAttribute(ATTRIBUTE_INCLUDE));
|
|
||||||
// isSysteminclude
|
|
||||||
boolean isSystemInclude = false;
|
|
||||||
if (element.hasAttribute(ATTRIBUTE_SYSTEM)) {
|
|
||||||
isSystemInclude = element.getAttribute(ATTRIBUTE_SYSTEM).equals(VALUE_TRUE);
|
|
||||||
}
|
|
||||||
if (!baseRef.isEmpty()) {
|
|
||||||
return CoreModel.newIncludeRefEntry(path, baseRef, includePath);
|
|
||||||
}
|
|
||||||
return CoreModel.newIncludeEntry(path, basePath, includePath, isSystemInclude, exclusionPatterns, isExported);
|
|
||||||
}
|
|
||||||
case IPathEntry.CDT_MACRO :
|
|
||||||
{
|
|
||||||
String macroName = element.getAttribute(ATTRIBUTE_NAME);
|
|
||||||
String macroValue = element.getAttribute(ATTRIBUTE_VALUE);
|
|
||||||
if (!baseRef.isEmpty()) {
|
|
||||||
return CoreModel.newMacroRefEntry(path, baseRef, macroName);
|
|
||||||
}
|
|
||||||
return CoreModel.newMacroEntry(path, macroName, macroValue, exclusionPatterns, isExported);
|
|
||||||
}
|
|
||||||
case IPathEntry.CDT_CONTAINER :
|
|
||||||
{
|
|
||||||
IPath id = new Path(element.getAttribute(ATTRIBUTE_PATH));
|
|
||||||
return CoreModel.newContainerEntry(id, isExported);
|
|
||||||
}
|
|
||||||
default :
|
|
||||||
{
|
|
||||||
ICModelStatus status = new CModelStatus(ICModelStatus.ERROR, "PathEntry: unknown kind (" + kindAttr + ")"); //$NON-NLS-1$ //$NON-NLS-2$
|
|
||||||
throw new CModelException(status);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
return store;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void encodePathEntries(IPath projectPath, Document doc, Element configRootElement, IPathEntry[] entries) {
|
/* (non-Javadoc)
|
||||||
Element element;
|
* @see org.eclipse.cdt.core.resources.IPathEntryStoreListener#pathEntryStoreChanged(org.eclipse.cdt.core.resources.PathEntryChangedEvent)
|
||||||
for (int i = 0; i < entries.length; i++) {
|
|
||||||
element = doc.createElement(PATH_ENTRY);
|
|
||||||
|
|
||||||
configRootElement.appendChild(element);
|
|
||||||
int kind = entries[i].getEntryKind();
|
|
||||||
// Set the kind
|
|
||||||
element.setAttribute(ATTRIBUTE_KIND, PathEntry.kindToString(kind));
|
|
||||||
|
|
||||||
// translate the project prefix.
|
|
||||||
IPath xmlPath = entries[i].getPath();
|
|
||||||
if (xmlPath == null) {
|
|
||||||
xmlPath = new Path("");
|
|
||||||
}
|
|
||||||
if (kind != IPathEntry.CDT_CONTAINER) {
|
|
||||||
// translate to project relative from absolute (unless a device path)
|
|
||||||
if (xmlPath.isAbsolute()) {
|
|
||||||
if (projectPath != null && projectPath.isPrefixOf(xmlPath)) {
|
|
||||||
if (xmlPath.segment(0).equals(projectPath.segment(0))) {
|
|
||||||
xmlPath = xmlPath.removeFirstSegments(1);
|
|
||||||
xmlPath = xmlPath.makeRelative();
|
|
||||||
} else {
|
|
||||||
xmlPath = xmlPath.makeAbsolute();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Save the path
|
|
||||||
element.setAttribute(ATTRIBUTE_PATH, xmlPath.toString());
|
|
||||||
|
|
||||||
// Specifics to the entries
|
|
||||||
switch(kind) {
|
|
||||||
case IPathEntry.CDT_SOURCE:
|
|
||||||
case IPathEntry.CDT_OUTPUT:
|
|
||||||
case IPathEntry.CDT_PROJECT:
|
|
||||||
case IPathEntry.CDT_CONTAINER:
|
|
||||||
break;
|
|
||||||
case IPathEntry.CDT_LIBRARY: {
|
|
||||||
ILibraryEntry lib = (ILibraryEntry) entries[i];
|
|
||||||
IPath sourcePath = lib.getSourceAttachmentPath();
|
|
||||||
if (sourcePath != null) {
|
|
||||||
// translate to project relative from absolute
|
|
||||||
if (projectPath != null && projectPath.isPrefixOf(sourcePath)) {
|
|
||||||
if (sourcePath.segment(0).equals(projectPath.segment(0))) {
|
|
||||||
sourcePath = sourcePath.removeFirstSegments(1);
|
|
||||||
sourcePath = sourcePath.makeRelative();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
element.setAttribute(ATTRIBUTE_SOURCEPATH, sourcePath.toString());
|
|
||||||
}
|
|
||||||
if (lib.getSourceAttachmentRootPath() != null) {
|
|
||||||
element.setAttribute(ATTRIBUTE_ROOTPATH, lib.getSourceAttachmentRootPath().toString());
|
|
||||||
}
|
|
||||||
if (lib.getSourceAttachmentPrefixMapping() != null) {
|
|
||||||
element.setAttribute(ATTRIBUTE_PREFIXMAPPING, lib.getSourceAttachmentPrefixMapping().toString());
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case IPathEntry.CDT_INCLUDE: {
|
|
||||||
IIncludeEntry include = (IIncludeEntry) entries[i];
|
|
||||||
IPath includePath = include.getIncludePath();
|
|
||||||
element.setAttribute(ATTRIBUTE_INCLUDE, includePath.toString());
|
|
||||||
if (include.isSystemInclude()) {
|
|
||||||
element.setAttribute(ATTRIBUTE_SYSTEM, VALUE_TRUE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case IPathEntry.CDT_MACRO: {
|
|
||||||
IMacroEntry macro = (IMacroEntry) entries[i];
|
|
||||||
element.setAttribute(ATTRIBUTE_NAME, macro.getMacroName());
|
|
||||||
element.setAttribute(ATTRIBUTE_VALUE, macro.getMacroValue());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (entries[i] instanceof APathEntry) {
|
|
||||||
APathEntry entry = (APathEntry) entries[i];
|
|
||||||
|
|
||||||
// save the basePath or the baseRef
|
|
||||||
IPath basePath = entry.getBasePath();
|
|
||||||
IPath baseRef = entry.getBaseReference();
|
|
||||||
if (basePath != null && !basePath.isEmpty()) {
|
|
||||||
element.setAttribute(ATTRIBUTE_BASE_PATH, basePath.toString());
|
|
||||||
} else if (baseRef != null && !baseRef.isEmpty()) {
|
|
||||||
element.setAttribute(ATTRIBUTE_BASE_REF, baseRef.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Save the exclusions attributes
|
|
||||||
IPath[] exclusionPatterns = entry.getExclusionPatterns();
|
|
||||||
if (exclusionPatterns.length > 0) {
|
|
||||||
StringBuffer excludeRule = new StringBuffer(10);
|
|
||||||
for (int j = 0, max = exclusionPatterns.length; j < max; j++) {
|
|
||||||
if (j > 0) {
|
|
||||||
excludeRule.append('|');
|
|
||||||
}
|
|
||||||
excludeRule.append(exclusionPatterns[j]);
|
|
||||||
}
|
|
||||||
element.setAttribute(ATTRIBUTE_EXCLUDING, excludeRule.toString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Save the export attribute
|
|
||||||
if (entries[i].isExported()) {
|
|
||||||
element.setAttribute(ATTRIBUTE_EXPORTED, VALUE_TRUE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* (non-Javadoc)
|
|
||||||
*
|
|
||||||
* @see org.eclipse.cdt.core.ICDescriptorListener#descriptorChanged(org.eclipse.cdt.core.CDescriptorEvent)
|
|
||||||
*/
|
*/
|
||||||
public void descriptorChanged(CDescriptorEvent event) {
|
public void pathEntryStoreChanged(PathEntryStoreChangedEvent event) {
|
||||||
if (event.getType() == CDescriptorEvent.CDTPROJECT_CHANGED) {
|
IProject project = event.getProject();
|
||||||
ICDescriptor cdesc = event.getDescriptor();
|
if (project != null && (CoreModel.hasCNature(project) || CoreModel.hasCCNature(project))) {
|
||||||
if (cdesc != null) {
|
CModelManager manager = CModelManager.getDefault();
|
||||||
CModelManager manager = CModelManager.getDefault();
|
ICProject cproject = manager.create(project);
|
||||||
IProject project = cdesc.getProject();
|
try {
|
||||||
if (CoreModel.hasCNature(project) || CoreModel.hasCCNature(project)) {
|
IPathEntry[] oldResolvedEntries = getResolvedPathEntries(cproject);
|
||||||
ICProject cproject = manager.create(project);
|
resolvedMap.remove(cproject);
|
||||||
try {
|
IPathEntry[] newResolvedEntries = getResolvedPathEntries(cproject);
|
||||||
IPathEntry[] oldResolvedEntries = getResolvedPathEntries(cproject);
|
ICElementDelta[] deltas = generatePathEntryDeltas(cproject, oldResolvedEntries, newResolvedEntries);
|
||||||
resolvedMap.remove(cproject);
|
if (deltas.length > 0) {
|
||||||
IPathEntry[] newResolvedEntries = getResolvedPathEntries(cproject);
|
cproject.close();
|
||||||
ICElementDelta[] deltas = generatePathEntryDeltas(cproject, oldResolvedEntries, newResolvedEntries);
|
for (int i = 0; i < deltas.length; i++) {
|
||||||
if (deltas.length > 0) {
|
manager.registerCModelDelta(deltas[i]);
|
||||||
cproject.close();
|
|
||||||
for (int i = 0; i < deltas.length; i++) {
|
|
||||||
manager.registerCModelDelta(deltas[i]);
|
|
||||||
}
|
|
||||||
manager.fire(ElementChangedEvent.POST_CHANGE);
|
|
||||||
}
|
|
||||||
} catch (CModelException e) {
|
|
||||||
}
|
}
|
||||||
|
manager.fire(ElementChangedEvent.POST_CHANGE);
|
||||||
}
|
}
|
||||||
|
} catch (CModelException e) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.core.model.IElementChangedListener#elementChanged(org.eclipse.cdt.core.model.ElementChangedEvent)
|
||||||
|
*/
|
||||||
|
public void elementChanged(ElementChangedEvent event) {
|
||||||
|
try {
|
||||||
|
processDelta(event.getDelta());
|
||||||
|
} catch(CModelException e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void processDelta(ICElementDelta delta) throws CModelException {
|
||||||
|
int kind= delta.getKind();
|
||||||
|
int flags= delta.getFlags();
|
||||||
|
ICElement element= delta.getElement();
|
||||||
|
|
||||||
|
//System.out.println("Processing " + element);
|
||||||
|
|
||||||
|
// handle closing and removing of projects
|
||||||
|
if (((flags & ICElementDelta.F_CLOSED) != 0) || (kind == ICElementDelta.REMOVED)) {
|
||||||
|
if (element.getElementType() == ICElement.C_PROJECT) {
|
||||||
|
IProject project = element.getCProject().getProject();
|
||||||
|
IPathEntryStore store = (IPathEntryStore)storeMap.remove(project);
|
||||||
|
store.removePathEntryStoreListener(this);
|
||||||
|
resolvedMap.remove(project);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ICElementDelta[] affectedChildren= delta.getAffectedChildren();
|
||||||
|
for (int i= 0; i < affectedChildren.length; i++) {
|
||||||
|
processDelta(affectedChildren[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -0,0 +1,371 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* Copyright (c) 2002,2003,2004 QNX Software Systems and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Common Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/cpl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* QNX Software Systems - Initial API and implementation
|
||||||
|
***********************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.cdt.internal.core.model;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.AbstractCExtension;
|
||||||
|
import org.eclipse.cdt.core.CCorePlugin;
|
||||||
|
import org.eclipse.cdt.core.CDescriptorEvent;
|
||||||
|
import org.eclipse.cdt.core.ICDescriptor;
|
||||||
|
import org.eclipse.cdt.core.ICDescriptorListener;
|
||||||
|
import org.eclipse.cdt.core.model.CModelException;
|
||||||
|
import org.eclipse.cdt.core.model.CoreModel;
|
||||||
|
import org.eclipse.cdt.core.model.ICModelStatus;
|
||||||
|
import org.eclipse.cdt.core.model.IIncludeEntry;
|
||||||
|
import org.eclipse.cdt.core.model.ILibraryEntry;
|
||||||
|
import org.eclipse.cdt.core.model.IMacroEntry;
|
||||||
|
import org.eclipse.cdt.core.model.IPathEntry;
|
||||||
|
import org.eclipse.cdt.core.resources.IPathEntryStore;
|
||||||
|
import org.eclipse.cdt.core.resources.IPathEntryStoreListener;
|
||||||
|
import org.eclipse.cdt.core.resources.PathEntryStoreChangedEvent;
|
||||||
|
import org.eclipse.cdt.internal.core.CharOperation;
|
||||||
|
import org.eclipse.core.resources.IProject;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.IPath;
|
||||||
|
import org.eclipse.core.runtime.Path;
|
||||||
|
import org.w3c.dom.Document;
|
||||||
|
import org.w3c.dom.Element;
|
||||||
|
import org.w3c.dom.Node;
|
||||||
|
import org.w3c.dom.NodeList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PathEntryStore
|
||||||
|
*/
|
||||||
|
public class PathEntryStore extends AbstractCExtension implements IPathEntryStore, ICDescriptorListener {
|
||||||
|
|
||||||
|
static String PATH_ENTRY = "pathentry"; //$NON-NLS-1$
|
||||||
|
static String PATH_ENTRY_ID = "org.eclipse.cdt.core.pathentry"; //$NON-NLS-1$
|
||||||
|
static String ATTRIBUTE_KIND = "kind"; //$NON-NLS-1$
|
||||||
|
static String ATTRIBUTE_PATH = "path"; //$NON-NLS-1$
|
||||||
|
static String ATTRIBUTE_BASE_PATH = "base-path"; //$NON-NLS-1$
|
||||||
|
static String ATTRIBUTE_BASE_REF = "base-ref"; //$NON-NLS-1$
|
||||||
|
static String ATTRIBUTE_EXPORTED = "exported"; //$NON-NLS-1$
|
||||||
|
static String ATTRIBUTE_SOURCEPATH = "sourcepath"; //$NON-NLS-1$
|
||||||
|
static String ATTRIBUTE_ROOTPATH = "roopath"; //$NON-NLS-1$
|
||||||
|
static String ATTRIBUTE_PREFIXMAPPING = "prefixmapping"; //$NON-NLS-1$
|
||||||
|
static String ATTRIBUTE_EXCLUDING = "excluding"; //$NON-NLS-1$
|
||||||
|
static String ATTRIBUTE_INCLUDE = "include"; //$NON-NLS-1$
|
||||||
|
static String ATTRIBUTE_SYSTEM = "system"; //$NON-NLS-1$
|
||||||
|
static String ATTRIBUTE_NAME = "name"; //$NON-NLS-1$
|
||||||
|
static String ATTRIBUTE_VALUE = "value"; //$NON-NLS-1$
|
||||||
|
static String VALUE_TRUE = "true"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
static final IPathEntry[] NO_PATHENTRIES = new IPathEntry[0];
|
||||||
|
|
||||||
|
List listeners;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public PathEntryStore() {
|
||||||
|
super();
|
||||||
|
listeners = Collections.synchronizedList(new ArrayList());
|
||||||
|
// Register the Core Model on the Descriptor
|
||||||
|
// Manager, it needs to know about changes.
|
||||||
|
CCorePlugin.getDefault().getCDescriptorManager().addDescriptorListener(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IPathEntry[] getRawPathEntries(IProject project) throws CoreException {
|
||||||
|
ArrayList pathEntries = new ArrayList();
|
||||||
|
ICDescriptor cdesc = CCorePlugin.getDefault().getCProjectDescription(project);
|
||||||
|
Element element = cdesc.getProjectData(PATH_ENTRY_ID);
|
||||||
|
NodeList list = element.getChildNodes();
|
||||||
|
for (int i = 0; i < list.getLength(); i++) {
|
||||||
|
Node childNode = list.item(i);
|
||||||
|
if (childNode.getNodeType() == Node.ELEMENT_NODE) {
|
||||||
|
if (childNode.getNodeName().equals(PATH_ENTRY)) {
|
||||||
|
pathEntries.add(decodePathEntry(project, (Element) childNode));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (IPathEntry[]) pathEntries.toArray(NO_PATHENTRIES);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRawPathEntries(IProject project, IPathEntry[] newRawEntries) throws CoreException {
|
||||||
|
ICDescriptor descriptor = CCorePlugin.getDefault().getCProjectDescription(project);
|
||||||
|
Element rootElement = descriptor.getProjectData(PATH_ENTRY_ID);
|
||||||
|
// Clear out all current children
|
||||||
|
Node child = rootElement.getFirstChild();
|
||||||
|
while (child != null) {
|
||||||
|
rootElement.removeChild(child);
|
||||||
|
child = rootElement.getFirstChild();
|
||||||
|
}
|
||||||
|
// Save the entries
|
||||||
|
if (newRawEntries != null && newRawEntries.length > 0) {
|
||||||
|
// Serialize the include paths
|
||||||
|
Document doc = rootElement.getOwnerDocument();
|
||||||
|
encodePathEntries(project.getFullPath(), doc, rootElement, newRawEntries);
|
||||||
|
}
|
||||||
|
descriptor.saveProjectData();
|
||||||
|
}
|
||||||
|
|
||||||
|
static IPathEntry decodePathEntry(IProject project, Element element) throws CModelException {
|
||||||
|
IPath projectPath = project.getFullPath();
|
||||||
|
|
||||||
|
// kind
|
||||||
|
String kindAttr = element.getAttribute(ATTRIBUTE_KIND);
|
||||||
|
int kind = PathEntry.kindFromString(kindAttr);
|
||||||
|
|
||||||
|
// exported flag
|
||||||
|
boolean isExported = false;
|
||||||
|
if (element.hasAttribute(ATTRIBUTE_EXPORTED)) {
|
||||||
|
isExported = element.getAttribute(ATTRIBUTE_EXPORTED).equals(VALUE_TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
// get path and ensure it is absolute
|
||||||
|
//String pathAttr = element.getAttribute(ATTRIBUTE_PATH);
|
||||||
|
IPath path = new Path(element.getAttribute(ATTRIBUTE_PATH));
|
||||||
|
if (!path.isAbsolute()) {
|
||||||
|
path = projectPath.append(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
// check fo the base path
|
||||||
|
IPath basePath = new Path(element.getAttribute(ATTRIBUTE_BASE_PATH));
|
||||||
|
|
||||||
|
// get the base ref
|
||||||
|
IPath baseRef = new Path(element.getAttribute(ATTRIBUTE_BASE_REF));
|
||||||
|
|
||||||
|
// source attachment info (optional)
|
||||||
|
IPath sourceAttachmentPath = element.hasAttribute(ATTRIBUTE_SOURCEPATH) ? new Path(
|
||||||
|
element.getAttribute(ATTRIBUTE_SOURCEPATH)) : null;
|
||||||
|
IPath sourceAttachmentRootPath = element.hasAttribute(ATTRIBUTE_ROOTPATH) ? new Path(
|
||||||
|
element.getAttribute(ATTRIBUTE_ROOTPATH)) : null;
|
||||||
|
IPath sourceAttachmentPrefixMapping = element.hasAttribute(ATTRIBUTE_PREFIXMAPPING) ? new Path(
|
||||||
|
element.getAttribute(ATTRIBUTE_PREFIXMAPPING)) : null;
|
||||||
|
|
||||||
|
// exclusion patterns (optional)
|
||||||
|
String exclusion = element.getAttribute(ATTRIBUTE_EXCLUDING);
|
||||||
|
IPath[] exclusionPatterns = APathEntry.NO_EXCLUSION_PATTERNS;
|
||||||
|
if (!exclusion.equals("")) { //$NON-NLS-1$
|
||||||
|
char[][] patterns = CharOperation.splitOn('|', exclusion.toCharArray());
|
||||||
|
int patternCount;
|
||||||
|
if ((patternCount = patterns.length) > 0) {
|
||||||
|
exclusionPatterns = new IPath[patternCount];
|
||||||
|
for (int j = 0; j < patterns.length; j++) {
|
||||||
|
exclusionPatterns[j] = new Path(new String(patterns[j]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// recreate the entry
|
||||||
|
switch (kind) {
|
||||||
|
case IPathEntry.CDT_PROJECT :
|
||||||
|
return CoreModel.newProjectEntry(path, isExported);
|
||||||
|
case IPathEntry.CDT_LIBRARY :
|
||||||
|
if (!baseRef.isEmpty()) {
|
||||||
|
return CoreModel.newLibraryRefEntry(baseRef, path);
|
||||||
|
}
|
||||||
|
return CoreModel.newLibraryEntry(basePath, path, sourceAttachmentPath, sourceAttachmentRootPath,
|
||||||
|
sourceAttachmentPrefixMapping, isExported);
|
||||||
|
case IPathEntry.CDT_SOURCE :
|
||||||
|
{
|
||||||
|
// must be an entry in this project or specify another
|
||||||
|
// project
|
||||||
|
String projSegment = path.segment(0);
|
||||||
|
if (projSegment != null && projSegment.equals(project.getName())) { // this
|
||||||
|
// project
|
||||||
|
return CoreModel.newSourceEntry(path, exclusionPatterns);
|
||||||
|
} else { // another project
|
||||||
|
return CoreModel.newProjectEntry(path, isExported);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case IPathEntry.CDT_OUTPUT :
|
||||||
|
{
|
||||||
|
return CoreModel.newOutputEntry(path, exclusionPatterns);
|
||||||
|
}
|
||||||
|
case IPathEntry.CDT_INCLUDE :
|
||||||
|
{
|
||||||
|
// include path info
|
||||||
|
IPath includePath = new Path(element.getAttribute(ATTRIBUTE_INCLUDE));
|
||||||
|
// isSysteminclude
|
||||||
|
boolean isSystemInclude = false;
|
||||||
|
if (element.hasAttribute(ATTRIBUTE_SYSTEM)) {
|
||||||
|
isSystemInclude = element.getAttribute(ATTRIBUTE_SYSTEM).equals(VALUE_TRUE);
|
||||||
|
}
|
||||||
|
if (!baseRef.isEmpty()) {
|
||||||
|
return CoreModel.newIncludeRefEntry(path, baseRef, includePath);
|
||||||
|
}
|
||||||
|
return CoreModel.newIncludeEntry(path, basePath, includePath, isSystemInclude, exclusionPatterns, isExported);
|
||||||
|
}
|
||||||
|
case IPathEntry.CDT_MACRO :
|
||||||
|
{
|
||||||
|
String macroName = element.getAttribute(ATTRIBUTE_NAME);
|
||||||
|
String macroValue = element.getAttribute(ATTRIBUTE_VALUE);
|
||||||
|
if (!baseRef.isEmpty()) {
|
||||||
|
return CoreModel.newMacroRefEntry(path, baseRef, macroName);
|
||||||
|
}
|
||||||
|
return CoreModel.newMacroEntry(path, macroName, macroValue, exclusionPatterns, isExported);
|
||||||
|
}
|
||||||
|
case IPathEntry.CDT_CONTAINER :
|
||||||
|
{
|
||||||
|
IPath id = new Path(element.getAttribute(ATTRIBUTE_PATH));
|
||||||
|
return CoreModel.newContainerEntry(id, isExported);
|
||||||
|
}
|
||||||
|
default :
|
||||||
|
{
|
||||||
|
ICModelStatus status = new CModelStatus(ICModelStatus.ERROR, "PathEntry: unknown kind (" + kindAttr + ")"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||||
|
throw new CModelException(status);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void encodePathEntries(IPath projectPath, Document doc, Element configRootElement, IPathEntry[] entries) {
|
||||||
|
Element element;
|
||||||
|
for (int i = 0; i < entries.length; i++) {
|
||||||
|
element = doc.createElement(PATH_ENTRY);
|
||||||
|
|
||||||
|
configRootElement.appendChild(element);
|
||||||
|
int kind = entries[i].getEntryKind();
|
||||||
|
// Set the kind
|
||||||
|
element.setAttribute(ATTRIBUTE_KIND, PathEntry.kindToString(kind));
|
||||||
|
|
||||||
|
// translate the project prefix.
|
||||||
|
IPath xmlPath = entries[i].getPath();
|
||||||
|
if (xmlPath == null) {
|
||||||
|
xmlPath = new Path("");
|
||||||
|
}
|
||||||
|
if (kind != IPathEntry.CDT_CONTAINER) {
|
||||||
|
// translate to project relative from absolute (unless a device path)
|
||||||
|
if (xmlPath.isAbsolute()) {
|
||||||
|
if (projectPath != null && projectPath.isPrefixOf(xmlPath)) {
|
||||||
|
if (xmlPath.segment(0).equals(projectPath.segment(0))) {
|
||||||
|
xmlPath = xmlPath.removeFirstSegments(1);
|
||||||
|
xmlPath = xmlPath.makeRelative();
|
||||||
|
} else {
|
||||||
|
xmlPath = xmlPath.makeAbsolute();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Save the path
|
||||||
|
element.setAttribute(ATTRIBUTE_PATH, xmlPath.toString());
|
||||||
|
|
||||||
|
// Specifics to the entries
|
||||||
|
switch(kind) {
|
||||||
|
case IPathEntry.CDT_SOURCE:
|
||||||
|
case IPathEntry.CDT_OUTPUT:
|
||||||
|
case IPathEntry.CDT_PROJECT:
|
||||||
|
case IPathEntry.CDT_CONTAINER:
|
||||||
|
break;
|
||||||
|
case IPathEntry.CDT_LIBRARY: {
|
||||||
|
ILibraryEntry lib = (ILibraryEntry) entries[i];
|
||||||
|
IPath sourcePath = lib.getSourceAttachmentPath();
|
||||||
|
if (sourcePath != null) {
|
||||||
|
// translate to project relative from absolute
|
||||||
|
if (projectPath != null && projectPath.isPrefixOf(sourcePath)) {
|
||||||
|
if (sourcePath.segment(0).equals(projectPath.segment(0))) {
|
||||||
|
sourcePath = sourcePath.removeFirstSegments(1);
|
||||||
|
sourcePath = sourcePath.makeRelative();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
element.setAttribute(ATTRIBUTE_SOURCEPATH, sourcePath.toString());
|
||||||
|
}
|
||||||
|
if (lib.getSourceAttachmentRootPath() != null) {
|
||||||
|
element.setAttribute(ATTRIBUTE_ROOTPATH, lib.getSourceAttachmentRootPath().toString());
|
||||||
|
}
|
||||||
|
if (lib.getSourceAttachmentPrefixMapping() != null) {
|
||||||
|
element.setAttribute(ATTRIBUTE_PREFIXMAPPING, lib.getSourceAttachmentPrefixMapping().toString());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case IPathEntry.CDT_INCLUDE: {
|
||||||
|
IIncludeEntry include = (IIncludeEntry) entries[i];
|
||||||
|
IPath includePath = include.getIncludePath();
|
||||||
|
element.setAttribute(ATTRIBUTE_INCLUDE, includePath.toString());
|
||||||
|
if (include.isSystemInclude()) {
|
||||||
|
element.setAttribute(ATTRIBUTE_SYSTEM, VALUE_TRUE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case IPathEntry.CDT_MACRO: {
|
||||||
|
IMacroEntry macro = (IMacroEntry) entries[i];
|
||||||
|
element.setAttribute(ATTRIBUTE_NAME, macro.getMacroName());
|
||||||
|
element.setAttribute(ATTRIBUTE_VALUE, macro.getMacroValue());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (entries[i] instanceof APathEntry) {
|
||||||
|
APathEntry entry = (APathEntry) entries[i];
|
||||||
|
|
||||||
|
// save the basePath or the baseRef
|
||||||
|
IPath basePath = entry.getBasePath();
|
||||||
|
IPath baseRef = entry.getBaseReference();
|
||||||
|
if (basePath != null && !basePath.isEmpty()) {
|
||||||
|
element.setAttribute(ATTRIBUTE_BASE_PATH, basePath.toString());
|
||||||
|
} else if (baseRef != null && !baseRef.isEmpty()) {
|
||||||
|
element.setAttribute(ATTRIBUTE_BASE_REF, baseRef.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Save the exclusions attributes
|
||||||
|
IPath[] exclusionPatterns = entry.getExclusionPatterns();
|
||||||
|
if (exclusionPatterns.length > 0) {
|
||||||
|
StringBuffer excludeRule = new StringBuffer(10);
|
||||||
|
for (int j = 0, max = exclusionPatterns.length; j < max; j++) {
|
||||||
|
if (j > 0) {
|
||||||
|
excludeRule.append('|');
|
||||||
|
}
|
||||||
|
excludeRule.append(exclusionPatterns[j]);
|
||||||
|
}
|
||||||
|
element.setAttribute(ATTRIBUTE_EXCLUDING, excludeRule.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Save the export attribute
|
||||||
|
if (entries[i].isExported()) {
|
||||||
|
element.setAttribute(ATTRIBUTE_EXPORTED, VALUE_TRUE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see org.eclipse.cdt.core.ICDescriptorListener#descriptorChanged(org.eclipse.cdt.core.CDescriptorEvent)
|
||||||
|
*/
|
||||||
|
public void descriptorChanged(CDescriptorEvent event) {
|
||||||
|
if (event.getType() == CDescriptorEvent.CDTPROJECT_CHANGED) {
|
||||||
|
ICDescriptor cdesc = event.getDescriptor();
|
||||||
|
if (cdesc != null) {
|
||||||
|
CModelManager manager = CModelManager.getDefault();
|
||||||
|
IProject project = cdesc.getProject();
|
||||||
|
// Call the listeners.
|
||||||
|
PathEntryStoreChangedEvent evt = new PathEntryStoreChangedEvent(project);
|
||||||
|
IPathEntryStoreListener[] observers = new IPathEntryStoreListener[listeners.size()];
|
||||||
|
listeners.toArray(observers);
|
||||||
|
for (int i = 0; i < observers.length; i++) {
|
||||||
|
observers[i].pathEntryStoreChanged(evt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.core.resources.IPathEntryStore#addPathEntryStoreListener(org.eclipse.cdt.core.resources.IPathEntryStoreListener)
|
||||||
|
*/
|
||||||
|
public void addPathEntryStoreListener(IPathEntryStoreListener listener) {
|
||||||
|
listeners.add(listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.core.resources.IPathEntryStore#removePathEntryStoreListener(org.eclipse.cdt.core.resources.IPathEntryStoreListener)
|
||||||
|
*/
|
||||||
|
public void removePathEntryStoreListener(IPathEntryStoreListener listener) {
|
||||||
|
listeners.remove(listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -39,6 +39,12 @@
|
||||||
<!-- Extension Point: IBinaryParser, use to detect wheter an IFile is a binary -->
|
<!-- Extension Point: IBinaryParser, use to detect wheter an IFile is a binary -->
|
||||||
<!-- =================================================================================== -->
|
<!-- =================================================================================== -->
|
||||||
<extension-point id="BinaryParser" name="BinaryParser"/>
|
<extension-point id="BinaryParser" name="BinaryParser"/>
|
||||||
|
<!-- =================================================================================== -->
|
||||||
|
<!-- Extension Point: IPathEntryStore, use to provide a storage for PathEtnry -->
|
||||||
|
<!-- =================================================================================== -->
|
||||||
|
<extension-point id="PathEntryStore" name="PathEntryStore"/>
|
||||||
|
<!-- =================================================================================== -->
|
||||||
|
<!-- =================================================================================== -->
|
||||||
<extension-point id="ScannerInfoProvider" name="Scanner Information Provider"/>
|
<extension-point id="ScannerInfoProvider" name="Scanner Information Provider"/>
|
||||||
<!-- =================================================================================== -->
|
<!-- =================================================================================== -->
|
||||||
<!-- Extension Point: CFileType and CFileTypeAssociation for translation unit ident -->
|
<!-- Extension Point: CFileType and CFileTypeAssociation for translation unit ident -->
|
||||||
|
@ -92,6 +98,20 @@
|
||||||
</cextension>
|
</cextension>
|
||||||
</extension>
|
</extension>
|
||||||
<!-- =================================================================================== -->
|
<!-- =================================================================================== -->
|
||||||
|
<!-- Define the default PathEntry store provided by the CDT -->
|
||||||
|
<!-- =================================================================================== -->
|
||||||
|
<extension
|
||||||
|
id="cdtPathEntryStore"
|
||||||
|
name="Path Entry Store"
|
||||||
|
point="org.eclipse.cdt.core.PathEntryStore">
|
||||||
|
<cextension>
|
||||||
|
<run
|
||||||
|
class="org.eclipse.cdt.internal.core.model.PathEntryStore">
|
||||||
|
</run>
|
||||||
|
</cextension>
|
||||||
|
</extension>
|
||||||
|
|
||||||
|
<!-- =================================================================================== -->
|
||||||
<!-- Define the list of Error Parser provided by the CDT -->
|
<!-- Define the list of Error Parser provided by the CDT -->
|
||||||
<!-- =================================================================================== -->
|
<!-- =================================================================================== -->
|
||||||
<extension
|
<extension
|
||||||
|
|
|
@ -24,6 +24,7 @@ import org.eclipse.cdt.core.model.CoreModel;
|
||||||
import org.eclipse.cdt.core.model.IWorkingCopy;
|
import org.eclipse.cdt.core.model.IWorkingCopy;
|
||||||
import org.eclipse.cdt.core.parser.IScannerInfoProvider;
|
import org.eclipse.cdt.core.parser.IScannerInfoProvider;
|
||||||
import org.eclipse.cdt.core.resources.IConsole;
|
import org.eclipse.cdt.core.resources.IConsole;
|
||||||
|
import org.eclipse.cdt.core.resources.IPathEntryStore;
|
||||||
import org.eclipse.cdt.core.search.SearchEngine;
|
import org.eclipse.cdt.core.search.SearchEngine;
|
||||||
import org.eclipse.cdt.internal.core.CDTLogWriter;
|
import org.eclipse.cdt.internal.core.CDTLogWriter;
|
||||||
import org.eclipse.cdt.internal.core.CDescriptorManager;
|
import org.eclipse.cdt.internal.core.CDescriptorManager;
|
||||||
|
@ -75,6 +76,12 @@ public class CCorePlugin extends Plugin {
|
||||||
|
|
||||||
public final static String ERROR_PARSER_SIMPLE_ID = "ErrorParser"; //$NON-NLS-1$
|
public final static String ERROR_PARSER_SIMPLE_ID = "ErrorParser"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
// PathEntry extension
|
||||||
|
public final static String PATHENTRY_STORE_ID = "PathEntryStore"; //$NON-NLS-1$
|
||||||
|
public final static String PATHENTRY_STORE_UNIQ_ID = PLUGIN_ID + "." + PATHENTRY_STORE_ID; //$NON-NLS-1$
|
||||||
|
// default store for pathentry
|
||||||
|
public final static String DEFAULT_PATHENTRY_STORE_ID = PLUGIN_ID + ".cdtPathEntryStore"; //$NON-NLS-1$
|
||||||
|
|
||||||
// Build Model Interface Discovery
|
// Build Model Interface Discovery
|
||||||
public final static String BUILD_SCANNER_INFO_SIMPLE_ID = "ScannerInfoProvider"; //$NON-NLS-1$
|
public final static String BUILD_SCANNER_INFO_SIMPLE_ID = "ScannerInfoProvider"; //$NON-NLS-1$
|
||||||
public final static String BUILD_SCANNER_INFO_UNIQ_ID = PLUGIN_ID + "." + BUILD_SCANNER_INFO_SIMPLE_ID; //$NON-NLS-1$
|
public final static String BUILD_SCANNER_INFO_UNIQ_ID = PLUGIN_ID + "." + BUILD_SCANNER_INFO_SIMPLE_ID; //$NON-NLS-1$
|
||||||
|
@ -620,6 +627,53 @@ public class CCorePlugin extends Plugin {
|
||||||
return parser;
|
return parser;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public IPathEntryStore getPathEntryStore(IProject project) throws CoreException {
|
||||||
|
IPathEntryStore store = null;
|
||||||
|
if (project != null) {
|
||||||
|
try {
|
||||||
|
ICDescriptor cdesc = getCProjectDescription(project);
|
||||||
|
ICExtensionReference[] cextensions = cdesc.get(PATHENTRY_STORE_UNIQ_ID, true);
|
||||||
|
if (cextensions.length > 0) {
|
||||||
|
ArrayList list = new ArrayList(cextensions.length);
|
||||||
|
for (int i = 0; i < cextensions.length; i++) {
|
||||||
|
try {
|
||||||
|
store = (IPathEntryStore) cextensions[i].createExtension();
|
||||||
|
break;
|
||||||
|
} catch (ClassCastException e) {
|
||||||
|
//
|
||||||
|
log(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (CoreException e) {
|
||||||
|
// ignore since we fall back to a default....
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (store == null) {
|
||||||
|
store = getDefaultPathEntryStore();
|
||||||
|
}
|
||||||
|
return store;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IPathEntryStore getDefaultPathEntryStore() throws CoreException {
|
||||||
|
IPathEntryStore store = null;
|
||||||
|
IExtensionPoint extensionPoint = getDescriptor().getExtensionPoint(PATHENTRY_STORE_ID);
|
||||||
|
IExtension extension = extensionPoint.getExtension(DEFAULT_PATHENTRY_STORE_ID);
|
||||||
|
if (extension != null) {
|
||||||
|
IConfigurationElement element[] = extension.getConfigurationElements();
|
||||||
|
for (int i = 0; i < element.length; i++) {
|
||||||
|
if (element[i].getName().equalsIgnoreCase("cextension")) { //$NON-NLS-1$
|
||||||
|
store = (IPathEntryStore) element[i].createExecutableExtension("run"); //$NON-NLS-1$
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
IStatus s = new Status(IStatus.ERROR, CCorePlugin.PLUGIN_ID, -1, CCorePlugin.getResourceString("CCorePlugin.exception.noBinaryFormat"), null); //$NON-NLS-1$
|
||||||
|
throw new CoreException(s);
|
||||||
|
}
|
||||||
|
return store;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the file type object corresponding to the provided
|
* Returns the file type object corresponding to the provided
|
||||||
* file name.
|
* file name.
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* Copyright (c) 2002,2003,2004 QNX Software Systems and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Common Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/cpl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* QNX Software Systems - Initial API and implementation
|
||||||
|
***********************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.cdt.core.resources;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.model.IPathEntry;
|
||||||
|
import org.eclipse.core.resources.IProject;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* IPathEntryStore
|
||||||
|
*/
|
||||||
|
public interface IPathEntryStore {
|
||||||
|
|
||||||
|
IPathEntry[] getRawPathEntries(IProject project) throws CoreException;
|
||||||
|
void setRawPathEntries(IProject project, IPathEntry[] engries) throws CoreException;
|
||||||
|
void addPathEntryStoreListener(IPathEntryStoreListener listener);
|
||||||
|
void removePathEntryStoreListener(IPathEntryStoreListener listener);
|
||||||
|
}
|
|
@ -0,0 +1,25 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* Copyright (c) 2002,2003,2004 QNX Software Systems and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Common Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/cpl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* QNX Software Systems - Initial API and implementation
|
||||||
|
***********************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.cdt.core.resources;
|
||||||
|
|
||||||
|
import java.util.EventListener;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* IPathEntryStoreListener
|
||||||
|
*/
|
||||||
|
public interface IPathEntryStoreListener extends EventListener {
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param event
|
||||||
|
*/
|
||||||
|
void pathEntryStoreChanged(PathEntryStoreChangedEvent event);
|
||||||
|
}
|
|
@ -0,0 +1,33 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* Copyright (c) 2002,2003,2004 QNX Software Systems and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Common Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/cpl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* QNX Software Systems - Initial API and implementation
|
||||||
|
***********************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.cdt.core.resources;
|
||||||
|
|
||||||
|
import java.util.EventObject;
|
||||||
|
|
||||||
|
import org.eclipse.core.resources.IProject;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PathEntryChangedEvent
|
||||||
|
*/
|
||||||
|
public class PathEntryStoreChangedEvent extends EventObject {
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public PathEntryStoreChangedEvent(Object object) {
|
||||||
|
super(object);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IProject getProject() {
|
||||||
|
return (IProject)getSource();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue