Browse Source

Ensure protected nested types are accessible with multiple inheritance

Fixes #594.

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/1237/head
Dimitar Dobrev 6 years ago
parent
commit
d9a33bac7b
  1. 1
      src/Generator/Driver.cs
  2. 37
      src/Generator/Passes/MakeProtectedNestedTypesPublicPass.cs
  3. 2
      tests/CSharp/CSharp.Tests.cs
  4. 2
      tests/CSharp/CSharp.cpp
  5. 9
      tests/CSharp/CSharp.h

1
src/Generator/Driver.cs

@ -251,6 +251,7 @@ namespace CppSharp @@ -251,6 +251,7 @@ namespace CppSharp
TranslationUnitPasses.AddPass(new FieldToPropertyPass());
TranslationUnitPasses.AddPass(new CheckIgnoredDeclsPass());
TranslationUnitPasses.AddPass(new CheckFlagEnumsPass());
TranslationUnitPasses.AddPass(new MakeProtectedNestedTypesPublicPass());
if (Options.IsCSharpGenerator)
{

37
src/Generator/Passes/MakeProtectedNestedTypesPublicPass.cs

@ -0,0 +1,37 @@ @@ -0,0 +1,37 @@
using System.Collections.Generic;
using System.Linq;
using CppSharp.AST;
namespace CppSharp.Passes
{
public class MakeProtectedNestedTypesPublicPass : TranslationUnitPass
{
public MakeProtectedNestedTypesPublicPass()
{
VisitOptions.VisitClassBases = false;
VisitOptions.VisitClassFields = false;
VisitOptions.VisitClassTemplateSpecializations = false;
VisitOptions.VisitEventParameters = false;
VisitOptions.VisitFunctionParameters = false;
VisitOptions.VisitFunctionReturnType = false;
VisitOptions.VisitNamespaceEnums = false;
VisitOptions.VisitNamespaceEvents = false;
VisitOptions.VisitNamespaceTemplates = false;
VisitOptions.VisitNamespaceTypedefs = false;
VisitOptions.VisitNamespaceVariables = false;
VisitOptions.VisitTemplateArguments = false;
}
public override bool VisitClassDecl(Class @class)
{
if (!base.VisitClassDecl(@class))
return false;
(from d in ((IEnumerable<Declaration>) @class.Classes).Concat(@class.Enums)
where d.Access == AccessSpecifier.Protected
select d).All(d => { d.Access = AccessSpecifier.Public; return true; });
return true;
}
}
}

2
tests/CSharp/CSharp.Tests.cs

@ -144,7 +144,7 @@ public unsafe class CSharpTests : GeneratorTestFixture @@ -144,7 +144,7 @@ public unsafe class CSharpTests : GeneratorTestFixture
Assert.That(baz.FarAwayFunc, Is.EqualTo(20));
Assert.That(baz.TakesQux(baz), Is.EqualTo(20));
Assert.That(baz.ReturnQux().FarAwayFunc, Is.EqualTo(20));
baz.SetMethod(1);
baz.SetMethod(Bar.ProtectedNestedEnum.Item1);
Assert.That(baz.P, Is.EqualTo(5));
baz.PublicDouble = 1.5;
Assert.That(baz.PublicDouble, Is.EqualTo(1.5));

2
tests/CSharp/CSharp.cpp

@ -312,7 +312,7 @@ Qux Baz::returnQux() @@ -312,7 +312,7 @@ Qux Baz::returnQux()
return Qux();
}
void Baz::setMethod(int value)
void Baz::setMethod(ProtectedNestedEnum value)
{
}

9
tests/CSharp/CSharp.h

@ -116,6 +116,13 @@ public: @@ -116,6 +116,13 @@ public:
double publicDouble;
};
protected:
enum class ProtectedNestedEnum
{
Item1,
Item2
};
private:
int index;
Foo m_foo;
@ -149,7 +156,7 @@ public: @@ -149,7 +156,7 @@ public:
int takesQux(const Qux& qux);
Qux returnQux();
void setMethod(int value);
void setMethod(ProtectedNestedEnum value);
typedef bool (*FunctionTypedef)(const void *);
FunctionTypedef functionTypedef;

Loading…
Cancel
Save