public override string GenerateCode(AbstractNode node, string indentation) { IOutputAstVisitor visitor = CreateOutputVisitor(); int indentCount = 0; foreach (char c in indentation) { if (c == '\t') { indentCount += 4; } else { indentCount += 1; } } visitor.OutputFormatter.IndentationLevel = indentCount / 4; if (node is Statement) { visitor.OutputFormatter.Indent(); } node.AcceptVisitor(visitor, null); string text = visitor.Text; if (node is Statement && !text.EndsWith("\n")) { text += Environment.NewLine; } return(text); }
private InvocationExpression FirstInvocationExpression(AbstractNode invocation) { var v = new FindInvocationExpressionVisitor(); invocation.AcceptVisitor(v, null); return(v.Expr); }
public static string ToText(AbstractNode node) { var output = new CSharpOutputVisitor(); node.AcceptVisitor(output, null); return(output.Text); }
public override string GenerateCode(AbstractNode node, string indentation) { StringBuilder errorBuilder = new StringBuilder(); ConverterSettings settings = new ConverterSettings("codegeneration.cs"); string output = null; Node booNode = (Node)node.AcceptVisitor(new ConvertVisitor(settings), null); if (settings.Errors.Count > 0) { foreach (CompilerError error in settings.Errors) { errorBuilder.AppendLine(error.ToString()); } } else { if (settings.Warnings.Count > 0) { foreach (CompilerWarning warning in settings.Warnings) { errorBuilder.AppendLine(warning.ToString()); } } booNode.Accept(new RemoveRedundantTypeReferencesVisitor()); using (StringWriter w = new StringWriter()) { BooPrinterVisitor printer = new BooPrinterVisitor(w); int indentCount = 0; foreach (char c in indentation) { if (c == '\t') { indentCount += 4; } else { indentCount += 1; } } indentCount /= 4; while (indentCount-- > 0) { printer.Indent(); } booNode.Accept(printer); output = w.ToString(); } } if (errorBuilder.Length > 0) { MessageService.ShowMessage(errorBuilder.ToString()); } return(output); }
public static void InsertCode(this ITextEditor editor, AbstractNode target, AbstractNode insert, int insertOffset, bool updateCaretPos) { if (insertOffset < 0) { return; } var regionCorrectVisitor = new SetRegionInclusionVisitor(); insert.AcceptVisitor(regionCorrectVisitor, null); var doc = editor.Document; var codeGen = editor.Language.Properties.CodeGenerator; string indent = DocumentUtilitites.GetWhitespaceAfter(doc, doc.GetLineStartOffset(target.StartLocation)); string code = codeGen.GenerateCode(insert, indent); doc.Insert(insertOffset, code); if (updateCaretPos) { editor.Caret.Offset = insertOffset + code.Length - 1; } }