From 5928a7ea9c396dacc8eeb6087868ec2c5f8041e5 Mon Sep 17 00:00:00 2001 From: Jonathan Pobst Date: Fri, 13 Mar 2020 14:31:11 -0500 Subject: [PATCH] [generator] Add api flag "no-alternatives" to skip generating interface member alternatives. --- .../DefaultInterfaceMethodsTests.cs | 33 +++++++++++++++++++ .../CodeGenerator.cs | 5 +++ .../XmlApiImporter.cs | 1 + .../InterfaceGen.cs | 4 +++ 4 files changed, 43 insertions(+) diff --git a/tests/generator-Tests/Unit-Tests/DefaultInterfaceMethodsTests.cs b/tests/generator-Tests/Unit-Tests/DefaultInterfaceMethodsTests.cs index c4ec8e4fa..d7b4f82db 100644 --- a/tests/generator-Tests/Unit-Tests/DefaultInterfaceMethodsTests.cs +++ b/tests/generator-Tests/Unit-Tests/DefaultInterfaceMethodsTests.cs @@ -363,5 +363,38 @@ public void ObsoleteInterfaceAlternativeClass () Assert.AreEqual (GetTargetedExpected (nameof (ObsoleteInterfaceAlternativeClass)), writer.ToString ().NormalizeLineEndings ()); } + + [Test] + public void RespectNoAlternativesForInterfaces () + { + // If an interface is marked with no-alternatives='true', do + // not generate any legacy alternative classes for it + options.SupportInterfaceConstants = true; + + var xml = @" + + + + + + + + + + + + + "; + + var gens = ParseApiDefinition (xml); + var iface = gens.OfType ().Single (); + + iface.Validate (options, new GenericParameterDefinitionList (), new CodeGeneratorContext ()); + + generator.WriteInterface (iface, string.Empty, new GenerationInfo (string.Empty, string.Empty, "MyAssembly")); + + Assert.False (writer.ToString ().Contains ("class ParentConsts")); + Assert.False (writer.ToString ().Contains ("class Parent")); + } } } diff --git a/tools/generator/Java.Interop.Tools.Generator.CodeGeneration/CodeGenerator.cs b/tools/generator/Java.Interop.Tools.Generator.CodeGeneration/CodeGenerator.cs index 6f187f809..a6ffef5a1 100644 --- a/tools/generator/Java.Interop.Tools.Generator.CodeGeneration/CodeGenerator.cs +++ b/tools/generator/Java.Interop.Tools.Generator.CodeGeneration/CodeGenerator.cs @@ -732,6 +732,11 @@ public void WriteInterfaceImplementedMembersAlternative (InterfaceGen @interface // in order to maintain backward compatibility. // If we're creating a binding that supports DIM, we remove the XXXConsts class as they've been // [Obsolete:iserror] for a long time, and we add [Obsolete] to the interface "class". + + // Bail if requested we not produce alternative classes for this interface + if (@interface.NoAlternatives) + return; + var staticMethods = @interface.Methods.Where (m => m.IsStatic); var should_obsolete = opt.SupportInterfaceConstants && opt.SupportDefaultInterfaceMethods; diff --git a/tools/generator/Java.Interop.Tools.Generator.Importers/XmlApiImporter.cs b/tools/generator/Java.Interop.Tools.Generator.Importers/XmlApiImporter.cs index 09cebba0b..0732f53af 100644 --- a/tools/generator/Java.Interop.Tools.Generator.Importers/XmlApiImporter.cs +++ b/tools/generator/Java.Interop.Tools.Generator.Importers/XmlApiImporter.cs @@ -197,6 +197,7 @@ public static InterfaceGen CreateInterface (XElement pkg, XElement elem, CodeGen var iface = new InterfaceGen (CreateGenBaseSupport (pkg, elem, true)) { ArgsType = elem.XGetAttribute ("argsType"), HasManagedName = elem.Attribute ("managedName") != null, + NoAlternatives = elem.XGetAttribute ("no-alternatives") == "true", // Only use an explicitly set XML attribute Unnest = elem.XGetAttribute ("unnest") == "true" ? true : elem.XGetAttribute ("unnest") == "false" ? false : diff --git a/tools/generator/Java.Interop.Tools.Generator.ObjectModel/InterfaceGen.cs b/tools/generator/Java.Interop.Tools.Generator.ObjectModel/InterfaceGen.cs index 844cb5d17..695fef306 100644 --- a/tools/generator/Java.Interop.Tools.Generator.ObjectModel/InterfaceGen.cs +++ b/tools/generator/Java.Interop.Tools.Generator.ObjectModel/InterfaceGen.cs @@ -186,6 +186,10 @@ public bool IsConstSugar { internal bool NeedsSender => Methods.Any (m => (m.RetVal.IsVoid && !m.Parameters.HasSender) || (m.IsEventHandlerWithHandledProperty && !m.Parameters.HasSender)); + // If true, we will no longer generate the "interface alternative" legacy classes + // used to hold interface constants/static methods before we had C#8 + public bool NoAlternatives { get; set; } + protected override bool OnValidate (CodeGenerationOptions opt, GenericParameterDefinitionList type_params, CodeGeneratorContext context) { if (validated)