Merge pull request #820 from brendanzagaeski/master
[mono.git] / mcs / class / Microsoft.Build / Microsoft.Build.Evaluation / Project.cs
index c7105ba668fe6cce36701b4adc3a31100ddd113f..7f2e9b29d4d22e2b5655a6da34a9e7c6236a6b0c 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;
@@ -234,7 +236,7 @@ namespace Microsoft.Build.Evaluation
                        EvaluateItems (elements);
                        
                        // finally, evaluate targets and tasks
-                       EvaluateTasks (elements);
+                       EvaluateTargets (elements);
                }
                
                IEnumerable<ProjectElement> EvaluatePropertiesAndImports (IEnumerable<ProjectElement> elements)
@@ -253,8 +255,9 @@ namespace Microsoft.Build.Evaluation
                                var ige = child as ProjectImportGroupElement;
                                if (ige != null && Evaluate (ige.Condition)) {
                                        foreach (var incc in ige.Imports) {
-                                               foreach (var e in Import (incc))
-                                                       yield return e;
+                                               if (Evaluate (incc.Condition))
+                                                       foreach (var e in Import (incc))
+                                                               yield return e;
                                        }
                                }
                                var inc = child as ProjectImportElement;
@@ -263,6 +266,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 +281,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);
-                                                       }
                                                }
                                        }
                                }
@@ -317,7 +303,7 @@ namespace Microsoft.Build.Evaluation
                        all_evaluated_items.Sort ((p1, p2) => string.Compare (p1.ItemType, p2.ItemType, StringComparison.OrdinalIgnoreCase));
                }
                
-               void EvaluateTasks (IEnumerable<ProjectElement> elements)
+               void EvaluateTargets (IEnumerable<ProjectElement> elements)
                {
                        foreach (var child in elements) {
                                var te = child as ProjectTargetElement;
@@ -329,7 +315,7 @@ namespace Microsoft.Build.Evaluation
                IEnumerable<ProjectElement> Import (ProjectImportElement import)
                {
                        string dir = ProjectCollection.GetEvaluationTimeThisFileDirectory (() => FullPath);
-                       string path = ExpandString (import.Project);
+                       string path = WindowsCompatibilityExtensions.NormalizeFilePath (ExpandString (import.Project));
                        path = Path.IsPathRooted (path) ? path : dir != null ? Path.Combine (dir, path) : Path.GetFullPath (path);
                        if (ProjectCollection.OngoingImports.Contains (path)) {
                                switch (load_settings) {
@@ -340,7 +326,7 @@ namespace Microsoft.Build.Evaluation
                        }
                        ProjectCollection.OngoingImports.Push (path);
                        try {
-                               using (var reader = XmlReader.Create (WindowsCompatibilityExtensions.NormalizeFilePath (path))) {
+                               using (var reader = XmlReader.Create (path)) {
                                        var root = ProjectRootElement.Create (reader, ProjectCollection);
                                        raw_imports.Add (new ResolvedImport (import, root, true));
                                        return this.EvaluatePropertiesAndImports (root.Children).ToArray ();
@@ -503,13 +489,13 @@ namespace Microsoft.Build.Evaluation
 
                public static string GetMetadataValueEscaped (ProjectItem item, string name)
                {
-                       var md = item.GetMetadata (name);
+                       var md = item.Metadata.FirstOrDefault (m => m.Name.Equals (name, StringComparison.OrdinalIgnoreCase));
                        return md != null ? ProjectCollection.Escape (md.EvaluatedValue) : null;
                }
 
                public static string GetMetadataValueEscaped (ProjectItemDefinition item, string name)
                {
-                       var md = item.Metadata.FirstOrDefault (m => m.Name == name);
+                       var md = item.Metadata.FirstOrDefault (m => m.Name.Equals (name, StringComparison.OrdinalIgnoreCase));
                        return md != null ? ProjectCollection.Escape (md.EvaluatedValue) : null;
                }
 
@@ -522,6 +508,7 @@ namespace Microsoft.Build.Evaluation
                public static string GetPropertyValueEscaped (ProjectProperty property)
                {
                        // WTF happens here.
+                       //return ProjectCollection.Escape (property.EvaluatedValue);
                        return property.EvaluatedValue;
                }