[xbuild] Don't reevaluate project when setting metadata in a dynamic ..
[mono.git] / mcs / class / Microsoft.Build.Engine / Microsoft.Build.BuildEngine / BuildItem.cs
index 8d67fec080c800d076f0e2559be92896493a2f6c..82af83b15232988b1fd1d50b1b18e80d2bc09536 100644 (file)
@@ -167,9 +167,7 @@ namespace Microsoft.Build.BuildEngine {
                {
                        if (ReservedNameUtils.IsReservedMetadataName (metadataName)) {
                                string metadata = ReservedNameUtils.GetReservedMetadata (FinalItemSpec, metadataName, evaluatedMetadata);
-                               return string.Equals (metadataName, "fullpath", StringComparison.OrdinalIgnoreCase)
-                                               ? MSBuildUtils.Escape (metadata)
-                                               : metadata;
+                               return MSBuildUtils.Unescape (metadata);
                        }
 
                        if (evaluatedMetadata.Contains (metadataName))
@@ -181,10 +179,7 @@ namespace Microsoft.Build.BuildEngine {
                public string GetMetadata (string metadataName)
                {
                        if (ReservedNameUtils.IsReservedMetadataName (metadataName)) {
-                               string metadata = ReservedNameUtils.GetReservedMetadata (FinalItemSpec, metadataName, unevaluatedMetadata);
-                               return string.Equals (metadataName, "fullpath", StringComparison.OrdinalIgnoreCase)
-                                       ? MSBuildUtils.Escape (metadata)
-                                       : metadata;
+                               return ReservedNameUtils.GetReservedMetadata (FinalItemSpec, metadataName, unevaluatedMetadata);
                        } else if (unevaluatedMetadata.Contains (metadataName))
                                return (string) unevaluatedMetadata [metadataName];
                        else
@@ -231,6 +226,14 @@ namespace Microsoft.Build.BuildEngine {
                public void SetMetadata (string metadataName,
                                         string metadataValue,
                                         bool treatMetadataValueAsLiteral)
+               {
+                       SetMetadata (metadataName, metadataValue, treatMetadataValueAsLiteral, false);
+               }
+
+               void SetMetadata (string metadataName,
+                                        string metadataValue,
+                                        bool treatMetadataValueAsLiteral,
+                                        bool fromDynamicItem)
                {
                        if (metadataName == null)
                                throw new ArgumentNullException ("metadataName");
@@ -256,9 +259,11 @@ namespace Microsoft.Build.BuildEngine {
                        } else if (HasParentItem) {
                                if (parent_item.child_items.Count > 1)
                                        SplitParentItem ();
-                               parent_item.SetMetadata (metadataName, metadataValue, treatMetadataValueAsLiteral);
+                               parent_item.SetMetadata (metadataName, metadataValue, treatMetadataValueAsLiteral, fromDynamicItem);
                        }
-                       if (FromXml || HasParentItem) {
+
+                       // We don't want to reevalute the project for dynamic items
+                       if (!fromDynamicItem && !IsDynamic && (FromXml || HasParentItem)) {
                                parent_item_group.ParentProject.MarkProjectAsDirty ();
                                parent_item_group.ParentProject.NeedToReevaluate ();
                        }
@@ -269,9 +274,12 @@ namespace Microsoft.Build.BuildEngine {
 
                void AddMetadata (string name, string value)
                {
+                       var options = IsDynamic ?
+                                     ParseOptions.AllowItemsMetadataAndSplit : ParseOptions.AllowItemsNoMetadataAndSplit;
+
                        if (parent_item_group != null) {
                                Expression e = new Expression ();
-                               e.Parse (value, ParseOptions.AllowItemsNoMetadataAndSplit);
+                               e.Parse (value, options);
                                evaluatedMetadata [name] = (string) e.ConvertTo (parent_item_group.ParentProject,
                                                typeof (string), ExpressionOptions.ExpandItemRefs);
                        } else
@@ -317,7 +325,7 @@ namespace Microsoft.Build.BuildEngine {
                                        return;
                                }
                        }
-                       
+
                        DirectoryScanner directoryScanner;
                        Expression includeExpr, excludeExpr;
                        ITaskItem[] includes, excludes;
@@ -343,8 +351,10 @@ namespace Microsoft.Build.BuildEngine {
                        directoryScanner.Includes = includes;
                        directoryScanner.Excludes = excludes;
 
-                       if (project.FullFileName != String.Empty)
+                       if (project.FullFileName != String.Empty) {
+                               directoryScanner.ProjectFile = project.ThisFileFullPath;
                                directoryScanner.BaseDirectory = new DirectoryInfo (Path.GetDirectoryName (project.FullFileName));
+                       }
                        else
                                directoryScanner.BaseDirectory = new DirectoryInfo (Directory.GetCurrentDirectory ());
                        
@@ -374,7 +384,7 @@ namespace Microsoft.Build.BuildEngine {
                                        continue;
                                
                                foreach (string name in evaluatedMetadata.Keys) {
-                                       item.SetMetadata (name, (string)evaluatedMetadata [name]);
+                                       item.SetMetadata (name, (string)evaluatedMetadata [name], false, IsDynamic);
                                }
 
                                AddAndRemoveMetadata (project, item);