public static void EmitModule(SyntaxTreeNode moduleRoot, string assemblyName, string moduleName, string className) { LoadBootstrapper(assemblyName, moduleName, className); MarkMethodDeclarations(moduleRoot); EmitGlobalIdentifierDeclarations(moduleRoot); EmitMethodDeclarations(moduleRoot); Class.CreateType(); Module.CreateGlobalFunctions(); try { Assembly.SetEntryPoint(Class.GetDeclaredMethod("main")); } catch (Exception e) { ConsoleCustomizer.ColorizedPrintln($"Error occurred when trying to set the entry point.[{e.Message}]", ConsoleColor.DarkRed); } try { Assembly.Save(Binary); } catch (Exception e) { ConsoleCustomizer.ColorizedPrintln($"Error occurred when trying to save the binary file.[{e.Message}]", ConsoleColor.DarkRed); } }
private static void EmitExternalMethodInvokation(MethodInvokationExpression method, ILGenerator methodIL) { Type[] arguments = CreateTypes(method.GetParametersTypes()); Type type = Type.GetType(GetExternalPackage(method.Name, arguments)); EmitMethodParameters(method.Parameters, methodIL); if (type != null && type.GetMethod(method.Name, arguments) != null) { methodIL.EmitCall(OpCodes.Call, type.GetMethod(method.Name, arguments), null); } else if (type == null) { ConsoleCustomizer.ColorizedPrintln($"Error occurred when trying to find package \"{GetExternalPackage(method.Name, arguments)}\".", ConsoleColor.DarkRed); } else { ConsoleCustomizer.ColorizedPrintln($"No method [{method.Name}] with those type of arguments found in package \"{GetExternalPackage(method.Name, arguments)}\".", ConsoleColor.DarkRed); } }
private void ShowTreeInConsole(SyntaxTreeNode startNode, string indent = "", bool root = false) { //├── └── │ if (root) { ConsoleCustomizer.ColorizedPrint(indent + "└──", ConsoleColor.DarkGray); ConsoleCustomizer.ColorizedPrintln(startNode.ToString(), startNode.ConsoleColor); } indent += " "; foreach (SyntaxTreeNode node in startNode.Childs) { if (node != null) { ConsoleCustomizer.ColorizedPrint(indent + (node == startNode.Childs.Last() ? "└──" : "├──"), ConsoleColor.DarkGray); ConsoleCustomizer.ColorizedPrintln(node.ToString(), node.ConsoleColor); ShowTreeInConsole(node, indent + (node.Childs.Count >= 1 && node == startNode.Childs.Last() ? string.Empty : "│")); } } }