[xbuild]: Allow expressions inside a dynamic <ItemGroup>'s metadata.
authorMartin Baulig <martin.baulig@xamarin.com>
Tue, 3 Dec 2013 19:49:31 +0000 (20:49 +0100)
committerMartin Baulig <martin.baulig@xamarin.com>
Tue, 3 Dec 2013 20:05:07 +0000 (21:05 +0100)
Fixes #14661.

mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildItem.cs
mcs/class/Microsoft.Build.Engine/Test/Microsoft.Build.BuildEngine/TargetTest.cs

index 8d67fec080c800d076f0e2559be92896493a2f6c..fc22d1f56310b44b63bc5a3cf9858ef33f08be98 100644 (file)
@@ -269,9 +269,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
index 84707e5cf12c5b571bcb4dcb142d8253d21f6d4a..bc09d366de5a3d4e6c3d98c1017ec2832eaf331c 100644 (file)
@@ -402,6 +402,11 @@ namespace MonoTests.Microsoft.Build.BuildEngine {
                }
 
                void ItemGroupInsideTarget (string xml, params string[] messages)
+               {
+                       ItemGroupInsideTarget (xml, 1, messages);
+               }
+
+               void ItemGroupInsideTarget (string xml, int expectedTargetCount, params string[] messages)
                {
                        var logger = CreateLogger (xml);
                        
@@ -412,8 +417,8 @@ namespace MonoTests.Microsoft.Build.BuildEngine {
                                        logger.CheckLoggedMessageHead (messages [i], i.ToString ());
                                Assert.AreEqual(0, logger.NormalMessageCount, "Extra messages found");
                                
-                               Assert.AreEqual(1, logger.TargetStarted, "TargetStarted count");
-                               Assert.AreEqual(1, logger.TargetFinished, "TargetFinished count");
+                               Assert.AreEqual(expectedTargetCount, logger.TargetStarted, "TargetStarted count");
+                               Assert.AreEqual(expectedTargetCount, logger.TargetFinished, "TargetFinished count");
                                Assert.AreEqual(messages.Length, logger.TaskStarted, "TaskStarted count");
                                Assert.AreEqual(messages.Length, logger.TaskFinished, "TaskFinished count");
                        }
@@ -749,6 +754,37 @@ namespace MonoTests.Microsoft.Build.BuildEngine {
                                        </Target>
                                </Project>", "Rain");
                }
+
+               [Test]
+               // Bug #14661
+               public void ItemGroupInsideTarget_Expression_in_Metadata ()
+               {
+                       ItemGroupInsideTarget (
+                       @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"" ToolsVersion=""4.0"">
+                               <ItemGroup>
+                                       <Foo Include='output1'>
+                                               <Inputs>input1a;input1b</Inputs>
+                                       </Foo>
+                                       <Foo Include='output2'>
+                                               <Inputs>input2a;input2b</Inputs>
+                                       </Foo>
+                               </ItemGroup>
+
+                               <Target Name='Main' DependsOnTargets='_PrepareItems' Inputs='@(_Foo)' Outputs='%(Result)'>
+                                       <Message Text='COMPILE: @(_Foo) - %(_Foo.Result)' />
+                               </Target>
+
+                               <Target Name='_PrepareItems'>
+                                       <ItemGroup>
+                                               <_Foo Include='%(Foo.Inputs)'>
+                                                       <Result>%(Foo.Identity)</Result>
+                                               </_Foo>
+                                       </ItemGroup>
+                               </Target>
+                       </Project>",
+                       3, "COMPILE: input1a;input1b - output1", "COMPILE: input2a;input2b - output2");
+               }
+
                #endif
 
                [Test]