Browse Source

Restore parameter lists of parameterized properties in signatures

The main tree, tooltips, and search results once showed the parameter
list of a parameterized property; the ambience lost that when property
rendering went through the converted AST node, whose C# property syntax
cannot carry parameters. Take the parameter list from the symbol
instead and render it in parentheses (matching VB.NET usage syntax and
distinguishing these properties from indexers).

Assisted-by: Claude:claude-fable-5:Claude Code
pull/3925/head
Siegfried Pammer 2 months ago committed by Siegfried Pammer
parent
commit
7865f9b23e
  1. 19
      ICSharpCode.Decompiler.Tests/Output/CSharpAmbienceTests.cs
  2. 7
      ICSharpCode.Decompiler/CSharp/OutputVisitor/CSharpAmbience.cs

19
ICSharpCode.Decompiler.Tests/Output/CSharpAmbienceTests.cs

@ -374,6 +374,25 @@ namespace ICSharpCode.Decompiler.Tests.Output
ambience.ConversionFlags = ConversionFlags.All & ~(ConversionFlags.ShowBody | ConversionFlags.PlaceReturnTypeAfterParameterList); ambience.ConversionFlags = ConversionFlags.All & ~(ConversionFlags.ShowBody | ConversionFlags.PlaceReturnTypeAfterParameterList);
Assert.That(ambience.ConvertSymbol(indexer), Is.EqualTo("public dynamic dynamic.this[int]")); Assert.That(ambience.ConvertSymbol(indexer), Is.EqualTo("public dynamic dynamic.this[int]"));
} }
[Test]
public void ParameterizedProperty()
{
// A named property with parameters (VB.NET parameterized property); C# has no
// syntax for it, but signature surfaces show the parameter list in parentheses.
var property = new FakeProperty(compilation) {
Name = "Data",
ReturnType = compilation.FindType(KnownTypeCode.Int32),
DeclaringType = SpecialType.Dynamic,
Parameters = new IParameter[] { new DefaultParameter(compilation.FindType(KnownTypeCode.Int32), "index") },
};
ambience.ConversionFlags = ILSpyMainTreeViewMemberFlags;
Assert.That(ambience.ConvertSymbol(property), Is.EqualTo("Data(int) : int"));
ambience.ConversionFlags = ConversionFlags.All & ~(ConversionFlags.ShowBody | ConversionFlags.PlaceReturnTypeAfterParameterList);
Assert.That(ambience.ConvertSymbol(property), Is.EqualTo("public int dynamic.Data(int index)"));
}
#endregion #endregion
#region Test types #region Test types

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

@ -148,6 +148,12 @@ namespace ICSharpCode.Decompiler.CSharp.OutputVisitor
var subst = new TypeParameterSubstitution(extensionGroup.TypeParameters, null); var subst = new TypeParameterSubstitution(extensionGroup.TypeParameters, null);
parameters = extensionGroup.Marker.Specialize(subst).Parameters.Select(p => astBuilder.ConvertParameter(p)); parameters = extensionGroup.Marker.Specialize(subst).Parameters.Select(p => astBuilder.ConvertParameter(p));
} }
else if (symbol is IProperty { SymbolKind: SymbolKind.Property } parameterizedProperty)
{
// C# property syntax has no parameter list, so the converted node carries
// none; parameterized properties take theirs from the symbol.
parameters = parameterizedProperty.Parameters.Select(p => astBuilder.ConvertParameter(p));
}
else else
{ {
parameters = node.GetChildren(Slots.Parameter); parameters = node.GetChildren(Slots.Parameter);
@ -256,6 +262,7 @@ namespace ICSharpCode.Decompiler.CSharp.OutputVisitor
case SymbolKind.Operator: case SymbolKind.Operator:
case SymbolKind.Constructor: case SymbolKind.Constructor:
case SymbolKind.Destructor: case SymbolKind.Destructor:
case SymbolKind.Property when ((IProperty)e).Parameters.Count > 0:
return (ConversionFlags & ConversionFlags.ShowParameterList) != 0; return (ConversionFlags & ConversionFlags.ShowParameterList) != 0;
default: default:
return false; return false;

Loading…
Cancel
Save