module Bpl::AST::Scope

Constants

KIND

Public Class Methods

notify(msg, *args) click to toggle source
# File lib/bpl/ast/scope.rb, line 21
def self.notify(msg, *args)
  case msg
  when :link
    parent, child = args
    if child.is_a?(Declaration)
      fail "declaration parent #{parent.class} not a scope" \
        unless parent.respond_to?(:lookup_table)
      child.names.each do |name|
        parent.lookup_table(KIND[child.class],name) << child
      end
    end

  when :unlink
    parent, child = args
    if child.is_a?(Declaration)
      fail "declaration parent #{parent.class} not a scope" \
        unless parent.respond_to?(:lookup_table)
      child.names.each do |name|
        parent.lookup_table(KIND[child.class],name).delete(child)
      end
    end
  end
end

Public Instance Methods

lookup_table(kind,name) click to toggle source
# File lib/bpl/ast/scope.rb, line 47
def lookup_table(kind,name)
  @lookup_table ||= {}
  @lookup_table[kind] ||= {}
  @lookup_table[kind][name] ||= Set.new
end
resolve(id) click to toggle source
# File lib/bpl/ast/scope.rb, line 53
def resolve(id)
  lookup_table(KIND[id.class],id.name).first
end