class Mulang::PHP::AstProcessor

Public Class Methods

new() click to toggle source
# File lib/mulang/php/ast_processor.rb, line 6
def initialize
  define_binary_operators!
end

Public Instance Methods

define_binary_operators!() click to toggle source
# File lib/mulang/php/ast_processor.rb, line 36
def define_binary_operators!
  [
    { token: '===', name: 'Identical', supports_assign?: false },
    { token: '!==', name: 'NotIdentical', supports_assign?: false },
    { token: '.', name: 'Concat', supports_assign?: true },
    { token: '+', name: 'Plus', supports_assign?: true },
    { token: '-', name: 'Minus', supports_assign?: true },
    { token: '*', name: 'Mul', supports_assign?: true },
    { token: '/', name: 'Div', supports_assign?: true },
    { token: '%', name: 'Mod', supports_assign?: true },
    { token: '**', name: 'Pow', supports_assign?: true },
    { token: '>', name: 'Greater', supports_assign?: false },
    { token: '<', name: 'Smaller', supports_assign?: false },
    { token: '>=', name: 'GreaterOrEqual', supports_assign?: false },
    { token: '<=', name: 'SmallerOrEqual', supports_assign?: false },
    { token: '&', name: 'BitwiseAnd', supports_assign?: true },
    { token: '|', name: 'BitwiseOr', supports_assign?: true },
    { token: '&&', name: 'BooleanAnd', supports_assign?: false },
    { token: '||', name: 'BooleanOr', supports_assign?: false },
    { token: 'and', name: 'LogicalAnd', supports_assign?: false },
    { token: 'or', name: 'LogicalOr', supports_assign?: false },
    { token: 'xor', name: 'LogicalXOr', supports_assign?: false }
  ].each { |it|
    self.class.redefine_method(:"on_Expr_BinaryOp_#{it[:name]}") { |node|
      process_binary_operator it[:token], node
    }

    if it[:supports_assign?]
      self.class.redefine_method(:"on_Expr_AssignOp_#{it[:name]}") { |node|
        binary_application "#{it[:token]}=", process(node[:var]), process(node[:expr])
      }
    end
  }
end
get_name(node) click to toggle source
# File lib/mulang/php/ast_processor.rb, line 32
def get_name(node)
  node[:parts].first
end
method_missing(m, *args, &block) click to toggle source
# File lib/mulang/php/ast_processor.rb, line 266
def method_missing(m, *args, &block)
  puts m, args
  ms :Other, "#{m}: #{args.to_s}", nil
end
on_Arg(node) click to toggle source
# File lib/mulang/php/ast_processor.rb, line 160
def on_Arg(node)
  process node[:value]
end
on_Expr_Array(node) click to toggle source
# File lib/mulang/php/ast_processor.rb, line 111
def on_Expr_Array(node)
  items = node[:items]
  is_array = items.all? { |it| it[:key].nil? }

  is_array ? ms(:MuList, process(items))
           : ms(:MuObject, process_block(items))
end
on_Expr_ArrayItem(node) click to toggle source
# File lib/mulang/php/ast_processor.rb, line 119
def on_Expr_ArrayItem(node)
  value = process(node[:value])

  node[:key] ? ms(:Attribute, node[:key][:value].to_s, value)
             : value
end
on_Expr_Assign(node) click to toggle source

STATEMENTS

# File lib/mulang/php/ast_processor.rb, line 176
def on_Expr_Assign(node)
  left = node[:var]
  exp = process(node[:expr])

  if left[:nodeType] == 'Expr_PropertyFetch'
    simple_send process(left[:var]), "#{left[:name][:name]}=", [exp]
  else
    ms :Assignment, left[:name], exp
  end
end
on_Expr_BinaryOp_Equal(node) click to toggle source

OPERATORS

# File lib/mulang/php/ast_processor.rb, line 136
def on_Expr_BinaryOp_Equal(node)
  ms :Application, [primitive(:Equal), [process(node[:left]), process(node[:right])]]
end
on_Expr_BinaryOp_NotEqual(node) click to toggle source
# File lib/mulang/php/ast_processor.rb, line 140
def on_Expr_BinaryOp_NotEqual(node)
  ms :Application, [primitive(:NotEqual), [process(node[:left]), process(node[:right])]]
end
on_Expr_Closure(node) click to toggle source
# File lib/mulang/php/ast_processor.rb, line 126
def on_Expr_Closure(node)
  ms :Lambda, process(node[:params]), process_block(node[:stmts])
end
on_Expr_ConstFetch(node) click to toggle source
# File lib/mulang/php/ast_processor.rb, line 96
def on_Expr_ConstFetch(node)
   value = get_name(node[:name]).downcase

  case value
    when 'true'
      ms :MuBool, true
    when 'false'
      ms :MuBool, false
    when 'null'
      ms :MuNil
    else
      ms :Reference, value
  end
end
on_Expr_FuncCall(node) click to toggle source

FUNCTION CALLS

# File lib/mulang/php/ast_processor.rb, line 156
def on_Expr_FuncCall(node)
  application get_name(node[:name]), process(node[:args])
end
on_Expr_MethodCall(node) click to toggle source
# File lib/mulang/php/ast_processor.rb, line 222
def on_Expr_MethodCall(node)
  simple_send process(node[:var]), node[:name][:name], process(node[:args])
end
on_Expr_New(node) click to toggle source
# File lib/mulang/php/ast_processor.rb, line 226
def on_Expr_New(node)
  ms :New, process(node[:class]), process(node[:args])
end
on_Expr_PostDec(node) click to toggle source
# File lib/mulang/php/ast_processor.rb, line 149
def on_Expr_PostDec(node)
  binary_application '-', process(node[:var]), ms(:MuNumber, 1)
end
Also aliased as: on_Expr_PreDec
on_Expr_PostInc(node) click to toggle source
# File lib/mulang/php/ast_processor.rb, line 144
def on_Expr_PostInc(node)
  binary_application '+', process(node[:var]), ms(:MuNumber, 1)
end
Also aliased as: on_Expr_PreInc
on_Expr_PreDec(node)
Alias for: on_Expr_PostDec
on_Expr_PreInc(node)
Alias for: on_Expr_PostInc
on_Expr_PropertyFetch(node) click to toggle source

OOP

# File lib/mulang/php/ast_processor.rb, line 218
def on_Expr_PropertyFetch(node)
  simple_send process(node[:var]), node[:name][:name], []
end
on_Expr_Variable(node) click to toggle source
# File lib/mulang/php/ast_processor.rb, line 83
def on_Expr_Variable(node)
  ms :Reference, node[:name]
end
on_Name(node) click to toggle source
# File lib/mulang/php/ast_processor.rb, line 230
def on_Name(node)
  ms :Reference, get_name(node)
end
on_Param(node) click to toggle source
# File lib/mulang/php/ast_processor.rb, line 130
def on_Param(node)
  ms :VariablePattern, node[:var][:name]
end
on_Scalar_DNumber(node) click to toggle source
# File lib/mulang/php/ast_processor.rb, line 87
def on_Scalar_DNumber(node)
  ms :MuNumber, node[:value]
end
Also aliased as: on_Scalar_LNumber
on_Scalar_LNumber(node)
Alias for: on_Scalar_DNumber
on_Scalar_String(node) click to toggle source
# File lib/mulang/php/ast_processor.rb, line 92
def on_Scalar_String(node)
  ms :MuString, node[:value]
end
on_Stmt_Class(node) click to toggle source
# File lib/mulang/php/ast_processor.rb, line 234
def on_Stmt_Class(node)
  superclass = node.dig(:extends, :parts)&.first
  interfaces = node[:implements].map { |it| { nodeType: 'Stmt_Implement', name: get_name(it) } }

  ms :Class, node[:name][:name], superclass, process_block(interfaces.concat(node[:stmts]))
end
on_Stmt_ClassMethod(node) click to toggle source
# File lib/mulang/php/ast_processor.rb, line 250
def on_Stmt_ClassMethod(node)
  name = node[:name][:name]
  params = process(node[:params])

  if node[:stmts].nil?
    ms :TypeSignature, name, ms(:ParameterizedType, params.map { |it| 'Any' }, 'Any', [])
  else
    simple_method name, params, process_block(node[:stmts])
  end
end
on_Stmt_Echo(node) click to toggle source
# File lib/mulang/php/ast_processor.rb, line 187
def on_Stmt_Echo(node)
  ms :Print, process_block(node[:exprs])
end
on_Stmt_Else(node) click to toggle source
# File lib/mulang/php/ast_processor.rb, line 200
def on_Stmt_Else(node)
  process_block node[:stmts]
end
on_Stmt_ElseIf(node)
Alias for: on_Stmt_If
on_Stmt_Expression(node) click to toggle source

VALUES

# File lib/mulang/php/ast_processor.rb, line 79
def on_Stmt_Expression(node)
  process node[:expr]
end
on_Stmt_For(node) click to toggle source
# File lib/mulang/php/ast_processor.rb, line 204
def on_Stmt_For(node)
  ms :ForLoop, process_block(node[:init]), process_block(node[:cond]), process_block(node[:loop]), process_block(node[:stmts])
end
on_Stmt_Foreach(node) click to toggle source
# File lib/mulang/php/ast_processor.rb, line 212
def on_Stmt_Foreach(node)
  ms :For, [ms(:Generator, ms(:VariablePattern, node[:valueVar][:name]), process(node[:expr]))], process_block(node[:stmts])
end
on_Stmt_Function(node) click to toggle source

DECLARATIONS

# File lib/mulang/php/ast_processor.rb, line 166
def on_Stmt_Function(node)
  simple_function node[:name][:name], process(node[:params]), process_block(node[:stmts])
end
on_Stmt_If(node) click to toggle source
# File lib/mulang/php/ast_processor.rb, line 191
def on_Stmt_If(node)
  condition = node[:cond]
  body = node[:stmts]
  else_block = node[:else]

  ms :If, process(condition), process_block(body), process(else_block)
end
Also aliased as: on_Stmt_ElseIf
on_Stmt_Implement(node) click to toggle source
# File lib/mulang/php/ast_processor.rb, line 241
def on_Stmt_Implement(node)
  ms :Implement, ms(:Reference, node[:name])
end
on_Stmt_Interface(node) click to toggle source
# File lib/mulang/php/ast_processor.rb, line 261
def on_Stmt_Interface(node)
  parents = node[:extends].map { |it| get_name(it) }
  ms :Interface, node[:name][:name], parents, process_block(node[:stmts])
end
on_Stmt_Property(node) click to toggle source
# File lib/mulang/php/ast_processor.rb, line 245
def on_Stmt_Property(node)
  prop = node[:props].first
  ms :Attribute, prop[:name][:name], process(prop[:default])
end
on_Stmt_Return(node) click to toggle source
# File lib/mulang/php/ast_processor.rb, line 170
def on_Stmt_Return(node)
  ms :Return, process(node[:expr])
end
on_Stmt_While(node) click to toggle source
# File lib/mulang/php/ast_processor.rb, line 208
def on_Stmt_While(node)
  ms :While, process(node[:cond]), process_block(node[:stmts])
end
process(node) click to toggle source
# File lib/mulang/php/ast_processor.rb, line 14
def process(node)
  return ms(:None) if node.nil?

  if node.is_a?(Array)
    return node.map { |it| process it }
  end

  if node.is_a?(Hash)
    return send "on_#{node[:nodeType]}", node
  end

  ms(:Other)
end
process_array(array, &f) click to toggle source
# File lib/mulang/php/ast_processor.rb, line 28
def process_array(array, &f)
  array.map f
end
process_binary_operator(operator, node) click to toggle source
# File lib/mulang/php/ast_processor.rb, line 71
def process_binary_operator(operator, node)
  binary_application operator, process(node[:left]), process(node[:right])
end
process_block(stmts) click to toggle source
# File lib/mulang/php/ast_processor.rb, line 10
def process_block(stmts)
  sequence *process(stmts)
end