1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-08-04 06:45:43 +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:
Alain Magloire 2005-03-30 16:38:50 +00:00
parent 43222f2381
commit 520d41403e
14 changed files with 1473 additions and 643 deletions

View file

@ -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
Fix for NPE in IndexEncoderUtil.calculateIndexFlags

View file

@ -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.ContainerEntry;
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.MacroEntry;
import org.eclipse.cdt.internal.core.model.MacroFileEntry;
import org.eclipse.cdt.internal.core.model.OutputEntry;
import org.eclipse.cdt.internal.core.model.PathEntryManager;
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);
}
/**
* 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>
*
@ -539,7 +572,7 @@ public class CoreModel {
* the name of the macro
* @param macroValue
* the value of the macro
* @return
* @return IMacroEntry
*/
public static IMacroEntry newMacroEntry(IPath resourcePath, String macroName, String macroValue) {
return newMacroEntry(resourcePath, macroName, macroValue, APathEntry.NO_EXCLUSION_PATTERNS);
@ -588,12 +621,41 @@ public class CoreModel {
* the base reference path
* @param macroName
* the name of the macro
* @return
* @return IMacroEntry
*/
public static IMacroEntry newMacroRefEntry(IPath resourcePath, IPath baseRef, String macroName) {
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
* 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
* 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>
* 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
@ -749,7 +811,7 @@ public class CoreModel {
* recommended.
* </p>
*
* @return the resolved entries for the project
* @return the include entries for the translation unit
* @exception CModelException
* @see IPathEntry
*/
@ -757,6 +819,24 @@ public class CoreModel {
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
* 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);
}
/**
* 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
* a given container ID or <code>null</code> if none was found while

View file

@ -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();
}

View file

@ -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();
}

View file

@ -26,39 +26,54 @@ public interface IPathEntry {
* Entry kind constant describing a path entry identifying a
* required project.
*/
int CDT_PROJECT = 2;
int CDT_PROJECT = 1 << 2;
/**
* Entry kind constant describing a path entry identifying a
* 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
* include path.
*/
int CDT_INCLUDE = 4;
int CDT_INCLUDE = 1 << 4;
/**
* Entry kind constant describing a path entry representing
* a container id.
*
*/
int CDT_CONTAINER = 5;
int CDT_CONTAINER = 1 << 5;
/**
* Entry kind constant describing a path entry representing
* a macro definition.
*
*/
int CDT_MACRO = 6;
int CDT_MACRO = 1 << 6;
/**
* 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.
@ -72,6 +87,8 @@ public interface IPathEntry {
* <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_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();

View file

@ -18,24 +18,26 @@ import org.eclipse.core.runtime.IPath;
*/
public interface IPathEntryContainerExtension extends IPathEntryContainer {
/**
* 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);
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);
//
}

View file

@ -25,8 +25,10 @@ import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.ICModelStatus;
import org.eclipse.cdt.core.model.IIncludeEntry;
import org.eclipse.cdt.core.model.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.IPathEntry;
import org.eclipse.cdt.core.resources.IPathEntryStore;
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_EXCLUDING = "excluding"; //$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_SYSTEM = "system"; //$NON-NLS-1$
static String ATTRIBUTE_NAME = "name"; //$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 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);
}
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 : {
String macroName = element.getAttribute(ATTRIBUTE_NAME);
String macroValue = element.getAttribute(ATTRIBUTE_VALUE);
@ -221,6 +230,10 @@ public class DefaultPathEntryStore implements IPathEntryStore, ICDescriptorListe
}
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 : {
IPath id = new Path(element.getAttribute(ATTRIBUTE_PATH));
return CoreModel.newContainerEntry(id, isExported);
@ -303,12 +316,23 @@ public class DefaultPathEntryStore implements IPathEntryStore, ICDescriptorListe
}
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: {
IMacroEntry macro = (IMacroEntry) entries[i];
element.setAttribute(ATTRIBUTE_NAME, macro.getMacroName());
element.setAttribute(ATTRIBUTE_VALUE, macro.getMacroValue());
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) {

View file

@ -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();
}
}

View file

@ -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();
}
}

View file

@ -83,8 +83,12 @@ public class PathEntry implements IPathEntry {
return IPathEntry.CDT_LIBRARY;
if (kindStr.equalsIgnoreCase("inc")) //$NON-NLS-1$
return IPathEntry.CDT_INCLUDE;
if (kindStr.equalsIgnoreCase("incfile")) //$NON-NLS-1$
return IPathEntry.CDT_INCLUDE_FILE;
if (kindStr.equalsIgnoreCase("mac")) //$NON-NLS-1$
return IPathEntry.CDT_MACRO;
if (kindStr.equalsIgnoreCase("macfile")) //$NON-NLS-1$
return IPathEntry.CDT_MACRO_FILE;
if (kindStr.equalsIgnoreCase("con")) //$NON-NLS-1$
return IPathEntry.CDT_CONTAINER;
if (kindStr.equalsIgnoreCase("out")) //$NON-NLS-1$
@ -106,8 +110,12 @@ public class PathEntry implements IPathEntry {
return "lib"; //$NON-NLS-1$
case IPathEntry.CDT_INCLUDE :
return "inc"; //$NON-NLS-1$
case IPathEntry.CDT_INCLUDE_FILE:
return "incfile"; //$NON-NLS-1$
case IPathEntry.CDT_MACRO :
return "mac"; //$NON-NLS-1$
case IPathEntry.CDT_MACRO_FILE:
return "macfile"; //$NON-NLS-1$
case IPathEntry.CDT_CONTAINER :
return "con"; //$NON-NLS-1$
case IPathEntry.CDT_OUTPUT :
@ -143,8 +151,12 @@ public class PathEntry implements IPathEntry {
return ("Output path"); //$NON-NLS-1$
case IPathEntry.CDT_INCLUDE :
return ("Include path"); //$NON-NLS-1$
case IPathEntry.CDT_INCLUDE_FILE :
return ("Include-file path"); //$NON-NLS-1$
case IPathEntry.CDT_MACRO :
return ("Symbol definition"); //$NON-NLS-1$
case IPathEntry.CDT_MACRO_FILE :
return ("Symbol-file definition"); //$NON-NLS-1$
case IPathEntry.CDT_CONTAINER :
return ("Contributed paths"); //$NON-NLS-1$
}

View file

@ -10,7 +10,6 @@
*******************************************************************************/
package org.eclipse.cdt.internal.core.model;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
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.model.CModelException;
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.ICElement;
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.IElementChangedListener;
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.IOpenable;
import org.eclipse.cdt.core.model.IOutputEntry;
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.resources.IPathEntryStore;
import org.eclipse.cdt.core.resources.IPathEntryStoreListener;
import org.eclipse.cdt.core.resources.IPathEntryVariableManager;
import org.eclipse.cdt.core.resources.PathEntryStoreChangedEvent;
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.IWorkspaceRunnable;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
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 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 IMarker[] NO_MARKERS = new IMarker[0];
// Synchronized the access of the cache entries.
protected Map resolvedMap = new Hashtable();
@ -167,12 +165,89 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
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 {
ICElement celement = CoreModel.getDefault().create(resPath);
if (celement instanceof ITranslationUnit) {
return getIncludeEntries((ITranslationUnit)celement);
}
return NO_INCLUDENTRIES;
return NO_INCLUDE_ENTRIES;
}
public IIncludeEntry[] getIncludeEntries(ITranslationUnit cunit) throws CModelException {
@ -190,7 +265,8 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
IPathEntryContainer[] containers = getPathEntryContainers(cproject);
for (int i = 0; i < containers.length; ++i) {
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));
}
}
@ -248,7 +324,7 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
if (celement instanceof ITranslationUnit) {
return getMacroEntries((ITranslationUnit)celement);
}
return NO_MACROENTRIES;
return NO_MACRO_ENTRIES;
}
public IMacroEntry[] getMacroEntries(ITranslationUnit cunit) throws CModelException {
@ -266,7 +342,8 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
IPathEntryContainer[] containers = getPathEntryContainers(cproject);
for (int i = 0; i < containers.length; ++i) {
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));
}
}
@ -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.
* @param cproject
@ -377,7 +530,7 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
IPathEntry[] containerEntries = container.getPathEntries();
if (containerEntries != null) {
for (int j = 0; j < containerEntries.length; j++) {
IPathEntry newEntry = cloneEntryAndExpand(projectPath, containerEntries[j]);
IPathEntry newEntry = PathEntryUtil.cloneEntryAndExpand(projectPath, containerEntries[j]);
listEntries.add(newEntry);
}
}
@ -424,17 +577,17 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
IPathEntry[] containerEntries = container.getPathEntries();
if (containerEntries != null) {
for (int j = 0; j < containerEntries.length; j++) {
IPathEntry newEntry = cloneEntryAndExpand(projectPath, containerEntries[j]);
IPathEntry newEntry = PathEntryUtil.cloneEntryAndExpand(projectPath, containerEntries[j]);
resolvedEntries.add(newEntry);
}
}
} else {
resolvedEntries.add(cloneEntryAndExpand(projectPath, entry));
resolvedEntries.add(PathEntryUtil.cloneEntryAndExpand(projectPath, entry));
}
}
} else {
IPathEntry clone = cloneEntryAndExpand(projectPath, entry);
IPathEntry e = getExpandedPathEntry(clone, cproject);
IPathEntry clone = PathEntryUtil.cloneEntryAndExpand(projectPath, entry);
IPathEntry e = PathEntryUtil.getExpandedPathEntry(clone, cproject);
if (e != null) {
resolvedEntries.add(e);
}
@ -450,7 +603,7 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
problemList.add(status);
}
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()) {
problemList.add(status);
}
@ -458,19 +611,19 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
ICModelStatus[] problems = new ICModelStatus[problemList.size()];
problemList.toArray(problems);
IProject project = cproject.getProject();
if (hasPathEntryProblemMarkersChange(project, problems)) {
if (PathEntryUtil.hasPathEntryProblemMarkersChange(project, problems)) {
generateMarkers(project, problems);
}
}
// 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) {
resolvedEntries.removeAll(dups);
}
// Check for duplication in the outputs
dups = checkForDuplication(resolvedEntries, IPathEntry.CDT_OUTPUT);
dups = PathEntryUtil.checkForDuplication(resolvedEntries, IPathEntry.CDT_OUTPUT);
if (dups.size() > 0) {
resolvedEntries.removeAll(dups);
}
@ -480,190 +633,6 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
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 {
try {
IPathEntry[] oldResolvedEntries = getCachedResolvedPathEntries(cproject);
@ -1095,6 +1064,13 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
}
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 : {
ILibraryEntry library = (ILibraryEntry)entries[i];
IPath sourcePath = library.getSourceAttachmentPath();
@ -1128,6 +1104,13 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
}
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 : {
IOutputEntry out = (IOutputEntry)entries[i];
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)
*/
public void run(IProgressMonitor mon) throws CoreException {
flushPathEntryProblemMarkers(project);
PathEntryUtil.flushPathEntryProblemMarkers(project);
for (int i = 0; i < problems.length; ++i) {
createPathEntryProblemMarker(project, problems[i]);
PathEntryUtil.createPathEntryProblemMarker(project, problems[i]);
}
}
}, null);
@ -1304,13 +1287,27 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
flag = ICElementDelta.F_CHANGED_PATHENTRY_INCLUDE;
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;
IPath path = macro.getPath();
celement = CoreModel.getDefault().create(path);
flag = ICElementDelta.F_CHANGED_PATHENTRY_MACRO;
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 : {
//IContainerEntry container = (IContainerEntry) entry;
//celement = cproject;
@ -1464,14 +1461,14 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
if (markers != null && markers.length > 0) {
ArrayList problemList = new ArrayList();
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()) {
problemList.add(status);
}
}
ICModelStatus[] problems = new ICModelStatus[problemList.size()];
problemList.toArray(problems);
if (hasPathEntryProblemMarkersChange(project, problems)) {
if (PathEntryUtil.hasPathEntryProblemMarkersChange(project, problems)) {
generateMarkers(project, problems);
}
}
@ -1532,392 +1529,13 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
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) {
// 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;
return PathEntryUtil.validatePathEntry(cProject, entries);
}
public 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 = 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;
return PathEntryUtil.validatePathEntry(cProject, entry, checkSourceAttachment, recurseInContainers);
}
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;
}
}

View file

@ -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;
}
}

View file

@ -13,17 +13,24 @@ package org.eclipse.cdt.core.resources;
import java.util.Collections;
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 String[] includePaths;
private final Map fMacroMap;
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];
protected ScannerInfo(String[] includePaths, Map macroMap) {
this.includePaths = includePaths;
this.macroMap = macroMap;
protected ScannerInfo(String[] systemIncludePaths, String[] localIncludePaths, String[] includeFiles,
Map macroMap, String[] macroFiles) {
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()
*/
public synchronized String[] getIncludePaths() {
if (includePaths == null) {
return EMPTY_ARRAY_STRING;
}
return includePaths;
return fSystemIncludePaths;
}
/*
@ -44,10 +48,19 @@ public class ScannerInfo implements IScannerInfo {
* @see org.eclipse.cdt.core.build.managed.IScannerInfo#getIncludePaths()
*/
public synchronized Map getDefinedSymbols() {
if (macroMap == null) {
return Collections.EMPTY_MAP;
}
return macroMap;
return fMacroMap;
}
public String[] getMacroFiles() {
return fMacroFiles;
}
public String[] getIncludeFiles() {
return fIncludeFiles;
}
public String[] getLocalIncludePath() {
return fLocalIncludePaths;
}
}

View file

@ -23,7 +23,9 @@ import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICElementDelta;
import org.eclipse.cdt.core.model.IElementChangedListener;
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.IMacroFileEntry;
import org.eclipse.cdt.core.parser.IScannerInfo;
import org.eclipse.cdt.core.parser.IScannerInfoChangeListener;
import org.eclipse.cdt.core.parser.IScannerInfoProvider;
@ -84,21 +86,51 @@ public class ScannerProvider extends AbstractCExtension implements IScannerInfoP
IPath resPath = resource.getFullPath();
try {
// get the includes
IIncludeEntry[] includeEntries = CoreModel.getIncludeEntries(resPath);
String[] includes = new String[includeEntries.length];
for (int i = 0; i < includes.length; ++i) {
includes[i] = includeEntries[i].getFullIncludePath().toOSString();
int localCount = 0, systemCount = 0;
for (int i = 0; i < includeEntries.length; ++i) {
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);
Map symbolMap = new HashMap();
for (int i = 0; i < macros.length; ++i) {
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) {
//
}
return new ScannerInfo(null, null);
return new ScannerInfo(null, null, null, null, null);
}
/*