<commit_before>// RubyConvert.java

package ed.lang.ruby;

import java.io.*;
import java.util.*;

import org.jruby.ast.*;
import org.jruby.common.*;
import org.jruby.parser.*;
import org.jruby.lexer.yacc.*;

import ed.js.*;
import ed.js.engine.*;
import ed.appserver.templates.*;

public class RubyConvert extends ed.MyAsserts {
    
    final static boolean D = Boolean.getBoolean( "DEBUG.RUBY" );

    public static class TemplateImpl implements TemplateConverter {

        public Result convert( Template t ){
            if ( ! t.getName().endsWith( ".rb" ) )
                return null;
            
            try {
                final RubyConvert rc = new RubyConvert( t.getName() , t.getContent() );
                final String jsSource = rc.getJSSource();
                if ( D ) System.out.println( jsSource );
                return new TemplateConverter.Result( new Template( t.getName().replaceAll( ".rb$" , "_rb.js" ) , jsSource ) , null );
            }
            catch ( IOException ioe ){
                throw new RuntimeException( "couldn't convert : " + t.getName() , ioe );
            }
        }
    }
    
    public RubyConvert( File f )
        throws IOException {
        this( f.toString() , new FileInputStream( f ) );
    }

    public RubyConvert( String name , String code )
        throws IOException {
        this( name , new ByteArrayInputStream( code.getBytes() ) );
    }
    
    public RubyConvert( String name , InputStream in )
        throws IOException {

        _name = name;
        _lines = new ArrayList<String>();
        _warnings = new NullWarnings();

        DefaultRubyParser p = new DefaultRubyParser();
        p.setWarnings( _warnings );
        
        RubyParserResult r = p.parse( new ParserConfiguration( 1 , true ) ,
                                      new InputStreamLexerSource( _name , in ,
                                                                  _lines , 1 , false ) );
        _ast = r.getAST();
        if ( D ) _print( 0 , _ast );
        _add( _ast , new State() );
    }
    
    void _add( Node node , State state ){
        
        if ( node == null || state == null )
            throw new RuntimeException( "can't be null" );
        
        // --- blocking ----

        if ( node instanceof RootNode ){
            _assertOne( node );
            _add( node.childNodes().get(0) , state );
        }

        else if ( node instanceof BlockNode ){
            _appned( "{\n" , node );
            if ( node.childNodes() != null )
                for ( Node c : node.childNodes() )
                    _add( c , state );
            _appned( "\n}\n" , node );
        }

        else if ( node instanceof NewlineNode ){
            _assertOne( node );
            _add( node.childNodes().get(0) , state );
            _appned( ";\n" , node );
        }

        else if ( node instanceof ReturnNode ){
            _assertOne( node );
            _appned( "return " , node );
            _add( node.childNodes().get(0), state );
        }

        else if ( node instanceof ForNode ){

            ForNode fn = (ForNode)node;
            
            _add( fn.getIterNode() , state );
            _appned( ".forEach( " , fn );
            _addIterBlock( fn , state );
            _appned( " ) " , fn );
        }

        else if ( node instanceof IterNode ){
            _addIterBlock( (IterNode)node , state );
        }

        // --- function stuff ---

        else if ( node instanceof FCallNode ){
            FCallNode f = (FCallNode)node;

            if ( f.getIterNode() != null ){
                
                _appned( _getFuncName( f )  , node );
                _appned( "(" , node );
                _add( f.getIterNode() , state );
                _appned( ")" , node );
            }
            else if ( f.getArgsNode() == null || 
                 f.getArgsNode().childNodes() == null || 
                 f.getArgsNode().childNodes().size() == 0 ){
                // no args
                _appned( Ruby.RUBY_V_CALL + "(" + _getFuncName( f ) + ")" , f );
            }
            else { 
                // has args
                _appned( _getFuncName( f )  , node );
                _addArgs( f , f.getArgsNode().childNodes() , state );
            }
        }

        
        else if ( node instanceof CallNode ){
            _addCall( (CallNode)node , state );
        }
        
        else if ( node instanceof MethodDefNode ){

            MethodDefNode dn = (MethodDefNode)node;
            
            if ( state._className != null ){
                _appned( state._className + "." + ( ( dn instanceof DefsNode ) ? "" : "prototype." ) , node );
            }
            _appned( _mangleFunctionName( dn.getName() ) + " = function(" , node );
            
            ArgsNode an = dn.getArgsNode();
            if ( an != null && an.getArgs() != null ){
                for ( int i=0; i<an.getArgs().size(); i++ ){
                    ArgumentNode a = (ArgumentNode)an.getArgs().get(i);
                    if ( i > 0 )
                        _appned( " , " , a );
                    _appned( a.getName() , a );
                }
            }

            _appned( " ){\n" , node );
            _add( dn.getBodyNode() , state );
            _appned( " \n}\n " , node );
        }

        else if ( node instanceof VCallNode ){
            _assertNoChildren( node );
            VCallNode vcn = (VCallNode)node;
            _appned( Ruby.RUBY_V_CALL + "( " + vcn.getName() + ")" , node );
        }

        // --- class stuff ---
        
        else if ( node instanceof ClassNode ){
            // complicated enough to warrant own method
            _addClass( (ClassNode)node , state );
        }

        else if ( node instanceof InstAsgnNode ){
            _assertOne( node );
            InstAsgnNode lan = (InstAsgnNode)node;
            _appned( "this." + lan.getName().substring(1) + " = " , node );
            _add( node.childNodes().get( 0 ) , state );
            _appned( "" , node );            
        }

        else if ( node instanceof InstVarNode ){
            _assertNoChildren( node );
            InstVarNode lvn = (InstVarNode)node;
            _appned( "this." + lvn.getName().substring(1) , node );
        }
        
        // --- looping ---

        else if ( node instanceof WhileNode ){
            _assertType( node.childNodes().get(0) , NewlineNode.class );
            _appned( "while ( " , node );
            _add( node.childNodes().get(0).childNodes().get(0) , state );
            _appned( " ){ \n " , node );
            _add( node.childNodes().get(1) , state );
            _appned( "\n } \n " , node );
        }

        else if ( node instanceof IfNode ){
            IfNode ifn = (IfNode)node;
            _appned( "if ( " , ifn );
            if ( ifn.getCondition() != null )
                _add( ifn.getCondition() , state );
            _appned( " ){ \n " , ifn );
            if ( ifn.getThenBody() != null )
                _add( ifn.getThenBody() , state );
            _appned( " } \n " , ifn );
            if ( ifn.getElseBody() != null ){
                _appned( " else { \n " , ifn );
                _add( ifn.getElseBody() , state );
                _appned( " } \n " , ifn );
            }
        }

        // --- vars ---

        else if ( node instanceof LocalAsgnNode ){
            _assertOne( node );
            LocalAsgnNode lan = (LocalAsgnNode)node;
            _appned( "var " + lan.getName() + " = " , node );
            _add( node.childNodes().get( 0 ) , state );
            _appned( "" , node );
        }
        
        else if ( node instanceof LocalVarNode ){
            _assertNoChildren( node );
            LocalVarNode lvn = (LocalVarNode)node;
            _appned( lvn.getName() , node );
        }

        else if ( node instanceof DVarNode ){
            _assertNoChildren( node );
            DVarNode lvn = (DVarNode)node;
            _appned( lvn.getName() , node );
        }

        else if ( node instanceof ConstNode ){
            _assertNoChildren( node );
            ConstNode lvn = (ConstNode)node;
            _appned( lvn.getName() , node );
        }
        
        else if ( node instanceof DStrNode ){
            _appned( " ( " , node );
            for ( int i=0; i<node.childNodes().size(); i++ ){
                if ( i > 0 )
                    _appned( " + " , node );
                _add( node.childNodes().get(i) , state );
            }
            _appned( " ) " , node );
        }

        else if ( node instanceof EvStrNode ){
            _assertOne( node );
            _add( node.childNodes().get(0).childNodes().get(0) , state );
        }

        else if ( node instanceof Colon2Node ){
            _assertOne( node );
            Colon2Node cn = (Colon2Node)node;
            _add( node.childNodes().get(0) , state );
            _appned( "." + cn.getName() , node );
        }
        
        else if ( node instanceof AttrAssignNode ){
            AttrAssignNode aan = (AttrAssignNode)node;

            _appned( " ( " , aan );
            _add( aan.getReceiverNode() , state );
            
            _appned( "[" , aan );
            _add( aan.getArgsNode().childNodes().get(0) , state );
            _appned( "]" , aan );
            
            _appned( " = " , aan );
            _add( aan.getArgsNode().childNodes().get(1) , state );

            _appned( " ) " , aan );

        }

        // --- literals ---
        
        else if ( node instanceof ArrayNode ){
            
            if ( node.childNodes() == null || 
                 node.childNodes().size() == 0 ){}
            else if ( node.childNodes().size() > 1 ){ 
                _appned( "[" , node );
                for ( int i=0; i<node.childNodes().size(); i++){
                    if ( i > 0 )
                        _appned( " , " , node );
                    _add( node.childNodes().get(i) , state );
                }
                _appned( "]" , node );
            }
            else {
                _add( node.childNodes().get(0) , state );
            }
        }<commit_msg>fix asgn<commit_after>// RubyConvert.java

package ed.lang.ruby;

import java.io.*;
import java.util.*;

import org.jruby.ast.*;
import org.jruby.common.*;
import org.jruby.parser.*;
import org.jruby.lexer.yacc.*;

import ed.js.*;
import ed.js.engine.*;
import ed.appserver.templates.*;

public class RubyConvert extends ed.MyAsserts {
    
    final static boolean D = Boolean.getBoolean( "DEBUG.RUBY" );

    public static class TemplateImpl implements TemplateConverter {

        public Result convert( Template t ){
            if ( ! t.getName().endsWith( ".rb" ) )
                return null;
            
            try {
                final RubyConvert rc = new RubyConvert( t.getName() , t.getContent() );
                final String jsSource = rc.getJSSource();
                if ( D ) System.out.println( jsSource );
                return new TemplateConverter.Result( new Template( t.getName().replaceAll( ".rb$" , "_rb.js" ) , jsSource ) , null );
            }
            catch ( IOException ioe ){
                throw new RuntimeException( "couldn't convert : " + t.getName() , ioe );
            }
        }
    }
    
    public RubyConvert( File f )
        throws IOException {
        this( f.toString() , new FileInputStream( f ) );
    }

    public RubyConvert( String name , String code )
        throws IOException {
        this( name , new ByteArrayInputStream( code.getBytes() ) );
    }
    
    public RubyConvert( String name , InputStream in )
        throws IOException {

        _name = name;
        _lines = new ArrayList<String>();
        _warnings = new NullWarnings();

        DefaultRubyParser p = new DefaultRubyParser();
        p.setWarnings( _warnings );
        
        RubyParserResult r = p.parse( new ParserConfiguration( 1 , true ) ,
                                      new InputStreamLexerSource( _name , in ,
                                                                  _lines , 1 , false ) );
        _ast = r.getAST();
        if ( D ) _print( 0 , _ast );
        _add( _ast , new State() );
    }
    
    void _add( Node node , State state ){
        
        if ( node == null || state == null )
            throw new RuntimeException( "can't be null" );
        
        // --- blocking ----

        if ( node instanceof RootNode ){
            _assertOne( node );
            _add( node.childNodes().get(0) , state );
        }

        else if ( node instanceof BlockNode ){
            _appned( "{\n" , node );
            if ( node.childNodes() != null )
                for ( Node c : node.childNodes() )
                    _add( c , state );
            _appned( "\n}\n" , node );
        }

        else if ( node instanceof NewlineNode ){
            _assertOne( node );
            _add( node.childNodes().get(0) , state );
            _appned( ";\n" , node );
        }

        else if ( node instanceof ReturnNode ){
            _assertOne( node );
            _appned( "return " , node );
            _add( node.childNodes().get(0), state );
        }

        else if ( node instanceof ForNode ){

            ForNode fn = (ForNode)node;
            
            _add( fn.getIterNode() , state );
            _appned( ".forEach( " , fn );
            _addIterBlock( fn , state );
            _appned( " ) " , fn );
        }

        else if ( node instanceof IterNode ){
            _addIterBlock( (IterNode)node , state );
        }

        // --- function stuff ---

        else if ( node instanceof FCallNode ){
            FCallNode f = (FCallNode)node;

            if ( f.getIterNode() != null ){
                
                _appned( _getFuncName( f )  , node );
                _appned( "(" , node );
                _add( f.getIterNode() , state );
                _appned( ")" , node );
            }
            else if ( f.getArgsNode() == null || 
                 f.getArgsNode().childNodes() == null || 
                 f.getArgsNode().childNodes().size() == 0 ){
                // no args
                _appned( Ruby.RUBY_V_CALL + "(" + _getFuncName( f ) + ")" , f );
            }
            else { 
                // has args
                _appned( _getFuncName( f )  , node );
                _addArgs( f , f.getArgsNode().childNodes() , state );
            }
        }

        
        else if ( node instanceof CallNode ){
            _addCall( (CallNode)node , state );
        }
        
        else if ( node instanceof MethodDefNode ){

            MethodDefNode dn = (MethodDefNode)node;
            
            if ( state._className != null ){
                _appned( state._className + "." + ( ( dn instanceof DefsNode ) ? "" : "prototype." ) , node );
            }
            _appned( _mangleFunctionName( dn.getName() ) + " = function(" , node );
            
            ArgsNode an = dn.getArgsNode();
            if ( an != null && an.getArgs() != null ){
                for ( int i=0; i<an.getArgs().size(); i++ ){
                    ArgumentNode a = (ArgumentNode)an.getArgs().get(i);
                    if ( i > 0 )
                        _appned( " , " , a );
                    _appned( a.getName() , a );
                }
            }

            _appned( " ){\n" , node );
            _add( dn.getBodyNode() , state );
            _appned( " \n}\n " , node );
        }

        else if ( node instanceof VCallNode ){
            _assertNoChildren( node );
            VCallNode vcn = (VCallNode)node;
            _appned( Ruby.RUBY_V_CALL + "( " + vcn.getName() + ")" , node );
        }

        // --- class stuff ---
        
        else if ( node instanceof ClassNode ){
            // complicated enough to warrant own method
            _addClass( (ClassNode)node , state );
        }

        else if ( node instanceof InstAsgnNode ){
            _assertOne( node );
            InstAsgnNode lan = (InstAsgnNode)node;
            _appned( "this." + lan.getName().substring(1) + " = " , node );
            _add( node.childNodes().get( 0 ) , state );
            _appned( "" , node );            
        }

        else if ( node instanceof InstVarNode ){
            _assertNoChildren( node );
            InstVarNode lvn = (InstVarNode)node;
            _appned( "this." + lvn.getName().substring(1) , node );
        }
        
        // --- looping ---

        else if ( node instanceof WhileNode ){
            _assertType( node.childNodes().get(0) , NewlineNode.class );
            _appned( "while ( " , node );
            _add( node.childNodes().get(0).childNodes().get(0) , state );
            _appned( " ){ \n " , node );
            _add( node.childNodes().get(1) , state );
            _appned( "\n } \n " , node );
        }

        else if ( node instanceof IfNode ){
            IfNode ifn = (IfNode)node;
            _appned( "if ( " , ifn );
            if ( ifn.getCondition() != null )
                _add( ifn.getCondition() , state );
            _appned( " ){ \n " , ifn );
            if ( ifn.getThenBody() != null )
                _add( ifn.getThenBody() , state );
            _appned( " } \n " , ifn );
            if ( ifn.getElseBody() != null ){
                _appned( " else { \n " , ifn );
                _add( ifn.getElseBody() , state );
                _appned( " } \n " , ifn );
            }
        }

        // --- vars ---

        else if ( node instanceof LocalAsgnNode ){
            _assertOne( node );
            LocalAsgnNode lan = (LocalAsgnNode)node;
            _appned( "var " + lan.getName() + " = " , node );
            _add( node.childNodes().get( 0 ) , state );
            _appned( "" , node );
        }
        
        else if ( node instanceof LocalVarNode ){
            _assertNoChildren( node );
            LocalVarNode lvn = (LocalVarNode)node;
            _appned( lvn.getName() , node );
        }

        else if ( node instanceof DVarNode ){
            _assertNoChildren( node );
            DVarNode lvn = (DVarNode)node;
            _appned( lvn.getName() , node );
        }

        else if ( node instanceof ConstNode ){
            _assertNoChildren( node );
            ConstNode lvn = (ConstNode)node;
            _appned( lvn.getName() , node );
        }
        
        else if ( node instanceof DStrNode ){
            _appned( " ( " , node );
            for ( int i=0; i<node.childNodes().size(); i++ ){
                if ( i > 0 )
                    _appned( " + " , node );
                _add( node.childNodes().get(i) , state );
            }
            _appned( " ) " , node );
        }

        else if ( node instanceof EvStrNode ){
            _assertOne( node );
            _add( node.childNodes().get(0).childNodes().get(0) , state );
        }

        else if ( node instanceof Colon2Node ){
            _assertOne( node );
            Colon2Node cn = (Colon2Node)node;
            _add( node.childNodes().get(0) , state );
            _appned( "." + cn.getName() , node );
        }
        
        else if ( node instanceof AttrAssignNode ){
            AttrAssignNode aan = (AttrAssignNode)node;

            final String name = aan.getName().trim();
            
            _appned( " ( " , aan );
            _add( aan.getReceiverNode() , state );
            
            if ( name.equals( "[]=" ) ){
                _appned( "[" , aan );
                _add( aan.getArgsNode().childNodes().get(0) , state );
                _appned( "]" , aan );
                
                _appned( " = " , aan );
                _add( aan.getArgsNode().childNodes().get(1) , state );
            }
            else {
                _appned( "." + name , aan );
                _add( aan.getArgsNode().childNodes().get(0) , state );
            }
                

            _appned( " ) " , aan );

        }

        // --- literals ---
        
        else if ( node instanceof ArrayNode ){
            
            if ( node.childNodes() == null || 
                 node.childNodes().size() == 0 ){}
            else if ( node.childNodes().size() > 1 ){ 
                _appned( "[" , node );
                for ( int i=0; i<node.childNodes().size(); i++){
                    if ( i > 0 )
                        _appned( " , " , node );
                    _add( node.childNodes().get(i) , state );
                }
                _appned( "]" , node );
            }
            else {
                _add( node.childNodes().get(0) , state );
            }
        }
{'fraction_non_alphanumeric': 0.13262586616271746, 'fraction_numerical': 0.0031496826089063333, 'mean_word_length': 1.290566037735849, 'pattern_counts': {'":': 0, '<': 11, '<?xml version=': 0, '>': 13, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 8, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3297678', 'n_tokens_mistral': 5931, 'n_tokens_neox': 5679, 'n_words': 1360}