mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
Fix for tool-chain modification mechanism
This commit is contained in:
parent
830fcc0aa3
commit
772175ca5d
4 changed files with 140 additions and 11 deletions
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue