Some parser error message got source string for Condition evaluation.
authorAtsushi Eno <atsushieno@veritas-vos-liberabit.com>
Mon, 2 Dec 2013 10:05:12 +0000 (19:05 +0900)
committerAtsushi Eno <atsushieno@veritas-vos-liberabit.com>
Mon, 2 Dec 2013 10:05:12 +0000 (19:05 +0900)
mcs/class/Microsoft.Build/Microsoft.Build.Exceptions/InvalidProjectFileException.cs
mcs/class/Microsoft.Build/Microsoft.Build.Execution/ProjectInstance.cs
mcs/class/Microsoft.Build/Microsoft.Build.Internal/ExpressionConstructs.cs
mcs/class/Microsoft.Build/Microsoft.Build.Internal/ExpressionEvaluator.cs
mcs/class/Microsoft.Build/Microsoft.Build.Internal/ExpressionTokenizer.cs
mcs/class/Microsoft.Build/Test/Microsoft.Build.Execution/BuildSubmissionTest.cs

index 756ed779914ecc9eea7d0cf03ae722fa5ab3e0d4..ad05ff6403aaba80fa678ed715858e2235d06d1a 100644 (file)
@@ -61,7 +61,7 @@ namespace Microsoft.Build.Exceptions
                 }
                 internal InvalidProjectFileException (ILocation start, string message,
                                                       string errorSubcategory = null, string errorCode = null, string helpKeyword = null)
-                        : this (null, 0, start != null ? start.Column : 0, 0, 0, message, errorSubcategory, errorCode, helpKeyword)
+                        : this (start != null ? start.File : null, 0, start != null ? start.Column : 0, 0, 0, message, errorSubcategory, errorCode, helpKeyword)
                 {
                 }
                 internal InvalidProjectFileException (ElementLocation start, ElementLocation end, string message,
index 5edaa5007c7d33f7cf14274ae0b640be588f562d..36158b14b3a165d68692f9addceed504a459ea8b 100644 (file)
@@ -385,7 +385,7 @@ namespace Microsoft.Build.Execution
 
                public bool Build (string[] targets, IEnumerable<ILogger> loggers, out IDictionary<string, TargetResult> targetOutputs)
                {
-                               return Build (targets, loggers, new ForwardingLoggerRecord [0], out targetOutputs);
+                       return Build (targets, loggers, new ForwardingLoggerRecord [0], out targetOutputs);
                }
 
                public bool Build (string[] targets, IEnumerable<ILogger> loggers, IEnumerable<ForwardingLoggerRecord> remoteLoggers, out IDictionary<string, TargetResult> targetOutputs)
index 40777fe52d9253f29e9debe590bd6423f334686a..358f58e925c8f7c15fcb27ce724029223c865c08 100644 (file)
@@ -58,9 +58,9 @@ namespace Microsoft.Build.Internal.Expressions
                public int Column {
                        get { return list.Count == 0 ? 0 : list [0].Column; }
                }
-               //public string File {
-               //      get { return list.Count == 0 ? null : list [0].File; }
-               //}
+               public string File {
+                       get { return list.Count == 0 ? null : list [0].File; }
+               }
                public string ToLocationString ()
                {
                        return list.Count == 0 ? null : list [0].Location.ToLocationString ();
@@ -99,9 +99,9 @@ namespace Microsoft.Build.Internal.Expressions
                public int Column {
                        get { return Location.Column; }
                }
-               //public string File {
-               //      get { return Location.File; }
-               //}
+               public string File {
+                       get { return Location.File; }
+               }
                public string ToLocationString ()
                {
                        return Location.ToLocationString ();
index f91a9cfbb759524465dfe9acbd52eda063981720..4aa9b259f2d24133b5b5a922cf13322a0636d0c5 100644 (file)
@@ -65,9 +65,9 @@ namespace Microsoft.Build.Internal.Expressions
                        */
                }
                
-               EvaluationContext CreateContext ()
+               EvaluationContext CreateContext (string source)
                {
-                       return new EvaluationContext (this);
+                       return new EvaluationContext (source, this);
                }
                
                public Project Project { get; private set; }
@@ -91,7 +91,7 @@ namespace Microsoft.Build.Internal.Expressions
                {
                        if (exprList == null)
                                throw new ArgumentNullException ("exprList");
-                       return string.Concat (exprList.Select (e => e.EvaluateAsString (CreateContext ())));
+                       return string.Concat (exprList.Select (e => e.EvaluateAsString (CreateContext (source))));
                }
                
                public bool EvaluateAsBoolean (string source)
@@ -100,7 +100,7 @@ namespace Microsoft.Build.Internal.Expressions
                                var el = new ExpressionParser ().Parse (source, ExpressionValidationType.StrictBoolean);
                                if (el.Count () != 1)
                                        throw new InvalidProjectFileException ("Unexpected number of tokens: " + el.Count ());
-                               return el.First ().EvaluateAsBoolean (CreateContext ());
+                               return el.First ().EvaluateAsBoolean (CreateContext (source));
                        } catch (yyParser.yyException ex) {
                                throw new InvalidProjectFileException (string.Format ("failed to evaluate expression as boolean: '{0}': {1}", source, ex.Message), ex);
                        }
@@ -109,10 +109,13 @@ namespace Microsoft.Build.Internal.Expressions
        
        class EvaluationContext
        {
-               public EvaluationContext (ExpressionEvaluator evaluator)
+               public EvaluationContext (string source, ExpressionEvaluator evaluator)
                {
+                       Source = source;
                        Evaluator = evaluator;
                }
+
+               public string Source { get; private set; }
                
                public ExpressionEvaluator Evaluator { get; private set; }
                public object ContextItem { get; set; }
@@ -187,7 +190,7 @@ namespace Microsoft.Build.Internal.Expressions
                public abstract bool EvaluateAsBoolean (EvaluationContext context);
                public abstract object EvaluateAsObject (EvaluationContext context);
                
-               public bool EvaluateStringAsBoolean (string ret)
+               public bool EvaluateStringAsBoolean (EvaluationContext context, string ret)
                {
                        if (ret != null) {
                                if (ret.Equals ("TRUE", StringComparison.InvariantCultureIgnoreCase))
@@ -195,7 +198,7 @@ namespace Microsoft.Build.Internal.Expressions
                                else if (ret.Equals ("FALSE", StringComparison.InvariantCultureIgnoreCase))
                                        return false;
                        }
-                       throw new InvalidProjectFileException (this.Location, null, string.Format ("String is evaluated as '{0}' and cannot be converted to boolean", ret));
+                       throw new InvalidProjectFileException (this.Location, string.Format ("Condition '{0}' is evaluated as '{1}' and cannot be converted to boolean", context.Source, ret));
                }
        }
        
@@ -298,7 +301,7 @@ namespace Microsoft.Build.Internal.Expressions
                public override bool EvaluateAsBoolean (EvaluationContext context)
                {
                        var ret = EvaluateAsString (context);
-                       return EvaluateStringAsBoolean (ret);
+                       return EvaluateStringAsBoolean (context, ret);
                }
                
                public override string EvaluateAsString (EvaluationContext context)
@@ -395,7 +398,7 @@ namespace Microsoft.Build.Internal.Expressions
        {
                public override bool EvaluateAsBoolean (EvaluationContext context)
                {
-                       return EvaluateStringAsBoolean (EvaluateAsString (context));
+                       return EvaluateStringAsBoolean (context, EvaluateAsString (context));
                }
                
                public override string EvaluateAsString (EvaluationContext context)
@@ -425,7 +428,7 @@ namespace Microsoft.Build.Internal.Expressions
        {
                public override bool EvaluateAsBoolean (EvaluationContext context)
                {
-                       return EvaluateStringAsBoolean (EvaluateAsString (context));
+                       return EvaluateStringAsBoolean (context, EvaluateAsString (context));
                }
                
                public override string EvaluateAsString (EvaluationContext context)
@@ -454,7 +457,7 @@ namespace Microsoft.Build.Internal.Expressions
                public override bool EvaluateAsBoolean (EvaluationContext context)
                {
                        var ret = EvaluateAsString (context);
-                       return EvaluateStringAsBoolean (ret);
+                       return EvaluateStringAsBoolean (context, ret);
                }
                
                public override string EvaluateAsString (EvaluationContext context)
@@ -498,7 +501,7 @@ namespace Microsoft.Build.Internal.Expressions
                                if (Arguments.Count != 1)
                                        throw new InvalidProjectFileException (Location, "Function 'Exists' expects 1 argument");
                                string val = Arguments.First ().EvaluateAsString (context);
-                               return Directory.Exists (val) || File.Exists (val);
+                               return Directory.Exists (val) || System.IO.File.Exists (val);
                        }
                        if (string.Equals (Name.Name, "HasTrailingSlash", StringComparison.OrdinalIgnoreCase)) {
                                if (Arguments.Count != 1)
index 3ebbc4b89faabb0ad5e65d0deb5710da01ef82a6..9760ad2acbd18d0b665f0a515035681a237c289d 100644 (file)
@@ -290,7 +290,7 @@ namespace Microsoft.Build.Internal.Expressions
        {
                //int Line { get; }
                int Column { get; }
-               //string File { get; }
+               string File { get; }
                
                string ToLocationString ();
        }
@@ -299,7 +299,7 @@ namespace Microsoft.Build.Internal.Expressions
        {
                //public int Line { get; set; }
                public int Column { get; set; }
-               //public string File { get; set; }
+               public string File { get; set; }
                
                public string ToLocationString ()
                {
index 4d12f94db3914bc8b99c07611a6d18e369727e59..df2febcbf75b022557252ede8e20b5280d6c4681 100644 (file)
@@ -72,8 +72,9 @@ namespace MonoTests.Microsoft.Build.Execution
             var root = ProjectRootElement.Create (xml);
                        root.FullPath = "BuildSubmissionTest.TaskOutputsToLoggers.proj";
             var proj = new ProjectInstance (root);
+                       Assert.AreEqual ("$(X)", root.Targets.First ().ItemGroups.First ().Items.First ().Condition, "#0");
                        var sw = new StringWriter ();
-                       Assert.IsFalse (proj.Build (new ILogger [] {new ConsoleLogger (default (LoggerVerbosity), msg => sw.Write (msg), null, null)}), "#1");
+                       Assert.IsFalse (proj.Build (new ILogger [] {new ConsoleLogger (LoggerVerbosity.Diagnostic, sw.WriteLine, null, null)}), "#1");
                        Assert.IsTrue (sw.ToString ().Contains ("$(X)"), "#2");
                }