From 8c7965f04c60f4a28874e170d8e814270e93a7ed Mon Sep 17 00:00:00 2001 From: Kevin Glynn Date: Tue, 26 Jul 2011 10:07:11 +0200 Subject: [PATCH] generate javadoc from XML Documentation Comments --- .../src/CS2JTranslator/CS2JMain/CS2JMain.cs | 1 + .../CS2JTranslator/CS2JMain/CS2JSettings.cs | 6 ++ .../CS2JTransform/CommonWalker.cs | 91 +++++++++++++++++++ .../CS2JTransform/JavaPrettyPrint.g | 73 ++++++++++++++- 4 files changed, 168 insertions(+), 3 deletions(-) diff --git a/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JMain/CS2JMain.cs b/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JMain/CS2JMain.cs index 23f7728..c0b771f 100644 --- a/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JMain/CS2JMain.cs +++ b/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JMain/CS2JMain.cs @@ -132,6 +132,7 @@ namespace Twiglet.CS2J.Translator .Add ("translator-timestamp-files=", v => cfg.TranslatorAddTimeStamp = Boolean.Parse(v)) .Add ("translator-blanket-throw=", v => cfg.TranslatorBlanketThrow = Boolean.Parse(v)) .Add ("translator-exception-is-throwable=", v => cfg.TranslatorExceptionIsThrowable = Boolean.Parse(v)) + .Add ("translator-make-javadoc-comments=", v => cfg.TranslatorMakeJavadocComments = Boolean.Parse(v)) .Add ("experimental-enums-numericconsts", v => cfg.EnumsAsNumericConsts = true) .Add ("experimental-unsigned-translatesigned", v => cfg.UnsignedNumbersToSigned = true) .Add ("experimental-transforms=", v => cfg.ExperimentalTransforms = Boolean.Parse(v)) diff --git a/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JMain/CS2JSettings.cs b/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JMain/CS2JSettings.cs index 94e56a0..ca81633 100644 --- a/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JMain/CS2JSettings.cs +++ b/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JMain/CS2JSettings.cs @@ -61,6 +61,11 @@ namespace Twiglet.CS2J.Translator get; set; } + public bool TranslatorMakeJavadocComments + { + get; set; + } + public bool EnumsAsNumericConsts { get; set; @@ -114,6 +119,7 @@ namespace Twiglet.CS2J.Translator TranslatorAddTimeStamp = true; TranslatorExceptionIsThrowable = false; TranslatorBlanketThrow = true; + TranslatorMakeJavadocComments = true; EnumsAsNumericConsts = false; UnsignedNumbersToSigned = false; diff --git a/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JTransform/CommonWalker.cs b/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JTransform/CommonWalker.cs index a2f2cf6..e549f66 100644 --- a/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JTransform/CommonWalker.cs +++ b/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JTransform/CommonWalker.cs @@ -3,6 +3,9 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; +using System.Xml; +using System.Xml.Xsl; +using System.IO; using Antlr.Runtime.Tree; using Antlr.Runtime; @@ -229,6 +232,94 @@ namespace Twiglet.CS2J.Translator.Transform } } + protected const string javaDocXslt = @" + + + + + + + + + + + {@code } + + + + {@code } + + + + <b></b> + + + + {@link #} + + + + {@code } + + + + + + + + + + + + + + + + + + + + @param + + + + @throws + + + + @return + + + + @see + + + +"; + + private XslCompiledTransform _jdXslTrans = null; + protected XslCompiledTransform JdXslTrans + { + get + { + if (_jdXslTrans == null) + { + _jdXslTrans = new XslCompiledTransform(); + + // Encode the XML string in a UTF-8 byte array + byte[] encodedXsltString = Encoding.UTF8.GetBytes(javaDocXslt); + + // Put the byte array into a stream and rewind it to the beginning + MemoryStream msXslt = new MemoryStream(encodedXsltString); + msXslt.Flush(); + msXslt.Position = 0; + _jdXslTrans.Load(XmlReader.Create(msXslt)); + } + return _jdXslTrans; + } + } + } // Wraps a compilation unit with its imports search path diff --git a/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JTransform/JavaPrettyPrint.g b/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JTransform/JavaPrettyPrint.g index fbfaf61..b38f80c 100644 --- a/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JTransform/JavaPrettyPrint.g +++ b/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JTransform/JavaPrettyPrint.g @@ -22,6 +22,9 @@ scope TypeContext { @header { using System; + using System.IO; + using System.Xml; + using System.Xml.Xsl; using System.Collections; using System.Text; using System.Text.RegularExpressions; @@ -35,16 +38,80 @@ scope TypeContext { // If top level is partial then this will contain the components so that we can mere with other parts down the line public ClassDescriptorSerialized PartialDescriptor { get; set; } - private List collectedComments = null; + protected string convertToJavaDoc(string docComment) { + string ret = null; + try { + StringBuilder javaDocStr = new StringBuilder(); + + string xml = "\n" + docComment + "\n"; + + // Encode the XML string in a UTF-8 byte array + byte[] encodedString = Encoding.UTF8.GetBytes(xml); + + // Put the byte array into a stream and rewind it to the beginning + MemoryStream ms = new MemoryStream(encodedString); + ms.Flush(); + ms.Position = 0; + + // Build the XmlDocument from the MemorySteam of UTF-8 encoded bytes + XmlDocument xmlDoc = new XmlDocument(); + xmlDoc.Load(ms); + + JdXslTrans.Transform(xmlDoc,null,new StringWriter(javaDocStr)); + ret = javaDocStr.ToString().Trim().Replace("\n", "\n* "); + ret = String.Format("/**\n* {0}\n*/", ret); + } + catch (Exception) + { + // skip, just return null + } + return ret; + } + + private List collectedComments = null; List CollectedComments { get { List rets = new List(); if (collectedComments != null) { - foreach (string c in collectedComments) { - rets.Add(processComment(c)); + List savedComments = new List(); + bool inDoc = false; + string xmlDoc = ""; + foreach (string c in collectedComments) { + string line = processComment(c); + if (Cfg.TranslatorMakeJavadocComments && line.TrimStart().StartsWith("///")) { + inDoc = true; + savedComments.Add(line); + xmlDoc += line.TrimStart().Substring(3).TrimStart() + "\n"; + } + else + { + if (inDoc) { + string javaDoc = convertToJavaDoc(xmlDoc); + if (javaDoc != null) { + rets.Add(javaDoc); + } + else { + rets.AddRange(savedComments); + } + savedComments = new List(); + inDoc = false; + xmlDoc = ""; + } + rets.Add(line); + } } + if (inDoc) { + string javaDoc = convertToJavaDoc(xmlDoc); + if (javaDoc != null) { + rets.Add(javaDoc); + } + else { + rets.AddRange(savedComments); + } + } } + collectedComments = null; return rets;