From ceb0c171319437fa86353092a0860d635695cd5a Mon Sep 17 00:00:00 2001 From: Jonathan Pobst Date: Tue, 11 Feb 2020 13:21:16 -0600 Subject: [PATCH] [generator] Change protected members in sealed class to private. --- .../Unit-Tests/SealedProtectedFixupsTests.cs | 78 +++++++++++++++++++ tools/generator/CodeGenerator.cs | 2 + .../SealedProtectedFixups.cs | 27 +++++++ tools/generator/generator.csproj | 1 + 4 files changed, 108 insertions(+) create mode 100644 tests/generator-Tests/Unit-Tests/SealedProtectedFixupsTests.cs create mode 100644 tools/generator/Java.Interop.Tools.Generator.Transformation/SealedProtectedFixups.cs diff --git a/tests/generator-Tests/Unit-Tests/SealedProtectedFixupsTests.cs b/tests/generator-Tests/Unit-Tests/SealedProtectedFixupsTests.cs new file mode 100644 index 000000000..91d3b499c --- /dev/null +++ b/tests/generator-Tests/Unit-Tests/SealedProtectedFixupsTests.cs @@ -0,0 +1,78 @@ +using System; +using System.Linq; +using System.Xml.Linq; +using Java.Interop.Tools.Generator.Transformation; +using MonoDroid.Generation; +using NUnit.Framework; + +namespace generatortests +{ + [TestFixture] + public class SealedProtectedFixupsTests + { + private CodeGenerationOptions options = new CodeGenerationOptions (); + + [Test] + public void FixProtectedMethod () + { + var klass = CreateSealedClass (); + + var method = SupportTypeBuilder.CreateMethod (klass, "ToString", options); + + klass.Methods.Add (method); + + method.Visibility = "protected"; + method.IsOverride = false; + + SealedProtectedFixups.Fixup (new [] { (GenBase)klass }.ToList ()); + + Assert.AreEqual ("private", method.Visibility); + } + + [Test] + public void FixProtectedProperty () + { + var klass = CreateSealedClass (); + + var method = SupportTypeBuilder.CreateProperty (klass, "Handle", "int", options); + + klass.Properties.Add (method); + + method.Getter.Visibility = "protected"; + method.Getter.IsOverride = false; + + method.Setter.Visibility = "protected"; + method.Setter.IsOverride = false; + + SealedProtectedFixups.Fixup (new [] { (GenBase) klass }.ToList ()); + + Assert.AreEqual ("private", method.Getter.Visibility); + Assert.AreEqual ("private", method.Setter.Visibility); + } + + [Test] + public void FixProtectedField () + { + var klass = CreateSealedClass (); + + var field = new Field { + Name = "MyConstant", + TypeName = "int", + Visibility = "protected" + }; + + klass.Fields.Add (field); + + SealedProtectedFixups.Fixup (new [] { (GenBase) klass }.ToList ()); + + Assert.AreEqual ("private", field.Visibility); + } + + private ClassGen CreateSealedClass () + { + var klass = SupportTypeBuilder.CreateClass ("my.example.class", options); + klass.IsFinal = true; + return klass; + } + } +} diff --git a/tools/generator/CodeGenerator.cs b/tools/generator/CodeGenerator.cs index 11d3f5409..e6cbf2417 100644 --- a/tools/generator/CodeGenerator.cs +++ b/tools/generator/CodeGenerator.cs @@ -172,6 +172,8 @@ static void Run (CodeGeneratorOptions options, DirectoryAssemblyResolver resolve foreach (GenBase gen in gens) gen.FixupExplicitImplementation (); + SealedProtectedFixups.Fixup (gens); + GenerateAnnotationAttributes (gens, annotations_zips); //SymbolTable.Dump (); diff --git a/tools/generator/Java.Interop.Tools.Generator.Transformation/SealedProtectedFixups.cs b/tools/generator/Java.Interop.Tools.Generator.Transformation/SealedProtectedFixups.cs new file mode 100644 index 000000000..6933a729d --- /dev/null +++ b/tools/generator/Java.Interop.Tools.Generator.Transformation/SealedProtectedFixups.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using MonoDroid.Generation; + +namespace Java.Interop.Tools.Generator.Transformation +{ + public static class SealedProtectedFixups + { + public static void Fixup (List gens) + { + foreach (var c in gens.OfType ().Where (c => c.IsFinal)) { + foreach (var m in c.Methods.Where (m => m.Visibility == "protected" && !m.IsOverride)) + m.Visibility = "private"; + + foreach (var p in c.Properties.Where (p => p.Getter?.Visibility == "protected" && !p.Getter.IsOverride)) + p.Getter.Visibility = "private"; + + foreach (var p in c.Properties.Where (p => p.Setter?.Visibility == "protected" && !p.Setter.IsOverride)) + p.Setter.Visibility = "private"; + + foreach (var p in c.Fields.Where (f => f.Visibility == "protected")) + p.Visibility = "private"; + } + } + } +} diff --git a/tools/generator/generator.csproj b/tools/generator/generator.csproj index 9b3f96404..9c5f6f426 100644 --- a/tools/generator/generator.csproj +++ b/tools/generator/generator.csproj @@ -104,6 +104,7 @@ +