From df98fc460afbcda6a3d293ec9695ec5abf5ba4fa Mon Sep 17 00:00:00 2001 From: josetr <37419832+josetr@users.noreply.github.com> Date: Sat, 17 Oct 2020 23:57:45 +0100 Subject: [PATCH] Use C# 'default literal' to avoid using a type's name that may be renamed (#1432) * Use C# 'default literal' to avoid using a type's name that may be renamed --- build/Helpers.lua | 1 + src/Generator/Passes/HandleDefaultParamValuesPass.cs | 9 +++++---- tests/CSharp/CSharp.cpp | 4 ++++ tests/CSharp/CSharp.h | 4 ++++ 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/build/Helpers.lua b/build/Helpers.lua index 0b55acda..5311f2e9 100644 --- a/build/Helpers.lua +++ b/build/Helpers.lua @@ -165,6 +165,7 @@ end function SetupManagedProject() language "C#" location ("%{wks.location}/projects") + buildoptions {"/langversion:7.2"} buildoptions {"/platform:".._OPTIONS["arch"]} dotnetframework "4.7.2" diff --git a/src/Generator/Passes/HandleDefaultParamValuesPass.cs b/src/Generator/Passes/HandleDefaultParamValuesPass.cs index a15b5b27..626e0e23 100644 --- a/src/Generator/Passes/HandleDefaultParamValuesPass.cs +++ b/src/Generator/Passes/HandleDefaultParamValuesPass.cs @@ -54,7 +54,7 @@ namespace CppSharp.Passes var result = parameter.DefaultArgument.String; if (PrintExpression(function, parameter.Type, - parameter.OriginalDefaultArgument, ref result) == null) + parameter.OriginalDefaultArgument, allowDefaultLiteral: true, ref result) == null) overloadIndices.Add(function.Parameters.IndexOf(parameter)); if (string.IsNullOrEmpty(result)) { @@ -71,7 +71,7 @@ namespace CppSharp.Passes return true; } - private bool? PrintExpression(Function function, Type type, ExpressionObsolete expression, ref string result) + private bool? PrintExpression(Function function, Type type, ExpressionObsolete expression, bool allowDefaultLiteral, ref string result) { var desugared = type.Desugar(); @@ -79,7 +79,7 @@ namespace CppSharp.Passes (expression.String == "0" || expression.String == "nullptr")) { result = desugared.GetPointee()?.Desugar() is FunctionType ? - "null" : $"default({desugared})"; + "null" : (allowDefaultLiteral ? "default" : $"default({desugared})"); return true; } @@ -212,8 +212,9 @@ namespace CppSharp.Passes { var argument = ctor.Arguments[i]; var argResult = argument.String; + expressionSupported &= PrintExpression(method, - method.Parameters[i].Type.Desugar(), argument, ref argResult) ?? false; + method.Parameters[i].Type.Desugar(), argument, allowDefaultLiteral: false, ref argResult) ?? false; argsBuilder.Append(argResult); if (i < ctor.Arguments.Count - 1) argsBuilder.Append(", "); diff --git a/tests/CSharp/CSharp.cpp b/tests/CSharp/CSharp.cpp index 8388fa13..9432c7a9 100644 --- a/tests/CSharp/CSharp.cpp +++ b/tests/CSharp/CSharp.cpp @@ -804,6 +804,10 @@ void MethodsWithDefaultValues::defaultWithStdNumericLimits(double d, int i) { } +void MethodsWithDefaultValues::defaultWithParamRequiringRename(_ClassWithLeadingUnderscore* ptr) +{ +} + int MethodsWithDefaultValues::DefaultWithParamNamedSameAsMethod(int DefaultWithParamNamedSameAsMethod, const Foo& defaultArg) { return 1; diff --git a/tests/CSharp/CSharp.h b/tests/CSharp/CSharp.h index 2f7c8ef9..f01d814a 100644 --- a/tests/CSharp/CSharp.h +++ b/tests/CSharp/CSharp.h @@ -407,6 +407,9 @@ enum class Empty : unsigned long long int { }; +class _ClassWithLeadingUnderscore { +}; + class DLL_API MethodsWithDefaultValues : public Quux { public: @@ -475,6 +478,7 @@ public: void defaultWithCharFromInt(char c = 32); void defaultWithFreeConstantInNameSpace(int c = HasFreeConstant::FREE_CONSTANT_IN_NAMESPACE); void defaultWithStdNumericLimits(double d = 1.0, int i = std::numeric_limits::infinity()); + void defaultWithParamRequiringRename(_ClassWithLeadingUnderscore* ptr = nullptr); int DefaultWithParamNamedSameAsMethod(int DefaultWithParamNamedSameAsMethod, const Foo& defaultArg = Foo()); int getA(); private: