Merge branch 'master' into msbuilddll2
[mono.git] / mcs / class / Microsoft.Build / Microsoft.Build.Evaluation / Project.cs
index 54213b081934b8d8a81de4c0fe3bbe8062a6ab41..7a1c1144d207c52781ce974885e55bf17cf1fcab 100644 (file)
@@ -41,6 +41,7 @@ using Microsoft.Build.Exceptions;
 using Microsoft.Build.Execution;
 using Microsoft.Build.Framework;
 using Microsoft.Build.Internal;
+using Microsoft.Build.Internal.Expressions;
 using Microsoft.Build.Logging;
 using System.Collections;
 
@@ -201,7 +202,10 @@ namespace Microsoft.Build.Evaluation
                                properties = new List<ProjectProperty> ();
                        
                                foreach (DictionaryEntry p in Environment.GetEnvironmentVariables ())
-                                       this.properties.Add (new EnvironmentProjectProperty (this, (string)p.Key, (string)p.Value));
+                                       // FIXME: this is kind of workaround for unavoidable issue that PLATFORM=* is actually given
+                                       // on some platforms and that prevents setting default "PLATFORM=AnyCPU" property.
+                                       if (!string.Equals ("PLATFORM", (string) p.Key, StringComparison.OrdinalIgnoreCase))
+                                               this.properties.Add (new EnvironmentProjectProperty (this, (string)p.Key, (string)p.Value));
                                foreach (var p in GlobalProperties)
                                        this.properties.Add (new GlobalProjectProperty (this, p.Key, p.Value));
                                var tools = ProjectCollection.GetToolset (this.ToolsVersion) ?? ProjectCollection.GetToolset (this.ProjectCollection.DefaultToolsVersion);
@@ -216,8 +220,6 @@ namespace Microsoft.Build.Evaluation
                        ProjectCollection.AddProject (this);
                }
                
-               static readonly char [] item_sep = {';'};
-               
                void ProcessXml (Project parent)
                {
                        // this needs to be initialized here (regardless of that items won't be evaluated at property evaluation;
@@ -263,6 +265,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)
                {
@@ -272,33 +280,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);
-                                                       }
                                                }
                                        }
                                }