diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/FolderInfo.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/FolderInfo.java index 11b740e6431..595b57d0be4 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/FolderInfo.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/FolderInfo.java @@ -1054,6 +1054,11 @@ public class FolderInfo extends ResourceInfo implements IFolderInfo { } public void modifyToolChain(ITool[] removed, ITool[] added){ + if(true){ + ToolListModificationInfo info = ToolChainModificationHelper.getModificationInfo(this, getTools(), added, removed); + info.apply(); + return; + } ITool[][] checked = checkDups(removed, added); removed = checked[0]; added = checked[1]; @@ -1568,9 +1573,19 @@ public class FolderInfo extends ResourceInfo implements IFolderInfo { void applyToolsInternal(ITool[] resultingTools, ToolListModificationInfo info) { + ITool[] removedTools = info.getRemovedTools(); + + for(int i = 0; i < removedTools.length; i++){ + ITool tool = removedTools[i]; + ITool extTool = ManagedBuildManager.getExtensionTool(tool); + if(extTool.getParent() == toolChain.getSuperClass()) + toolChain.addUnusedChild(extTool); + } + toolChain.setToolsInternal(resultingTools); - adjustTargetTools(info.getRemovedTools(), info.getAddedTools(true)); + + adjustTargetTools(removedTools, info.getAddedTools(true)); setRebuildState(true); } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ToolChain.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ToolChain.java index 002eddcd462..e4a0e4d8301 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ToolChain.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ToolChain.java @@ -2745,7 +2745,7 @@ public class ToolChain extends HoldsOptions implements IToolChain, IBuildPropert return unusedChildrenSet; } - private void addUnusedChild(ITool tool){ + void addUnusedChild(ITool tool){ Set set = getUnusedChilrenSet(); set.add(tool.getId()); unusedChildrenSet = set; diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ToolChainModificationHelper.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ToolChainModificationHelper.java index e6939cbd7b4..39927e2189c 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ToolChainModificationHelper.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ToolChainModificationHelper.java @@ -70,8 +70,8 @@ class ToolChainModificationHelper { return fEntry.getKey(); } - public Collection getValue(){ - return (Collection)fEntry.getValue(); + public List getValue(){ + return (List)fEntry.getValue(); } public boolean equals(Object obj) { @@ -133,6 +133,10 @@ class ToolChainModificationHelper { List l = get(key, true); l.add(value); } + + public List removeAll(Object key){ + return (List)fMap.remove(key); + } public List get(Object key, boolean create){ List l = (List)fMap.get(key); @@ -163,6 +167,14 @@ class ToolChainModificationHelper { protected List cloneList(List l){ return (List)((ArrayList)l).clone(); } + + public Collection putValuesToCollection(Collection c){ + for(Iterator iter = collectionEntrySet().iterator(); iter.hasNext(); ){ + List l = ((CollectionEntry)iter.next()).getValue(); + c.addAll(l); + } + return c; + } public void remove(Object key, Object value){ Collection c = get(key, false); @@ -340,7 +352,73 @@ class ToolChainModificationHelper { return m1; } - + + static public ToolListModificationInfo getModificationInfo(IResourceInfo rcInfo, ITool[] fromTools, ITool[] addedTools, ITool[] removedTools){ + ListMap addedMap = createRealToToolMap(addedTools, false); + for(int i = 0; i < removedTools.length; i++){ + ITool removedTool = removedTools[i]; + ITool realTool = ManagedBuildManager.getRealTool(removedTool); + if(realTool == null) + realTool = removedTool; + + addedMap.remove(realTool, 0); + } + + ListMap removedMap = createRealToToolMap(removedTools, false); + for(int i = 0; i < addedTools.length; i++){ + ITool addedTool = addedTools[i]; + ITool realTool = ManagedBuildManager.getRealTool(addedTool); + if(realTool == null) + realTool = addedTool; + + removedMap.remove(realTool, 0); + } + + addedMap.clearEmptyLists(); + removedMap.clearEmptyLists(); + + ListMap curMap = createRealToToolMap(fromTools, false); + for(Iterator iter = removedMap.collectionEntrySet().iterator(); iter.hasNext();){ + CollectionEntry entry = (CollectionEntry)iter.next(); + List cur = curMap.get(entry.getKey(), false); + List removed = entry.getValue(); + if(cur != null){ + int numToRemove = removed.size(); + int curSize = cur.size(); + if(curSize <= numToRemove){ + curMap.removeAll(entry.getKey()); + } else { + for(int i = 0; i < numToRemove; i++){ + cur.remove(0); + } + } + } + } + + curMap.clearEmptyLists(); + + for(Iterator iter = addedMap.collectionEntrySet().iterator(); iter.hasNext();){ + CollectionEntry entry = (CollectionEntry)iter.next(); + List cur = curMap.get(entry.getKey(), true); + List added = entry.getValue(); + int numToAdd = added.size(); + numToAdd -= cur.size(); + for(int i = 0; i < numToAdd; i++){ + cur.add(added.get(i)); + } + + if(cur.size() == 0) + curMap.removeAll(entry.getKey()); + } + + curMap.clearEmptyLists(); + + List resultingList = new ArrayList(); + curMap.putValuesToCollection(resultingList); + + return getModificationInfo(rcInfo, fromTools, (ITool[])resultingList.toArray(new ITool[resultingList.size()])); + } + static public ToolListModificationInfo getModificationInfo(IResourceInfo rcInfo, ITool[] fromTools, ITool[] toTools){ ListMap curMap = createRealToToolMap(fromTools, false); diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ToolInfo.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ToolInfo.java index 4b6f2a07f6e..d68ad273f55 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ToolInfo.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ToolInfo.java @@ -15,6 +15,7 @@ import org.eclipse.cdt.managedbuilder.core.IFolderInfo; import org.eclipse.cdt.managedbuilder.core.IModificationStatus; import org.eclipse.cdt.managedbuilder.core.IResourceInfo; import org.eclipse.cdt.managedbuilder.core.ITool; +import org.eclipse.cdt.managedbuilder.core.IToolChain; import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; class ToolInfo { @@ -36,14 +37,46 @@ class ToolInfo { fRcInfo = rcInfo; fInitialTool = tool; - if(tool.isExtensionElement()) - fBaseTool = tool; - else if (rcInfo != tool.getParentResourceInfo()) - fBaseTool = tool; + fBaseTool = calculateBaseTool(rcInfo, tool); fFlag = flag; } + private static ITool calculateBaseTool(IResourceInfo rcInfo, ITool tool){ + ITool baseTool = null; + if(tool.isExtensionElement()) { + IToolChain baseTc; + if(rcInfo instanceof IFolderInfo){ + baseTc = ((IFolderInfo)rcInfo).getToolChain(); + } else { + IFolderInfo foInfo = ((ResourceConfiguration)rcInfo).getParentFolderInfo(); + baseTc = foInfo.getToolChain(); + } + + ITool realTool = ManagedBuildManager.getRealTool(tool); + if(realTool == null){ + baseTool = tool; + } else { + ITool[] tcTools = baseTc.getTools(); + for(int i = 0; i < tcTools.length; i++){ + ITool extTool = ManagedBuildManager.getExtensionTool(tcTools[i]); + if(extTool != null && realTool == ManagedBuildManager.getRealTool(extTool)){ + baseTool = extTool; + break; + } + } + + if(baseTool == null){ + baseTool = tool; + } + } + } else if (rcInfo != tool.getParentResourceInfo()) { + baseTool = tool; + } + + return baseTool; + } + public int getType(){ return fFlag; } @@ -133,8 +166,11 @@ class ToolInfo { fModificationStatus = new ModificationStatus(ManagedMakeMessages.getString("ToolInfo.1")); //$NON-NLS-1$ return null; case REMAINED: - default: - fModificationStatus = ModificationStatus.OK; + default: + if(fResultingTool == null){ + fModificationStatus = ModificationStatus.OK; + fResultingTool = fInitialTool; + } return fResultingTool; } }