All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jruby.ast.util.SexpMaker Maven / Gradle / Ivy

The newest version!
package org.jruby.ast.util;

import java.io.File;
import org.jruby.ast.AliasNode;
import org.jruby.ast.ArgumentNode;
import org.jruby.ast.AttrAssignNode;
import org.jruby.ast.BackRefNode;
import org.jruby.ast.BignumNode;
import org.jruby.ast.BlockArgNode;
import org.jruby.ast.CallNode;
import org.jruby.ast.ClassVarAsgnNode;
import org.jruby.ast.ClassVarDeclNode;
import org.jruby.ast.ClassVarNode;
import org.jruby.ast.Colon2Node;
import org.jruby.ast.Colon3Node;
import org.jruby.ast.ConstDeclNode;
import org.jruby.ast.ConstNode;
import org.jruby.ast.DAsgnNode;
import org.jruby.ast.DRegexpNode;
import org.jruby.ast.DVarNode;
import org.jruby.ast.DotNode;
import org.jruby.ast.FCallNode;
import org.jruby.ast.FileNode;
import org.jruby.ast.FixnumNode;
import org.jruby.ast.FlipNode;
import org.jruby.ast.FloatNode;
import org.jruby.ast.GlobalAsgnNode;
import org.jruby.ast.GlobalVarNode;
import org.jruby.ast.InstAsgnNode;
import org.jruby.ast.InstVarNode;
import org.jruby.ast.LocalAsgnNode;
import org.jruby.ast.LocalVarNode;
import org.jruby.ast.Node;
import org.jruby.ast.NthRefNode;
import org.jruby.ast.OpAsgnNode;
import org.jruby.ast.OpElementAsgnNode;
import org.jruby.ast.RegexpNode;
import org.jruby.ast.StrNode;
import org.jruby.ast.SymbolNode;
import org.jruby.ast.UndefNode;
import org.jruby.ast.VAliasNode;
import org.jruby.ast.VCallNode;
import org.jruby.ast.XStrNode;

public class SexpMaker {
    public static String create(Node node) {
        StringBuilder sb = new StringBuilder(100);
        
        process(sb, node);
        
        return sb.toString();
    }
    
    public static String create(String methodName, Node argsNode, Node body) {
        StringBuilder sb = new StringBuilder(100);
        
        processMethod(sb, methodName, argsNode, body);
        
        return sb.toString();
    }
    
    private static void processMethod(StringBuilder sb, String methodName, Node argsNode, Node body) {
        sb.append("(method ").append(methodName).append(' ');
        // JRUBY-4301, include filename and line in sexp
        sb.append("(file ").append(new File(body.getPosition().getFile()).getName()).append(") ");
        sb.append("(line ").append(body.getPosition().getStartLine()).append(") ");
        process(sb, argsNode);
        sb.append(' ');
        process(sb, body);
        sb.append(')');
    }

    /**
     * process each node by printing out '(' name data child* ')'
     * @param node
     */
    private static void process(StringBuilder sb, Node node) {
        if (node == null) {
            sb.append("null");
            return;
        }
        
        sb.append('(');
        shortName(sb, node);
        leafInfo(sb, node);
        
        for (Node child: node.childNodes()) {
            sb.append(' ');
            process(sb, child);
        }
        
        sb.append(')');
    }

    private static void shortName(StringBuilder sb, Node node) {
        sb.append(node.getNodeType().simpleName());
    }

    /**
     * Extra information that is not child nodes, but actual leaf data.
     *
     * @param node
     */
    private static void leafInfo(StringBuilder sb, Node node) {
        switch (node.getNodeType()) {
            case ALIASNODE: aliasNode(sb, (AliasNode) node); break;
            case ARGUMENTNODE: argumentNode(sb, (ArgumentNode) node); break;
            case ATTRASSIGNNODE: attrAssignNode(sb, (AttrAssignNode) node); break;
            case BACKREFNODE: backRefNode(sb, (BackRefNode) node); break;
            case BIGNUMNODE: bignumNode(sb, (BignumNode) node); break;
            case BLOCKARGNODE: blockArgNode(sb, (BlockArgNode) node); break;
            case CALLNODE: callNode(sb, (CallNode) node); break;
            case CLASSVARASGNNODE: classVarAsgnNode(sb, (ClassVarAsgnNode) node); break;
            case CLASSVARDECLNODE: classVarDeclNode(sb, (ClassVarDeclNode) node); break;
            case CLASSVARNODE: classVarNode(sb, (ClassVarNode) node); break;
            case COLON2NODE: colon2Node(sb, (Colon2Node) node); break;
            case COLON3NODE: colon3Node(sb, (Colon3Node) node); break;
            case CONSTDECLNODE: constDeclNode(sb, (ConstDeclNode) node); break;
            case CONSTNODE: constNode(sb, (ConstNode) node); break;
            case DASGNNODE: dAsgnNode(sb, (DAsgnNode) node); break;
            case DOTNODE: dotNode(sb, (DotNode) node); break;
            case DREGEXPNODE: dRegexpNode(sb, (DRegexpNode) node); break;
            case DVARNODE: dVarNode(sb, (DVarNode) node); break;
            case FCALLNODE: fCallNode(sb, (FCallNode) node); break;
            case FIXNUMNODE: fixnumNode(sb, (FixnumNode) node); break;
            case FLIPNODE: flipNode(sb, (FlipNode) node); break;
            case FLOATNODE: floatNode(sb, (FloatNode) node); break;
            case GLOBALASGNNODE: globalAsgnNode(sb, (GlobalAsgnNode) node); break;
            case GLOBALVARNODE: globalVarNode(sb, (GlobalVarNode) node); break;
            case INSTASGNNODE: instAsgnNode(sb, (InstAsgnNode) node); break;
            case INSTVARNODE: instVarNode(sb, (InstVarNode) node); break;
            case LOCALASGNNODE: localAsgnNode(sb, (LocalAsgnNode) node); break;
            case LOCALVARNODE: localVarNode(sb, (LocalVarNode) node); break;
            case NTHREFNODE: nthRefNode(sb, (NthRefNode) node); break;
            case OPASGNNODE: opAsgnNode(sb, (OpAsgnNode) node); break;
            case OPELEMENTASGNNODE: opElementAsgnNode(sb, (OpElementAsgnNode) node); break;
            case REGEXPNODE: regexpNode(sb, (RegexpNode) node); break;
            case STRNODE: strNode(sb, (StrNode) node); break;
            case SYMBOLNODE: symbolNode(sb, (SymbolNode) node); break;
            case UNDEFNODE: undefNode(sb, (UndefNode) node); break;
            case VALIASNODE: valiasNode(sb, (VAliasNode) node); break;
            case VCALLNODE: vcallNode(sb, (VCallNode) node); break;
            case XSTRNODE: xStrNode(sb, (XStrNode) node); break;

            /* these do nothing
            case ANDNODE:
            case ARGSCATNODE:
            case ARGSPUSHNODE:
            case ARRAYNODE:
            case BEGINNODE:
            case BLOCKNODE:
            case BLOCKPASSNODE:
            case BREAKNODE:
            case CASENODE:
            case CLASSNODE:
            case DEFINEDNODE:
            case DEFNNODE:
            case DEFSNODE:
            case DSTRNODE:
            case DSYMBOLNODE:
            case DXSTRNODE:
            case ENSURENODE:
            case EVSTRNODE:
            case FALSENODE:
            case FORNODE:
            case HASHNODE:
            case IFNODE:
            case ITERNODE:
            case MATCH2NODE:
            case MATCH3NODE:
            case MATCHNODE:
            case MODULENODE:
            case MULTIPLEASGNNODE:
            case NEWLINENODE:
            case NEXTNODE:
            case NILNODE:
            case NOTNODE:
            case OPASGNORNODE:
            case OPASGNANDNODE:
            case ORNODE:
            case PREEXENODE:
            case POSTEXENODE:
            case REDONODE:
            case RESCUEBODYNODE:
            case RESCUENODE:
            case RETRYNODE:
            case RETURNNODE:
            case ROOTNODE:
            case SCLASSNODE:
            case SELFNODE:
            case SPLATNODE:
            case SUPERNODE:
            case SVALUENODE:
            case TOARYNODE:
            case TRUENODE:
            case UNTILNODE:
            case WHENNODE:
            case WHILENODE:
            case YIELDNODE:
            case ZARRAYNODE:
            case ZSUPERNODE:
                noDataContents(node);
                break;
            */
            
            default:
        }
    }

    private static void xStrNode(StringBuilder sb, XStrNode node) {
        sb.append(" '").append(node.getValue()).append('\'');
    }

    private static void vcallNode(StringBuilder sb, VCallNode node) {
        sb.append(' ').append(node.getName());
    }

    private static void valiasNode(StringBuilder sb, VAliasNode node) {
        sb.append(' ').append(node.getOldName()).append(node.getNewName());
    }

    private static void undefNode(StringBuilder sb, UndefNode node) {
        sb.append(' ').append(node.getName());
    }

    private static void strNode(StringBuilder sb, StrNode node) {
        if (node instanceof FileNode) {
            // don't put the filename in, since it can vary based on filesystem
            // layout and does not change behavior directly
            sb.append(" __FILE__");
        } else {
            sb.append(" '").append(node.getValue()).append('\'');
        }
    }

    private static void regexpNode(StringBuilder sb, RegexpNode node) {
        sb.append(' ').append(node.getValue()).append(' ').append(node.getOptions());
    }

    private static void opElementAsgnNode(StringBuilder sb, OpElementAsgnNode node) {
        sb.append(' ').append(node.getOperatorName());
    }

    private static void nthRefNode(StringBuilder sb, NthRefNode node) {
        sb.append(' ').append(node.getMatchNumber());
    }

    private static void localAsgnNode(StringBuilder sb, LocalAsgnNode node) {
        sb.append(' ').append(node.getName());
    }

    private static void instVarNode(StringBuilder sb, InstVarNode node) {
        sb.append(' ').append(node.getName());
    }

    private static void instAsgnNode(StringBuilder sb, InstAsgnNode node) {
        sb.append(' ').append(node.getName());
    }

    private static void globalVarNode(StringBuilder sb, GlobalVarNode node) {
        sb.append(' ').append(node.getName());
    }

    private static void globalAsgnNode(StringBuilder sb, GlobalAsgnNode node) {
        sb.append(' ').append(node.getName());
    }

    private static void floatNode(StringBuilder sb, FloatNode node) {
        sb.append(' ').append(node.getValue());
    }

    private static void flipNode(StringBuilder sb, FlipNode node) {
        sb.append(' ').append(node.isExclusive());
    }

    private static void fixnumNode(StringBuilder sb, FixnumNode node) {
        sb.append(' ').append(node.getValue());
    }

    private static void fCallNode(StringBuilder sb, FCallNode node) {
        sb.append(' ').append(node.getName());
    }

    private static void dVarNode(StringBuilder sb, DVarNode node) {
        sb.append(' ').append(node.getName());
    }

    private static void blockArgNode(StringBuilder sb, BlockArgNode node) {
        sb.append(' ').append(node.getName());
    }

    private static void backRefNode(StringBuilder sb, BackRefNode node) {
        sb.append(' ').append(node.getType());
    }

    private static void symbolNode(StringBuilder sb, SymbolNode node) {
        sb.append(' ').append(node.getName());
    }

    private static void localVarNode(StringBuilder sb, LocalVarNode node) {
        sb.append(' ').append(node.getName());
    }

    private static void argumentNode(StringBuilder sb, ArgumentNode node) {
        sb.append(' ').append(node.getName());
    }

    private static void dRegexpNode(StringBuilder sb, DRegexpNode node) {
        sb.append(' ').append(node.getOnce()).append(' ').append(node.getOptions());
    }

    private static void dotNode(StringBuilder sb, DotNode node) {
        sb.append(' ').append(node.isExclusive()).append(' ').append(node.isLiteral());
    }

    private static void dAsgnNode(StringBuilder sb, DAsgnNode node) {
        sb.append(' ').append(node.getName());
    }

    private static void constNode(StringBuilder sb, ConstNode node) {
        sb.append(' ').append(node.getName());
    }

    private static void constDeclNode(StringBuilder sb, ConstDeclNode node) {
        sb.append(' ').append(node.getName());
    }

    private static void colon3Node(StringBuilder sb, Colon3Node node) {
        sb.append(' ').append(node.getName());
    }

    private static void colon2Node(StringBuilder sb, Colon2Node node) {
        sb.append(' ').append(node.getName());
    }

    private static void classVarNode(StringBuilder sb, ClassVarNode node) {
        sb.append(' ').append(node.getName());
    }

    private static void classVarDeclNode(StringBuilder sb, ClassVarDeclNode node) {
        sb.append(' ').append(node.getName());
    }

    private static void classVarAsgnNode(StringBuilder sb, ClassVarAsgnNode node) {
        sb.append(' ').append(node.getName());
    }

    private static void callNode(StringBuilder sb, CallNode node) {
        sb.append(' ').append(node.getName());
    }


    private static void bignumNode(StringBuilder sb, BignumNode node) {
        sb.append(' ').append(node.getValue());
    }

    private static void attrAssignNode(StringBuilder sb, AttrAssignNode node) {
        sb.append(' ').append(node.getName());
    }

    private static void aliasNode(StringBuilder sb, AliasNode node) {
        sb.append(' ').append(node.getOldName()).append(node.getNewName());
    }

    private static void opAsgnNode(StringBuilder sb, OpAsgnNode node) {
        sb.append(" '").append(node.getOperatorName()).append('\'');
    }
        
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy