Skip to content

Commit 86eda92

Browse files
committed
[generator] Do not generate bindings for package-private nested types [#572]
1 parent 95fd014 commit 86eda92

File tree

2 files changed

+26
-0
lines changed

2 files changed

+26
-0
lines changed

tests/generator-Tests/expected/AccessModifiers/AccessModifiers.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,21 @@
1818
public class PublicClass extends PackageClass {
1919
@Override
2020
public void foo();
21+
22+
// This nested type should not be generated because it is package-private
23+
/* package */ static interface OnPressedChangeListener {
24+
void onPressedChanged ();
25+
}
2126
}
2227
-->
2328
<class abstract="false" deprecated="not deprecated" extends="xamarin.test.PackageClass" extends-generic-aware="xamarin.test.PackageClass" final="false" name="PublicClass" static="false" visibility="public">
2429
<constructor deprecated="not deprecated" final="false" name="PublicClass" static="false" visibility="public" />
2530
<method abstract="false" deprecated="not deprecated" final="false" name="foo" native="false" return="void" static="false" synchronized="false" visibility="public">
2631
</method>
2732
</class>
33+
<interface abstract="true" deprecated="not deprecated" final="false" name="PublicClass.OnPressedChangeListener" static="true" visibility="" >
34+
<method abstract="true" deprecated="not deprecated" final="false" name="onPressedChanged" jni-signature="V" bridge="false" native="false" return="void" jni-return="V" static="false" synchronized="false" synthetic="false" visibility="public" />
35+
</interface>
2836
<!--
2937
/* package */ abstract class ExtendPackageClass extends PackageClass {
3038
}

tools/generator/CodeGenerator.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,8 @@ static void Validate (List<GenBase> gens, CodeGenerationOptions opt, CodeGenerat
231231
{
232232
//int cycle = 1;
233233
List<GenBase> removed = new List<GenBase> ();
234+
var nested_removes = new List<GenBase> ();
235+
234236
// This loop is required because we cannot really split type validation and member
235237
// validation apart (unlike C# compiler), because invalidated members will result
236238
// in the entire interface invalidation (since we cannot implement it), and use of
@@ -253,6 +255,22 @@ static void Validate (List<GenBase> gens, CodeGenerationOptions opt, CodeGenerat
253255
removed.Add (gen);
254256
}
255257

258+
// Remove any nested types that are package-private
259+
foreach (var gen in gens) {
260+
foreach (var nest in gen.NestedTypes)
261+
if (opt.IgnoreNonPublicType && (nest.RawVisibility != "public" && nest.RawVisibility != "internal")) {
262+
// We still add it to "removed" even though the removal
263+
// code later won't work, so that it triggers a new cycle
264+
removed.Add (nest);
265+
nested_removes.Add (nest);
266+
}
267+
268+
foreach (var nest in nested_removes)
269+
gen.NestedTypes.Remove (nest);
270+
271+
nested_removes.Clear ();
272+
}
273+
256274
foreach (GenBase gen in removed)
257275
gens.Remove (gen);
258276
} while (removed.Count > 0);

0 commit comments

Comments
 (0)