PageRenderTime 75ms CodeModel.GetById 24ms RepoModel.GetById 1ms app.codeStats 0ms

/src/sys/dotnet/fanx/tools/Fan.cs

https://bitbucket.org/bedlaczech/fan-1.0
C# | 259 lines | 205 code | 28 blank | 26 comment | 38 complexity | 2fa26939d854d5a0be559feb190b59da MD5 | raw file
Possible License(s): CC-BY-SA-3.0
  1. //
  2. // Copyright (c) 2006, Brian Frank and Andy Frank
  3. // Licensed under the Academic Free License version 3.0
  4. //
  5. // History:
  6. // 4 Jan 06 Andy Frank Creation
  7. //
  8. using System;
  9. using System.IO;
  10. using Fan.Sys;
  11. using Type = Fan.Sys.Type;
  12. namespace Fanx.Tools
  13. {
  14. /// <summary>
  15. /// Fantom runtime for .NET.
  16. /// </summary>
  17. ///
  18. public class Fan : Tool
  19. {
  20. //////////////////////////////////////////////////////////////////////////
  21. // Execute
  22. //////////////////////////////////////////////////////////////////////////
  23. internal int execute(string target, string[] args)
  24. {
  25. // args
  26. Sys.m_bootEnv.setArgs(args);
  27. // first try as file name
  28. if (System.IO.File.Exists(target) && !Directory.Exists(target))
  29. {
  30. return executeFile(new FileInfo(target));
  31. }
  32. else
  33. {
  34. return executeType(target);
  35. }
  36. }
  37. public int executeFile(FileInfo file)
  38. {
  39. LocalFile f = (LocalFile)(new LocalFile(file).normalize());
  40. // use Fantom reflection to run compiler::Main.compileScript(File)
  41. Pod pod = null;
  42. try
  43. {
  44. pod = Env.cur().compileScript(f).pod();
  45. }
  46. catch (Err.Val e)
  47. {
  48. System.Console.WriteLine("ERROR: cannot compile script");
  49. e.err().trace();
  50. return -1;
  51. }
  52. catch (Exception e)
  53. {
  54. System.Console.WriteLine("ERROR: cannot compile script");
  55. System.Console.WriteLine(e);
  56. return -1;
  57. }
  58. List types = pod.types();
  59. Type type = null;
  60. Method main = null;
  61. for (int i=0; i<types.sz(); ++i)
  62. {
  63. type = (Type)types.get(i);
  64. main = type.method("main", false);
  65. if (main != null) break;
  66. }
  67. if (main == null)
  68. {
  69. System.Console.WriteLine("ERROR: missing main method: " + ((Type)types.get(0)).name() + ".main()");
  70. return -1;
  71. }
  72. return callMain(type, main);
  73. }
  74. int executeType(string target)
  75. {
  76. if (target.IndexOf("::") < 0) target += "::Main.main";
  77. else if (target.IndexOf('.') < 0) target += ".main";
  78. try
  79. {
  80. int dot = target.IndexOf('.');
  81. Type type = Type.find(target.Substring(0, dot), true);
  82. Method main = type.method(target.Substring(dot+1), true);
  83. return callMain(type, main);
  84. }
  85. catch (Exception e)
  86. {
  87. if (e is Err.Val)
  88. ((Err.Val)e).err().trace();
  89. else
  90. Err.dumpStack(e);
  91. return -1;
  92. }
  93. }
  94. static int callMain(Type t, Method m)
  95. {
  96. // check parameter type and build main arguments
  97. List args;
  98. List pars = m.@params();
  99. if (pars.sz() == 0)
  100. {
  101. args = null;
  102. }
  103. else if (((Param)pars.get(0)).type().@is(Sys.StrType.toListOf()) &&
  104. (pars.sz() == 1 || ((Param)pars.get(1)).hasDefault()))
  105. {
  106. args = new List(Sys.ObjType, new object[] { Env.cur().args() });
  107. }
  108. else
  109. {
  110. System.Console.WriteLine("ERROR: Invalid parameters for main: " + m.signature());
  111. return -1;
  112. }
  113. // invoke
  114. try
  115. {
  116. if (m.isStatic())
  117. return toResult(m.callList(args));
  118. else
  119. return toResult(m.callOn(t.make(), args));
  120. }
  121. catch (Err.Val ex)
  122. {
  123. ex.err().trace();
  124. return -1;
  125. }
  126. }
  127. static int toResult(object obj)
  128. {
  129. if (obj is long) return (int)obj;
  130. return 0;
  131. }
  132. //////////////////////////////////////////////////////////////////////////
  133. // Version
  134. //////////////////////////////////////////////////////////////////////////
  135. internal static void version(string progName)
  136. {
  137. writeLine(progName);
  138. writeLine("Copyright (c) 2006-2013, Brian Frank and Andy Frank");
  139. writeLine("Licensed under the Academic Free License version 3.0");
  140. writeLine("");
  141. writeLine(".NET Runtime:");
  142. writeLine(" clr.version: " + Environment.Version);
  143. writeLine(" sys.platform: " + Sys.m_platform);
  144. writeLine(" sys.version: " + Sys.m_sysPod.version());
  145. writeLine("");
  146. }
  147. static void pods(String progName)
  148. {
  149. version(progName);
  150. long t1 = Duration.nowTicks();
  151. List pods = Pod.list();
  152. long t2 = Duration.nowTicks();
  153. writeLine("");
  154. writeLine("Fantom Pods [" + (t2-t1)/1000000L + "ms]:");
  155. writeLine(" Pod Version");
  156. writeLine(" --- -------");
  157. for (int i=0; i<pods.sz(); ++i)
  158. {
  159. Pod pod = (Pod)pods.get(i);
  160. writeLine(" " +
  161. FanStr.justl(pod.name(), 18L) + " " +
  162. FanStr.justl(pod.version().toStr(), 8));
  163. }
  164. }
  165. //////////////////////////////////////////////////////////////////////////
  166. // Run
  167. //////////////////////////////////////////////////////////////////////////
  168. public static int run(string reserved)
  169. {
  170. try
  171. {
  172. sysInit(reserved);
  173. // process args
  174. string[] args = Tool.getArgv();
  175. for (int i=0; i<args.Length; i++)
  176. {
  177. string a = args[i];
  178. if (a.Length == 0) continue;
  179. if (a == "-help" || a == "-h" || a == "-?")
  180. {
  181. help();
  182. return 2;
  183. }
  184. else if (a == "-version")
  185. {
  186. version("Fantom Launcher");
  187. return 3;
  188. }
  189. else if (a == "-pods")
  190. {
  191. pods("Fantom Launcher");
  192. return 4;
  193. }
  194. else if (a[0] == '-')
  195. {
  196. writeLine("WARNING: Unknown option " + a);
  197. }
  198. else
  199. {
  200. string target = a;
  201. string[] targetArgs = new string[args.Length-i-1];
  202. Array.Copy(args, i+1, targetArgs, 0, targetArgs.Length);
  203. return new Fan().execute(target, targetArgs);
  204. }
  205. }
  206. help();
  207. return 2;
  208. }
  209. catch (Exception e)
  210. {
  211. Err.dumpStack(e);
  212. return 1;
  213. }
  214. }
  215. static void help()
  216. {
  217. writeLine("Fantom Launcher");
  218. writeLine("Usage:");
  219. writeLine(" fan [options] <pod>::<type>.<method> [args]*");
  220. writeLine(" fan [options] <filename> [args]*");
  221. writeLine("Options:");
  222. writeLine(" -help, -h, -? print usage help");
  223. writeLine(" -version print version information");
  224. writeLine(" -pods list installed pods");
  225. }
  226. public static void writeLine(string s)
  227. {
  228. Console.WriteLine(s);
  229. }
  230. }
  231. }