Sha256: ffeb48998ab0e1ded894f897fef7f3d7507c39ce86aa2270dd9c5199ddea8d01

Contents?: true

Size: 984 Bytes

Versions: 2

Compression:

Stored size: 984 Bytes

Contents

# frozen_string_literal: true

require 'opal/nodes/scope'

module Opal
  module Nodes
    class ModuleNode < ScopeNode
      handle :module

      children :cid, :body

      def compile
        name, base = name_and_base
        helper :module

        push '(function($base, $parent_nesting) {'
        line "  var self = $module($base, '#{name}');"
        in_scope do
          scope.name = name
          compile_body
        end
        line '})(', base, ', $nesting)'
      end

      private

      # cid is always s(:const, scope_sexp_or_nil, :ConstName)
      def name_and_base
        base, name = cid.children

        if base.nil?
          [name, '$nesting[0]']
        else
          [name, expr(base)]
        end
      end

      def compile_body
        add_temp '$nesting = [self].concat($parent_nesting)'

        body_code = stmt(compiler.returns(body || s(:nil)))
        empty_line

        line scope.to_vars
        line body_code
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
opal-1.2.0 lib/opal/nodes/module.rb
opal-1.2.0.beta1 lib/opal/nodes/module.rb