From de00cb4741df58ab5f00639f3949cf281403410a Mon Sep 17 00:00:00 2001 From: Jonathan Pobst Date: Fri, 5 Jun 2020 10:52:09 -0500 Subject: [PATCH 1/2] [generator] Support XML defined enums with no JNI info. --- src/utils/EnumMappings.Xml.cs | 38 +++++--- .../Unit-Tests/EnumMappingsTests.cs | 97 +++++++++++++++++++ 2 files changed, 120 insertions(+), 15 deletions(-) diff --git a/src/utils/EnumMappings.Xml.cs b/src/utils/EnumMappings.Xml.cs index dc13f361c..8d209441e 100644 --- a/src/utils/EnumMappings.Xml.cs +++ b/src/utils/EnumMappings.Xml.cs @@ -23,25 +23,33 @@ internal static TextReader FieldXmlToCsv (string file) if (file == null) return null; + return FieldXmlToCsv (XDocument.Load (file, LoadOptions.SetBaseUri | LoadOptions.SetLineInfo)); + } + + internal static TextReader FieldXmlToCsv (XDocument doc) + { var sw = new StringWriter (); - var doc = XDocument.Load (file, LoadOptions.SetBaseUri | LoadOptions.SetLineInfo); foreach (var e in doc.XPathSelectElements ("/enum-field-mappings/mapping")) { - string enu = GetMandatoryAttribute (e, "clr-enum-type"); - string jni_type = e.Attribute ("jni-class") != null - ? e.XGetAttribute ("jni-class") - : e.Attribute ("jni-interface") != null - ? "I:" + e.XGetAttribute ("jni-interface") - : GetMandatoryAttribute (e, "jni-class or jni-interface"); - bool bitfield = e.Attribute ("bitfield") != null && e.XGetAttribute ("bitfield") == "true"; + + var enu = GetMandatoryAttribute (e, "clr-enum-type"); + var jni_type = e.XGetAttribute ("jni-class") ?? "I:" + e.XGetAttribute ("jni-interface"); + + // If neither jni was specified leave it blank + if (jni_type == "I:") + jni_type = string.Empty; + + var bitfield = e.XGetAttribute ("bitfield") == "true"; + foreach (var m in e.XPathSelectElements ("field")) { - string verstr = m.Attribute ("api-level") != null - ? m.XGetAttribute ("api-level") - : "0"; - string member = GetMandatoryAttribute (m, "clr-name"); - string jni_name = GetMandatoryAttribute (m, "jni-name"); - string value = GetMandatoryAttribute (m, "value"); - sw.WriteLine ("{0}, {1}, {2}, {3}, {4}{5}", verstr, enu, member, jni_type + '.' + jni_name, value, bitfield ? ", Flags" : null); + var verstr = m.XGetAttribute ("api-level") ?? "0"; + var member = GetMandatoryAttribute (m, "clr-name"); + var jni_name = m.XGetAttribute ("jni-name"); + var value = GetMandatoryAttribute (m, "value"); + + var jni_member = string.IsNullOrWhiteSpace (jni_name) ? string.Empty : jni_type + '.' + jni_name; + + sw.WriteLine ("{0}, {1}, {2}, {3}, {4}{5}", verstr, enu, member, jni_member, value, bitfield ? ", Flags" : null); } } diff --git a/tests/generator-Tests/Unit-Tests/EnumMappingsTests.cs b/tests/generator-Tests/Unit-Tests/EnumMappingsTests.cs index e3dcde232..4eaaf1edb 100644 --- a/tests/generator-Tests/Unit-Tests/EnumMappingsTests.cs +++ b/tests/generator-Tests/Unit-Tests/EnumMappingsTests.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; +using System.Xml.Linq; using MonoDroid.Generation; using NUnit.Framework; @@ -284,5 +285,101 @@ public void TransientEnumificationV2Test () Assert.AreEqual ("[Cdsect, I:org/xmlpull/v1/XmlPullParser.CDSECT]", enums.First ().Value.JniNames.Single ().ToString ()); Assert.AreEqual ("[Cdsect, 5]", enums.First ().Value.Members.Single ().ToString ()); } + + [Test] + public void XmlEnumMapWithJNI () + { + var xml = @" + + + + + + "; + + var doc = XDocument.Parse (xml, LoadOptions.SetBaseUri | LoadOptions.SetLineInfo); + var sr = EnumMappings.FieldXmlToCsv (doc); + + var lines = sr.ReadToEnd ().Split (new [] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); + var expected = new [] { + "0, Android.Support.V4.App.FragmentTagType, Name, android/support/v4/app/FragmentActivity$FragmentTag.Fragment_name, 0", + "0, Android.Support.V4.App.FragmentTagType, Id, android/support/v4/app/FragmentActivity$FragmentTag.Fragment_id, 1", + "0, Android.Support.V4.App.FragmentTagType, Tag, android/support/v4/app/FragmentActivity$FragmentTag.Fragment_tag, 2" + }; + + Assert.AreEqual (expected, lines); + } + + [Test] + public void XmlEnumMapWithInterfaceJNI () + { + var xml = @" + + + + + + "; + + var doc = XDocument.Parse (xml, LoadOptions.SetBaseUri | LoadOptions.SetLineInfo); + var sr = EnumMappings.FieldXmlToCsv (doc); + + var lines = sr.ReadToEnd ().Split (new [] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); + var expected = new [] { + "0, Android.Support.V4.App.FragmentTagType, Name, I:android/support/v4/app/FragmentActivity$FragmentTag.Fragment_name, 0, Flags", + "0, Android.Support.V4.App.FragmentTagType, Id, I:android/support/v4/app/FragmentActivity$FragmentTag.Fragment_id, 1, Flags", + "0, Android.Support.V4.App.FragmentTagType, Tag, I:android/support/v4/app/FragmentActivity$FragmentTag.Fragment_tag, 2, Flags" + }; + + Assert.AreEqual (expected, lines); + } + + [Test] + public void XmlEnumMapWithoutJNI () + { + var xml = @" + + + + + + "; + + var doc = XDocument.Parse (xml, LoadOptions.SetBaseUri | LoadOptions.SetLineInfo); + var sr = EnumMappings.FieldXmlToCsv (doc); + + var lines = sr.ReadToEnd ().Split (new [] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); + var expected = new [] { + "0, Android.Support.V4.App.FragmentTagType, Name, , 0, Flags", + "0, Android.Support.V4.App.FragmentTagType, Id, , 1, Flags", + "0, Android.Support.V4.App.FragmentTagType, Tag, , 2, Flags" + }; + + Assert.AreEqual (expected, lines); + } + + [Test] + public void XmlEnumMapWithMixedJNI () + { + var xml = @" + + + + + + "; + + var doc = XDocument.Parse (xml, LoadOptions.SetBaseUri | LoadOptions.SetLineInfo); + var sr = EnumMappings.FieldXmlToCsv (doc); + + var lines = sr.ReadToEnd ().Split (new [] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); + var expected = new [] { + "0, Android.Support.V4.App.FragmentTagType, Name, , 0, Flags", + "0, Android.Support.V4.App.FragmentTagType, Id, android/support/v4/app/FragmentActivity$FragmentTag.Fragment_id, 1, Flags", + "0, Android.Support.V4.App.FragmentTagType, Tag, , 2, Flags" + }; + + Assert.AreEqual (expected, lines); + } } } From 8edd6aecc9caae5d39ec1b6c1134f63748e23de2 Mon Sep 17 00:00:00 2001 From: Jonathan Pryor Date: Tue, 9 Jun 2020 10:39:21 -0400 Subject: [PATCH 2/2] Pretty-ify --- src/utils/EnumMappings.Xml.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/EnumMappings.Xml.cs b/src/utils/EnumMappings.Xml.cs index 8d209441e..fb593275b 100644 --- a/src/utils/EnumMappings.Xml.cs +++ b/src/utils/EnumMappings.Xml.cs @@ -42,7 +42,7 @@ internal static TextReader FieldXmlToCsv (XDocument doc) var bitfield = e.XGetAttribute ("bitfield") == "true"; foreach (var m in e.XPathSelectElements ("field")) { - var verstr = m.XGetAttribute ("api-level") ?? "0"; + var verstr = m.XGetAttribute ("api-level") ?? "0"; var member = GetMandatoryAttribute (m, "clr-name"); var jni_name = m.XGetAttribute ("jni-name"); var value = GetMandatoryAttribute (m, "value");