diff --git a/cppwinrt/type_writers.h b/cppwinrt/type_writers.h index a41b3086c..0fa3e5f8d 100644 --- a/cppwinrt/type_writers.h +++ b/cppwinrt/type_writers.h @@ -92,6 +92,18 @@ namespace cppwinrt return result; } + static bool transform_special_numeric_type(std::string_view& name) + { + if (name == "Matrix3x2") { name = "float3x2"; return true; } + else if (name == "Matrix4x4") { name = "float4x4"; return true; } + else if (name == "Plane") { name = "plane"; return true; } + else if (name == "Quaternion") { name = "quaternion"; return true; } + else if (name == "Vector2") { name = "float2"; return true; } + else if (name == "Vector3") { name = "float3"; return true; } + else if (name == "Vector4") { name = "float4"; return true; } + return false; + } + struct writer : writer_base { using writer_base::write; @@ -277,8 +289,6 @@ namespace cppwinrt return; } - // TODO: get rid of all these renames once parity with cppwinrt.exe has been reached... - if (name == "EventRegistrationToken" && ns == "Windows.Foundation") { write("winrt::event_token"); @@ -291,16 +301,8 @@ namespace cppwinrt { auto category = get_category(type); - if (ns == "Windows.Foundation.Numerics") + if (ns == "Windows.Foundation.Numerics" && transform_special_numeric_type(name)) { - if (name == "Matrix3x2") { name = "float3x2"; } - else if (name == "Matrix4x4") { name = "float4x4"; } - else if (name == "Plane") { name = "plane"; } - else if (name == "Quaternion") { name = "quaternion"; } - else if (name == "Vector2") { name = "float2"; } - else if (name == "Vector3") { name = "float3"; } - else if (name == "Vector4") { name = "float4"; } - write("winrt::@::%", ns, name); } else if (category == category::struct_type) diff --git a/test/test/rational.cpp b/test/test/rational.cpp new file mode 100644 index 000000000..c34dbce38 --- /dev/null +++ b/test/test/rational.cpp @@ -0,0 +1,18 @@ +#include "pch.h" +#include "winrt/test_component.h" +#include "winrt/Windows.Foundation.Numerics.h" + +using namespace winrt; +using namespace test_component; + +TEST_CASE("rational") +{ + Simple simple; + Windows::Foundation::Numerics::Rational rational = simple.ReturnRational(); + REQUIRE(rational.Numerator == 123); + REQUIRE(rational.Denominator == 456); + + Windows::Foundation::Numerics::float2 vector2 = simple.ReturnVector2(); + REQUIRE(vector2.x == 123.0); + REQUIRE(vector2.y == 456.0); +} diff --git a/test/test/test.vcxproj b/test/test/test.vcxproj index 4c7c58517..51dbfcb64 100644 --- a/test/test/test.vcxproj +++ b/test/test/test.vcxproj @@ -428,6 +428,7 @@ Create + diff --git a/test/test_component/Simple.h b/test/test_component/Simple.h index 0d97f5e1b..854c1235d 100644 --- a/test/test_component/Simple.h +++ b/test/test_component/Simple.h @@ -16,6 +16,16 @@ namespace winrt::test_component::implementation // All we care about static events (for now) is that they build. static event_token StaticEvent(Windows::Foundation::EventHandler const&) { return {}; } static void StaticEvent(event_token) { } + + Windows::Foundation::Numerics::float2 ReturnVector2() + { + return { 123.0, 456.0 }; + } + + Windows::Foundation::Numerics::Rational ReturnRational() + { + return { 123, 456 }; + } }; } namespace winrt::test_component::factory_implementation diff --git a/test/test_component/test_component.idl b/test/test_component/test_component.idl index 252e6d2f8..fb7444889 100644 --- a/test/test_component/test_component.idl +++ b/test/test_component/test_component.idl @@ -56,6 +56,9 @@ namespace test_component Windows.Foundation.IAsyncAction Action(Windows.Foundation.DateTime value); Object Object(Windows.Foundation.DateTime value); static event Windows.Foundation.EventHandler StaticEvent; + + Windows.Foundation.Numerics.Vector2 ReturnVector2(); + Windows.Foundation.Numerics.Rational ReturnRational(); } runtimeclass DeferrableEventArgs