Browse Source

Generate forward ref header for enum defined inside a class in C++/CLI (#1322)

Co-authored-by: Build Agent <admin@sage.com>
pull/1328/head
Ali Alamiri 5 years ago committed by GitHub
parent
commit
32b83a3015
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 13
      src/Generator/AST/ASTRecord.cs
  2. 3
      src/Generator/Generators/CLI/CLITypeReferences.cs
  3. 9
      tests/CLI/CLI.Tests.cs
  4. 3
      tests/CLI/CLI.h
  5. 1
      tests/CLI/NestedEnumInClassTest/ClassWithNestedEnum.cpp
  6. 13
      tests/CLI/NestedEnumInClassTest/ClassWithNestedEnum.h
  7. 6
      tests/CLI/NestedEnumInClassTest/NestedEnumConsumer.cpp
  8. 11
      tests/CLI/NestedEnumInClassTest/NestedEnumConsumer.h
  9. 2
      tests/CLI/premake4.lua

13
src/Generator/AST/ASTRecord.cs

@ -150,6 +150,19 @@ namespace CppSharp.Generators.AST
return field.Type.Desugar().TryGetClass(out decl) && decl.IsValueType; return field.Type.Desugar().TryGetClass(out decl) && decl.IsValueType;
} }
public static bool IsEnumNestedInClass(this ASTRecord<Declaration> 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) public static bool IsDelegate(this ASTRecord record)
{ {
var typedef = record.Object as TypedefDecl; var typedef = record.Object as TypedefDecl;

3
src/Generator/Generators/CLI/CLITypeReferences.cs

@ -176,7 +176,8 @@ namespace CppSharp.Generators.CLI
if (TranslationUnit == record.Value.Namespace.TranslationUnit) if (TranslationUnit == record.Value.Namespace.TranslationUnit)
return false; return false;
return record.IsBaseClass() || record.IsFieldValueType() || record.IsDelegate(); return record.IsBaseClass() || record.IsFieldValueType() || record.IsDelegate()
|| record.IsEnumNestedInClass();
} }
public override bool VisitDeclaration(Declaration decl) public override bool VisitDeclaration(Declaration decl)

9
tests/CLI/CLI.Tests.cs

@ -35,4 +35,13 @@ public class CLITests : GeneratorTestFixture
Assert.AreEqual("Employee", org.Employee.Name); 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));
}
}
} }

3
tests/CLI/CLI.h

@ -3,6 +3,9 @@
#include "UseTemplateTypeFromIgnoredClassTemplate/Employee.h" #include "UseTemplateTypeFromIgnoredClassTemplate/Employee.h"
#include "UseTemplateTypeFromIgnoredClassTemplate/EmployeeOrg.h" #include "UseTemplateTypeFromIgnoredClassTemplate/EmployeeOrg.h"
#include "NestedEnumInClassTest/ClassWithNestedEnum.h"
#include "NestedEnumInClassTest/NestedEnumConsumer.h"
#include <ostream> #include <ostream>
// Tests for C++ types // Tests for C++ types

1
tests/CLI/NestedEnumInClassTest/ClassWithNestedEnum.cpp

@ -0,0 +1 @@
#include "ClassWithNestedEnum.h"

13
tests/CLI/NestedEnumInClassTest/ClassWithNestedEnum.h

@ -0,0 +1,13 @@
#pragma once
#include "../../Tests.h"
class DLL_API ClassWithNestedEnum
{
public:
enum NestedEnum
{
E1,
E2
};
};

6
tests/CLI/NestedEnumInClassTest/NestedEnumConsumer.cpp

@ -0,0 +1,6 @@
#include "NestedEnumConsumer.h"
ClassWithNestedEnum::NestedEnum NestedEnumConsumer::GetPassedEnum(ClassWithNestedEnum::NestedEnum e)
{
return e;
}

11
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);
};

2
tests/CLI/premake4.lua

@ -1,2 +1,2 @@
group "Tests/CLI" group "Tests/CLI"
SetupTestCLI("CLI", { "Employee", "EmployeeOrg" }) SetupTestCLI("CLI", { "Employee", "EmployeeOrg", "ClassWithNestedEnum", "NestedEnumConsumer" })
Loading…
Cancel
Save