Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Baulig <martin.baulig@xamarin.com>2013-12-03 23:49:31 +0400
committerMartin Baulig <martin.baulig@xamarin.com>2013-12-04 00:05:07 +0400
commit1cf4b6f02e8e3baeb12f0f2d792497a730b602a0 (patch)
tree0c5e2587c5b65a87470ae57f5a5cdc1b03ec8952 /mcs/class/Microsoft.Build.Engine
parent6d7dd9e9fcbb7b42f899a31501f48294cdb01c62 (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.cs5
-rw-r--r--mcs/class/Microsoft.Build.Engine/Test/Microsoft.Build.BuildEngine/TargetTest.cs40
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]