Class Sexp
In: lib/code_analyzer/sexp.rb
Parent: Object

Methods

Public Instance methods

Get all arguments.

    s(:args_add_block,
      s(:args_add,
        s(:args_add, s(:args_new), s(:string_literal, s(:string_add, s(:string_content), s(:@tstring_content, "hello", s(1, 6))))),
        s(:string_literal, s(:string_add, s(:string_content), s(:@tstring_content, "world", s(1, 15))))
      ), false
    )
        => [
             s(:args_add, s(:args_new), s(:string_literal, s(:string_add, s(:string_content), s(:@tstring_content, "hello", s(1, 6))))),
             s(:string_literal, s(:string_add, s(:string_content), s(:@tstring_content, "world", s(1, 15))))
           ]

@return [Array] all arguments

Get all condition nodes.

    s(:binary,
      s(:binary,
        s(:var_ref, s(:@ident, "user", s(1, 0))),
        :==,
        s(:var_ref, s(:@ident, "current_user", s(1, 8)))
      ),
      :"&&",
      s(:call,
        s(:var_ref, s(:@ident, "user", s(1, 24))),
        :".",
        s(:@ident, "valid?", s(1, 29))
      )
    )
        => [
             s(:binary,
               s(:var_ref, s(:@ident, "user", s(1, 0))),
               :==,
               s(:var_ref, s(:@ident, "current_user", s(1, 8)))
             ),
             s(:call,
               s(:var_ref, s(:@ident, "user", s(1, 24))),
                 :".",
                 s(:@ident, "valid?", s(1, 29))
             )
           ]

@return [Array] all condition nodes

Get only argument for binary.

    s(:binary,
      s(:var_ref, s(:@ident, "user", s(1, 0))),
      :==,
      s(:var_ref, s(:@ident, "current_user", s(1, 8)))
    )
        => s(:var_ref, s(:@ident, "current_user", s(1, 8)))

@return [Sexp] argument node

Get arguments node.

    s(:command,
      s(:@ident, "resources", s(1, 0)),
      s(:args_add_block,
        s(:args_add, s(:args_new),
          s(:symbol_literal, s(:symbol, s(:@ident, "posts", s(1, 11))))
        ), false
      )
    )
        => s(:args_add_block,
             s(:args_add, s(:args_new),
               s(:symbol_literal, s(:symbol, s(:@ident, "posts", s(1, 11))))
             ), false
           )

@return [Sexp] arguments node

Get the array size.

    s(:array,
      s(:args_add,
        s(:args_add, s(:args_new), s(:string_literal, s(:string_add, s(:string_content), s(:@tstring_content, "first_name", s(1, 2))))),
        s(:string_literal, s(:string_add, s(:string_content), s(:@tstring_content, "last_name", s(1, 16))))
      )
    )
        => 2

@return [Integer] array size

Get the array values.

    s(:array,
      s(:args_add,
        s(:args_add, s(:args_new), s(:string_literal, s(:string_add, s(:string_content), s(:@tstring_content, "first_name", s(1, 2))))),
        s(:string_literal, s(:string_add, s(:string_content), s(:@tstring_content, "last_name", s(1, 16))))
      )
    )
        => [
             s(:string_literal, s(:string_add, s(:string_content), s(:@tstring_content, "first_name", s(1, 2)))),
             s(:string_literal, s(:string_add, s(:string_content), s(:@tstring_content, "last_name", s(1, 16))))
           ]

@return [Array] array values

Get the base class of the class node.

    s(:class,
      s(:const_ref, s(:@const, "User", s(1, 6))),
      s(:const_path_ref, s(:var_ref, s(:@const, "ActiveRecord", s(1, 13))), s(:@const, "Base", s(1, 27))),
      s(:bodystmt, s(:stmts_add, s(:stmts_new), s(:void_stmt)), nil, nil, nil)
    )
        => s(:const_path_ref, s(:var_ref, s(:@const, "ActiveRecord", s(1, 13))), s(:@const, "Base", s(1, 27))),

@return [Sexp] base class of class node

Get block node.

    s(:method_add_block,
      s(:command,
        s(:@ident, "resources", s(1, 0)),
        s(:args_add_block, s(:args_add, s(:args_new), s(:symbol_literal, s(:symbol, s(:@ident, "posts", s(1, 11))))), false)
      ),
      s(:do_block, nil,
        s(:stmts_add, s(:stmts_add, s(:stmts_new), s(:void_stmt)),
          s(:command,
          s(:@ident, "resources", s(1, 21)),
          s(:args_add_block, s(:args_add, s(:args_new), s(:symbol_literal, s(:symbol, s(:@ident, "comments", s(1, 32))))), false))
        )
      )
    )
        => s(:do_block, nil,
             s(:stmts_add, s(:stmts_add, s(:stmts_new), s(:void_stmt)),
               s(:command,
               s(:@ident, "resources", s(1, 21)),
               s(:args_add_block, s(:args_add, s(:args_new), s(:symbol_literal, s(:symbol, s(:@ident, "comments", s(1, 32))))), false))
             )
           )

@return [Sexp] body node

Get body node.

    s(:class,
      s(:const_ref, s(:@const, "User", s(1, 6))),
      nil,
      s(:bodystmt,
        s(:stmts_add, s(:stmts_new),
          s(:def,
            s(:@ident, "login", s(1, 16)),
            s(:params, nil, nil, nil, nil, nil),
            s(:bodystmt, s(:stmts_add, s(:stmts_new), s(:void_stmt)), nil, nil, nil)
          )
        ), nil, nil, nil
      )
    )
        => s(:bodystmt,
             s(:stmts_add, s(:stmts_new),
               s(:def,
                 s(:@ident, "login", s(1, 16)),
                 s(:params, nil, nil, nil, nil, nil),
                 s(:bodystmt, s(:stmts_add, s(:stmts_new), s(:void_stmt)), nil, nil, nil)
               )
             ), nil, nil, nil
           )

@return [Sexp] body node

check current node.

@param [CodeAnalyzer::CheckingVisitor::Default] visitor the visitor to check current node

return child nodes of a sexp node.

@return [Array] child nodes.

Get the class name of the class node.

    s(:class,
      s(:const_ref, s(:@const, "User", s(1, 6))),
      nil,
      s(:bodystmt, s(:stmts_add, s(:stmts_new), s(:void_stmt)), nil, nil, nil)
    )
        => s(:const_ref, s(:@const, "User", s(1, 6))),

@return [Sexp] class name node

Get the conditional statement of if node.

    s(:if,
      s(:var_ref, s(:@kw, "true", s(1, 3))),
      s(:stmts_add, s(:stmts_new), s(:void_stmt)),
      nil
    )
        => s(:var_ref, s(:@kw, "true", s(1, 3))),

@return [Sexp] conditional statement of if node

check if the self node is a const.

Get expcetion class of rescue node.

    s(:rescue,
      s(
        s(:var_ref,
          s(:@const, "CustomException", s(1, 17))
        )
      ),
      nil,
      s(:stmts_add, s(:stmts_new), s(:void_stmt)),
      nil
    )
        => s(s(:var_ref, s(:@const, "CustomException", s(1, 17))))

Get exception variable of rescue node.

    s(:rescue,
      nil,
      s(:var_field, s(:@ident, "e", s(1, 20))),
      s(:stmts_add, s(:stmts_new), s(:void_stmt)),
      nil
    )
        => s(:var_field, s(:@ident, "e", s(1, 20)))

grep all the recursive child nodes with conditions, and yield the first match node.

@param [Hash] options grep conditions

options is the grep conditions, like

    sexp_type: :call,
    receiver: s(:const, Post),
    message: [:find, :new]

the condition key is one of :sexp_type, :receiver, :message, and to_s, the condition value can be Symbol, Array or Sexp.

grep all the recursive child nodes with conditions, and yield each match node.

@param [Hash] options grep conditions

options is the grep conditions, like

    sexp_type: :call,
    receiver: "Post",
    message: ["find", "new"]
    to_s: "devise"

the condition key is one of :sexp_type, :receiver, :message, :to_s, the condition value can be Symbol, Array or Sexp.

grep all the recursive child nodes with conditions, and get the count of match nodes.

@param [Hash] options grep conditions @return [Integer] the count of metch nodes

Get the hash keys.

    s(:hash,
      s(:assoclist_from_args,
        s(
          s(:assoc_new, s(:@label, "first_name:", s(1, 1)), s(:string_literal, s(:string_add, s(:string_content), s(:@tstring_content, "Richard", s(1, 14))))),
          s(:assoc_new, s(:@label, "last_name:", s(1, 24)), s(:string_literal, s(:string_add, s(:string_content), s(:@tstring_content, "Huang", s(1, 36)))))
        )
      )
    )
        => ["first_name", "last_name"]

@return [Array] hash keys

Get hash size.

    s(:hash,
      s(:assoclist_from_args,
        s(
          s(:assoc_new, s(:@label, "first_name:", s(1, 1)), s(:string_literal, s(:string_add, s(:string_content), s(:@tstring_content, "Richard", s(1, 14))))),
          s(:assoc_new, s(:@label, "last_name:", s(1, 24)), s(:string_literal, s(:string_add, s(:string_content), s(:@tstring_content, "Huang", s(1, 36)))))
        )
      )
    )
        => 2

@return [Integer] hash size

Get hash value node.

    s(:hash,
      s(:assoclist_from_args,
        s(
          s(:assoc_new, s(:@label, "first_name:", s(1, 1)), s(:string_literal, s(:string_add, s(:string_content), s(:@tstring_content, "Richard", s(1, 14))))),
          s(:assoc_new, s(:@label, "last_name:", s(1, 24)), s(:string_literal, s(:string_add, s(:string_content), s(:@tstring_content, "Huang", s(1, 36)))))
        )
      )
    )
        => s(:string_literal, s(:string_add, s(:string_content), s(:@tstring_content, "Richard", s(1, 14))))

@return [Sexp] hash value node

Get the hash values.

    s(:hash,
      s(:assoclist_from_args,
        s(
          s(:assoc_new, s(:@label, "first_name:", s(1, 1)), s(:string_literal, s(:string_add, s(:string_content), s(:@tstring_content, "Richard", s(1, 14))))),
          s(:assoc_new, s(:@label, "last_name:", s(1, 24)), s(:string_literal, s(:string_add, s(:string_content), s(:@tstring_content, "Huang", s(1, 36)))))
        )
      )
    )
        => [
             s(:string_literal, s(:string_add, s(:string_content), s(:@tstring_content, "Richard", s(1, 14)))),
             s(:string_literal, s(:string_add, s(:string_content), s(:@tstring_content, "Huang", s(1, 36))))
           ]

@return [Array] hash values

Get the left value of the assign node.

    s(:assign,
      s(:var_field, s(:@ident, "user", s(1, 0))),
      s(:var_ref, s(:@ident, "current_user", s(1, 7)))
    )
        => s(:var_field, s(:@ident, "user", s(1, 0))),

@return [Symbol] left value of lasgn or iasgn node

return the line number of a sexp node.

    s(:@ident, "test", s(2, 12)
      => 2

Get the message node.

    s(:command,
      s(:@ident, "has_many", s(1, 0)),
      s(:args_add_block,
        s(:args_add, s(:args_new),
          s(:symbol_literal, s(:symbol, s(:@ident, "projects", s(1, 10))))
        ),
        false
      )
    )
        => s(:@ident, "has_many", s(1, 0)),

@return [Symbol] message node

Get the method name of def node.

    s(:def,
      s(:@ident, "show", s(1, 4)),
      s(:params, nil, nil, nil, nil, nil),
      s(:bodystmt, s(:stmts_add, s(:stmts_new), s(:void_stmt)), nil, nil, nil)
    )
        => s(:@ident, "show", s(1, 4)),

@return [Sexp] method name node

Get the module name of the module node.

    s(:module,
      s(:const_ref, s(:@const, "Admin", s(1, 7))),
      s(:bodystmt, s(:stmts_add, s(:stmts_new), s(:void_stmt)), nil, nil, nil)
    )
        => s(:const_ref, s(:@const, "Admin", s(1, 7))),

@return [Sexp] module name node

new method for alias node.

    s(:alias,
      s(:symbol_literal, s(:@ident, "new", s(1, 6))),
      s(:symbol_literal, s(:@ident, "old", s(1, 10)))
    )
        => s(:symbol_literal, s(:@ident, "new", s(1, 6))),

old method for alias node.

    s(:alias,
      s(:symbol_literal, s(:@ident, "new", s(1, 6))),
      s(:symbol_literal, s(:@ident, "old", s(1, 10)))
    )
        => s(:symbol_literal, s(:@ident, "old", s(1, 10))),

Get receiver node.

    s(:call,
      s(:var_ref,
        s(:@ident, "user", s(1, 0))
      ),
      :".",
      s(:@ident, "name", s(1, 5))
    )
        => s(:var_ref,
             s(:@ident, "user", s(1, 0))
           )

@return [Sexp] receiver node

recursively find all child nodes, and yeild each child node.

remove the line and column info from sexp.

Get the right value of assign node.

    s(:assign,
      s(:var_field, s(:@ident, "user", s(1, 0))),
      s(:var_ref, s(:@ident, "current_user", s(1, 7)))
    )
        => s(:var_ref, s(:@ident, "current_user", s(1, 7)))

@return [Sexp] right value of assign node

Get all statements nodes.

    s(:bodystmt,
      s(:stmts_add,
        s(:stmts_add, s(:stmts_new),
          s(:def,
            s(:@ident, "login?", s(1, 16)),
            s(:params, nil, nil, nil, nil, nil),
            s(:bodystmt, s(:stmts_add, s(:stmts_new), s(:void_stmt)), nil, nil, nil)
          )
        ),
        s(:def,
          s(:@ident, "admin?", s(1, 33)),
          s(:params, nil, nil, nil, nil, nil),
          s(:bodystmt, s(:stmts_add, s(:stmts_new), s(:void_stmt)), nil, nil, nil)
        )
      ), nil, nil, nil
    )
        => [
             s(:def,
               s(:@ident, "login?", s(1, 16)),
               s(:params, nil, nil, nil, nil, nil),
               s(:bodystmt, s(:stmts_add, s(:stmts_new), s(:void_stmt)), nil, nil, nil)
             ),
             s(:def,
               s(:@ident, "admin?", s(1, 33)),
               s(:params, nil, nil, nil, nil, nil),
               s(:bodystmt, s(:stmts_add, s(:stmts_new), s(:void_stmt)), nil, nil, nil)
             )
           ]

@return [Array] all statements

To object.

    s(:array,
      s(:args_add,
        s(:args_add, s(:args_new), s(:string_literal, s(:string_add, s(:string_content), s(:@tstring_content, "first_name", s(1, 2))))),
        s(:string_literal, s(:string_add, s(:string_content), s(:@tstring_content, "last_name", s(1, 16))))
      )
    )
        => ["first_name", "last_name"]

@return [Object]

to_s.

@return [String] to_s

[Validate]