Project.GetItems() and ProjectInstance.GetItems() are now shared code.
authorAtsushi Eno <atsushieno@veritas-vos-liberabit.com>
Wed, 27 Nov 2013 10:39:58 +0000 (19:39 +0900)
committerAtsushi Eno <atsushieno@veritas-vos-liberabit.com>
Tue, 3 Dec 2013 07:52:46 +0000 (16:52 +0900)
They will involve more complication and I don't want to have duplicates.

mcs/class/Microsoft.Build/Microsoft.Build.Evaluation/Project.cs
mcs/class/Microsoft.Build/Microsoft.Build.Evaluation/ProjectCollection.cs
mcs/class/Microsoft.Build/Microsoft.Build.Execution/ProjectInstance.cs

index a05a903d2fbe2d7da137c126e896187548e80d3a..c528cbffd7cbb8d4b45c468558622fafcf64a60c 100644 (file)
@@ -267,6 +267,12 @@ namespace Microsoft.Build.Evaluation
                                                yield return e;
                        }
                }
+               
+               internal IEnumerable<T> GetAllItems<T> (string include, string exclude, Func<string,T> creator, Func<string,ITaskItem> taskItemCreator, Func<string,bool> itemTypeCheck, Action<T,string> assignRecurse)
+               {
+                       return ProjectCollection.GetAllItems<T> (ExpandString, include, exclude, creator, taskItemCreator, DirectoryPath, assignRecurse,
+                               t => all_evaluated_items.Any (i => i.EvaluatedInclude == t.ItemSpec && itemTypeCheck (i.ItemType)));
+               }
 
                void EvaluateItems (IEnumerable<ProjectElement> elements)
                {
@@ -276,33 +282,10 @@ namespace Microsoft.Build.Evaluation
                                        foreach (var p in ige.Items) {
                                                if (!Evaluate (ige.Condition) || !Evaluate (p.Condition))
                                                        continue;
-                                               var includes = ExpandString (p.Include).Split (item_sep, StringSplitOptions.RemoveEmptyEntries);
-                                               var excludes = ExpandString (p.Exclude).Split (item_sep, StringSplitOptions.RemoveEmptyEntries);
-                                               
-                                               if (includes.Length == 0)
-                                                       continue;                                               
-                                               if (includes.Length == 1 && includes [0].IndexOf ('*') < 0 && excludes.Length == 0) {
-                                                       // for most case - shortcut.
-                                                       var item = new ProjectItem (this, p, includes [0]);
-                                                       this.raw_items.Add (item);
+                                               Func<string,ProjectItem> creator = s => new ProjectItem (this, p, s);
+                                               foreach (var item in GetAllItems<ProjectItem> (p.Include, p.Exclude, creator, s => new ProjectTaskItem (p, s), it => string.Equals (it, p.ItemType, StringComparison.OrdinalIgnoreCase), (t, s) => t.RecursiveDir = s)) {
+                                                       raw_items.Add (item);
                                                        all_evaluated_items.Add (item);
-                                               } else {
-                                                       var ds = new Microsoft.Build.BuildEngine.DirectoryScanner () {
-                                                               BaseDirectory = new DirectoryInfo (DirectoryPath),
-                                                               Includes = includes.Select (i => new ProjectTaskItem (p, i)).ToArray (),
-                                                               Excludes = excludes.Select (e => new ProjectTaskItem (p, e)).ToArray (),
-                                                       };
-                                                       ds.Scan ();
-                                                       foreach (var taskItem in ds.MatchedItems) {
-                                                               if (all_evaluated_items.Any (i => i.EvaluatedInclude == taskItem.ItemSpec && i.ItemType == p.ItemType))
-                                                                       continue; // skip duplicate
-                                                               var item = new ProjectItem (this, p, taskItem.ItemSpec);
-                                                               string recurse = taskItem.GetMetadata ("RecursiveDir");
-                                                               if (!string.IsNullOrEmpty (recurse))
-                                                                       item.RecursiveDir = recurse;
-                                                               this.raw_items.Add (item);
-                                                               all_evaluated_items.Add (item);
-                                                       }
                                                }
                                        }
                                }
index a88df351958e33280531f30bf131a679a357f6f7..5e5b90692b402268af64479bdcbe61345ff6628d 100644 (file)
@@ -420,5 +420,36 @@ namespace Microsoft.Build.Evaluation
                {
                        return OngoingImports.Count > 0 ? OngoingImports.Peek () : (nonImportingTimeFullPath () ?? string.Empty);
                }
+               
+               static readonly char [] item_target_sep = {';'};
+               
+               internal static IEnumerable<T> GetAllItems<T> (Func<string,string> expandString, string include, string exclude, Func<string,T> creator, Func<string,ITaskItem> taskItemCreator, string directory, Action<T,string> assignRecurse, Func<ITaskItem,bool> isDuplicate)
+               {
+                       var includes = expandString (include).Split (item_target_sep, StringSplitOptions.RemoveEmptyEntries);
+                       var excludes = expandString (exclude).Split (item_target_sep, StringSplitOptions.RemoveEmptyEntries);
+                       
+                       if (includes.Length == 0)
+                               yield break;
+                       if (includes.Length == 1 && includes [0].IndexOf ('*') < 0 && excludes.Length == 0) {
+                               // for most case - shortcut.
+                               var item = creator (includes [0]);
+                               yield return item;
+                       } else {
+                               var ds = new Microsoft.Build.BuildEngine.DirectoryScanner () {
+                                       BaseDirectory = new DirectoryInfo (directory),
+                                       Includes = includes.Select (i => taskItemCreator (i)).ToArray (),
+                                       Excludes = excludes.Select (e => taskItemCreator (e)).ToArray (),
+                               };
+                               ds.Scan ();
+                               foreach (var taskItem in ds.MatchedItems) {
+                                       if (isDuplicate (taskItem))
+                                               continue; // skip duplicate
+                                       var item = creator (taskItem.ItemSpec);
+                                       string recurse = taskItem.GetMetadata ("RecursiveDir");
+                                       assignRecurse (item, recurse);
+                                       yield return item;
+                               }
+                       }
+               }
        }
 }
index 00439c28132b9c9d1f6a4f7877c0bc1ac44c902b..bc941798097d0a5a401e0d0d0e0f1399bb7a8ac1 100644 (file)
@@ -207,31 +207,8 @@ namespace Microsoft.Build.Execution
                
                internal IEnumerable<T> GetAllItems<T> (string include, string exclude, Func<string,T> creator, Func<string,ITaskItem> taskItemCreator, Func<string,bool> itemTypeCheck, Action<T,string> assignRecurse)
                {
-                       var includes = ExpandString (include).Split (item_target_sep, StringSplitOptions.RemoveEmptyEntries);
-                       var excludes = ExpandString (exclude).Split (item_target_sep, StringSplitOptions.RemoveEmptyEntries);
-                       
-                       if (includes.Length == 0)
-                               yield break;
-                       if (includes.Length == 1 && includes [0].IndexOf ('*') < 0 && excludes.Length == 0) {
-                               // for most case - shortcut.
-                               var item = creator (includes [0]);
-                               yield return item;
-                       } else {
-                               var ds = new Microsoft.Build.BuildEngine.DirectoryScanner () {
-                                       BaseDirectory = new DirectoryInfo (Directory),
-                                       Includes = includes.Select (i => taskItemCreator (i)).ToArray (),
-                                       Excludes = excludes.Select (e => taskItemCreator (e)).ToArray (),
-                               };
-                               ds.Scan ();
-                               foreach (var taskItem in ds.MatchedItems) {
-                                       if (all_evaluated_items.Any (i => i.EvaluatedInclude == taskItem.ItemSpec && itemTypeCheck (i.ItemType)))
-                                               continue; // skip duplicate
-                                       var item = creator (taskItem.ItemSpec);
-                                       string recurse = taskItem.GetMetadata ("RecursiveDir");
-                                       assignRecurse (item, recurse);
-                                       yield return item;
-                               }
-                       }
+                       return ProjectCollection.GetAllItems<T> (ExpandString, include, exclude, creator, taskItemCreator, Directory, assignRecurse,
+                               t => all_evaluated_items.Any (i => i.EvaluatedInclude == t.ItemSpec && itemTypeCheck (i.ItemType)));
                }
 
                void EvaluateItems (ProjectRootElement xml, IEnumerable<ProjectElement> elements)