Browse Source

fix icon margin.

pull/285/head
Eusebiu Marcu 14 years ago
parent
commit
38b404a709
  1. 37
      ICSharpCode.Decompiler/Ast/TextOutputFormatter.cs
  2. 6
      ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs
  3. 2
      ICSharpCode.Decompiler/ITextOutput.cs
  4. 4
      ICSharpCode.Decompiler/PlainTextOutput.cs
  5. 143
      ILSpy/Bookmarks/MemberBookmark.cs
  6. 4
      ILSpy/Images/Images.cs
  7. 31
      ILSpy/TextView/AvalonEditTextOutput.cs
  8. 9
      ILSpy/TextView/DecompilerTextView.cs
  9. 36
      ILSpy/VB/VBTextOutputFormatter.cs

37
ICSharpCode.Decompiler/Ast/TextOutputFormatter.cs

@ -45,14 +45,20 @@ namespace ICSharpCode.Decompiler.Ast
public void WriteIdentifier(string identifier) public void WriteIdentifier(string identifier)
{ {
var definition = GetCurrentDefinition();
if (definition != null) {
output.WriteDefinition(identifier, definition);
return;
}
object memberRef = GetCurrentMemberReference(); object memberRef = GetCurrentMemberReference();
if (memberRef != null) { if (memberRef != null) {
output.WriteReference(identifier, memberRef, isIconMapping: IsIconMapping()); output.WriteReference(identifier, memberRef);
return; return;
} }
var definition = GetCurrentLocalDefinition(); definition = GetCurrentLocalDefinition();
if (definition != null) { if (definition != null) {
output.WriteDefinition(identifier, definition); output.WriteDefinition(identifier, definition);
return; return;
@ -136,6 +142,22 @@ namespace ICSharpCode.Decompiler.Ast
return null; return null;
} }
object GetCurrentDefinition()
{
if (nodeStack == null || nodeStack.Count == 0)
return null;
var node = nodeStack.Peek();
if (IsDefinition(node))
return node.Annotation<MemberReference>();
var fieldDef = node.Parent.Annotation<FieldDefinition>();
if (fieldDef != null)
return node.Parent.Annotation<MemberReference>();
return null;
}
public void WriteKeyword(string keyword) public void WriteKeyword(string keyword)
{ {
output.Write(keyword); output.Write(keyword);
@ -147,7 +169,7 @@ namespace ICSharpCode.Decompiler.Ast
MemberReference memberRef = GetCurrentMemberReference(); MemberReference memberRef = GetCurrentMemberReference();
var node = nodeStack.Peek(); var node = nodeStack.Peek();
if (memberRef != null && node.GetChildByRole(AstNode.Roles.Identifier).IsNull) if (memberRef != null && node.GetChildByRole(AstNode.Roles.Identifier).IsNull)
output.WriteReference(token, memberRef, isIconMapping: IsIconMapping()); output.WriteReference(token, memberRef);
else else
output.Write(token); output.Write(token);
} }
@ -288,18 +310,13 @@ namespace ICSharpCode.Decompiler.Ast
} }
} }
private bool IsIconMapping() private static bool IsDefinition(AstNode node)
{ {
if (nodeStack == null || nodeStack.Count == 0)
return false;
var node = nodeStack.Peek();
return return
node is FieldDeclaration || node is FieldDeclaration ||
node is ConstructorDeclaration || node is ConstructorDeclaration ||
node is EventDeclaration ||
node is DestructorDeclaration || node is DestructorDeclaration ||
node is EventDeclaration ||
node is DelegateDeclaration || node is DelegateDeclaration ||
node is OperatorDeclaration|| node is OperatorDeclaration||
node is MemberDeclaration || node is MemberDeclaration ||

6
ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs

@ -179,7 +179,6 @@ namespace ICSharpCode.Decompiler.Disassembler
output.Write(DisassemblerHelpers.Escape(method.Name + "$PST" + method.MetadataToken.ToInt32().ToString("X8"))); output.Write(DisassemblerHelpers.Escape(method.Name + "$PST" + method.MetadataToken.ToInt32().ToString("X8")));
} else { } else {
output.Write(DisassemblerHelpers.Escape(method.Name)); output.Write(DisassemblerHelpers.Escape(method.Name));
output.WriteReference(DisassemblerHelpers.Escape(method.Name), method, isIconMapping: true);
} }
WriteTypeParameters(output, method); WriteTypeParameters(output, method);
@ -675,7 +674,6 @@ namespace ICSharpCode.Decompiler.Disassembler
public void DisassembleField(FieldDefinition field) public void DisassembleField(FieldDefinition field)
{ {
output.WriteDefinition(".field ", field); output.WriteDefinition(".field ", field);
output.WriteReference(DisassemblerHelpers.Escape(field.Name), field, isIconMapping: true);
WriteEnum(field.Attributes & FieldAttributes.FieldAccessMask, fieldVisibility); WriteEnum(field.Attributes & FieldAttributes.FieldAccessMask, fieldVisibility);
const FieldAttributes hasXAttributes = FieldAttributes.HasDefault | FieldAttributes.HasFieldMarshal | FieldAttributes.HasFieldRVA; const FieldAttributes hasXAttributes = FieldAttributes.HasDefault | FieldAttributes.HasFieldMarshal | FieldAttributes.HasFieldRVA;
WriteFlags(field.Attributes & ~(FieldAttributes.FieldAccessMask | hasXAttributes), fieldAttributes); WriteFlags(field.Attributes & ~(FieldAttributes.FieldAccessMask | hasXAttributes), fieldAttributes);
@ -714,7 +712,6 @@ namespace ICSharpCode.Decompiler.Disassembler
currentMember = property; currentMember = property;
output.WriteDefinition(".property ", property); output.WriteDefinition(".property ", property);
output.WriteReference(DisassemblerHelpers.Escape(property.Name), property, isIconMapping: true);
WriteFlags(property.Attributes, propertyAttributes); WriteFlags(property.Attributes, propertyAttributes);
if (property.HasThis) if (property.HasThis)
output.Write("instance "); output.Write("instance ");
@ -747,7 +744,6 @@ namespace ICSharpCode.Decompiler.Disassembler
if (method == null) if (method == null)
return; return;
output.WriteReference(DisassemblerHelpers.Escape(method.Name), method, isIconMapping: true);
output.Write(keyword); output.Write(keyword);
output.Write(' '); output.Write(' ');
method.WriteTo(output); method.WriteTo(output);
@ -767,7 +763,6 @@ namespace ICSharpCode.Decompiler.Disassembler
currentMember = ev; currentMember = ev;
output.WriteDefinition(".event ", ev); output.WriteDefinition(".event ", ev);
output.WriteReference(DisassemblerHelpers.Escape(ev.Name), ev, isIconMapping: true);
WriteFlags(ev.Attributes, eventAttributes); WriteFlags(ev.Attributes, eventAttributes);
ev.EventType.WriteTo(output, ILNameSyntax.TypeName); ev.EventType.WriteTo(output, ILNameSyntax.TypeName);
output.Write(' '); output.Write(' ');
@ -822,7 +817,6 @@ namespace ICSharpCode.Decompiler.Disassembler
{ {
// start writing IL // start writing IL
output.WriteDefinition(".class ", type); output.WriteDefinition(".class ", type);
output.WriteReference(DisassemblerHelpers.Escape(type.Name), type, isIconMapping: true);
if ((type.Attributes & TypeAttributes.ClassSemanticMask) == TypeAttributes.Interface) if ((type.Attributes & TypeAttributes.ClassSemanticMask) == TypeAttributes.Interface)
output.Write("interface "); output.Write("interface ");

2
ICSharpCode.Decompiler/ITextOutput.cs

@ -33,7 +33,7 @@ namespace ICSharpCode.Decompiler
void Write(string text); void Write(string text);
void WriteLine(); void WriteLine();
void WriteDefinition(string text, object definition); void WriteDefinition(string text, object definition);
void WriteReference(string text, object reference, bool isLocal = false, bool isIconMapping = false); void WriteReference(string text, object reference, bool isLocal = false);
void AddDebuggerMemberMapping(MemberMapping memberMapping); void AddDebuggerMemberMapping(MemberMapping memberMapping);

4
ICSharpCode.Decompiler/PlainTextOutput.cs

@ -57,7 +57,7 @@ namespace ICSharpCode.Decompiler
public abstract void Write(string text); public abstract void Write(string text);
public abstract void WriteLine(); public abstract void WriteLine();
public abstract void WriteDefinition(string text, object definition); public abstract void WriteDefinition(string text, object definition);
public abstract void WriteReference(string text, object reference, bool isLocal, bool isIconMapping); public abstract void WriteReference(string text, object reference, bool isLocal);
public abstract void MarkFoldStart(string collapsedText, bool defaultCollapsed); public abstract void MarkFoldStart(string collapsedText, bool defaultCollapsed);
public abstract void MarkFoldEnd(); public abstract void MarkFoldEnd();
#endregion #endregion
@ -147,7 +147,7 @@ namespace ICSharpCode.Decompiler
Write(text); Write(text);
} }
public override void WriteReference(string text, object reference, bool isLocal, bool isIconMapping) public override void WriteReference(string text, object reference, bool isLocal)
{ {
Write(text); Write(text);
} }

143
ILSpy/Bookmarks/MemberBookmark.cs

@ -52,30 +52,22 @@ namespace ICSharpCode.ILSpy.Bookmarks
public virtual ImageSource Image { public virtual ImageSource Image {
get { get {
if (member is FieldDefinition) if (member is FieldDefinition)
return GetMemberOverlayedImage(member, MemberIcon.Field); return GetOverlayedImage(member as FieldDefinition, MemberIcon.Field);
if (member is PropertyDefinition) if (member is PropertyDefinition)
return GetMemberOverlayedImage(member, MemberIcon.Property); return GetOverlayedImage(member as PropertyDefinition, MemberIcon.Property);
if (member is EventDefinition) if (member is EventDefinition)
return GetMemberOverlayedImage(member, MemberIcon.Event); return GetOverlayedImage(member as EventDefinition, MemberIcon.Event);
return GetMemberOverlayedImage(member, MemberIcon.Method); if (member is MethodDefinition)
} return GetOverlayedImage(member as MethodDefinition, MemberIcon.Method);
}
ImageSource GetMemberOverlayedImage(MemberReference member, MemberIcon icon)
{
if (member is FieldDefinition)
return Images.GetIcon(icon, ((FieldDefinition)member).IsPublic ? AccessOverlayIcon.Public : AccessOverlayIcon.Private, false);
if (member is PropertyDefinition) if (member is TypeDefinition)
return Images.GetIcon(icon, AccessOverlayIcon.Public, false); return GetOverlayedImage(member as TypeDefinition);
if (member is EventDefinition)
return Images.GetIcon(icon, AccessOverlayIcon.Public, false);
return Images.GetIcon(icon, ((MethodDefinition)member).IsPublic ? AccessOverlayIcon.Public : AccessOverlayIcon.Private, false); return null;
}
} }
public int LineNumber { public int LineNumber {
@ -102,6 +94,105 @@ namespace ICSharpCode.ILSpy.Bookmarks
{ {
throw new NotSupportedException(); throw new NotSupportedException();
} }
#region Overlayed images
internal ImageSource GetOverlayedImage(TypeDefinition typeDef)
{
TypeIcon icon = TypeIcon.Class;
if (typeDef.IsEnum)
icon = TypeIcon.Enum;
if (typeDef.IsValueType)
icon = TypeIcon.Struct;
if (typeDef.IsInterface)
icon = TypeIcon.Interface;
if (typeDef.BaseType.FullName == "System.MulticastDelegate" || typeDef.BaseType.FullName == "System.Delegate")
icon = TypeIcon.Delegate;
bool isStatic = false;
AccessOverlayIcon overlayIcon = AccessOverlayIcon.Private;
if (typeDef.IsNestedPrivate)
overlayIcon = AccessOverlayIcon.Public;
else if (typeDef.IsNestedAssembly || typeDef.IsNestedFamilyAndAssembly || typeDef.IsNotPublic)
overlayIcon = AccessOverlayIcon.Internal;
else if (typeDef.IsNestedFamily)
overlayIcon = AccessOverlayIcon.Protected;
else if (typeDef.IsNestedFamilyOrAssembly)
overlayIcon = AccessOverlayIcon.ProtectedInternal;
else if (typeDef.IsPublic || typeDef.IsNestedPublic)
overlayIcon = AccessOverlayIcon.Public;
if (typeDef.IsAbstract && typeDef.IsSealed)
isStatic = true;
return Images.GetIcon(icon, overlayIcon, isStatic);
}
ImageSource GetOverlayedImage(FieldDefinition fieldDef, MemberIcon icon)
{
bool isStatic = false;
AccessOverlayIcon overlayIcon = AccessOverlayIcon.Public;
if (fieldDef.IsPrivate)
overlayIcon = AccessOverlayIcon.Private;
else if (fieldDef.IsAssembly || fieldDef.IsFamilyAndAssembly)
overlayIcon = AccessOverlayIcon.Internal;
else if (fieldDef.IsFamily)
overlayIcon = AccessOverlayIcon.Protected;
else if (fieldDef.IsFamilyOrAssembly)
overlayIcon = AccessOverlayIcon.ProtectedInternal;
else if (fieldDef.IsPublic)
overlayIcon = AccessOverlayIcon.Public;
if (fieldDef.IsStatic)
isStatic = true;
return Images.GetIcon(icon, overlayIcon, isStatic);
}
ImageSource GetOverlayedImage(MethodDefinition methodDef, MemberIcon icon)
{
bool isStatic = false;
AccessOverlayIcon overlayIcon = AccessOverlayIcon.Public;
if (methodDef == null)
return Images.GetIcon(icon, overlayIcon, isStatic);;
if (methodDef.IsPrivate)
overlayIcon = AccessOverlayIcon.Private;
else if (methodDef.IsAssembly || methodDef.IsFamilyAndAssembly)
overlayIcon = AccessOverlayIcon.Internal;
else if (methodDef.IsFamily)
overlayIcon = AccessOverlayIcon.Protected;
else if (methodDef.IsFamilyOrAssembly)
overlayIcon = AccessOverlayIcon.ProtectedInternal;
else if (methodDef.IsPublic)
overlayIcon = AccessOverlayIcon.Public;
if (methodDef.IsStatic)
isStatic = true;
return Images.GetIcon(icon, overlayIcon, isStatic);
}
ImageSource GetOverlayedImage(PropertyDefinition propDef, MemberIcon icon)
{
bool isStatic = false;
AccessOverlayIcon overlayIcon = AccessOverlayIcon.Public;
return Images.GetIcon(propDef.IsIndexer() ? MemberIcon.Indexer : icon, overlayIcon, isStatic);
}
ImageSource GetOverlayedImage(EventDefinition eventDef, MemberIcon icon)
{
bool isStatic = false;
AccessOverlayIcon overlayIcon = AccessOverlayIcon.Public;
return Images.GetIcon(icon, overlayIcon, isStatic);
}
#endregion
} }
public class TypeBookmark : MemberBookmark public class TypeBookmark : MemberBookmark
@ -113,27 +204,11 @@ namespace ICSharpCode.ILSpy.Bookmarks
public override ImageSource Image { public override ImageSource Image {
get { get {
if (Member is TypeDefinition) { if (Member is TypeDefinition) {
var type = Member as TypeDefinition; return GetOverlayedImage(Member as TypeDefinition);
if (type.IsEnum)
return GetTypeOverlayedImage(type, TypeIcon.Enum);
if (type.IsValueType)
return GetTypeOverlayedImage(type, TypeIcon.Struct);
if (type.IsInterface)
return GetTypeOverlayedImage(type, TypeIcon.Interface);
return GetTypeOverlayedImage(type, TypeIcon.Class);
} }
return null; return null;
} }
} }
ImageSource GetTypeOverlayedImage(TypeDefinition type, TypeIcon icon)
{
if (type.IsNotPublic)
return Images.GetIcon(icon, AccessOverlayIcon.Private);
return Images.GetIcon(icon, AccessOverlayIcon.Public);
}
} }
} }

4
ILSpy/Images/Images.cs

@ -117,10 +117,10 @@ namespace ICSharpCode.ILSpy
private static TypeIconCache typeIconCache = new TypeIconCache(); private static TypeIconCache typeIconCache = new TypeIconCache();
private static MemberIconCache memberIconCache = new MemberIconCache(); private static MemberIconCache memberIconCache = new MemberIconCache();
public static ImageSource GetIcon(TypeIcon icon, AccessOverlayIcon overlay) public static ImageSource GetIcon(TypeIcon icon, AccessOverlayIcon overlay, bool isStatic = false)
{ {
lock (typeIconCache) lock (typeIconCache)
return typeIconCache.GetIcon(icon, overlay, false); return typeIconCache.GetIcon(icon, overlay, isStatic);
} }
public static ImageSource GetIcon(MemberIcon icon, AccessOverlayIcon overlay, bool isStatic) public static ImageSource GetIcon(MemberIcon icon, AccessOverlayIcon overlay, bool isStatic)

31
ILSpy/TextView/AvalonEditTextOutput.cs

@ -47,7 +47,7 @@ namespace ICSharpCode.ILSpy.TextView
/// </summary> /// </summary>
sealed class DefinitionLookup sealed class DefinitionLookup
{ {
Dictionary<object, int> definitions = new Dictionary<object, int>(); internal Dictionary<object, int> definitions = new Dictionary<object, int>();
public int GetDefinitionPosition(object definition) public int GetDefinitionPosition(object definition)
{ {
@ -94,9 +94,6 @@ namespace ICSharpCode.ILSpy.TextView
/// <summary>Embedded UIElements, see <see cref="UIElementGenerator"/>.</summary> /// <summary>Embedded UIElements, see <see cref="UIElementGenerator"/>.</summary>
internal readonly List<KeyValuePair<int, Lazy<UIElement>>> UIElements = new List<KeyValuePair<int, Lazy<UIElement>>>(); internal readonly List<KeyValuePair<int, Lazy<UIElement>>> UIElements = new List<KeyValuePair<int, Lazy<UIElement>>>();
/// <summary> Icon mappings. </summary>
internal readonly Dictionary<MemberReference, int> IconMappings = new Dictionary<MemberReference, int>();
public AvalonEditTextOutput() public AvalonEditTextOutput()
{ {
} }
@ -217,17 +214,13 @@ namespace ICSharpCode.ILSpy.TextView
references.Add(new ReferenceSegment { StartOffset = start, EndOffset = end, Reference = definition, IsLocal = true, IsLocalTarget = true }); references.Add(new ReferenceSegment { StartOffset = start, EndOffset = end, Reference = definition, IsLocal = true, IsLocalTarget = true });
} }
public override void WriteReference(string text, object reference, bool isLocal, bool isIconMapping) public override void WriteReference(string text, object reference, bool isLocal)
{ {
WriteIndent(); WriteIndent();
int start = this.TextLength; int start = this.TextLength;
b.Append(text); b.Append(text);
int end = this.TextLength; int end = this.TextLength;
references.Add(new ReferenceSegment { StartOffset = start, EndOffset = end, Reference = reference, IsLocal = isLocal }); references.Add(new ReferenceSegment { StartOffset = start, EndOffset = end, Reference = reference, IsLocal = isLocal });
if (isIconMapping && reference is MemberReference && !this.IconMappings.ContainsKey((MemberReference)reference)) {
this.IconMappings.Add((MemberReference)reference, this.Location.Line);
}
} }
public override void MarkFoldStart(string collapsedText, bool defaultCollapsed) public override void MarkFoldStart(string collapsedText, bool defaultCollapsed)
@ -257,4 +250,24 @@ namespace ICSharpCode.ILSpy.TextView
} }
} }
} }
internal static class Extentions
{
public static Dictionary<MemberReference, int> ToDictionary(this DefinitionLookup definitions, Func<int, int> lineNumber)
{
if (definitions == null)
throw new ArgumentNullException("definitions");
var result = new Dictionary<MemberReference, int>();
foreach (var element in definitions.definitions) {
if (!(element.Key is MemberReference))
continue;
result.Add((MemberReference)element.Key, lineNumber(element.Value));
}
return result;
}
}
} }

9
ILSpy/TextView/DecompilerTextView.cs

@ -357,6 +357,12 @@ namespace ICSharpCode.ILSpy.TextView
foldingManager.UpdateFoldings(textOutput.Foldings.OrderBy(f => f.StartOffset), -1); foldingManager.UpdateFoldings(textOutput.Foldings.OrderBy(f => f.StartOffset), -1);
Debug.WriteLine(" Updating folding: {0}", w.Elapsed); w.Restart(); Debug.WriteLine(" Updating folding: {0}", w.Elapsed); w.Restart();
} }
// update class bookmarks
var document = textEditor.Document;
manager.UpdateClassMemberBookmarks(textOutput.DefinitionLookup.ToDictionary(line => document.GetLineByOffset(line).LineNumber),
typeof(TypeBookmark),
typeof(MemberBookmark));
} }
#endregion #endregion
@ -551,9 +557,6 @@ namespace ICSharpCode.ILSpy.TextView
var output = textOutput as AvalonEditTextOutput; var output = textOutput as AvalonEditTextOutput;
// update class bookmarks
manager.UpdateClassMemberBookmarks(output.IconMappings, typeof(TypeBookmark), typeof(MemberBookmark));
// update debug inforomation // update debug inforomation
DebugInformation.CodeMappings = output.CodeMappings; DebugInformation.CodeMappings = output.CodeMappings;
} }

36
ILSpy/VB/VBTextOutputFormatter.cs

@ -78,14 +78,19 @@ namespace ICSharpCode.ILSpy.VB
public void WriteIdentifier(string identifier) public void WriteIdentifier(string identifier)
{ {
object memberRef = GetCurrentMemberReference(); var definition = GetCurrentDefinition();
if (definition != null) {
output.WriteDefinition(identifier, definition);
return;
}
object memberRef = GetCurrentMemberReference();
if (memberRef != null) { if (memberRef != null) {
output.WriteReference(identifier, memberRef, isIconMapping: IsIconMapping()); output.WriteReference(identifier, memberRef);
return; return;
} }
var definition = GetCurrentLocalDefinition(); definition = GetCurrentLocalDefinition();
if (definition != null) { if (definition != null) {
output.WriteDefinition(identifier, definition); output.WriteDefinition(identifier, definition);
return; return;
@ -147,6 +152,22 @@ namespace ICSharpCode.ILSpy.VB
return null; return null;
} }
object GetCurrentDefinition()
{
if (nodeStack == null || nodeStack.Count == 0)
return null;
var node = nodeStack.Peek();
if (IsDefinition(node))
return node.Annotation<MemberReference>();
node = node.Parent;
if (IsDefinition(node))
return node.Annotation<MemberReference>();
return null;
}
public void WriteKeyword(string keyword) public void WriteKeyword(string keyword)
{ {
output.Write(keyword); output.Write(keyword);
@ -157,7 +178,7 @@ namespace ICSharpCode.ILSpy.VB
// Attach member reference to token only if there's no identifier in the current node. // Attach member reference to token only if there's no identifier in the current node.
MemberReference memberRef = GetCurrentMemberReference(); MemberReference memberRef = GetCurrentMemberReference();
if (memberRef != null && nodeStack.Peek().GetChildByRole(AstNode.Roles.Identifier).IsNull) if (memberRef != null && nodeStack.Peek().GetChildByRole(AstNode.Roles.Identifier).IsNull)
output.WriteReference(token, memberRef, isIconMapping: IsIconMapping()); output.WriteReference(token, memberRef);
else else
output.Write(token); output.Write(token);
} }
@ -201,13 +222,8 @@ namespace ICSharpCode.ILSpy.VB
output.MarkFoldEnd(); output.MarkFoldEnd();
} }
private bool IsIconMapping() private static bool IsDefinition(AstNode node)
{ {
if (nodeStack == null || nodeStack.Count == 0)
return false;
var node = nodeStack.Peek();
return return
node is FieldDeclaration || node is FieldDeclaration ||
node is ConstructorDeclaration || node is ConstructorDeclaration ||

Loading…
Cancel
Save