Browse Source

#1359: Escape non-printable characters in IL view.

pull/1413/head
Siegfried Pammer 8 years ago
parent
commit
cee0a78d07
  1. 62
      ILSpy/Languages/Language.cs
  2. 5
      ILSpy/TreeNodes/AssemblyTreeNode.cs

62
ILSpy/Languages/Language.cs

@ -225,7 +225,7 @@ namespace ICSharpCode.ILSpy
public override IType VisitTypeParameter(ITypeParameter type) public override IType VisitTypeParameter(ITypeParameter type)
{ {
base.VisitTypeParameter(type); base.VisitTypeParameter(type);
builder.Append(type.Name); EscapeName(builder, type.Name);
return type; return type;
} }
@ -257,9 +257,9 @@ namespace ICSharpCode.ILSpy
private void WriteType(IType type) private void WriteType(IType type)
{ {
if (includeNamespace) if (includeNamespace)
builder.Append(type.FullName); EscapeName(builder, type.FullName);
else else
builder.Append(type.Name); EscapeName(builder, type.Name);
if (type.TypeParameterCount > 0) { if (type.TypeParameterCount > 0) {
builder.Append('`'); builder.Append('`');
builder.Append(type.TypeParameterCount); builder.Append(type.TypeParameterCount);
@ -361,7 +361,7 @@ namespace ICSharpCode.ILSpy
throw new ArgumentNullException(nameof(method)); throw new ArgumentNullException(nameof(method));
int i = 0; int i = 0;
var buffer = new System.Text.StringBuilder(); var buffer = new StringBuilder();
buffer.Append(GetDisplayName(method, includeDeclaringTypeName, includeNamespace, includeNamespaceOfDeclaringTypeName)); buffer.Append(GetDisplayName(method, includeDeclaringTypeName, includeNamespace, includeNamespaceOfDeclaringTypeName));
var typeParameters = method.TypeParameters; var typeParameters = method.TypeParameters;
if (typeParameters.Count > 0) { if (typeParameters.Count > 0) {
@ -398,7 +398,7 @@ namespace ICSharpCode.ILSpy
{ {
if (@event == null) if (@event == null)
throw new ArgumentNullException(nameof(@event)); throw new ArgumentNullException(nameof(@event));
var buffer = new System.Text.StringBuilder(); var buffer = new StringBuilder();
buffer.Append(GetDisplayName(@event, includeDeclaringTypeName, includeNamespace, includeNamespaceOfDeclaringTypeName)); buffer.Append(GetDisplayName(@event, includeDeclaringTypeName, includeNamespace, includeNamespaceOfDeclaringTypeName));
buffer.Append(" : "); buffer.Append(" : ");
buffer.Append(TypeToString(@event.ReturnType, includeNamespace)); buffer.Append(TypeToString(@event.ReturnType, includeNamespace));
@ -410,15 +410,15 @@ namespace ICSharpCode.ILSpy
if (includeDeclaringTypeName && entity.DeclaringTypeDefinition != null) { if (includeDeclaringTypeName && entity.DeclaringTypeDefinition != null) {
string name; string name;
if (includeNamespaceOfDeclaringTypeName) { if (includeNamespaceOfDeclaringTypeName) {
name = entity.DeclaringTypeDefinition.FullName; name = EscapeName(entity.DeclaringTypeDefinition.FullName);
} else { } else {
name = entity.DeclaringTypeDefinition.Name; name = EscapeName(entity.DeclaringTypeDefinition.Name);
} }
return name + "." + entity.Name; return name + "." + EscapeName(entity.Name);
} else { } else {
if (includeNamespace) if (includeNamespace)
return entity.FullName; return EscapeName(entity.FullName);
return entity.Name; return EscapeName(entity.Name);
} }
} }
@ -444,15 +444,15 @@ namespace ICSharpCode.ILSpy
switch (handle.Kind) { switch (handle.Kind) {
case HandleKind.TypeDefinition: case HandleKind.TypeDefinition:
if (fullName) if (fullName)
return ((TypeDefinitionHandle)handle).GetFullTypeName(metadata).ToILNameString(); return EscapeName(((TypeDefinitionHandle)handle).GetFullTypeName(metadata).ToILNameString());
var td = metadata.GetTypeDefinition((TypeDefinitionHandle)handle); var td = metadata.GetTypeDefinition((TypeDefinitionHandle)handle);
return metadata.GetString(td.Name); return EscapeName(metadata.GetString(td.Name));
case HandleKind.FieldDefinition: case HandleKind.FieldDefinition:
var fd = metadata.GetFieldDefinition((FieldDefinitionHandle)handle); var fd = metadata.GetFieldDefinition((FieldDefinitionHandle)handle);
var declaringType = fd.GetDeclaringType(); var declaringType = fd.GetDeclaringType();
if (fullName) if (fullName)
return fd.GetDeclaringType().GetFullTypeName(metadata).ToILNameString() + "." + metadata.GetString(fd.Name); return EscapeName(fd.GetDeclaringType().GetFullTypeName(metadata).ToILNameString() + "." + metadata.GetString(fd.Name));
return metadata.GetString(fd.Name); return EscapeName(metadata.GetString(fd.Name));
case HandleKind.MethodDefinition: case HandleKind.MethodDefinition:
var md = metadata.GetMethodDefinition((MethodDefinitionHandle)handle); var md = metadata.GetMethodDefinition((MethodDefinitionHandle)handle);
declaringType = md.GetDeclaringType(); declaringType = md.GetDeclaringType();
@ -461,20 +461,20 @@ namespace ICSharpCode.ILSpy
if (genericParamCount > 0) if (genericParamCount > 0)
methodName += "``" + genericParamCount; methodName += "``" + genericParamCount;
if (fullName) if (fullName)
return md.GetDeclaringType().GetFullTypeName(metadata).ToILNameString() + "." + methodName; return EscapeName(md.GetDeclaringType().GetFullTypeName(metadata).ToILNameString() + "." + methodName);
return methodName; return EscapeName(methodName);
case HandleKind.EventDefinition: case HandleKind.EventDefinition:
var ed = metadata.GetEventDefinition((EventDefinitionHandle)handle); var ed = metadata.GetEventDefinition((EventDefinitionHandle)handle);
declaringType = metadata.GetMethodDefinition(ed.GetAccessors().GetAny()).GetDeclaringType(); declaringType = metadata.GetMethodDefinition(ed.GetAccessors().GetAny()).GetDeclaringType();
if (fullName) if (fullName)
return declaringType.GetFullTypeName(metadata).ToILNameString() + "." + metadata.GetString(ed.Name); return EscapeName(declaringType.GetFullTypeName(metadata).ToILNameString() + "." + metadata.GetString(ed.Name));
return metadata.GetString(ed.Name); return EscapeName(metadata.GetString(ed.Name));
case HandleKind.PropertyDefinition: case HandleKind.PropertyDefinition:
var pd = metadata.GetPropertyDefinition((PropertyDefinitionHandle)handle); var pd = metadata.GetPropertyDefinition((PropertyDefinitionHandle)handle);
declaringType = metadata.GetMethodDefinition(pd.GetAccessors().GetAny()).GetDeclaringType(); declaringType = metadata.GetMethodDefinition(pd.GetAccessors().GetAny()).GetDeclaringType();
if (fullName) if (fullName)
return declaringType.GetFullTypeName(metadata).ToILNameString() + "." + metadata.GetString(pd.Name); return EscapeName(declaringType.GetFullTypeName(metadata).ToILNameString() + "." + metadata.GetString(pd.Name));
return metadata.GetString(pd.Name); return EscapeName(metadata.GetString(pd.Name));
default: default:
return null; return null;
} }
@ -521,5 +521,27 @@ namespace ICSharpCode.ILSpy
{ {
return module.Metadata.MetadataVersion; return module.Metadata.MetadataVersion;
} }
/// <summary>
/// Escape characters that cannot be displayed in the UI.
/// </summary>
public static StringBuilder EscapeName(StringBuilder sb, string name)
{
foreach (char ch in name) {
if (char.IsWhiteSpace(ch) || char.IsControl(ch))
sb.AppendFormat("\\u{0:x4}", (int)ch);
else
sb.Append(ch);
}
return sb;
}
/// <summary>
/// Escape characters that cannot be displayed in the UI.
/// </summary>
public static string EscapeName(string name)
{
return EscapeName(new StringBuilder(name.Length), name).ToString();
}
} }
} }

5
ILSpy/TreeNodes/AssemblyTreeNode.cs

@ -150,9 +150,10 @@ namespace ICSharpCode.ILSpy.TreeNodes
ns.Children.Clear(); ns.Children.Clear();
} }
foreach (var type in assembly.TopLevelTypeDefinitions.OrderBy(t => t.ReflectionName, NaturalStringComparer.Instance)) { foreach (var type in assembly.TopLevelTypeDefinitions.OrderBy(t => t.ReflectionName, NaturalStringComparer.Instance)) {
var escapedNamespace = Language.EscapeName(type.Namespace);
if (!namespaces.TryGetValue(type.Namespace, out NamespaceTreeNode ns)) { if (!namespaces.TryGetValue(type.Namespace, out NamespaceTreeNode ns)) {
ns = new NamespaceTreeNode(type.Namespace); ns = new NamespaceTreeNode(escapedNamespace);
namespaces[type.Namespace] = ns; namespaces.Add(type.Namespace, ns);
} }
TypeTreeNode node = new TypeTreeNode(type, this); TypeTreeNode node = new TypeTreeNode(type, this);
typeDict[(TypeDefinitionHandle)type.MetadataToken] = node; typeDict[(TypeDefinitionHandle)type.MetadataToken] = node;

Loading…
Cancel
Save