[xbuild] Clear the built targets cache on project unload.
authorAnkit Jain <radical@corewars.org>
Thu, 13 Jan 2011 19:50:00 +0000 (01:20 +0530)
committerAnkit Jain <radical@corewars.org>
Thu, 13 Jan 2011 20:50:06 +0000 (02:20 +0530)
Remove the entries for a project from the built targets cache, on
project unload.

* Microsoft.Build.BuildEngine/Engine.cs (ClearBuiltTargetsForProject): New.
* Microsoft.Build.BuildEngine/Project.cs (BuiltTargetKeys): Remove.
(RemoveBuiltTargets): Use Engine.ClearBuiltTargetsForProject .
* Microsoft.Build.BuildEngine/Target.cs: Track api changes.
*

mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Engine.cs
mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Project.cs
mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Target.cs

index 3a41134c81d82cd0f20e577d430bb799146ec0be..8f7bc6d4b7a275abf033e796ae806318024f3506 100644 (file)
@@ -31,6 +31,7 @@ using System;
 using System.Collections;
 using System.Collections.Generic;
 using System.IO;
+using System.Linq;
 using Microsoft.Build.Framework;
 using Microsoft.Build.Utilities;
 using Mono.XBuild.Utilities;
@@ -308,8 +309,10 @@ namespace Microsoft.Build.BuildEngine {
 
                internal void RemoveLoadedProject (Project p)
                {
-                       if (p.FullFileName != String.Empty)
+                       if (!String.IsNullOrEmpty (p.FullFileName)) {
+                               ClearBuiltTargetsForProject (p);
                                projects.Remove (p.FullFileName);
+                       }
                }
 
                internal void AddLoadedProject (Project p)
@@ -328,8 +331,7 @@ namespace Microsoft.Build.BuildEngine {
                        
                        project.CheckUnloaded ();
                        
-                       if (project.FullFileName != String.Empty)
-                               projects.Remove (project.FullFileName);
+                       RemoveLoadedProject (project);
                        
                        project.Unload ();
                }
@@ -401,6 +403,14 @@ namespace Microsoft.Build.BuildEngine {
                        }
                }
 
+               internal void ClearBuiltTargetsForProject (Project project)
+               {
+                       string project_key = project.GetKeyForTarget (String.Empty, false);
+                       var to_remove_keys = BuiltTargetsOutputByName.Keys.Where (key => key.StartsWith (project_key)).ToList ();
+                       foreach (string to_remove_key in to_remove_keys)
+                               BuiltTargetsOutputByName.Remove (to_remove_key);
+               }
+
                void LogProjectStarted (Project project, string [] target_names)
                {
                        string targets;
index cba8f82fc2fa4e0fa64ca7525d6827daa7d73da5..9cf7ff582ea371684874ba31f3fcd66c8f4f099a 100644 (file)
@@ -73,7 +73,6 @@ namespace Microsoft.Build.BuildEngine {
                XmlDocument                     xmlDocument;
                bool                            unloaded;
                bool                            initialTargetsBuilt;
-               List<string>                    builtTargetKeys;
                bool                            building;
                BuildSettings                   current_settings;
                Stack<Batch>                    batches;
@@ -111,7 +110,6 @@ namespace Microsoft.Build.BuildEngine {
 
                        encoding = null;
 
-                       builtTargetKeys = new List<string> ();
                        initialTargets = new List<string> ();
                        defaultTargets = new string [0];
                        batches = new Stack<Batch> ();
@@ -351,9 +349,16 @@ namespace Microsoft.Build.BuildEngine {
                }
 
                internal string GetKeyForTarget (string target_name)
+               {
+                       return GetKeyForTarget (target_name, true);
+               }
+
+               internal string GetKeyForTarget (string target_name, bool include_global_properties)
                {
                        // target name is case insensitive
-                       return fullFileName + ":" + target_name.ToLower () + ":" + GlobalPropertiesToString (GlobalProperties);
+                       return fullFileName + ":" + target_name.ToLower () +
+                                       (include_global_properties ? (":" + GlobalPropertiesToString (GlobalProperties))
+                                                                  : String.Empty);
                }
 
                string GlobalPropertiesToString (BuildPropertyGroup bgp)
@@ -896,8 +901,7 @@ namespace Microsoft.Build.BuildEngine {
                // Removes entries of all earlier built targets for this project
                void RemoveBuiltTargets ()
                {
-                       foreach (string key in builtTargetKeys)
-                               ParentEngine.BuiltTargetsOutputByName.Remove (key);
+                       ParentEngine.ClearBuiltTargetsForProject (this);
                }
 
                void InitializeProperties (string effective_tools_version)
@@ -1396,10 +1400,6 @@ namespace Microsoft.Build.BuildEngine {
                        get; internal set;
                }
 
-               internal List<string> BuiltTargetKeys {
-                       get { return builtTargetKeys; }
-               }
-
                internal Dictionary <string, BuildItemGroup> LastItemGroupContaining {
                        get { return last_item_group_containing; }
                }
index 158ffdef94bc40a0894d7721b18996d587fb8653..beb7c581dab54b864d0a62148b62ec5f5c64bee7 100644 (file)
@@ -165,7 +165,6 @@ namespace Microsoft.Build.BuildEngine {
                        }
 
                        project.ParentEngine.BuiltTargetsOutputByName [built_targets_key] = (ITaskItem[]) Outputs.Clone ();
-                       project.BuiltTargetKeys.Add (built_targets_key);
 
                        return result;
                }