class Pione::Lang::Declaration

Declaration is a base class for all declarations.

Public Class Methods

inherited(cls) click to toggle source
# File lib/pione/lang/declaration.rb, line 9
def inherited(cls)
  members.each {|member_name| subclass.member(member_name, default: default_values[member_name])}
  immutable true
end

Public Instance Methods

eval!(env) click to toggle source
# File lib/pione/lang/declaration.rb, line 15
def eval!(env)
  eval(env)
end

Private Instance Methods

get_package_id(env, name) click to toggle source

Get the package id.

# File lib/pione/lang/declaration.rb, line 44
def get_package_id(env, name)
  if package_id = name.package_id
    # get package id from the name
    return package_id
  else
    # or current package id in the environment
    return env.current_package_id
  end
end
get_reference(env, name, expected) click to toggle source

Get reference object. If it has no package id, set current package id in the environment.

# File lib/pione/lang/declaration.rb, line 23
def get_reference(env, name, expected)
  # evaluate the name expression if it has unexpected type
  # e.g. "$p.var($x) := 1"
  unless name.is_a?(expected)
    name = name.eval(env)

    # raise error if it has unexpected type
    unless name.is_a?(expected)
      raise StructuralError.new(expected, name.pos)
    end
  end

  # set current package id if it has no package id
  if name.is_a?(Sequence)
    name.map {|piece| piece.package_id ? piece : piece.set(package_id: env.current_package_id)}
  else
    name.package_id ? name : name.set(package_id: env.current_package_id)
  end
end