diff --git a/tests/generator-Tests/Unit-Tests/CodeGeneratorTests.cs b/tests/generator-Tests/Unit-Tests/CodeGeneratorTests.cs index 5b13ab221..612ff56d7 100644 --- a/tests/generator-Tests/Unit-Tests/CodeGeneratorTests.cs +++ b/tests/generator-Tests/Unit-Tests/CodeGeneratorTests.cs @@ -1138,6 +1138,12 @@ public void FixupDeprecatedBaseMethods () var gens = ParseApiDefinition (xml); + // Override method should not be marked deprecated because it's: deprecated='not deprecated' + Assert.IsNull (gens.Single (g => g.Name == "MyClass").Methods.Single (m => m.Name == "DoStuff").Deprecated); + + options.FixObsoleteOverrides = true; + gens = ParseApiDefinition (xml); + // Override method should be marked deprecated because base method is Assert.AreEqual ("deprecated", gens.Single (g => g.Name == "MyClass").Methods.Single (m => m.Name == "DoStuff").Deprecated); } @@ -1158,6 +1164,7 @@ public void FixupDeprecatedSinceBaseMethods () "; + options.FixObsoleteOverrides = true; var gens = ParseApiDefinition (xml); // Override method should match base method's 'deprecated-since' diff --git a/tools/generator/CodeGenerationOptions.cs b/tools/generator/CodeGenerationOptions.cs index 2b40edee1..5cd5ecb97 100644 --- a/tools/generator/CodeGenerationOptions.cs +++ b/tools/generator/CodeGenerationOptions.cs @@ -65,6 +65,7 @@ public SymbolTable SymbolTable { public bool UseShallowReferencedTypes { get; set; } public bool UseObsoletedOSPlatformAttributes { get; set; } public bool UseRestrictToAttributes { get; set; } + public bool FixObsoleteOverrides { get; set; } public bool RemoveConstSugar => BuildingCoreAssembly; bool? buildingCoreAssembly; diff --git a/tools/generator/CodeGenerator.cs b/tools/generator/CodeGenerator.cs index da7ff8d31..c50c3b947 100644 --- a/tools/generator/CodeGenerator.cs +++ b/tools/generator/CodeGenerator.cs @@ -85,6 +85,7 @@ static void Run (CodeGeneratorOptions options, DirectoryAssemblyResolver resolve SupportNullableReferenceTypes = options.SupportNullableReferenceTypes, UseObsoletedOSPlatformAttributes = options.UseObsoletedOSPlatformAttributes, UseRestrictToAttributes = options.UseRestrictToAttributes, + FixObsoleteOverrides = options.FixObsoleteOverrides, }; var resolverCache = new TypeDefinitionCache (); diff --git a/tools/generator/CodeGeneratorOptions.cs b/tools/generator/CodeGeneratorOptions.cs index a396b88cd..0e9d96756 100644 --- a/tools/generator/CodeGeneratorOptions.cs +++ b/tools/generator/CodeGeneratorOptions.cs @@ -53,6 +53,7 @@ public CodeGeneratorOptions () public bool SupportNestedInterfaceTypes { get; set; } public bool SupportNullableReferenceTypes { get; set; } public bool UseRestrictToAttributes { get; set; } + public bool FixObsoleteOverrides { get; set;} = true; public bool UseLegacyJavaResolver { get; set; } public bool UseObsoletedOSPlatformAttributes { get; set; } @@ -104,7 +105,7 @@ public static CodeGeneratorOptions Parse (string[] args) "SDK Platform {VERSION}/API level.", v => opts.ApiLevel = v }, { "lang-features=", - "For internal use. (Flags: interface-constants,default-interface-methods,nested-interface-types,nullable-reference-types,obsoleted-platform-attributes,restrict-to-attributes)", + "For internal use. (Flags: interface-constants,default-interface-methods,nested-interface-types,nullable-reference-types,obsoleted-platform-attributes,restrict-to-attributes,do-not-fix-obsolete-overrides)", v => { opts.SupportInterfaceConstants = v?.Contains ("interface-constants") == true; opts.SupportDefaultInterfaceMethods = v?.Contains ("default-interface-methods") == true; @@ -112,6 +113,7 @@ public static CodeGeneratorOptions Parse (string[] args) opts.SupportNullableReferenceTypes = v?.Contains ("nullable-reference-types") == true; opts.UseObsoletedOSPlatformAttributes = v?.Contains ("obsoleted-platform-attributes") == true; opts.UseRestrictToAttributes = v?.Contains ("restrict-to-attributes") == true; + opts.FixObsoleteOverrides = v?.Contains ("do-not-fix-obsolete-overrides") == false; }}, { "preserve-enums", "For internal use.", diff --git a/tools/generator/Java.Interop.Tools.Generator.ObjectModel/GenBase.cs b/tools/generator/Java.Interop.Tools.Generator.ObjectModel/GenBase.cs index 7189073e4..c387b68e0 100644 --- a/tools/generator/Java.Interop.Tools.Generator.ObjectModel/GenBase.cs +++ b/tools/generator/Java.Interop.Tools.Generator.ObjectModel/GenBase.cs @@ -311,13 +311,15 @@ public void FixupMethodOverrides (CodeGenerationOptions opt) if (bm != null && bm.RetVal.FullName == m.RetVal.FullName) { // if return type is different, it could be still "new", not "override". m.IsOverride = true; - // If method overrides a deprecated method, it also needs to be marked as deprecated - if (bm.Deprecated.HasValue () && !m.Deprecated.HasValue ()) - m.Deprecated = bm.Deprecated; - - // Fix issue when base method was deprecated before the overriding method, set both both to base method value - if (bm.DeprecatedSince.GetValueOrDefault (0) < m.DeprecatedSince.GetValueOrDefault (0)) - m.DeprecatedSince = bm.DeprecatedSince; + if (opt.FixObsoleteOverrides) { + // If method overrides a deprecated method, it also needs to be marked as deprecated + if (bm.Deprecated.HasValue () && !m.Deprecated.HasValue ()) + m.Deprecated = bm.Deprecated; + + // Fix issue when base method was deprecated before the overriding method, set both both to base method value + if (bm.DeprecatedSince.GetValueOrDefault (0) < m.DeprecatedSince.GetValueOrDefault (0)) + m.DeprecatedSince = bm.DeprecatedSince; + } break; }