class Pretentious::Context

Contains references to scoped variables

Constants

VARIABLE_NAMES

list of variable names to use. i j are not there on purpose

Attributes

declared_names[RW]
previous_declarations[RW]
variable_map[RW]

Public Class Methods

new(variable_map = {}, declared_names = {}, previous_declarations = {}) click to toggle source
# File lib/pretentious/context.rb, line 10
def initialize(variable_map = {}, declared_names = {}, previous_declarations = {})
  @declared_names = declared_names
  @variable_map = variable_map
  @previous_declarations = previous_declarations
  @current_name_dict = 0
end

Public Instance Methods

dump() click to toggle source
# File lib/pretentious/context.rb, line 43
def dump
  puts "v-map #{@variable_map.inspect}"
  puts "d-map #{@declared_names.inspect}"
  puts "p-map #{@previous_declarations.inspect}"
end
map_name(object_id) click to toggle source
# File lib/pretentious/context.rb, line 94
def map_name(object_id)
  object_id_to_declared_names = {}

  if @declared_names
    @declared_names.each do |k, v|
      object_id_to_declared_names[v[:object_id]] = k if v
    end
  end

  # return immediately if already mapped
  return object_id_to_declared_names[object_id] if object_id_to_declared_names.include? object_id
  nil
end
merge_variable_map(target_object) click to toggle source
# File lib/pretentious/context.rb, line 31
def merge_variable_map(target_object)
  @variable_map.merge!(target_object._variable_map) if target_object.methods.include?(:_variable_map) && !target_object._variable_map.nil?
end
pick_name(object_id, value = :no_value_passed) click to toggle source
# File lib/pretentious/context.rb, line 49
def pick_name(object_id, value = :no_value_passed)
  var_name = map_name(object_id)
  return var_name if var_name

  var_name = "var_#{object_id}"

  if !@variable_map.nil? && @variable_map.include?(object_id)

    candidate_name = @variable_map[object_id].to_s
    if !@declared_names.include?(candidate_name)
      var_name = candidate_name
      @declared_names[candidate_name] = { count: 1, object_id: object_id }
    else

      if @declared_names[candidate_name][:object_id] == object_id
        var_name = candidate_name
      else
        new_name = "#{candidate_name}_#{@declared_names[candidate_name][:count]}"
        var_name = "#{new_name}"

        @declared_names[candidate_name][:count] += 1
        @declared_names[new_name] = { count: 1, object_id: object_id }
      end

    end
  else
    v = nil

    Kernel.loop do
      v = provide_name
      break if !@declared_names.key?(v) || v.nil?
    end

    var_name = v

    @declared_names[var_name] = { count: 1, object_id: object_id }
  end

  var_name
end
register(object_id, name) click to toggle source
# File lib/pretentious/context.rb, line 39
def register(object_id, name)
  @variable_map[object_id] = name
end
register_instance_variable(object_id) click to toggle source
# File lib/pretentious/context.rb, line 35
def register_instance_variable(object_id)
  @variable_map[object_id] = "@#{@previous_declarations[object_id]}" if @previous_declarations[object_id][0] != '@'
end
subcontext(declarations) click to toggle source
# File lib/pretentious/context.rb, line 17
def subcontext(declarations)
  previous_declarations = {}

  declarations.select { |d| d[:used_by] != :inline }.each do |d|
    previous_declarations[d[:id]] = pick_name(d[:id])
  end

  Pretentious::Context.new(@variable_map, {}, previous_declarations)
end
value_of(value) click to toggle source
# File lib/pretentious/context.rb, line 90
def value_of(value)
  Pretentious.value_ize(self, value)
end
was_declared_previously?(object_id) click to toggle source
# File lib/pretentious/context.rb, line 27
def was_declared_previously?(object_id)
  @previous_declarations.key? object_id
end

Private Instance Methods

provide_name() click to toggle source
# File lib/pretentious/context.rb, line 110
def provide_name
  if @current_name_dict < VARIABLE_NAMES.length
    VARIABLE_NAMES[@current_name_dict].tap { @current_name_dict += 1 }
  else
    nil
  end
end