diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/scannerconfig/IDiscoveredPathManager.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/scannerconfig/IDiscoveredPathManager.java index 3070870424f..4297233ba64 100644 --- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/scannerconfig/IDiscoveredPathManager.java +++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/scannerconfig/IDiscoveredPathManager.java @@ -65,6 +65,10 @@ public interface IDiscoveredPathManager { * Get macro files (gcc option -imacros) for the specific path (file) */ IPath[] getMacroFiles(IPath path); + /** + * Returns if there is any discovered scanner info for the path + */ + boolean isEmpty(IPath path); } interface IDiscoveredScannerInfoSerializable { diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/PerFileDiscoveredPathContainer.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/PerFileDiscoveredPathContainer.java index 676431726ab..bcf6b5a3b75 100644 --- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/PerFileDiscoveredPathContainer.java +++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/PerFileDiscoveredPathContainer.java @@ -82,4 +82,20 @@ public class PerFileDiscoveredPathContainer extends DiscoveredPathContainer return (IPathEntry[]) entries.toArray(new IPathEntry[entries.size()]); } + /* (non-Javadoc) + * @see org.eclipse.cdt.core.model.IPathEntryContainerExtension#isEmpty(org.eclipse.core.runtime.IPath) + */ + public boolean isEmpty(IPath path) { + IDiscoveredPathInfo info; + try { + info = MakeCorePlugin.getDefault().getDiscoveryManager().getDiscoveredInfo(fProject); + if (info instanceof IPerFileDiscoveredPathInfo) { + IPerFileDiscoveredPathInfo filePathInfo = (IPerFileDiscoveredPathInfo) info; + return filePathInfo.isEmpty(path); + } + } catch (CoreException e) { + } + return false; + } + } diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig2/PerFileSICollector.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig2/PerFileSICollector.java index 9057bda4264..5390d59d4a6 100644 --- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig2/PerFileSICollector.java +++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig2/PerFileSICollector.java @@ -149,6 +149,13 @@ public class PerFileSICollector implements IScannerInfoCollector2, IScannerInfoC IPath[] includeFiles; IPath[] macrosFiles; Map definedSymbols; + public boolean isEmpty() { + return (includePaths.length == 0 && + quoteIncludePaths.length == 0 && + includeFiles.length == 0 && + macrosFiles.length == 0 && + definedSymbols.size() == 0); + } } public static final String COLLECTOR_ID = MakeCorePlugin.getUniqueIdentifier() + ".PerFileSICollector"; //$NON-NLS-1$ @@ -676,6 +683,23 @@ public class PerFileSICollector implements IScannerInfoCollector2, IScannerInfoC return sid; } + /* (non-Javadoc) + * @see org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IPerFileDiscoveredPathInfo#isEmpty(org.eclipse.core.runtime.IPath) + */ + public boolean isEmpty(IPath path) { + boolean rc = true; + IResource resource = project.getWorkspace().getRoot().findMember(path); + if (resource != null) { + if (resource instanceof IFile) { + rc = (getCommand((IFile)resource) == null); + } + else if (resource instanceof IProject) { + rc = (psi == null || psi.isEmpty()); + } + } + return rc; + } + } /** diff --git a/core/org.eclipse.cdt.core/ChangeLog b/core/org.eclipse.cdt.core/ChangeLog index 9e065a84eca..1aa1d1a4d94 100644 --- a/core/org.eclipse.cdt.core/ChangeLog +++ b/core/org.eclipse.cdt.core/ChangeLog @@ -1,3 +1,15 @@ +2005-05-19 Vladimir Hirsl + Final fix for 95641: [Scanner Config] Per file scanner info not available for header files + and not compiled source files. + For include files and source files that are not compiled per file discovered scanner info + defaults to project's discovered scanner info. + A new method is added to CoreModel to determine if per resource scanner info is empty. + This method will take into account effective per file discovered scanner info. + + * index/org/eclipse/cdt/internal/core/index/domsourceindexer/DOMSourceIndexerRunner.java + * model/org/eclipse/cdt/core/model/CoreModel.java + * model/org/eclipse/cdt/core/model/IPathEntryContainerExtension.java + 2005-05-17 Vladimir Hirsl Fixed problem marker updating for files that are not indexed due to empty scanner info. Some refactoring of problem marker generation code. diff --git a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/domsourceindexer/DOMSourceIndexerRunner.java b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/domsourceindexer/DOMSourceIndexerRunner.java index 5765abf0fb5..30a68ba0f9f 100644 --- a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/domsourceindexer/DOMSourceIndexerRunner.java +++ b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/domsourceindexer/DOMSourceIndexerRunner.java @@ -188,37 +188,30 @@ public class DOMSourceIndexerRunner extends AbstractIndexer { */ private boolean isScannerInfoEmpty(IFile file) { boolean rc = true; - IScannerInfoProvider provider = CCorePlugin.getDefault().getScannerInfoProvider(file.getProject()); - if (provider != null){ - IScannerInfo scanInfo = provider.getScannerInformation(file); - if (scanInfo != null) { - if (!scanInfo.getDefinedSymbols().isEmpty() || - scanInfo.getIncludePaths().length > 0) { - rc = false; - } - if (scanInfo instanceof IExtendedScannerInfo) { - IExtendedScannerInfo extScanInfo = (IExtendedScannerInfo) scanInfo; - if (extScanInfo.getLocalIncludePath().length > 0) - rc = false; + if (!CoreModel.isScannerInformationEmpty(file)) { + rc = false; + IScannerInfoProvider provider = CCorePlugin.getDefault().getScannerInfoProvider(file.getProject()); + if (provider != null) { + IScannerInfo scanInfo = provider.getScannerInformation(file); + if (scanInfo != null && scanInfo instanceof IExtendedScannerInfo) { + IExtendedScannerInfo extScanInfo = (IExtendedScannerInfo) scanInfo; if (extScanInfo.getIncludeFiles().length > 0) { - rc = false; - for (int i = 0; i < extScanInfo.getIncludeFiles().length; i++) { - String includeFile = extScanInfo.getIncludeFiles()[i]; - /* See if this file has been encountered before */ - indexer.haveEncounteredHeader(resourceFile.getProject().getFullPath(), new Path(includeFile)); - } + for (int i = 0; i < extScanInfo.getIncludeFiles().length; i++) { + String includeFile = extScanInfo.getIncludeFiles()[i]; + /* See if this file has been encountered before */ + indexer.haveEncounteredHeader(resourceFile.getProject().getFullPath(), new Path(includeFile)); + } } if (extScanInfo.getMacroFiles().length > 0) { - rc = false; - for (int i = 0; i < extScanInfo.getIncludeFiles().length; i++) { - String macrosFile = extScanInfo.getMacroFiles()[i]; - /* See if this file has been encountered before */ - indexer.haveEncounteredHeader(resourceFile.getProject().getFullPath(), new Path(macrosFile)); - } + for (int i = 0; i < extScanInfo.getIncludeFiles().length; i++) { + String macrosFile = extScanInfo.getMacroFiles()[i]; + /* See if this file has been encountered before */ + indexer.haveEncounteredHeader(resourceFile.getProject().getFullPath(), new Path(macrosFile)); + } } - } - } - } + } + } + } return rc; } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/CoreModel.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/CoreModel.java index 6d801fa6117..598e8941f9b 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/CoreModel.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/CoreModel.java @@ -1085,5 +1085,59 @@ public class CoreModel { return manager.getIndexManager(); } + /** + * The method returns whether scanner information for a resource is empty or not. + *
+ * Although this looks like IScannerInfoProvider method, eventually this interface + * will be deprecated and the service will be moved to CoreModel. + *
+ * + * @param resource + * @since 3.0 + */ + + public static boolean isScannerInformationEmpty(IResource resource) { + final int PATH_ENTRY_MASK = IPathEntry.CDT_INCLUDE | IPathEntry.CDT_MACRO | + IPathEntry.CDT_INCLUDE_FILE | IPathEntry.CDT_MACRO_FILE; + boolean rc = true; + IPath resPath = resource.getFullPath(); + IProject project = resource.getProject(); + + ICProject cProject = CoreModel.getDefault().create(project); + if (cProject != null) { + try { + IPathEntry[] resolvedPE = CoreModel.getRawPathEntries(cProject); + for (int i = 0; i < resolvedPE.length; i++) { + IPathEntry pe = resolvedPE[i]; + // first check all containers + if (pe.getEntryKind() == IPathEntry.CDT_CONTAINER) { + IPathEntryContainer peContainer = CoreModel.getPathEntryContainer( + pe.getPath(), cProject); + if (peContainer instanceof IPathEntryContainerExtension) { + IPathEntryContainerExtension contExt = (IPathEntryContainerExtension) peContainer; + if (!contExt.isEmpty(resPath)) { + rc = false; + break; + } + } + else if (peContainer.getPathEntries().length > 0) { + rc = false; + break; + } + } + // then the user specified scanner info + else if ((pe.getEntryKind() & PATH_ENTRY_MASK) != 0) { + IPath affectedPath = pe.getPath(); + if (affectedPath.isPrefixOf(resource.getFullPath())) { + rc = false; + break; + } + } + } + } catch (CModelException e) { + } + } + return rc; + } } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/IPathEntryContainerExtension.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/IPathEntryContainerExtension.java index b230e647b76..d42f1fdc596 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/IPathEntryContainerExtension.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/IPathEntryContainerExtension.java @@ -23,9 +23,21 @@ public interface IPathEntryContainerExtension extends IPathEntryContainer { * and empty array if none. * * @param path Workspace relative path. + * @param typeMask type of path entries: + *IPathEntry.CDT_INCLUDE
IPathEntry.CDT_INCLUDE_FILE
IPathEntry.CDT_MACRO_FILE
IPathEntry.CDT_MACRO