From e4a4308de5d1da19f2efccba54165786979e4999 Mon Sep 17 00:00:00 2001 From: Redth Date: Wed, 26 Oct 2016 13:40:27 -0400 Subject: [PATCH 1/3] Added ApiXml file doc parser This will parse parameter names from an xml file in the api.xml format. --- .../ClassPath.cs | 16 +++--- .../JavaDocumentScraper.cs | 52 ++++++++++++++++++- tools/class-parse/Program.cs | 1 + 3 files changed, 60 insertions(+), 9 deletions(-) diff --git a/src/Xamarin.Android.Tools.Bytecode/ClassPath.cs b/src/Xamarin.Android.Tools.Bytecode/ClassPath.cs index 9d4db08f4..d72b46016 100644 --- a/src/Xamarin.Android.Tools.Bytecode/ClassPath.cs +++ b/src/Xamarin.Android.Tools.Bytecode/ClassPath.cs @@ -17,6 +17,7 @@ public enum JavaDocletType { Java6, Java7, Java8, + ApiXml } public class ClassPath { @@ -217,20 +218,21 @@ void FixupParametersFromDocs (XElement api) if (DocumentationPaths == null) return; foreach (var path in DocumentationPaths) { - if (!Directory.Exists (path)) + if (!Directory.Exists (path) && !File.Exists (path)) continue; FixupParametersFromDocs (api, path); } } - AndroidDocScraper CreateDocScraper (string dir) + IAndroidDocScraper CreateDocScraper (string src) { switch (DocletType) { - default: return new DroidDoc2Scraper (dir); - case JavaDocletType.DroidDoc: return new DroidDocScraper (dir); - case JavaDocletType.Java6: return new JavaDocScraper (dir); - case JavaDocletType.Java7: return new Java7DocScraper (dir); - case JavaDocletType.Java8: return new Java8DocScraper (dir); + default: return new DroidDoc2Scraper (src); + case JavaDocletType.DroidDoc: return new DroidDocScraper (src); + case JavaDocletType.Java6: return new JavaDocScraper (src); + case JavaDocletType.Java7: return new Java7DocScraper (src); + case JavaDocletType.Java8: return new Java8DocScraper (src); + case JavaDocletType.ApiXml: return new ApiXmlDocScraper(src); } } diff --git a/src/Xamarin.Android.Tools.Bytecode/JavaDocumentScraper.cs b/src/Xamarin.Android.Tools.Bytecode/JavaDocumentScraper.cs index be69ce441..1438841f6 100644 --- a/src/Xamarin.Android.Tools.Bytecode/JavaDocumentScraper.cs +++ b/src/Xamarin.Android.Tools.Bytecode/JavaDocumentScraper.cs @@ -125,7 +125,7 @@ public Java8DocScraper (string dir) } } - public abstract class AndroidDocScraper + public abstract class AndroidDocScraper : IAndroidDocScraper { readonly String pattern_head; readonly String reset_pattern_head; @@ -269,6 +269,54 @@ public static void LoadXml (String filename) } catch (Exception ex) { Log.Error ("Annotations parser error: " + ex); } - } + } + } + + public interface IAndroidDocScraper + { + String[] GetParameterNames (string package, string type, string method, string[] ptypes, bool isVarArgs); + } + + public class ApiXmlDocScraper : IAndroidDocScraper + { + public ApiXmlDocScraper (string apiXmlFile) + { + xdoc = XDocument.Load (apiXmlFile); + } + + XDocument xdoc; + + public string[] GetParameterNames (string package, string type, string method, string[] ptypes, bool isVarArgs) + { + var methodOrCtor = method == "constructor" ? + "constructor[" : $"method[@name='{method}'"; + + var pcount = ptypes.Length; + + var xpath = new StringBuilder (); + + xpath.Append ($"/api/package[@name='{package}']/*[self::class or self::interface]/"); + + if (method == "constructor") + xpath.Append ("constructor["); + else + xpath.Append ($"method[@name='{method}'"); + + xpath.Append ($" and count(parameter)={pcount}"); + + if (pcount > 0) { + xpath.Append (" and "); + xpath.Append (string.Join (" and ", ptypes.Select ((pt, pindex) => $"parameter[{pindex + 1}][@type='{pt}']"))); + } + + xpath.Append ("]"); + + var methodElem = xdoc.XPathSelectElement (xpath.ToString ()); + + if (methodElem != null) + return methodElem.Elements ("parameter").Select (pe => pe.Attribute ("name")?.Value).ToArray (); + + return new string[0]; + } } } diff --git a/tools/class-parse/Program.cs b/tools/class-parse/Program.cs index 8b85470a4..a426ca699 100644 --- a/tools/class-parse/Program.cs +++ b/tools/class-parse/Program.cs @@ -94,6 +94,7 @@ public static void Main (string[] args) { "java6", JavaDocletType.Java6 }, { "java7", JavaDocletType.Java7 }, { "java8", JavaDocletType.Java8 }, + { "apixml", JavaDocletType.ApiXml }, }; static JavaDocletType GetJavaDocletType (string value) From 72aaf7cd246c2b0b33bfab06d14e6016a81dd01c Mon Sep 17 00:00:00 2001 From: Redth Date: Wed, 26 Oct 2016 13:40:53 -0400 Subject: [PATCH 2/3] Added test for ApiXml doc parser --- .../Tests/ClassFileFixture.cs | 6 ++++- .../Tests/ParameterFixupApiXmlDocs.xml | 10 ++++++++ .../Tests/ParameterFixupTests.cs | 25 +++++++++++++++++++ ...amarin.Android.Tools.Bytecode-Tests.csproj | 3 +++ 4 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 src/Xamarin.Android.Tools.Bytecode/Tests/ParameterFixupApiXmlDocs.xml diff --git a/src/Xamarin.Android.Tools.Bytecode/Tests/ClassFileFixture.cs b/src/Xamarin.Android.Tools.Bytecode/Tests/ClassFileFixture.cs index 3fa30b30c..e305de8f2 100644 --- a/src/Xamarin.Android.Tools.Bytecode/Tests/ClassFileFixture.cs +++ b/src/Xamarin.Android.Tools.Bytecode/Tests/ClassFileFixture.cs @@ -25,7 +25,7 @@ protected static string LoadString (string resource) return r.ReadToEnd (); } - protected static void AssertXmlDeclaration (string classResource, string xmlResource, string documentationPath = null) + protected static void AssertXmlDeclaration (string classResource, string xmlResource, string documentationPath = null, JavaDocletType? javaDocletType = null) { var classPathBuilder = new ClassPath () { ApiSource = "class-parse", @@ -33,10 +33,14 @@ protected static void AssertXmlDeclaration (string classResource, string xmlReso documentationPath, }, }; + if (javaDocletType.HasValue) + classPathBuilder.DocletType = javaDocletType.Value; classPathBuilder.Add (LoadClassFile (classResource)); var actual = new StringWriter (); classPathBuilder.ApiSource = "class-parse"; + if (javaDocletType.HasValue) + classPathBuilder.DocletType = javaDocletType.Value; classPathBuilder.SaveXmlDescription (actual); var expected = LoadString (xmlResource); diff --git a/src/Xamarin.Android.Tools.Bytecode/Tests/ParameterFixupApiXmlDocs.xml b/src/Xamarin.Android.Tools.Bytecode/Tests/ParameterFixupApiXmlDocs.xml new file mode 100644 index 000000000..81696912a --- /dev/null +++ b/src/Xamarin.Android.Tools.Bytecode/Tests/ParameterFixupApiXmlDocs.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/Xamarin.Android.Tools.Bytecode/Tests/ParameterFixupTests.cs b/src/Xamarin.Android.Tools.Bytecode/Tests/ParameterFixupTests.cs index 410a1990e..bd2feae36 100644 --- a/src/Xamarin.Android.Tools.Bytecode/Tests/ParameterFixupTests.cs +++ b/src/Xamarin.Android.Tools.Bytecode/Tests/ParameterFixupTests.cs @@ -29,6 +29,31 @@ public void XmlDeclaration_FixedUpFromDocumentation() } } + [Test] + public void XmlDeclaration_FixedUpFromApiXmlDocumentation() + { + string tempFile = null; + + try + { + tempFile = Path.GetTempFileName(); + File.WriteAllText(tempFile, LoadString("ParameterFixupApiXmlDocs.xml")); + + AssertXmlDeclaration("Collection.class", "ParameterFixupFromDocs.xml", tempFile, Bytecode.JavaDocletType.ApiXml); + } + catch (Exception ex) + { + try + { + if (File.Exists(tempFile)) + File.Delete(tempFile); + } + catch { } + + Assert.Fail("An unexpected exception was thrown : {0}", ex); + } + } + [Test] public void XmlDeclaration_DoesNotThrowAnExceptionIfDocumentationNotFound () { diff --git a/src/Xamarin.Android.Tools.Bytecode/Tests/Xamarin.Android.Tools.Bytecode-Tests.csproj b/src/Xamarin.Android.Tools.Bytecode/Tests/Xamarin.Android.Tools.Bytecode-Tests.csproj index e710d0487..efa111cc3 100644 --- a/src/Xamarin.Android.Tools.Bytecode/Tests/Xamarin.Android.Tools.Bytecode-Tests.csproj +++ b/src/Xamarin.Android.Tools.Bytecode/Tests/Xamarin.Android.Tools.Bytecode-Tests.csproj @@ -151,6 +151,9 @@ Collection.class + + ParameterFixupApiXmlDocs.xml + From 56769ff94ce9b8680eedf52900aff62f84143850 Mon Sep 17 00:00:00 2001 From: Redth Date: Thu, 27 Oct 2016 09:19:26 -0400 Subject: [PATCH 3/3] Make name more obviously for internal use --- src/Xamarin.Android.Tools.Bytecode/ClassPath.cs | 4 ++-- .../Tests/ParameterFixupTests.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Xamarin.Android.Tools.Bytecode/ClassPath.cs b/src/Xamarin.Android.Tools.Bytecode/ClassPath.cs index d72b46016..aee01e485 100644 --- a/src/Xamarin.Android.Tools.Bytecode/ClassPath.cs +++ b/src/Xamarin.Android.Tools.Bytecode/ClassPath.cs @@ -17,7 +17,7 @@ public enum JavaDocletType { Java6, Java7, Java8, - ApiXml + _ApiXml } public class ClassPath { @@ -232,7 +232,7 @@ IAndroidDocScraper CreateDocScraper (string src) case JavaDocletType.Java6: return new JavaDocScraper (src); case JavaDocletType.Java7: return new Java7DocScraper (src); case JavaDocletType.Java8: return new Java8DocScraper (src); - case JavaDocletType.ApiXml: return new ApiXmlDocScraper(src); + case JavaDocletType._ApiXml: return new ApiXmlDocScraper (src); } } diff --git a/src/Xamarin.Android.Tools.Bytecode/Tests/ParameterFixupTests.cs b/src/Xamarin.Android.Tools.Bytecode/Tests/ParameterFixupTests.cs index bd2feae36..e7b4035e3 100644 --- a/src/Xamarin.Android.Tools.Bytecode/Tests/ParameterFixupTests.cs +++ b/src/Xamarin.Android.Tools.Bytecode/Tests/ParameterFixupTests.cs @@ -39,7 +39,7 @@ public void XmlDeclaration_FixedUpFromApiXmlDocumentation() tempFile = Path.GetTempFileName(); File.WriteAllText(tempFile, LoadString("ParameterFixupApiXmlDocs.xml")); - AssertXmlDeclaration("Collection.class", "ParameterFixupFromDocs.xml", tempFile, Bytecode.JavaDocletType.ApiXml); + AssertXmlDeclaration("Collection.class", "ParameterFixupFromDocs.xml", tempFile, Bytecode.JavaDocletType._ApiXml); } catch (Exception ex) {