Skip to content

Commit d9a33ba

Browse files
committed
Ensure protected nested types are accessible with multiple inheritance
Fixes #594. Signed-off-by: Dimitar Dobrev <[email protected]>
1 parent c6ffa9d commit d9a33ba

File tree

5 files changed

+48
-3
lines changed

5 files changed

+48
-3
lines changed

src/Generator/Driver.cs

+1
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,7 @@ public void SetupPasses(ILibrary library)
251251
TranslationUnitPasses.AddPass(new FieldToPropertyPass());
252252
TranslationUnitPasses.AddPass(new CheckIgnoredDeclsPass());
253253
TranslationUnitPasses.AddPass(new CheckFlagEnumsPass());
254+
TranslationUnitPasses.AddPass(new MakeProtectedNestedTypesPublicPass());
254255

255256
if (Options.IsCSharpGenerator)
256257
{
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
using System.Collections.Generic;
2+
using System.Linq;
3+
using CppSharp.AST;
4+
5+
namespace CppSharp.Passes
6+
{
7+
public class MakeProtectedNestedTypesPublicPass : TranslationUnitPass
8+
{
9+
public MakeProtectedNestedTypesPublicPass()
10+
{
11+
VisitOptions.VisitClassBases = false;
12+
VisitOptions.VisitClassFields = false;
13+
VisitOptions.VisitClassTemplateSpecializations = false;
14+
VisitOptions.VisitEventParameters = false;
15+
VisitOptions.VisitFunctionParameters = false;
16+
VisitOptions.VisitFunctionReturnType = false;
17+
VisitOptions.VisitNamespaceEnums = false;
18+
VisitOptions.VisitNamespaceEvents = false;
19+
VisitOptions.VisitNamespaceTemplates = false;
20+
VisitOptions.VisitNamespaceTypedefs = false;
21+
VisitOptions.VisitNamespaceVariables = false;
22+
VisitOptions.VisitTemplateArguments = false;
23+
}
24+
25+
public override bool VisitClassDecl(Class @class)
26+
{
27+
if (!base.VisitClassDecl(@class))
28+
return false;
29+
30+
(from d in ((IEnumerable<Declaration>) @class.Classes).Concat(@class.Enums)
31+
where d.Access == AccessSpecifier.Protected
32+
select d).All(d => { d.Access = AccessSpecifier.Public; return true; });
33+
34+
return true;
35+
}
36+
}
37+
}

tests/CSharp/CSharp.Tests.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ public void TestMultipleInheritance()
144144
Assert.That(baz.FarAwayFunc, Is.EqualTo(20));
145145
Assert.That(baz.TakesQux(baz), Is.EqualTo(20));
146146
Assert.That(baz.ReturnQux().FarAwayFunc, Is.EqualTo(20));
147-
baz.SetMethod(1);
147+
baz.SetMethod(Bar.ProtectedNestedEnum.Item1);
148148
Assert.That(baz.P, Is.EqualTo(5));
149149
baz.PublicDouble = 1.5;
150150
Assert.That(baz.PublicDouble, Is.EqualTo(1.5));

tests/CSharp/CSharp.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,7 @@ Qux Baz::returnQux()
312312
return Qux();
313313
}
314314

315-
void Baz::setMethod(int value)
315+
void Baz::setMethod(ProtectedNestedEnum value)
316316
{
317317
}
318318

tests/CSharp/CSharp.h

+8-1
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,13 @@ class DLL_API Bar : public Qux
116116
double publicDouble;
117117
};
118118

119+
protected:
120+
enum class ProtectedNestedEnum
121+
{
122+
Item1,
123+
Item2
124+
};
125+
119126
private:
120127
int index;
121128
Foo m_foo;
@@ -149,7 +156,7 @@ class DLL_API Baz : public Foo, public Bar
149156

150157
int takesQux(const Qux& qux);
151158
Qux returnQux();
152-
void setMethod(int value);
159+
void setMethod(ProtectedNestedEnum value);
153160

154161
typedef bool (*FunctionTypedef)(const void *);
155162
FunctionTypedef functionTypedef;

0 commit comments

Comments
 (0)