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){
|
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);
|
ITool[][] checked = checkDups(removed, added);
|
||||||
removed = checked[0];
|
removed = checked[0];
|
||||||
added = checked[1];
|
added = checked[1];
|
||||||
|
@ -1568,9 +1573,19 @@ public class FolderInfo extends ResourceInfo implements IFolderInfo {
|
||||||
|
|
||||||
void applyToolsInternal(ITool[] resultingTools,
|
void applyToolsInternal(ITool[] resultingTools,
|
||||||
ToolListModificationInfo info) {
|
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);
|
toolChain.setToolsInternal(resultingTools);
|
||||||
|
|
||||||
adjustTargetTools(info.getRemovedTools(), info.getAddedTools(true));
|
|
||||||
|
adjustTargetTools(removedTools, info.getAddedTools(true));
|
||||||
|
|
||||||
setRebuildState(true);
|
setRebuildState(true);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2745,7 +2745,7 @@ public class ToolChain extends HoldsOptions implements IToolChain, IBuildPropert
|
||||||
return unusedChildrenSet;
|
return unusedChildrenSet;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addUnusedChild(ITool tool){
|
void addUnusedChild(ITool tool){
|
||||||
Set set = getUnusedChilrenSet();
|
Set set = getUnusedChilrenSet();
|
||||||
set.add(tool.getId());
|
set.add(tool.getId());
|
||||||
unusedChildrenSet = set;
|
unusedChildrenSet = set;
|
||||||
|
|
|
@ -70,8 +70,8 @@ class ToolChainModificationHelper {
|
||||||
return fEntry.getKey();
|
return fEntry.getKey();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Collection getValue(){
|
public List getValue(){
|
||||||
return (Collection)fEntry.getValue();
|
return (List)fEntry.getValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean equals(Object obj) {
|
public boolean equals(Object obj) {
|
||||||
|
@ -133,6 +133,10 @@ class ToolChainModificationHelper {
|
||||||
List l = get(key, true);
|
List l = get(key, true);
|
||||||
l.add(value);
|
l.add(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List removeAll(Object key){
|
||||||
|
return (List)fMap.remove(key);
|
||||||
|
}
|
||||||
|
|
||||||
public List get(Object key, boolean create){
|
public List get(Object key, boolean create){
|
||||||
List l = (List)fMap.get(key);
|
List l = (List)fMap.get(key);
|
||||||
|
@ -163,6 +167,14 @@ class ToolChainModificationHelper {
|
||||||
protected List cloneList(List l){
|
protected List cloneList(List l){
|
||||||
return (List)((ArrayList)l).clone();
|
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){
|
public void remove(Object key, Object value){
|
||||||
Collection c = get(key, false);
|
Collection c = get(key, false);
|
||||||
|
@ -340,7 +352,73 @@ class ToolChainModificationHelper {
|
||||||
|
|
||||||
return m1;
|
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){
|
static public ToolListModificationInfo getModificationInfo(IResourceInfo rcInfo, ITool[] fromTools, ITool[] toTools){
|
||||||
|
|
||||||
ListMap curMap = createRealToToolMap(fromTools, false);
|
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.IModificationStatus;
|
||||||
import org.eclipse.cdt.managedbuilder.core.IResourceInfo;
|
import org.eclipse.cdt.managedbuilder.core.IResourceInfo;
|
||||||
import org.eclipse.cdt.managedbuilder.core.ITool;
|
import org.eclipse.cdt.managedbuilder.core.ITool;
|
||||||
|
import org.eclipse.cdt.managedbuilder.core.IToolChain;
|
||||||
import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager;
|
import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager;
|
||||||
|
|
||||||
class ToolInfo {
|
class ToolInfo {
|
||||||
|
@ -36,14 +37,46 @@ class ToolInfo {
|
||||||
fRcInfo = rcInfo;
|
fRcInfo = rcInfo;
|
||||||
fInitialTool = tool;
|
fInitialTool = tool;
|
||||||
|
|
||||||
if(tool.isExtensionElement())
|
fBaseTool = calculateBaseTool(rcInfo, tool);
|
||||||
fBaseTool = tool;
|
|
||||||
else if (rcInfo != tool.getParentResourceInfo())
|
|
||||||
fBaseTool = tool;
|
|
||||||
|
|
||||||
fFlag = flag;
|
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(){
|
public int getType(){
|
||||||
return fFlag;
|
return fFlag;
|
||||||
}
|
}
|
||||||
|
@ -133,8 +166,11 @@ class ToolInfo {
|
||||||
fModificationStatus = new ModificationStatus(ManagedMakeMessages.getString("ToolInfo.1")); //$NON-NLS-1$
|
fModificationStatus = new ModificationStatus(ManagedMakeMessages.getString("ToolInfo.1")); //$NON-NLS-1$
|
||||||
return null;
|
return null;
|
||||||
case REMAINED:
|
case REMAINED:
|
||||||
default:
|
default:
|
||||||
fModificationStatus = ModificationStatus.OK;
|
if(fResultingTool == null){
|
||||||
|
fModificationStatus = ModificationStatus.OK;
|
||||||
|
fResultingTool = fInitialTool;
|
||||||
|
}
|
||||||
return fResultingTool;
|
return fResultingTool;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue