[xbuild] Fix handling of reference aliases
authorMarek Safar <marek.safar@gmail.com>
Thu, 31 Jul 2014 13:21:46 +0000 (15:21 +0200)
committerMarek Safar <marek.safar@gmail.com>
Thu, 31 Jul 2014 13:21:46 +0000 (15:21 +0200)
mcs/class/Microsoft.Build.Tasks/Microsoft.Build.Tasks/Csc.cs
mcs/class/Microsoft.Build.Tasks/Test/Microsoft.Build.Tasks/CscTest.cs

index 142e73eddeb802dc009295d558a072bb7957652a..06b04b2670caab0922c550dc1946059571470c88 100644 (file)
@@ -25,8 +25,6 @@
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
-#if NET_2_0
-
 using System;
 using System.IO;
 using Microsoft.Build.Framework;
@@ -102,12 +100,12 @@ namespace Microsoft.Build.Tasks {
                        //
                        if (References != null)
                                foreach (ITaskItem item in References) {
-                                       string aliases = item.GetMetadata ("Aliases") ?? String.Empty;
-                                       aliases = aliases.Trim ();
-                                       if (aliases.Length > 0)
-                                               commandLine.AppendSwitchIfNotNull ("/reference:" + aliases + "=", item.ItemSpec);
-                                       else
+                                       string aliases = item.GetMetadata ("Aliases");
+                                       if (!string.IsNullOrEmpty (aliases)) {
+                                               AddAliasesReference (commandLine, aliases, item.ItemSpec);
+                                       } else {
                                                commandLine.AppendSwitchIfNotNull ("/reference:", item.ItemSpec);
+                                       }
                                }
 
                        if (ResponseFiles != null)
@@ -125,6 +123,21 @@ namespace Microsoft.Build.Tasks {
                                commandLine.AppendSwitchIfNotNull ("/win32res:", Win32Resource);
                }
 
+               static void AddAliasesReference (CommandLineBuilderExtension commandLine, string aliases, string reference)
+               {
+                       foreach (var alias in aliases.Split (',')) {
+                               var a = alias.Trim ();
+                               if (a.Length == null)
+                                       continue;
+
+                               var r = "/reference:";
+                               if (!string.Equals (a, "global", StringComparison.OrdinalIgnoreCase))
+                                       r += a + "=";
+
+                               commandLine.AppendSwitchIfNotNull (r, reference);
+                       }
+               }
+
                [MonoTODO]
                protected override bool CallHostObjectToExecute ()
                {
@@ -232,4 +245,3 @@ namespace Microsoft.Build.Tasks {
        }
 }
 
-#endif
index 846f47e627f72d3274d70bbab043e857f63f38f5..711bdb26afc536c33d6956c2263eb699d4857e0d 100644 (file)
@@ -433,6 +433,24 @@ namespace MonoTests.Microsoft.Build.Tasks {
                        Assert.AreEqual (String.Empty, c2.ToString (), "A2");
                }
 
+               [Test]
+               public void TestReferencesAlias ()
+               {
+                       CscExtended csc = new CscExtended ();
+                       CommandLineBuilderExtension c1 = new CommandLineBuilderExtension ();
+                       CommandLineBuilderExtension c2 = new CommandLineBuilderExtension ();
+
+                       TaskItem ti1 = new TaskItem ("A");
+                       ti1.SetMetadata ("Aliases", "r1,global,r2");
+
+                       csc.References = new ITaskItem[2] { ti1, new TaskItem ("B") };
+                       csc.ARFC (c1);
+                       csc.ACLC (c2);
+
+                       Assert.AreEqual ("/reference:r1=A /reference:A /reference:r2=A /reference:B", c1.ToString (), "A1");
+                       Assert.AreEqual (String.Empty, c2.ToString (), "A2");
+               }
+
                [Test]
                public void TestResponseFiles ()
                {