mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-04 14:55:41 +02:00
2005-03-30 Alain Magloire
PR 88858 implementation. * model/org/eclipse/cdt/core/model/CoreModel.java * model/org/eclipse/cdt/core/model/IIncludeFileEntry.java * model/org/eclipse/cdt/core/model/IMacroFileEntry.java * model/org/eclipse/cdt/core/model/IPathEntry.java * model/org/eclipse/cdt/core/model/IPathEntryContainerExtension.java * model/org/eclipse/cdt/internal/core/model/DefaultPathEntryStore.java * model/org/eclipse/cdt/internal/core/model/IncludeFileEntry.java * model/org/eclipse/cdt/internal/core/model/MacroFileEntry.java * model/org/eclipse/cdt/internal/core/model/PathEntry.java * model/org/eclipse/cdt/internal/core/model/PathEntryManager.java * model/org/eclipse/cdt/internal/core/model/PathEntryUtil.java * src/org/eclipse/cdt/core/resources/ScannerInfo.java * src/org/eclipse/cdt/core/resources/ScannerProvider.java
This commit is contained in:
parent
43222f2381
commit
520d41403e
14 changed files with 1473 additions and 643 deletions
|
@ -1,3 +1,19 @@
|
||||||
|
2005-03-30 Alain Magloire
|
||||||
|
PR 88858 implementation.
|
||||||
|
* model/org/eclipse/cdt/core/model/CoreModel.java
|
||||||
|
* model/org/eclipse/cdt/core/model/IIncludeFileEntry.java
|
||||||
|
* model/org/eclipse/cdt/core/model/IMacroFileEntry.java
|
||||||
|
* model/org/eclipse/cdt/core/model/IPathEntry.java
|
||||||
|
* model/org/eclipse/cdt/core/model/IPathEntryContainerExtension.java
|
||||||
|
* model/org/eclipse/cdt/internal/core/model/DefaultPathEntryStore.java
|
||||||
|
* model/org/eclipse/cdt/internal/core/model/IncludeFileEntry.java
|
||||||
|
* model/org/eclipse/cdt/internal/core/model/MacroFileEntry.java
|
||||||
|
* model/org/eclipse/cdt/internal/core/model/PathEntry.java
|
||||||
|
* model/org/eclipse/cdt/internal/core/model/PathEntryManager.java
|
||||||
|
* model/org/eclipse/cdt/internal/core/model/PathEntryUtil.java
|
||||||
|
* src/org/eclipse/cdt/core/resources/ScannerInfo.java
|
||||||
|
* src/org/eclipse/cdt/core/resources/ScannerProvider.java
|
||||||
|
|
||||||
2005-03-30 Vladimir Hirsl
|
2005-03-30 Vladimir Hirsl
|
||||||
Fix for NPE in IndexEncoderUtil.calculateIndexFlags
|
Fix for NPE in IndexEncoderUtil.calculateIndexFlags
|
||||||
|
|
||||||
|
|
|
@ -22,8 +22,10 @@ import org.eclipse.cdt.internal.core.model.CModel;
|
||||||
import org.eclipse.cdt.internal.core.model.CModelManager;
|
import org.eclipse.cdt.internal.core.model.CModelManager;
|
||||||
import org.eclipse.cdt.internal.core.model.ContainerEntry;
|
import org.eclipse.cdt.internal.core.model.ContainerEntry;
|
||||||
import org.eclipse.cdt.internal.core.model.IncludeEntry;
|
import org.eclipse.cdt.internal.core.model.IncludeEntry;
|
||||||
|
import org.eclipse.cdt.internal.core.model.IncludeFileEntry;
|
||||||
import org.eclipse.cdt.internal.core.model.LibraryEntry;
|
import org.eclipse.cdt.internal.core.model.LibraryEntry;
|
||||||
import org.eclipse.cdt.internal.core.model.MacroEntry;
|
import org.eclipse.cdt.internal.core.model.MacroEntry;
|
||||||
|
import org.eclipse.cdt.internal.core.model.MacroFileEntry;
|
||||||
import org.eclipse.cdt.internal.core.model.OutputEntry;
|
import org.eclipse.cdt.internal.core.model.OutputEntry;
|
||||||
import org.eclipse.cdt.internal.core.model.PathEntryManager;
|
import org.eclipse.cdt.internal.core.model.PathEntryManager;
|
||||||
import org.eclipse.cdt.internal.core.model.ProjectEntry;
|
import org.eclipse.cdt.internal.core.model.ProjectEntry;
|
||||||
|
@ -530,6 +532,37 @@ public class CoreModel {
|
||||||
return new IncludeEntry(resourcePath, null, baseRef, includePath, false, null, false);
|
return new IncludeEntry(resourcePath, null, baseRef, includePath, false, null, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new entry of kind <code>CDT_INCLUDE_FILE</code>
|
||||||
|
*
|
||||||
|
* @param resourcePath
|
||||||
|
* @param includeFile
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static IIncludeFileEntry newIncludeFileEntry(IPath resourcePath, IPath includeFile) {
|
||||||
|
return newIncludeFileEntry(resourcePath, null, null, includeFile, null, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates and returns a new entry of kind <code>CDT_INCLUDE_FILE</code>
|
||||||
|
*
|
||||||
|
* @param resourcePath
|
||||||
|
* the affected project-relative resource path
|
||||||
|
* @param basePath
|
||||||
|
* the base path of the include
|
||||||
|
* @param includeFilePath
|
||||||
|
* the path of the include
|
||||||
|
* @param exclusionPatterns
|
||||||
|
* exclusion patterns in the resource if a container
|
||||||
|
* @param isExported
|
||||||
|
* if the entry ix exported to reference projects
|
||||||
|
* @return IIincludeEntry
|
||||||
|
*/
|
||||||
|
public static IIncludeFileEntry newIncludeFileEntry(IPath resourcePath, IPath baseRef, IPath basePath, IPath includeFilePath,
|
||||||
|
IPath[] exclusionPatterns, boolean isExported) {
|
||||||
|
return new IncludeFileEntry(resourcePath, basePath, baseRef, includeFilePath, exclusionPatterns, isExported);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates and returns an entry kind <code>CDT_MACRO</code>
|
* Creates and returns an entry kind <code>CDT_MACRO</code>
|
||||||
*
|
*
|
||||||
|
@ -539,7 +572,7 @@ public class CoreModel {
|
||||||
* the name of the macro
|
* the name of the macro
|
||||||
* @param macroValue
|
* @param macroValue
|
||||||
* the value of the macro
|
* the value of the macro
|
||||||
* @return
|
* @return IMacroEntry
|
||||||
*/
|
*/
|
||||||
public static IMacroEntry newMacroEntry(IPath resourcePath, String macroName, String macroValue) {
|
public static IMacroEntry newMacroEntry(IPath resourcePath, String macroName, String macroValue) {
|
||||||
return newMacroEntry(resourcePath, macroName, macroValue, APathEntry.NO_EXCLUSION_PATTERNS);
|
return newMacroEntry(resourcePath, macroName, macroValue, APathEntry.NO_EXCLUSION_PATTERNS);
|
||||||
|
@ -588,12 +621,41 @@ public class CoreModel {
|
||||||
* the base reference path
|
* the base reference path
|
||||||
* @param macroName
|
* @param macroName
|
||||||
* the name of the macro
|
* the name of the macro
|
||||||
* @return
|
* @return IMacroEntry
|
||||||
*/
|
*/
|
||||||
public static IMacroEntry newMacroRefEntry(IPath resourcePath, IPath baseRef, String macroName) {
|
public static IMacroEntry newMacroRefEntry(IPath resourcePath, IPath baseRef, String macroName) {
|
||||||
return new MacroEntry(resourcePath, baseRef, macroName, null, APathEntry.NO_EXCLUSION_PATTERNS, false);
|
return new MacroEntry(resourcePath, baseRef, macroName, null, APathEntry.NO_EXCLUSION_PATTERNS, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates an entry kind <code>CDT_MACRO_FILE</code>
|
||||||
|
*
|
||||||
|
* @param resourcePath
|
||||||
|
* @param macroFile
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static IMacroFileEntry newMacroFileEntry(IPath resourcePath, IPath macroFile) {
|
||||||
|
return newMacroFileEntry(resourcePath, null, null, macroFile, null, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates and returns an entry kind <code>CDT_MACRO_FILE</code>
|
||||||
|
*
|
||||||
|
* @param resourcePath
|
||||||
|
* the affected workspace-relative resource path
|
||||||
|
* @param basePath
|
||||||
|
* the base path
|
||||||
|
* @param macroFilePath
|
||||||
|
* the file path where the macros are define
|
||||||
|
* @param exclusionPatterns
|
||||||
|
* exclusion patterns in the resource if a container
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static IMacroFileEntry newMacroFileEntry(IPath resourcePath, IPath basePath, IPath baseRef, IPath macroFilePath, IPath[] exclusionPatterns, boolean isExported) {
|
||||||
|
return new MacroFileEntry(resourcePath, basePath, baseRef, macroFilePath, exclusionPatterns, isExported);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Answers the project specific value for a given container. In case this
|
* Answers the project specific value for a given container. In case this
|
||||||
* container path could not be resolved, then will answer <code>null</code>.
|
* container path could not be resolved, then will answer <code>null</code>.
|
||||||
|
@ -741,7 +803,7 @@ public class CoreModel {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method returns the include entries associated with a translation unit
|
* This method returns the include entries associated with a translation unit
|
||||||
* if the path does not refer to a valid translation unit an empty is return.
|
* if the path does not refer to a valid translation unit an empty array is return.
|
||||||
* <p>
|
* <p>
|
||||||
* The resulting resolved entries are accurate for the given point in time.
|
* The resulting resolved entries are accurate for the given point in time.
|
||||||
* If the project's raw entries are later modified they can become out of
|
* If the project's raw entries are later modified they can become out of
|
||||||
|
@ -749,7 +811,7 @@ public class CoreModel {
|
||||||
* recommended.
|
* recommended.
|
||||||
* </p>
|
* </p>
|
||||||
*
|
*
|
||||||
* @return the resolved entries for the project
|
* @return the include entries for the translation unit
|
||||||
* @exception CModelException
|
* @exception CModelException
|
||||||
* @see IPathEntry
|
* @see IPathEntry
|
||||||
*/
|
*/
|
||||||
|
@ -757,6 +819,24 @@ public class CoreModel {
|
||||||
return pathEntryManager.getIncludeEntries(path);
|
return pathEntryManager.getIncludeEntries(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method returns the include file entries associated with a translation unit
|
||||||
|
* if the path does not refer to a valid translation unit an empty array is return.
|
||||||
|
* <p>
|
||||||
|
* The resulting resolved entries are accurate for the given point in time.
|
||||||
|
* If the project's raw entries are later modified they can become out of
|
||||||
|
* date. Because of this, hanging on resolved pathentries is not
|
||||||
|
* recommended.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @return the include file entries for the translation unit
|
||||||
|
* @exception CModelException
|
||||||
|
* @see IPathEntry
|
||||||
|
*/
|
||||||
|
public static IIncludeFileEntry[] getIncludeFileEntries(IPath path) throws CModelException {
|
||||||
|
return pathEntryManager.getIncludeFileEntries(path);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method returns the macro entries associated with a translation unit
|
* This method returns the macro entries associated with a translation unit
|
||||||
* if the path does not refer to a valid translation unit an empty array is return.
|
* if the path does not refer to a valid translation unit an empty array is return.
|
||||||
|
@ -775,6 +855,24 @@ public class CoreModel {
|
||||||
return pathEntryManager.getMacroEntries(path);
|
return pathEntryManager.getMacroEntries(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method returns the macro file entries associated with a translation unit
|
||||||
|
* if the path does not refer to a valid translation unit an empty array is return.
|
||||||
|
* <p>
|
||||||
|
* The resulting resolved entries are accurate for the given point in time.
|
||||||
|
* If the project's raw entries are later modified they can become out of
|
||||||
|
* date. Because of this, hanging on resolved pathentries is not
|
||||||
|
* recommended.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @return the macro file entries for the translation unit
|
||||||
|
* @exception CModelException
|
||||||
|
* @see IPathEntry
|
||||||
|
*/
|
||||||
|
public static IMacroFileEntry[] getMacroFileEntries(IPath path) throws CModelException {
|
||||||
|
return pathEntryManager.getMacroFileEntries(path);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper method finding the pathentry container initializer registered for
|
* Helper method finding the pathentry container initializer registered for
|
||||||
* a given container ID or <code>null</code> if none was found while
|
* a given container ID or <code>null</code> if none was found while
|
||||||
|
|
|
@ -0,0 +1,55 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2000, 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;
|
||||||
|
|
||||||
|
public interface IIncludeFileEntry extends IPathEntry {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the include file
|
||||||
|
* @return IPath
|
||||||
|
*/
|
||||||
|
IPath getIncludeFilePath();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the includeFilePath with the base path.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
IPath getFullIncludeFilePath();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the base path of the includePath
|
||||||
|
* @return IPath
|
||||||
|
*/
|
||||||
|
IPath getBasePath();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the reference path
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
IPath getBaseReference();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If isRecursive() is true, specify an exclude file patterns.
|
||||||
|
* @return IPath
|
||||||
|
*/
|
||||||
|
IPath[] getExclusionPatterns();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a char based representation of the exclusions patterns full path.
|
||||||
|
*/
|
||||||
|
public char[][] fullExclusionPatternChars();
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,53 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2000, 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;
|
||||||
|
|
||||||
|
public interface IMacroFileEntry extends IPathEntry {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the macroFile path.
|
||||||
|
* @return String
|
||||||
|
*/
|
||||||
|
IPath getMacroFilePath();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* the path is completed if it relative.
|
||||||
|
*/
|
||||||
|
IPath getFullMacroFilePath();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the base path.
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
IPath getBasePath();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return the base reference
|
||||||
|
* IMacroEntry
|
||||||
|
*/
|
||||||
|
IPath getBaseReference();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an array of inclusion paths affecting the
|
||||||
|
* resource when looking for files recursively.
|
||||||
|
* @return IPath
|
||||||
|
*/
|
||||||
|
IPath[] getExclusionPatterns();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a char based representation of the exclusions patterns full path.
|
||||||
|
*/
|
||||||
|
public char[][] fullExclusionPatternChars();
|
||||||
|
|
||||||
|
}
|
|
@ -26,39 +26,54 @@ public interface IPathEntry {
|
||||||
* Entry kind constant describing a path entry identifying a
|
* Entry kind constant describing a path entry identifying a
|
||||||
* required project.
|
* required project.
|
||||||
*/
|
*/
|
||||||
int CDT_PROJECT = 2;
|
int CDT_PROJECT = 1 << 2;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Entry kind constant describing a path entry identifying a
|
* Entry kind constant describing a path entry identifying a
|
||||||
* folder containing source code to be compiled.
|
* folder containing source code to be compiled.
|
||||||
*/
|
*/
|
||||||
int CDT_SOURCE = 3;
|
int CDT_SOURCE = 1 << 3;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Entry kind constant describing a path entry identifying a
|
* Entry kind constant describing a path entry identifying a
|
||||||
* include path.
|
* include path.
|
||||||
*/
|
*/
|
||||||
int CDT_INCLUDE = 4;
|
int CDT_INCLUDE = 1 << 4;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Entry kind constant describing a path entry representing
|
* Entry kind constant describing a path entry representing
|
||||||
* a container id.
|
* a container id.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
int CDT_CONTAINER = 5;
|
int CDT_CONTAINER = 1 << 5;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Entry kind constant describing a path entry representing
|
* Entry kind constant describing a path entry representing
|
||||||
* a macro definition.
|
* a macro definition.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
int CDT_MACRO = 6;
|
int CDT_MACRO = 1 << 6;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Entry kind constant describing output location
|
* Entry kind constant describing output location
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
int CDT_OUTPUT = 7;
|
int CDT_OUTPUT = 1 << 7;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Entry kind constant describing a path entry representing
|
||||||
|
* a file that will be process file as if "#include "file"" appeared as
|
||||||
|
* the first line of the source file.
|
||||||
|
*/
|
||||||
|
int CDT_INCLUDE_FILE = 1 << 8;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Entry kind constant describing a path entry representing
|
||||||
|
* a file that will be process file as if "#include "file"" appeared as
|
||||||
|
* the first line of the source file but only the macro definitions are kept.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
int CDT_MACRO_FILE = 1 << 9;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the kind of this path entry.
|
* Returns the kind of this path entry.
|
||||||
|
@ -72,6 +87,8 @@ public interface IPathEntry {
|
||||||
* <li><code>CDT_MACRO</code> - this entry describes a macro definition
|
* <li><code>CDT_MACRO</code> - this entry describes a macro definition
|
||||||
* <li><code>CDT_CONTAINER</code> - this entry describes a container id
|
* <li><code>CDT_CONTAINER</code> - this entry describes a container id
|
||||||
* <li><code>CDT_OUTPUT</code> - this entry describes output location
|
* <li><code>CDT_OUTPUT</code> - this entry describes output location
|
||||||
|
* <li><code>CDT_INCLUDE_FILE</code> - this entry describes a file to be process as an include
|
||||||
|
* <li><code>CDT_MACRO_FILE</code> - this entry describes a file containing macro definitions
|
||||||
*/
|
*/
|
||||||
int getEntryKind();
|
int getEntryKind();
|
||||||
|
|
||||||
|
|
|
@ -18,24 +18,26 @@ import org.eclipse.core.runtime.IPath;
|
||||||
*/
|
*/
|
||||||
public interface IPathEntryContainerExtension extends IPathEntryContainer {
|
public interface IPathEntryContainerExtension extends IPathEntryContainer {
|
||||||
|
|
||||||
/**
|
IPathEntry[] getPathEntries(IPath path, int typesMask);
|
||||||
* Returns the set of include entries associated with the resource
|
|
||||||
* and empty array if none.
|
|
||||||
*
|
|
||||||
* @param path Workspace relative path.
|
|
||||||
* @return IIncludeEntry[] - the entries or empty set if none
|
|
||||||
* @see IPathEntry
|
|
||||||
*/
|
|
||||||
IIncludeEntry[] getIncludeEntries(IPath path);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the set of macro entries associated with the resource
|
|
||||||
* and empty array if none.
|
|
||||||
*
|
|
||||||
* @param path Workspace relative path.
|
|
||||||
* @return IMacroEntry[] - the entries or empty set if none
|
|
||||||
* @see IPathEntry
|
|
||||||
*/
|
|
||||||
IMacroEntry[] getMacroEntries(IPath path);
|
|
||||||
|
|
||||||
|
// /**
|
||||||
|
// * Returns the set of include entries associated with the resource
|
||||||
|
// * and empty array if none.
|
||||||
|
// *
|
||||||
|
// * @param path Workspace relative path.
|
||||||
|
// * @return IIncludeEntry[] - the entries or empty set if none
|
||||||
|
// * @see IPathEntry
|
||||||
|
// */
|
||||||
|
// IIncludeEntry[] getIncludeEntries(IPath path);
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Returns the set of macro entries associated with the resource
|
||||||
|
// * and empty array if none.
|
||||||
|
// *
|
||||||
|
// * @param path Workspace relative path.
|
||||||
|
// * @return IMacroEntry[] - the entries or empty set if none
|
||||||
|
// * @see IPathEntry
|
||||||
|
// */
|
||||||
|
// IMacroEntry[] getMacroEntries(IPath path);
|
||||||
|
//
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,8 +25,10 @@ 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.ICModelStatus;
|
import org.eclipse.cdt.core.model.ICModelStatus;
|
||||||
import org.eclipse.cdt.core.model.IIncludeEntry;
|
import org.eclipse.cdt.core.model.IIncludeEntry;
|
||||||
|
import org.eclipse.cdt.core.model.IIncludeFileEntry;
|
||||||
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;
|
||||||
|
import org.eclipse.cdt.core.model.IMacroFileEntry;
|
||||||
import org.eclipse.cdt.core.model.IPathEntry;
|
import org.eclipse.cdt.core.model.IPathEntry;
|
||||||
import org.eclipse.cdt.core.resources.IPathEntryStore;
|
import org.eclipse.cdt.core.resources.IPathEntryStore;
|
||||||
import org.eclipse.cdt.core.resources.IPathEntryStoreListener;
|
import org.eclipse.cdt.core.resources.IPathEntryStoreListener;
|
||||||
|
@ -59,10 +61,12 @@ public class DefaultPathEntryStore implements IPathEntryStore, ICDescriptorListe
|
||||||
static String ATTRIBUTE_PREFIXMAPPING = "prefixmapping"; //$NON-NLS-1$
|
static String ATTRIBUTE_PREFIXMAPPING = "prefixmapping"; //$NON-NLS-1$
|
||||||
static String ATTRIBUTE_EXCLUDING = "excluding"; //$NON-NLS-1$
|
static String ATTRIBUTE_EXCLUDING = "excluding"; //$NON-NLS-1$
|
||||||
static String ATTRIBUTE_INCLUDE = "include"; //$NON-NLS-1$
|
static String ATTRIBUTE_INCLUDE = "include"; //$NON-NLS-1$
|
||||||
|
static String ATTRIBUTE_INCLUDE_FILE= "include-file"; //$NON-NLS-1$
|
||||||
static String ATTRIBUTE_LIBRARY = "library"; //$NON-NLS-1$
|
static String ATTRIBUTE_LIBRARY = "library"; //$NON-NLS-1$
|
||||||
static String ATTRIBUTE_SYSTEM = "system"; //$NON-NLS-1$
|
static String ATTRIBUTE_SYSTEM = "system"; //$NON-NLS-1$
|
||||||
static String ATTRIBUTE_NAME = "name"; //$NON-NLS-1$
|
static String ATTRIBUTE_NAME = "name"; //$NON-NLS-1$
|
||||||
static String ATTRIBUTE_VALUE = "value"; //$NON-NLS-1$
|
static String ATTRIBUTE_VALUE = "value"; //$NON-NLS-1$
|
||||||
|
static String ATTRIBUTE_MACRO_FILE = "macro-file"; //$NON-NLS-1$
|
||||||
static String VALUE_TRUE = "true"; //$NON-NLS-1$
|
static String VALUE_TRUE = "true"; //$NON-NLS-1$
|
||||||
|
|
||||||
static final IPathEntry[] NO_PATHENTRIES = new IPathEntry[0];
|
static final IPathEntry[] NO_PATHENTRIES = new IPathEntry[0];
|
||||||
|
@ -213,6 +217,11 @@ public class DefaultPathEntryStore implements IPathEntryStore, ICDescriptorListe
|
||||||
}
|
}
|
||||||
return CoreModel.newIncludeEntry(path, basePath, includePath, isSystemInclude, exclusionPatterns, isExported);
|
return CoreModel.newIncludeEntry(path, basePath, includePath, isSystemInclude, exclusionPatterns, isExported);
|
||||||
}
|
}
|
||||||
|
case IPathEntry.CDT_INCLUDE_FILE: {
|
||||||
|
// include path info
|
||||||
|
IPath includeFilePath = new Path(element.getAttribute(ATTRIBUTE_INCLUDE_FILE));
|
||||||
|
return CoreModel.newIncludeFileEntry(path, basePath, baseRef, includeFilePath, exclusionPatterns, isExported);
|
||||||
|
}
|
||||||
case IPathEntry.CDT_MACRO : {
|
case IPathEntry.CDT_MACRO : {
|
||||||
String macroName = element.getAttribute(ATTRIBUTE_NAME);
|
String macroName = element.getAttribute(ATTRIBUTE_NAME);
|
||||||
String macroValue = element.getAttribute(ATTRIBUTE_VALUE);
|
String macroValue = element.getAttribute(ATTRIBUTE_VALUE);
|
||||||
|
@ -221,6 +230,10 @@ public class DefaultPathEntryStore implements IPathEntryStore, ICDescriptorListe
|
||||||
}
|
}
|
||||||
return CoreModel.newMacroEntry(path, macroName, macroValue, exclusionPatterns, isExported);
|
return CoreModel.newMacroEntry(path, macroName, macroValue, exclusionPatterns, isExported);
|
||||||
}
|
}
|
||||||
|
case IPathEntry.CDT_MACRO_FILE : {
|
||||||
|
IPath macroFilePath = new Path(element.getAttribute(ATTRIBUTE_MACRO_FILE));
|
||||||
|
return CoreModel.newMacroFileEntry(path, basePath, baseRef, macroFilePath, exclusionPatterns, isExported);
|
||||||
|
}
|
||||||
case IPathEntry.CDT_CONTAINER : {
|
case IPathEntry.CDT_CONTAINER : {
|
||||||
IPath id = new Path(element.getAttribute(ATTRIBUTE_PATH));
|
IPath id = new Path(element.getAttribute(ATTRIBUTE_PATH));
|
||||||
return CoreModel.newContainerEntry(id, isExported);
|
return CoreModel.newContainerEntry(id, isExported);
|
||||||
|
@ -303,12 +316,23 @@ public class DefaultPathEntryStore implements IPathEntryStore, ICDescriptorListe
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case IPathEntry.CDT_INCLUDE_FILE: {
|
||||||
|
IIncludeFileEntry include = (IIncludeFileEntry) entries[i];
|
||||||
|
IPath includeFilePath = include.getIncludeFilePath();
|
||||||
|
element.setAttribute(ATTRIBUTE_INCLUDE_FILE, includeFilePath.toString());
|
||||||
|
break;
|
||||||
|
}
|
||||||
case IPathEntry.CDT_MACRO: {
|
case IPathEntry.CDT_MACRO: {
|
||||||
IMacroEntry macro = (IMacroEntry) entries[i];
|
IMacroEntry macro = (IMacroEntry) entries[i];
|
||||||
element.setAttribute(ATTRIBUTE_NAME, macro.getMacroName());
|
element.setAttribute(ATTRIBUTE_NAME, macro.getMacroName());
|
||||||
element.setAttribute(ATTRIBUTE_VALUE, macro.getMacroValue());
|
element.setAttribute(ATTRIBUTE_VALUE, macro.getMacroValue());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case IPathEntry.CDT_MACRO_FILE: {
|
||||||
|
IMacroFileEntry macro = (IMacroFileEntry) entries[i];
|
||||||
|
element.setAttribute(ATTRIBUTE_MACRO_FILE, macro.getMacroFilePath().toString());
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (entries[i] instanceof APathEntry) {
|
if (entries[i] instanceof APathEntry) {
|
||||||
|
|
|
@ -0,0 +1,118 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2000, 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 org.eclipse.cdt.core.model.IIncludeFileEntry;
|
||||||
|
import org.eclipse.cdt.core.model.IPathEntry;
|
||||||
|
import org.eclipse.core.resources.IResource;
|
||||||
|
import org.eclipse.core.resources.ResourcesPlugin;
|
||||||
|
import org.eclipse.core.runtime.IPath;
|
||||||
|
import org.eclipse.core.runtime.Path;
|
||||||
|
|
||||||
|
public class IncludeFileEntry extends APathEntry implements IIncludeFileEntry {
|
||||||
|
|
||||||
|
IPath includeFilePath;
|
||||||
|
|
||||||
|
public IncludeFileEntry(IPath resourcePath, IPath basePath, IPath baseRef, IPath includeFilePath,
|
||||||
|
IPath[] exclusionPatterns, boolean isExported) {
|
||||||
|
super(IPathEntry.CDT_INCLUDE_FILE, basePath, baseRef, resourcePath, exclusionPatterns, isExported);
|
||||||
|
this.includeFilePath = (includeFilePath == null) ? Path.EMPTY : includeFilePath;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the include path
|
||||||
|
*
|
||||||
|
* @return IPath
|
||||||
|
*/
|
||||||
|
public IPath getIncludeFilePath() {
|
||||||
|
return includeFilePath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (obj instanceof IIncludeFileEntry) {
|
||||||
|
IIncludeFileEntry otherEntry = (IIncludeFileEntry) obj;
|
||||||
|
if (!super.equals(otherEntry)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (path == null) {
|
||||||
|
if (otherEntry.getPath() != null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (!path.toString().equals(otherEntry.getPath().toString())) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (includeFilePath == null) {
|
||||||
|
if (otherEntry.getIncludeFilePath() != null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (!includeFilePath.toString().equals(otherEntry.getIncludeFilePath().toString())) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return super.equals(obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.core.model.IIncludeEntry#getFullIncludePath()
|
||||||
|
*/
|
||||||
|
public IPath getFullIncludeFilePath() {
|
||||||
|
IPath p;
|
||||||
|
IPath inc = getIncludeFilePath();
|
||||||
|
if (!basePath.isEmpty()) {
|
||||||
|
IPath loc = basePath;
|
||||||
|
if (!loc.isAbsolute()) {
|
||||||
|
IResource res = ResourcesPlugin.getWorkspace().getRoot().findMember(loc);
|
||||||
|
if (res != null) {
|
||||||
|
loc = res.getLocation();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
p = loc.append(inc);
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
p = inc;
|
||||||
|
|
||||||
|
if (!p.isAbsolute()) {
|
||||||
|
IPath resPath = getPath();
|
||||||
|
IResource res = ResourcesPlugin.getWorkspace().getRoot().findMember(resPath);
|
||||||
|
if (res != null) {
|
||||||
|
if (res.getType() == IResource.FILE) {
|
||||||
|
res = res.getParent();
|
||||||
|
}
|
||||||
|
IPath location = res.getLocation();
|
||||||
|
if (location != null) {
|
||||||
|
p = location.append(p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see java.lang.Object#toString()
|
||||||
|
*/
|
||||||
|
public String toString() {
|
||||||
|
StringBuffer sb = new StringBuffer();
|
||||||
|
sb.append(super.toString());
|
||||||
|
if (includeFilePath != null && !includeFilePath.isEmpty()) {
|
||||||
|
sb.append(" includeFilePath:").append(includeFilePath); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,117 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2000, 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 org.eclipse.cdt.core.model.IMacroFileEntry;
|
||||||
|
import org.eclipse.cdt.core.model.IPathEntry;
|
||||||
|
import org.eclipse.core.resources.IResource;
|
||||||
|
import org.eclipse.core.resources.ResourcesPlugin;
|
||||||
|
import org.eclipse.core.runtime.IPath;
|
||||||
|
import org.eclipse.core.runtime.Path;
|
||||||
|
|
||||||
|
public class MacroFileEntry extends APathEntry implements IMacroFileEntry {
|
||||||
|
|
||||||
|
IPath macroFilePath;
|
||||||
|
|
||||||
|
public MacroFileEntry(IPath resourcePath, IPath basePath, IPath baseRef, IPath macroFilePath,
|
||||||
|
IPath[] exclusionPatterns, boolean isExported) {
|
||||||
|
super(IPathEntry.CDT_MACRO_FILE, basePath, baseRef, resourcePath, exclusionPatterns, isExported);
|
||||||
|
this.macroFilePath = (macroFilePath == null) ? Path.EMPTY : macroFilePath;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the macro file path
|
||||||
|
*
|
||||||
|
* @return IPath
|
||||||
|
*/
|
||||||
|
public IPath getMacroFilePath() {
|
||||||
|
return macroFilePath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (obj instanceof IMacroFileEntry) {
|
||||||
|
IMacroFileEntry otherEntry = (IMacroFileEntry) obj;
|
||||||
|
if (!super.equals(otherEntry)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (path == null) {
|
||||||
|
if (otherEntry.getPath() != null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (!path.toString().equals(otherEntry.getPath().toString())) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (macroFilePath == null) {
|
||||||
|
if (otherEntry.getMacroFilePath() != null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (!macroFilePath.toString().equals(otherEntry.getMacroFilePath().toString())) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return super.equals(obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.core.model.IIncludeEntry#getFullIncludePath()
|
||||||
|
*/
|
||||||
|
public IPath getFullMacroFilePath() {
|
||||||
|
IPath p;
|
||||||
|
IPath inc = getMacroFilePath();
|
||||||
|
if (!basePath.isEmpty()) {
|
||||||
|
IPath loc = basePath;
|
||||||
|
if (!loc.isAbsolute()) {
|
||||||
|
IResource res = ResourcesPlugin.getWorkspace().getRoot().findMember(loc);
|
||||||
|
if (res != null) {
|
||||||
|
loc = res.getLocation();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
p = loc.append(inc);
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
p = inc;
|
||||||
|
|
||||||
|
if (!p.isAbsolute()) {
|
||||||
|
IPath resPath = getPath();
|
||||||
|
IResource res = ResourcesPlugin.getWorkspace().getRoot().findMember(resPath);
|
||||||
|
if (res != null) {
|
||||||
|
if (res.getType() == IResource.FILE) {
|
||||||
|
res = res.getParent();
|
||||||
|
}
|
||||||
|
IPath location = res.getLocation();
|
||||||
|
if (location != null) {
|
||||||
|
p = location.append(p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see java.lang.Object#toString()
|
||||||
|
*/
|
||||||
|
public String toString() {
|
||||||
|
StringBuffer sb = new StringBuffer();
|
||||||
|
sb.append(super.toString());
|
||||||
|
if (macroFilePath != null && !macroFilePath.isEmpty()) {
|
||||||
|
sb.append(" macroFilePath:").append(macroFilePath); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -83,8 +83,12 @@ public class PathEntry implements IPathEntry {
|
||||||
return IPathEntry.CDT_LIBRARY;
|
return IPathEntry.CDT_LIBRARY;
|
||||||
if (kindStr.equalsIgnoreCase("inc")) //$NON-NLS-1$
|
if (kindStr.equalsIgnoreCase("inc")) //$NON-NLS-1$
|
||||||
return IPathEntry.CDT_INCLUDE;
|
return IPathEntry.CDT_INCLUDE;
|
||||||
|
if (kindStr.equalsIgnoreCase("incfile")) //$NON-NLS-1$
|
||||||
|
return IPathEntry.CDT_INCLUDE_FILE;
|
||||||
if (kindStr.equalsIgnoreCase("mac")) //$NON-NLS-1$
|
if (kindStr.equalsIgnoreCase("mac")) //$NON-NLS-1$
|
||||||
return IPathEntry.CDT_MACRO;
|
return IPathEntry.CDT_MACRO;
|
||||||
|
if (kindStr.equalsIgnoreCase("macfile")) //$NON-NLS-1$
|
||||||
|
return IPathEntry.CDT_MACRO_FILE;
|
||||||
if (kindStr.equalsIgnoreCase("con")) //$NON-NLS-1$
|
if (kindStr.equalsIgnoreCase("con")) //$NON-NLS-1$
|
||||||
return IPathEntry.CDT_CONTAINER;
|
return IPathEntry.CDT_CONTAINER;
|
||||||
if (kindStr.equalsIgnoreCase("out")) //$NON-NLS-1$
|
if (kindStr.equalsIgnoreCase("out")) //$NON-NLS-1$
|
||||||
|
@ -106,8 +110,12 @@ public class PathEntry implements IPathEntry {
|
||||||
return "lib"; //$NON-NLS-1$
|
return "lib"; //$NON-NLS-1$
|
||||||
case IPathEntry.CDT_INCLUDE :
|
case IPathEntry.CDT_INCLUDE :
|
||||||
return "inc"; //$NON-NLS-1$
|
return "inc"; //$NON-NLS-1$
|
||||||
|
case IPathEntry.CDT_INCLUDE_FILE:
|
||||||
|
return "incfile"; //$NON-NLS-1$
|
||||||
case IPathEntry.CDT_MACRO :
|
case IPathEntry.CDT_MACRO :
|
||||||
return "mac"; //$NON-NLS-1$
|
return "mac"; //$NON-NLS-1$
|
||||||
|
case IPathEntry.CDT_MACRO_FILE:
|
||||||
|
return "macfile"; //$NON-NLS-1$
|
||||||
case IPathEntry.CDT_CONTAINER :
|
case IPathEntry.CDT_CONTAINER :
|
||||||
return "con"; //$NON-NLS-1$
|
return "con"; //$NON-NLS-1$
|
||||||
case IPathEntry.CDT_OUTPUT :
|
case IPathEntry.CDT_OUTPUT :
|
||||||
|
@ -143,8 +151,12 @@ public class PathEntry implements IPathEntry {
|
||||||
return ("Output path"); //$NON-NLS-1$
|
return ("Output path"); //$NON-NLS-1$
|
||||||
case IPathEntry.CDT_INCLUDE :
|
case IPathEntry.CDT_INCLUDE :
|
||||||
return ("Include path"); //$NON-NLS-1$
|
return ("Include path"); //$NON-NLS-1$
|
||||||
|
case IPathEntry.CDT_INCLUDE_FILE :
|
||||||
|
return ("Include-file path"); //$NON-NLS-1$
|
||||||
case IPathEntry.CDT_MACRO :
|
case IPathEntry.CDT_MACRO :
|
||||||
return ("Symbol definition"); //$NON-NLS-1$
|
return ("Symbol definition"); //$NON-NLS-1$
|
||||||
|
case IPathEntry.CDT_MACRO_FILE :
|
||||||
|
return ("Symbol-file definition"); //$NON-NLS-1$
|
||||||
case IPathEntry.CDT_CONTAINER :
|
case IPathEntry.CDT_CONTAINER :
|
||||||
return ("Contributed paths"); //$NON-NLS-1$
|
return ("Contributed paths"); //$NON-NLS-1$
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,6 @@
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package org.eclipse.cdt.internal.core.model;
|
package org.eclipse.cdt.internal.core.model;
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
@ -24,7 +23,6 @@ import org.eclipse.cdt.core.ICDescriptor;
|
||||||
import org.eclipse.cdt.core.ICExtensionReference;
|
import org.eclipse.cdt.core.ICExtensionReference;
|
||||||
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.CoreModelUtil;
|
|
||||||
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;
|
||||||
|
@ -35,8 +33,10 @@ 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.IElementChangedListener;
|
||||||
import org.eclipse.cdt.core.model.IIncludeEntry;
|
import org.eclipse.cdt.core.model.IIncludeEntry;
|
||||||
|
import org.eclipse.cdt.core.model.IIncludeFileEntry;
|
||||||
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;
|
||||||
|
import org.eclipse.cdt.core.model.IMacroFileEntry;
|
||||||
import org.eclipse.cdt.core.model.IOpenable;
|
import org.eclipse.cdt.core.model.IOpenable;
|
||||||
import org.eclipse.cdt.core.model.IOutputEntry;
|
import org.eclipse.cdt.core.model.IOutputEntry;
|
||||||
import org.eclipse.cdt.core.model.IPathEntry;
|
import org.eclipse.cdt.core.model.IPathEntry;
|
||||||
|
@ -50,15 +50,11 @@ import org.eclipse.cdt.core.model.PathEntryContainerChanged;
|
||||||
import org.eclipse.cdt.core.model.PathEntryContainerInitializer;
|
import org.eclipse.cdt.core.model.PathEntryContainerInitializer;
|
||||||
import org.eclipse.cdt.core.resources.IPathEntryStore;
|
import org.eclipse.cdt.core.resources.IPathEntryStore;
|
||||||
import org.eclipse.cdt.core.resources.IPathEntryStoreListener;
|
import org.eclipse.cdt.core.resources.IPathEntryStoreListener;
|
||||||
import org.eclipse.cdt.core.resources.IPathEntryVariableManager;
|
|
||||||
import org.eclipse.cdt.core.resources.PathEntryStoreChangedEvent;
|
import org.eclipse.cdt.core.resources.PathEntryStoreChangedEvent;
|
||||||
import org.eclipse.core.resources.IMarker;
|
import org.eclipse.core.resources.IMarker;
|
||||||
import org.eclipse.core.resources.IProject;
|
import org.eclipse.core.resources.IProject;
|
||||||
import org.eclipse.core.resources.IResource;
|
import org.eclipse.core.resources.IResource;
|
||||||
import org.eclipse.core.resources.IWorkspace;
|
|
||||||
import org.eclipse.core.resources.IWorkspaceRoot;
|
|
||||||
import org.eclipse.core.resources.IWorkspaceRunnable;
|
import org.eclipse.core.resources.IWorkspaceRunnable;
|
||||||
import org.eclipse.core.resources.ResourcesPlugin;
|
|
||||||
import org.eclipse.core.runtime.CoreException;
|
import org.eclipse.core.runtime.CoreException;
|
||||||
import org.eclipse.core.runtime.IConfigurationElement;
|
import org.eclipse.core.runtime.IConfigurationElement;
|
||||||
import org.eclipse.core.runtime.IExtension;
|
import org.eclipse.core.runtime.IExtension;
|
||||||
|
@ -98,14 +94,16 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
|
||||||
|
|
||||||
static final IPathEntry[] NO_PATHENTRIES = new IPathEntry[0];
|
static final IPathEntry[] NO_PATHENTRIES = new IPathEntry[0];
|
||||||
|
|
||||||
static final IIncludeEntry[] NO_INCLUDENTRIES = new IIncludeEntry[0];
|
static final IIncludeEntry[] NO_INCLUDE_ENTRIES = new IIncludeEntry[0];
|
||||||
|
|
||||||
static final IMacroEntry[] NO_MACROENTRIES = new IMacroEntry[0];
|
static final IIncludeFileEntry[] NO_INCLUDE_FILE_ENTRIES = new IIncludeFileEntry[0];
|
||||||
|
|
||||||
|
static final IMacroEntry[] NO_MACRO_ENTRIES = new IMacroEntry[0];
|
||||||
|
|
||||||
|
static final IMacroFileEntry[] NO_MACRO_FILE_ENTRIES = new IMacroFileEntry[0];
|
||||||
|
|
||||||
static final IPathEntryContainer[] NO_PATHENTRYCONTAINERS = new IPathEntryContainer[0];
|
static final IPathEntryContainer[] NO_PATHENTRYCONTAINERS = new IPathEntryContainer[0];
|
||||||
|
|
||||||
static final IMarker[] NO_MARKERS = new IMarker[0];
|
|
||||||
|
|
||||||
// Synchronized the access of the cache entries.
|
// Synchronized the access of the cache entries.
|
||||||
protected Map resolvedMap = new Hashtable();
|
protected Map resolvedMap = new Hashtable();
|
||||||
|
|
||||||
|
@ -167,12 +165,89 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
|
||||||
return pathEntryManager;
|
return pathEntryManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public IIncludeFileEntry[] getIncludeFileEntries(IPath resPath) throws CModelException {
|
||||||
|
ICElement celement = CoreModel.getDefault().create(resPath);
|
||||||
|
if (celement instanceof ITranslationUnit) {
|
||||||
|
return getIncludeFileEntries((ITranslationUnit)celement);
|
||||||
|
}
|
||||||
|
return NO_INCLUDE_FILE_ENTRIES;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IIncludeFileEntry[] getIncludeFileEntries(ITranslationUnit cunit) throws CModelException {
|
||||||
|
ArrayList includeFileList = new ArrayList();
|
||||||
|
ICProject cproject = cunit.getCProject();
|
||||||
|
IPath resPath = cunit.getPath();
|
||||||
|
// Do this first so the containers get inialized.
|
||||||
|
ArrayList resolvedListEntries = getResolvedPathEntries(cproject, false);
|
||||||
|
for (int i = 0; i < resolvedListEntries.size(); ++i) {
|
||||||
|
IPathEntry entry = (IPathEntry)resolvedListEntries.get(i);
|
||||||
|
if (entry.getEntryKind() == IPathEntry.CDT_INCLUDE_FILE) {
|
||||||
|
includeFileList.add(entry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
IPathEntryContainer[] containers = getPathEntryContainers(cproject);
|
||||||
|
for (int i = 0; i < containers.length; ++i) {
|
||||||
|
if (containers[i] instanceof IPathEntryContainerExtension) {
|
||||||
|
IPathEntryContainerExtension extension = (IPathEntryContainerExtension)containers[i];
|
||||||
|
IIncludeFileEntry[] incs = (IIncludeFileEntry[])extension.getPathEntries(resPath, IPathEntry.CDT_INCLUDE_FILE);
|
||||||
|
includeFileList.addAll(Arrays.asList(incs));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IIncludeFileEntry[] includeFiles = (IIncludeFileEntry[]) includeFileList.toArray(new IIncludeFileEntry[includeFileList.size()]);
|
||||||
|
// Clear the list since we are reusing it.
|
||||||
|
includeFileList.clear();
|
||||||
|
|
||||||
|
// We need to reorder the include/macros:
|
||||||
|
// includes with the closest match to the resource will come first
|
||||||
|
// /project/src/file.c --> /usr/local/include
|
||||||
|
// /project --> /usr/include
|
||||||
|
//
|
||||||
|
// /usr/local/include must come first.
|
||||||
|
//
|
||||||
|
int count = resPath.segmentCount();
|
||||||
|
for (int i = 0; i < count; i++) {
|
||||||
|
IPath newPath = resPath.removeLastSegments(i);
|
||||||
|
for (int j = 0; j < includeFiles.length; j++) {
|
||||||
|
IPath otherPath = includeFiles[j].getPath();
|
||||||
|
if (newPath.equals(otherPath)) {
|
||||||
|
includeFileList.add(includeFiles[j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Since the include that comes from a project contribution are not
|
||||||
|
// tied to a resource they are added last.
|
||||||
|
for (int i = 0; i < resolvedListEntries.size(); i++) {
|
||||||
|
IPathEntry entry = (IPathEntry)resolvedListEntries.get(i);
|
||||||
|
if (entry != null && entry.getEntryKind() == IPathEntry.CDT_PROJECT) {
|
||||||
|
IResource res = cproject.getCModel().getWorkspace().getRoot().findMember(entry.getPath());
|
||||||
|
if (res != null && res.getType() == IResource.PROJECT) {
|
||||||
|
ICProject refCProject = CoreModel.getDefault().create((IProject)res);
|
||||||
|
if (refCProject != null) {
|
||||||
|
IPathEntry[] projEntries = refCProject.getResolvedPathEntries();
|
||||||
|
for (int j = 0; j < projEntries.length; j++) {
|
||||||
|
IPathEntry projEntry = projEntries[j];
|
||||||
|
if (projEntry.isExported()) {
|
||||||
|
if (projEntry.getEntryKind() == IPathEntry.CDT_INCLUDE_FILE) {
|
||||||
|
IIncludeFileEntry includeFile = (IIncludeFileEntry)projEntry;
|
||||||
|
includeFileList.add(includeFile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (IIncludeFileEntry[])includeFileList.toArray(new IIncludeFileEntry[includeFileList.size()]);
|
||||||
|
}
|
||||||
|
|
||||||
public IIncludeEntry[] getIncludeEntries(IPath resPath) throws CModelException {
|
public IIncludeEntry[] getIncludeEntries(IPath resPath) throws CModelException {
|
||||||
ICElement celement = CoreModel.getDefault().create(resPath);
|
ICElement celement = CoreModel.getDefault().create(resPath);
|
||||||
if (celement instanceof ITranslationUnit) {
|
if (celement instanceof ITranslationUnit) {
|
||||||
return getIncludeEntries((ITranslationUnit)celement);
|
return getIncludeEntries((ITranslationUnit)celement);
|
||||||
}
|
}
|
||||||
return NO_INCLUDENTRIES;
|
return NO_INCLUDE_ENTRIES;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IIncludeEntry[] getIncludeEntries(ITranslationUnit cunit) throws CModelException {
|
public IIncludeEntry[] getIncludeEntries(ITranslationUnit cunit) throws CModelException {
|
||||||
|
@ -190,7 +265,8 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
|
||||||
IPathEntryContainer[] containers = getPathEntryContainers(cproject);
|
IPathEntryContainer[] containers = getPathEntryContainers(cproject);
|
||||||
for (int i = 0; i < containers.length; ++i) {
|
for (int i = 0; i < containers.length; ++i) {
|
||||||
if (containers[i] instanceof IPathEntryContainerExtension) {
|
if (containers[i] instanceof IPathEntryContainerExtension) {
|
||||||
IIncludeEntry[] incs = ((IPathEntryContainerExtension)containers[i]).getIncludeEntries(resPath);
|
IPathEntryContainerExtension extension = (IPathEntryContainerExtension)containers[i];
|
||||||
|
IIncludeEntry[] incs = (IIncludeEntry[]) extension.getPathEntries(resPath, IPathEntry.CDT_INCLUDE_FILE);
|
||||||
includeList.addAll(Arrays.asList(incs));
|
includeList.addAll(Arrays.asList(incs));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -248,7 +324,7 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
|
||||||
if (celement instanceof ITranslationUnit) {
|
if (celement instanceof ITranslationUnit) {
|
||||||
return getMacroEntries((ITranslationUnit)celement);
|
return getMacroEntries((ITranslationUnit)celement);
|
||||||
}
|
}
|
||||||
return NO_MACROENTRIES;
|
return NO_MACRO_ENTRIES;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IMacroEntry[] getMacroEntries(ITranslationUnit cunit) throws CModelException {
|
public IMacroEntry[] getMacroEntries(ITranslationUnit cunit) throws CModelException {
|
||||||
|
@ -266,7 +342,8 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
|
||||||
IPathEntryContainer[] containers = getPathEntryContainers(cproject);
|
IPathEntryContainer[] containers = getPathEntryContainers(cproject);
|
||||||
for (int i = 0; i < containers.length; ++i) {
|
for (int i = 0; i < containers.length; ++i) {
|
||||||
if (containers[i] instanceof IPathEntryContainerExtension) {
|
if (containers[i] instanceof IPathEntryContainerExtension) {
|
||||||
IMacroEntry[] incs = ((IPathEntryContainerExtension)containers[i]).getMacroEntries(resPath);
|
IPathEntryContainerExtension extension = (IPathEntryContainerExtension)containers[i];
|
||||||
|
IMacroEntry[] incs = (IMacroEntry[])extension.getPathEntries(resPath, IPathEntry.CDT_MACRO);
|
||||||
macroList.addAll(Arrays.asList(incs));
|
macroList.addAll(Arrays.asList(incs));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -320,10 +397,86 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return (IMacroEntry[])symbolMap.values().toArray(NO_MACROENTRIES);
|
return (IMacroEntry[])symbolMap.values().toArray(NO_MACRO_ENTRIES);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public IMacroFileEntry[] getMacroFileEntries(IPath resPath) throws CModelException {
|
||||||
|
ICElement celement = CoreModel.getDefault().create(resPath);
|
||||||
|
if (celement instanceof ITranslationUnit) {
|
||||||
|
return getMacroFileEntries((ITranslationUnit)celement);
|
||||||
|
}
|
||||||
|
return NO_MACRO_FILE_ENTRIES;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IMacroFileEntry[] getMacroFileEntries(ITranslationUnit cunit) throws CModelException {
|
||||||
|
ArrayList macroFileList = new ArrayList();
|
||||||
|
ICProject cproject = cunit.getCProject();
|
||||||
|
IPath resPath = cunit.getPath();
|
||||||
|
// Do this first so the containers get inialized.
|
||||||
|
ArrayList resolvedListEntries = getResolvedPathEntries(cproject, false);
|
||||||
|
for (int i = 0; i < resolvedListEntries.size(); ++i) {
|
||||||
|
IPathEntry entry = (IPathEntry)resolvedListEntries.get(i);
|
||||||
|
if (entry.getEntryKind() == IPathEntry.CDT_MACRO_FILE) {
|
||||||
|
macroFileList.add(entry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
IPathEntryContainer[] containers = getPathEntryContainers(cproject);
|
||||||
|
for (int i = 0; i < containers.length; ++i) {
|
||||||
|
if (containers[i] instanceof IPathEntryContainerExtension) {
|
||||||
|
IPathEntryContainerExtension extension = (IPathEntryContainerExtension)containers[i];
|
||||||
|
IMacroFileEntry[] macFiles = (IMacroFileEntry[])extension.getPathEntries(resPath, IPathEntry.CDT_MACRO_FILE);
|
||||||
|
macroFileList.addAll(Arrays.asList(macFiles));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IMacroFileEntry[] macroFiles = (IMacroFileEntry[]) macroFileList.toArray(new IMacroFileEntry[macroFileList.size()]);
|
||||||
|
macroFileList.clear();
|
||||||
|
|
||||||
|
// We need to reorder the macro files:
|
||||||
|
// with the closest match to the resource coming first
|
||||||
|
// /project/src/file.c --> /usr/local/include/macrofile
|
||||||
|
// /project --> /usr/include/macrofile
|
||||||
|
//
|
||||||
|
// /usr/local/include/macrofile must come first.
|
||||||
|
//
|
||||||
|
int count = resPath.segmentCount();
|
||||||
|
for (int i = 0; i < count; i++) {
|
||||||
|
IPath newPath = resPath.removeLastSegments(i);
|
||||||
|
for (int j = 0; j < macroFiles.length; j++) {
|
||||||
|
IPath otherPath = macroFiles[j].getPath();
|
||||||
|
if (newPath.equals(otherPath)) {
|
||||||
|
macroFileList.add(macroFiles[j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Since the macroFile that comes from a project contribution are not
|
||||||
|
// tied to a resource they are added last.
|
||||||
|
for (int i = 0; i < resolvedListEntries.size(); i++) {
|
||||||
|
IPathEntry entry = (IPathEntry)resolvedListEntries.get(i);
|
||||||
|
if (entry != null && entry.getEntryKind() == IPathEntry.CDT_PROJECT) {
|
||||||
|
IResource res = cproject.getCModel().getWorkspace().getRoot().findMember(entry.getPath());
|
||||||
|
if (res != null && res.getType() == IResource.PROJECT) {
|
||||||
|
ICProject refCProject = CoreModel.getDefault().create((IProject)res);
|
||||||
|
if (refCProject != null) {
|
||||||
|
IPathEntry[] projEntries = refCProject.getResolvedPathEntries();
|
||||||
|
for (int j = 0; j < projEntries.length; j++) {
|
||||||
|
IPathEntry projEntry = projEntries[j];
|
||||||
|
if (projEntry.isExported()) {
|
||||||
|
if (projEntry.getEntryKind() == IPathEntry.CDT_MACRO_FILE) {
|
||||||
|
IMacroFileEntry macroFile = (IMacroFileEntry)projEntry;
|
||||||
|
macroFileList.add(macroFile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (IMacroFileEntry[])macroFileList.toArray(NO_MACRO_FILE_ENTRIES);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the cached entries, if no cache null.
|
* Return the cached entries, if no cache null.
|
||||||
* @param cproject
|
* @param cproject
|
||||||
|
@ -377,7 +530,7 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
|
||||||
IPathEntry[] containerEntries = container.getPathEntries();
|
IPathEntry[] containerEntries = container.getPathEntries();
|
||||||
if (containerEntries != null) {
|
if (containerEntries != null) {
|
||||||
for (int j = 0; j < containerEntries.length; j++) {
|
for (int j = 0; j < containerEntries.length; j++) {
|
||||||
IPathEntry newEntry = cloneEntryAndExpand(projectPath, containerEntries[j]);
|
IPathEntry newEntry = PathEntryUtil.cloneEntryAndExpand(projectPath, containerEntries[j]);
|
||||||
listEntries.add(newEntry);
|
listEntries.add(newEntry);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -424,17 +577,17 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
|
||||||
IPathEntry[] containerEntries = container.getPathEntries();
|
IPathEntry[] containerEntries = container.getPathEntries();
|
||||||
if (containerEntries != null) {
|
if (containerEntries != null) {
|
||||||
for (int j = 0; j < containerEntries.length; j++) {
|
for (int j = 0; j < containerEntries.length; j++) {
|
||||||
IPathEntry newEntry = cloneEntryAndExpand(projectPath, containerEntries[j]);
|
IPathEntry newEntry = PathEntryUtil.cloneEntryAndExpand(projectPath, containerEntries[j]);
|
||||||
resolvedEntries.add(newEntry);
|
resolvedEntries.add(newEntry);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
resolvedEntries.add(cloneEntryAndExpand(projectPath, entry));
|
resolvedEntries.add(PathEntryUtil.cloneEntryAndExpand(projectPath, entry));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
IPathEntry clone = cloneEntryAndExpand(projectPath, entry);
|
IPathEntry clone = PathEntryUtil.cloneEntryAndExpand(projectPath, entry);
|
||||||
IPathEntry e = getExpandedPathEntry(clone, cproject);
|
IPathEntry e = PathEntryUtil.getExpandedPathEntry(clone, cproject);
|
||||||
if (e != null) {
|
if (e != null) {
|
||||||
resolvedEntries.add(e);
|
resolvedEntries.add(e);
|
||||||
}
|
}
|
||||||
|
@ -450,7 +603,7 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
|
||||||
problemList.add(status);
|
problemList.add(status);
|
||||||
}
|
}
|
||||||
for (int j = 0; j < finalEntries.length; j++) {
|
for (int j = 0; j < finalEntries.length; j++) {
|
||||||
status = validatePathEntry(cproject, finalEntries[j], true, false);
|
status = PathEntryUtil.validatePathEntry(cproject, finalEntries[j], true, false);
|
||||||
if (!status.isOK()) {
|
if (!status.isOK()) {
|
||||||
problemList.add(status);
|
problemList.add(status);
|
||||||
}
|
}
|
||||||
|
@ -458,19 +611,19 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
|
||||||
ICModelStatus[] problems = new ICModelStatus[problemList.size()];
|
ICModelStatus[] problems = new ICModelStatus[problemList.size()];
|
||||||
problemList.toArray(problems);
|
problemList.toArray(problems);
|
||||||
IProject project = cproject.getProject();
|
IProject project = cproject.getProject();
|
||||||
if (hasPathEntryProblemMarkersChange(project, problems)) {
|
if (PathEntryUtil.hasPathEntryProblemMarkersChange(project, problems)) {
|
||||||
generateMarkers(project, problems);
|
generateMarkers(project, problems);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check for duplication in the sources
|
// Check for duplication in the sources
|
||||||
List dups = checkForDuplication(resolvedEntries, IPathEntry.CDT_SOURCE);
|
List dups = PathEntryUtil.checkForDuplication(resolvedEntries, IPathEntry.CDT_SOURCE);
|
||||||
if (dups.size() > 0) {
|
if (dups.size() > 0) {
|
||||||
resolvedEntries.removeAll(dups);
|
resolvedEntries.removeAll(dups);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check for duplication in the outputs
|
// Check for duplication in the outputs
|
||||||
dups = checkForDuplication(resolvedEntries, IPathEntry.CDT_OUTPUT);
|
dups = PathEntryUtil.checkForDuplication(resolvedEntries, IPathEntry.CDT_OUTPUT);
|
||||||
if (dups.size() > 0) {
|
if (dups.size() > 0) {
|
||||||
resolvedEntries.removeAll(dups);
|
resolvedEntries.removeAll(dups);
|
||||||
}
|
}
|
||||||
|
@ -480,190 +633,6 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
|
||||||
return resolvedEntries;
|
return resolvedEntries;
|
||||||
}
|
}
|
||||||
|
|
||||||
private IPathEntry getExpandedPathEntry(IPathEntry entry, ICProject cproject) throws CModelException {
|
|
||||||
switch (entry.getEntryKind()) {
|
|
||||||
case IPathEntry.CDT_INCLUDE : {
|
|
||||||
IIncludeEntry includeEntry = (IIncludeEntry)entry;
|
|
||||||
IPath refPath = includeEntry.getBaseReference();
|
|
||||||
if (refPath != null && !refPath.isEmpty()) {
|
|
||||||
IPath includePath = includeEntry.getIncludePath();
|
|
||||||
if (refPath.isAbsolute()) {
|
|
||||||
IResource res = cproject.getCModel().getWorkspace().getRoot().findMember(refPath);
|
|
||||||
if (res != null && res.getType() == IResource.PROJECT) {
|
|
||||||
IProject project = (IProject)res;
|
|
||||||
if (CoreModel.hasCNature(project) || CoreModel.hasCCNature(project)) {
|
|
||||||
ICProject refCProject = CoreModel.getDefault().create(project);
|
|
||||||
if (refCProject != null) {
|
|
||||||
IPathEntry[] entries = getResolvedPathEntries(refCProject);
|
|
||||||
for (int i = 0; i < entries.length; i++) {
|
|
||||||
if (entries[i].getEntryKind() == IPathEntry.CDT_INCLUDE) {
|
|
||||||
IIncludeEntry refEntry = (IIncludeEntry)entries[i];
|
|
||||||
if (refEntry.getIncludePath().equals(includePath)) {
|
|
||||||
IPath newBasePath = refEntry.getBasePath();
|
|
||||||
// If the includePath is
|
|
||||||
// relative give a new basepath
|
|
||||||
// if none
|
|
||||||
if (!newBasePath.isAbsolute() && !includePath.isAbsolute()) {
|
|
||||||
IResource refRes;
|
|
||||||
if (!newBasePath.isEmpty()) {
|
|
||||||
refRes = cproject.getCModel().getWorkspace().getRoot().findMember(
|
|
||||||
newBasePath);
|
|
||||||
} else {
|
|
||||||
IPath refResPath = refEntry.getPath();
|
|
||||||
refRes = cproject.getCModel().getWorkspace().getRoot().findMember(
|
|
||||||
refResPath);
|
|
||||||
}
|
|
||||||
if (refRes != null) {
|
|
||||||
if (refRes.getType() == IResource.FILE) {
|
|
||||||
refRes = refRes.getParent();
|
|
||||||
}
|
|
||||||
newBasePath = refRes.getLocation().append(newBasePath);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return CoreModel.newIncludeEntry(includeEntry.getPath(), newBasePath, includePath);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else { // Container ref
|
|
||||||
IPathEntryContainer container = getPathEntryContainer(refPath, cproject);
|
|
||||||
if (container != null) {
|
|
||||||
IPathEntry[] entries = container.getPathEntries();
|
|
||||||
for (int i = 0; i < entries.length; i++) {
|
|
||||||
if (entries[i].getEntryKind() == IPathEntry.CDT_INCLUDE) {
|
|
||||||
IIncludeEntry refEntry = (IIncludeEntry)entries[i];
|
|
||||||
if (refEntry.getIncludePath().equals(includePath)) {
|
|
||||||
IPath newBasePath = refEntry.getBasePath();
|
|
||||||
return CoreModel.newIncludeEntry(includeEntry.getPath(), newBasePath, includePath);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case IPathEntry.CDT_MACRO : {
|
|
||||||
IMacroEntry macroEntry = (IMacroEntry)entry;
|
|
||||||
IPath refPath = macroEntry.getBaseReference();
|
|
||||||
if (refPath != null && !refPath.isEmpty()) {
|
|
||||||
String name = macroEntry.getMacroName();
|
|
||||||
if (refPath.isAbsolute()) {
|
|
||||||
IResource res = cproject.getCModel().getWorkspace().getRoot().findMember(refPath);
|
|
||||||
if (res != null && res.getType() == IResource.PROJECT) {
|
|
||||||
IProject project = (IProject)res;
|
|
||||||
if (CoreModel.hasCNature(project) || CoreModel.hasCCNature(project)) {
|
|
||||||
ICProject refCProject = CoreModel.getDefault().create(project);
|
|
||||||
if (refCProject != null) {
|
|
||||||
IPathEntry[] entries = getResolvedPathEntries(refCProject);
|
|
||||||
for (int i = 0; i < entries.length; i++) {
|
|
||||||
if (entries[i].getEntryKind() == IPathEntry.CDT_MACRO) {
|
|
||||||
IMacroEntry refEntry = (IMacroEntry)entries[i];
|
|
||||||
if (refEntry.getMacroName().equals(name)) {
|
|
||||||
String value = refEntry.getMacroValue();
|
|
||||||
return CoreModel.newMacroEntry(macroEntry.getPath(), name, value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else { // Container ref
|
|
||||||
IPathEntryContainer container = getPathEntryContainer(refPath, cproject);
|
|
||||||
if (container != null) {
|
|
||||||
IPathEntry[] entries = container.getPathEntries();
|
|
||||||
for (int i = 0; i < entries.length; i++) {
|
|
||||||
if (entries[i].getEntryKind() == IPathEntry.CDT_MACRO) {
|
|
||||||
IMacroEntry refEntry = (IMacroEntry)entries[i];
|
|
||||||
if (refEntry.getMacroName().equals(name)) {
|
|
||||||
String value = refEntry.getMacroValue();
|
|
||||||
return CoreModel.newMacroEntry(macroEntry.getPath(), name, value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case IPathEntry.CDT_LIBRARY : {
|
|
||||||
ILibraryEntry libEntry = (ILibraryEntry)entry;
|
|
||||||
IPath refPath = libEntry.getBaseReference();
|
|
||||||
if (refPath != null && !refPath.isEmpty()) {
|
|
||||||
IPath libraryPath = libEntry.getLibraryPath();
|
|
||||||
if (refPath.isAbsolute()) {
|
|
||||||
IResource res = cproject.getCModel().getWorkspace().getRoot().findMember(refPath);
|
|
||||||
if (res != null && res.getType() == IResource.PROJECT) {
|
|
||||||
IProject project = (IProject)res;
|
|
||||||
if (CoreModel.hasCNature(project) || CoreModel.hasCCNature(project)) {
|
|
||||||
ICProject refCProject = CoreModel.getDefault().create(project);
|
|
||||||
if (refCProject != null) {
|
|
||||||
IPathEntry[] entries = getResolvedPathEntries(refCProject);
|
|
||||||
for (int i = 0; i < entries.length; i++) {
|
|
||||||
if (entries[i].getEntryKind() == IPathEntry.CDT_LIBRARY) {
|
|
||||||
ILibraryEntry refEntry = (ILibraryEntry)entries[i];
|
|
||||||
if (refEntry.getLibraryPath().equals(libraryPath)) {
|
|
||||||
IPath newBasePath = refEntry.getBasePath();
|
|
||||||
// If the libraryPath is
|
|
||||||
// relative give a new basepath
|
|
||||||
// if none
|
|
||||||
if (!newBasePath.isAbsolute() && !libraryPath.isAbsolute()) {
|
|
||||||
IResource refRes;
|
|
||||||
if (!newBasePath.isEmpty()) {
|
|
||||||
refRes = cproject.getCModel().getWorkspace().getRoot().findMember(
|
|
||||||
newBasePath);
|
|
||||||
} else {
|
|
||||||
IPath refResPath = refEntry.getPath();
|
|
||||||
refRes = cproject.getCModel().getWorkspace().getRoot().findMember(
|
|
||||||
refResPath);
|
|
||||||
}
|
|
||||||
if (refRes != null) {
|
|
||||||
if (refRes.getType() == IResource.FILE) {
|
|
||||||
refRes = refRes.getParent();
|
|
||||||
}
|
|
||||||
newBasePath = refRes.getLocation().append(newBasePath);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return CoreModel.newLibraryEntry(entry.getPath(), newBasePath,
|
|
||||||
refEntry.getLibraryPath(), refEntry.getSourceAttachmentPath(),
|
|
||||||
refEntry.getSourceAttachmentRootPath(),
|
|
||||||
refEntry.getSourceAttachmentPrefixMapping(), false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else { // Container ref
|
|
||||||
IPathEntryContainer container = getPathEntryContainer(refPath, cproject);
|
|
||||||
if (container != null) {
|
|
||||||
IPathEntry[] entries = container.getPathEntries();
|
|
||||||
for (int i = 0; i < entries.length; i++) {
|
|
||||||
if (entries[i].getEntryKind() == IPathEntry.CDT_LIBRARY) {
|
|
||||||
ILibraryEntry refEntry = (ILibraryEntry)entries[i];
|
|
||||||
if (refEntry.getPath().equals(libraryPath)) {
|
|
||||||
return CoreModel.newLibraryEntry(entry.getPath(), refEntry.getBasePath(),
|
|
||||||
refEntry.getLibraryPath(), refEntry.getSourceAttachmentPath(),
|
|
||||||
refEntry.getSourceAttachmentRootPath(),
|
|
||||||
refEntry.getSourceAttachmentPrefixMapping(), false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
return entry;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setRawPathEntries(ICProject cproject, IPathEntry[] newEntries, IProgressMonitor monitor) throws CModelException {
|
public void setRawPathEntries(ICProject cproject, IPathEntry[] newEntries, IProgressMonitor monitor) throws CModelException {
|
||||||
try {
|
try {
|
||||||
IPathEntry[] oldResolvedEntries = getCachedResolvedPathEntries(cproject);
|
IPathEntry[] oldResolvedEntries = getCachedResolvedPathEntries(cproject);
|
||||||
|
@ -1095,6 +1064,13 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case IPathEntry.CDT_INCLUDE_FILE : {
|
||||||
|
IIncludeFileEntry includeFile = (IIncludeFileEntry)entries[i];
|
||||||
|
entry = CoreModel.newIncludeFileEntry(resourcePath, includeFile.getBasePath(),
|
||||||
|
includeFile.getBaseReference(), includeFile.getIncludeFilePath(),
|
||||||
|
includeFile.getExclusionPatterns(), includeFile.isExported());
|
||||||
|
break;
|
||||||
|
}
|
||||||
case IPathEntry.CDT_LIBRARY : {
|
case IPathEntry.CDT_LIBRARY : {
|
||||||
ILibraryEntry library = (ILibraryEntry)entries[i];
|
ILibraryEntry library = (ILibraryEntry)entries[i];
|
||||||
IPath sourcePath = library.getSourceAttachmentPath();
|
IPath sourcePath = library.getSourceAttachmentPath();
|
||||||
|
@ -1128,6 +1104,13 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case IPathEntry.CDT_MACRO_FILE : {
|
||||||
|
IMacroFileEntry macro = (IMacroFileEntry)entries[i];
|
||||||
|
entry = CoreModel.newMacroFileEntry(resourcePath, macro.getBasePath(),
|
||||||
|
macro.getBaseReference(), macro.getMacroFilePath(),
|
||||||
|
macro.getExclusionPatterns(), macro.isExported());
|
||||||
|
break;
|
||||||
|
}
|
||||||
case IPathEntry.CDT_OUTPUT : {
|
case IPathEntry.CDT_OUTPUT : {
|
||||||
IOutputEntry out = (IOutputEntry)entries[i];
|
IOutputEntry out = (IOutputEntry)entries[i];
|
||||||
entry = CoreModel.newOutputEntry(resourcePath, out.getExclusionPatterns());
|
entry = CoreModel.newOutputEntry(resourcePath, out.getExclusionPatterns());
|
||||||
|
@ -1178,9 +1161,9 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
|
||||||
* @see org.eclipse.core.resources.IWorkspaceRunnable#run(org.eclipse.core.runtime.IProgressMonitor)
|
* @see org.eclipse.core.resources.IWorkspaceRunnable#run(org.eclipse.core.runtime.IProgressMonitor)
|
||||||
*/
|
*/
|
||||||
public void run(IProgressMonitor mon) throws CoreException {
|
public void run(IProgressMonitor mon) throws CoreException {
|
||||||
flushPathEntryProblemMarkers(project);
|
PathEntryUtil.flushPathEntryProblemMarkers(project);
|
||||||
for (int i = 0; i < problems.length; ++i) {
|
for (int i = 0; i < problems.length; ++i) {
|
||||||
createPathEntryProblemMarker(project, problems[i]);
|
PathEntryUtil.createPathEntryProblemMarker(project, problems[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, null);
|
}, null);
|
||||||
|
@ -1304,13 +1287,27 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
|
||||||
flag = ICElementDelta.F_CHANGED_PATHENTRY_INCLUDE;
|
flag = ICElementDelta.F_CHANGED_PATHENTRY_INCLUDE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case IPathEntry.CDT_MACRO : {
|
case IPathEntry.CDT_INCLUDE_FILE: {
|
||||||
|
IIncludeFileEntry includeFile = (IIncludeFileEntry)entry;
|
||||||
|
IPath path = includeFile.getPath();
|
||||||
|
celement = CoreModel.getDefault().create(path);
|
||||||
|
flag = ICElementDelta.F_CHANGED_PATHENTRY_INCLUDE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case IPathEntry.CDT_MACRO : {
|
||||||
IMacroEntry macro = (IMacroEntry)entry;
|
IMacroEntry macro = (IMacroEntry)entry;
|
||||||
IPath path = macro.getPath();
|
IPath path = macro.getPath();
|
||||||
celement = CoreModel.getDefault().create(path);
|
celement = CoreModel.getDefault().create(path);
|
||||||
flag = ICElementDelta.F_CHANGED_PATHENTRY_MACRO;
|
flag = ICElementDelta.F_CHANGED_PATHENTRY_MACRO;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case IPathEntry.CDT_MACRO_FILE: {
|
||||||
|
IMacroFileEntry macro = (IMacroFileEntry)entry;
|
||||||
|
IPath path = macro.getPath();
|
||||||
|
celement = CoreModel.getDefault().create(path);
|
||||||
|
flag = ICElementDelta.F_CHANGED_PATHENTRY_MACRO;
|
||||||
|
break;
|
||||||
|
}
|
||||||
case IPathEntry.CDT_CONTAINER : {
|
case IPathEntry.CDT_CONTAINER : {
|
||||||
//IContainerEntry container = (IContainerEntry) entry;
|
//IContainerEntry container = (IContainerEntry) entry;
|
||||||
//celement = cproject;
|
//celement = cproject;
|
||||||
|
@ -1464,14 +1461,14 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
|
||||||
if (markers != null && markers.length > 0) {
|
if (markers != null && markers.length > 0) {
|
||||||
ArrayList problemList = new ArrayList();
|
ArrayList problemList = new ArrayList();
|
||||||
for (int j = 0; j < entries.length; j++) {
|
for (int j = 0; j < entries.length; j++) {
|
||||||
ICModelStatus status = validatePathEntry(cProjects[i], entries[j], true, false);
|
ICModelStatus status = PathEntryUtil.validatePathEntry(cProjects[i], entries[j], true, false);
|
||||||
if (!status.isOK()) {
|
if (!status.isOK()) {
|
||||||
problemList.add(status);
|
problemList.add(status);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ICModelStatus[] problems = new ICModelStatus[problemList.size()];
|
ICModelStatus[] problems = new ICModelStatus[problemList.size()];
|
||||||
problemList.toArray(problems);
|
problemList.toArray(problems);
|
||||||
if (hasPathEntryProblemMarkersChange(project, problems)) {
|
if (PathEntryUtil.hasPathEntryProblemMarkersChange(project, problems)) {
|
||||||
generateMarkers(project, problems);
|
generateMarkers(project, problems);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1532,392 +1529,13 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected IPathEntry cloneEntryAndExpand(IPath rpath, IPathEntry entry) {
|
|
||||||
|
|
||||||
// get the path
|
|
||||||
IPath entryPath = entry.getPath();
|
|
||||||
if (entryPath == null) {
|
|
||||||
entryPath = Path.EMPTY;
|
|
||||||
}
|
|
||||||
IPath resourcePath = (entryPath.isAbsolute()) ? entryPath : rpath.append(entryPath);
|
|
||||||
|
|
||||||
IPathEntryVariableManager varManager = CCorePlugin.getDefault().getPathEntryVariableManager();
|
|
||||||
switch (entry.getEntryKind()) {
|
|
||||||
case IPathEntry.CDT_INCLUDE : {
|
|
||||||
IIncludeEntry include = (IIncludeEntry)entry;
|
|
||||||
|
|
||||||
IPath basePath = include.getBasePath();
|
|
||||||
basePath = varManager.resolvePath(basePath);
|
|
||||||
|
|
||||||
IPath includePath = include.getIncludePath();
|
|
||||||
includePath = varManager.resolvePath(includePath);
|
|
||||||
|
|
||||||
return CoreModel.newIncludeEntry(resourcePath, basePath, includePath,
|
|
||||||
include.isSystemInclude(), include.getExclusionPatterns(), include.isExported());
|
|
||||||
}
|
|
||||||
case IPathEntry.CDT_LIBRARY : {
|
|
||||||
ILibraryEntry library = (ILibraryEntry)entry;
|
|
||||||
|
|
||||||
IPath basePath = library.getBasePath();
|
|
||||||
basePath = varManager.resolvePath(basePath);
|
|
||||||
|
|
||||||
IPath libraryPath = library.getLibraryPath();
|
|
||||||
libraryPath = varManager.resolvePath(libraryPath);
|
|
||||||
|
|
||||||
IPath sourceAttachmentPath = library.getSourceAttachmentPath();
|
|
||||||
sourceAttachmentPath = varManager.resolvePath(sourceAttachmentPath);
|
|
||||||
|
|
||||||
IPath sourceAttachmentRootPath = library.getSourceAttachmentRootPath();
|
|
||||||
sourceAttachmentRootPath = varManager.resolvePath(sourceAttachmentRootPath);
|
|
||||||
|
|
||||||
IPath sourceAttachmentPrefixMapping = library.getSourceAttachmentPrefixMapping();
|
|
||||||
sourceAttachmentPrefixMapping = varManager.resolvePath(sourceAttachmentPrefixMapping);
|
|
||||||
|
|
||||||
return CoreModel.newLibraryEntry(resourcePath, basePath, libraryPath,
|
|
||||||
sourceAttachmentPath, sourceAttachmentRootPath,
|
|
||||||
sourceAttachmentPrefixMapping, library.isExported());
|
|
||||||
}
|
|
||||||
case IPathEntry.CDT_MACRO : {
|
|
||||||
IMacroEntry macro = (IMacroEntry)entry;
|
|
||||||
return CoreModel.newMacroEntry(resourcePath, macro.getMacroName(), macro.getMacroValue(),
|
|
||||||
macro.getExclusionPatterns(), macro.isExported());
|
|
||||||
}
|
|
||||||
case IPathEntry.CDT_OUTPUT : {
|
|
||||||
IOutputEntry out = (IOutputEntry)entry;
|
|
||||||
return CoreModel.newOutputEntry(resourcePath, out.getExclusionPatterns());
|
|
||||||
}
|
|
||||||
case IPathEntry.CDT_PROJECT : {
|
|
||||||
IProjectEntry projEntry = (IProjectEntry)entry;
|
|
||||||
return CoreModel.newProjectEntry(projEntry.getPath(), projEntry.isExported());
|
|
||||||
}
|
|
||||||
case IPathEntry.CDT_SOURCE : {
|
|
||||||
ISourceEntry source = (ISourceEntry)entry;
|
|
||||||
return CoreModel.newSourceEntry(resourcePath, source.getExclusionPatterns());
|
|
||||||
}
|
|
||||||
case IPathEntry.CDT_CONTAINER : {
|
|
||||||
return CoreModel.newContainerEntry(entry.getPath(), entry.isExported());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return entry;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ICModelStatus validatePathEntry(ICProject cProject, IPathEntry[] entries) {
|
public ICModelStatus validatePathEntry(ICProject cProject, IPathEntry[] entries) {
|
||||||
|
return PathEntryUtil.validatePathEntry(cProject, entries);
|
||||||
// Check duplication.
|
|
||||||
for (int i = 0; i < entries.length; i++) {
|
|
||||||
IPathEntry entry = entries[i];
|
|
||||||
if (entry == null) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
for (int j = 0; j < entries.length; j++) {
|
|
||||||
IPathEntry otherEntry = entries[j];
|
|
||||||
if (otherEntry == null) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (entry != otherEntry && otherEntry.equals(entry)) {
|
|
||||||
StringBuffer errMesg = new StringBuffer(CCorePlugin.getResourceString("CoreModel.PathEntry.DuplicateEntry")); //$NON-NLS-1$
|
|
||||||
return new CModelStatus(ICModelStatusConstants.INVALID_PATHENTRY, errMesg.toString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// check duplication of sources
|
|
||||||
List dups = checkForDuplication(Arrays.asList(entries), IPathEntry.CDT_SOURCE);
|
|
||||||
if (dups.size() > 0) {
|
|
||||||
ICModelStatus[] cmodelStatus = new ICModelStatus[dups.size()];
|
|
||||||
for (int i = 0; i < dups.size(); ++i) {
|
|
||||||
StringBuffer errMesg = new StringBuffer(CCorePlugin.getResourceString("CoreModel.PathEntry.DuplicateEntry")); //$NON-NLS-1$
|
|
||||||
cmodelStatus[i] = new CModelStatus(ICModelStatusConstants.INVALID_PATHENTRY, errMesg.toString());
|
|
||||||
}
|
|
||||||
return CModelStatus.newMultiStatus(ICModelStatusConstants.INVALID_PATHENTRY, cmodelStatus);
|
|
||||||
}
|
|
||||||
|
|
||||||
// check duplication of Outputs
|
|
||||||
dups = checkForDuplication(Arrays.asList(entries), IPathEntry.CDT_OUTPUT);
|
|
||||||
if (dups.size() > 0) {
|
|
||||||
ICModelStatus[] cmodelStatus = new ICModelStatus[dups.size()];
|
|
||||||
for (int i = 0; i < dups.size(); ++i) {
|
|
||||||
StringBuffer errMesg = new StringBuffer(CCorePlugin.getResourceString("CoreModel.PathEntry.DuplicateEntry")); //$NON-NLS-1$
|
|
||||||
cmodelStatus[i] = new CModelStatus(ICModelStatusConstants.NAME_COLLISION, errMesg.toString());
|
|
||||||
}
|
|
||||||
return CModelStatus.newMultiStatus(ICModelStatusConstants.INVALID_PATHENTRY, cmodelStatus);
|
|
||||||
}
|
|
||||||
|
|
||||||
// allow nesting source entries in each other as long as the outer entry
|
|
||||||
// excludes the inner one
|
|
||||||
for (int i = 0; i < entries.length; i++) {
|
|
||||||
IPathEntry entry = entries[i];
|
|
||||||
if (entry == null) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
IPath entryPath = entry.getPath();
|
|
||||||
int kind = entry.getEntryKind();
|
|
||||||
if (kind == IPathEntry.CDT_SOURCE) {
|
|
||||||
for (int j = 0; j < entries.length; j++) {
|
|
||||||
IPathEntry otherEntry = entries[j];
|
|
||||||
if (otherEntry == null) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
int otherKind = otherEntry.getEntryKind();
|
|
||||||
IPath otherPath = otherEntry.getPath();
|
|
||||||
if (entry != otherEntry && (otherKind == IPathEntry.CDT_SOURCE)) {
|
|
||||||
char[][] exclusionPatterns = ((ISourceEntry)otherEntry).fullExclusionPatternChars();
|
|
||||||
if (otherPath.isPrefixOf(entryPath) && !otherPath.equals(entryPath)
|
|
||||||
&& !CoreModelUtil.isExcluded(entryPath.append("*"), exclusionPatterns)) { //$NON-NLS-1$
|
|
||||||
|
|
||||||
String exclusionPattern = entryPath.removeFirstSegments(otherPath.segmentCount()).segment(0);
|
|
||||||
if (CoreModelUtil.isExcluded(entryPath, exclusionPatterns)) {
|
|
||||||
StringBuffer errMesg = new StringBuffer(
|
|
||||||
CCorePlugin.getResourceString("CoreModel.PathEntry.NestedEntry")); //$NON-NLS-1$
|
|
||||||
return new CModelStatus(ICModelStatusConstants.INVALID_PATHENTRY, errMesg.toString());
|
|
||||||
} else if (otherKind == IPathEntry.CDT_SOURCE) {
|
|
||||||
exclusionPattern += '/';
|
|
||||||
StringBuffer errMesg = new StringBuffer(
|
|
||||||
CCorePlugin.getResourceString("CoreModel.PathEntry.NestedEntry")); //$NON-NLS-1$
|
|
||||||
return new CModelStatus(ICModelStatusConstants.INVALID_PATHENTRY, errMesg.toString());
|
|
||||||
} else {
|
|
||||||
StringBuffer errMesg = new StringBuffer(
|
|
||||||
CCorePlugin.getResourceString("CoreModel.PathEntry.NestedEntry")); //$NON-NLS-1$
|
|
||||||
return new CModelStatus(ICModelStatusConstants.INVALID_PATHENTRY, errMesg.toString()); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return CModelStatus.VERIFIED_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public ICModelStatus validatePathEntry(ICProject cProject, IPathEntry entry, boolean checkSourceAttachment,
|
public ICModelStatus validatePathEntry(ICProject cProject, IPathEntry entry, boolean checkSourceAttachment,
|
||||||
boolean recurseInContainers) {
|
boolean recurseInContainers) {
|
||||||
IProject project = cProject.getProject();
|
return PathEntryUtil.validatePathEntry(cProject, entry, checkSourceAttachment, recurseInContainers);
|
||||||
IPath path = entry.getPath();
|
|
||||||
if (entry.getEntryKind() != IPathEntry.CDT_PROJECT) {
|
|
||||||
if (!isValidWorkspacePath(project, path)) {
|
|
||||||
return new CModelStatus(
|
|
||||||
ICModelStatusConstants.INVALID_PATHENTRY,
|
|
||||||
CoreModelMessages.getString("PathEntryManager.0") + path.toOSString() + " for " + ((PathEntry)entry).getKindString()); //$NON-NLS-1$ //$NON-NLS-2$
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (entry.getEntryKind()) {
|
|
||||||
case IPathEntry.CDT_INCLUDE : {
|
|
||||||
IIncludeEntry include = (IIncludeEntry)entry;
|
|
||||||
IPath includePath = include.getFullIncludePath();
|
|
||||||
if (!isValidExternalPath(includePath)) {
|
|
||||||
return new CModelStatus(ICModelStatusConstants.INVALID_PATHENTRY,
|
|
||||||
CoreModelMessages.getString("PathEntryManager.2") + " (" + includePath.toOSString() + ")"); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
|
|
||||||
}
|
|
||||||
if (!isValidBasePath(include.getBasePath())) {
|
|
||||||
return new CModelStatus(ICModelStatusConstants.INVALID_PATHENTRY,
|
|
||||||
CoreModelMessages.getString("PathEntryManager.1") + " (" + includePath.toOSString() + ")"); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case IPathEntry.CDT_LIBRARY : {
|
|
||||||
ILibraryEntry library = (ILibraryEntry)entry;
|
|
||||||
if (checkSourceAttachment) {
|
|
||||||
IPath sourceAttach = library.getSourceAttachmentPath();
|
|
||||||
if (sourceAttach != null) {
|
|
||||||
if (!sourceAttach.isAbsolute()) {
|
|
||||||
if (!isValidWorkspacePath(project, sourceAttach) || !isValidExternalPath(sourceAttach)) {
|
|
||||||
return new CModelStatus(ICModelStatusConstants.INVALID_PATHENTRY,
|
|
||||||
CoreModelMessages.getString("PathEntryManager.3") + " (" + sourceAttach.toOSString() + ")"); //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
IPath libraryPath = library.getFullLibraryPath();
|
|
||||||
if (!isValidExternalPath(libraryPath)) {
|
|
||||||
return new CModelStatus(ICModelStatusConstants.INVALID_PATHENTRY,
|
|
||||||
CoreModelMessages.getString("PathEntryManager.4") + " (" + libraryPath.toOSString() + ")"); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
|
|
||||||
}
|
|
||||||
if (!isValidBasePath(library.getBasePath())) {
|
|
||||||
return new CModelStatus(ICModelStatusConstants.INVALID_PATHENTRY,
|
|
||||||
CoreModelMessages.getString("PathEntryManager.7") + " (" + libraryPath.toOSString() + ")"); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case IPathEntry.CDT_PROJECT : {
|
|
||||||
IProjectEntry projEntry = (IProjectEntry)entry;
|
|
||||||
path = projEntry.getPath();
|
|
||||||
IProject reqProject = project.getWorkspace().getRoot().getProject(path.segment(0));
|
|
||||||
if (!reqProject.isAccessible()) {
|
|
||||||
return new CModelStatus(ICModelStatusConstants.INVALID_PATHENTRY,
|
|
||||||
CoreModelMessages.getString("PathEntryManager.5")); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
if (! (CoreModel.hasCNature(reqProject) || CoreModel.hasCCNature(reqProject))) {
|
|
||||||
return new CModelStatus(ICModelStatusConstants.INVALID_PATHENTRY,
|
|
||||||
CoreModelMessages.getString("PathEntryManager.6")); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case IPathEntry.CDT_CONTAINER :
|
|
||||||
if (recurseInContainers) {
|
|
||||||
try {
|
|
||||||
IPathEntryContainer cont = getPathEntryContainer((IContainerEntry)entry, cProject);
|
|
||||||
IPathEntry[] contEntries = cont.getPathEntries();
|
|
||||||
for (int i = 0; i < contEntries.length; i++) {
|
|
||||||
ICModelStatus status = validatePathEntry(cProject, contEntries[i], checkSourceAttachment, false);
|
|
||||||
if (!status.isOK()) {
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (CModelException e) {
|
|
||||||
return new CModelStatus(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return CModelStatus.VERIFIED_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isValidWorkspacePath(IProject project, IPath path) {
|
|
||||||
if (path == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
IWorkspaceRoot workspaceRoot = project.getWorkspace().getRoot();
|
|
||||||
// We accept empy path as the project
|
|
||||||
IResource res = null;
|
|
||||||
if (path.isAbsolute()) {
|
|
||||||
res = workspaceRoot.findMember(path);
|
|
||||||
} else {
|
|
||||||
res = project.findMember(path);
|
|
||||||
}
|
|
||||||
return (res != null && res.isAccessible());
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isValidExternalPath(IPath path) {
|
|
||||||
if (path != null) {
|
|
||||||
File file = path.toFile();
|
|
||||||
if (file != null) {
|
|
||||||
return file.exists();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isValidBasePath(IPath path) {
|
|
||||||
if (!path.isEmpty() && !path.isAbsolute()) {
|
|
||||||
IResource res = ResourcesPlugin.getWorkspace().getRoot().findMember(path);
|
|
||||||
if (res == null || !res.isAccessible()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private List checkForDuplication(List pathEntries, int type) {
|
|
||||||
List duplicate = new ArrayList(pathEntries.size());
|
|
||||||
for (int i = 0; i < pathEntries.size(); ++i) {
|
|
||||||
IPathEntry pathEntry = (IPathEntry)pathEntries.get(i);
|
|
||||||
if (pathEntry.getEntryKind() == type) {
|
|
||||||
for (int j = 0; j < pathEntries.size(); ++j) {
|
|
||||||
IPathEntry otherEntry = (IPathEntry)pathEntries.get(j);
|
|
||||||
if (otherEntry.getEntryKind() == type) {
|
|
||||||
if (!pathEntry.equals(otherEntry)) {
|
|
||||||
if (!duplicate.contains(pathEntry)) {
|
|
||||||
if (pathEntry.getPath().equals(otherEntry.getPath())) {
|
|
||||||
// duplication of sources
|
|
||||||
duplicate.add(otherEntry);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return duplicate;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Record a new marker denoting a pathentry problem
|
|
||||||
*/
|
|
||||||
void createPathEntryProblemMarker(IProject project, ICModelStatus status) {
|
|
||||||
int severity = code2Severity(status);
|
|
||||||
try {
|
|
||||||
IMarker marker = project.createMarker(ICModelMarker.PATHENTRY_PROBLEM_MARKER);
|
|
||||||
marker.setAttributes(new String[]{IMarker.MESSAGE, IMarker.SEVERITY, IMarker.LOCATION,
|
|
||||||
ICModelMarker.PATHENTRY_FILE_FORMAT,}, new Object[]{status.getMessage(), new Integer(severity), "pathentry",//$NON-NLS-1$
|
|
||||||
"false",//$NON-NLS-1$
|
|
||||||
});
|
|
||||||
} catch (CoreException e) {
|
|
||||||
// could not create marker: cannot do much
|
|
||||||
//e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Remove all markers denoting pathentry problems
|
|
||||||
*/
|
|
||||||
protected void flushPathEntryProblemMarkers(IProject project) {
|
|
||||||
IWorkspace workspace = project.getWorkspace();
|
|
||||||
|
|
||||||
try {
|
|
||||||
IMarker[] markers = getPathEntryProblemMarkers(project);
|
|
||||||
workspace.deleteMarkers(markers);
|
|
||||||
} catch (CoreException e) {
|
|
||||||
// could not flush markers: not much we can do
|
|
||||||
//e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* get all markers denoting pathentry problems
|
|
||||||
*/
|
|
||||||
protected IMarker[] getPathEntryProblemMarkers(IProject project) {
|
|
||||||
|
|
||||||
try {
|
|
||||||
IMarker[] markers = project.findMarkers(ICModelMarker.PATHENTRY_PROBLEM_MARKER, false, IResource.DEPTH_ZERO);
|
|
||||||
if (markers != null) {
|
|
||||||
return markers;
|
|
||||||
}
|
|
||||||
} catch (CoreException e) {
|
|
||||||
//e.printStackTrace();
|
|
||||||
}
|
|
||||||
return NO_MARKERS;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected boolean hasPathEntryProblemMarkersChange(IProject project, ICModelStatus[] status) {
|
|
||||||
IMarker[] markers = getPathEntryProblemMarkers(project);
|
|
||||||
if (markers.length != status.length) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
for (int i = 0; i < markers.length; ++i) {
|
|
||||||
boolean found = false;
|
|
||||||
String message = markers[i].getAttribute(IMarker.MESSAGE, ""); //$NON-NLS-1$
|
|
||||||
int severity = markers[i].getAttribute(IMarker.SEVERITY, IMarker.SEVERITY_ERROR);
|
|
||||||
for (int j = 0; j < status.length; ++j) {
|
|
||||||
String msg = status[j].getMessage();
|
|
||||||
int cseverity = code2Severity(status[j]);
|
|
||||||
if (msg.equals(message) && severity == cseverity) {
|
|
||||||
found = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!found) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
int code2Severity(ICModelStatus status) {
|
|
||||||
int severity;
|
|
||||||
switch (status.getCode()) {
|
|
||||||
case ICModelStatusConstants.INVALID_PATHENTRY :
|
|
||||||
severity = IMarker.SEVERITY_WARNING;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ICModelStatusConstants.INVALID_PATH :
|
|
||||||
severity = IMarker.SEVERITY_WARNING;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default :
|
|
||||||
severity = IMarker.SEVERITY_ERROR;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return severity;
|
|
||||||
}
|
|
||||||
}
|
}
|
|
@ -0,0 +1,655 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2000, 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.io.File;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.CCorePlugin;
|
||||||
|
import org.eclipse.cdt.core.model.CModelException;
|
||||||
|
import org.eclipse.cdt.core.model.CoreModel;
|
||||||
|
import org.eclipse.cdt.core.model.CoreModelUtil;
|
||||||
|
import org.eclipse.cdt.core.model.ICModelMarker;
|
||||||
|
import org.eclipse.cdt.core.model.ICModelStatus;
|
||||||
|
import org.eclipse.cdt.core.model.ICModelStatusConstants;
|
||||||
|
import org.eclipse.cdt.core.model.ICProject;
|
||||||
|
import org.eclipse.cdt.core.model.IContainerEntry;
|
||||||
|
import org.eclipse.cdt.core.model.IIncludeEntry;
|
||||||
|
import org.eclipse.cdt.core.model.IIncludeFileEntry;
|
||||||
|
import org.eclipse.cdt.core.model.ILibraryEntry;
|
||||||
|
import org.eclipse.cdt.core.model.IMacroEntry;
|
||||||
|
import org.eclipse.cdt.core.model.IMacroFileEntry;
|
||||||
|
import org.eclipse.cdt.core.model.IOutputEntry;
|
||||||
|
import org.eclipse.cdt.core.model.IPathEntry;
|
||||||
|
import org.eclipse.cdt.core.model.IPathEntryContainer;
|
||||||
|
import org.eclipse.cdt.core.model.IProjectEntry;
|
||||||
|
import org.eclipse.cdt.core.model.ISourceEntry;
|
||||||
|
import org.eclipse.cdt.core.resources.IPathEntryVariableManager;
|
||||||
|
import org.eclipse.core.resources.IMarker;
|
||||||
|
import org.eclipse.core.resources.IProject;
|
||||||
|
import org.eclipse.core.resources.IResource;
|
||||||
|
import org.eclipse.core.resources.IWorkspace;
|
||||||
|
import org.eclipse.core.resources.IWorkspaceRoot;
|
||||||
|
import org.eclipse.core.resources.ResourcesPlugin;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.IPath;
|
||||||
|
import org.eclipse.core.runtime.Path;
|
||||||
|
|
||||||
|
public class PathEntryUtil {
|
||||||
|
|
||||||
|
static PathEntryManager manager = PathEntryManager.getDefault();
|
||||||
|
static final IMarker[] NO_MARKERS = new IMarker[0];
|
||||||
|
|
||||||
|
private PathEntryUtil() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IPathEntry getExpandedPathEntry(IPathEntry entry, ICProject cproject) throws CModelException {
|
||||||
|
switch (entry.getEntryKind()) {
|
||||||
|
case IPathEntry.CDT_INCLUDE : {
|
||||||
|
IIncludeEntry includeEntry = (IIncludeEntry)entry;
|
||||||
|
IPath refPath = includeEntry.getBaseReference();
|
||||||
|
if (refPath != null && !refPath.isEmpty()) {
|
||||||
|
IPath includePath = includeEntry.getIncludePath();
|
||||||
|
if (refPath.isAbsolute()) {
|
||||||
|
IResource res = cproject.getCModel().getWorkspace().getRoot().findMember(refPath);
|
||||||
|
if (res != null && res.getType() == IResource.PROJECT) {
|
||||||
|
IProject project = (IProject)res;
|
||||||
|
if (CoreModel.hasCNature(project) || CoreModel.hasCCNature(project)) {
|
||||||
|
ICProject refCProject = CoreModel.getDefault().create(project);
|
||||||
|
if (refCProject != null) {
|
||||||
|
IPathEntry[] entries = manager.getResolvedPathEntries(refCProject);
|
||||||
|
for (int i = 0; i < entries.length; i++) {
|
||||||
|
if (entries[i].getEntryKind() == IPathEntry.CDT_INCLUDE) {
|
||||||
|
IIncludeEntry refEntry = (IIncludeEntry)entries[i];
|
||||||
|
if (refEntry.getIncludePath().equals(includePath)) {
|
||||||
|
IPath newBasePath = refEntry.getBasePath();
|
||||||
|
// If the includePath is
|
||||||
|
// relative give a new basepath
|
||||||
|
// if none
|
||||||
|
if (!newBasePath.isAbsolute() && !includePath.isAbsolute()) {
|
||||||
|
IResource refRes;
|
||||||
|
if (!newBasePath.isEmpty()) {
|
||||||
|
refRes = cproject.getCModel().getWorkspace().getRoot().findMember(
|
||||||
|
newBasePath);
|
||||||
|
} else {
|
||||||
|
IPath refResPath = refEntry.getPath();
|
||||||
|
refRes = cproject.getCModel().getWorkspace().getRoot().findMember(
|
||||||
|
refResPath);
|
||||||
|
}
|
||||||
|
if (refRes != null) {
|
||||||
|
if (refRes.getType() == IResource.FILE) {
|
||||||
|
refRes = refRes.getParent();
|
||||||
|
}
|
||||||
|
newBasePath = refRes.getLocation().append(newBasePath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return CoreModel.newIncludeEntry(includeEntry.getPath(), newBasePath, includePath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else { // Container ref
|
||||||
|
IPathEntryContainer container = manager.getPathEntryContainer(refPath, cproject);
|
||||||
|
if (container != null) {
|
||||||
|
IPathEntry[] entries = container.getPathEntries();
|
||||||
|
for (int i = 0; i < entries.length; i++) {
|
||||||
|
if (entries[i].getEntryKind() == IPathEntry.CDT_INCLUDE) {
|
||||||
|
IIncludeEntry refEntry = (IIncludeEntry)entries[i];
|
||||||
|
if (refEntry.getIncludePath().equals(includePath)) {
|
||||||
|
IPath newBasePath = refEntry.getBasePath();
|
||||||
|
return CoreModel.newIncludeEntry(includeEntry.getPath(), newBasePath, includePath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case IPathEntry.CDT_MACRO : {
|
||||||
|
IMacroEntry macroEntry = (IMacroEntry)entry;
|
||||||
|
IPath refPath = macroEntry.getBaseReference();
|
||||||
|
if (refPath != null && !refPath.isEmpty()) {
|
||||||
|
String name = macroEntry.getMacroName();
|
||||||
|
if (refPath.isAbsolute()) {
|
||||||
|
IResource res = cproject.getCModel().getWorkspace().getRoot().findMember(refPath);
|
||||||
|
if (res != null && res.getType() == IResource.PROJECT) {
|
||||||
|
IProject project = (IProject)res;
|
||||||
|
if (CoreModel.hasCNature(project) || CoreModel.hasCCNature(project)) {
|
||||||
|
ICProject refCProject = CoreModel.getDefault().create(project);
|
||||||
|
if (refCProject != null) {
|
||||||
|
IPathEntry[] entries = manager.getResolvedPathEntries(refCProject);
|
||||||
|
for (int i = 0; i < entries.length; i++) {
|
||||||
|
if (entries[i].getEntryKind() == IPathEntry.CDT_MACRO) {
|
||||||
|
IMacroEntry refEntry = (IMacroEntry)entries[i];
|
||||||
|
if (refEntry.getMacroName().equals(name)) {
|
||||||
|
String value = refEntry.getMacroValue();
|
||||||
|
return CoreModel.newMacroEntry(macroEntry.getPath(), name, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else { // Container ref
|
||||||
|
IPathEntryContainer container = manager.getPathEntryContainer(refPath, cproject);
|
||||||
|
if (container != null) {
|
||||||
|
IPathEntry[] entries = container.getPathEntries();
|
||||||
|
for (int i = 0; i < entries.length; i++) {
|
||||||
|
if (entries[i].getEntryKind() == IPathEntry.CDT_MACRO) {
|
||||||
|
IMacroEntry refEntry = (IMacroEntry)entries[i];
|
||||||
|
if (refEntry.getMacroName().equals(name)) {
|
||||||
|
String value = refEntry.getMacroValue();
|
||||||
|
return CoreModel.newMacroEntry(macroEntry.getPath(), name, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case IPathEntry.CDT_LIBRARY : {
|
||||||
|
ILibraryEntry libEntry = (ILibraryEntry)entry;
|
||||||
|
IPath refPath = libEntry.getBaseReference();
|
||||||
|
if (refPath != null && !refPath.isEmpty()) {
|
||||||
|
IPath libraryPath = libEntry.getLibraryPath();
|
||||||
|
if (refPath.isAbsolute()) {
|
||||||
|
IResource res = cproject.getCModel().getWorkspace().getRoot().findMember(refPath);
|
||||||
|
if (res != null && res.getType() == IResource.PROJECT) {
|
||||||
|
IProject project = (IProject)res;
|
||||||
|
if (CoreModel.hasCNature(project) || CoreModel.hasCCNature(project)) {
|
||||||
|
ICProject refCProject = CoreModel.getDefault().create(project);
|
||||||
|
if (refCProject != null) {
|
||||||
|
IPathEntry[] entries = manager.getResolvedPathEntries(refCProject);
|
||||||
|
for (int i = 0; i < entries.length; i++) {
|
||||||
|
if (entries[i].getEntryKind() == IPathEntry.CDT_LIBRARY) {
|
||||||
|
ILibraryEntry refEntry = (ILibraryEntry)entries[i];
|
||||||
|
if (refEntry.getLibraryPath().equals(libraryPath)) {
|
||||||
|
IPath newBasePath = refEntry.getBasePath();
|
||||||
|
// If the libraryPath is
|
||||||
|
// relative give a new basepath
|
||||||
|
// if none
|
||||||
|
if (!newBasePath.isAbsolute() && !libraryPath.isAbsolute()) {
|
||||||
|
IResource refRes;
|
||||||
|
if (!newBasePath.isEmpty()) {
|
||||||
|
refRes = cproject.getCModel().getWorkspace().getRoot().findMember(
|
||||||
|
newBasePath);
|
||||||
|
} else {
|
||||||
|
IPath refResPath = refEntry.getPath();
|
||||||
|
refRes = cproject.getCModel().getWorkspace().getRoot().findMember(
|
||||||
|
refResPath);
|
||||||
|
}
|
||||||
|
if (refRes != null) {
|
||||||
|
if (refRes.getType() == IResource.FILE) {
|
||||||
|
refRes = refRes.getParent();
|
||||||
|
}
|
||||||
|
newBasePath = refRes.getLocation().append(newBasePath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return CoreModel.newLibraryEntry(entry.getPath(), newBasePath,
|
||||||
|
refEntry.getLibraryPath(), refEntry.getSourceAttachmentPath(),
|
||||||
|
refEntry.getSourceAttachmentRootPath(),
|
||||||
|
refEntry.getSourceAttachmentPrefixMapping(), false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else { // Container ref
|
||||||
|
IPathEntryContainer container = manager.getPathEntryContainer(refPath, cproject);
|
||||||
|
if (container != null) {
|
||||||
|
IPathEntry[] entries = container.getPathEntries();
|
||||||
|
for (int i = 0; i < entries.length; i++) {
|
||||||
|
if (entries[i].getEntryKind() == IPathEntry.CDT_LIBRARY) {
|
||||||
|
ILibraryEntry refEntry = (ILibraryEntry)entries[i];
|
||||||
|
if (refEntry.getPath().equals(libraryPath)) {
|
||||||
|
return CoreModel.newLibraryEntry(entry.getPath(), refEntry.getBasePath(),
|
||||||
|
refEntry.getLibraryPath(), refEntry.getSourceAttachmentPath(),
|
||||||
|
refEntry.getSourceAttachmentRootPath(),
|
||||||
|
refEntry.getSourceAttachmentPrefixMapping(), false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return entry;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IPathEntry cloneEntryAndExpand(IPath rpath, IPathEntry entry) {
|
||||||
|
|
||||||
|
// get the path
|
||||||
|
IPath entryPath = entry.getPath();
|
||||||
|
if (entryPath == null) {
|
||||||
|
entryPath = Path.EMPTY;
|
||||||
|
}
|
||||||
|
IPath resourcePath = (entryPath.isAbsolute()) ? entryPath : rpath.append(entryPath);
|
||||||
|
|
||||||
|
IPathEntryVariableManager varManager = CCorePlugin.getDefault().getPathEntryVariableManager();
|
||||||
|
switch (entry.getEntryKind()) {
|
||||||
|
case IPathEntry.CDT_INCLUDE : {
|
||||||
|
IIncludeEntry include = (IIncludeEntry)entry;
|
||||||
|
|
||||||
|
IPath basePath = include.getBasePath();
|
||||||
|
basePath = varManager.resolvePath(basePath);
|
||||||
|
|
||||||
|
IPath includePath = include.getIncludePath();
|
||||||
|
includePath = varManager.resolvePath(includePath);
|
||||||
|
|
||||||
|
return CoreModel.newIncludeEntry(resourcePath, basePath, includePath,
|
||||||
|
include.isSystemInclude(), include.getExclusionPatterns(), include.isExported());
|
||||||
|
}
|
||||||
|
case IPathEntry.CDT_INCLUDE_FILE : {
|
||||||
|
IIncludeFileEntry includeFile = (IIncludeFileEntry)entry;
|
||||||
|
|
||||||
|
IPath basePath = includeFile.getBasePath();
|
||||||
|
basePath = varManager.resolvePath(basePath);
|
||||||
|
|
||||||
|
IPath includeFilePath = includeFile.getIncludeFilePath();
|
||||||
|
includeFilePath = varManager.resolvePath(includeFilePath);
|
||||||
|
|
||||||
|
return CoreModel.newIncludeFileEntry(resourcePath, basePath, Path.EMPTY, includeFilePath,
|
||||||
|
includeFile.getExclusionPatterns(), includeFile.isExported());
|
||||||
|
}
|
||||||
|
case IPathEntry.CDT_LIBRARY : {
|
||||||
|
ILibraryEntry library = (ILibraryEntry)entry;
|
||||||
|
|
||||||
|
IPath basePath = library.getBasePath();
|
||||||
|
basePath = varManager.resolvePath(basePath);
|
||||||
|
|
||||||
|
IPath libraryPath = library.getLibraryPath();
|
||||||
|
libraryPath = varManager.resolvePath(libraryPath);
|
||||||
|
|
||||||
|
IPath sourceAttachmentPath = library.getSourceAttachmentPath();
|
||||||
|
sourceAttachmentPath = varManager.resolvePath(sourceAttachmentPath);
|
||||||
|
|
||||||
|
IPath sourceAttachmentRootPath = library.getSourceAttachmentRootPath();
|
||||||
|
sourceAttachmentRootPath = varManager.resolvePath(sourceAttachmentRootPath);
|
||||||
|
|
||||||
|
IPath sourceAttachmentPrefixMapping = library.getSourceAttachmentPrefixMapping();
|
||||||
|
sourceAttachmentPrefixMapping = varManager.resolvePath(sourceAttachmentPrefixMapping);
|
||||||
|
|
||||||
|
return CoreModel.newLibraryEntry(resourcePath, basePath, libraryPath,
|
||||||
|
sourceAttachmentPath, sourceAttachmentRootPath,
|
||||||
|
sourceAttachmentPrefixMapping, library.isExported());
|
||||||
|
}
|
||||||
|
case IPathEntry.CDT_MACRO : {
|
||||||
|
IMacroEntry macro = (IMacroEntry)entry;
|
||||||
|
return CoreModel.newMacroEntry(resourcePath, macro.getMacroName(), macro.getMacroValue(),
|
||||||
|
macro.getExclusionPatterns(), macro.isExported());
|
||||||
|
}
|
||||||
|
case IPathEntry.CDT_MACRO_FILE : {
|
||||||
|
IMacroFileEntry macroFile = (IMacroFileEntry)entry;
|
||||||
|
|
||||||
|
IPath basePath = macroFile.getBasePath();
|
||||||
|
basePath = varManager.resolvePath(basePath);
|
||||||
|
|
||||||
|
IPath macroFilePath = macroFile.getMacroFilePath();
|
||||||
|
macroFilePath = varManager.resolvePath(macroFilePath);
|
||||||
|
|
||||||
|
return CoreModel.newMacroFileEntry(resourcePath, basePath, Path.EMPTY, macroFilePath,
|
||||||
|
macroFile.getExclusionPatterns(), macroFile.isExported());
|
||||||
|
}
|
||||||
|
case IPathEntry.CDT_OUTPUT : {
|
||||||
|
IOutputEntry out = (IOutputEntry)entry;
|
||||||
|
return CoreModel.newOutputEntry(resourcePath, out.getExclusionPatterns());
|
||||||
|
}
|
||||||
|
case IPathEntry.CDT_PROJECT : {
|
||||||
|
IProjectEntry projEntry = (IProjectEntry)entry;
|
||||||
|
return CoreModel.newProjectEntry(projEntry.getPath(), projEntry.isExported());
|
||||||
|
}
|
||||||
|
case IPathEntry.CDT_SOURCE : {
|
||||||
|
ISourceEntry source = (ISourceEntry)entry;
|
||||||
|
return CoreModel.newSourceEntry(resourcePath, source.getExclusionPatterns());
|
||||||
|
}
|
||||||
|
case IPathEntry.CDT_CONTAINER : {
|
||||||
|
return CoreModel.newContainerEntry(entry.getPath(), entry.isExported());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return entry;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ICModelStatus validatePathEntry(ICProject cProject, IPathEntry[] entries) {
|
||||||
|
|
||||||
|
// Check duplication.
|
||||||
|
for (int i = 0; i < entries.length; i++) {
|
||||||
|
IPathEntry entry = entries[i];
|
||||||
|
if (entry == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
for (int j = 0; j < entries.length; j++) {
|
||||||
|
IPathEntry otherEntry = entries[j];
|
||||||
|
if (otherEntry == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (entry != otherEntry && otherEntry.equals(entry)) {
|
||||||
|
StringBuffer errMesg = new StringBuffer(CCorePlugin.getResourceString("CoreModel.PathEntry.DuplicateEntry")); //$NON-NLS-1$
|
||||||
|
return new CModelStatus(ICModelStatusConstants.INVALID_PATHENTRY, errMesg.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// check duplication of sources
|
||||||
|
List dups = checkForDuplication(Arrays.asList(entries), IPathEntry.CDT_SOURCE);
|
||||||
|
if (dups.size() > 0) {
|
||||||
|
ICModelStatus[] cmodelStatus = new ICModelStatus[dups.size()];
|
||||||
|
for (int i = 0; i < dups.size(); ++i) {
|
||||||
|
StringBuffer errMesg = new StringBuffer(CCorePlugin.getResourceString("CoreModel.PathEntry.DuplicateEntry")); //$NON-NLS-1$
|
||||||
|
cmodelStatus[i] = new CModelStatus(ICModelStatusConstants.INVALID_PATHENTRY, errMesg.toString());
|
||||||
|
}
|
||||||
|
return CModelStatus.newMultiStatus(ICModelStatusConstants.INVALID_PATHENTRY, cmodelStatus);
|
||||||
|
}
|
||||||
|
|
||||||
|
// check duplication of Outputs
|
||||||
|
dups = checkForDuplication(Arrays.asList(entries), IPathEntry.CDT_OUTPUT);
|
||||||
|
if (dups.size() > 0) {
|
||||||
|
ICModelStatus[] cmodelStatus = new ICModelStatus[dups.size()];
|
||||||
|
for (int i = 0; i < dups.size(); ++i) {
|
||||||
|
StringBuffer errMesg = new StringBuffer(CCorePlugin.getResourceString("CoreModel.PathEntry.DuplicateEntry")); //$NON-NLS-1$
|
||||||
|
cmodelStatus[i] = new CModelStatus(ICModelStatusConstants.NAME_COLLISION, errMesg.toString());
|
||||||
|
}
|
||||||
|
return CModelStatus.newMultiStatus(ICModelStatusConstants.INVALID_PATHENTRY, cmodelStatus);
|
||||||
|
}
|
||||||
|
|
||||||
|
// allow nesting source entries in each other as long as the outer entry
|
||||||
|
// excludes the inner one
|
||||||
|
for (int i = 0; i < entries.length; i++) {
|
||||||
|
IPathEntry entry = entries[i];
|
||||||
|
if (entry == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
IPath entryPath = entry.getPath();
|
||||||
|
int kind = entry.getEntryKind();
|
||||||
|
if (kind == IPathEntry.CDT_SOURCE) {
|
||||||
|
for (int j = 0; j < entries.length; j++) {
|
||||||
|
IPathEntry otherEntry = entries[j];
|
||||||
|
if (otherEntry == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
int otherKind = otherEntry.getEntryKind();
|
||||||
|
IPath otherPath = otherEntry.getPath();
|
||||||
|
if (entry != otherEntry && (otherKind == IPathEntry.CDT_SOURCE)) {
|
||||||
|
char[][] exclusionPatterns = ((ISourceEntry)otherEntry).fullExclusionPatternChars();
|
||||||
|
if (otherPath.isPrefixOf(entryPath) && !otherPath.equals(entryPath)
|
||||||
|
&& !CoreModelUtil.isExcluded(entryPath.append("*"), exclusionPatterns)) { //$NON-NLS-1$
|
||||||
|
|
||||||
|
String exclusionPattern = entryPath.removeFirstSegments(otherPath.segmentCount()).segment(0);
|
||||||
|
if (CoreModelUtil.isExcluded(entryPath, exclusionPatterns)) {
|
||||||
|
StringBuffer errMesg = new StringBuffer(
|
||||||
|
CCorePlugin.getResourceString("CoreModel.PathEntry.NestedEntry")); //$NON-NLS-1$
|
||||||
|
return new CModelStatus(ICModelStatusConstants.INVALID_PATHENTRY, errMesg.toString());
|
||||||
|
} else if (otherKind == IPathEntry.CDT_SOURCE) {
|
||||||
|
exclusionPattern += '/';
|
||||||
|
StringBuffer errMesg = new StringBuffer(
|
||||||
|
CCorePlugin.getResourceString("CoreModel.PathEntry.NestedEntry")); //$NON-NLS-1$
|
||||||
|
return new CModelStatus(ICModelStatusConstants.INVALID_PATHENTRY, errMesg.toString());
|
||||||
|
} else {
|
||||||
|
StringBuffer errMesg = new StringBuffer(
|
||||||
|
CCorePlugin.getResourceString("CoreModel.PathEntry.NestedEntry")); //$NON-NLS-1$
|
||||||
|
return new CModelStatus(ICModelStatusConstants.INVALID_PATHENTRY, errMesg.toString()); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return CModelStatus.VERIFIED_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ICModelStatus validatePathEntry(ICProject cProject, IPathEntry entry, boolean checkSourceAttachment,
|
||||||
|
boolean recurseInContainers) {
|
||||||
|
IProject project = cProject.getProject();
|
||||||
|
IPath path = entry.getPath();
|
||||||
|
if (entry.getEntryKind() != IPathEntry.CDT_PROJECT) {
|
||||||
|
if (!isValidWorkspacePath(project, path)) {
|
||||||
|
return new CModelStatus(
|
||||||
|
ICModelStatusConstants.INVALID_PATHENTRY,
|
||||||
|
CoreModelMessages.getString("PathEntryManager.0") + path.toOSString() + " for " + ((PathEntry)entry).getKindString()); //$NON-NLS-1$ //$NON-NLS-2$
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (entry.getEntryKind()) {
|
||||||
|
case IPathEntry.CDT_INCLUDE : {
|
||||||
|
IIncludeEntry include = (IIncludeEntry)entry;
|
||||||
|
IPath includePath = include.getFullIncludePath();
|
||||||
|
if (!isValidExternalPath(includePath)) {
|
||||||
|
return new CModelStatus(ICModelStatusConstants.INVALID_PATHENTRY,
|
||||||
|
CoreModelMessages.getString("PathEntryManager.2") + " (" + includePath.toOSString() + ")"); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
|
||||||
|
}
|
||||||
|
if (!isValidBasePath(include.getBasePath())) {
|
||||||
|
return new CModelStatus(ICModelStatusConstants.INVALID_PATHENTRY,
|
||||||
|
CoreModelMessages.getString("PathEntryManager.1") + " (" + includePath.toOSString() + ")"); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case IPathEntry.CDT_LIBRARY : {
|
||||||
|
ILibraryEntry library = (ILibraryEntry)entry;
|
||||||
|
if (checkSourceAttachment) {
|
||||||
|
IPath sourceAttach = library.getSourceAttachmentPath();
|
||||||
|
if (sourceAttach != null) {
|
||||||
|
if (!sourceAttach.isAbsolute()) {
|
||||||
|
if (!isValidWorkspacePath(project, sourceAttach) || !isValidExternalPath(sourceAttach)) {
|
||||||
|
return new CModelStatus(ICModelStatusConstants.INVALID_PATHENTRY,
|
||||||
|
CoreModelMessages.getString("PathEntryManager.3") + " (" + sourceAttach.toOSString() + ")"); //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
IPath libraryPath = library.getFullLibraryPath();
|
||||||
|
if (!isValidExternalPath(libraryPath)) {
|
||||||
|
return new CModelStatus(ICModelStatusConstants.INVALID_PATHENTRY,
|
||||||
|
CoreModelMessages.getString("PathEntryManager.4") + " (" + libraryPath.toOSString() + ")"); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
|
||||||
|
}
|
||||||
|
if (!isValidBasePath(library.getBasePath())) {
|
||||||
|
return new CModelStatus(ICModelStatusConstants.INVALID_PATHENTRY,
|
||||||
|
CoreModelMessages.getString("PathEntryManager.7") + " (" + libraryPath.toOSString() + ")"); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case IPathEntry.CDT_PROJECT : {
|
||||||
|
IProjectEntry projEntry = (IProjectEntry)entry;
|
||||||
|
path = projEntry.getPath();
|
||||||
|
IProject reqProject = project.getWorkspace().getRoot().getProject(path.segment(0));
|
||||||
|
if (!reqProject.isAccessible()) {
|
||||||
|
return new CModelStatus(ICModelStatusConstants.INVALID_PATHENTRY,
|
||||||
|
CoreModelMessages.getString("PathEntryManager.5")); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
if (! (CoreModel.hasCNature(reqProject) || CoreModel.hasCCNature(reqProject))) {
|
||||||
|
return new CModelStatus(ICModelStatusConstants.INVALID_PATHENTRY,
|
||||||
|
CoreModelMessages.getString("PathEntryManager.6")); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case IPathEntry.CDT_CONTAINER :
|
||||||
|
if (recurseInContainers) {
|
||||||
|
try {
|
||||||
|
IPathEntryContainer cont = manager.getPathEntryContainer((IContainerEntry)entry, cProject);
|
||||||
|
IPathEntry[] contEntries = cont.getPathEntries();
|
||||||
|
for (int i = 0; i < contEntries.length; i++) {
|
||||||
|
ICModelStatus status = validatePathEntry(cProject, contEntries[i], checkSourceAttachment, false);
|
||||||
|
if (!status.isOK()) {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (CModelException e) {
|
||||||
|
return new CModelStatus(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return CModelStatus.VERIFIED_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean isValidWorkspacePath(IProject project, IPath path) {
|
||||||
|
if (path == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
IWorkspaceRoot workspaceRoot = project.getWorkspace().getRoot();
|
||||||
|
// We accept empy path as the project
|
||||||
|
IResource res = null;
|
||||||
|
if (path.isAbsolute()) {
|
||||||
|
res = workspaceRoot.findMember(path);
|
||||||
|
} else {
|
||||||
|
res = project.findMember(path);
|
||||||
|
}
|
||||||
|
return (res != null && res.isAccessible());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean isValidExternalPath(IPath path) {
|
||||||
|
if (path != null) {
|
||||||
|
File file = path.toFile();
|
||||||
|
if (file != null) {
|
||||||
|
return file.exists();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean isValidBasePath(IPath path) {
|
||||||
|
if (!path.isEmpty() && !path.isAbsolute()) {
|
||||||
|
IResource res = ResourcesPlugin.getWorkspace().getRoot().findMember(path);
|
||||||
|
if (res == null || !res.isAccessible()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List checkForDuplication(List pathEntries, int type) {
|
||||||
|
List duplicate = new ArrayList(pathEntries.size());
|
||||||
|
for (int i = 0; i < pathEntries.size(); ++i) {
|
||||||
|
IPathEntry pathEntry = (IPathEntry)pathEntries.get(i);
|
||||||
|
if (pathEntry.getEntryKind() == type) {
|
||||||
|
for (int j = 0; j < pathEntries.size(); ++j) {
|
||||||
|
IPathEntry otherEntry = (IPathEntry)pathEntries.get(j);
|
||||||
|
if (otherEntry.getEntryKind() == type) {
|
||||||
|
if (!pathEntry.equals(otherEntry)) {
|
||||||
|
if (!duplicate.contains(pathEntry)) {
|
||||||
|
if (pathEntry.getPath().equals(otherEntry.getPath())) {
|
||||||
|
// duplication of sources
|
||||||
|
duplicate.add(otherEntry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return duplicate;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Record a new marker denoting a pathentry problem
|
||||||
|
*/
|
||||||
|
public static void createPathEntryProblemMarker(IProject project, ICModelStatus status) {
|
||||||
|
int severity = code2Severity(status);
|
||||||
|
try {
|
||||||
|
IMarker marker = project.createMarker(ICModelMarker.PATHENTRY_PROBLEM_MARKER);
|
||||||
|
marker.setAttributes(new String[]{IMarker.MESSAGE, IMarker.SEVERITY, IMarker.LOCATION,
|
||||||
|
ICModelMarker.PATHENTRY_FILE_FORMAT,}, new Object[]{status.getMessage(), new Integer(severity), "pathentry",//$NON-NLS-1$
|
||||||
|
"false",//$NON-NLS-1$
|
||||||
|
});
|
||||||
|
} catch (CoreException e) {
|
||||||
|
// could not create marker: cannot do much
|
||||||
|
//e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove all markers denoting pathentry problems
|
||||||
|
*/
|
||||||
|
public static void flushPathEntryProblemMarkers(IProject project) {
|
||||||
|
IWorkspace workspace = project.getWorkspace();
|
||||||
|
|
||||||
|
try {
|
||||||
|
IMarker[] markers = getPathEntryProblemMarkers(project);
|
||||||
|
workspace.deleteMarkers(markers);
|
||||||
|
} catch (CoreException e) {
|
||||||
|
// could not flush markers: not much we can do
|
||||||
|
//e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get all markers denoting pathentry problems
|
||||||
|
*/
|
||||||
|
public static IMarker[] getPathEntryProblemMarkers(IProject project) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
IMarker[] markers = project.findMarkers(ICModelMarker.PATHENTRY_PROBLEM_MARKER, false, IResource.DEPTH_ZERO);
|
||||||
|
if (markers != null) {
|
||||||
|
return markers;
|
||||||
|
}
|
||||||
|
} catch (CoreException e) {
|
||||||
|
//e.printStackTrace();
|
||||||
|
}
|
||||||
|
return NO_MARKERS;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean hasPathEntryProblemMarkersChange(IProject project, ICModelStatus[] status) {
|
||||||
|
IMarker[] markers = getPathEntryProblemMarkers(project);
|
||||||
|
if (markers.length != status.length) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
for (int i = 0; i < markers.length; ++i) {
|
||||||
|
boolean found = false;
|
||||||
|
String message = markers[i].getAttribute(IMarker.MESSAGE, ""); //$NON-NLS-1$
|
||||||
|
int severity = markers[i].getAttribute(IMarker.SEVERITY, IMarker.SEVERITY_ERROR);
|
||||||
|
for (int j = 0; j < status.length; ++j) {
|
||||||
|
String msg = status[j].getMessage();
|
||||||
|
int cseverity = code2Severity(status[j]);
|
||||||
|
if (msg.equals(message) && severity == cseverity) {
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!found) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int code2Severity(ICModelStatus status) {
|
||||||
|
int severity;
|
||||||
|
switch (status.getCode()) {
|
||||||
|
case ICModelStatusConstants.INVALID_PATHENTRY :
|
||||||
|
severity = IMarker.SEVERITY_WARNING;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ICModelStatusConstants.INVALID_PATH :
|
||||||
|
severity = IMarker.SEVERITY_WARNING;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default :
|
||||||
|
severity = IMarker.SEVERITY_ERROR;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return severity;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -13,17 +13,24 @@ package org.eclipse.cdt.core.resources;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.eclipse.cdt.core.parser.IScannerInfo;
|
import org.eclipse.cdt.core.parser.IExtendedScannerInfo;
|
||||||
|
|
||||||
public class ScannerInfo implements IScannerInfo {
|
public class ScannerInfo implements IExtendedScannerInfo {
|
||||||
|
|
||||||
private final Map macroMap;
|
private final Map fMacroMap;
|
||||||
private final String[] includePaths;
|
private final String[] fSystemIncludePaths;
|
||||||
|
private final String[] fMacroFiles;
|
||||||
|
private final String[] fIncludeFiles;
|
||||||
|
private final String[] fLocalIncludePaths;
|
||||||
final static String[] EMPTY_ARRAY_STRING = new String[0];
|
final static String[] EMPTY_ARRAY_STRING = new String[0];
|
||||||
|
|
||||||
protected ScannerInfo(String[] includePaths, Map macroMap) {
|
protected ScannerInfo(String[] systemIncludePaths, String[] localIncludePaths, String[] includeFiles,
|
||||||
this.includePaths = includePaths;
|
Map macroMap, String[] macroFiles) {
|
||||||
this.macroMap = macroMap;
|
fSystemIncludePaths = (systemIncludePaths == null) ? EMPTY_ARRAY_STRING : systemIncludePaths;
|
||||||
|
fLocalIncludePaths = (localIncludePaths == null) ? EMPTY_ARRAY_STRING : localIncludePaths;
|
||||||
|
fIncludeFiles = (includeFiles == null) ? EMPTY_ARRAY_STRING : includeFiles;
|
||||||
|
fMacroFiles = (macroFiles == null) ? EMPTY_ARRAY_STRING : macroFiles;
|
||||||
|
fMacroMap = (macroMap == null) ? Collections.EMPTY_MAP : macroMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -32,10 +39,7 @@ public class ScannerInfo implements IScannerInfo {
|
||||||
* @see org.eclipse.cdt.core.build.managed.IScannerInfo#getIncludePaths()
|
* @see org.eclipse.cdt.core.build.managed.IScannerInfo#getIncludePaths()
|
||||||
*/
|
*/
|
||||||
public synchronized String[] getIncludePaths() {
|
public synchronized String[] getIncludePaths() {
|
||||||
if (includePaths == null) {
|
return fSystemIncludePaths;
|
||||||
return EMPTY_ARRAY_STRING;
|
|
||||||
}
|
|
||||||
return includePaths;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -44,10 +48,19 @@ public class ScannerInfo implements IScannerInfo {
|
||||||
* @see org.eclipse.cdt.core.build.managed.IScannerInfo#getIncludePaths()
|
* @see org.eclipse.cdt.core.build.managed.IScannerInfo#getIncludePaths()
|
||||||
*/
|
*/
|
||||||
public synchronized Map getDefinedSymbols() {
|
public synchronized Map getDefinedSymbols() {
|
||||||
if (macroMap == null) {
|
return fMacroMap;
|
||||||
return Collections.EMPTY_MAP;
|
}
|
||||||
}
|
|
||||||
return macroMap;
|
public String[] getMacroFiles() {
|
||||||
|
return fMacroFiles;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String[] getIncludeFiles() {
|
||||||
|
return fIncludeFiles;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String[] getLocalIncludePath() {
|
||||||
|
return fLocalIncludePaths;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,9 @@ 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.IElementChangedListener;
|
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.IIncludeFileEntry;
|
||||||
import org.eclipse.cdt.core.model.IMacroEntry;
|
import org.eclipse.cdt.core.model.IMacroEntry;
|
||||||
|
import org.eclipse.cdt.core.model.IMacroFileEntry;
|
||||||
import org.eclipse.cdt.core.parser.IScannerInfo;
|
import org.eclipse.cdt.core.parser.IScannerInfo;
|
||||||
import org.eclipse.cdt.core.parser.IScannerInfoChangeListener;
|
import org.eclipse.cdt.core.parser.IScannerInfoChangeListener;
|
||||||
import org.eclipse.cdt.core.parser.IScannerInfoProvider;
|
import org.eclipse.cdt.core.parser.IScannerInfoProvider;
|
||||||
|
@ -84,21 +86,51 @@ public class ScannerProvider extends AbstractCExtension implements IScannerInfoP
|
||||||
IPath resPath = resource.getFullPath();
|
IPath resPath = resource.getFullPath();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
// get the includes
|
||||||
IIncludeEntry[] includeEntries = CoreModel.getIncludeEntries(resPath);
|
IIncludeEntry[] includeEntries = CoreModel.getIncludeEntries(resPath);
|
||||||
String[] includes = new String[includeEntries.length];
|
int localCount = 0, systemCount = 0;
|
||||||
for (int i = 0; i < includes.length; ++i) {
|
for (int i = 0; i < includeEntries.length; ++i) {
|
||||||
includes[i] = includeEntries[i].getFullIncludePath().toOSString();
|
if (includeEntries[i].isSystemInclude()) {
|
||||||
|
++systemCount;
|
||||||
|
} else {
|
||||||
|
++localCount;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
String[] localIncludes = new String[localCount];
|
||||||
|
String[] systemIncludes = new String[systemCount];
|
||||||
|
for (int i = 0; i < includeEntries.length; ++i) {
|
||||||
|
if (includeEntries[i].isSystemInclude()) {
|
||||||
|
systemIncludes[i] = includeEntries[i].getFullIncludePath().toOSString();
|
||||||
|
} else {
|
||||||
|
localIncludes[i] = includeEntries[i].getFullIncludePath().toOSString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// get the includeFile
|
||||||
|
IIncludeFileEntry[] includeFileEntries = CoreModel.getIncludeFileEntries(resPath);
|
||||||
|
String[] includeFiles = new String[includeFileEntries.length];
|
||||||
|
for (int i = 0; i < includeFiles.length; ++i) {
|
||||||
|
includeFiles[i] = includeFileEntries[i].getFullIncludeFilePath().toOSString();
|
||||||
|
}
|
||||||
|
|
||||||
|
// get the macros
|
||||||
IMacroEntry[] macros = CoreModel.getMacroEntries(resPath);
|
IMacroEntry[] macros = CoreModel.getMacroEntries(resPath);
|
||||||
Map symbolMap = new HashMap();
|
Map symbolMap = new HashMap();
|
||||||
for (int i = 0; i < macros.length; ++i) {
|
for (int i = 0; i < macros.length; ++i) {
|
||||||
symbolMap.put(macros[i].getMacroName(), macros[i].getMacroValue());
|
symbolMap.put(macros[i].getMacroName(), macros[i].getMacroValue());
|
||||||
}
|
}
|
||||||
return new ScannerInfo(includes, symbolMap);
|
|
||||||
|
// get the macro files
|
||||||
|
IMacroFileEntry[] macroFileEntries = CoreModel.getMacroFileEntries(resPath);
|
||||||
|
String[] macroFiles = new String[macroFileEntries.length];
|
||||||
|
for (int i = 0; i < macroFiles.length; ++i) {
|
||||||
|
macroFiles[i] = macroFileEntries[i].getFullMacroFilePath().toOSString();
|
||||||
|
}
|
||||||
|
return new ScannerInfo(systemIncludes, localIncludes, includeFiles, symbolMap, macroFiles);
|
||||||
} catch (CModelException e) {
|
} catch (CModelException e) {
|
||||||
//
|
//
|
||||||
}
|
}
|
||||||
return new ScannerInfo(null, null);
|
return new ScannerInfo(null, null, null, null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Add table
Reference in a new issue