PageRenderTime 37ms CodeModel.GetById 12ms RepoModel.GetById 0ms app.codeStats 0ms

/ABB.SrcML/Src2SrcMLRunner2.cs

https://github.com/nkcsgexi/SrcML.NET
C# | 208 lines | 97 code | 30 blank | 81 comment | 7 complexity | ecca9fef1f197ecdca10c1021381b854 MD5 | raw file
  1. using ABB.SrcML.Utilities;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Collections.ObjectModel;
  5. using System.IO;
  6. using System.Linq;
  7. using System.Text;
  8. namespace ABB.SrcML {
  9. /// <summary>
  10. /// Simpler version of <see cref="Src2SrcMLRunner"/>. This is a thin wrapper around the src2srcml executable from KSU.
  11. /// </summary>
  12. public class Src2SrcMLRunner2 {
  13. private string appDir;
  14. /// <summary>
  15. /// The src2srcml executable name
  16. /// </summary>
  17. public const string Src2SrcMLExecutableName = "src2srcml.exe";
  18. /// <summary>
  19. /// Constructs a new object with <see cref="ApplicationDirectory"/> set via <see cref="SrcMLHelper.GetSrcMLDefaultDirectory()"/>.
  20. /// </summary>
  21. public Src2SrcMLRunner2() : this(SrcMLHelper.GetSrcMLDefaultDirectory()) { }
  22. /// <summary>
  23. /// Constructs a new object with <see cref="ApplicationDirectory"/> set to <paramref name="applicationDirectory"/>
  24. /// </summary>
  25. /// <param name="applicationDirectory">The directory that contains <see cref="Src2SrcMLExecutableName">src2srcml.exe</see></param>
  26. public Src2SrcMLRunner2(string applicationDirectory) {
  27. this.ApplicationDirectory = applicationDirectory;
  28. }
  29. /// <summary>
  30. /// the application directory
  31. /// </summary>
  32. public string ApplicationDirectory {
  33. get { return this.appDir; }
  34. set {
  35. appDir = value;
  36. ExecutablePath = Path.Combine(appDir, Src2SrcMLExecutableName);
  37. }
  38. }
  39. /// <summary>
  40. /// The full path to src2srcml.exe.
  41. /// </summary>
  42. public string ExecutablePath { get; private set; }
  43. /// <summary>
  44. /// Generates srcML from a file
  45. /// </summary>
  46. /// <param name="fileName">The source file name</param>
  47. /// <param name="xmlFileName">the output file name</param>
  48. /// <param name="language">The language to use</param>
  49. /// <param name="namespaceArguments">additional arguments</param>
  50. /// <param name="extensionMapping">an extension mapping</param>
  51. public void GenerateSrcMLFromFile(string fileName, string xmlFileName, Language language, Collection<string> namespaceArguments, Dictionary<string,Language> extensionMapping) {
  52. Collection<string> arguments = GenerateArguments(xmlFileName, language, namespaceArguments, extensionMapping);
  53. arguments.Add(QuoteFileName(fileName));
  54. try {
  55. Run(arguments);
  56. } catch(SrcMLRuntimeException e) {
  57. throw new SrcMLException(e.Message, e);
  58. }
  59. }
  60. /// <summary>
  61. /// Generates srcML from a file
  62. /// </summary>
  63. /// <param name="fileNames">An enumerable of filenames</param>
  64. /// <param name="xmlFileName">the output file name</param>
  65. /// <param name="language">The language to use</param>
  66. /// <param name="namespaceArguments">additional arguments</param>
  67. /// <param name="extensionMapping">an extension mapping</param>
  68. public void GenerateSrcMLFromFiles(IEnumerable<string> fileNames, string xmlFileName, Language language, Collection<string> namespaceArguments, Dictionary<string, Language> extensionMapping) {
  69. Collection<string> arguments = GenerateArguments(xmlFileName, language, namespaceArguments, extensionMapping);
  70. var tempFilePath = Path.GetTempFileName();
  71. using(StreamWriter writer = new StreamWriter(tempFilePath)) {
  72. foreach(var sourceFile in fileNames) {
  73. writer.WriteLine(sourceFile);
  74. }
  75. }
  76. arguments.Add(String.Format("--files-from={0}", QuoteFileName(tempFilePath)));
  77. try {
  78. Run(arguments);
  79. } catch(SrcMLRuntimeException e) {
  80. throw new SrcMLException(e.Message, e);
  81. } finally {
  82. File.Delete(tempFilePath);
  83. }
  84. }
  85. /// <summary>
  86. /// Generates srcML from the given string of source code
  87. /// </summary>
  88. /// <param name="source">The source code</param>
  89. /// <param name="language">The language</param>
  90. /// <param name="namespaceArguments">additional arguments</param>
  91. /// <param name="omitXmlDeclaration">If true, the XML header is omitted</param>
  92. /// <returns>The srcML</returns>
  93. public string GenerateSrcMLFromString(string source, Language language, Collection<string> namespaceArguments, bool omitXmlDeclaration) {
  94. var arguments = GenerateArguments(null, language, namespaceArguments, new Dictionary<string, Language>());
  95. if(omitXmlDeclaration) {
  96. arguments.Add("--no-xml-declaration");
  97. }
  98. try {
  99. return Run(arguments, source);
  100. } catch(SrcMLRuntimeException e) {
  101. throw new SrcMLException(e.Message, e);
  102. }
  103. }
  104. /// <summary>
  105. /// Runs <see cref="ExecutablePath"/> with the specified arguments
  106. /// </summary>
  107. /// <param name="arguments">the arguments</param>
  108. private void Run(Collection<string> arguments) {
  109. string argumentText = KsuAdapter.MakeArgumentString(arguments);
  110. KsuAdapter.RunExecutable(ExecutablePath, argumentText);
  111. }
  112. /// <summary>
  113. /// Runs <see cref="ExecutablePath"/> with the specified arguments. <paramref name="standardInput"/> is passed in to the process's standard input stream
  114. /// </summary>
  115. /// <param name="arguments">configuration arguments</param>
  116. /// <param name="standardInput">contents of standard input</param>
  117. /// <returns>contents of standard output</returns>
  118. private string Run(Collection<string> arguments, string standardInput) {
  119. string argumentText = KsuAdapter.MakeArgumentString(arguments);
  120. var output = KsuAdapter.RunExecutable(this.ExecutablePath, argumentText, standardInput);
  121. return output;
  122. }
  123. /// <summary>
  124. /// Generates command line arguments for src2srcml.exe
  125. /// </summary>
  126. /// <param name="xmlFileName">the output file name</param>
  127. /// <param name="language">The programming language</param>
  128. /// <param name="namespaceArguments">additional arguments</param>
  129. /// <param name="extensionMapping">a mapping of file extensions to languages</param>
  130. /// <returns>A collection of command line arguments</returns>
  131. private static Collection<string> GenerateArguments(string xmlFileName, Language language, Collection<string> namespaceArguments, Dictionary<string, Language> extensionMapping) {
  132. Collection<string> arguments = new Collection<string>();
  133. if(namespaceArguments == null) throw new ArgumentNullException("namespaceArguments");
  134. if(extensionMapping == null) throw new ArgumentNullException("extensionMapping");
  135. arguments.Add(MakeLanguageArgument(language));
  136. foreach(var namespaceArgument in namespaceArguments) {
  137. arguments.Add(namespaceArgument);
  138. }
  139. arguments.Add(MakeExtensionMapArgument(extensionMapping));
  140. if(!String.IsNullOrEmpty(xmlFileName)) {
  141. arguments.Add(MakeOutputArgument(xmlFileName));
  142. }
  143. return arguments;
  144. }
  145. /// <summary>
  146. /// Converts <paramref name="language"/> to <c>--language=LANGUAGE</c>
  147. /// </summary>
  148. /// <param name="language">The language to use</param>
  149. /// <returns>the language command line parameter</returns>
  150. private static string MakeLanguageArgument(Language language) {
  151. return (language == Language.Any ? String.Empty : String.Format("--language={0}", KsuAdapter.GetLanguage(language)));
  152. }
  153. /// <summary>
  154. /// Converts <paramref name="extensionMap"/> to <c>--register-ext EXTENSIONMAP</c>
  155. /// </summary>
  156. /// <param name="extensionMap">the extension map to use</param>
  157. /// <returns>The extension map command line parameter</returns>
  158. private static string MakeExtensionMapArgument(Dictionary<string, Language> extensionMap) {
  159. return (extensionMap.Count > 0 ? String.Format("--register-ext {0}", KsuAdapter.ConvertMappingToString(extensionMap)) : String.Empty);
  160. }
  161. /// <summary>
  162. /// Converts <paramref name="xmlFileName"/> to <c>--output="XMLFILENAME"</c>
  163. /// </summary>
  164. /// <param name="xmlFileName">the xml file name</param>
  165. /// <returns>The output command line parameter</returns>
  166. private static string MakeOutputArgument(string xmlFileName) {
  167. return String.Format("--output={0}", QuoteFileName(xmlFileName));
  168. }
  169. /// <summary>
  170. /// Surrounds a <paramref name="fileName"/> with quotation marks
  171. /// </summary>
  172. /// <param name="fileName">The file name</param>
  173. /// <returns>The file name, surrounded with double quotes</returns>
  174. private static string QuoteFileName(string fileName) {
  175. return String.Format("\"{0}\"", fileName);
  176. }
  177. }
  178. }