diff --git a/src/AddIns/DisplayBindings/ILSpyAddIn/ILSpyParser.cs b/src/AddIns/DisplayBindings/ILSpyAddIn/ILSpyParser.cs index 12d74a23aa..de246b0a27 100644 --- a/src/AddIns/DisplayBindings/ILSpyAddIn/ILSpyParser.cs +++ b/src/AddIns/DisplayBindings/ILSpyAddIn/ILSpyParser.cs @@ -20,6 +20,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Reflection; +using System.Text; using System.Threading; using ICSharpCode.Core; using ICSharpCode.NRefactory; @@ -82,7 +83,32 @@ namespace ICSharpCode.ILSpyAddIn public ResolveResult ResolveSnippet(ParseInformation parseInfo, TextLocation location, string codeSnippet, ICompilation compilation, CancellationToken cancellationToken) { - return null; + var decompiledParseInfo = parseInfo as ILSpyFullParseInformation; + if (decompiledParseInfo == null) + throw new ArgumentException("ParseInfo does not have SyntaxTree"); + CSharpAstResolver contextResolver = new CSharpAstResolver(compilation, decompiledParseInfo.SyntaxTree, null); + var node = decompiledParseInfo.SyntaxTree.GetNodeAt(location); + CSharpResolver context; + if (node != null) + context = contextResolver.GetResolverStateAfter(node, cancellationToken); + else + context = new CSharpResolver(compilation); + CSharpParser parser = new CSharpParser(); + var expr = parser.ParseExpression(codeSnippet); + if (parser.HasErrors) + return new ErrorResolveResult(SpecialType.UnknownType, PrintErrorsAsString(parser.Errors), TextLocation.Empty); + CSharpAstResolver snippetResolver = new CSharpAstResolver(context, expr); + return snippetResolver.Resolve(expr, cancellationToken); + } + + string PrintErrorsAsString(IEnumerable errors) + { + StringBuilder builder = new StringBuilder(); + + foreach (var error in errors) + builder.AppendLine(error.Message); + + return builder.ToString(); } public void FindLocalReferences(ParseInformation parseInfo, ITextSource fileContent, IVariable variable, ICompilation compilation, Action callback, CancellationToken cancellationToken) diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/OutputVisitor/InsertMissingTokensDecorator.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/OutputVisitor/InsertMissingTokensDecorator.cs index 4f390d92dc..3f92001457 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/OutputVisitor/InsertMissingTokensDecorator.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/OutputVisitor/InsertMissingTokensDecorator.cs @@ -61,6 +61,7 @@ namespace ICSharpCode.NRefactory.CSharp public override void WriteToken(Role role, string token) { CSharpTokenNode t = new CSharpTokenNode(locationProvider.Location, (TokenRole)role); + t.Role = role; EmptyStatement node = nodes.Peek().LastOrDefault() as EmptyStatement; if (node == null) currentList.Add(t);