Package st.gravel.support.compiler.ast

Source Code of st.gravel.support.compiler.ast.SourcePrinter$SourcePrinter_Factory

package st.gravel.support.compiler.ast;

/*
  This file is automatically generated from typed smalltalk source. Do not edit by hand.
  (C) AG5.com
*/

import java.math.BigInteger;
import st.gravel.support.jvm.NonLocalReturn;
import st.gravel.support.compiler.ast.NodeVisitor;
import st.gravel.support.compiler.ast.NodeVisitor.NodeVisitor_Factory;
import st.gravel.support.compiler.ast.VariableDeclarationNode;
import st.gravel.support.compiler.ast.AssignmentNode;
import st.gravel.support.compiler.ast.SequenceNode;
import st.gravel.support.compiler.ast.CascadeNode;
import st.gravel.support.compiler.ast.Node;
import st.gravel.support.compiler.ast.TypeNode;
import st.gravel.support.compiler.ast.MessageNode;
import st.gravel.support.compiler.ast.Expression;
import st.gravel.support.compiler.ast.BlockNode;
import st.gravel.support.compiler.ast.PragmaNode;
import st.gravel.support.compiler.ast.Statement;
import st.gravel.support.compiler.ast.ArrayLiteralNode;
import st.gravel.support.compiler.ast.LiteralNode;
import st.gravel.support.compiler.ast.BlockTypeNode;
import st.gravel.support.compiler.ast.BooleanLiteralNode;
import st.gravel.support.compiler.ast.BottomTypeNode;
import st.gravel.support.compiler.ast.ByteArrayLiteralNode;
import st.gravel.support.compiler.ast.CharacterLiteralNode;
import st.gravel.support.compiler.ast.ClassTypeNode;
import st.gravel.support.compiler.ast.DoubleLiteralNode;
import st.gravel.support.compiler.ast.FixedPointLiteralNode;
import st.gravel.support.compiler.ast.FloatLiteralNode;
import st.gravel.support.compiler.ast.GenericTypeVariableNode;
import st.gravel.support.compiler.ast.InstanceTypeNode;
import st.gravel.support.compiler.ast.IntegerLiteralNode;
import st.gravel.support.compiler.ast.IntermediateNode;
import st.gravel.support.compiler.ast.IntermediateStatement;
import st.gravel.support.compiler.ast.MethodNode;
import st.gravel.support.compiler.ast.NamespacedTypeVariableNode;
import st.gravel.support.compiler.ast.NamespacedVariableNode;
import st.gravel.support.compiler.ast.NilLiteralNode;
import st.gravel.support.compiler.ast.ReferenceLiteralNode;
import st.gravel.support.compiler.ast.ReturnNode;
import st.gravel.support.compiler.ast.SelfTypeNode;
import st.gravel.support.compiler.ast.StringLiteralNode;
import st.gravel.support.compiler.ast.SymbolLiteralNode;
import st.gravel.support.compiler.ast.TypeDefNode;
import st.gravel.support.compiler.ast.TypeOrNode;
import st.gravel.support.compiler.ast.TypeVariableNode;
import st.gravel.support.compiler.ast.VariableNode;

public class SourcePrinter<X> extends NodeVisitor<Object> implements Cloneable {

  public static SourcePrinter_Factory factory = new SourcePrinter_Factory();

  st.gravel.core.Symbol _emphasis;

  int _indentation;

  Integer _precedence;

  StringBuilder _stream;

  public static class SourcePrinter_Factory<X> extends NodeVisitor_Factory<Object> {

    public SourcePrinter<X> basicNew() {
      SourcePrinter<X> newInstance = new SourcePrinter<X>();
      newInstance.initialize();
      return newInstance;
    }

    public SourcePrinter<Object> on_(final StringBuilder _aStream) {
      return this.stream_precedence_indentation_emphasis_(_aStream, null, 0, null);
    }

    public SourcePrinter<Object> stream_precedence_indentation_emphasis_(final StringBuilder _aWriteStream, final Integer _anUndefinedObject, final int _anInteger, final st.gravel.core.Symbol _anUndefinedObject2) {
      return this.basicNew().initializeStream_precedence_indentation_emphasis_(_aWriteStream, _anUndefinedObject, _anInteger, _anUndefinedObject2);
    }
  }

  static public SourcePrinter<Object> _on_(Object receiver, final StringBuilder _aStream) {
    return factory.on_(_aStream);
  }

  static public SourcePrinter<Object> _stream_precedence_indentation_emphasis_(Object receiver, final StringBuilder _aWriteStream, final Integer _anUndefinedObject, final int _anInteger, final st.gravel.core.Symbol _anUndefinedObject2) {
    return factory.stream_precedence_indentation_emphasis_(_aWriteStream, _anUndefinedObject, _anInteger, _anUndefinedObject2);
  }

  public SourcePrinter<X> copy() {
    try {
      SourcePrinter<X> _temp1 = (SourcePrinter<X>) this.clone();
      _temp1.postCopy();
      return _temp1;
    } catch (CloneNotSupportedException e) {
      throw new RuntimeException(e);
    }
  }

  public SourcePrinter crtab_(final int _i) {
    _stream.append('\n');
    for (int _x = 1; _x <= _i; _x++) {
      _stream.append('\t');
    }
    return this;
  }

  public SourcePrinter emphasis_while_(final st.gravel.core.Symbol _anEmphasis, final st.gravel.support.jvm.Block0<Object> _aBlock) {
    final st.gravel.core.Symbol _old;
    _old = _emphasis;
    _emphasis = _anEmphasis;
    _aBlock.value();
    _emphasis = _old;
    return this;
  }

  public SourcePrinter_Factory<X> factory() {
    return factory;
  }

  public SourcePrinter indentDo_(final st.gravel.support.jvm.Block0<Object> _aBlock) {
    this.indent_do_(1, _aBlock);
    return this;
  }

  public SourcePrinter indent_do_(final int _aLevel, final st.gravel.support.jvm.Block0<Object> _aBlock) {
    final int _old;
    _old = _indentation;
    _indentation = (_indentation + _aLevel);
    _aBlock.value();
    _indentation = _old;
    return this;
  }

  public SourcePrinter initializeStream_precedence_indentation_emphasis_(final StringBuilder _aWriteStream, final Integer _anUndefinedObject, final int _anInteger, final st.gravel.core.Symbol _anUndefinedObject2) {
    _stream = _aWriteStream;
    _precedence = _anUndefinedObject;
    _indentation = _anInteger;
    _emphasis = _anUndefinedObject2;
    this.initialize();
    return this;
  }

  public boolean printArguments_(final VariableDeclarationNode[] _args) {
    if (_args.length == 0) {
      return false;
    }
    boolean _temp1 = true;
    for (final VariableDeclarationNode _arg : _args) {
      if (_temp1) {
        _temp1 = false;
      } else {
        _stream.append(' ');
      }
      _stream.append(':');
      SourcePrinter.this.visit_(_arg);
    }
    return true;
  }

  public SourcePrinter printAssignmentNode_(final AssignmentNode _aNode) {
    this.visit_(_aNode.variable());
    _stream.append(" := ");
    this.indent_do_(2, new st.gravel.support.jvm.Block0<Object>() {

      @Override
      public Object value() {
        return SourcePrinter.this.visit_(_aNode.value());
      }
    });
    return this;
  }

  public SourcePrinter printBlockBody_(final SequenceNode _aSequenceNode) {
    boolean _indent;
    _indent = false;
    this.printComment_(_aSequenceNode.comment());
    if (_aSequenceNode.temporaries().length != 0) {
      if (_indent) {
        SourcePrinter.this.crtab_(_indentation);
      }
      SourcePrinter.this.printTemporaries_(_aSequenceNode.temporaries());
      _indent = true;
    }
    this.printStatements_indent_(_aSequenceNode.statements(), _indent);
    return this;
  }

  public SourcePrinter printCascadeNode_(final CascadeNode _aCascadeNode) {
    this.visit_precedence_indentation_(_aCascadeNode.receiver(), 0, _indentation);
    for (int _i = 1; _i <= _aCascadeNode.messages().length; _i++) {
      SourcePrinter.this.printMessage_(_aCascadeNode.messages()[_i - 1]);
      if ((_i < _aCascadeNode.messages().length)) {
        _stream.append(';');
      }
    }
    return this;
  }

  public SourcePrinter printCommentOf_(final Node _aNode) {
    if (this.printComment_(_aNode.comment())) {
      SourcePrinter.this.crtab_(_indentation);
    }
    return this;
  }

  public boolean printComment_(final String[] _comment) {
    if ((_comment == null) || (_comment.length == 0)) {
      return false;
    }
    for (final String _each : _comment) {
      SourcePrinter.this.crtab_(_indentation);
      _stream.append('\"');
      _stream.append(_each);
      _stream.append('\"');
    }
    return true;
  }

  public boolean printDeclaredReturnType_(final TypeNode _aTypeNode) {
    if (_aTypeNode == null) {
      return false;
    }
    _stream.append(" {^");
    this.visit_(_aTypeNode);
    _stream.append('}');
    return true;
  }

  public SourcePrinter printMessage_(final MessageNode _message) {
    Expression _prev;
    Expression _arg;
    int _indent;
    String _thisKey;
    final String[] _keywords;
    if (st.gravel.support.jvm.IntegerExtensions.equals_(_message.arguments().length, 0)) {
      _stream.append(' ');
      _stream.append(_message.selector());
      return SourcePrinter.this;
    }
    _keywords = _message.keywords();
    _prev = _message.receiver();
    for (int _part = 1; _part <= _message.arguments().length; _part++) {
      _arg = _message.arguments()[_part - 1];
      _thisKey = _keywords[_part - 1];
      if (_prev.isBlockNode() || ((_prev.isMessageNode() && (_prev.precedence() >= 3)) || ((_arg.isBlockNode() && (((BlockNode) _arg).isComplex() && (!st.gravel.support.jvm.StringExtensions.equals_(_thisKey, "do:")))) || ((_message.arguments().length > 2) || st.gravel.support.jvm.ArrayExtensions.includes_(new String[] { "ifTrue:ifFalse:", "ifFalse:ifTrue:" }, _message.selector()))))) {
        SourcePrinter.this.crtab_((_indentation + 1));
        _indent = 1;
      } else {
        _stream.append(' ');
        _indent = 0;
      }
      _stream.append(_thisKey);
      _stream.append(' ');
      SourcePrinter.this.visit_precedence_indentation_(_arg, st.gravel.support.jvm.IntegerExtensions.equals_(_message.precedence(), 2) ? 1 : _message.precedence(), (_indentation + _indent));
      _prev = _arg;
    }
    return this;
  }

  public SourcePrinter printPragmas_(final PragmaNode[] _pragmas) {
    for (final PragmaNode _each : _pragmas) {
      SourcePrinter.this.crtab_(_indentation);
      SourcePrinter.this.visit_(_each);
    }
    return this;
  }

  public SourcePrinter printStatements_indent_(final Statement[] _stmts, final boolean _aBoolean) {
    final int _show;
    Statement _thisStatement;
    boolean _indent;
    _indent = _aBoolean;
    _show = _stmts.length;
    for (int _i = 1; _i <= _show; _i++) {
      _thisStatement = _stmts[_i - 1];
      if ((_thisStatement.comment().length > 0)) {
        if (st.gravel.support.jvm.IntegerExtensions.equals_(_i, 1)) {
          SourcePrinter.this.crtab_(_indentation);
        }
        _stream.append('\t');
      }
      if (_indent) {
        SourcePrinter.this.crtab_(_indentation);
      }
      SourcePrinter.this.visit_(_thisStatement);
      if ((_i < _show)) {
        _stream.append('.');
      }
      _indent = true;
    }
    return this;
  }

  public SourcePrinter printTemporaries_(final VariableDeclarationNode[] _aCollection) {
    _stream.append("| ");
    for (final VariableDeclarationNode _temp : _aCollection) {
      SourcePrinter.this.visit_(_temp);
      _stream.append(' ');
    }
    _stream.append('|');
    return this;
  }

  public SourcePrinter printTypeCastOf_using_(final Node _aNode, final st.gravel.support.jvm.Block0<Object> _aBlock) {
    _aBlock.value();
    return this;
  }

  public SourcePrinter printTypeNode_(final TypeNode _aNode) {
    _stream.append('{');
    this.visit_(_aNode);
    _stream.append('}');
    return this;
  }

  public SourcePrinter printValueNode_using_parenthesize_(final Node _aNode, final st.gravel.support.jvm.Block0<Object> _aBlock, final boolean _aBool) {
    this.printCommentOf_(_aNode);
    this.printTypeCastOf_using_(_aNode, new st.gravel.support.jvm.Block0<Object>() {

      @Override
      public Object value() {
        return SourcePrinter.this.when_parenthesize_(_aBool, _aBlock);
      }
    });
    return this;
  }

  public SourcePrinter pvtSetPrecedence_indentation_emphasis_(final Integer _anIntegerOrNil, final int _aLevel, final st.gravel.core.Symbol _anObject) {
    _precedence = _anIntegerOrNil;
    _indentation = _aLevel;
    _emphasis = _anObject;
    return this;
  }

  public SourcePrinter pvtVisit_(final Node _anObject) {
    if (_anObject == null) {
      return SourcePrinter.this;
    }
    _anObject.accept_(this);
    return this;
  }

  @Override
  public SourcePrinter visitArrayLiteralNode_(final ArrayLiteralNode _anObject) {
    _stream.append("#(");
    boolean _temp1 = true;
    for (final LiteralNode _each : _anObject.elements()) {
      if (_temp1) {
        _temp1 = false;
      } else {
        _stream.append(' ');
      }
      SourcePrinter.this.visit_(_each);
    }
    _stream.append(')');
    return this;
  }

  @Override
  public SourcePrinter visitAssignmentNode_(final AssignmentNode _aNode) {
    this.printValueNode_using_parenthesize_(_aNode, new st.gravel.support.jvm.Block0<Object>() {

      @Override
      public Object value() {
        return SourcePrinter.this.printAssignmentNode_(_aNode);
      }
    }, (_precedence != null) && (_precedence < 4));
    return this;
  }

  @Override
  public SourcePrinter visitBlockNode_(final BlockNode _aNode) {
    this.printValueNode_using_parenthesize_(_aNode, new st.gravel.support.jvm.Block0<Object>() {

      @Override
      public Object value() {
        final boolean _hasArgs;
        final boolean _hasDeclaredReturnType;
        if (_aNode.isComplex()) {
          SourcePrinter.this.crtab_(_indentation);
        }
        _stream.append('[');
        _hasArgs = SourcePrinter.this.printArguments_(_aNode.arguments());
        _hasDeclaredReturnType = SourcePrinter.this.printDeclaredReturnType_(_aNode.returnType());
        if (_hasArgs || _hasDeclaredReturnType) {
          _stream.append(' ');
          _stream.append("| ");
        }
        if (_aNode.isComplex()) {
          SourcePrinter.this.crtab_(_indentation);
        }
        SourcePrinter.this.visit_(_aNode.body());
        return _stream.append(']');
      }
    }, false);
    return this;
  }

  @Override
  public SourcePrinter visitBlockTypeNode_(final BlockTypeNode _aNode) {
    _stream.append('[');
    boolean _temp1 = true;
    for (final TypeNode _each : _aNode.arguments()) {
      if (_temp1) {
        _temp1 = false;
      } else {
        _stream.append(',');
        _stream.append(' ');
      }
      if (_each == null) {
        _stream.append("Unknown");
      } else {
        SourcePrinter.this.visit_(_each);
      }
    }
    if (_aNode.returnType() != null) {
      if (_aNode.arguments().length != 0) {
        _stream.append(',');
        _stream.append(' ');
      }
      SourcePrinter.this.visit_(_aNode.returnType());
    }
    _stream.append(']');
    return this;
  }

  @Override
  public SourcePrinter visitBooleanLiteralNode_(final BooleanLiteralNode _anObject) {
    if (_anObject.value()) {
      _stream.append("true");
    } else {
      _stream.append("false");
    }
    return this;
  }

  @Override
  public SourcePrinter visitBottomTypeNode_(final BottomTypeNode _anObject) {
    _stream.append("Bottom");
    return this;
  }

  @Override
  public SourcePrinter visitByteArrayLiteralNode_(final ByteArrayLiteralNode _anObject) {
    _stream.append("#[");
    boolean _temp1 = true;
    for (final byte _each : _anObject.value()) {
      if (_temp1) {
        _temp1 = false;
      } else {
        _stream.append(' ');
      }
      _stream.append("" + (_each & 255));
    }
    _stream.append(']');
    return this;
  }

  @Override
  public SourcePrinter visitCascadeNode_(final CascadeNode _aNode) {
    final boolean _parenthesize;
    _parenthesize = (_precedence != null) && (_precedence < 4);
    if (_parenthesize) {
      _stream.append('(');
    }
    this.printCascadeNode_(_aNode);
    if (_parenthesize) {
      _stream.append(')');
    }
    return this;
  }

  @Override
  public SourcePrinter visitCharacterLiteralNode_(final CharacterLiteralNode _aNode) {
    _stream.append('$');
    _stream.append(_aNode.value());
    return this;
  }

  @Override
  public SourcePrinter visitClassTypeNode_(final ClassTypeNode _anObject) {
    this.visit_(_anObject.node());
    _stream.append(" class");
    return this;
  }

  @Override
  public SourcePrinter visitDoubleLiteralNode_(final DoubleLiteralNode _anObject) {
    _stream.append(_anObject.valueString());
    return this;
  }

  @Override
  public SourcePrinter visitFixedPointLiteralNode_(final FixedPointLiteralNode _anObject) {
    _stream.append(_anObject.valueString());
    return this;
  }

  @Override
  public SourcePrinter visitFloatLiteralNode_(final FloatLiteralNode _anObject) {
    _stream.append(_anObject.valueString());
    return this;
  }

  @Override
  public SourcePrinter visitGenericTypeVariableNode_(final GenericTypeVariableNode _aNode) {
    this.visit_(_aNode.root());
    _stream.append('[');
    boolean _temp1 = true;
    for (final TypeNode _each : _aNode.arguments()) {
      if (_temp1) {
        _temp1 = false;
      } else {
        _stream.append(',');
        _stream.append(' ');
      }
      SourcePrinter.this.visit_(_each);
    }
    _stream.append(']');
    return this;
  }

  @Override
  public SourcePrinter visitInstanceTypeNode_(final InstanceTypeNode _anObject) {
    _stream.append("Instance");
    return this;
  }

  @Override
  public SourcePrinter visitIntegerLiteralNode_(final IntegerLiteralNode _anObject) {
    _stream.append("" + _anObject.integer());
    return this;
  }

  @Override
  public SourcePrinter visitIntermediateNode_(final IntermediateNode _anObject) {
    this.visit_(_anObject.unoptimized());
    return this;
  }

  @Override
  public SourcePrinter visitIntermediateStatement_(final IntermediateStatement _anObject) {
    this.visit_(_anObject.unoptimized());
    return this;
  }

  @Override
  public SourcePrinter visitMessageNode_(final MessageNode _aNode) {
    final boolean _parenthesize;
    _parenthesize = (_precedence != null) && ((_aNode.precedence() > _precedence) || (st.gravel.support.jvm.IntegerExtensions.equals_(_precedence, 3) && st.gravel.support.jvm.IntegerExtensions.equals_(_aNode.precedence(), _precedence)));
    this.printValueNode_using_parenthesize_(_aNode, new st.gravel.support.jvm.Block0<Object>() {

      @Override
      public Object value() {
        SourcePrinter.this.visit_precedence_(_aNode.receiver(), _aNode.precedence());
        return SourcePrinter.this.printMessage_(_aNode);
      }
    }, _parenthesize);
    return this;
  }

  @Override
  public SourcePrinter visitMethodNode_(final MethodNode _aNode) {
    this.emphasis_while_(st.gravel.core.Symbol.value("bold"), new st.gravel.support.jvm.Block0<Object>() {

      @Override
      public Object value() {
        if (st.gravel.support.jvm.IntegerExtensions.equals_(_aNode.precedence(), 1)) {
          return _stream.append(_aNode.selector());
        } else {
          return st.gravel.support.jvm.ArrayExtensions.with_do_separatedBy_(_aNode.keywords(), _aNode.arguments(), new st.gravel.support.jvm.Block2<Object, String, VariableDeclarationNode>() {

            @Override
            public Object value_value_(final String _s, final VariableDeclarationNode _arg) {
              _stream.append(_s);
              _stream.append(' ');
              return SourcePrinter.this.visit_(_arg);
            }
          }, new st.gravel.support.jvm.Block0<Object>() {

            @Override
            public Object value() {
              return _stream.append(' ');
            }
          });
        }
      }
    });
    this.printDeclaredReturnType_(_aNode.returnType());
    this.indentDo_(new st.gravel.support.jvm.Block0<Object>() {

      @Override
      public Object value() {
        return SourcePrinter.this.printComment_(_aNode.comment());
      }
    });
    this.indentDo_(new st.gravel.support.jvm.Block0<Object>() {

      @Override
      public Object value() {
        return SourcePrinter.this.printPragmas_(_aNode.pragmas());
      }
    });
    if (_aNode.body().isEmpty()) {
      return SourcePrinter.this;
    }
    this.indentDo_(new st.gravel.support.jvm.Block0<Object>() {

      @Override
      public Object value() {
        SourcePrinter.this.crtab_(_indentation);
        return SourcePrinter.this.printBlockBody_(_aNode.body());
      }
    });
    return this;
  }

  @Override
  public SourcePrinter visitNamespacedTypeVariableNode_(final NamespacedTypeVariableNode _anObject) {
    boolean _temp1 = true;
    for (final String _each : _anObject.path()) {
      if (_temp1) {
        _temp1 = false;
      } else {
        _stream.append('.');
      }
      _stream.append(_each);
    }
    return this;
  }

  @Override
  public SourcePrinter visitNamespacedVariableNode_(final NamespacedVariableNode _anObject) {
    boolean _temp1 = true;
    for (final String _each : _anObject.path()) {
      if (_temp1) {
        _temp1 = false;
      } else {
        _stream.append('.');
      }
      _stream.append(_each);
    }
    return this;
  }

  @Override
  public SourcePrinter visitNilLiteralNode_(final NilLiteralNode _anObject) {
    _stream.append("nil");
    return this;
  }

  @Override
  public SourcePrinter visitPragmaNode_(final PragmaNode _aPragmaNode) {
    final MessageNode _aNode;
    _stream.append('<');
    _aNode = _aPragmaNode.expression();
    if (st.gravel.support.jvm.IntegerExtensions.equals_(_aNode.arguments().length, 0)) {
      _stream.append(_aNode.selector());
    } else {
      st.gravel.support.jvm.ArrayExtensions.with_do_separatedBy_(_aNode.keywords(), _aNode.arguments(), new st.gravel.support.jvm.Block2<Object, String, Expression>() {

        @Override
        public Object value_value_(final String _key, final Expression _value) {
          _stream.append(_key);
          _stream.append(' ');
          return SourcePrinter.this.visit_(_value);
        }
      }, new st.gravel.support.jvm.Block0<Object>() {

        @Override
        public Object value() {
          return _stream.append(' ');
        }
      });
    }
    _stream.append('>');
    return this;
  }

  @Override
  public SourcePrinter visitReferenceLiteralNode_(final ReferenceLiteralNode _anObject) {
    _stream.append("#{");
    boolean _temp1 = true;
    for (final String _each : _anObject.path()) {
      if (_temp1) {
        _temp1 = false;
      } else {
        _stream.append('.');
      }
      _stream.append(_each);
    }
    _stream.append('}');
    return this;
  }

  @Override
  public SourcePrinter visitReturnNode_(final ReturnNode _aNode) {
    this.printCommentOf_(_aNode);
    _stream.append('^');
    this.visit_(_aNode.value());
    return this;
  }

  @Override
  public SourcePrinter visitSelfTypeNode_(final SelfTypeNode _anObject) {
    _stream.append("Self");
    return this;
  }

  @Override
  public SourcePrinter visitSequenceNode_(final SequenceNode _aNode) {
    this.printBlockBody_(_aNode);
    return this;
  }

  @Override
  public SourcePrinter visitStringLiteralNode_(final StringLiteralNode _anObject) {
    _stream.append('\'');
    int _temp2 = _anObject.value().length();
    for (int _temp1 = 0; _temp1 < _temp2; _temp1++) {
      char _ch = _anObject.value().charAt(_temp1);
      _stream.append(_ch);
      if (_ch == '\'') {
        _stream.append('\'');
      }
    }
    _stream.append('\'');
    return this;
  }

  @Override
  public SourcePrinter visitSymbolLiteralNode_(final SymbolLiteralNode _anObject) {
    _stream.append("" + _anObject.value());
    return this;
  }

  @Override
  public SourcePrinter visitTypeDefNode_(final TypeDefNode _anObject) {
    this.visit_(_anObject.node());
    _stream.append(" def");
    return this;
  }

  @Override
  public SourcePrinter visitTypeOrNode_(final TypeOrNode _anObject) {
    this.visit_(_anObject.left());
    _stream.append(" | ");
    this.visit_(_anObject.right());
    return this;
  }

  @Override
  public SourcePrinter visitTypeVariableNode_(final TypeVariableNode _anObject) {
    _stream.append(_anObject.name());
    return this;
  }

  @Override
  public SourcePrinter visitVariableDeclarationNode_(final VariableDeclarationNode _anObject) {
    _stream.append(_anObject.name());
    if (_anObject.type() != null) {
      _stream.append(' ');
      SourcePrinter.this.printTypeNode_(_anObject.type());
    }
    return this;
  }

  @Override
  public SourcePrinter visitVariableNode_(final VariableNode _anObject) {
    _stream.append(_anObject.name());
    return this;
  }

  @Override
  public SourcePrinter visit_(final Node _aNode) {
    _precedence = null;
    this.pvtVisit_(_aNode);
    return this;
  }

  public SourcePrinter visit_precedence_(final Node _aNode, final Integer _anIntegerOrNil) {
    this.visit_precedence_indentation_(_aNode, _anIntegerOrNil, _indentation);
    return this;
  }

  public SourcePrinter visit_precedence_indentation_(final Node _aNode, final Integer _anIntegerOrNil, final int _aLevel) {
    this.visit_precedence_indentation_emphasis_(_aNode, _anIntegerOrNil, _aLevel, _emphasis);
    return this;
  }

  public SourcePrinter visit_precedence_indentation_emphasis_(final Node _aNode, final Integer _anIntegerOrNil, final int _aLevel, final st.gravel.core.Symbol _anObject) {
    this.copy().pvtSetPrecedence_indentation_emphasis_(_anIntegerOrNil, _aLevel, _anObject).pvtVisit_(_aNode);
    return this;
  }

  public SourcePrinter when_parenthesize_(final boolean _aBoolean, final st.gravel.support.jvm.Block0<Object> _aBlock) {
    if (_aBoolean) {
      _stream.append('(');
      _aBlock.value();
      _stream.append(')');
    } else {
      _aBlock.value();
    }
    return this;
  }
}
TOP

Related Classes of st.gravel.support.compiler.ast.SourcePrinter$SourcePrinter_Factory

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.