From f4d98b1ea6e1c3964330612818b214608c0b7f67 Mon Sep 17 00:00:00 2001 From: Atsushi Eno Date: Wed, 15 Feb 2017 01:53:14 +0900 Subject: [PATCH] [class-parse] fix Java8 javadoc regex matches and parameter name retrieval. It was using String.Split(char[]) instead of .Split(string[]) which means that with " " the input can be split by any of '&', n,b,s,p and ';'. Also, Javadoc8 parameters can contain tags, which need to be removed. --- .../JavaDocumentScraper.cs | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/Xamarin.Android.Tools.Bytecode/JavaDocumentScraper.cs b/src/Xamarin.Android.Tools.Bytecode/JavaDocumentScraper.cs index 1b2a91900..348e9e98c 100644 --- a/src/Xamarin.Android.Tools.Bytecode/JavaDocumentScraper.cs +++ b/src/Xamarin.Android.Tools.Bytecode/JavaDocumentScraper.cs @@ -119,13 +119,21 @@ public Java8DocScraper (string dir) ShouldAlterArraySpec = true; ShouldEliminateGenericArguments = true; } + + protected override string StripTagsFromParameters (string value) + { + // Java8 javadoc contains possibly linked types with tags, so remove all of them. + while (value.IndexOf ('<') >= 0 && value.IndexOf ('>') > value.IndexOf ('<')) + value = value.Substring (0, value.IndexOf ('<')) + value.Substring (value.IndexOf ('>') + 1); + return value; + } } public abstract class AndroidDocScraper : IAndroidDocScraper { readonly String pattern_head; readonly String reset_pattern_head; - readonly char [] parameter_pair_splitter; + readonly string [] parameter_pair_splitter; readonly bool continuous_param_lines; readonly String open_method; readonly String param_sep; @@ -145,7 +153,7 @@ protected AndroidDocScraper (string dir, String patternHead, String resetPattern pattern_head = patternHead; reset_pattern_head = resetPatternHead; - parameter_pair_splitter = (parameterPairSplitter != null ? parameterPairSplitter : "\\s+").ToCharArray (); + parameter_pair_splitter = new string [] { (parameterPairSplitter != null ? parameterPairSplitter : "\\s+") }; continuous_param_lines = continuousParamLines; open_method = openMethod; param_sep = paramSep; @@ -178,6 +186,11 @@ protected virtual bool ShouldResetMatchBuffer (string text) // I *know* this is a hack. return reset_pattern_head == null || text.EndsWith (">", StringComparison.Ordinal) || !continuous_param_lines && !text.StartsWith (reset_pattern_head, StringComparison.Ordinal); } + + protected virtual string StripTagsFromParameters (string value) + { + return value; + } public virtual String[] GetParameterNames (string package, string type, string method, string[] ptypes, bool isVarArgs) { @@ -223,14 +236,14 @@ public virtual String[] GetParameterNames (string package, string type, string m var matcher = pattern.Match (text); if (matcher.Success) { var plist = matcher.Groups [1]; - String[] parms = plist.Value.Split (new string [] {", "}, StringSplitOptions.RemoveEmptyEntries); + String[] parms = StripTagsFromParameters (plist.Value).Split (new string [] { ", " }, StringSplitOptions.RemoveEmptyEntries); if (parms.Length != ptypes.Length) { Log.Warning (1, "failed matching {0} (expected {1} params, got {2} params)", buffer, ptypes.Length, parms.Length); return null; } String[] result = new String [ptypes.Length]; for (int i = 0; i < ptypes.Length; i++) { - String[] toks = parms [i].Split (parameter_pair_splitter); + String[] toks = parms [i].Split (parameter_pair_splitter, StringSplitOptions.RemoveEmptyEntries); result [i] = toks [toks.Length - 1]; } return result;