Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 21 additions & 2 deletions src/Xamarin.Android.Tools.Bytecode/ClassPath.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public class ClassPath {

public string ApiSource { get; set; }

public JavaDocletType DocletType { get; set; }
public JavaDocletType? DocletType { get; set; }

public IEnumerable<string> DocumentationPaths { get; set; }

Expand Down Expand Up @@ -224,9 +224,28 @@ void FixupParametersFromDocs (XElement api)
}
}

JavaDocletType GetDocletType (string path)
{
var kind = JavaDocletType.DroidDoc;
char [] buf = new char [500];
string packagesHtml = Path.Combine (path, "packages.html");
if (File.Exists (packagesHtml) && File.ReadAllText (packagesHtml).Contains ("<body class=\"gc-documentation develop reference api "))
kind = JavaDocletType.DroidDoc2;
using (var reader = File.OpenText (Path.Combine (path, "index.html")))
reader.ReadBlock (buf, 0, buf.Length);
string rawHTML = new string (buf);
if (rawHTML.Contains ("Generated by javadoc (build 1.6"))
kind = JavaDocletType.Java6;
else if (rawHTML.Contains ("Generated by javadoc (version 1.7"))
kind = JavaDocletType.Java7;
else if (rawHTML.Contains ("Generated by javadoc (1.8"))
kind = JavaDocletType.Java8;
return kind;
}

IAndroidDocScraper CreateDocScraper (string src)
{
switch (DocletType) {
switch (DocletType ?? GetDocletType (src)) {
default: return new DroidDoc2Scraper (src);
case JavaDocletType.DroidDoc: return new DroidDocScraper (src);
case JavaDocletType.Java6: return new JavaDocScraper (src);
Expand Down
33 changes: 20 additions & 13 deletions src/Xamarin.Android.Tools.Bytecode/JavaDocumentScraper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,21 +33,14 @@

namespace Xamarin.Android.Tools.Bytecode
{
enum JavaDocKind {
DroidDoc,
DroidDoc2,
Java6,
Java7,
Java8
}

class DroidDocScraper : AndroidDocScraper
{
const String pattern_head_droiddoc = "<span class=\"sympad\"><a href=\".*";

public DroidDocScraper (string dir)
: base (dir, pattern_head_droiddoc, null, " ", false)
{
ShouldEscapeBrackets = true;
}
}

Expand All @@ -59,6 +52,7 @@ class DroidDoc2Scraper : AndroidDocScraper
public DroidDoc2Scraper (string dir)
: base (dir, pattern_head_droiddoc, reset_pattern_head, " ", true, "\\(", ", ", "\\)", "\\s*</code>")
{
ShouldEscapeBrackets = true;
}

string prev_path;
Expand Down Expand Up @@ -115,13 +109,15 @@ public Java7DocScraper (string dir)

class Java8DocScraper : AndroidDocScraper
{
const String pattern_head_javadoc = "<td class=\"col.+\"><code><strong><a href=\"[./]*"; // I'm not sure how path could be specified... (./ , ../ , or even /)
const String pattern_head_javadoc = "<td class=\"col.+\"><code><span class=\"memberNameLink\"><a href=\"[./]*"; // I'm not sure how path could be specified... (./ , ../ , or even /)
const String reset_pattern_head_javadoc = "<td><code>";
const String parameter_pair_splitter_javadoc = "&nbsp;";

public Java8DocScraper (string dir)
: base (dir, pattern_head_javadoc, reset_pattern_head_javadoc, parameter_pair_splitter_javadoc, true, "-", "-", "-", null)
: base (dir, pattern_head_javadoc, reset_pattern_head_javadoc, parameter_pair_splitter_javadoc, true, "\\-", "\\-", "\\-", null)
{
ShouldAlterArraySpec = true;
ShouldEliminateGenericArguments = true;
}
}

Expand Down Expand Up @@ -167,6 +163,10 @@ protected AndroidDocScraper (string dir, String patternHead, String resetPattern
// LoadDocument (f.Substring (dir.Length + 1), f);
}

protected bool ShouldEscapeBrackets { get; set; }
protected bool ShouldAlterArraySpec { get; set; }
protected bool ShouldEliminateGenericArguments { get; set; }

protected virtual IEnumerable<string> GetContentLines (string path)
{
return File.ReadAllText (path).Split ('\n');
Expand Down Expand Up @@ -197,11 +197,18 @@ public virtual String[] GetParameterNames (string package, string type, string m
for (int i = 0; i < ptypes.Length; i++) {
if (i != 0)
buffer.Append (param_sep);
buffer.Append (ptypes [i].Replace ('$', '.'));
var ptype = ptypes [i];
if (ShouldEliminateGenericArguments)
while (ptype.IndexOf ('<') > 0 && ptype.IndexOf ('>') > ptype.IndexOf ('<'))
ptype = ptype.Substring (0, ptype.IndexOf ('<')) + ptype.Substring (ptype.IndexOf ('>') + 1);
buffer.Append (ptype.Replace ('$', '.'));
}
buffer.Replace ("[", "\\[").Replace ("]", "\\]");
if (ShouldEscapeBrackets)
buffer.Replace ("[", "\\[").Replace ("]", "\\]");
if (ShouldAlterArraySpec)
buffer.Replace ("[]", ":A");
buffer.Append (close_method);
buffer.Append ("\".*\\(([^(]*)\\)");
buffer.Append ("\".*\\(([^\\(\\)]*)\\)");
buffer.Append (post_close_method_parens);
buffer.Replace ("?", "\\?");
Regex pattern = new Regex (buffer.ToString (), RegexOptions.Multiline);
Expand Down