From 32b83a301592bc8c687f33f2865d37263ed01261 Mon Sep 17 00:00:00 2001 From: Ali Alamiri Date: Sun, 5 Apr 2020 18:12:10 +0100 Subject: [PATCH] Generate forward ref header for enum defined inside a class in C++/CLI (#1322) Co-authored-by: Build Agent --- src/Generator/AST/ASTRecord.cs | 13 +++++++++++++ src/Generator/Generators/CLI/CLITypeReferences.cs | 3 ++- tests/CLI/CLI.Tests.cs | 9 +++++++++ tests/CLI/CLI.h | 3 +++ .../NestedEnumInClassTest/ClassWithNestedEnum.cpp | 1 + .../CLI/NestedEnumInClassTest/ClassWithNestedEnum.h | 13 +++++++++++++ .../NestedEnumInClassTest/NestedEnumConsumer.cpp | 6 ++++++ .../CLI/NestedEnumInClassTest/NestedEnumConsumer.h | 11 +++++++++++ tests/CLI/premake4.lua | 2 +- 9 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 tests/CLI/NestedEnumInClassTest/ClassWithNestedEnum.cpp create mode 100644 tests/CLI/NestedEnumInClassTest/ClassWithNestedEnum.h create mode 100644 tests/CLI/NestedEnumInClassTest/NestedEnumConsumer.cpp create mode 100644 tests/CLI/NestedEnumInClassTest/NestedEnumConsumer.h diff --git a/src/Generator/AST/ASTRecord.cs b/src/Generator/AST/ASTRecord.cs index 81c2f0d0..cd880656 100644 --- a/src/Generator/AST/ASTRecord.cs +++ b/src/Generator/AST/ASTRecord.cs @@ -150,6 +150,19 @@ namespace CppSharp.Generators.AST return field.Type.Desugar().TryGetClass(out decl) && decl.IsValueType; } + public static bool IsEnumNestedInClass(this ASTRecord record) + { + Enumeration @enum = record.Value as Enumeration; + var typedDecl = record.Value as ITypedDecl; + if (@enum != null + || (typedDecl?.Type?.TryGetEnum(out @enum)).GetValueOrDefault()) + { + return @enum.Namespace is Class; + } + + return false; + } + public static bool IsDelegate(this ASTRecord record) { var typedef = record.Object as TypedefDecl; diff --git a/src/Generator/Generators/CLI/CLITypeReferences.cs b/src/Generator/Generators/CLI/CLITypeReferences.cs index 8a1c795f..40e1a596 100644 --- a/src/Generator/Generators/CLI/CLITypeReferences.cs +++ b/src/Generator/Generators/CLI/CLITypeReferences.cs @@ -176,7 +176,8 @@ namespace CppSharp.Generators.CLI if (TranslationUnit == record.Value.Namespace.TranslationUnit) return false; - return record.IsBaseClass() || record.IsFieldValueType() || record.IsDelegate(); + return record.IsBaseClass() || record.IsFieldValueType() || record.IsDelegate() + || record.IsEnumNestedInClass(); } public override bool VisitDeclaration(Declaration decl) diff --git a/tests/CLI/CLI.Tests.cs b/tests/CLI/CLI.Tests.cs index ae95948a..98ace109 100644 --- a/tests/CLI/CLI.Tests.cs +++ b/tests/CLI/CLI.Tests.cs @@ -35,4 +35,13 @@ public class CLITests : GeneratorTestFixture Assert.AreEqual("Employee", org.Employee.Name); } } + + [Test] + public void TestConsumerOfEnumNestedInClass() + { + using (NestedEnumConsumer consumer = new NestedEnumConsumer()) + { + Assert.AreEqual(ClassWithNestedEnum.NestedEnum.E1, consumer.GetPassedEnum(ClassWithNestedEnum.NestedEnum.E1)); + } + } } \ No newline at end of file diff --git a/tests/CLI/CLI.h b/tests/CLI/CLI.h index 4d5bc0ef..3f903890 100644 --- a/tests/CLI/CLI.h +++ b/tests/CLI/CLI.h @@ -3,6 +3,9 @@ #include "UseTemplateTypeFromIgnoredClassTemplate/Employee.h" #include "UseTemplateTypeFromIgnoredClassTemplate/EmployeeOrg.h" +#include "NestedEnumInClassTest/ClassWithNestedEnum.h" +#include "NestedEnumInClassTest/NestedEnumConsumer.h" + #include // Tests for C++ types diff --git a/tests/CLI/NestedEnumInClassTest/ClassWithNestedEnum.cpp b/tests/CLI/NestedEnumInClassTest/ClassWithNestedEnum.cpp new file mode 100644 index 00000000..41e83d9b --- /dev/null +++ b/tests/CLI/NestedEnumInClassTest/ClassWithNestedEnum.cpp @@ -0,0 +1 @@ +#include "ClassWithNestedEnum.h" \ No newline at end of file diff --git a/tests/CLI/NestedEnumInClassTest/ClassWithNestedEnum.h b/tests/CLI/NestedEnumInClassTest/ClassWithNestedEnum.h new file mode 100644 index 00000000..c204636a --- /dev/null +++ b/tests/CLI/NestedEnumInClassTest/ClassWithNestedEnum.h @@ -0,0 +1,13 @@ +#pragma once + +#include "../../Tests.h" + +class DLL_API ClassWithNestedEnum +{ +public: + enum NestedEnum + { + E1, + E2 + }; +}; diff --git a/tests/CLI/NestedEnumInClassTest/NestedEnumConsumer.cpp b/tests/CLI/NestedEnumInClassTest/NestedEnumConsumer.cpp new file mode 100644 index 00000000..0405aff8 --- /dev/null +++ b/tests/CLI/NestedEnumInClassTest/NestedEnumConsumer.cpp @@ -0,0 +1,6 @@ +#include "NestedEnumConsumer.h" + +ClassWithNestedEnum::NestedEnum NestedEnumConsumer::GetPassedEnum(ClassWithNestedEnum::NestedEnum e) +{ + return e; +} diff --git a/tests/CLI/NestedEnumInClassTest/NestedEnumConsumer.h b/tests/CLI/NestedEnumInClassTest/NestedEnumConsumer.h new file mode 100644 index 00000000..2ddbbbeb --- /dev/null +++ b/tests/CLI/NestedEnumInClassTest/NestedEnumConsumer.h @@ -0,0 +1,11 @@ +#pragma once + +#include "../../Tests.h" + +#include "ClassWithNestedEnum.h" + +class DLL_API NestedEnumConsumer +{ +public: + ClassWithNestedEnum::NestedEnum GetPassedEnum(ClassWithNestedEnum::NestedEnum e); +}; \ No newline at end of file diff --git a/tests/CLI/premake4.lua b/tests/CLI/premake4.lua index 4e3da006..00cdf452 100644 --- a/tests/CLI/premake4.lua +++ b/tests/CLI/premake4.lua @@ -1,2 +1,2 @@ group "Tests/CLI" - SetupTestCLI("CLI", { "Employee", "EmployeeOrg" }) \ No newline at end of file + SetupTestCLI("CLI", { "Employee", "EmployeeOrg", "ClassWithNestedEnum", "NestedEnumConsumer" }) \ No newline at end of file