diff --git a/src/AST/Method.cs b/src/AST/Method.cs index 7dfd67a5..5627b50e 100644 --- a/src/AST/Method.cs +++ b/src/AST/Method.cs @@ -10,6 +10,12 @@ namespace CppSharp.AST UsingDirective } + public enum CXXOperatorArity + { + Unary, + Binary + } + public enum CXXOperatorKind { None, diff --git a/src/Generator/AST/Utils.cs b/src/Generator/AST/Utils.cs index 75a72230..a4600c09 100644 --- a/src/Generator/AST/Utils.cs +++ b/src/Generator/AST/Utils.cs @@ -54,6 +54,14 @@ namespace CppSharp.AST public static class Operators { + public static CXXOperatorArity ClassifyOperator(Function function) + { + if (function.Parameters.Count == 1) + return CXXOperatorArity.Unary; + + return CXXOperatorArity.Binary; + } + public static string GetOperatorOverloadPair(CXXOperatorKind kind) { switch (kind) diff --git a/src/Generator/Generators/CLI/CLISourcesTemplate.cs b/src/Generator/Generators/CLI/CLISourcesTemplate.cs index 5627e237..b13e854c 100644 --- a/src/Generator/Generators/CLI/CLISourcesTemplate.cs +++ b/src/Generator/Generators/CLI/CLISourcesTemplate.cs @@ -745,15 +745,18 @@ namespace CppSharp.Generators.CLI if (function.IsOperator) { - var kind = function.OperatorKind; - - var isBinary = function.Parameters.Count > 0; var opName = function.Name.Replace("operator", "").Trim(); - // Binary operator - if (isBinary) + switch (Operators.ClassifyOperator(function)) + { + case CXXOperatorArity.Unary: + WriteLine("{0} {1};", opName, @params[0].Name); + break; + case CXXOperatorArity.Binary: WriteLine("{0} {1} {2};", @params[0].Name, opName, @params[1].Name); + break; + } } else { diff --git a/tests/Basic/Basic.Tests.cs b/tests/Basic/Basic.Tests.cs index e4aaf48e..3fcffcb8 100644 --- a/tests/Basic/Basic.Tests.cs +++ b/tests/Basic/Basic.Tests.cs @@ -44,7 +44,16 @@ public class BasicTests } [Test] - public void TestFunctionOperator() + public void TestUnaryOperator() + { + var bar = new Bar { A = 4, B = 7 }; + var barMinus = -bar; + Assert.That(barMinus.A, Is.EqualTo(-bar.A)); + Assert.That(barMinus.B, Is.EqualTo(-bar.B)); + } + + [Test] + public void TestBinaryOperator() { var bar = new Bar { A = 4, B = 7 }; var bar1 = new Bar { A = 5, B = 10 }; diff --git a/tests/Basic/Basic.cpp b/tests/Basic/Basic.cpp index 1744ff77..ecc1a521 100644 --- a/tests/Basic/Basic.cpp +++ b/tests/Basic/Basic.cpp @@ -81,6 +81,14 @@ const wchar_t* wcharFunction(const wchar_t* constWideChar) return constWideChar; } +Bar operator-(const Bar& b) +{ + Bar nb; + nb.A = -b.A; + nb.B = -b.B; + return nb; +} + Bar operator+(const Bar& b1, const Bar& b2) { Bar b; diff --git a/tests/Basic/Basic.h b/tests/Basic/Basic.h index 7c4ae134..e0995ab9 100644 --- a/tests/Basic/Basic.h +++ b/tests/Basic/Basic.h @@ -71,6 +71,7 @@ public: int RetEnum(Enum); }; +DLL_API Bar operator-(const Bar &); DLL_API Bar operator+(const Bar &, const Bar &); int DLL_API unsafeFunction(const Bar& ret, char* testForString, void (*foo)(int));