Sha256: 1ce7c0c61c98853e523e079b76d8b3207a4bdfc93f7f12526959d0130b84ac1e

Contents?: true

Size: 1.73 KB

Versions: 16

Compression:

Stored size: 1.73 KB

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

        if body.nil?
          # Simplified compile for empty body
          if stmt?
            unshift '$module(', base, ", '#{name}')"
          else
            unshift '($module(', base, ", '#{name}'), nil)"
          end
        else
          line "  var self = $module($base, '#{name}');"
          in_scope do
            scope.name = name
            in_closure(Closure::MODULE | Closure::JS_FUNCTION) do
              compile_body
            end
          end

          if await_encountered
            await_begin = '(await '
            await_end = ')'
            async = 'async '
            parent.await_encountered = true
          else
            await_begin, await_end, async = '', '', ''
          end

          unshift "#{await_begin}(#{async}function($base#{', $parent_nesting' if @define_nesting}) {"
          line '})(', base, "#{', ' + scope.nesting if @define_nesting})#{await_end}"
        end
      end

      private

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

        if base.nil?
          [name, "#{scope.nesting}[0]"]
        else
          [name, expr(base)]
        end
      end

      def compile_body
        body_code = stmt(compiler.returns(body))
        empty_line

        add_temp "$nesting = [self].concat($parent_nesting)" if @define_nesting
        add_temp '$$ = Opal.$r($nesting)' if @define_relative_access

        line scope.to_vars
        line body_code
      end
    end
  end
end

Version data entries

16 entries across 16 versions & 1 rubygems

Version Path
opal-1.8.3.rc1 lib/opal/nodes/module.rb
opal-1.8.2 lib/opal/nodes/module.rb
opal-1.8.1 lib/opal/nodes/module.rb
opal-1.8.0 lib/opal/nodes/module.rb
opal-1.8.0.beta1 lib/opal/nodes/module.rb
opal-1.7.4 lib/opal/nodes/module.rb
opal-1.8.0.alpha1 lib/opal/nodes/module.rb
opal-1.7.3 lib/opal/nodes/module.rb
opal-1.7.2 lib/opal/nodes/module.rb
opal-1.7.1 lib/opal/nodes/module.rb
opal-1.7.0 lib/opal/nodes/module.rb
opal-1.7.0.rc1 lib/opal/nodes/module.rb
opal-1.6.1 lib/opal/nodes/module.rb
opal-1.6.0 lib/opal/nodes/module.rb
opal-1.6.0.rc1 lib/opal/nodes/module.rb
opal-1.6.0.alpha1 lib/opal/nodes/module.rb