Sha256: 627fa83111bb7868e853e1ab55a3933cdb7ee69af37253f3b08307947f33439b

Contents?: true

Size: 1.2 KB

Versions: 6

Compression:

Stored size: 1.2 KB

Contents

require_relative '../exceptions'
require 'dentaku/string_casing'

module Dentaku
  module AST
    class Identifier < Node
      include StringCasing
      attr_reader :identifier, :case_sensitive

      def initialize(token, options = {})
        @case_sensitive = options.fetch(:case_sensitive, false)
        @identifier = standardize_case(token.value)
      end

      def value(context = {})
        v = context.fetch(identifier) do
          raise UnboundVariableError.new([identifier]),
                "no value provided for variables: #{identifier}"
        end

        case v
        when Node
          value = v.value(context)
          context[identifier] = value if Dentaku.cache_identifier?
          value
        when Proc
          v.call
        else
          v
        end
      end

      def dependencies(context = {})
        context.key?(identifier) ? dependencies_of(context[identifier], context) : [identifier]
      end

      def accept(visitor)
        visitor.visit_identifier(self)
      end

      def to_s
        identifier.to_s
      end

      private

      def dependencies_of(node, context)
        node.respond_to?(:dependencies) ? node.dependencies(context) : []
      end
    end
  end
end

Version data entries

6 entries across 6 versions & 2 rubygems

Version Path
dentaku-3.5.4 lib/dentaku/ast/identifier.rb
dentaku-3.5.3 lib/dentaku/ast/identifier.rb
dentaku-3.5.2 lib/dentaku/ast/identifier.rb
dentaku_zevo-3.5.2 lib/dentaku/ast/identifier.rb
dentaku-3.5.1 lib/dentaku/ast/identifier.rb
dentaku-3.5.0 lib/dentaku/ast/identifier.rb