Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMikhail Sennikovsky2007-09-14 20:25:38 +0000
committerMikhail Sennikovsky2007-09-14 20:25:38 +0000
commit6e9c019ae50535845561d8988c7be6cf297cac0c (patch)
treea1612baaeeb9b1673912cc3c52f571433e8ac314
parent104ed956190e3c8d97313671531832f74664b533 (diff)
downloadorg.eclipse.cdt-6e9c019ae50535845561d8988c7be6cf297cac0c.tar.gz
org.eclipse.cdt-6e9c019ae50535845561d8988c7be6cf297cac0c.tar.xz
org.eclipse.cdt-6e9c019ae50535845561d8988c7be6cf297cac0c.zip
Fix for [Bug 203092] Available tools only lists one flavor of a tool
-rw-r--r--build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ToolChainModificationHelper.java82
-rw-r--r--build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ToolInfo.java34
2 files changed, 98 insertions, 18 deletions
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 39927e2189c..5c24070f3df 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
@@ -12,6 +12,7 @@ package org.eclipse.cdt.managedbuilder.internal.core;
import java.util.AbstractSet;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
@@ -452,30 +453,95 @@ class ToolChainModificationHelper {
iter.set(new ToolInfo(rcInfo, t, ToolInfo.REMOVED));
}
- calculateConverterTools(rcInfo, removedList, addedList, null, null);
+ ToolInfo[] added = listToArray(addedList);
+ ToolInfo[] removed = listToArray(removedList);
+ adjustAddedList(added, removed);
+
+ calculateConverterTools(rcInfo, removed, added, null, null);
+
return new ToolListModificationInfo(rcInfo,
listToArray(resultingList),
- listToArray(addedList),
- listToArray(removedList),
+ added,
+ removed,
listToArray(remainedList));
}
+ private static ITool getCommonSuperClass(ITool tool1, ITool tool2){
+ for(int i = 0; tool2 != null; tool2 = tool2.getSuperClass(), i++){
+ if(getSuperClassLevel(tool1, tool2) != -1)
+ return tool2;
+ }
+
+ return null;
+ }
+
+ private static int getSuperClassLevel(ITool tool, ITool superClass){
+ for(int i = 0; tool != null; tool = tool.getSuperClass(), i++){
+ if(superClass == tool)
+ return i;
+ }
+
+ return -1;
+ }
+
+ private static int getLevel(ITool tool){
+ int i= 0;
+ for(; tool != null; tool = tool.getSuperClass(), i++);
+ return i;
+ }
+
+ private static ITool getBestMatchTool(ITool realTool, ToolInfo[] tools){
+ int num = -1;
+ ITool bestMatch = null;
+ ITool[] identicTools = ManagedBuildManager.findIdenticalTools(realTool);
+
+ for(int i = 0; i < tools.length; i++){
+ ITool extTool = ManagedBuildManager.getExtensionTool(tools[i].getInitialTool());
+
+ for(int k = 0; k < identicTools.length; k++){
+ ITool identic = identicTools[k];
+ ITool commonSuper = getCommonSuperClass(extTool, identic);
+
+ if(commonSuper != null){
+ int level = getLevel(commonSuper);
+ if(level > num){
+ bestMatch = identic;
+ num = level;
+ }
+ }
+ }
+ }
+
+ return bestMatch;
+ }
+
+ private static void adjustAddedList(ToolInfo[] adds, ToolInfo[] removes){
+ for(int i = 0; i < adds.length; i++){
+ ToolInfo add = adds[i];
+
+ ITool bestMatch = getBestMatchTool(add.getRealTool(), removes);
+ if(bestMatch != null){
+ add.updateInitialTool(bestMatch);
+ }
+ }
+ }
+
private static ToolInfo[] listToArray(List list){
return (ToolInfo[])list.toArray(new ToolInfo[list.size()]);
}
- private static Map calculateConverterTools(IResourceInfo rcInfo, List removedList, List addedList, List remainingRemoved, List remainingAdded){
+ private static Map calculateConverterTools(IResourceInfo rcInfo, ToolInfo[] removed, ToolInfo[] added, List remainingRemoved, List remainingAdded){
if(remainingAdded == null)
- remainingAdded = new ArrayList(addedList.size());
+ remainingAdded = new ArrayList(added.length);
if(remainingRemoved == null)
- remainingRemoved = new ArrayList(removedList.size());
+ remainingRemoved = new ArrayList(removed.length);
remainingAdded.clear();
remainingRemoved.clear();
- remainingAdded.addAll(addedList);
- remainingRemoved.addAll(removedList);
+ remainingAdded.addAll(Arrays.asList(added));
+ remainingRemoved.addAll(Arrays.asList(removed));
Map resultMap = new HashMap();
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 d68ad273f55..41c03350ecf 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
@@ -35,9 +35,8 @@ class ToolInfo {
ToolInfo(IResourceInfo rcInfo, ITool tool, int flag){
fRcInfo = rcInfo;
- fInitialTool = tool;
- fBaseTool = calculateBaseTool(rcInfo, tool);
+ updateInitialTool(tool);
fFlag = flag;
}
@@ -57,14 +56,15 @@ class ToolInfo {
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;
- }
- }
+// ITool[] tcTools = baseTc.getTools();
+// baseTool = getBestMatchTool(realTool, tcTools);
+//
+// if(baseTool == null){
+// IToolChain extTc = ManagedBuildManager.getExtensionToolChain(baseTc);
+// if(extTc != null){
+// baseTool = getBestMatchTool(realTool, extTc.getTools());
+// }
+// }
if(baseTool == null){
baseTool = tool;
@@ -91,6 +91,20 @@ class ToolInfo {
return fRealTool;
}
+ void updateInitialTool(ITool tool){
+ if(fInitialTool == tool)
+ return;
+
+ fResultingTool = null;
+ fRealTool = null;
+
+ fInitialTool = tool;
+
+ fModificationStatus = null;
+
+ fBaseTool = calculateBaseTool(fRcInfo, tool);
+ }
+
public ITool getBaseTool(){
if(fBaseTool == null){
fBaseTool = ManagedBuildManager.getExtensionTool(fInitialTool);

Back to the top