[xbuild]: Fix conditions for <ItemGroup> inside <Target>.
authorMartin Baulig <martin.baulig@xamarin.com>
Fri, 24 May 2013 22:41:20 +0000 (00:41 +0200)
committerMartin Baulig <martin.baulig@xamarin.com>
Fri, 24 May 2013 22:42:48 +0000 (00:42 +0200)
mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildTaskItem.cs
mcs/class/Microsoft.Build.Engine/Test/Microsoft.Build.BuildEngine/TargetTest.cs

index 4b6925c9876dd6e1423b6ccf9df133aa77ce5739..3fc4f14807d71f264fcbd3559eeb21b4778af1a8 100644 (file)
@@ -31,6 +31,7 @@ namespace Microsoft.Build.BuildEngine
 {
        internal class BuildTaskItem : BuildItem, IBuildTask
        {
+               BuildTaskItemGroup parent;
                Project project;
 
                public bool ContinueOnError {
@@ -40,22 +41,35 @@ namespace Microsoft.Build.BuildEngine
                internal BuildTaskItem (Project project, XmlElement itemElement, BuildTaskItemGroup parentItemGroup)
                        : base (itemElement, parentItemGroup)
                {
+                       this.parent = parentItemGroup;
                        this.project = project;
                }
 
+               bool CheckCondition (string condition)
+               {
+                       if (string.IsNullOrEmpty (condition))
+                               return true;
+                       var ce = ConditionParser.ParseCondition (condition);
+                       return ce.BoolEvaluate (project);
+               }
+
+               bool CheckCondition ()
+               {
+                       return CheckCondition (parent.Condition) && CheckCondition (Condition);
+               }
+
                public bool Execute ()
                {
-                       if (Condition == String.Empty)
-                               Evaluate (project, true);
-                       else {
-                               ConditionExpression ce = ConditionParser.ParseCondition (Condition);
-                               Evaluate (project, ce.BoolEvaluate (project));
-                       }
+                       var condition = CheckCondition ();
+                       Evaluate (project, condition);
                        return true;
                }
                
                public IEnumerable<string> GetAttributes ()
                {
+                       foreach (XmlAttribute attrib in parent.XmlElement.Attributes)
+                               yield return attrib.Value;
+
                        foreach (XmlAttribute attrib in XmlElement.Attributes)
                                yield return attrib.Value;
                }
index dea87802db5f1723a4ae47db3727ba0bcee73cdd..74d597e24b29fd62bddd5272211bcc08c1a9171a 100644 (file)
@@ -706,6 +706,27 @@ namespace MonoTests.Microsoft.Build.BuildEngine {
                                        </Target>
                                </Project>", "A", "B");
                }
+
+               [Test]
+               public void ItemGroupInsideTarget_Condition ()
+               {
+                       ItemGroupInsideTarget (
+                               @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"" ToolsVersion=""4.0"">
+                                       <PropertyGroup>
+                                               <Summer>true</Summer>
+                                       </PropertyGroup>
+                                       <ItemGroup>
+                                               <Weather Include='Sun;Rain' />
+                                       </ItemGroup>
+                               
+                                       <Target Name='Main'>
+                                               <ItemGroup Condition=""'$(Summer)' != 'true'"">
+                                                       <Weather Include='Snow' />
+                                               </ItemGroup>
+                                               <Message Text='%(Weather.Identity)' />
+                                       </Target>
+                               </Project>", "Sun", "Rain");
+               }
                #endif
 
                [Test]