1
0
Fork 0
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:
Mikhail Sennikovsky 2007-09-14 09:03:26 +00:00
parent 830fcc0aa3
commit 772175ca5d
4 changed files with 140 additions and 11 deletions

View file

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

View file

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

View file

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

View file

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