From 75527071abcb6a2203a45b2c476ff7a774ea45db Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Thu, 15 Mar 2018 23:35:04 +0100 Subject: [PATCH] Fix redundant qualifiers in method group expressions. --- .../TestCases/Pretty/QualifierTests.cs | 5 +- .../TestCases/Pretty/QualifierTests.il | 52 ++++++++++++------- .../TestCases/Pretty/QualifierTests.opt.il | 46 ++++++++++------ .../Pretty/QualifierTests.opt.roslyn.il | 42 ++++++++++----- .../TestCases/Pretty/QualifierTests.roslyn.il | 48 +++++++++++------ ICSharpCode.Decompiler/CSharp/CallBuilder.cs | 11 +++- .../CSharp/ExpressionBuilder.cs | 15 ++++-- 7 files changed, 146 insertions(+), 73 deletions(-) diff --git a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/QualifierTests.cs b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/QualifierTests.cs index 1640e853d..a28e8c4e8 100644 --- a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/QualifierTests.cs +++ b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/QualifierTests.cs @@ -37,9 +37,8 @@ namespace ICSharpCode.Decompiler.Tests.Pretty private void Parameter(QualifierTests test) { - // TODO : fix this - //Delegate(Parameter); - //Delegate(StaticParameter); + Delegate(Parameter); + Delegate(StaticParameter); Delegate(test.Parameter); Delegate(QualifierTests.StaticParameter); } diff --git a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/QualifierTests.il b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/QualifierTests.il index e6996f77e..34f31f29c 100644 --- a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/QualifierTests.il +++ b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/QualifierTests.il @@ -15,7 +15,7 @@ .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4.. .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 63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 ) // ceptionThrows. @@ -26,15 +26,15 @@ .hash algorithm 0x00008004 .ver 0:0:0:0 } -.module pmidbhuu.dll -// MVID: {29FFF9F6-E3AF-492E-8C7A-9BA99576954E} +.module zgfoqdfc.dll +// MVID: {1C0110BE-438D-48BD-8A01-FFE7CCD962C7} .custom instance void [mscorlib]System.Security.UnverifiableCodeAttribute::.ctor() = ( 01 00 00 00 ) .imagebase 0x10000000 .file alignment 0x00000200 .stackreserve 0x00100000 .subsystem 0x0003 // WINDOWS_CUI .corflags 0x00000001 // ILONLY -// Image base: 0x030F0000 +// Image base: 0x00810000 // =============== CLASS MEMBERS DECLARATION =================== @@ -100,24 +100,40 @@ .method private hidebysig instance void Parameter(class ICSharpCode.Decompiler.Tests.Pretty.QualifierTests test) cil managed { - // Code size 40 (0x28) - .maxstack 8 + // Code size 88 (0x58) + .maxstack 3 IL_0000: nop IL_0001: ldarg.0 - IL_0002: ldarg.1 - IL_0003: ldftn instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests::Parameter(object) - IL_0009: newobj instance void class [mscorlib]System.Action`1::.ctor(object, + IL_0002: ldarg.0 + IL_0003: ldobj ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test + 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::.ctor(object, + native int) + IL_0018: call instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Delegate(class [mscorlib]System.Action`1) + IL_001d: nop + IL_001e: ldarg.0 + IL_001f: ldnull + IL_0020: ldftn void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::StaticParameter(object) + IL_0026: newobj instance void class [mscorlib]System.Action`1::.ctor(object, + native int) + IL_002b: call instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Delegate(class [mscorlib]System.Action`1) + IL_0030: nop + 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::.ctor(object, native int) - IL_000e: call instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Delegate(class [mscorlib]System.Action`1) - IL_0013: nop - IL_0014: ldarg.0 - IL_0015: ldnull - IL_0016: ldftn void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests::StaticParameter(object) - IL_001c: newobj instance void class [mscorlib]System.Action`1::.ctor(object, + IL_003e: call instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Delegate(class [mscorlib]System.Action`1) + 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::.ctor(object, native int) - IL_0021: call instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Delegate(class [mscorlib]System.Action`1) - IL_0026: nop - IL_0027: ret + IL_0051: call instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Delegate(class [mscorlib]System.Action`1) + IL_0056: nop + IL_0057: ret } // end of method Test::Parameter .method private hidebysig static void diff --git a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/QualifierTests.opt.il b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/QualifierTests.opt.il index 883d05425..953f94ddc 100644 --- a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/QualifierTests.opt.il +++ b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/QualifierTests.opt.il @@ -15,7 +15,7 @@ .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4.. .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 63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 ) // ceptionThrows. @@ -26,15 +26,15 @@ .hash algorithm 0x00008004 .ver 0:0:0:0 } -.module '011f0dbt.dll' -// MVID: {EB97E647-5276-4D71-871C-EC7FC2A37905} +.module a2ezv3zo.dll +// MVID: {7C524CF6-1164-4EF8-B967-C3D2C3C0FCC5} .custom instance void [mscorlib]System.Security.UnverifiableCodeAttribute::.ctor() = ( 01 00 00 00 ) .imagebase 0x10000000 .file alignment 0x00000200 .stackreserve 0x00100000 .subsystem 0x0003 // WINDOWS_CUI .corflags 0x00000001 // ILONLY -// Image base: 0x00DD0000 +// Image base: 0x030E0000 // =============== CLASS MEMBERS DECLARATION =================== @@ -91,21 +91,35 @@ .method private hidebysig instance void Parameter(class ICSharpCode.Decompiler.Tests.Pretty.QualifierTests test) cil managed { - // Code size 37 (0x25) - .maxstack 8 + // Code size 83 (0x53) + .maxstack 3 IL_0000: ldarg.0 - IL_0001: ldarg.1 - IL_0002: ldftn instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests::Parameter(object) - IL_0008: newobj instance void class [mscorlib]System.Action`1::.ctor(object, + IL_0001: ldarg.0 + IL_0002: ldobj ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test + 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::.ctor(object, + native int) + IL_0017: call instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Delegate(class [mscorlib]System.Action`1) + IL_001c: ldarg.0 + IL_001d: ldnull + IL_001e: ldftn void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::StaticParameter(object) + IL_0024: newobj instance void class [mscorlib]System.Action`1::.ctor(object, + native int) + IL_0029: call instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Delegate(class [mscorlib]System.Action`1) + 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::.ctor(object, native int) - IL_000d: call instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Delegate(class [mscorlib]System.Action`1) - IL_0012: ldarg.0 - IL_0013: ldnull - IL_0014: ldftn void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests::StaticParameter(object) - IL_001a: newobj instance void class [mscorlib]System.Action`1::.ctor(object, + IL_003b: call instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Delegate(class [mscorlib]System.Action`1) + 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::.ctor(object, native int) - IL_001f: call instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Delegate(class [mscorlib]System.Action`1) - IL_0024: ret + IL_004d: call instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Delegate(class [mscorlib]System.Action`1) + IL_0052: ret } // end of method Test::Parameter .method private hidebysig static void diff --git a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/QualifierTests.opt.roslyn.il b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/QualifierTests.opt.roslyn.il index be3a13a48..0c0c23e32 100644 --- a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/QualifierTests.opt.roslyn.il +++ b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/QualifierTests.opt.roslyn.il @@ -31,14 +31,14 @@ .ver 0:0:0:0 } .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 ) .imagebase 0x10000000 .file alignment 0x00000200 .stackreserve 0x00100000 .subsystem 0x0003 // WINDOWS_CUI .corflags 0x00000001 // ILONLY -// Image base: 0x04D00000 +// Image base: 0x03340000 // =============== CLASS MEMBERS DECLARATION =================== @@ -95,21 +95,35 @@ .method private hidebysig instance void Parameter(class ICSharpCode.Decompiler.Tests.Pretty.QualifierTests test) cil managed { - // Code size 37 (0x25) - .maxstack 8 + // Code size 83 (0x53) + .maxstack 3 IL_0000: ldarg.0 - IL_0001: ldarg.1 - IL_0002: ldftn instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests::Parameter(object) - IL_0008: newobj instance void class [mscorlib]System.Action`1::.ctor(object, + IL_0001: ldarg.0 + IL_0002: ldobj ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test + 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::.ctor(object, + native int) + IL_0017: call instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Delegate(class [mscorlib]System.Action`1) + IL_001c: ldarg.0 + IL_001d: ldnull + IL_001e: ldftn void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::StaticParameter(object) + IL_0024: newobj instance void class [mscorlib]System.Action`1::.ctor(object, + native int) + IL_0029: call instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Delegate(class [mscorlib]System.Action`1) + 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::.ctor(object, native int) - IL_000d: call instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Delegate(class [mscorlib]System.Action`1) - IL_0012: ldarg.0 - IL_0013: ldnull - IL_0014: ldftn void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests::StaticParameter(object) - IL_001a: newobj instance void class [mscorlib]System.Action`1::.ctor(object, + IL_003b: call instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Delegate(class [mscorlib]System.Action`1) + 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::.ctor(object, native int) - IL_001f: call instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Delegate(class [mscorlib]System.Action`1) - IL_0024: ret + IL_004d: call instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Delegate(class [mscorlib]System.Action`1) + IL_0052: ret } // end of method Test::Parameter .method private hidebysig static void diff --git a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/QualifierTests.roslyn.il b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/QualifierTests.roslyn.il index 86636ef4f..c50e8d2b6 100644 --- a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/QualifierTests.roslyn.il +++ b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/QualifierTests.roslyn.il @@ -31,14 +31,14 @@ .ver 0:0:0:0 } .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 ) .imagebase 0x10000000 .file alignment 0x00000200 .stackreserve 0x00100000 .subsystem 0x0003 // WINDOWS_CUI .corflags 0x00000001 // ILONLY -// Image base: 0x030D0000 +// Image base: 0x03990000 // =============== CLASS MEMBERS DECLARATION =================== @@ -104,24 +104,40 @@ .method private hidebysig instance void Parameter(class ICSharpCode.Decompiler.Tests.Pretty.QualifierTests test) cil managed { - // Code size 40 (0x28) - .maxstack 8 + // Code size 88 (0x58) + .maxstack 3 IL_0000: nop IL_0001: ldarg.0 - IL_0002: ldarg.1 - IL_0003: ldftn instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests::Parameter(object) - IL_0009: newobj instance void class [mscorlib]System.Action`1::.ctor(object, + IL_0002: ldarg.0 + IL_0003: ldobj ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test + 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::.ctor(object, + native int) + IL_0018: call instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Delegate(class [mscorlib]System.Action`1) + IL_001d: nop + IL_001e: ldarg.0 + IL_001f: ldnull + IL_0020: ldftn void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::StaticParameter(object) + IL_0026: newobj instance void class [mscorlib]System.Action`1::.ctor(object, + native int) + IL_002b: call instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Delegate(class [mscorlib]System.Action`1) + IL_0030: nop + 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::.ctor(object, native int) - IL_000e: call instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Delegate(class [mscorlib]System.Action`1) - IL_0013: nop - IL_0014: ldarg.0 - IL_0015: ldnull - IL_0016: ldftn void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests::StaticParameter(object) - IL_001c: newobj instance void class [mscorlib]System.Action`1::.ctor(object, + IL_003e: call instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Delegate(class [mscorlib]System.Action`1) + 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::.ctor(object, native int) - IL_0021: call instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Delegate(class [mscorlib]System.Action`1) - IL_0026: nop - IL_0027: ret + IL_0051: call instance void ICSharpCode.Decompiler.Tests.Pretty.QualifierTests/Test::Delegate(class [mscorlib]System.Action`1) + IL_0056: nop + IL_0057: ret } // end of method Test::Parameter .method private hidebysig static void diff --git a/ICSharpCode.Decompiler/CSharp/CallBuilder.cs b/ICSharpCode.Decompiler/CSharp/CallBuilder.cs index ca7fcedc5..64fa9e8f7 100644 --- a/ICSharpCode.Decompiler/CSharp/CallBuilder.cs +++ b/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) { targetType = method.Parameters[0].Type; target = expressionBuilder.Translate(inst.Arguments[0], targetType); + target = ExpressionBuilder.UnwrapBoxingConversion(target); requireTarget = true; } else { targetType = method.DeclaringType; target = expressionBuilder.TranslateTarget(method, inst.Arguments[0], func.OpCode == OpCode.LdFtn); + target = ExpressionBuilder.UnwrapBoxingConversion(target); requireTarget = expressionBuilder.HidesVariableWithName(method.Name) || (method.IsStatic ? !expressionBuilder.IsCurrentOrContainingType(method.DeclaringTypeDefinition) : !(target.Expression is ThisReferenceExpression)); } @@ -521,14 +523,19 @@ namespace ICSharpCode.Decompiler.CSharp }; bool needsCast = false; ResolveResult result = null; + var or = new OverloadResolution(resolver.Compilation, method.Parameters.SelectArray(p => new TypeResolveResult(p.Type))); if (!requireTarget) { 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; if (requireTarget) { 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) ; needsCast = true; result = rr; diff --git a/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs b/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs index 71504a0c8..adc19a08d 100644 --- a/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs +++ b/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs @@ -245,6 +245,14 @@ namespace ICSharpCode.Decompiler.CSharp protected internal override TranslatedExpression VisitIsInst(IsInst inst, TranslationContext context) { 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 && arg.Type.IsKnownType(KnownTypeCode.Object) && arg.ResolveResult is ConversionResolveResult crr @@ -253,11 +261,10 @@ namespace ICSharpCode.Decompiler.CSharp // the C# compiler implicitly boxes the input. arg = arg.UnwrapChild(cast.Expression); } - return new AsExpression(arg.Expression, ConvertType(inst.Type)) - .WithILInstruction(inst) - .WithRR(new ConversionResolveResult(inst.Type, arg.ResolveResult, Conversion.TryCast)); + + return arg; } - + protected internal override TranslatedExpression VisitNewObj(NewObj inst, TranslationContext context) { return new CallBuilder(this, typeSystem, settings).Build(inst);