Browse Source

Fix redundant qualifiers in method group expressions.

pull/1108/head
Siegfried Pammer 8 years ago
parent
commit
75527071ab
  1. 5
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/QualifierTests.cs
  2. 52
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/QualifierTests.il
  3. 46
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/QualifierTests.opt.il
  4. 42
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/QualifierTests.opt.roslyn.il
  5. 48
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/QualifierTests.roslyn.il
  6. 11
      ICSharpCode.Decompiler/CSharp/CallBuilder.cs
  7. 13
      ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs

5
ICSharpCode.Decompiler.Tests/TestCases/Pretty/QualifierTests.cs

@ -37,9 +37,8 @@ namespace ICSharpCode.Decompiler.Tests.Pretty
private void Parameter(QualifierTests test) private void Parameter(QualifierTests test)
{ {
// TODO : fix this Delegate(Parameter);
//Delegate(Parameter); Delegate(StaticParameter);
//Delegate(StaticParameter);
Delegate(test.Parameter); Delegate(test.Parameter);
Delegate(QualifierTests.StaticParameter); Delegate(QualifierTests.StaticParameter);
} }

52
ICSharpCode.Decompiler.Tests/TestCases/Pretty/QualifierTests.il

@ -15,7 +15,7 @@
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4.. .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
.ver 4:0:0:0 .ver 4:0:0:0
} }
.assembly pmidbhuu .assembly zgfoqdfc
{ {
.custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78 // ....T..WrapNonEx .custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78 // ....T..WrapNonEx
63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 ) // ceptionThrows. 63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 ) // ceptionThrows.
@ -26,15 +26,15 @@
.hash algorithm 0x00008004 .hash algorithm 0x00008004
.ver 0:0:0:0 .ver 0:0:0:0
} }
.module pmidbhuu.dll .module zgfoqdfc.dll
// MVID: {29FFF9F6-E3AF-492E-8C7A-9BA99576954E} // MVID: {1C0110BE-438D-48BD-8A01-FFE7CCD962C7}
.custom instance void [mscorlib]System.Security.UnverifiableCodeAttribute::.ctor() = ( 01 00 00 00 ) .custom instance void [mscorlib]System.Security.UnverifiableCodeAttribute::.ctor() = ( 01 00 00 00 )
.imagebase 0x10000000 .imagebase 0x10000000
.file alignment 0x00000200 .file alignment 0x00000200
.stackreserve 0x00100000 .stackreserve 0x00100000
.subsystem 0x0003 // WINDOWS_CUI .subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00000001 // ILONLY .corflags 0x00000001 // ILONLY
// Image base: 0x030F0000 // Image base: 0x00810000
// =============== CLASS MEMBERS DECLARATION =================== // =============== CLASS MEMBERS DECLARATION ===================
@ -100,24 +100,40 @@
.method private hidebysig instance void .method private hidebysig instance void
Parameter(class ICSharpCode.Decompiler.Tests.Pretty.QualifierTests test) cil managed Parameter(class ICSharpCode.Decompiler.Tests.Pretty.QualifierTests test) cil managed
{ {
// Code size 40 (0x28) // Code size 88 (0x58)
.maxstack 8 .maxstack 3
IL_0000: nop IL_0000: nop
IL_0001: ldarg.0 IL_0001: ldarg.0
IL_0002: ldarg.1 IL_0002: ldarg.0
IL_0003: ldftn instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests::Parameter(object) IL_0003: ldobj ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test
IL_0009: newobj instance void class [mscorlib]System.Action`1<object>::.ctor(object, IL_0008: box ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test
IL_000d: ldftn instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Parameter(object)
IL_0013: newobj instance void class [mscorlib]System.Action`1<object>::.ctor(object,
native int) native int)
IL_000e: call instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Delegate(class [mscorlib]System.Action`1<object>) IL_0018: call instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Delegate(class [mscorlib]System.Action`1<object>)
IL_0013: nop IL_001d: nop
IL_0014: ldarg.0 IL_001e: ldarg.0
IL_0015: ldnull IL_001f: ldnull
IL_0016: ldftn void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests::StaticParameter(object) IL_0020: ldftn void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::StaticParameter(object)
IL_001c: newobj instance void class [mscorlib]System.Action`1<object>::.ctor(object, IL_0026: newobj instance void class [mscorlib]System.Action`1<object>::.ctor(object,
native int) native int)
IL_0021: call instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Delegate(class [mscorlib]System.Action`1<object>) IL_002b: call instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Delegate(class [mscorlib]System.Action`1<object>)
IL_0026: nop IL_0030: nop
IL_0027: ret IL_0031: ldarg.0
IL_0032: ldarg.1
IL_0033: ldftn instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests::Parameter(object)
IL_0039: newobj instance void class [mscorlib]System.Action`1<object>::.ctor(object,
native int)
IL_003e: call instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Delegate(class [mscorlib]System.Action`1<object>)
IL_0043: nop
IL_0044: ldarg.0
IL_0045: ldnull
IL_0046: ldftn void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests::StaticParameter(object)
IL_004c: newobj instance void class [mscorlib]System.Action`1<object>::.ctor(object,
native int)
IL_0051: call instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Delegate(class [mscorlib]System.Action`1<object>)
IL_0056: nop
IL_0057: ret
} // end of method Test::Parameter } // end of method Test::Parameter
.method private hidebysig static void .method private hidebysig static void

46
ICSharpCode.Decompiler.Tests/TestCases/Pretty/QualifierTests.opt.il

@ -15,7 +15,7 @@
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4.. .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
.ver 4:0:0:0 .ver 4:0:0:0
} }
.assembly '011f0dbt' .assembly a2ezv3zo
{ {
.custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78 // ....T..WrapNonEx .custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78 // ....T..WrapNonEx
63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 ) // ceptionThrows. 63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 ) // ceptionThrows.
@ -26,15 +26,15 @@
.hash algorithm 0x00008004 .hash algorithm 0x00008004
.ver 0:0:0:0 .ver 0:0:0:0
} }
.module '011f0dbt.dll' .module a2ezv3zo.dll
// MVID: {EB97E647-5276-4D71-871C-EC7FC2A37905} // MVID: {7C524CF6-1164-4EF8-B967-C3D2C3C0FCC5}
.custom instance void [mscorlib]System.Security.UnverifiableCodeAttribute::.ctor() = ( 01 00 00 00 ) .custom instance void [mscorlib]System.Security.UnverifiableCodeAttribute::.ctor() = ( 01 00 00 00 )
.imagebase 0x10000000 .imagebase 0x10000000
.file alignment 0x00000200 .file alignment 0x00000200
.stackreserve 0x00100000 .stackreserve 0x00100000
.subsystem 0x0003 // WINDOWS_CUI .subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00000001 // ILONLY .corflags 0x00000001 // ILONLY
// Image base: 0x00DD0000 // Image base: 0x030E0000
// =============== CLASS MEMBERS DECLARATION =================== // =============== CLASS MEMBERS DECLARATION ===================
@ -91,21 +91,35 @@
.method private hidebysig instance void .method private hidebysig instance void
Parameter(class ICSharpCode.Decompiler.Tests.Pretty.QualifierTests test) cil managed Parameter(class ICSharpCode.Decompiler.Tests.Pretty.QualifierTests test) cil managed
{ {
// Code size 37 (0x25) // Code size 83 (0x53)
.maxstack 8 .maxstack 3
IL_0000: ldarg.0 IL_0000: ldarg.0
IL_0001: ldarg.1 IL_0001: ldarg.0
IL_0002: ldftn instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests::Parameter(object) IL_0002: ldobj ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test
IL_0008: newobj instance void class [mscorlib]System.Action`1<object>::.ctor(object, IL_0007: box ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test
IL_000c: ldftn instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Parameter(object)
IL_0012: newobj instance void class [mscorlib]System.Action`1<object>::.ctor(object,
native int) native int)
IL_000d: call instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Delegate(class [mscorlib]System.Action`1<object>) IL_0017: call instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Delegate(class [mscorlib]System.Action`1<object>)
IL_0012: ldarg.0 IL_001c: ldarg.0
IL_0013: ldnull IL_001d: ldnull
IL_0014: ldftn void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests::StaticParameter(object) IL_001e: ldftn void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::StaticParameter(object)
IL_001a: newobj instance void class [mscorlib]System.Action`1<object>::.ctor(object, IL_0024: newobj instance void class [mscorlib]System.Action`1<object>::.ctor(object,
native int) native int)
IL_001f: call instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Delegate(class [mscorlib]System.Action`1<object>) IL_0029: call instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Delegate(class [mscorlib]System.Action`1<object>)
IL_0024: ret IL_002e: ldarg.0
IL_002f: ldarg.1
IL_0030: ldftn instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests::Parameter(object)
IL_0036: newobj instance void class [mscorlib]System.Action`1<object>::.ctor(object,
native int)
IL_003b: call instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Delegate(class [mscorlib]System.Action`1<object>)
IL_0040: ldarg.0
IL_0041: ldnull
IL_0042: ldftn void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests::StaticParameter(object)
IL_0048: newobj instance void class [mscorlib]System.Action`1<object>::.ctor(object,
native int)
IL_004d: call instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Delegate(class [mscorlib]System.Action`1<object>)
IL_0052: ret
} // end of method Test::Parameter } // end of method Test::Parameter
.method private hidebysig static void .method private hidebysig static void

42
ICSharpCode.Decompiler.Tests/TestCases/Pretty/QualifierTests.opt.roslyn.il

@ -31,14 +31,14 @@
.ver 0:0:0:0 .ver 0:0:0:0
} }
.module QualifierTests.dll .module QualifierTests.dll
// MVID: {7AC69EDD-DA5A-4332-98FC-F0C038BF00B0} // MVID: {F6C4EDC3-2993-44D3-B98B-4D6A567BA56B}
.custom instance void [mscorlib]System.Security.UnverifiableCodeAttribute::.ctor() = ( 01 00 00 00 ) .custom instance void [mscorlib]System.Security.UnverifiableCodeAttribute::.ctor() = ( 01 00 00 00 )
.imagebase 0x10000000 .imagebase 0x10000000
.file alignment 0x00000200 .file alignment 0x00000200
.stackreserve 0x00100000 .stackreserve 0x00100000
.subsystem 0x0003 // WINDOWS_CUI .subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00000001 // ILONLY .corflags 0x00000001 // ILONLY
// Image base: 0x04D00000 // Image base: 0x03340000
// =============== CLASS MEMBERS DECLARATION =================== // =============== CLASS MEMBERS DECLARATION ===================
@ -95,21 +95,35 @@
.method private hidebysig instance void .method private hidebysig instance void
Parameter(class ICSharpCode.Decompiler.Tests.Pretty.QualifierTests test) cil managed Parameter(class ICSharpCode.Decompiler.Tests.Pretty.QualifierTests test) cil managed
{ {
// Code size 37 (0x25) // Code size 83 (0x53)
.maxstack 8 .maxstack 3
IL_0000: ldarg.0 IL_0000: ldarg.0
IL_0001: ldarg.1 IL_0001: ldarg.0
IL_0002: ldftn instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests::Parameter(object) IL_0002: ldobj ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test
IL_0008: newobj instance void class [mscorlib]System.Action`1<object>::.ctor(object, IL_0007: box ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test
IL_000c: ldftn instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Parameter(object)
IL_0012: newobj instance void class [mscorlib]System.Action`1<object>::.ctor(object,
native int) native int)
IL_000d: call instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Delegate(class [mscorlib]System.Action`1<object>) IL_0017: call instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Delegate(class [mscorlib]System.Action`1<object>)
IL_0012: ldarg.0 IL_001c: ldarg.0
IL_0013: ldnull IL_001d: ldnull
IL_0014: ldftn void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests::StaticParameter(object) IL_001e: ldftn void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::StaticParameter(object)
IL_001a: newobj instance void class [mscorlib]System.Action`1<object>::.ctor(object, IL_0024: newobj instance void class [mscorlib]System.Action`1<object>::.ctor(object,
native int) native int)
IL_001f: call instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Delegate(class [mscorlib]System.Action`1<object>) IL_0029: call instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Delegate(class [mscorlib]System.Action`1<object>)
IL_0024: ret IL_002e: ldarg.0
IL_002f: ldarg.1
IL_0030: ldftn instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests::Parameter(object)
IL_0036: newobj instance void class [mscorlib]System.Action`1<object>::.ctor(object,
native int)
IL_003b: call instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Delegate(class [mscorlib]System.Action`1<object>)
IL_0040: ldarg.0
IL_0041: ldnull
IL_0042: ldftn void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests::StaticParameter(object)
IL_0048: newobj instance void class [mscorlib]System.Action`1<object>::.ctor(object,
native int)
IL_004d: call instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Delegate(class [mscorlib]System.Action`1<object>)
IL_0052: ret
} // end of method Test::Parameter } // end of method Test::Parameter
.method private hidebysig static void .method private hidebysig static void

48
ICSharpCode.Decompiler.Tests/TestCases/Pretty/QualifierTests.roslyn.il

@ -31,14 +31,14 @@
.ver 0:0:0:0 .ver 0:0:0:0
} }
.module QualifierTests.dll .module QualifierTests.dll
// MVID: {9E09B16E-E984-4C3B-B21E-D42961F40D2B} // MVID: {048902E1-6822-4B3D-87FF-4599505D8CC6}
.custom instance void [mscorlib]System.Security.UnverifiableCodeAttribute::.ctor() = ( 01 00 00 00 ) .custom instance void [mscorlib]System.Security.UnverifiableCodeAttribute::.ctor() = ( 01 00 00 00 )
.imagebase 0x10000000 .imagebase 0x10000000
.file alignment 0x00000200 .file alignment 0x00000200
.stackreserve 0x00100000 .stackreserve 0x00100000
.subsystem 0x0003 // WINDOWS_CUI .subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00000001 // ILONLY .corflags 0x00000001 // ILONLY
// Image base: 0x030D0000 // Image base: 0x03990000
// =============== CLASS MEMBERS DECLARATION =================== // =============== CLASS MEMBERS DECLARATION ===================
@ -104,24 +104,40 @@
.method private hidebysig instance void .method private hidebysig instance void
Parameter(class ICSharpCode.Decompiler.Tests.Pretty.QualifierTests test) cil managed Parameter(class ICSharpCode.Decompiler.Tests.Pretty.QualifierTests test) cil managed
{ {
// Code size 40 (0x28) // Code size 88 (0x58)
.maxstack 8 .maxstack 3
IL_0000: nop IL_0000: nop
IL_0001: ldarg.0 IL_0001: ldarg.0
IL_0002: ldarg.1 IL_0002: ldarg.0
IL_0003: ldftn instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests::Parameter(object) IL_0003: ldobj ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test
IL_0009: newobj instance void class [mscorlib]System.Action`1<object>::.ctor(object, IL_0008: box ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test
IL_000d: ldftn instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Parameter(object)
IL_0013: newobj instance void class [mscorlib]System.Action`1<object>::.ctor(object,
native int) native int)
IL_000e: call instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Delegate(class [mscorlib]System.Action`1<object>) IL_0018: call instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Delegate(class [mscorlib]System.Action`1<object>)
IL_0013: nop IL_001d: nop
IL_0014: ldarg.0 IL_001e: ldarg.0
IL_0015: ldnull IL_001f: ldnull
IL_0016: ldftn void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests::StaticParameter(object) IL_0020: ldftn void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::StaticParameter(object)
IL_001c: newobj instance void class [mscorlib]System.Action`1<object>::.ctor(object, IL_0026: newobj instance void class [mscorlib]System.Action`1<object>::.ctor(object,
native int) native int)
IL_0021: call instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Delegate(class [mscorlib]System.Action`1<object>) IL_002b: call instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Delegate(class [mscorlib]System.Action`1<object>)
IL_0026: nop IL_0030: nop
IL_0027: ret IL_0031: ldarg.0
IL_0032: ldarg.1
IL_0033: ldftn instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests::Parameter(object)
IL_0039: newobj instance void class [mscorlib]System.Action`1<object>::.ctor(object,
native int)
IL_003e: call instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Delegate(class [mscorlib]System.Action`1<object>)
IL_0043: nop
IL_0044: ldarg.0
IL_0045: ldnull
IL_0046: ldftn void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests::StaticParameter(object)
IL_004c: newobj instance void class [mscorlib]System.Action`1<object>::.ctor(object,
native int)
IL_0051: call instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Delegate(class [mscorlib]System.Action`1<object>)
IL_0056: nop
IL_0057: ret
} // end of method Test::Parameter } // end of method Test::Parameter
.method private hidebysig static void .method private hidebysig static void

11
ICSharpCode.Decompiler/CSharp/CallBuilder.cs

@ -509,10 +509,12 @@ namespace ICSharpCode.Decompiler.CSharp
if (method.IsExtensionMethod && invokeMethod != null && method.Parameters.Count - 1 == invokeMethod.Parameters.Count) { if (method.IsExtensionMethod && invokeMethod != null && method.Parameters.Count - 1 == invokeMethod.Parameters.Count) {
targetType = method.Parameters[0].Type; targetType = method.Parameters[0].Type;
target = expressionBuilder.Translate(inst.Arguments[0], targetType); target = expressionBuilder.Translate(inst.Arguments[0], targetType);
target = ExpressionBuilder.UnwrapBoxingConversion(target);
requireTarget = true; requireTarget = true;
} else { } else {
targetType = method.DeclaringType; targetType = method.DeclaringType;
target = expressionBuilder.TranslateTarget(method, inst.Arguments[0], func.OpCode == OpCode.LdFtn); target = expressionBuilder.TranslateTarget(method, inst.Arguments[0], func.OpCode == OpCode.LdFtn);
target = ExpressionBuilder.UnwrapBoxingConversion(target);
requireTarget = expressionBuilder.HidesVariableWithName(method.Name) requireTarget = expressionBuilder.HidesVariableWithName(method.Name)
|| (method.IsStatic ? !expressionBuilder.IsCurrentOrContainingType(method.DeclaringTypeDefinition) : !(target.Expression is ThisReferenceExpression)); || (method.IsStatic ? !expressionBuilder.IsCurrentOrContainingType(method.DeclaringTypeDefinition) : !(target.Expression is ThisReferenceExpression));
} }
@ -521,14 +523,19 @@ namespace ICSharpCode.Decompiler.CSharp
}; };
bool needsCast = false; bool needsCast = false;
ResolveResult result = null; ResolveResult result = null;
var or = new OverloadResolution(resolver.Compilation, method.Parameters.SelectArray(p => new TypeResolveResult(p.Type)));
if (!requireTarget) { if (!requireTarget) {
result = resolver.ResolveSimpleName(method.Name, method.TypeArguments, isInvocationTarget: false); result = resolver.ResolveSimpleName(method.Name, method.TypeArguments, isInvocationTarget: false);
requireTarget = (!(result is MethodGroupResolveResult mgrr) || mgrr.IsError || !mgrr.Methods.Any() || mgrr.Methods.Skip(1).Any() || !IsAppropriateCallTarget(expectedTargetDetails, method, mgrr.Methods.First())); if (result is MethodGroupResolveResult mgrr) {
or.AddMethodLists(mgrr.MethodsGroupedByDeclaringType.ToArray());
requireTarget = (or.BestCandidateErrors != OverloadResolutionErrors.None || !IsAppropriateCallTarget(expectedTargetDetails, method, or.BestCandidate));
} else {
requireTarget = true;
}
} }
MemberLookup lookup = null; MemberLookup lookup = null;
if (requireTarget) { if (requireTarget) {
lookup = new MemberLookup(resolver.CurrentTypeDefinition, resolver.CurrentTypeDefinition.ParentAssembly); lookup = new MemberLookup(resolver.CurrentTypeDefinition, resolver.CurrentTypeDefinition.ParentAssembly);
var or = new OverloadResolution(resolver.Compilation, method.Parameters.SelectArray(p => new TypeResolveResult(p.Type)));
var rr = lookup.Lookup(target.ResolveResult, method.Name, method.TypeArguments, false) ; var rr = lookup.Lookup(target.ResolveResult, method.Name, method.TypeArguments, false) ;
needsCast = true; needsCast = true;
result = rr; result = rr;

13
ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs

@ -245,6 +245,14 @@ namespace ICSharpCode.Decompiler.CSharp
protected internal override TranslatedExpression VisitIsInst(IsInst inst, TranslationContext context) protected internal override TranslatedExpression VisitIsInst(IsInst inst, TranslationContext context)
{ {
var arg = Translate(inst.Argument); var arg = Translate(inst.Argument);
arg = UnwrapBoxingConversion(arg);
return new AsExpression(arg.Expression, ConvertType(inst.Type))
.WithILInstruction(inst)
.WithRR(new ConversionResolveResult(inst.Type, arg.ResolveResult, Conversion.TryCast));
}
internal static TranslatedExpression UnwrapBoxingConversion(TranslatedExpression arg)
{
if (arg.Expression is CastExpression cast if (arg.Expression is CastExpression cast
&& arg.Type.IsKnownType(KnownTypeCode.Object) && arg.Type.IsKnownType(KnownTypeCode.Object)
&& arg.ResolveResult is ConversionResolveResult crr && arg.ResolveResult is ConversionResolveResult crr
@ -253,9 +261,8 @@ namespace ICSharpCode.Decompiler.CSharp
// the C# compiler implicitly boxes the input. // the C# compiler implicitly boxes the input.
arg = arg.UnwrapChild(cast.Expression); arg = arg.UnwrapChild(cast.Expression);
} }
return new AsExpression(arg.Expression, ConvertType(inst.Type))
.WithILInstruction(inst) return arg;
.WithRR(new ConversionResolveResult(inst.Type, arg.ResolveResult, Conversion.TryCast));
} }
protected internal override TranslatedExpression VisitNewObj(NewObj inst, TranslationContext context) protected internal override TranslatedExpression VisitNewObj(NewObj inst, TranslationContext context)

Loading…
Cancel
Save