diff --git a/src/AST/Method.cs b/src/AST/Method.cs index c51746da..aee33cb8 100644 --- a/src/AST/Method.cs +++ b/src/AST/Method.cs @@ -61,7 +61,8 @@ namespace CppSharp.AST Arrow, Call, Subscript, - Conditional + Conditional, + Conversion } /// @@ -108,7 +109,20 @@ namespace CppSharp.AST public bool IsOverride { get; set; } public bool IsProxy { get; set; } - public CXXMethodKind Kind; + private CXXMethodKind kind; + public CXXMethodKind Kind + { + get { return kind; } + set + { + if (kind != value) + { + kind = value; + if (kind == CXXMethodKind.Conversion) + OperatorKind = CXXOperatorKind.Conversion; + } + } + } public bool IsConstructor { diff --git a/src/Generator/AST/Utils.cs b/src/Generator/AST/Utils.cs index ef905fe2..1abab2f6 100644 --- a/src/Generator/AST/Utils.cs +++ b/src/Generator/AST/Utils.cs @@ -34,9 +34,6 @@ namespace CppSharp.AST if (method.OperatorKind == CXXOperatorKind.Equal) return true; - if (method.Kind == CXXMethodKind.Conversion) - return true; - if (method.Access == AccessSpecifier.Private && !method.IsOverride) return true; @@ -166,6 +163,9 @@ namespace CppSharp.AST case CXXOperatorKind.Array_Delete: isBuiltin = false; return "Operator" + kind.ToString(); + + case CXXOperatorKind.Conversion: + return "implicit operator"; } throw new NotSupportedException(); diff --git a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs index ced2eaf6..ff4f550a 100644 --- a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs +++ b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs @@ -1607,11 +1607,14 @@ namespace CppSharp.Generators.CSharp if (method.IsConstructor || method.IsDestructor) Write("{0}(", functionName); - else if (method.ExplicitInterfaceImpl == null) - Write("{0} {1}(", method.OriginalReturnType, functionName); - else + else if (method.ExplicitInterfaceImpl != null) Write("{0} {1}.{2}(", method.OriginalReturnType, method.ExplicitInterfaceImpl.Name, functionName); + else if (method.OperatorKind == CXXOperatorKind.Conversion) + Write("{0} {1}(", functionName, method.OriginalReturnType); + else + Write("{0} {1}(", method.OriginalReturnType, functionName); + Write(FormatMethodParameters(method.Parameters)); diff --git a/src/Generator/Passes/CheckOperatorsOverloads.cs b/src/Generator/Passes/CheckOperatorsOverloads.cs index 2d03ba3c..fd570a31 100644 --- a/src/Generator/Passes/CheckOperatorsOverloads.cs +++ b/src/Generator/Passes/CheckOperatorsOverloads.cs @@ -187,6 +187,7 @@ namespace CppSharp.Passes case CXXOperatorKind.Greater: case CXXOperatorKind.LessEqual: case CXXOperatorKind.GreaterEqual: + case CXXOperatorKind.Conversion: return true; case CXXOperatorKind.LessLess: diff --git a/src/Parser/Parser.cpp b/src/Parser/Parser.cpp index acc865eb..ea5a0389 100644 --- a/src/Parser/Parser.cpp +++ b/src/Parser/Parser.cpp @@ -791,7 +791,6 @@ CppSharp::AST::Method^ Parser::WalkMethodCXX(clang::CXXMethodDecl* MD) CppSharp::AST::Method^ Method = gcnew CppSharp::AST::Method(); Method->Access = ConvertToAccess(MD->getAccess()); - Method->Kind = GetMethodKindFromDecl(Name); Method->IsStatic = MD->isStatic(); Method->IsVirtual = MD->isVirtual(); Method->IsConst = MD->isConst(); @@ -799,6 +798,8 @@ CppSharp::AST::Method^ Parser::WalkMethodCXX(clang::CXXMethodDecl* MD) WalkFunction(MD, Method); + Method->Kind = GetMethodKindFromDecl(Name); + if (const CXXConstructorDecl* CD = dyn_cast(MD)) { Method->IsDefaultConstructor = CD->isDefaultConstructor(); diff --git a/tests/CSharpTemp/CSharpTemp.Tests.cs b/tests/CSharpTemp/CSharpTemp.Tests.cs index 449ede61..fd7dc4cf 100644 --- a/tests/CSharpTemp/CSharpTemp.Tests.cs +++ b/tests/CSharpTemp/CSharpTemp.Tests.cs @@ -44,5 +44,7 @@ public class CSharpTempTests Assert.That(baz.farAwayFunc(), Is.EqualTo(20)); Assert.That(baz.takesQux(baz), Is.EqualTo(20)); Assert.That(baz.returnQux().farAwayFunc(), Is.EqualTo(20)); + int cast = baz; + Assert.That(cast, Is.EqualTo(500)); } } \ No newline at end of file diff --git a/tests/CSharpTemp/CSharpTemp.cpp b/tests/CSharpTemp/CSharpTemp.cpp index 3a48155e..ff0a74af 100644 --- a/tests/CSharpTemp/CSharpTemp.cpp +++ b/tests/CSharpTemp/CSharpTemp.cpp @@ -55,3 +55,8 @@ Qux Baz::returnQux() { return Qux(); } + +Baz::operator int() const +{ + return 500; +} diff --git a/tests/CSharpTemp/CSharpTemp.h b/tests/CSharpTemp/CSharpTemp.h index 6453d89f..4ff75db3 100644 --- a/tests/CSharpTemp/CSharpTemp.h +++ b/tests/CSharpTemp/CSharpTemp.h @@ -40,4 +40,5 @@ class DLL_API Baz : public Foo, public Bar public: int takesQux(const Qux& qux); Qux returnQux(); + operator int() const; };