Ensure that properties are fully expanded.
authorAnkit Jain <radical@corewars.org>
Tue, 25 Aug 2009 23:50:37 +0000 (23:50 -0000)
committerAnkit Jain <radical@corewars.org>
Tue, 25 Aug 2009 23:50:37 +0000 (23:50 -0000)
In class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine:

* BuildProperty.cs (ConvertToString): New.
(ConvertoToITaskItemArray): New. Parse the property value.
* PropertyReference.cs (ConvertToString): Use BuildProperty's
ConvertToString.
(ConvertoToITaskItemArray): Likewise.

In class/Microsoft.Build.Tasks/Test/Microsoft.Build.Tasks:

* CreateItemTest.cs (TestVariableExpansion): New.
* CreatePropertyTest.cs (TestExecution2): New.

svn path=/trunk/mcs/; revision=140678

mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildProperty.cs
mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/ChangeLog
mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/PropertyReference.cs
mcs/class/Microsoft.Build.Tasks/Test/Microsoft.Build.Tasks/ChangeLog
mcs/class/Microsoft.Build.Tasks/Test/Microsoft.Build.Tasks/CreateItemTest.cs
mcs/class/Microsoft.Build.Tasks/Test/Microsoft.Build.Tasks/CreatePropertyTest.cs

index f8701183adf847cf173df37e74b2eda7df633dc2..841d3aab355140864d542f47075fbbd1cc4fe816 100644 (file)
@@ -31,6 +31,8 @@ using System;
 using System.Text;
 using System.Xml;
 
+using Microsoft.Build.Framework;
+
 namespace Microsoft.Build.BuildEngine {
        public class BuildProperty {
        
@@ -121,6 +123,22 @@ namespace Microsoft.Build.BuildEngine {
                        parentProject.EvaluatedProperties.AddProperty (evaluated);
                }
 
+               internal string ConvertToString (Project project)
+               {
+                       Expression exp = new Expression ();
+                       exp.Parse (Value, true, false);
+
+                       return (string) exp.ConvertTo (project, typeof (string));
+               }
+
+               internal ITaskItem[] ConvertToITaskItemArray (Project project)
+               {
+                       Expression exp = new Expression ();
+                       exp.Parse (Value, true, false);
+
+                       return (ITaskItem[]) exp.ConvertTo (project, typeof (ITaskItem[]));
+               }
+
                internal bool FromXml {
                        get {
                                return propertyElement != null;
index 6af509431114e7ad28b797334c350fad2a804451..ca6ba78954863485464312b3a722b7a2d43d9925 100644 (file)
@@ -1,3 +1,11 @@
+2009-08-26  Ankit Jain  <jankit@novell.com>
+
+       * BuildProperty.cs (ConvertToString): New.
+       (ConvertoToITaskItemArray): New. Parse the property value.
+       * PropertyReference.cs (ConvertToString): Use BuildProperty's
+       ConvertToString.
+       (ConvertoToITaskItemArray): Likewise.   
+
 2009-08-21  Ankit Jain  <jankit@novell.com>
 
        * Engine.cs (EndProjectBuild): Use the @succeeded argument
index 48f88ef655f005231897b5316a394d57748e7d85..3b857fa5ab20b2be750cb874bcca254975bd9c72 100644 (file)
@@ -50,20 +50,13 @@ namespace Microsoft.Build.BuildEngine {
                public string ConvertToString (Project project)
                {
                        BuildProperty bp = project.EvaluatedProperties [name];
-                       return bp != null ? bp.FinalValue : String.Empty;
+                       return bp != null ? bp.ConvertToString (project) : String.Empty;
                }
 
                public ITaskItem[] ConvertToITaskItemArray (Project project)
                {
                        BuildProperty bp = project.EvaluatedProperties [name];
-                       if (bp != null) {
-                               List<ITaskItem> list = new List<ITaskItem> ();
-                               foreach (string s in bp.FinalValue.Split (new char[] {';'}, StringSplitOptions.RemoveEmptyEntries))
-                                       list.Add (new TaskItem (s));
-                               return list.ToArray ();
-                       }
-                       else
-                               return null;
+                       return bp != null ? bp.ConvertToITaskItemArray (project) : null;
                }
                
                public string Name {
index 41d4cd8cd637ab93f0a10730c9923e82c4021bdf..72eafd9e8287cb9c2dc0a3f3ccaaeb9602c7254b 100644 (file)
@@ -1,3 +1,8 @@
+2009-08-26  Ankit Jain  <jankit@novell.com>
+
+       * CreateItemTest.cs (TestVariableExpansion): New.
+       * CreatePropertyTest.cs (TestExecution2): New.
+
 2009-08-24  Ankit Jain  <jankit@novell.com>
 
        * CreateCSharpManifestResourceNameTest.cs:
index cd004a977d08aa037ed14194c50a770a9625b970..d4829616fed7d221b1d7e0991b6d00f9319df7be 100644 (file)
@@ -187,6 +187,71 @@ namespace MonoTests.Microsoft.Build.Tasks {
                    CheckBuildItem (include [2], "NewItem", additional_metadata, "5", "C");
                }
 
+               [Test]
+               public void TestVariableExpansion ()
+               {
+                   Engine engine;
+                   Project project;
+
+                       string documentString = @"
+                                <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
+                               <PropertyGroup>
+                                       <P1>FooP1</P1>
+                                       <P2>FooP2</P2>
+                                       <C>@(IG)</C>
+                                       <P3>@(Nine)</P3>
+                               </PropertyGroup>
+                               <ItemGroup>
+                                       <Nine Include=""Nine""/>
+                                       <Eight Include=""Eight""/>
+                                       <Seven Include=""@(Eight)""/>
+                                       <Six Include=""@(Seven);$(P3)""/>
+                                       <Third Include=""Abc""/>
+                                       <Fourth Include=""$(P2)""/>
+                                       <Second Include=""@(Third);$(P1);@(Fourth);@(Six)""/>
+                                       <IG Include=""@(Second)""/>
+                               </ItemGroup>
+
+                                       <Target Name='1'>
+                                               <CreateItem Include='$(C)' >
+                                                       <Output
+                                                               TaskParameter='Include'
+                                                               ItemName='Items'
+                                                       />
+                                               </CreateItem>
+
+                                               <Message Text=""C: $(C)""/>
+                                               <Message Text=""items: @(items)""/>
+                                       </Target>
+                               </Project>
+                       ";
+
+                       engine = new Engine (Consts.BinPath);
+
+                       TestMessageLogger testLogger = new TestMessageLogger ();
+                       engine.RegisterLogger (testLogger);
+
+                       project = engine.CreateNewProject ();
+                       project.LoadXml (documentString);
+                       if (!project.Build ("1")) {
+                               testLogger.DumpMessages ();
+                               Assert.Fail ("Build failed");
+                       }
+
+                       BuildItemGroup include = project.GetEvaluatedItemsByName ("Items");
+                       Assert.AreEqual (5, include.Count, "A2");
+
+                       Assert.AreEqual ("Abc", include [0].FinalItemSpec, "A#3");
+                       Assert.AreEqual ("FooP1", include[1].FinalItemSpec, "A#4");
+                       Assert.AreEqual ("FooP2", include[2].FinalItemSpec, "A#5");
+                       Assert.AreEqual ("Eight", include[3].FinalItemSpec, "A#6");
+                       Assert.AreEqual ("Nine", include[4].FinalItemSpec, "A#7");
+
+                       testLogger.CheckLoggedMessageHead ("C: Abc;FooP1;FooP2;Eight;Nine", "A#10");
+                       testLogger.CheckLoggedMessageHead ("items: Abc;FooP1;FooP2;Eight;Nine", "A#10");
+
+               }
+
                public static void CheckBuildItem (BuildItem item, string name, string [,] metadata, string finalItemSpec, string prefix)
                {
                        Assert.AreEqual (name, item.Name, prefix + "#1");
index b5842223d09a441be4c43f22da9595ee987d57eb..8b68c7dc9711ce5e67cae9d59ad17f59462a731e 100644 (file)
@@ -86,5 +86,46 @@ namespace MonoTests.Microsoft.Build.Tasks {
                        Assert.AreEqual ("12", project.EvaluatedProperties ["ValueSetByTask"].Value, "A4");
                        Assert.AreEqual ("12", project.EvaluatedProperties ["ValueSetByTask"].FinalValue, "A5");
                }
+
+               [Test]
+               public void TestExecution2 () {
+                       Engine engine;
+                       Project project;
+
+                       string documentString = @"
+                                <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
+                               <ItemGroup>
+                                       <Second Include=""Abc""/>
+                                       <IG Include=""@(Second)""/></ItemGroup>
+                                       <PropertyGroup>
+                                               <C>@(IG)</C>
+                                       </PropertyGroup>
+                                       <Target Name='1'>
+                                               <CreateProperty Value='$(C)' >
+                                                       <Output
+                                                               TaskParameter='Value'
+                                                               PropertyName='Value'
+                                                       />
+                                                       <Output
+                                                               TaskParameter='ValueSetByTask'
+                                                               PropertyName='ValueSetByTask'
+                                                       />
+                                               </CreateProperty>
+                                       </Target>
+                               </Project>
+                       ";
+
+                       engine = new Engine (Consts.BinPath);
+                       project = engine.CreateNewProject ();
+                       project.LoadXml (documentString);
+                       Assert.IsTrue (project.Build ("1"), "A1");
+
+                       Assert.AreEqual ("Abc", project.EvaluatedProperties["Value"].Value, "A2");
+                       Assert.AreEqual ("Abc", project.EvaluatedProperties["Value"].FinalValue, "A3");
+                       Assert.AreEqual ("Abc", project.EvaluatedProperties["ValueSetByTask"].Value, "A4");
+                       Assert.AreEqual ("Abc", project.EvaluatedProperties["ValueSetByTask"].FinalValue, "A5");
+                       Assert.AreEqual ("@(IG)", project.EvaluatedProperties["C"].FinalValue, "A6");
+               }
+
        }
 }