string Resolve (DebuggerSession session, SourceLocation location, string expression, bool tryTypeOf) { expression = expression.TrimStart (); if (expression.Length > 0 && expression[0] == '?') return "?" + Resolve (session, location, expression.Substring (1).Trim ()); if (expression.StartsWith ("var", StringComparison.Ordinal) && char.IsWhiteSpace (expression[3])) return "var " + Resolve (session, location, expression.Substring (4).Trim (' ', '\t')); expression = ReplaceExceptionTag (expression, session.Options.EvaluationOptions.CurrentExceptionTag); Expression expr = new CSharpParser ().ParseExpression (expression); if (expr == null) return expression; var resolver = new NRefactoryExpressionResolverVisitor (session, location, expression); expr.AcceptVisitor (resolver); string resolved = resolver.GetResolvedExpression (); if (resolved == expression && !tryTypeOf && (expr is BinaryOperatorExpression) && IsTypeName (expression)) { // This is a hack to be able to parse expressions such as "List<string>". The NRefactory parser // can parse a single type name, so a solution is to wrap it around a typeof(). We do it if // the evaluation fails. string res = Resolve (session, location, "typeof(" + expression + ")", true); return res.Substring (7, res.Length - 8); } return resolved; }