Browse Source

Show generic constraints in IL view. Closes #140.

pull/144/head
Daniel Grunwald 14 years ago
parent
commit
1e13e4a6fa
  1. 5
      ICSharpCode.Decompiler/Disassembler/DisassemblerHelpers.cs
  2. 38
      ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs

5
ICSharpCode.Decompiler/Disassembler/DisassemblerHelpers.cs

@ -126,7 +126,10 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -126,7 +126,10 @@ namespace ICSharpCode.Decompiler.Disassembler
writer.Write(string.Join(", ", at.Dimensions));
writer.Write(']');
} else if (type is GenericParameter) {
writer.WriteReference(type.Name, type);
writer.Write('!');
if (((GenericParameter)type).Owner.GenericParameterType == GenericParameterType.Method)
writer.Write('!');
writer.Write(type.Name);
} else if (type is ByReferenceType) {
((ByReferenceType)type).ElementType.WriteTo(writer, onlyName, shortName);
writer.Write('&');

38
ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs

@ -123,6 +123,7 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -123,6 +123,7 @@ namespace ICSharpCode.Decompiler.Disassembler
method.ReturnType.WriteTo(output);
output.Write(' ');
output.Write(DisassemblerHelpers.Escape(method.Name));
WriteTypeParameters(output, method);
//( params )
output.Write(" (");
@ -331,6 +332,7 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -331,6 +332,7 @@ namespace ICSharpCode.Decompiler.Disassembler
WriteFlags(type.Attributes & ~masks, typeAttributes);
output.Write(DisassemblerHelpers.Escape(type.Name));
WriteTypeParameters(output, type);
output.MarkFoldStart(defaultCollapsed: isInType);
output.WriteLine();
@ -416,6 +418,42 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -416,6 +418,42 @@ namespace ICSharpCode.Decompiler.Disassembler
CloseBlock("End of class " + type.FullName);
isInType = oldIsInType;
}
void WriteTypeParameters(ITextOutput output, IGenericParameterProvider p)
{
if (p.HasGenericParameters) {
output.Write('<');
for (int i = 0; i < p.GenericParameters.Count; i++) {
if (i > 0)
output.Write(", ");
GenericParameter gp = p.GenericParameters[i];
if (gp.HasReferenceTypeConstraint) {
output.Write("class ");
} else if (gp.HasNotNullableValueTypeConstraint) {
output.Write("valuetype ");
}
if (gp.HasConstraints) {
output.Write('(');
for (int j = 0; j < gp.Constraints.Count; j++) {
if (j > 0)
output.Write(", ");
gp.Constraints[j].WriteTo(output, true);
}
output.Write(") ");
}
if (gp.HasDefaultConstructorConstraint) {
output.Write(".ctor ");
}
if (gp.IsContravariant) {
output.Write('-');
} else if (gp.IsCovariant) {
output.Write('+');
}
output.Write(DisassemblerHelpers.Escape(gp.Name));
}
output.Write('>');
}
}
#endregion
#region Helper methods

Loading…
Cancel
Save