diff --git a/core/org.eclipse.cdt.core/ChangeLog b/core/org.eclipse.cdt.core/ChangeLog index 95f055b746f..4a29a3f0266 100644 --- a/core/org.eclipse.cdt.core/ChangeLog +++ b/core/org.eclipse.cdt.core/ChangeLog @@ -1,3 +1,25 @@ +2004-04-03 Alain Magloire + + Draft work on LibraryReferences and IncludeReferences. + + * model/org/eclipse/cdt/core/model/CoreModel.java + * model/org/eclipse/cdt/core/model/ICProject.java + * model/org/eclipse/cdt/core/model/IIncludeEntry.java + * model/org/eclipse/cdt/core/model/IIncludeReference.java + * model/org/eclipse/cdt/core/model/ILibararyentry.java + * model/org/eclipse/cdt/core/model/IPathEntry.java + + * model/org/eclipse/cdt/internal/core/model/APathEntry.java + * model/org/eclipse/cdt/internal/core/model/CProject.java + * model/org/eclipse/cdt/internal/core/model/CProjectInfo.java + * model/org/eclipse/cdt/internal/core/model/IncludeEntry.java + * model/org/eclipse/cdt/internal/core/model/IncludeReference.java + * model/org/eclipse/cdt/internal/core/model/LibraryEntry.java + * model/org/eclipse/cdt/internal/core/model/LibraryReferenceArchive.java + * model/org/eclipse/cdt/internal/core/model/LibraryReferenceShared.java + * model/org/eclipse/cdt/internal/core/model/MacroEntry.java + * model/org/eclipse/cdt/internal/core/model/PathEntryManager.java + 2004-04-03 Alain Magloire Fix for PR 57287 diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/CoreModel.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/CoreModel.java index bb1d6ea9b6d..d2107f51b96 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/CoreModel.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/CoreModel.java @@ -267,7 +267,7 @@ public class CoreModel { *

* * @param path - * the absolute path of the binary archive + * the absolute path of the library * @param sourceAttachmentPath * the absolute path of the corresponding source archive or * folder, or null if none. @@ -279,9 +279,9 @@ public class CoreModel { * @return a new library entry * */ - public static ILibraryEntry newLibraryEntry(IPath path, IPath sourceAttachmentPath, IPath sourceAttachmentRootPath, + public static ILibraryEntry newLibraryEntry(IPath libraryPath, IPath sourceAttachmentPath, IPath sourceAttachmentRootPath, IPath sourceAttachmentPrefixMapping) { - return newLibraryEntry(path, sourceAttachmentPath, sourceAttachmentRootPath, sourceAttachmentPrefixMapping, false); + return newLibraryEntry(libraryPath, null, sourceAttachmentPath, sourceAttachmentRootPath, sourceAttachmentPrefixMapping, false); } /** @@ -293,7 +293,9 @@ public class CoreModel { *

* * @param path - * the absolute path of the binary archive + * the path of the library + * @param path + * the base path of the library * @param sourceAttachmentPath * the absolute path of the corresponding source archive or * folder, or null if none. @@ -305,9 +307,9 @@ public class CoreModel { * @return a new library entry * */ - public static ILibraryEntry newLibraryEntry(IPath path, IPath sourceAttachmentPath, IPath sourceAttachmentRootPath, + public static ILibraryEntry newLibraryEntry(IPath libraryPath, IPath basePath, IPath sourceAttachmentPath, IPath sourceAttachmentRootPath, IPath sourceAttachmentPrefixMapping, boolean isExported) { - return new LibraryEntry(path, sourceAttachmentPath, sourceAttachmentRootPath, sourceAttachmentPrefixMapping, isExported); + return new LibraryEntry(libraryPath, basePath, sourceAttachmentPath, sourceAttachmentRootPath, sourceAttachmentPrefixMapping, isExported); } /** @@ -391,6 +393,17 @@ public class CoreModel { return new SourceEntry(path, exclusionPatterns); } + /** + * Creates and returns a new entry of kind CDT_INCLUDE + * + * @param includePath + * the absolute path of the include + * @return IIncludeEntry + */ + public static IIncludeEntry newIncludeEntry(IPath includePath) { + return newIncludeEntry(null, includePath, false); + } + /** * Creates and returns a new entry of kind CDT_INCLUDE * @@ -404,17 +417,6 @@ public class CoreModel { return newIncludeEntry(resourcePath, includePath, false); } - /** - * Creates and returns a new entry of kind CDT_INCLUDE - * - * @param includePath - * the absolute path of the include - * @return IIncludeEntry - */ - public static IIncludeEntry newIncludeEntry(IPath includePath) { - return newIncludeEntry(null, includePath, false); - } - /** * * Creates and returns a new entry of kind CDT_INCLUDE * @@ -428,7 +430,7 @@ public class CoreModel { * @return IIncludeEntry */ public static IIncludeEntry newIncludeEntry(IPath resourcePath, IPath includePath, boolean isSystemInclude) { - return newIncludeEntry(resourcePath, includePath, isSystemInclude, IncludeEntry.NO_EXCLUSION_PATTERNS); + return newIncludeEntry(resourcePath, includePath, null, isSystemInclude, IncludeEntry.NO_EXCLUSION_PATTERNS); } /** @@ -448,9 +450,32 @@ public class CoreModel { * exclusion patterns in the resource if a container * @return IIincludeEntry */ - public static IIncludeEntry newIncludeEntry(IPath resourcePath, IPath includePath, boolean isSystemInclude, + public static IIncludeEntry newIncludeEntry(IPath resourcePath, IPath includePath, boolean isSystemInclude, IPath[] exclusionPathterns) { + return newIncludeEntry(resourcePath, includePath, null, isSystemInclude, exclusionPathterns); + } + + /** + * Creates and returns a new entry of kind CDT_INCLUDE + * + * @param path + * the affected project-relative resource path + * @param includePath + * the path of the include + * @param basePath + * the base path of the include + * @param isSystemInclude + * wheter this include path should be consider the system + * include path + * @param isRecursive + * if the resource is a folder the include applied to all + * recursively + * @param exclusionPatterns + * exclusion patterns in the resource if a container + * @return IIincludeEntry + */ + public static IIncludeEntry newIncludeEntry(IPath resourcePath, IPath includePath, IPath basePath, boolean isSystemInclude, IPath[] exclusionPatterns) { - return new IncludeEntry(resourcePath, includePath, isSystemInclude, exclusionPatterns); + return new IncludeEntry(resourcePath, includePath, basePath, isSystemInclude, exclusionPatterns); } /** @@ -465,7 +490,7 @@ public class CoreModel { * @return */ public static IMacroEntry newMacroEntry(String macroName, String macroValue) { - return newMacroEntry(null, macroName, macroValue, MacroEntry.NO_EXCLUSION_PATTERNS); + return newMacroEntry(null, macroName, macroValue); } /** @@ -479,8 +504,23 @@ public class CoreModel { * the value of the macro * @return */ - public static IMacroEntry newMacroEntry(IPath path, String macroName, String macroValue) { - return newMacroEntry(path, macroName, macroValue, MacroEntry.NO_EXCLUSION_PATTERNS); + public static IMacroEntry newMacroEntry(IPath basePath, String macroName) { + return newMacroEntry(null, basePath, macroName, null, MacroEntry.NO_EXCLUSION_PATTERNS); + } + + /** + * Creates and returns an entry kind CDT_MACRO + * + * @param path + * the affected workspace-relative resource path + * @param macroName + * the name of the macro + * @param macroValue + * the value of the macro + * @return + */ + public static IMacroEntry newMacroEntry(IPath resourcePath, String macroName, String macroValue) { + return newMacroEntry(resourcePath, macroName, macroValue, MacroEntry.NO_EXCLUSION_PATTERNS); } /** @@ -496,10 +536,26 @@ public class CoreModel { * exclusion patterns in the resource if a container * @return */ - public static IMacroEntry newMacroEntry(IPath path, String macroName, String macroValue, IPath[] exclusionPatterns) { - return new MacroEntry(path, macroName, macroValue, exclusionPatterns); + public static IMacroEntry newMacroEntry(IPath resourcePath, String macroName, String macroValue, IPath[] exclusionPatterns) { + return newMacroEntry(resourcePath, null, macroName, macroValue, exclusionPatterns); } + /** + * Creates and returns an entry kind CDT_MACRO + * + * @param path + * the affected workspace-relative resource path + * @param macroName + * the name of the macro + * @param macroValue + * the value of the macro + * @param exclusionPatterns + * exclusion patterns in the resource if a container + * @return + */ + public static IMacroEntry newMacroEntry(IPath resourcePath, IPath basePath, String macroName, String macroValue, IPath[] exclusionPatterns) { + return new MacroEntry(resourcePath, basePath, macroName, macroValue, exclusionPatterns); + } /** * Answers the project specific value for a given container. In case this * container path could not be resolved, then will answer null. diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/ICProject.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/ICProject.java index 06372b98f44..559a67a104f 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/ICProject.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/ICProject.java @@ -94,6 +94,14 @@ public interface ICProject extends IParent, IOpenable, ICElement { */ ILibraryReference[] getLibraryReferences() throws CModelException; + /** + * Return the include paths set on the project. + * + * @return + * @throws CModelException + */ + IIncludeReference[] getIncludeReferences() throws CModelException; + /** * Returns the names of the projects that are directly required by this * project. A project is required if it is in its cpath entries. diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/IIncludeEntry.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/IIncludeEntry.java index c2b7f61180b..f40cafa1843 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/IIncludeEntry.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/IIncludeEntry.java @@ -22,6 +22,12 @@ public interface IIncludeEntry extends IPathEntry { */ IPath getIncludePath(); + /** + * Return the base path of the includePath + * @return IPath + */ + IPath getBasePath(); + /** * Whether or not it a system include path * @return boolean diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/IIncludeReference.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/IIncludeReference.java new file mode 100644 index 00000000000..add1d1edaf8 --- /dev/null +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/IIncludeReference.java @@ -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.model; + +import org.eclipse.core.runtime.IPath; + +/** + * IIncludeReference + */ +public interface IIncludeReference extends IParent, ICElement { + + /** + * Returns the pathEntry + * + * @return + */ + IIncludeEntry getIncludeEntry(); + + /** + * Return the affected path + * @return + */ + IPath getAffectedPath(); +} diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/ILibraryEntry.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/ILibraryEntry.java index 1e914c08674..3105b47e84f 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/ILibraryEntry.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/ILibraryEntry.java @@ -57,4 +57,10 @@ public interface ILibraryEntry extends IPathEntry { */ IPath getSourceAttachmentPrefixMapping(); + /** + * Return the base path of the library. + * @return IPath + */ + IPath getBasePath(); + } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/IMacroEntry.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/IMacroEntry.java index 7f6956a7086..2578f77b164 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/IMacroEntry.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/IMacroEntry.java @@ -35,4 +35,10 @@ public interface IMacroEntry extends IPathEntry { */ IPath[] getExclusionPatterns(); + /** + * Return the base path. + * @return + */ + IPath getBasePath(); + } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/IPathEntry.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/IPathEntry.java index 1159f834aee..1640600e9e1 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/IPathEntry.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/IPathEntry.java @@ -62,12 +62,6 @@ public interface IPathEntry { */ int CDT_OUTPUT = 7; - /** - * Entry kind constant describing an entry defined using - * a path that begins with a variable reference. - */ - int CDT_VARIABLE = 10; - /** * Returns the kind of this path entry. * diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/APathEntry.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/APathEntry.java index 487e40e07b8..c70d64049fd 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/APathEntry.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/APathEntry.java @@ -18,11 +18,13 @@ public abstract class APathEntry extends PathEntry { public static IPath[] NO_EXCLUSION_PATTERNS = {}; IPath[] exclusionPatterns; + IPath basePath; private final static char[][] UNINIT_PATTERNS = new char[][] { "Non-initialized yet".toCharArray() }; //$NON-NLS-1$ char[][]fullCharExclusionPatterns = UNINIT_PATTERNS; - public APathEntry (int kind, IPath path, IPath[] exclusionPatterns, boolean isExported) { + public APathEntry (int kind, IPath path, IPath basePath, IPath[] exclusionPatterns, boolean isExported) { super(kind, path, isExported); + this.basePath = basePath; this.exclusionPatterns = exclusionPatterns; } @@ -34,7 +36,15 @@ public abstract class APathEntry extends PathEntry { return exclusionPatterns; } - /* + /** + * Returns the base Path + * @return IPath + */ + public IPath getBasePath() { + return basePath; + } + + /** * Returns a char based representation of the exclusions patterns full path. */ public char[][] fullExclusionPatternChars() { @@ -71,6 +81,12 @@ public abstract class APathEntry extends PathEntry { } } } + IPath otherBasePath = otherEntry.getBasePath(); + if (basePath != null) { + if (otherBasePath != null && !basePath.equals(otherBasePath)) { + return false; + } + } return true; } return super.equals(obj); diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CProject.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CProject.java index 4ca36427355..cc1c654453b 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CProject.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CProject.java @@ -27,6 +27,8 @@ import org.eclipse.cdt.core.model.IBinaryContainer; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.ICModelStatusConstants; import org.eclipse.cdt.core.model.ICProject; +import org.eclipse.cdt.core.model.IIncludeEntry; +import org.eclipse.cdt.core.model.IIncludeReference; import org.eclipse.cdt.core.model.ILibraryEntry; import org.eclipse.cdt.core.model.ILibraryReference; import org.eclipse.cdt.core.model.IOutputEntry; @@ -131,14 +133,29 @@ public class CProject extends Openable implements ICProject { return getProject().hashCode(); } + public IIncludeReference[] getIncludeReferences() throws CModelException { + IPathEntry[] entries = getResolvedPathEntries(); + ArrayList list = new ArrayList(entries.length); + for (int i = 0; i < entries.length; i++) { + if (entries[i].getEntryKind() == IPathEntry.CDT_INCLUDE) { + IIncludeEntry entry = (IIncludeEntry) entries[i]; + IIncludeReference inc = new IncludeReference(this, entry); + if (inc != null) { + list.add(inc); + } + } + } + return (IIncludeReference[]) list.toArray(new IIncludeReference[0]); + } + public ILibraryReference[] getLibraryReferences() throws CModelException { - ArrayList list = new ArrayList(5); IBinaryParser[] binParsers = null; try { binParsers = CCorePlugin.getDefault().getBinaryParser(getProject()); } catch (CoreException e) { } IPathEntry[] entries = getResolvedPathEntries(); + ArrayList list = new ArrayList(entries.length); for (int i = 0; i < entries.length; i++) { if (entries[i].getEntryKind() == IPathEntry.CDT_LIBRARY) { ILibraryEntry entry = (ILibraryEntry) entries[i]; diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CProjectInfo.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CProjectInfo.java index 28ab23c0afd..03643ece629 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CProjectInfo.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CProjectInfo.java @@ -11,6 +11,7 @@ import org.eclipse.cdt.core.model.CModelException; import org.eclipse.cdt.core.model.IArchiveContainer; import org.eclipse.cdt.core.model.IBinaryContainer; import org.eclipse.cdt.core.model.ICElement; +import org.eclipse.cdt.core.model.IIncludeReference; import org.eclipse.cdt.core.model.ILibraryReference; import org.eclipse.cdt.core.model.ISourceRoot; import org.eclipse.core.resources.IContainer; @@ -27,6 +28,8 @@ class CProjectInfo extends OpenableInfo { BinaryContainer vBin; ArchiveContainer vLib; ILibraryReference[] libReferences; + IIncludeReference[] incReferences; + Object[] nonCResources = null; /** @@ -130,6 +133,16 @@ class CProjectInfo extends OpenableInfo { try { ((CElement)libReferences[i]).close(); } catch (CModelException e) { + // + } + } + } + if (incReferences != null) { + for (int i = 0; i < incReferences.length; i++) { + try { + ((CElement)incReferences[i]).close(); + } catch (CModelException e) { + // } } } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/IncludeEntry.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/IncludeEntry.java index 8ea0c7f4e3c..e07301dbaab 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/IncludeEntry.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/IncludeEntry.java @@ -19,8 +19,8 @@ public class IncludeEntry extends APathEntry implements IIncludeEntry { IPath includePath; boolean isSystemInclude; - public IncludeEntry(IPath path, IPath includePath, boolean isSystemInclude, IPath[] exclusionPatterns) { - super(IIncludeEntry.CDT_INCLUDE, path, exclusionPatterns, path == null); + public IncludeEntry(IPath resourcePath, IPath includePath, IPath basePath, boolean isSystemInclude, IPath[] exclusionPatterns) { + super(IIncludeEntry.CDT_INCLUDE, resourcePath, basePath, exclusionPatterns, resourcePath == null); this.includePath = includePath; this.isSystemInclude = isSystemInclude; } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/IncludeReference.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/IncludeReference.java new file mode 100644 index 00000000000..05e85e797e9 --- /dev/null +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/IncludeReference.java @@ -0,0 +1,76 @@ +/********************************************************************** + * 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.Map; + +import org.eclipse.cdt.core.model.CModelException; +import org.eclipse.cdt.core.model.ICElement; +import org.eclipse.cdt.core.model.ICProject; +import org.eclipse.cdt.core.model.IIncludeEntry; +import org.eclipse.cdt.core.model.IIncludeReference; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IProgressMonitor; + +/** + * IncludeReference + */ +public class IncludeReference extends Openable implements IIncludeReference { + + IIncludeEntry fIncludeEntry; + + /** + * @param parent + * @param name + * @param type + */ + public IncludeReference(ICProject cproject, IIncludeEntry entry) { + super(cproject, null, entry.getIncludePath().toString(), ICElement.C_VCONTAINER); + fIncludeEntry = entry; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.model.ICElement#getResource() + */ + public IResource getResource() { + return null; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.internal.core.model.CElement#createElementInfo() + */ + protected CElementInfo createElementInfo() { + return new OpenableInfo(this); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.model.IIncludeReference#getIncludeEntry() + */ + public IIncludeEntry getIncludeEntry() { + return fIncludeEntry; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.internal.core.model.Openable#generateInfos(org.eclipse.cdt.internal.core.model.OpenableInfo, org.eclipse.core.runtime.IProgressMonitor, java.util.Map, org.eclipse.core.resources.IResource) + */ + protected boolean generateInfos(OpenableInfo info, IProgressMonitor pm, Map newElements, IResource underlyingResource) throws CModelException { + return false; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.model.IIncludeReference#getAffectedPath() + */ + public IPath getAffectedPath() { + return fIncludeEntry.getPath(); + } +} diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/LibraryEntry.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/LibraryEntry.java index 6b93aa2610d..a8655763617 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/LibraryEntry.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/LibraryEntry.java @@ -15,16 +15,16 @@ package org.eclipse.cdt.internal.core.model; import org.eclipse.cdt.core.model.ILibraryEntry; import org.eclipse.core.runtime.IPath; -public class LibraryEntry extends PathEntry implements ILibraryEntry { +public class LibraryEntry extends APathEntry implements ILibraryEntry { IPath libraryPath; IPath sourceAttachmentPath; IPath sourceAttachmentRootPath; IPath sourceAttachmentPrefixMapping; - public LibraryEntry(IPath path, IPath sourceAttachmentPath, + public LibraryEntry(IPath libraryPath, IPath basePath, IPath sourceAttachmentPath, IPath sourceAttachmentRootPath, IPath sourceAttachmentPrefixMapping, boolean isExported) { - super(ILibraryEntry.CDT_LIBRARY, path, isExported); + super(ILibraryEntry.CDT_LIBRARY, libraryPath, basePath, APathEntry.NO_EXCLUSION_PATTERNS, isExported); this.sourceAttachmentPath = sourceAttachmentPath; this.sourceAttachmentRootPath = sourceAttachmentRootPath; this.sourceAttachmentPrefixMapping = sourceAttachmentPrefixMapping; diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/LibraryReferenceArchive.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/LibraryReferenceArchive.java index dd6afc41d45..0934f20024d 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/LibraryReferenceArchive.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/LibraryReferenceArchive.java @@ -22,7 +22,6 @@ public class LibraryReferenceArchive extends Archive implements ILibraryReferenc public LibraryReferenceArchive(ICElement parent, ILibraryEntry e, IBinaryArchive ar) { super(parent, e.getPath(), ar); - setElementType(ICElement.C_VCONTAINER); entry = e; } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/LibraryReferenceShared.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/LibraryReferenceShared.java index a80b22fd85d..a8d146ad3c3 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/LibraryReferenceShared.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/LibraryReferenceShared.java @@ -22,7 +22,6 @@ public class LibraryReferenceShared extends Binary implements ILibraryReference public LibraryReferenceShared(ICElement parent, ILibraryEntry e, IBinaryObject bin) { super(parent, e.getPath(), bin); - setElementType(ICElement.C_VCONTAINER); entry = e; } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/MacroEntry.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/MacroEntry.java index 1c45543a55b..0374e4dea12 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/MacroEntry.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/MacroEntry.java @@ -20,8 +20,8 @@ public class MacroEntry extends APathEntry implements IMacroEntry { String macroName; String macroValue; - public MacroEntry (IPath path, String macroName, String macroValue, IPath[] exclusionPatterns) { - super(IMacroEntry.CDT_MACRO, path, exclusionPatterns, path == null); + public MacroEntry (IPath path, IPath basePath, String macroName, String macroValue, IPath[] exclusionPatterns) { + super(IMacroEntry.CDT_MACRO, path, basePath, exclusionPatterns, path == null); this.macroName = macroName; this.macroValue = macroValue; } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/OutputEntry.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/OutputEntry.java index ce538c5062f..abbfb6d4ed8 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/OutputEntry.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/OutputEntry.java @@ -25,7 +25,7 @@ public class OutputEntry extends APathEntry implements IOutputEntry { * @param isExported */ public OutputEntry(IPath path, IPath[] exclusionPatterns, boolean isExported) { - super(CDT_OUTPUT, path, exclusionPatterns, isExported); + super(CDT_OUTPUT, path, null, exclusionPatterns, isExported); } public boolean equals(Object obj) { diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/PathEntry.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/PathEntry.java index 541d74392ec..93a925543a4 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/PathEntry.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/PathEntry.java @@ -98,8 +98,6 @@ public class PathEntry implements IPathEntry { return "src"; //$NON-NLS-1$ case IPathEntry.CDT_LIBRARY : return "lib"; //$NON-NLS-1$ - //case IPathEntry.CDT_VARIABLE : - // return "var"; //$NON-NLS-1$ case IPathEntry.CDT_INCLUDE : return "inc"; //$NON-NLS-1$ case IPathEntry.CDT_MACRO : diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/PathEntryManager.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/PathEntryManager.java index e285edeb562..13d81153fdb 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/PathEntryManager.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/PathEntryManager.java @@ -65,6 +65,7 @@ public class PathEntryManager implements ICDescriptorListener { 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"; //$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$ @@ -107,6 +108,84 @@ public class PathEntryManager implements ICDescriptorListener { return pathEntryManager; } + public IOutputEntry[] getOutputEntries(ICProject cproject) throws CModelException { + IPathEntry[] entries = getResolvedPathEntries(cproject); + ArrayList list = new ArrayList(entries.length); + for (int i = 0; i < entries.length; ++i) { + if (entries[i].getEntryKind() == IPathEntry.CDT_OUTPUT) { + list.add(entries[i]); + } + } + IOutputEntry[] outs = new IOutputEntry[list.size()]; + list.toArray(outs); + return outs; + } + + public IProjectEntry[] getProjectEntries(ICProject cproject) throws CModelException { + IPathEntry[] entries = getResolvedPathEntries(cproject); + ArrayList list = new ArrayList(entries.length); + for (int i = 0; i < entries.length; ++i) { + if (entries[i].getEntryKind() == IPathEntry.CDT_PROJECT) { + list.add(entries[i]); + } + } + IProjectEntry[] projects = new IProjectEntry[list.size()]; + list.toArray(projects); + return projects; + } + + public ISourceEntry[] getSourceEntries(ICProject cproject) throws CModelException { + IPathEntry[] entries = getResolvedPathEntries(cproject); + ArrayList list = new ArrayList(entries.length); + for (int i = 0; i < entries.length; ++i) { + if (entries[i].getEntryKind() == IPathEntry.CDT_SOURCE) { + list.add(entries[i]); + } + } + ISourceEntry[] sources = new ISourceEntry[list.size()]; + list.toArray(sources); + return sources; + } + + public ILibraryEntry[] getLibraryEntries(ICProject cproject) throws CModelException { + IPathEntry[] entries = getResolvedPathEntries(cproject); + ArrayList list = new ArrayList(entries.length); + for (int i = 0; i < entries.length; ++i) { + if (entries[i].getEntryKind() == IPathEntry.CDT_LIBRARY) { + list.add(entries[i]); + } + } + ILibraryEntry[] libs = new ILibraryEntry[list.size()]; + list.toArray(libs); + return libs; + } + + public IMacroEntry[] getMacroEntries(ICProject cproject) throws CModelException { + IPathEntry[] entries = getResolvedPathEntries(cproject); + ArrayList list = new ArrayList(entries.length); + for (int i = 0; i < entries.length; ++i) { + if (entries[i].getEntryKind() == IPathEntry.CDT_MACRO) { + list.add(entries[i]); + } + } + IMacroEntry[] macros = new IMacroEntry[list.size()]; + list.toArray(macros); + return macros; + } + + public IIncludeEntry[] getIncludeEntries(ICProject cproject) throws CModelException { + IPathEntry[] entries = getResolvedPathEntries(cproject); + ArrayList list = new ArrayList(entries.length); + for (int i = 0; i < entries.length; ++i) { + if (entries[i].getEntryKind() == IPathEntry.CDT_INCLUDE) { + list.add(entries[i]); + } + } + IIncludeEntry[] includes = new IIncludeEntry[list.size()]; + list.toArray(includes); + return includes; + } + public IPathEntry[] getResolvedPathEntries(ICProject cproject) throws CModelException { IPathEntry[] entries = (IPathEntry[]) resolvedMap.get(cproject); if (entries == null) { @@ -235,8 +314,7 @@ public class PathEntryManager implements ICDescriptorListener { continue; } remaining++; - oldResolvedEntries[i] = (IPathEntry[]) resolvedMap.get(affectedProject); - resolvedMap.put(affectedProject, null); + oldResolvedEntries[i] = (IPathEntry[]) resolvedMap.remove(affectedProject); containerPut(affectedProject, containerPath, newContainer); } // Nothing change. @@ -422,7 +500,7 @@ public class PathEntryManager implements ICDescriptorListener { encodePathEntries(cproject.getPath(), doc, rootElement, newRawEntries); } descriptor.saveProjectData(); - resolvedMap.put(cproject, null); + resolvedMap.remove(cproject); } catch (CoreException e) { throw new CModelException(e); } @@ -504,33 +582,46 @@ public class PathEntryManager implements ICDescriptorListener { flag = ICElementDelta.F_PATHENTRY_REORDER; } else { int kind = entry.getEntryKind(); - if (kind == IPathEntry.CDT_SOURCE) { - ISourceEntry source = (ISourceEntry) entry; - IPath path = source.getPath(); - celement = CoreModel.getDefault().create(path); - flag = (removed) ? ICElementDelta.F_REMOVED_PATHENTRY_SOURCE : ICElementDelta.F_ADDED_PATHENTRY_SOURCE; - } else if (kind == IPathEntry.CDT_LIBRARY) { - ILibraryEntry lib = (ILibraryEntry) entry; - celement = CProject.getLibraryReference(cproject, null, lib); - flag = (removed) ? ICElementDelta.F_ADDED_PATHENTRY_LIBRARY : ICElementDelta.F_REMOVED_PATHENTRY_LIBRARY; - } else if (kind == IPathEntry.CDT_PROJECT) { - //IProjectEntry pentry = (IProjectEntry) entry; - celement = cproject; - flag = ICElementDelta.F_CHANGED_PATHENTRY_PROJECT; - } else if (kind == IPathEntry.CDT_INCLUDE) { - IIncludeEntry include = (IIncludeEntry) entry; - IPath path = include.getPath(); - celement = CoreModel.getDefault().create(path); - flag = ICElementDelta.F_CHANGED_PATHENTRY_INCLUDE; - } else if (kind == IPathEntry.CDT_MACRO) { - IMacroEntry macro = (IMacroEntry) entry; - IPath path = macro.getPath(); - celement = CoreModel.getDefault().create(path); - flag = ICElementDelta.F_CHANGED_PATHENTRY_MACRO; - } else if (kind == IPathEntry.CDT_CONTAINER) { - //IContainerEntry container = (IContainerEntry) entry; - //celement = cproject; - // SHOULD NOT BE HERE Container are resolved. + switch (kind) { + case IPathEntry.CDT_SOURCE: { + ISourceEntry source = (ISourceEntry) entry; + IPath path = source.getPath(); + celement = CoreModel.getDefault().create(path); + flag = (removed) ? ICElementDelta.F_REMOVED_PATHENTRY_SOURCE : ICElementDelta.F_ADDED_PATHENTRY_SOURCE; + break; + } + case IPathEntry.CDT_LIBRARY: { + ILibraryEntry lib = (ILibraryEntry) entry; + celement = cproject; + flag = (removed) ? ICElementDelta.F_REMOVED_PATHENTRY_LIBRARY : ICElementDelta.F_ADDED_PATHENTRY_LIBRARY; + break; + } + case IPathEntry.CDT_PROJECT: { + //IProjectEntry pentry = (IProjectEntry) entry; + celement = cproject; + flag = ICElementDelta.F_CHANGED_PATHENTRY_PROJECT; + break; + } + case IPathEntry.CDT_INCLUDE: { + IIncludeEntry include = (IIncludeEntry) entry; + IPath path = include.getPath(); + celement = CoreModel.getDefault().create(path); + flag = ICElementDelta.F_CHANGED_PATHENTRY_INCLUDE; + break; + } + case IPathEntry.CDT_MACRO: { + IMacroEntry macro = (IMacroEntry) entry; + IPath path = macro.getPath(); + celement = CoreModel.getDefault().create(path); + flag = ICElementDelta.F_CHANGED_PATHENTRY_MACRO; + break; + } + case IPathEntry.CDT_CONTAINER: { + //IContainerEntry container = (IContainerEntry) entry; + //celement = cproject; + //SHOULD NOT BE HERE Container are resolved. + break; + } } } if (celement == null) { @@ -566,21 +657,31 @@ public class PathEntryManager implements ICDescriptorListener { static IPathEntry decodePathEntry(ICProject cProject, Element element) throws CModelException { IPath projectPath = cProject.getProject().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); } + // ensure path is absolute boolean hasPath = element.hasAttribute(ATTRIBUTE_PATH); String pathAttr = element.getAttribute(ATTRIBUTE_PATH); IPath path = new Path(pathAttr); - if (kind != IPathEntry.CDT_VARIABLE && !path.isAbsolute()) { + if (!path.isAbsolute()) { path = projectPath.append(path); } + + // check fo the base path + IPath basePath = null; + if (element.hasAttribute(ATTRIBUTE_BASE_PATH)) { + basePath = new Path(element.getAttribute(ATTRIBUTE_BASE_PATH)); + } + // source attachment info (optional) IPath sourceAttachmentPath = element.hasAttribute(ATTRIBUTE_SOURCEPATH) ? new Path( element.getAttribute(ATTRIBUTE_SOURCEPATH)) : null; @@ -588,6 +689,7 @@ public class PathEntryManager implements ICDescriptorListener { 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; @@ -601,12 +703,13 @@ public class PathEntryManager implements ICDescriptorListener { } } } - // recreate the CP entry + + // recreate the entry switch (kind) { case IPathEntry.CDT_PROJECT : return CoreModel.newProjectEntry(path, isExported); case IPathEntry.CDT_LIBRARY : - return CoreModel.newLibraryEntry(path, sourceAttachmentPath, sourceAttachmentRootPath, + return CoreModel.newLibraryEntry(path, basePath, sourceAttachmentPath, sourceAttachmentRootPath, sourceAttachmentPrefixMapping, isExported); case IPathEntry.CDT_SOURCE : { @@ -635,13 +738,13 @@ public class PathEntryManager implements ICDescriptorListener { if (element.hasAttribute(ATTRIBUTE_SYSTEM)) { isSystemInclude = element.getAttribute(ATTRIBUTE_SYSTEM).equals(VALUE_TRUE); } - return CoreModel.newIncludeEntry(path, includePath, isSystemInclude, exclusionPatterns); + return CoreModel.newIncludeEntry(path, includePath, basePath, isSystemInclude, exclusionPatterns); } case IPathEntry.CDT_MACRO : { String macroName = element.getAttribute(ATTRIBUTE_NAME); String macroValue = element.getAttribute(ATTRIBUTE_VALUE); - return CoreModel.newMacroEntry(path, macroName, macroValue, exclusionPatterns); + return CoreModel.newMacroEntry(path, basePath, macroName, macroValue, exclusionPatterns); } case IPathEntry.CDT_CONTAINER : { @@ -691,6 +794,9 @@ public class PathEntryManager implements ICDescriptorListener { ILibraryEntry lib = (ILibraryEntry) entries[i]; IPath path = lib.getPath(); element.setAttribute(ATTRIBUTE_PATH, path.toString()); + if (lib.getBasePath() != null) { + element.setAttribute(ATTRIBUTE_BASE_PATH, lib.getBasePath().toString()); + } if (lib.getSourceAttachmentPath() != null) { element.setAttribute(ATTRIBUTE_SOURCEPATH, lib.getSourceAttachmentPath().toString()); } @@ -706,9 +812,11 @@ public class PathEntryManager implements ICDescriptorListener { element.setAttribute(ATTRIBUTE_PATH, path.toString()); } else if (kind == IPathEntry.CDT_INCLUDE) { IIncludeEntry include = (IIncludeEntry) entries[i]; - IPath path = include.getPath(); - if (path != null) { - element.setAttribute(ATTRIBUTE_PATH, path.toString()); + if (include.getPath() != null) { + element.setAttribute(ATTRIBUTE_PATH, include.getPath().toString()); + } + if (include.getBasePath() != null) { + element.setAttribute(ATTRIBUTE_BASE_PATH, include.getBasePath().toString()); } IPath includePath = include.getIncludePath(); element.setAttribute(ATTRIBUTE_INCLUDE, includePath.toString()); @@ -717,9 +825,11 @@ public class PathEntryManager implements ICDescriptorListener { } } else if (kind == IPathEntry.CDT_MACRO) { IMacroEntry macro = (IMacroEntry) entries[i]; - IPath path = macro.getPath(); - if (path != null) { - element.setAttribute(ATTRIBUTE_PATH, path.toString()); + if (macro.getPath() != null) { + element.setAttribute(ATTRIBUTE_PATH, macro.getPath().toString()); + } + if (macro.getBasePath() != null) { + element.setAttribute(ATTRIBUTE_BASE_PATH, macro.getBasePath().toString()); } element.setAttribute(ATTRIBUTE_NAME, macro.getMacroName()); element.setAttribute(ATTRIBUTE_VALUE, macro.getMacroValue()); @@ -744,21 +854,23 @@ public class PathEntryManager implements ICDescriptorListener { ICDescriptor cdesc = event.getDescriptor(); if (cdesc != null) { CModelManager manager = CModelManager.getDefault(); - ICProject cproject = manager.create(cdesc.getProject()); - IProject project = cproject.getProject(); - try { - IPathEntry[] oldResolvedEntries = getResolvedPathEntries(cproject); - resolvedMap.remove(cproject); - IPathEntry[] newResolvedEntries = getResolvedPathEntries(cproject); - ICElementDelta[] deltas = generatePathEntryDeltas(cproject, oldResolvedEntries, newResolvedEntries); - if (deltas.length > 0) { - cproject.close(); - for (int i = 0; i < deltas.length; i++) { - manager.registerCModelDelta(deltas[i]); + IProject project = cdesc.getProject(); + if (manager.hasCNature(project) || manager.hasCCNature(project)) { + ICProject cproject = manager.create(project); + try { + IPathEntry[] oldResolvedEntries = getResolvedPathEntries(cproject); + resolvedMap.remove(cproject); + IPathEntry[] newResolvedEntries = getResolvedPathEntries(cproject); + ICElementDelta[] deltas = generatePathEntryDeltas(cproject, oldResolvedEntries, newResolvedEntries); + if (deltas.length > 0) { + cproject.close(); + for (int i = 0; i < deltas.length; i++) { + manager.registerCModelDelta(deltas[i]); + } + manager.fire(ElementChangedEvent.POST_CHANGE); } - manager.fire(ElementChangedEvent.POST_CHANGE); + } catch (CModelException e) { } - } catch (CModelException e) { } } } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/SourceEntry.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/SourceEntry.java index 393319aa3a5..15b7b5ce653 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/SourceEntry.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/SourceEntry.java @@ -18,7 +18,7 @@ import org.eclipse.core.runtime.IPath; public class SourceEntry extends APathEntry implements ISourceEntry { public SourceEntry(IPath path, IPath[] exclusionPatterns) { - super(ISourceEntry.CDT_SOURCE, path, exclusionPatterns, false); + super(ISourceEntry.CDT_SOURCE, path, null, exclusionPatterns, false); } public boolean equals (Object obj) {