From: Martin Baulig Date: Thu, 23 May 2013 17:02:43 +0000 (+0200) Subject: [xbuild]: Fix task batching for inside . X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=commitdiff_plain;h=934a44f286cf870811de9a0338959f729c17fae9;p=mono.git [xbuild]: Fix task batching for inside . This fixes --- 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 +// +// 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 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 items = new List (); internal BuildTaskItemGroup (XmlElement element, Target target) : base (element, target.Project, null, false, true) { } - - public bool Execute () - { - Evaluate (); - return true; - } - public IEnumerable 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 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 must be last under element . Found element 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 { ", "D"); } -#endif + [Test] + public void ItemGroupInsideTarget_Batching () + { + ItemGroupInsideTarget ( + @" + + + + + + + + ", "A", "B"); + } + #endif [Test] public void TestTargetOutputsIncludingMetadata ()