Browse Source

Improve tooltips and highlighting of local functions

pull/2077/head
Siegfried Pammer 5 years ago
parent
commit
67b2a45292
  1. 3
      ICSharpCode.Decompiler/CSharp/OutputVisitor/CSharpAmbience.cs
  2. 25
      ICSharpCode.Decompiler/Output/TextTokenWriter.cs
  3. 3
      ILSpy/Languages/CSharpLanguage.cs

3
ICSharpCode.Decompiler/CSharp/OutputVisitor/CSharpAmbience.cs

@ -24,6 +24,7 @@ using System.Linq;
using ICSharpCode.Decompiler.CSharp.Syntax; using ICSharpCode.Decompiler.CSharp.Syntax;
using ICSharpCode.Decompiler.Output; using ICSharpCode.Decompiler.Output;
using ICSharpCode.Decompiler.TypeSystem; using ICSharpCode.Decompiler.TypeSystem;
using ICSharpCode.Decompiler.TypeSystem.Implementation;
namespace ICSharpCode.Decompiler.CSharp.OutputVisitor namespace ICSharpCode.Decompiler.CSharp.OutputVisitor
{ {
@ -103,7 +104,7 @@ namespace ICSharpCode.Decompiler.CSharp.OutputVisitor
if (symbol is ITypeDefinition) if (symbol is ITypeDefinition)
WriteTypeDeclarationName((ITypeDefinition)symbol, writer, formattingPolicy); WriteTypeDeclarationName((ITypeDefinition)symbol, writer, formattingPolicy);
else if (symbol is IMember) else if (symbol is IMember && !(symbol is LocalFunctionMethod))
WriteMemberDeclarationName((IMember)symbol, writer, formattingPolicy); WriteMemberDeclarationName((IMember)symbol, writer, formattingPolicy);
else else
writer.WriteIdentifier(Identifier.Create(symbol.Name)); writer.WriteIdentifier(Identifier.Create(symbol.Name));

25
ICSharpCode.Decompiler/Output/TextTokenWriter.cs

@ -19,6 +19,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using ICSharpCode.Decompiler.CSharp; using ICSharpCode.Decompiler.CSharp;
using ICSharpCode.Decompiler.CSharp.OutputVisitor; using ICSharpCode.Decompiler.CSharp.OutputVisitor;
using ICSharpCode.Decompiler.CSharp.Resolver; using ICSharpCode.Decompiler.CSharp.Resolver;
@ -26,6 +27,7 @@ using ICSharpCode.Decompiler.CSharp.Syntax;
using ICSharpCode.Decompiler.IL; using ICSharpCode.Decompiler.IL;
using ICSharpCode.Decompiler.Semantics; using ICSharpCode.Decompiler.Semantics;
using ICSharpCode.Decompiler.TypeSystem; using ICSharpCode.Decompiler.TypeSystem;
using ICSharpCode.Decompiler.TypeSystem.Implementation;
namespace ICSharpCode.Decompiler namespace ICSharpCode.Decompiler
{ {
@ -110,6 +112,7 @@ namespace ICSharpCode.Decompiler
if (symbol != null && node.Role == Roles.Type && node.Parent is ObjectCreateExpression) { if (symbol != null && node.Role == Roles.Type && node.Parent is ObjectCreateExpression) {
symbol = node.Parent.GetSymbol(); symbol = node.Parent.GetSymbol();
} }
if (node is IdentifierExpression && node.Role == Roles.TargetExpression && node.Parent is InvocationExpression && symbol is IMember member) { if (node is IdentifierExpression && node.Role == Roles.TargetExpression && node.Parent is InvocationExpression && symbol is IMember member) {
var declaringType = member.DeclaringType; var declaringType = member.DeclaringType;
if (declaringType != null && declaringType.Kind == TypeKind.Delegate) if (declaringType != null && declaringType.Kind == TypeKind.Delegate)
@ -123,10 +126,8 @@ namespace ICSharpCode.Decompiler
if (symbol == null) if (symbol == null)
return null; return null;
//if (settings.AutomaticEvents && member is FieldDefinition) { if (symbol is LocalFunctionMethod)
// var field = (FieldDefinition)member; return null;
// return field.DeclaringType.Events.FirstOrDefault(ev => ev.Name == field.Name) ?? member;
//}
return symbol; return symbol;
} }
@ -142,14 +143,18 @@ namespace ICSharpCode.Decompiler
if (letClauseVariable != null) if (letClauseVariable != null)
return letClauseVariable; return letClauseVariable;
var gotoStatement = node as GotoStatement; if (node is GotoStatement gotoStatement) {
if (gotoStatement != null)
{
var method = nodeStack.Select(nd => nd.GetSymbol() as IMethod).FirstOrDefault(mr => mr != null); var method = nodeStack.Select(nd => nd.GetSymbol() as IMethod).FirstOrDefault(mr => mr != null);
if (method != null) if (method != null)
return method + gotoStatement.Label; return method + gotoStatement.Label;
} }
if (node.Role == Roles.TargetExpression && node.Parent is InvocationExpression) {
var symbol = node.Parent.GetSymbol();
if (symbol is LocalFunctionMethod)
return symbol;
}
return null; return null;
} }
@ -177,8 +182,8 @@ namespace ICSharpCode.Decompiler
return method + label.Label; return method + label.Label;
} }
if (node is LocalFunctionDeclarationStatement) { if (node is MethodDeclaration && node.Parent is LocalFunctionDeclarationStatement) {
var localFunction = node.GetResolveResult() as MemberResolveResult; var localFunction = node.Parent.GetResolveResult() as MemberResolveResult;
if (localFunction != null) if (localFunction != null)
return localFunction.Member; return localFunction.Member;
} }
@ -404,7 +409,7 @@ namespace ICSharpCode.Decompiler
public static bool IsDefinition(ref AstNode node) public static bool IsDefinition(ref AstNode node)
{ {
if (node is EntityDeclaration) if (node is EntityDeclaration && !(node.Parent is LocalFunctionDeclarationStatement))
return true; return true;
if (node is VariableInitializer && node.Parent is FieldDeclaration) { if (node is VariableInitializer && node.Parent is FieldDeclaration) {
node = node.Parent; node = node.Parent;

3
ILSpy/Languages/CSharpLanguage.cs

@ -648,6 +648,9 @@ namespace ICSharpCode.ILSpy
if (!settings.LiftNullables) { if (!settings.LiftNullables) {
flags &= ~ConversionFlags.UseNullableSpecifierForValueTypes; flags &= ~ConversionFlags.UseNullableSpecifierForValueTypes;
} }
if (entity is IMethod m && m.IsLocalFunction) {
writer.WriteIdentifier(Identifier.Create("(local)"));
}
new CSharpAmbience() { new CSharpAmbience() {
ConversionFlags = flags, ConversionFlags = flags,
}.ConvertSymbol(entity, writer, settings.CSharpFormattingOptions); }.ConvertSymbol(entity, writer, settings.CSharpFormattingOptions);

Loading…
Cancel
Save