Browse Source

Apply suggestions from Claude code review

pull/3680/head
Siegfried Pammer 3 weeks ago
parent
commit
ade13f848e
  1. 2
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/ExtensionEverything.cs
  2. 8
      ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs
  3. 4
      ICSharpCode.Decompiler/TypeSystem/ExtensionInfo.cs
  4. 4
      ICSharpCode.Decompiler/TypeSystem/TypeSystemExtensions.cs
  5. 9
      ILSpy/TreeNodes/ExtensionTreeNode.cs
  6. 2
      ILSpy/TreeNodes/PropertyTreeNode.cs
  7. 2
      ILSpy/TreeNodes/TypeTreeNode.cs

2
ICSharpCode.Decompiler.Tests/TestCases/Pretty/ExtensionEverything.cs

@ -90,12 +90,14 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty @@ -90,12 +90,14 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty
Point point = new Point(3, 4);
Console.WriteLine(point.X);
Console.WriteLine(point.Y);
// TODO implement use-site transformation
//Console.WriteLine(point.Magnitude);
}
public static void TestExtensionMethods()
{
List<string> collection = new List<string>();
// TODO implement use-site transformation
//Console.WriteLine(collection.IsEmpty);
collection.AddIfNotNull("Hello");
collection.AddIfNotNull(null);

8
ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs

@ -955,8 +955,12 @@ namespace ICSharpCode.Decompiler.CSharp @@ -955,8 +955,12 @@ namespace ICSharpCode.Decompiler.CSharp
foreach (var h in methods)
{
var m = metadata.GetMethodDefinition(h);
if (metadata.StringComparer.Equals(m.Name, name))
return h;
if (!metadata.StringComparer.Equals(m.Name, name))
continue;
// TODO : use SignatureBlobComparer to ensure that the correct method is resolved
return h;
}
return default;
}

4
ICSharpCode.Decompiler/TypeSystem/ExtensionInfo.cs

@ -260,9 +260,11 @@ namespace ICSharpCode.Decompiler.TypeSystem @@ -260,9 +260,11 @@ namespace ICSharpCode.Decompiler.TypeSystem
IEnumerable<IMember> GetMembers()
{
var markerType = marker.DeclaringTypeDefinition;
Debug.Assert(markerType != null, "Marker should always be contained in a type");
foreach (var info in extensionMemberMap.Values)
{
if (!markerType!.Equals(info.ExtensionMarkerType))
if (!markerType.Equals(info.ExtensionMarkerType))
continue;
var subst = new TypeParameterSubstitution(info.ExtensionGroupingTypeParameters, null);
if (info.ExtensionMember.IsAccessor)

4
ICSharpCode.Decompiler/TypeSystem/TypeSystemExtensions.cs

@ -18,6 +18,7 @@ @@ -18,6 +18,7 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection.Metadata;
@ -878,7 +879,8 @@ namespace ICSharpCode.Decompiler.TypeSystem @@ -878,7 +879,8 @@ namespace ICSharpCode.Decompiler.TypeSystem
{
throw new ArgumentNullException(nameof(member));
}
var td = member.DeclaringTypeDefinition!;
var td = member.DeclaringTypeDefinition;
Debug.Assert(td != null, "IMember.DeclaringTypeDefinition should never be null");
return td.DeclaringTypeDefinition?.ExtensionInfo ?? td.DeclaringTypeDefinition?.DeclaringTypeDefinition?.ExtensionInfo;
}
}

9
ILSpy/TreeNodes/ExtensionTreeNode.cs

@ -61,19 +61,20 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -61,19 +61,20 @@ namespace ICSharpCode.ILSpy.TreeNodes
return ((MetadataModule)ParentAssemblyNode.LoadedAssembly
.GetMetadataFileOrNull()
?.GetTypeSystemWithCurrentOptionsOrNull(SettingsService, AssemblyTreeModel.CurrentLanguageVersion)
?.MainModule)?.GetDefinition((SRM.TypeDefinitionHandle)MarkerMethod.DeclaringTypeDefinition.MetadataToken);
?.MainModule)?.GetDefinition((SRM.TypeDefinitionHandle)MarkerMethod.DeclaringTypeDefinition.MetadataToken)
?? MarkerMethod.DeclaringTypeDefinition;
}
protected override void LoadChildren()
{
var extensionInfo = ContainerTypeDefinition.ExtensionInfo;
var subst = new TypeParameterSubstitution(TypeParameters, null);
var members = extensionInfo.GetMembersOfGroup(MarkerMethod).ToList();
foreach (var property in extensionInfo.GetMembersOfGroup(MarkerMethod).OfType<IProperty>().OrderBy(p => p.Name, NaturalStringComparer.Instance))
foreach (var property in members.OfType<IProperty>().OrderBy(p => p.Name, NaturalStringComparer.Instance))
{
this.Children.Add(new PropertyTreeNode(property));
}
foreach (var method in extensionInfo.GetMembersOfGroup(MarkerMethod).OfType<IMethod>().OrderBy(m => m.Name, NaturalStringComparer.Instance))
foreach (var method in members.OfType<IMethod>().OrderBy(m => m.Name, NaturalStringComparer.Instance))
{
if (method.MetadataToken.IsNil)
continue;

2
ILSpy/TreeNodes/PropertyTreeNode.cs

@ -17,6 +17,7 @@ @@ -17,6 +17,7 @@
// DEALINGS IN THE SOFTWARE.
using System;
using System.Diagnostics;
using System.Reflection.Metadata;
using System.Windows.Media;
@ -69,6 +70,7 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -69,6 +70,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
public static ImageSource GetIcon(IProperty property)
{
IMethod accessor = property.Getter ?? property.Setter;
Debug.Assert(accessor != null, "Property must have at least one accessor");
bool isExtension = property.ResolveExtensionInfo()?.InfoOfExtensionMember((IMethod)accessor.MemberDefinition) != null;
return Images.GetIcon(property.IsIndexer ? MemberIcon.Indexer : MemberIcon.Property,
Images.GetOverlayIcon(property.Accessibility), property.IsStatic, isExtension);

2
ILSpy/TreeNodes/TypeTreeNode.cs

@ -97,7 +97,7 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -97,7 +97,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
var extensionInfo = TypeDefinition.ExtensionInfo;
if (extensionInfo != null)
{
foreach (var extensionGroup in TypeDefinition.ExtensionInfo?.ExtensionGroups ?? [])
foreach (var extensionGroup in extensionInfo.ExtensionGroups)
{
this.Children.Add(new ExtensionTreeNode(TypeDefinition, extensionGroup, ParentAssemblyNode));
}

Loading…
Cancel
Save