diff --git a/ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs b/ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs index 22add1049..b2fffc0a7 100644 --- a/ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs +++ b/ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs @@ -193,6 +193,20 @@ namespace ICSharpCode.Decompiler.CSharp typeDecl.Members.Add(memberDecl); } } + if (typeDecl.Members.OfType().Any(idx => idx.PrivateImplementationType.IsNull)) { + // Remove the [DefaultMember] attribute if the class contains indexers + foreach (AttributeSection section in typeDecl.Attributes) { + foreach (var attr in section.Attributes) { + var tr = attr.Type.GetResolveResult().Type; + if (tr.Name == "DefaultMemberAttribute" && tr.Namespace == "System.Reflection") { + attr.Remove(); + } + } + if (section.Attributes.Count == 0) + section.Remove(); + } + } + return typeDecl; } diff --git a/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs b/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs index fe8df8578..af70d4d38 100644 --- a/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs +++ b/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs @@ -410,9 +410,11 @@ namespace ICSharpCode.Decompiler.CSharp { var func = (LdFtn)inst.Arguments[1]; var target = TranslateTarget(func.Method, inst.Arguments[0], func.OpCode == OpCode.LdFtn); - return new MemberReferenceExpression(target, func.Method.Name) + return new ObjectCreateExpression(ConvertType(inst.Method.DeclaringType), new MemberReferenceExpression(target, func.Method.Name)) .WithILInstruction(inst) - .WithRR(new MemberResolveResult(target.ResolveResult, func.Method)); + .WithRR(new ConversionResolveResult(func.Method.DeclaringType, + new MemberResolveResult(target.ResolveResult, func.Method), + Conversion.MethodGroupConversion(func.Method, func.OpCode == OpCode.LdVirtFtn, false))); // TODO handle extension methods capturing the first argument } TranslatedExpression TranslateTarget(IMember member, ILInstruction target, bool nonVirtualInvocation) diff --git a/ICSharpCode.Decompiler/Tests/ILTransforms/InliningTests.cs b/ICSharpCode.Decompiler/Tests/ILTransforms/InliningTests.cs index 9f688beea..6461e0f5e 100644 --- a/ICSharpCode.Decompiler/Tests/ILTransforms/InliningTests.cs +++ b/ICSharpCode.Decompiler/Tests/ILTransforms/InliningTests.cs @@ -93,7 +93,7 @@ namespace ICSharpCode.Decompiler.Tests.ILTransforms ); } - [Test] + [Test, Ignore("Inline blocks are currently disabled")] public void BuildInlineBlock() { var f = MakeFunction( diff --git a/ICSharpCode.Decompiler/Tests/TestCases/Switch.cs b/ICSharpCode.Decompiler/Tests/TestCases/Switch.cs index 14907cd8f..1e88a9639 100644 --- a/ICSharpCode.Decompiler/Tests/TestCases/Switch.cs +++ b/ICSharpCode.Decompiler/Tests/TestCases/Switch.cs @@ -22,8 +22,11 @@ public static class Switch { public static void Main() { - string[] args = { "First case", "Else" }; - TestCase(ShortSwitchOverString, args); + TestCase(ShortSwitchOverString, "First case", "Else"); + TestCase(SwitchOverString1, "First case", "Second case", "2nd case", "Third case", "Fourth case", "Fifth case", "Sixth case", null, "default", "else"); + Console.WriteLine(SwitchOverString2()); + Console.WriteLine(SwitchOverBool(true)); + Console.WriteLine(SwitchOverBool(false)); } static void TestCase(Func target, params string[] args)