From 1a4d2ea9009e7e905090ceaa9d26d23716f2e785 Mon Sep 17 00:00:00 2001 From: gugavaro Date: Mon, 10 Feb 2020 14:04:01 -0500 Subject: [PATCH] Marking constant fields that will be removed in the next version as Obsolete error --- .vscode/launch.json | 66 +++++++++++++------ .../Unit-Tests/CodeGeneratorTests.cs | 8 +-- .../Unit-Tests/SupportTypes.cs | 5 +- .../EnumerationFixup/EnumerationFixup.xml | 7 +- .../Xamarin.Test.DeprecatedItems.cs | 34 ++++++++++ .../CodeGenerator.cs | 6 +- .../XmlApiImporter.cs | 1 + .../Field.cs | 1 + .../EnumMap.cs | 16 +++-- tools/generator/generator.sln | 2 +- 10 files changed, 108 insertions(+), 38 deletions(-) create mode 100644 tests/generator-Tests/expected/EnumerationFixup/Xamarin.Test.DeprecatedItems.cs diff --git a/.vscode/launch.json b/.vscode/launch.json index a7429b183..6c63e5620 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,22 +1,48 @@ { - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "name": "Launch", - "type": "mono", - "request": "launch", - "program": "${workspaceRoot}/packages/NUnit.ConsoleRunner.3.9.0/tools/nunit3-console.exe ${workspaceRoot}/bin/TestDebug/generator-Tests.dll", - "cwd": "${workspaceRoot}bin/TestDebug/" - }, - { - "name": "Attach", - "type": "mono", - "request": "attach", - "address": "localhost", - "port": 55555 - } - ] + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Launch", + "type": "mono", + "request": "launch", + "program": "${workspaceRoot}/packages/NUnit.ConsoleRunner.3.9.0/tools/nunit3-console.exe ${workspaceRoot}/bin/TestDebug/generator-Tests.dll", + "cwd": "${workspaceRoot}bin/TestDebug/" + }, + { + "name": "Attach", + "type": "mono", + "request": "attach", + "address": "localhost", + "port": 55555 + }, + { + "name": "Launch Generator", + "type": "mono", + "request": "launch", + "preLaunchTask": "Build Generator", + "program": "${workspaceRoot}/bin/TestDebug/generator.exe", + "args": [ + "--public", + "--product-version=7", + "--api-level=29", + "-o=obj/Debug/android-29/mcw/", + "--codegen-target=XAJavaInterop1", + "--fixup=metadata", + "--preserve-enums", + "--enumflags=enumflags", + "--enumfields=map.csv", + "--enummethods=methodmap.csv", + "--enummetadata=obj/Debug/android-29/mcw/enummetadata", + "--apiversions=${env:HOME}/android-toolchain/sdk/platforms/android-29/data/api-versions.xml", + "--annotations=${env:HOME}/android-toolchain/sdk/platforms/android-29/data/annotations.zip", + "--type-map-report=obj/Debug/android-29/mcw/type-mapping.txt", + "--enumdir=obj/Debug/android-29/mcw", + "obj/Debug/android-29/mcw/api.xml" + ], + "cwd": "${workspaceRoot}/../xamarin-android/src/Mono.Android", + } + ] } \ No newline at end of file diff --git a/tests/generator-Tests/Unit-Tests/CodeGeneratorTests.cs b/tests/generator-Tests/Unit-Tests/CodeGeneratorTests.cs index 8df7ff753..b524289ef 100644 --- a/tests/generator-Tests/Unit-Tests/CodeGeneratorTests.cs +++ b/tests/generator-Tests/Unit-Tests/CodeGeneratorTests.cs @@ -346,11 +346,11 @@ public void WriteDeprecatedField () { var comment = "Don't use this!"; var @class = new TestClass ("java.lang.Object", "com.mypackage.foo"); - var field = new TestField ("int", "bar").SetConstant ("1234").SetDeprecated (comment); + var field = new TestField ("int", "bar").SetConstant ("1234").SetDeprecated (comment, true); Assert.IsTrue (field.Validate (options, new GenericParameterDefinitionList (), new CodeGeneratorContext ()), "field.Validate failed!"); generator.WriteField (field, string.Empty, @class); - StringAssert.Contains ($"[Obsolete (\"{comment}\")]", builder.ToString (), "Should contain ObsoleteAttribute!"); + StringAssert.Contains ($"[Obsolete (\"{comment}\", error: true)]", builder.ToString (), "Should contain ObsoleteAttribute!"); } [Test] @@ -535,7 +535,7 @@ public void WriteInterfaceEventArgs () var iface = SupportTypeBuilder.CreateInterface ("java.code.IMyInterface", options); generator.Context.ContextTypes.Push (iface); - generator.WriteInterfaceEventArgs (iface, iface.Methods[0], string.Empty); + generator.WriteInterfaceEventArgs (iface, iface.Methods [0], string.Empty); generator.Context.ContextTypes.Pop (); Assert.AreEqual (GetExpected (nameof (WriteInterfaceEventArgs)), writer.ToString ().NormalizeLineEndings ()); @@ -572,7 +572,7 @@ public void WriteInterfaceEventHandlerImplContent () var handlers = new List (); generator.Context.ContextTypes.Push (iface); - generator.WriteInterfaceEventHandlerImplContent (iface, iface.Methods[0], string.Empty, true, string.Empty, handlers); + generator.WriteInterfaceEventHandlerImplContent (iface, iface.Methods [0], string.Empty, true, string.Empty, handlers); generator.Context.ContextTypes.Pop (); Assert.AreEqual (1, handlers.Count); diff --git a/tests/generator-Tests/Unit-Tests/SupportTypes.cs b/tests/generator-Tests/Unit-Tests/SupportTypes.cs index 9ce051837..ed9f4cb1d 100644 --- a/tests/generator-Tests/Unit-Tests/SupportTypes.cs +++ b/tests/generator-Tests/Unit-Tests/SupportTypes.cs @@ -64,9 +64,10 @@ public TestField SetEnumified () return this; } - public TestField SetDeprecated (string comment = null) + public TestField SetDeprecated (string comment = null, bool error = false) { IsDeprecated = true; + IsDeprecatedError = error; DeprecatedComment = comment; return this; } @@ -280,7 +281,7 @@ public static TestInterface CreateInterface (string interfaceName, CodeGeneratio return iface; } - public static TestMethod CreateMethod (GenBase parent, string methodName, CodeGenerationOptions options, string returnType = "void", bool isStatic = false, bool isAbstract = false, params Parameter[] parameters) + public static TestMethod CreateMethod (GenBase parent, string methodName, CodeGenerationOptions options, string returnType = "void", bool isStatic = false, bool isAbstract = false, params Parameter [] parameters) { var method = new TestMethod (parent, methodName, returnType); diff --git a/tests/generator-Tests/expected/EnumerationFixup/EnumerationFixup.xml b/tests/generator-Tests/expected/EnumerationFixup/EnumerationFixup.xml index 168aa2a3d..758f2bec3 100644 --- a/tests/generator-Tests/expected/EnumerationFixup/EnumerationFixup.xml +++ b/tests/generator-Tests/expected/EnumerationFixup/EnumerationFixup.xml @@ -5,7 +5,7 @@ - @@ -18,7 +18,7 @@ - @@ -33,6 +33,9 @@ + + + diff --git a/tests/generator-Tests/expected/EnumerationFixup/Xamarin.Test.DeprecatedItems.cs b/tests/generator-Tests/expected/EnumerationFixup/Xamarin.Test.DeprecatedItems.cs new file mode 100644 index 000000000..5f60861aa --- /dev/null +++ b/tests/generator-Tests/expected/EnumerationFixup/Xamarin.Test.DeprecatedItems.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using Android.Runtime; + +namespace Xamarin.Test { + + // Metadata.xml XPath class reference: path="/api/package[@name='xamarin.test']/class[@name='DeprecatedItems']" + [global::Android.Runtime.Register ("xamarin/test/DeprecatedItems", DoNotGenerateAcw=true)] + public partial class DeprecatedItems : global::Java.Lang.Object { + + + // Metadata.xml XPath field reference: path="/api/package[@name='xamarin.test']/class[@name='DeprecatedItems']/field[@name='My_Test_Field']" + [Register ("My_Test_Field")] + [Obsolete ("Field is deprecated", error: true)] + public const int MyTestField = (int) 1; + internal static new IntPtr java_class_handle; + internal static new IntPtr class_ref { + get { + return JNIEnv.FindClass ("xamarin/test/DeprecatedItems", ref java_class_handle); + } + } + + protected override IntPtr ThresholdClass { + get { return class_ref; } + } + + protected override global::System.Type ThresholdType { + get { return typeof (DeprecatedItems); } + } + + protected DeprecatedItems (IntPtr javaReference, JniHandleOwnership transfer) : base (javaReference, transfer) {} + + } +} diff --git a/tools/generator/Java.Interop.Tools.Generator.CodeGeneration/CodeGenerator.cs b/tools/generator/Java.Interop.Tools.Generator.CodeGeneration/CodeGenerator.cs index a0a1d77ea..074c942ca 100644 --- a/tools/generator/Java.Interop.Tools.Generator.CodeGeneration/CodeGenerator.cs +++ b/tools/generator/Java.Interop.Tools.Generator.CodeGeneration/CodeGenerator.cs @@ -437,8 +437,10 @@ internal virtual void WriteField (Field field, string indent, GenBase type) } else { writer.WriteLine ("{0}// Metadata.xml XPath field reference: path=\"{1}/field[@name='{2}']\"", indent, type.MetadataXPathReference, field.JavaName); writer.WriteLine ("{0}[Register (\"{1}\"{2})]", indent, field.JavaName, field.AdditionalAttributeString ()); - if (field.IsDeprecated) - writer.WriteLine ("{0}[Obsolete (\"{1}\")]", indent, field.DeprecatedComment); + if (field.IsDeprecated) { + var deprecatedError = field.IsDeprecatedError ? ", error: true" : string.Empty; + writer.WriteLine ("{0}[Obsolete (\"{1}\"{2})]", indent, field.DeprecatedComment, deprecatedError); + } if (field.Annotation != null) writer.WriteLine ("{0}{1}", indent, field.Annotation); diff --git a/tools/generator/Java.Interop.Tools.Generator.Importers/XmlApiImporter.cs b/tools/generator/Java.Interop.Tools.Generator.Importers/XmlApiImporter.cs index 7e4609645..f0a09eaaf 100644 --- a/tools/generator/Java.Interop.Tools.Generator.Importers/XmlApiImporter.cs +++ b/tools/generator/Java.Interop.Tools.Generator.Importers/XmlApiImporter.cs @@ -95,6 +95,7 @@ public static Field CreateField (XElement elem) DeprecatedComment = elem.XGetAttribute ("deprecated"), IsAcw = true, IsDeprecated = elem.XGetAttribute ("deprecated") != "not deprecated", + IsDeprecatedError = elem.XGetAttribute ("deprecated-error") == "true", IsFinal = elem.XGetAttribute ("final") == "true", IsStatic = elem.XGetAttribute ("static") == "true", JavaName = elem.XGetAttribute ("name"), diff --git a/tools/generator/Java.Interop.Tools.Generator.ObjectModel/Field.cs b/tools/generator/Java.Interop.Tools.Generator.ObjectModel/Field.cs index 3f5b51fac..86b165fb6 100644 --- a/tools/generator/Java.Interop.Tools.Generator.ObjectModel/Field.cs +++ b/tools/generator/Java.Interop.Tools.Generator.ObjectModel/Field.cs @@ -11,6 +11,7 @@ public class Field : ApiVersionsSupport.IApiAvailability public string DeprecatedComment { get; set; } public bool IsAcw { get; set; } public bool IsDeprecated { get; set; } + public bool IsDeprecatedError { get; set; } public bool IsEnumified { get; set; } public bool IsFinal { get; set; } public bool IsStatic { get; set; } diff --git a/tools/generator/Java.Interop.Tools.Generator.Transformation/EnumMap.cs b/tools/generator/Java.Interop.Tools.Generator.Transformation/EnumMap.cs index 82110fae7..ee11786ff 100644 --- a/tools/generator/Java.Interop.Tools.Generator.Transformation/EnumMap.cs +++ b/tools/generator/Java.Interop.Tools.Generator.Transformation/EnumMap.cs @@ -24,9 +24,9 @@ public EnumMappings (string outputDir, string outputMetadata, string version, bo fix_constants_instead_of_removing = fixConstantsInsteadOfRemove; } - internal Dictionary Process (string fieldMap, string flagsFile, string methodMap) + internal Dictionary Process (string fieldMap, string flagsFile, string methodMap) { - remove_nodes = new List> (); + remove_nodes = new List> (); var enums = (fieldMap ?? "").EndsWith (".csv") ? ParseFieldMappings (fieldMap, flagsFile, version, remove_nodes) : ParseXmlFieldMappings (fieldMap, version, remove_nodes); @@ -48,12 +48,12 @@ internal Dictionary Process (string fieldMap, string fla FixOldConstants (sw); else RemoveOldConstants (sw); - + sw.WriteLine (""); } return enums; } - + // void RemoveOldConstants (StreamWriter sw) { @@ -81,14 +81,16 @@ void FixOldConstants (StreamWriter sw) if (pair.Value != null) { sw.WriteLine (" {4}", - package, type, member, enu.StartsWith ("I:") ? "interface" : "class", pair.Value); + package, type, member, enu.StartsWith ("I:") ? "interface" : "class", pair.Value); sw.WriteLine (" This constant will be removed in the future version. Use {4} enum directly instead of this field.", - package, type, member, enu.StartsWith ("I:") ? "interface" : "class", pair.Value); + package, type, member, enu.StartsWith ("I:") ? "interface" : "class", pair.Value); + sw.WriteLine (" true", + package, type, member, enu.StartsWith ("I:") ? "interface" : "class", pair.Value); continue; } try { sw.WriteLine (" ", - package, type, member, enu.StartsWith ("I:") ? "interface" : "class"); + package, type, member, enu.StartsWith ("I:") ? "interface" : "class"); } catch (Exception) { Console.Error.WriteLine ("ERROR: failed to remove old comments: " + enu); throw; diff --git a/tools/generator/generator.sln b/tools/generator/generator.sln index e962bf22b..ce45e4310 100644 --- a/tools/generator/generator.sln +++ b/tools/generator/generator.sln @@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2012 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "generator", "generator.csproj", "{D14A1B5C-2060-4930-92BE-F7190256C735}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "generator-Tests", "Tests\generator-Tests.csproj", "{4EEAB1A7-99C1-4302-9C18-01A7B481409B}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "generator-Tests", "..\..\tests\generator-Tests\generator-Tests.csproj", "{4EEAB1A7-99C1-4302-9C18-01A7B481409B}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution