Sha256: b80078d735fa9744ba2aff065db66b1632defc9560635b051d217a23f791843f

Contents?: true

Size: 1.83 KB

Versions: 7

Compression:

Stored size: 1.83 KB

Contents

# frozen_string_literal: true
require 'opal/rewriters/base'

module Opal
  module Rewriters
    class DotJsSyntax < Base
      def on_send(node)
        recv, meth, *args = *node
        if recv && recv.type == :send
          recv_of_recv, meth_of_recv, _ = *recv
          if meth_of_recv == :JS
            case meth
            when :[]
              if args.size != 1
                raise SyntaxError, ".JS[:property] syntax supports only one argument"
              end
              property = args.first

              node = to_js_attr_call(recv_of_recv, property)
            when :[]=
              if args.size != 2
                raise SyntaxError, '.JS[:property]= syntax supports only two arguments'
              end

              property, value = *args
              node = to_js_attr_assign_call(recv_of_recv, property, value)
            else
              node = to_native_js_call(recv_of_recv, meth, args)
            end
            super(node)
          else
            super
          end
        else
          super
        end
      end

      # @param recv [AST::Node] receiver of .JS. method
      # @param meth [Symbol] name of the JS method
      # @param args [Array<AST::Node>] list of the arguments passed to JS method
      def to_native_js_call(recv, meth, args)
        s(:jscall, recv, meth, *args)
      end

      # @param recv [AST::Node] receiver of .JS[] method
      # @param property [AST::Node] argument passed to .JS[] method
      def to_js_attr_call(recv, property)
        s(:jsattr, recv, property)
      end

      # @param recv [AST::Node] receiver of .JS[]= method
      # @param property [AST::Node] property passed to brackets
      # @param value [AST::Node] value of assignment
      def to_js_attr_assign_call(recv, property, value)
        s(:jsattrasgn, recv, property, value)
      end
    end
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
opal-0.11.4 lib/opal/rewriters/dot_js_syntax.rb
opal-0.11.3 lib/opal/rewriters/dot_js_syntax.rb
opal-0.11.2 lib/opal/rewriters/dot_js_syntax.rb
opal-0.11.1 lib/opal/rewriters/dot_js_syntax.rb
opal-0.11.1.pre lib/opal/rewriters/dot_js_syntax.rb
opal-0.11.0 lib/opal/rewriters/dot_js_syntax.rb
opal-0.11.0.rc1 lib/opal/rewriters/dot_js_syntax.rb