diff options
author | Martin Baulig <martin.baulig@xamarin.com> | 2013-05-23 21:02:43 +0400 |
---|---|---|
committer | Martin Baulig <martin.baulig@xamarin.com> | 2013-05-23 23:03:26 +0400 |
commit | 934a44f286cf870811de9a0338959f729c17fae9 (patch) | |
tree | 7b270f04601b2cc800c280248e530152e9c69a18 /mcs/class/Microsoft.Build.Engine | |
parent | 091929ac2746a8a84e115d18ee337bde15d00965 (diff) |
[xbuild]: Fix task batching for <ItemGroup> inside <Target>.
This fixes
<Target Name="Simple">
<ItemGroup>
<Foo Include="A;B" />
<All Include="%(Foo.Identity)" />
</ItemGroup>
<Message Text="ALL: @(All)" />
</Target>
Diffstat (limited to 'mcs/class/Microsoft.Build.Engine')
6 files changed, 97 insertions, 21 deletions
diff --git a/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildItemGroup.cs b/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildItemGroup.cs index 034ead032b8..25f2cb0d49c 100644 --- a/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildItemGroup.cs +++ b/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildItemGroup.cs @@ -78,7 +78,7 @@ namespace Microsoft.Build.BuildEngine { continue; XmlElement xe = (XmlElement) xn; - BuildItem bi = new BuildItem (xe, this); + BuildItem bi = CreateItem (project, xe); buildItems.Add (bi); project.LastItemGroupContaining [bi.Name] = this; } @@ -87,6 +87,11 @@ namespace Microsoft.Build.BuildEngine { project != null ? project.FullFileName : null; } + internal virtual BuildItem CreateItem (Project project, XmlElement xe) + { + return new BuildItem (xe, this); + } + public BuildItem AddNewItem (string itemName, string itemInclude) { diff --git a/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildTaskItem.cs b/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildTaskItem.cs new file mode 100644 index 00000000000..4b6925c9876 --- /dev/null +++ b/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildTaskItem.cs @@ -0,0 +1,64 @@ +// +// BuildTaskItem.cs +// +// Author: +// Martin Baulig <martin.baulig@xamarin.com> +// +// Copyright (c) 2013 Xamarin Inc. (http://www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +using System; +using System.Collections.Generic; +using System.Xml; + +namespace Microsoft.Build.BuildEngine +{ + internal class BuildTaskItem : BuildItem, IBuildTask + { + Project project; + + public bool ContinueOnError { + get; set; + } + + internal BuildTaskItem (Project project, XmlElement itemElement, BuildTaskItemGroup parentItemGroup) + : base (itemElement, parentItemGroup) + { + this.project = project; + } + + public bool Execute () + { + if (Condition == String.Empty) + Evaluate (project, true); + else { + ConditionExpression ce = ConditionParser.ParseCondition (Condition); + Evaluate (project, ce.BoolEvaluate (project)); + } + return true; + } + + public IEnumerable<string> GetAttributes () + { + foreach (XmlAttribute attrib in XmlElement.Attributes) + yield return attrib.Value; + } + } +} + diff --git a/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildTaskItemGroup.cs b/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildTaskItemGroup.cs index 9449cd8a35a..2e4960b9e7f 100644 --- a/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildTaskItemGroup.cs +++ b/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildTaskItemGroup.cs @@ -30,34 +30,25 @@ using System.Xml; namespace Microsoft.Build.BuildEngine { - internal class BuildTaskItemGroup : BuildItemGroup, IBuildTask { + internal class BuildTaskItemGroup : BuildItemGroup { - public bool ContinueOnError { - get; set; - } + List<BuildTaskItem> items = new List<BuildTaskItem> (); internal BuildTaskItemGroup (XmlElement element, Target target) : base (element, target.Project, null, false, true) { } - - public bool Execute () - { - Evaluate (); - return true; - } - public IEnumerable<string> GetAttributes () + internal override BuildItem CreateItem (Project project, XmlElement xe) { - foreach (XmlAttribute attrib in XmlElement.Attributes) - yield return attrib.Value; - - foreach (BuildItem item in this) { - foreach (XmlAttribute attrib in item.XmlElement.Attributes) - yield return attrib.Value; - } + var item = new BuildTaskItem (project, xe, this); + items.Add (item); + return item; } + public List<BuildTaskItem> Items { + get { return items; } + } } } diff --git a/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Target.cs b/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Target.cs index 430ea1daf73..250c7942bd1 100644 --- a/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Target.cs +++ b/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Target.cs @@ -79,7 +79,8 @@ namespace Microsoft.Build.BuildEngine { "The element <OnError> must be last under element <Target>. Found element <Error> instead."); #if NET_3_5 else if (xe.Name == "ItemGroup") { - buildTasks.Add (new BuildTaskItemGroup (xe, this)); + var group = new BuildTaskItemGroup (xe, this); + buildTasks.AddRange (group.Items); continue; } else if (xe.Name == "PropertyGroup") { buildTasks.Add (new BuildTaskPropertyGroup (xe, this)); diff --git a/mcs/class/Microsoft.Build.Engine/Microsoft.Build.Engine.dll.sources b/mcs/class/Microsoft.Build.Engine/Microsoft.Build.Engine.dll.sources index fa51fafd89f..9081b936b5d 100644 --- a/mcs/class/Microsoft.Build.Engine/Microsoft.Build.Engine.dll.sources +++ b/mcs/class/Microsoft.Build.Engine/Microsoft.Build.Engine.dll.sources @@ -18,6 +18,7 @@ Microsoft.Build.BuildEngine/BuildPropertyGroupCollection.cs Microsoft.Build.BuildEngine/BuildPropertyGroup.cs Microsoft.Build.BuildEngine/BuildSettings.cs Microsoft.Build.BuildEngine/BuildTask.cs +Microsoft.Build.BuildEngine/BuildTaskItem.cs Microsoft.Build.BuildEngine/BuildTaskItemGroup.cs Microsoft.Build.BuildEngine/BuildTaskPropertyGroup.cs Microsoft.Build.BuildEngine/BuildWhen.cs 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 03edf3db2b0..dea87802db5 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 @@ -692,7 +692,21 @@ namespace MonoTests.Microsoft.Build.BuildEngine { </Project>", "D"); } -#endif + [Test] + public void ItemGroupInsideTarget_Batching () + { + ItemGroupInsideTarget ( + @"<Project ToolsVersion=""4.0"" xmlns=""http://schemas.microsoft.com/developer/msbuild/2003""> + <Target Name='Main'> + <ItemGroup> + <Foo Include='A;B' /> + <All Include='%(Foo.Identity)' /> + </ItemGroup> + <Message Text='%(All.Identity)' /> + </Target> + </Project>", "A", "B"); + } + #endif [Test] public void TestTargetOutputsIncludingMetadata () |