Sha256: 09a49d7023477a555bf39a691015df2670e96e19ad059c561b56a0ee1e33615d

Contents?: true

Size: 1.43 KB

Versions: 55

Compression:

Stored size: 1.43 KB

Contents

# frozen_string_literal: true

module Parser
  # Context of parsing that is represented by a stack of scopes.
  #
  # Supported states:
  # + :class - in the class body (class A; end)
  # + :module - in the module body (module M; end)
  # + :sclass - in the singleton class body (class << obj; end)
  # + :def - in the method body (def m; end)
  # + :defs - in the singleton method body (def self.m; end)
  # + :block - in the block body (tap {})
  # + :lambda - in the lambda body (-> {})
  #
  class Context
    attr_reader :stack

    def initialize
      @stack = []
      freeze
    end

    def push(state)
      @stack << state
    end

    def pop
      @stack.pop
    end

    def reset
      @stack.clear
    end

    def empty?
      @stack.empty?
    end

    def in_class?
      @stack.last == :class
    end

    def indirectly_in_def?
      @stack.include?(:def) || @stack.include?(:defs)
    end

    def class_definition_allowed?
      def_index = stack.rindex { |item| [:def, :defs].include?(item) }
      sclass_index = stack.rindex(:sclass)

      def_index.nil? || (!sclass_index.nil? && sclass_index > def_index)
    end
    alias module_definition_allowed? class_definition_allowed?
    alias dynamic_const_definition_allowed? class_definition_allowed?

    def in_block?
      @stack.last == :block
    end

    def in_lambda?
      @stack.last == :lambda
    end

    def in_dynamic_block?
      in_block? || in_lambda?
    end
  end
end

Version data entries

55 entries across 52 versions & 9 rubygems

Version Path
primary_connect_proto-0.20.0 vendor/bundle/ruby/3.0.0/gems/parser-3.0.2.0/lib/parser/context.rb
primary_connect_proto-0.20.0 vendor/bundle/ruby/2.6.0/gems/parser-3.0.2.0/lib/parser/context.rb
primary_connect_proto-0.19.0 vendor/bundle/ruby/3.0.0/gems/parser-3.0.2.0/lib/parser/context.rb
primary_connect_proto-0.18.0 vendor/bundle/ruby/2.6.0/gems/parser-3.0.2.0/lib/parser/context.rb
primary_connect_proto-0.18.0 vendor/bundle/ruby/3.0.0/gems/parser-3.0.2.0/lib/parser/context.rb
primary_connect_proto-0.17.0 vendor/bundle/ruby/2.6.0/gems/parser-3.0.2.0/lib/parser/context.rb
primary_connect_proto-0.17.0 vendor/bundle/ruby/3.0.0/gems/parser-3.0.2.0/lib/parser/context.rb
primary_connect_proto-0.12.1 vendor/bundle/ruby/2.7.0/gems/parser-3.0.2.0/lib/parser/context.rb
primary_connect_proto-0.10.2 vendor/bundle/ruby/2.7.0/gems/parser-3.0.2.0/lib/parser/context.rb
primary_connect_proto-0.10.1 vendor/bundle/ruby/2.7.0/gems/parser-3.0.2.0/lib/parser/context.rb
primary_connect_proto-0.9.0 vendor/bundle/ruby/2.6.0/gems/parser-3.0.2.0/lib/parser/context.rb
primary_connect_proto-0.8.2 vendor/bundle/ruby/2.7.0/gems/parser-3.0.2.0/lib/parser/context.rb
primary_connect_proto-0.8.1 vendor/bundle/ruby/2.7.0/gems/parser-3.0.2.0/lib/parser/context.rb
primary_connect_proto-0.8.0 vendor/bundle/ruby/2.6.0/gems/parser-3.0.2.0/lib/parser/context.rb
primary_connect_proto-0.7.3 vendor/bundle/ruby/2.6.0/gems/parser-3.0.2.0/lib/parser/context.rb
primary_connect_proto-0.7.2 vendor/bundle/ruby/2.6.0/gems/parser-3.0.2.0/lib/parser/context.rb
primary_connect_proto-0.7.1 vendor/bundle/ruby/2.6.0/gems/parser-3.0.2.0/lib/parser/context.rb
primary_connect_proto-0.7.0 vendor/bundle/ruby/2.6.0/gems/parser-3.0.2.0/lib/parser/context.rb
primary_connect_proto-0.6.0 vendor/bundle/ruby/2.6.0/gems/parser-3.0.2.0/lib/parser/context.rb
primary_connect_proto-0.4.0 vendor/bundle/ruby/2.6.0/gems/parser-3.0.2.0/lib/parser/context.rb