diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/managedbuilder/core/tests/ToolChainModificationTests.java b/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/managedbuilder/core/tests/ToolChainModificationTests.java index 7f824363870..6d028bcc66d 100644 --- a/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/managedbuilder/core/tests/ToolChainModificationTests.java +++ b/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/managedbuilder/core/tests/ToolChainModificationTests.java @@ -63,7 +63,7 @@ public class ToolChainModificationTests extends BasicTestCase { IConfiguration cfg = ManagedBuildManager.getConfigurationForDescription(des.getConfigurations()[0]); IToolChainModificationManager mngr = ManagedBuildManager.getToolChainModificationManager(); - IConfigurationModification cfgM = (IConfigurationModification)mngr.getModification(cfg.getRootFolderInfo()); + IConfigurationModification cfgM = (IConfigurationModification)mngr.createModification(cfg.getRootFolderInfo()); assertTrue(cfgM.isToolChainCompatible()); assertTrue(cfgM.isBuilderCompatible()); @@ -132,7 +132,7 @@ public class ToolChainModificationTests extends BasicTestCase { IConfiguration cfg = ManagedBuildManager.getConfigurationForDescription(des.getConfigurations()[0]); IToolChainModificationManager mngr = ManagedBuildManager.getToolChainModificationManager(); - IConfigurationModification cfgM = (IConfigurationModification)mngr.getModification(cfg.getRootFolderInfo()); + IConfigurationModification cfgM = (IConfigurationModification)mngr.createModification(cfg.getRootFolderInfo()); assertEquals(cfgM.getToolChain(), cfg.getToolChain()); assertTrue(cfgM.isToolChainCompatible()); assertTrue(cfgM.isBuilderCompatible()); @@ -142,11 +142,11 @@ public class ToolChainModificationTests extends BasicTestCase { fo.create(true, true, null); IFolderInfo foInfo = cfg.createFolderInfo(foPath); - IFolderInfoModification foM = mngr.getModification(foInfo); + IFolderInfoModification foM = mngr.createModification(foInfo); assertEquals(foM.getToolChain(), foInfo.getToolChain()); assertTrue(foM.isToolChainCompatible()); - cfgM = (IConfigurationModification)mngr.getModification(cfg.getRootFolderInfo()); + cfgM = (IConfigurationModification)mngr.createModification(cfg.getRootFolderInfo()); assertEquals(cfgM.getToolChain(), cfg.getToolChain()); assertTrue(cfgM.isToolChainCompatible()); assertTrue(cfgM.isBuilderCompatible()); @@ -165,9 +165,9 @@ public class ToolChainModificationTests extends BasicTestCase { foM.setToolChain(incompatibleTc); assertFalse(foM.isToolChainCompatible()); foInfo.changeToolChain(incompatibleTc, CDataUtil.genId("blah.blah"), incompatibleTc.getName()); - cfgM = (IConfigurationModification)mngr.getModification(cfg.getRootFolderInfo()); + cfgM = (IConfigurationModification)mngr.createModification(cfg.getRootFolderInfo()); assertTrue(cfgM.isToolChainCompatible()); - foM = mngr.getModification(foInfo); + foM = mngr.createModification(foInfo); assertFalse(foM.isToolChainCompatible()); project.delete(true, null); @@ -183,7 +183,7 @@ public class ToolChainModificationTests extends BasicTestCase { IConfiguration cfg = ManagedBuildManager.getConfigurationForDescription(des.getConfigurations()[0]); IToolChainModificationManager mngr = ManagedBuildManager.getToolChainModificationManager(); - IConfigurationModification cfgM = (IConfigurationModification)mngr.getModification(cfg.getRootFolderInfo()); + IConfigurationModification cfgM = (IConfigurationModification)mngr.createModification(cfg.getRootFolderInfo()); assertEquals(cfgM.getToolChain(), cfg.getToolChain()); assertTrue(cfgM.isToolChainCompatible()); assertTrue(cfgM.isBuilderCompatible()); @@ -193,11 +193,11 @@ public class ToolChainModificationTests extends BasicTestCase { fo.create(true, true, null); IFolderInfo foInfo = cfg.createFolderInfo(foPath); - IFolderInfoModification foM = mngr.getModification(foInfo); + IFolderInfoModification foM = mngr.createModification(foInfo); assertEquals(foM.getToolChain(), foInfo.getToolChain()); assertTrue(foM.isToolChainCompatible()); - cfgM = (IConfigurationModification)mngr.getModification(cfg.getRootFolderInfo()); + cfgM = (IConfigurationModification)mngr.createModification(cfg.getRootFolderInfo()); assertEquals(cfgM.getToolChain(), cfg.getToolChain()); assertTrue(cfgM.isToolChainCompatible()); assertTrue(cfgM.isBuilderCompatible()); @@ -222,9 +222,9 @@ public class ToolChainModificationTests extends BasicTestCase { foM.setToolChain(ManagedBuildManager.getExtensionToolChain("tcm.derive2.tc1")); assertFalse(foM.isToolChainCompatible()); foInfo.changeToolChain(ManagedBuildManager.getExtensionToolChain("tcm.derive2.tc1"), CDataUtil.genId("blah.blah"), null); - cfgM = (IConfigurationModification)mngr.getModification(cfg.getRootFolderInfo()); + cfgM = (IConfigurationModification)mngr.createModification(cfg.getRootFolderInfo()); assertTrue(cfgM.isToolChainCompatible()); - foM = mngr.getModification(foInfo); + foM = mngr.createModification(foInfo); assertFalse(foM.isToolChainCompatible()); project.delete(true, null); @@ -324,7 +324,7 @@ public class ToolChainModificationTests extends BasicTestCase { IToolChainModificationManager mngr = ManagedBuildManager.getToolChainModificationManager(); - IConfigurationModification cfgM = (IConfigurationModification)mngr.getModification(cfg.getRootFolderInfo()); + IConfigurationModification cfgM = (IConfigurationModification)mngr.createModification(cfg.getRootFolderInfo()); assertEquals(cfgM.getToolChain(), cfg.getToolChain()); assertTrue(cfgM.isToolChainCompatible()); assertTrue(cfgM.isBuilderCompatible()); @@ -334,11 +334,11 @@ public class ToolChainModificationTests extends BasicTestCase { fo.create(true, true, null); IFolderInfo foInfo = cfg.createFolderInfo(foPath); - IFolderInfoModification foM = mngr.getModification(foInfo); + IFolderInfoModification foM = mngr.createModification(foInfo); assertEquals(foM.getToolChain(), foInfo.getToolChain()); assertTrue(foM.isToolChainCompatible()); - cfgM = (IConfigurationModification)mngr.getModification(cfg.getRootFolderInfo()); + cfgM = (IConfigurationModification)mngr.createModification(cfg.getRootFolderInfo()); assertEquals(cfgM.getToolChain(), cfg.getToolChain()); assertTrue(cfgM.isToolChainCompatible()); assertTrue(cfgM.isBuilderCompatible()); diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Builder.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Builder.java index 213216b152f..997f3f7ae2c 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Builder.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Builder.java @@ -2704,4 +2704,8 @@ public class Builder extends BuildObject implements IBuilder, IMatchKeyProvider, public boolean isRealBuildObject() { return ManagedBuildManager.getRealBuilder(this) == this; } + + public boolean isExtensionBuildObject() { + return isExtensionElement(); + } } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Configuration.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Configuration.java index 13e788fa40e..a994032f429 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Configuration.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Configuration.java @@ -3027,4 +3027,8 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild public String getUniqueRealName() { return getName(); } + + public boolean isExtensionBuildObject() { + return isExtensionElement(); + } } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/IRealBuildObjectAssociation.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/IRealBuildObjectAssociation.java index 64dd72dc23c..1779ecc115f 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/IRealBuildObjectAssociation.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/IRealBuildObjectAssociation.java @@ -28,6 +28,8 @@ public interface IRealBuildObjectAssociation extends IBuildObject { boolean isRealBuildObject(); + boolean isExtensionBuildObject(); + IRealBuildObjectAssociation[] getIdenticBuildObjects(); IRealBuildObjectAssociation getSuperClassObject(); diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Tool.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Tool.java index c13f058b07d..dbc18a73456 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Tool.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Tool.java @@ -4209,4 +4209,8 @@ public class Tool extends HoldsOptions implements ITool, IOptionCategory, IMatch public boolean isRealBuildObject() { return getRealBuildObject() == this; } + + public boolean isExtensionBuildObject() { + return isExtensionElement(); + } } 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 c4f67f09c71..a56e7c2b851 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 @@ -2796,4 +2796,8 @@ public class ToolChain extends HoldsOptions implements IToolChain, IBuildPropert public boolean isRealBuildObject() { return getRealBuildObject() == this; } + + public boolean isExtensionBuildObject() { + return isExtensionElement(); + } } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/tcmodification/ConfigurationModification.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/tcmodification/ConfigurationModification.java index 568afb4b555..3f933bbdb98 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/tcmodification/ConfigurationModification.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/tcmodification/ConfigurationModification.java @@ -79,6 +79,16 @@ public class ConfigurationModification extends FolderInfoModification implements setBuilder(foInfo.getParent().getBuilder()); } + public ConfigurationModification(FolderInfo foInfo, ConfigurationModification base) { + super(foInfo, base); + + fSelectedBuilder = base.fSelectedBuilder; + if(!fSelectedBuilder.isExtensionElement()) + fSelectedBuilder = ManagedBuildManager.getExtensionBuilder(fSelectedBuilder); + + fRealBuilder = base.fRealBuilder; + } + public IBuilder getBuilder() { return fSelectedBuilder; } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/tcmodification/FileInfoModification.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/tcmodification/FileInfoModification.java index 40424b73338..338f70eed6d 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/tcmodification/FileInfoModification.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/tcmodification/FileInfoModification.java @@ -30,6 +30,10 @@ public class FileInfoModification extends super(rcInfo, rcInfo.getTools()); } + public FileInfoModification(ResourceConfiguration rcInfo, FileInfoModification base) { + super(rcInfo, base); + } + protected boolean canRemove(ITool realTool) { return true; } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/tcmodification/FolderInfoModification.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/tcmodification/FolderInfoModification.java index 4893bd96aae..bd07ea12822 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/tcmodification/FolderInfoModification.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/tcmodification/FolderInfoModification.java @@ -58,6 +58,15 @@ public class FolderInfoModification extends ToolListModification implements IFol fRealToolChain = (ToolChain)ManagedBuildManager.getRealToolChain(fSelectedToolChain); } + public FolderInfoModification(FolderInfo foInfo, FolderInfoModification base) { + super(foInfo, base); + fSelectedToolChain = base.fSelectedToolChain; + if(!fSelectedToolChain.isExtensionElement()) + fSelectedToolChain = (ToolChain)fSelectedToolChain.getExtensionObject(); + + fRealToolChain = base.fRealToolChain; + } + private ConflictMatchSet getParentConflictMatchSet(){ if(fParentConflicts == null){ PerTypeMapStorage storage = getParentObjectStorage(); diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/tcmodification/PerTypeMapStorage.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/tcmodification/PerTypeMapStorage.java index 4d9ef16f4c2..32106a35e3f 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/tcmodification/PerTypeMapStorage.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/tcmodification/PerTypeMapStorage.java @@ -13,7 +13,7 @@ package org.eclipse.cdt.managedbuilder.internal.tcmodification; import java.util.HashMap; import java.util.Map; -public class PerTypeMapStorage { +public class PerTypeMapStorage implements Cloneable { private ObjectTypeBasedStorage fStorage = new ObjectTypeBasedStorage(); public Map getMap(int type, boolean create){ @@ -30,4 +30,20 @@ public class PerTypeMapStorage { return new HashMap(); return (Map)((HashMap)map).clone(); } + + public Object clone(){ + try { + PerTypeMapStorage clone = (PerTypeMapStorage)super.clone(); + int types[] = ObjectTypeBasedStorage.getSupportedObjectTypes(); + for(int i = 0; i < types.length; i++){ + Object o = clone.fStorage.get(types[i]); + if(o != null){ + clone.fStorage.set(types[i], clone.createMap((Map)o)); + } + } + } catch (CloneNotSupportedException e) { + e.printStackTrace(); + } + return null; + } } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/tcmodification/TcModificationUtil.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/tcmodification/TcModificationUtil.java index 0caffed5c63..b7d6c8da24b 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/tcmodification/TcModificationUtil.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/tcmodification/TcModificationUtil.java @@ -117,6 +117,21 @@ public class TcModificationUtil { return storage; } + public static PerTypeMapStorage cloneRealToolToPathSet(PerTypeMapStorage starage){ + starage = (PerTypeMapStorage)starage.clone(); + int types[] = ObjectTypeBasedStorage.getSupportedObjectTypes(); + for(int i = 0; i < types.length; i++){ + Map map = starage.getMap(types[i], false); + if(map != null){ + for(Iterator iter = map.entrySet().iterator(); iter.hasNext(); ){ + Map.Entry entry = (Map.Entry)iter.next(); + entry.setValue(((TreeSet)entry.getValue()).clone()); + } + } + } + + return starage; + } public static PerTypeMapStorage createRealToolToPathSet(IConfiguration cfg, PerTypeMapStorage skipMapStorage, boolean addSkipPaths){ PerTypeMapStorage storage = new PerTypeMapStorage(); @@ -448,6 +463,17 @@ public class TcModificationUtil { return result; } + public static TreeMap clonePathMap(TreeMap map){ + map = (TreeMap)map.clone(); + + for(Iterator iter = map.entrySet().iterator(); iter.hasNext(); ){ + Map.Entry entry = (Map.Entry)iter.next(); + entry.setValue(((PerTypeSetStorage)entry.getValue()).clone()); + } + + return map; + } + private static boolean pathContainsObjects(PerTypeMapStorage storage, IPath path, int type){ Map map = storage.getMap(type, false); if(map == null) diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/tcmodification/ToolChainModificationManager.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/tcmodification/ToolChainModificationManager.java index 7064d46fdb4..bd623c0e347 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/tcmodification/ToolChainModificationManager.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/tcmodification/ToolChainModificationManager.java @@ -20,8 +20,10 @@ import java.util.List; import java.util.Map; import java.util.Set; +import org.eclipse.cdt.managedbuilder.core.IConfiguration; import org.eclipse.cdt.managedbuilder.core.IFileInfo; import org.eclipse.cdt.managedbuilder.core.IFolderInfo; +import org.eclipse.cdt.managedbuilder.core.IResourceInfo; import org.eclipse.cdt.managedbuilder.internal.core.FolderInfo; import org.eclipse.cdt.managedbuilder.internal.core.IRealBuildObjectAssociation; import org.eclipse.cdt.managedbuilder.internal.core.ResourceConfiguration; @@ -30,6 +32,8 @@ import org.eclipse.cdt.managedbuilder.internal.tcmodification.extension.RulesMan import org.eclipse.cdt.managedbuilder.tcmodification.IFileInfoModification; import org.eclipse.cdt.managedbuilder.tcmodification.IFolderInfoModification; import org.eclipse.cdt.managedbuilder.tcmodification.IToolChainModificationManager; +import org.eclipse.cdt.managedbuilder.tcmodification.IToolListModification; +import org.eclipse.core.runtime.IPath; public class ToolChainModificationManager implements IToolChainModificationManager { @@ -54,17 +58,57 @@ public class ToolChainModificationManager implements RulesManager.getInstance().start(); } - public IFileInfoModification getModification(IFileInfo rcInfo) { + public IFileInfoModification createModification(IFileInfo rcInfo) { return new FileInfoModification((ResourceConfiguration)rcInfo); } - public IFolderInfoModification getModification(IFolderInfo rcInfo) { + public IFolderInfoModification createModification(IFolderInfo rcInfo) { FolderInfo foInfo = (FolderInfo)rcInfo; if(foInfo.isRoot()) return new ConfigurationModification(foInfo); return new FolderInfoModification(foInfo); } + public IFolderInfoModification createModification(IConfiguration cfg, + IFolderInfoModification base) throws IllegalArgumentException { + IResourceInfo baseRcInfo = base.getResourceInfo(); + IPath path = baseRcInfo.getPath(); + IResourceInfo rcInfo = cfg.getResourceInfo(path, true); + FolderInfo folderInfo; + if(rcInfo != null){ + if(rcInfo instanceof FolderInfo){ + folderInfo = (FolderInfo)rcInfo; + } else { + throw new IllegalArgumentException(); + } + } else { + folderInfo = (FolderInfo)cfg.createFolderInfo(path); + } + + return folderInfo.isRoot() ? + new ConfigurationModification(folderInfo, (ConfigurationModification)base) + : new FolderInfoModification(folderInfo, (FolderInfoModification)base); + } + + public IFileInfoModification createModification(IConfiguration cfg, + IFileInfoModification base) throws IllegalArgumentException { + IResourceInfo baseRcInfo = base.getResourceInfo(); + IPath path = baseRcInfo.getPath(); + IResourceInfo rcInfo = cfg.getResourceInfo(path, true); + ResourceConfiguration fileInfo; + if(rcInfo != null){ + if(rcInfo instanceof ResourceConfiguration){ + fileInfo = (ResourceConfiguration)rcInfo; + } else { + throw new IllegalArgumentException(); + } + } else { + fileInfo = (ResourceConfiguration)cfg.createFileInfo(path); + } + + return new FileInfoModification(fileInfo, (FileInfoModification)base); + } + public static boolean checkFlags(int flags, int value){ return (flags & value) == value; } @@ -77,38 +121,6 @@ public class ToolChainModificationManager implements return flags &= (~value); } -// public static final int SCOPE_MATCH_EXACT = 1; -// public static final int SCOPE_MATCH_PARTIAL = 1 << 1; -// public static final int SCOPE_MATCH_SCOPE_COVERS = 1 << 2; -// public static final int SCOPE_MATCH_SET_SCOPE_COVERS = 1 << 3; -// public static final int SCOPE_MATCH_NO = 1 << 4; -// public static final int SCOPE_MATCH_ANY_MATCH = -// SCOPE_MATCH_EXACT -// | SCOPE_MATCH_PARTIAL -// | SCOPE_MATCH_SCOPE_COVERS -// | SCOPE_MATCH_SET_SCOPE_COVERS; -// -// -// public static boolean matchScope(int scope, int setScope, int matchType){ -// int applicableTypes = 0; -// if(scope == setScope){ -// applicableTypes |= SCOPE_MATCH_EXACT; -// } else { -// int conjunction = scope & setScope; -// if(conjunction == scope){ -// applicableTypes |= SCOPE_MATCH_SET_SCOPE_COVERS; -// } else if (conjunction == setScope) { -// applicableTypes |= SCOPE_MATCH_SCOPE_COVERS; -// } else if (conjunction == 0){ -// applicableTypes |= SCOPE_MATCH_NO; -// } else { -// applicableTypes |= SCOPE_MATCH_PARTIAL; -// } -// } -// -// return (applicableTypes & matchType) != 0; -// } - private boolean getMatchingObjects(int type, IObjectSet[] oSets, Set skipSet, IRealBuildObjectAssociation additionalSkip, Set result){ Set tmp = null; boolean added = false; diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/tcmodification/ToolListModification.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/tcmodification/ToolListModification.java index e468c66a379..2a7568dc988 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/tcmodification/ToolListModification.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/tcmodification/ToolListModification.java @@ -50,17 +50,17 @@ import org.eclipse.core.runtime.Status; public abstract class ToolListModification implements IToolListModification { // private Tool []fTools; - private Set fInputExtsSet = new HashSet(); + private HashSet fInputExtsSet = new HashSet(); private ResourceInfo fRcInfo; private LinkedHashMap fProjCompInfoMap = new LinkedHashMap(); private HashMap fSysCompInfoMap = new HashMap(); private Tool[] fAllSysTools; - private Set fFilteredOutSysTools; + private HashSet fFilteredOutSysTools; // private LinkedHashMap fRealToToolMap = new LinkedHashMap(); // private boolean fSysInfoMapInited; private PerTypeMapStorage fCompleteObjectStorage; private TreeMap fCompletePathMapStorage; - private Set fAddCapableTools; + private HashSet fAddCapableTools; private Map fFilteredOutTools; private ToolListModificationInfo fModificationInfo; @@ -378,6 +378,55 @@ public abstract class ToolListModification implements clearToolInfo(tools); } + public ToolListModification(ResourceInfo rcInfo, ToolListModification base){ + fRcInfo = rcInfo; + Tool[] initialTools = (Tool[])rcInfo.getTools(); + Map initRealToToolMap = TcModificationUtil.getRealToObjectsMap(initialTools, new LinkedHashMap()); + Tool[] updatedTools = base.getTools(true, false); + Map updatedRealToToolMap = TcModificationUtil.getRealToObjectsMap(updatedTools, new LinkedHashMap()); + for(Iterator iter = updatedRealToToolMap.entrySet().iterator(); iter.hasNext(); ){ + Map.Entry entry = (Map.Entry)iter.next(); + Object real = entry.getKey(); + Object initial = initRealToToolMap.get(real); + if(initial != null){ + entry.setValue(initial); + } else { + IRealBuildObjectAssociation updated = (IRealBuildObjectAssociation)entry.getValue(); + if(!updated.isExtensionBuildObject()){ + updated = updated.getExtensionObject(); + entry.setValue(updated); + } + } + } + + updatedRealToToolMap.values().toArray(updatedTools); + clearToolInfo(updatedTools); + +// if(base.fInputExtsSet != null) +// fInputExtsSet = (HashSet)base.fInputExtsSet.clone(); +// private LinkedHashMap fProjCompInfoMap = new LinkedHashMap(); +// private HashMap fSysCompInfoMap = new HashMap(); + if(base.fAllSysTools != null) + fAllSysTools = (Tool[])base.fAllSysTools.clone(); + + if(base.fFilteredOutSysTools != null) + fFilteredOutSysTools = (HashSet)base.fFilteredOutSysTools.clone(); + + if(base.fCompleteObjectStorage != null){ + fCompleteObjectStorage = TcModificationUtil.cloneRealToolToPathSet(base.fCompleteObjectStorage); + } + + if(base.fCompletePathMapStorage != null){ + fCompletePathMapStorage = base.fCompletePathMapStorage; + } +// if(base.fAddCapableTools) +// fAddCapableTools = (HashSet)base.fAddCapableTools.clone(); + //private Map fFilteredOutTools; + +// private ToolListModificationInfo fModificationInfo; + } + + public IResourceInfo getResourceInfo(){ return fRcInfo; } @@ -440,7 +489,7 @@ public abstract class ToolListModification implements if(fAllSysTools == null){ ITool[] allSys = ManagedBuildManager.getRealTools(); fAllSysTools = filterTools((Tool[])allSys); - Set set = new HashSet(Arrays.asList(allSys)); + HashSet set = new HashSet(Arrays.asList(allSys)); set.removeAll(Arrays.asList(fAllSysTools)); fFilteredOutSysTools = set; } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/tcmodification/IToolChainModificationManager.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/tcmodification/IToolChainModificationManager.java index 490b31072fb..8300b4d9af0 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/tcmodification/IToolChainModificationManager.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/tcmodification/IToolChainModificationManager.java @@ -10,6 +10,7 @@ *******************************************************************************/ package org.eclipse.cdt.managedbuilder.tcmodification; +import org.eclipse.cdt.managedbuilder.core.IConfiguration; import org.eclipse.cdt.managedbuilder.core.IFileInfo; import org.eclipse.cdt.managedbuilder.core.IFolderInfo; import org.eclipse.cdt.managedbuilder.internal.core.IRealBuildObjectAssociation; @@ -28,7 +29,7 @@ public interface IToolChainModificationManager { * @param rcInfo * @return */ - IFolderInfoModification getModification(IFolderInfo rcInfo); + IFolderInfoModification createModification(IFolderInfo rcInfo); /** * returns the modification info calculator for the given file info @@ -36,5 +37,9 @@ public interface IToolChainModificationManager { * @param rcInfo * @return */ - IFileInfoModification getModification(IFileInfo rcInfo); + IFileInfoModification createModification(IFileInfo rcInfo); + + IFolderInfoModification createModification(IConfiguration cfg, IFolderInfoModification base) throws IllegalArgumentException; + + IFileInfoModification createModification(IConfiguration cfg, IFileInfoModification base) throws IllegalArgumentException; } diff --git a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/ToolChainEditTab.java b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/ToolChainEditTab.java index ac70ae60ba7..5653606a036 100644 --- a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/ToolChainEditTab.java +++ b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/ToolChainEditTab.java @@ -167,7 +167,7 @@ public class ToolChainEditTab extends AbstractCBuildPropertyTab { private void showErrorMessage() { if (ri instanceof IFolderInfo) { - IFolderInfoModification foim = tcmm.getModification((IFolderInfo)ri); + IFolderInfoModification foim = tcmm.createModification((IFolderInfo)ri); if (foim.isToolChainCompatible()) { st_toolchain.setText(EMPTY_STR); } else { @@ -186,7 +186,7 @@ public class ToolChainEditTab extends AbstractCBuildPropertyTab { } } } else { // FileInfo - IFileInfoModification fim = tcmm.getModification((IFileInfo)ri); + IFileInfoModification fim = tcmm.createModification((IFileInfo)ri); fim.getProjectToolModifications(); } } @@ -202,7 +202,7 @@ public class ToolChainEditTab extends AbstractCBuildPropertyTab { IToolChain[] tcs = r_tcs; if (b_dispCompatible.getSelection() && (ri instanceof IFolderInfo)) { - IFolderInfoModification fim = tcmm.getModification((IFolderInfo)ri); + IFolderInfoModification fim = tcmm.createModification((IFolderInfo)ri); tcs = fim.getCompatibleToolChains(); IToolChain[] tcs1 = new IToolChain[tcs.length + 1]; System.arraycopy(tcs, 0, tcs1, 0, tcs.length); @@ -245,7 +245,7 @@ public class ToolChainEditTab extends AbstractCBuildPropertyTab { IBuilder[] bs = r_bs; if (b_dispCompatible.getSelection() && (ri instanceof IFolderInfo)) { - IFolderInfoModification fim = tcmm.getModification((IFolderInfo)ri); + IFolderInfoModification fim = tcmm.createModification((IFolderInfo)ri); if (fim instanceof IConfigurationModification) { IBuilder[] bs1 = ((IConfigurationModification)fim).getCompatibleBuilders(); bs = new IBuilder[bs1.length + 1]; @@ -347,7 +347,7 @@ public class ToolChainEditTab extends AbstractCBuildPropertyTab { st_tool.setImage(null); if (tool == null) return; - IFileInfoModification fim = tcmm.getModification((IFileInfo)ri); + IFileInfoModification fim = tcmm.createModification((IFileInfo)ri); IToolModification tm = fim.getToolModification(tool); if (tm != null && !tm.isCompatible()) { CompatibilityStatus cs = tm.getCompatibilityStatus(); @@ -361,7 +361,7 @@ public class ToolChainEditTab extends AbstractCBuildPropertyTab { private boolean updateCompatibleTools(ITool real) { boolean result = false; ArrayList list = new ArrayList(); - IFileInfoModification fim = tcmm.getModification((IFileInfo)ri); + IFileInfoModification fim = tcmm.createModification((IFileInfo)ri); if (real != null) { // Current tool exists real = ManagedBuildManager.getRealTool(real); diff --git a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/ToolSelectionDialog.java b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/ToolSelectionDialog.java index 4f31594e886..8e5353b8248 100644 --- a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/ToolSelectionDialog.java +++ b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/ToolSelectionDialog.java @@ -72,9 +72,9 @@ public class ToolSelectionDialog extends Dialog { setShellStyle(getShellStyle() | SWT.RESIZE); if (ri instanceof IFolderInfo) - tmod = ManagedBuildManager.getToolChainModificationManager().getModification((IFolderInfo)ri); + tmod = ManagedBuildManager.getToolChainModificationManager().createModification((IFolderInfo)ri); else - tmod = ManagedBuildManager.getToolChainModificationManager().getModification((IFileInfo)ri); + tmod = ManagedBuildManager.getToolChainModificationManager().createModification((IFileInfo)ri); } /* (non-Javadoc)