Browse Source

Add option: 'ref' extension methods

pull/1596/head
Siegfried Pammer 6 years ago
parent
commit
537df7bab3
  1. 11
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/QualifierTests.cs
  2. 10
      ICSharpCode.Decompiler/CSharp/Transforms/IntroduceExtensionMethods.cs
  3. 20
      ICSharpCode.Decompiler/DecompilerSettings.cs
  4. 9
      ILSpy/Properties/Resources.Designer.cs
  5. 3
      ILSpy/Properties/Resources.resx

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

@ -221,12 +221,21 @@ namespace ICSharpCode.Decompiler.Tests.Pretty @@ -221,12 +221,21 @@ namespace ICSharpCode.Decompiler.Tests.Pretty
{
}
#if CS72
public static void Do(this ref DateTime test)
{
}
#endif
public static void Do2(this int test)
public static void Do2(this int test, DateTime date)
{
test.Do();
((IEnumerable<int>)null).Any();
((object)null).Do();
#if CS72
date.Do();
#endif
}
}
}

10
ICSharpCode.Decompiler/CSharp/Transforms/IntroduceExtensionMethods.cs

@ -137,7 +137,15 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms @@ -137,7 +137,15 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms
}
if (!CanTransformToExtensionMethodCall(resolver, method, typeArguments, target, args, argNames))
return;
if (firstArgument is NullReferenceExpression) {
if (firstArgument is DirectionExpression dirExpr) {
if (dirExpr.FieldDirection != FieldDirection.Ref)
return;
if (!context.Settings.RefExtensionMethods)
return;
firstArgument = dirExpr.Expression;
target = firstArgument.GetResolveResult();
dirExpr.Detach();
} else if (firstArgument is NullReferenceExpression) {
Debug.Assert(context.RequiredNamespacesSuperset.Contains(method.Parameters[0].Type.Namespace));
firstArgument = firstArgument.ReplaceWith(expr => new CastExpression(context.TypeSystemAstBuilder.ConvertType(method.Parameters[0].Type), expr.Detach()));
}

20
ICSharpCode.Decompiler/DecompilerSettings.cs

@ -97,6 +97,7 @@ namespace ICSharpCode.Decompiler @@ -97,6 +97,7 @@ namespace ICSharpCode.Decompiler
introduceReadonlyAndInModifiers = false;
introduceRefModifiersOnStructs = false;
nonTrailingNamedArguments = false;
refExtensionMethods = false;
}
if (languageVersion < CSharp.LanguageVersion.CSharp7_3) {
introduceUnmanagedConstraint = false;
@ -114,7 +115,7 @@ namespace ICSharpCode.Decompiler @@ -114,7 +115,7 @@ namespace ICSharpCode.Decompiler
return CSharp.LanguageVersion.CSharp8_0;
if (introduceUnmanagedConstraint || tupleComparisons || stackAllocInitializers)
return CSharp.LanguageVersion.CSharp7_3;
if (introduceRefModifiersOnStructs || introduceReadonlyAndInModifiers || nonTrailingNamedArguments)
if (introduceRefModifiersOnStructs || introduceReadonlyAndInModifiers || nonTrailingNamedArguments || refExtensionMethods)
return CSharp.LanguageVersion.CSharp7_2;
// C# 7.1 missing
if (outVariables || tupleTypes || tupleConversions || discards || localFunctions)
@ -626,6 +627,23 @@ namespace ICSharpCode.Decompiler @@ -626,6 +627,23 @@ namespace ICSharpCode.Decompiler
}
}
bool refExtensionMethods = true;
/// <summary>
/// Gets/Sets whether to use C# 7.2 'ref' extension methods.
/// </summary>
[Category("C# 7.2 / VS 2017.4")]
[Description("DecompilerSettings.AllowExtensionMethodSyntaxOnRef")]
public bool RefExtensionMethods {
get { return refExtensionMethods; }
set {
if (refExtensionMethods != value) {
refExtensionMethods = value;
OnPropertyChanged();
}
}
}
bool stringInterpolation = true;
/// <summary>

9
ILSpy/Properties/Resources.Designer.cs generated

@ -474,6 +474,15 @@ namespace ICSharpCode.ILSpy.Properties { @@ -474,6 +474,15 @@ namespace ICSharpCode.ILSpy.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to Use &apos;ref&apos; extension methods.
/// </summary>
public static string DecompilerSettings_AllowExtensionMethodSyntaxOnRef {
get {
return ResourceManager.GetString("DecompilerSettings.AllowExtensionMethodSyntaxOnRef", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Always cast targets of explicit interface implementation calls.
/// </summary>

3
ILSpy/Properties/Resources.resx

@ -729,4 +729,7 @@ @@ -729,4 +729,7 @@
<data name="CannotAnalyzeMissingRef" xml:space="preserve">
<value>Entity could not be resolved. Cannot analyze entities from missing assembly references. Add the missing reference and try again.</value>
</data>
<data name="DecompilerSettings.AllowExtensionMethodSyntaxOnRef" xml:space="preserve">
<value>Use 'ref' extension methods</value>
</data>
</root>
Loading…
Cancel
Save