Sha256: 3946b74864d8bdc017b4388a160bc9485a14d7e448c42a8133c56b4d55262544

Contents?: true

Size: 1.47 KB

Versions: 7

Compression:

Stored size: 1.47 KB

Contents

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

module Opal
  module Nodes
    class ConstNode < Base
      handle :const

      children :const_scope, :name

      def compile
        if magical_data_const?
          push("$__END__")
        elsif const_scope
          push "Opal.const_get_qualified(", recv(const_scope), ", '#{name}')"
        elsif compiler.eval?
          push "Opal.const_get_relative($nesting, '#{name}')"
        else
          push "Opal.const_get_relative($nesting, '#{name}')"
        end
      end

      # Ruby has a magical const DATA
      # that should be processed in a different way:
      # 1. When current file contains __END__ in the end of the file
      #    DATA const should be resolved to the string located after __END__
      # 2. When current file doesn't have __END__ section
      #    DATA const should be resolved to a regular ::DATA constant
      def magical_data_const?
        const_scope.nil? && name == :DATA and compiler.eof_content
      end
    end

    # ::CONST
    # s(:const, s(:cbase), :CONST)
    class CbaseNode < Base
      handle :cbase

      def compile
        push "'::'"
      end
    end

    class ConstAssignNode < Base
      handle :casgn

      children :base, :name, :value

      def compile
        if base
          push "Opal.const_set(", expr(base), ", '#{name}', ", expr(value), ")"
        else
          push "Opal.const_set($nesting[0], '#{name}', ", expr(value), ")"
        end
      end
    end
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
opal-0.11.4 lib/opal/nodes/constants.rb
opal-0.11.3 lib/opal/nodes/constants.rb
opal-0.11.2 lib/opal/nodes/constants.rb
opal-0.11.1 lib/opal/nodes/constants.rb
opal-0.11.1.pre lib/opal/nodes/constants.rb
opal-0.11.0 lib/opal/nodes/constants.rb
opal-0.11.0.rc1 lib/opal/nodes/constants.rb