Class: Pione::Lang::PackageBindingDeclaration
- Inherits:
-
Declaration
- Object
- StructX
- Declaration
- Pione::Lang::PackageBindingDeclaration
- Defined in:
- lib/pione/lang/declaration.rb
Overview
PackageBindingDeclaration is a declaration for package binding sentences.
Instance Method Summary collapse
-
#eval(env) ⇒ Object
Update variable table and package table.
Methods inherited from Declaration
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 |