diff options
author | Martin Baulig <martin.baulig@xamarin.com> | 2013-12-03 23:49:31 +0400 |
---|---|---|
committer | Martin Baulig <martin.baulig@xamarin.com> | 2013-12-04 00:05:07 +0400 |
commit | 1cf4b6f02e8e3baeb12f0f2d792497a730b602a0 (patch) | |
tree | 0c5e2587c5b65a87470ae57f5a5cdc1b03ec8952 /mcs/class/Microsoft.Build.Engine | |
parent | 6d7dd9e9fcbb7b42f899a31501f48294cdb01c62 (diff) |
[xbuild]: Allow expressions inside a dynamic <ItemGroup>'s metadata.
Fixes #14661.
Diffstat (limited to 'mcs/class/Microsoft.Build.Engine')
-rw-r--r-- | mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildItem.cs | 5 | ||||
-rw-r--r-- | mcs/class/Microsoft.Build.Engine/Test/Microsoft.Build.BuildEngine/TargetTest.cs | 40 |
2 files changed, 42 insertions, 3 deletions
diff --git a/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildItem.cs b/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildItem.cs index 8d67fec080c..fc22d1f5631 100644 --- a/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildItem.cs +++ b/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildItem.cs @@ -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 diff --git a/mcs/class/Microsoft.Build.Engine/Test/Microsoft.Build.BuildEngine/TargetTest.cs b/mcs/class/Microsoft.Build.Engine/Test/Microsoft.Build.BuildEngine/TargetTest.cs index 84707e5cf12..bc09d366de5 100644 --- a/mcs/class/Microsoft.Build.Engine/Test/Microsoft.Build.BuildEngine/TargetTest.cs +++ b/mcs/class/Microsoft.Build.Engine/Test/Microsoft.Build.BuildEngine/TargetTest.cs @@ -403,6 +403,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); try @@ -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] |