From 4930f612ae7f58d3f6b3944da31e8f605ffa6bcc Mon Sep 17 00:00:00 2001 From: Atsushi Eno Date: Fri, 16 May 2014 21:58:38 +0900 Subject: [PATCH] [MS.Build] for item metadata access expression, remove surrounding ' and ". The test case would explain what is not desired there. --- .../ExpressionEvaluator.cs | 15 +++++++--- .../ProjectInstanceTest.cs | 30 +++++++++++++++++++ 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/mcs/class/Microsoft.Build/Microsoft.Build.Internal/ExpressionEvaluator.cs b/mcs/class/Microsoft.Build/Microsoft.Build.Internal/ExpressionEvaluator.cs index 2cc8388ea40..e41f7818d79 100644 --- a/mcs/class/Microsoft.Build/Microsoft.Build.Internal/ExpressionEvaluator.cs +++ b/mcs/class/Microsoft.Build/Microsoft.Build.Internal/ExpressionEvaluator.cs @@ -420,16 +420,23 @@ namespace Microsoft.Build.Internal.Expressions if (!items.Any ()) return null; if (Application.Expressions == null) - return string.Join (";", items.Select (item => context.EvaluateItem (itemType, item))); + return string.Join (";", items.Select (item => Unwrap (context.EvaluateItem (itemType, item)))); else return string.Join (";", items.Select (item => { context.ContextItem = item; - var ret = string.Concat (Application.Expressions.Select (e => e.EvaluateAsString (context))); + var ret = Unwrap (string.Concat (Application.Expressions.Select (e => e.EvaluateAsString (context)))); context.ContextItem = null; return ret; })); } - + + static string Unwrap (string ret) + { + if (ret.Length < 2 || ret [0] != ret [ret.Length - 1] || ret [0] != '"' && ret [0] != '\'') + return ret; + return ret.Substring (1, ret.Length - 2); + } + public override object EvaluateAsObject (EvaluationContext context) { return EvaluateAsString (context); @@ -458,7 +465,7 @@ namespace Microsoft.Build.Internal.Expressions var values = items.Select (i => (i is ProjectItem) ? ((ProjectItem) i).GetMetadataValue (metadataName) : ((ProjectItemInstance) i).GetMetadataValue (metadataName)).Where (s => !string.IsNullOrEmpty (s)); return string.Join (";", values); } - + public override object EvaluateAsObject (EvaluationContext context) { return EvaluateAsString (context); diff --git a/mcs/class/Microsoft.Build/Test/Microsoft.Build.Execution/ProjectInstanceTest.cs b/mcs/class/Microsoft.Build/Test/Microsoft.Build.Execution/ProjectInstanceTest.cs index 1f33a64907f..cf41928c19c 100644 --- a/mcs/class/Microsoft.Build/Test/Microsoft.Build.Execution/ProjectInstanceTest.cs +++ b/mcs/class/Microsoft.Build/Test/Microsoft.Build.Execution/ProjectInstanceTest.cs @@ -235,6 +235,36 @@ namespace MonoTests.Microsoft.Build.Execution var proj = new ProjectInstance (root); Assert.AreEqual ("xxx;yyy", proj.ExpandString ("@(FOO)"), "#1"); // so, metadata is gone... } + + [Test] + public void EvaluatePropertyWithQuotation () + { + string project_xml = @" + + + + + foobar + + + '%(Filename)%(Extension)')""> + + + + + + +"; + var xml = XmlReader.Create (new StringReader (project_xml)); + var root = ProjectRootElement.Create (xml); + root.FullPath = "ProjectInstanceTest.EvaluatePropertyWithQuotation.proj"; + var proj = new ProjectInstance (root); + proj.Build (); + var p = proj.GetProperty ("P"); + Assert.AreEqual ("xxx.txt", p.EvaluatedValue, "#1"); + var q = proj.GetProperty ("Q"); + Assert.AreEqual ("foobar|xxx.txt", q.EvaluatedValue, "#2"); + } } namespace SubNamespace -- 2.25.1