Browse Source

fix icon margin.

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

37
ICSharpCode.Decompiler/Ast/TextOutputFormatter.cs

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

8
ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs

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

2
ICSharpCode.Decompiler/ITextOutput.cs

@ -33,7 +33,7 @@ namespace ICSharpCode.Decompiler @@ -33,7 +33,7 @@ namespace ICSharpCode.Decompiler
void Write(string text);
void WriteLine();
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);

4
ICSharpCode.Decompiler/PlainTextOutput.cs

@ -57,7 +57,7 @@ namespace ICSharpCode.Decompiler @@ -57,7 +57,7 @@ namespace ICSharpCode.Decompiler
public abstract void Write(string text);
public abstract void WriteLine();
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 MarkFoldEnd();
#endregion
@ -147,7 +147,7 @@ namespace ICSharpCode.Decompiler @@ -147,7 +147,7 @@ namespace ICSharpCode.Decompiler
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);
}

145
ILSpy/Bookmarks/MemberBookmark.cs

@ -52,32 +52,24 @@ namespace ICSharpCode.ILSpy.Bookmarks @@ -52,32 +52,24 @@ namespace ICSharpCode.ILSpy.Bookmarks
public virtual ImageSource Image {
get {
if (member is FieldDefinition)
return GetMemberOverlayedImage(member, MemberIcon.Field);
return GetOverlayedImage(member as FieldDefinition, MemberIcon.Field);
if (member is PropertyDefinition)
return GetMemberOverlayedImage(member, MemberIcon.Property);
return GetOverlayedImage(member as PropertyDefinition, MemberIcon.Property);
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);
if (member is TypeDefinition)
return GetOverlayedImage(member as TypeDefinition);
return null;
}
}
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)
return Images.GetIcon(icon, AccessOverlayIcon.Public, false);
if (member is EventDefinition)
return Images.GetIcon(icon, AccessOverlayIcon.Public, false);
return Images.GetIcon(icon, ((MethodDefinition)member).IsPublic ? AccessOverlayIcon.Public : AccessOverlayIcon.Private, false);
}
public int LineNumber {
get; private set;
}
@ -102,6 +94,105 @@ namespace ICSharpCode.ILSpy.Bookmarks @@ -102,6 +94,105 @@ namespace ICSharpCode.ILSpy.Bookmarks
{
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
@ -113,27 +204,11 @@ namespace ICSharpCode.ILSpy.Bookmarks @@ -113,27 +204,11 @@ namespace ICSharpCode.ILSpy.Bookmarks
public override ImageSource Image {
get {
if (Member is TypeDefinition) {
var type = 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 GetOverlayedImage(Member as TypeDefinition);
}
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 @@ -117,10 +117,10 @@ namespace ICSharpCode.ILSpy
private static TypeIconCache typeIconCache = new TypeIconCache();
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)
return typeIconCache.GetIcon(icon, overlay, false);
return typeIconCache.GetIcon(icon, overlay, isStatic);
}
public static ImageSource GetIcon(MemberIcon icon, AccessOverlayIcon overlay, bool isStatic)

31
ILSpy/TextView/AvalonEditTextOutput.cs

@ -47,7 +47,7 @@ namespace ICSharpCode.ILSpy.TextView @@ -47,7 +47,7 @@ namespace ICSharpCode.ILSpy.TextView
/// </summary>
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)
{
@ -94,9 +94,6 @@ namespace ICSharpCode.ILSpy.TextView @@ -94,9 +94,6 @@ namespace ICSharpCode.ILSpy.TextView
/// <summary>Embedded UIElements, see <see cref="UIElementGenerator"/>.</summary>
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()
{
}
@ -217,17 +214,13 @@ namespace ICSharpCode.ILSpy.TextView @@ -217,17 +214,13 @@ namespace ICSharpCode.ILSpy.TextView
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();
int start = this.TextLength;
b.Append(text);
int end = this.TextLength;
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)
@ -257,4 +250,24 @@ namespace ICSharpCode.ILSpy.TextView @@ -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 @@ -357,6 +357,12 @@ namespace ICSharpCode.ILSpy.TextView
foldingManager.UpdateFoldings(textOutput.Foldings.OrderBy(f => f.StartOffset), -1);
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
@ -551,9 +557,6 @@ namespace ICSharpCode.ILSpy.TextView @@ -551,9 +557,6 @@ namespace ICSharpCode.ILSpy.TextView
var output = textOutput as AvalonEditTextOutput;
// update class bookmarks
manager.UpdateClassMemberBookmarks(output.IconMappings, typeof(TypeBookmark), typeof(MemberBookmark));
// update debug inforomation
DebugInformation.CodeMappings = output.CodeMappings;
}

38
ILSpy/VB/VBTextOutputFormatter.cs

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

Loading…
Cancel
Save