class LtdTemplate::Code::Subscript

Public Class Methods

new(template, base, subscripts) click to toggle source
Calls superclass method LtdTemplate::Code::new
# File lib/ltdtemplate/code/subscript.rb, line 13
def initialize (template, base, subscripts)
    super template
    @base, @subscripts = base, subscripts
end

Public Instance Methods

do_set(opts) click to toggle source

Implement = and ?=

# File lib/ltdtemplate/code/subscript.rb, line 69
def do_set (opts)
    subscripts = evaluate_subscripts true
    if subscripts.empty?
        # Treat expression[] as expression
        rubyversed(@base).evaluate opts
    elsif opts[:method] != '?=' ||
      rubyversed(@base).evaluate.in_rubyverse(@template)[*subscripts,
      {}].nil?
        # Assign if unconditional or unset
        params = opts[:parameters]
        params = params[0] if params.is_a? LtdTemplate::Univalue
        rubyversed(@base).evaluate.in_rubyverse(@template)[*subscripts,
          {}] = params
    end
    nil
end
evaluate(opts = {}) click to toggle source

Evaluate the target's value.

# File lib/ltdtemplate/code/subscript.rb, line 21
def evaluate (opts = {})
    case opts[:method]
    when '=', '?=' then do_set opts # Support array assignment
    else rubyversed(target(true)).evaluate opts
    end
end
evaluate_subscripts(meter = false) click to toggle source

Return subscripts calculated from the supplied code blocks.

# File lib/ltdtemplate/code/subscript.rb, line 31
def evaluate_subscripts (meter = false)
    subscripts = []
    @subscripts.each do |code|
        subscript = rubyversed(code).evaluate
        case subscript
        when LtdTemplate::Value::Array_Splat
            if meter && (size = subscript.positional.size) > 1
                # RESOURCE subscripts: Total number of subscripts
                # RESOURCE subscript_depth: Deepest subscript depth
                @template.use :subscripts, size - 1
                @template.using :subscript_depth, size
            end
            subscripts.concat subscript.positional
        when Numeric, String then subscripts << subscript
        end
    end

    if meter
        @template.use :subscripts, @subscripts.size
        @template.using :subscript_depth, subscripts.size
    end

    subscripts
end
target(meter = false) click to toggle source

Return the target value, variable[sub1, …, subN]

# File lib/ltdtemplate/code/subscript.rb, line 59
def target (meter = false)
    subscripts = evaluate_subscripts meter
    if subscripts.empty? then rubyversed(@base).evaluate
    else rubyversed(@base).evaluate.in_rubyverse(@template)[*subscripts, {}]
    end
end