--- a/cnd.makeproject/src/org/netbeans/modules/cnd/makeproject/NativeProjectProvider.java +++ a/cnd.makeproject/src/org/netbeans/modules/cnd/makeproject/NativeProjectProvider.java @@ -343,11 +343,13 @@ if (nativeFileIetm == null) { continue; } - PredefinedToolKind tool = ((Item) nativeFileIetm).getDefaultTool(); - if (tool == PredefinedToolKind.CustomTool - // check of mime type is better to support headers without extensions - && !MIMENames.HEADER_MIME_TYPE.equals(((Item) nativeFileIetm).getMIMEType())) { - continue; // IZ 87407 + if (nativeFileIetm instanceof Item) { + PredefinedToolKind tool = ((Item) nativeFileIetm).getDefaultTool(); + if (tool == PredefinedToolKind.CustomTool + // check of mime type is better to support headers without extensions + && !MIMENames.HEADER_MIME_TYPE.equals(((Item) nativeFileIetm).getMIMEType())) { + continue; // IZ 87407 + } } actualList.add(nativeFileIetm); if (TRACE) { @@ -1278,7 +1280,7 @@ } } - private static class NativeFileIndexer implements NativeFileItem { + public static class NativeFileIndexer implements NativeFileItem { private final FileObject indexer; private final NativeFileItem.Language language; @@ -1357,5 +1359,31 @@ public boolean isExcluded() { return false; } + + public int getCRC() { + int res = 0; + for(IncludePath aPath : getUserIncludePaths()) { + res += 37 * aPath.getFSPath().hashCode(); + } + for(FSPath aPath : getIncludeFiles()) { + res += 37 * aPath.hashCode(); + } + for(String macro: getUserMacroDefinitions()) { + res += 37 * macro.hashCode(); + } + for(IncludePath aPath : getSystemIncludePaths()) { + res += 37 * aPath.getFSPath().hashCode(); + } + for(FSPath aPath : getSystemIncludeHeaders()) { + res += 37 * aPath.getPath().hashCode(); + } + for(String macro: getSystemMacroDefinitions()) { + res += 37 * macro.hashCode(); + } + res += 37 * getLanguage().hashCode(); + res += 37 * getLanguageFlavor().hashCode(); + return res; + } + } } --- a/cnd.makeproject/src/org/netbeans/modules/cnd/makeproject/api/configurations/ConfigurationDescriptorProvider.java +++ a/cnd.makeproject/src/org/netbeans/modules/cnd/makeproject/api/configurations/ConfigurationDescriptorProvider.java @@ -56,8 +56,10 @@ import java.util.logging.Level; import java.util.logging.Logger; import org.netbeans.api.project.Project; +import org.netbeans.modules.cnd.api.project.NativeFileItem; import org.netbeans.modules.cnd.api.toolchain.CompilerSet; import org.netbeans.modules.cnd.makeproject.MakeProjectImpl; +import org.netbeans.modules.cnd.makeproject.NativeProjectProvider; import org.netbeans.modules.cnd.makeproject.api.configurations.ConfigurationDescriptor.State; import org.netbeans.modules.cnd.makeproject.configurations.ConfigurationXMLReader; import org.netbeans.modules.cnd.makeproject.uiapi.ConfirmSupport; @@ -566,50 +568,42 @@ public static final class Delta implements SnapShot { private final Map oldState = new HashMap<>(); - private final List included = new ArrayList<>(); - private final List added = new ArrayList<>(); - private final List excluded = new ArrayList<>(); - private final List deleted = new ArrayList<>(); - private final List changed = new ArrayList<>(); - private final List replaced = new ArrayList<>(); + private final List included = new ArrayList<>(); + private final List added = new ArrayList<>(); + private final List excluded = new ArrayList<>(); + private final List deleted = new ArrayList<>(); + private final List changed = new ArrayList<>(); + private final List replaced = new ArrayList<>(); private Delta(MakeConfigurationDescriptor oldDescriptor) { if (oldDescriptor != null) { for(Item item : oldDescriptor.getProjectItems()) { oldState.put(item.getAbsolutePath(), new Pair(item, item.getCRC(), item.isExcluded())); } + NativeProjectProvider np = oldDescriptor.getProject().getLookup().lookup(NativeProjectProvider.class); + for(NativeFileItem item : np.getStandardHeadersIndexers()) { + if (item instanceof NativeProjectProvider.NativeFileIndexer) { + NativeProjectProvider.NativeFileIndexer indexer = (NativeProjectProvider.NativeFileIndexer)item; + oldState.put(item.getAbsolutePath(), new Pair(indexer, indexer.getCRC(), indexer.isExcluded())); + } + } } } private void computeDelta(MakeConfigurationDescriptor newDescriptor) { - Set oldSet = new HashSet<>(); + Set oldSet = new HashSet<>(); oldState.entrySet().forEach((entry) -> { oldSet.add(entry.getValue().item); }); Item[] newItems = newDescriptor.getProjectItems(); for (Item item : newItems) { - Delta.Pair pair = oldState.get(item.getAbsolutePath()); - if (pair == null) { - added.add(item); - } else { - oldSet.remove(pair.item); - if (item.isExcluded() && pair.excluded) { - // no changes - replaced.add(item); - } else if (item.isExcluded() && !pair.excluded) { - excluded.add(item); - } else if (!item.isExcluded() && pair.excluded) { - included.add(item); - } else { - // compare item properties - if (item.getCRC() != pair.crc) { - changed.add(item); - } else { - if (pair.item != item) { - replaced.add(item); - } - } - } + checkItem(item, oldSet, item.getCRC()); + } + NativeProjectProvider np = newDescriptor.getProject().getLookup().lookup(NativeProjectProvider.class); + for(NativeFileItem item : np.getStandardHeadersIndexers()) { + if (item instanceof NativeProjectProvider.NativeFileIndexer) { + NativeProjectProvider.NativeFileIndexer indexer = (NativeProjectProvider.NativeFileIndexer)item; + checkItem(indexer, oldSet, indexer.getCRC()); } } oldSet.forEach((item) -> { @@ -617,6 +611,32 @@ }); oldState.clear(); } + + private void checkItem(NativeFileItem item, Set oldSet, int itemCRC) { + Delta.Pair pair = oldState.get(item.getAbsolutePath()); + if (pair == null) { + added.add(item); + } else { + oldSet.remove(pair.item); + if (item.isExcluded() && pair.excluded) { + // no changes + replaced.add(item); + } else if (item.isExcluded() && !pair.excluded) { + excluded.add(item); + } else if (!item.isExcluded() && pair.excluded) { + included.add(item); + } else { + // compare item properties + if (itemCRC != pair.crc) { + changed.add(item); + } else { + if (pair.item != item) { + replaced.add(item); + } + } + } + } + } public void printStatistic(Logger logger) { if (logger.isLoggable(CndUtils.isUnitTestMode()? Level.FINE : Level.INFO)) { @@ -632,50 +652,50 @@ /** * marked as included items */ - public List getIncluded() { + public List getIncluded() { return Collections.unmodifiableList(included); } /** * added in project items */ - public List getAdded() { + public List getAdded() { return Collections.unmodifiableList(added); } /** * marked as excluded items */ - public List getExcluded() { + public List getExcluded() { return Collections.unmodifiableList(excluded); } /** * deleted from project items */ - public List getDeleted() { + public List getDeleted() { return Collections.unmodifiableList(deleted); } /** * items with changed properties */ - public List getChanged() { + public List getChanged() { return Collections.unmodifiableList(changed); } /** * Items which properties were not changed (from code model point of view) but instances were replaced */ - public List getReplaced() { + public List getReplaced() { return Collections.unmodifiableList(replaced); } private static final class Pair { final int crc; final boolean excluded; - final Item item; - private Pair(Item item, int crc, boolean excluded) { + final NativeFileItem item; + private Pair(NativeFileItem item, int crc, boolean excluded) { this.crc = crc; this.excluded = excluded; this.item = item; --- a/cnd.makeproject/src/org/netbeans/modules/cnd/makeproject/api/configurations/MakeConfigurationDescriptor.java +++ a/cnd.makeproject/src/org/netbeans/modules/cnd/makeproject/api/configurations/MakeConfigurationDescriptor.java @@ -972,21 +972,21 @@ if (delta.isEmpty()) { return; } - List deleted = delta.getDeleted(); - List excluded = delta.getExcluded(); + List deleted = delta.getDeleted(); + List excluded = delta.getExcluded(); if (!(deleted.isEmpty() && excluded.isEmpty())) { List list = new ArrayList(deleted); list.addAll(excluded); getNativeProjectChangeSupport().fireFilesRemoved(list); } - List added = delta.getAdded(); - List included = delta.getIncluded(); + List added = delta.getAdded(); + List included = delta.getIncluded(); if (!(added.isEmpty() && included.isEmpty())) { List list = new ArrayList(added); list.addAll(included); getNativeProjectChangeSupport().fireFilesAdded(list); } - List changed = delta.getChanged(); + List changed = delta.getChanged(); if (!changed.isEmpty()) { getNativeProjectChangeSupport().fireFilesPropertiesChanged(new ArrayList(changed)); }