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)