Class: Pione::Lang::PackageBindingDeclaration

Inherits:
Declaration
  • Object
show all
Defined in:
lib/pione/lang/declaration.rb

Overview

PackageBindingDeclaration is a declaration for package binding sentences.

Instance Method Summary collapse

Methods inherited from Declaration

#eval!, inherited

Methods included from Util::Positionable

#line_and_column, #pos, #set_source_position

Instance Method Details

#eval(env) ⇒ Object

Update variable table and package table.



78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# File 'lib/pione/lang/declaration.rb', line 78

def eval(env)
  # variable name
  var = get_reference(env, expr1, Variable)

  # check the parent package
  parent_package = expr2.eval(env)

  # evaluate expr2 and get new package instance
  child_pieces = parent_package.pieces.map do |parent_piece|
    # definition of parent package
    parent_definition = env.package_get(parent_piece)
    # generate new id
    child_id = Util::PackageID.generate(env, parent_piece.name)
    # validate parameter set
    parent_piece.param.pieces.each do |param_piece|
      param_piece.table.keys do |key|
        unless parent_definition.param_definition.has_key?(key.name)
          raise ParamError.new(key.name, parent_piece.package_id)
        end
      end
    end
    # update package table
    definition = PackageDefinition.new(
      package_id: child_id,
      parent_ids: [parent_piece.package_id],
      param_definition: parent_definition.param_definition,
      param: parent_definition.param.merge(parent_piece.param)
    )
    # create child piece
    child_piece = parent_piece.set(package_id: child_id, parent_ids: [parent_piece.package_id])
    # register the child to package table
    env.package_set(child_piece, definition)
    # result
    child_piece
  end
  child_package = PackageExprSequence.of(*child_pieces)

  # update variable table with the result
  VariableBindingDeclaration.new(var, child_package).eval(env)
end