Class: IDL::AST::TemplateModuleReference

Inherits:
Leaf
  • Object
show all
Defined in:
lib/ridl/node.rb,
lib/ridl/node.rb

Overview

TemplateModule

Constant Summary collapse

NAMETYPE =
:class

Instance Attribute Summary

Attributes inherited from Leaf

#annotations, #enclosure, #intern, #lm_name, #name, #prefix, #scopes

Instance Method Summary collapse

Methods inherited from Leaf

#_set_prefix, #has_annotations?, #is_local?, #is_template?, #lm_name_for_scope, #parsed_name_scope, #replace_prefix, #repo_scopes, #repository_id, #scoped_lm_name, #scoped_name, #set_repo_id, #set_repo_version, #typename, #unescaped_name

Constructor Details

#initialize(_name, _enclosure, _params) ⇒ TemplateModuleReference

Returns a new instance of TemplateModuleReference.



781
782
783
784
785
786
787
788
789
790
791
792
793
# File 'lib/ridl/node.rb', line 781

def initialize(_name, _enclosure, _params)
  super(_name, _enclosure)
  unless _params[:tpl_type].is_a?(IDL::Type::ScopedName) && _params[:tpl_type].is_node?(IDL::AST::TemplateModule)
    raise RuntimeError, "templated module reference type required for #{typename} #{scoped_lm_name}: got #{_params[:tpl_type].typename}"
  end
  @template = _params[:tpl_type].resolved_type.node
  _params[:tpl_params].each do |p|
    unless (p.is_a?(IDL::Type::ScopedName) || p.is_a?(IDL::Expression::ScopedName)) && p.is_node?(IDL::AST::TemplateParam)
      raise RuntimeError, "invalid template module parameter for template module reference #{typename} #{scoped_lm_name}: #{p.typename}"
    end
  end
  @params = _params[:tpl_params].collect { |p| p.resolved_node }
end

Instance Method Details

#instantiate(_context, _enclosure) ⇒ Object



805
806
807
808
809
810
811
812
813
814
# File 'lib/ridl/node.rb', line 805

def instantiate(_context, _enclosure)
  inst_params = @params.collect do |tp|
    # concrete objects are either Expression or Node; latter needs to be repacked as IDL::Type::ScopedName
    # as that is what the TemplateModule#instantiate expects
    tp.concrete.is_a?(IDL::Expression) ? tp.concrete : IDL::Type::ScopedName.new(tp.concrete)
  end
  mod_inst = IDL::AST::Module.new(self.name, _enclosure, { :template => @template, :template_params => inst_params })
  @template.instantiate(mod_inst, _context)
  mod_inst
end

#marshal_dumpObject



795
796
797
# File 'lib/ridl/node.rb', line 795

def marshal_dump
  super() << @template << @params
end

#marshal_load(vars) ⇒ Object



799
800
801
802
803
# File 'lib/ridl/node.rb', line 799

def marshal_load(vars)
  @params = vars.pop
  @template = vars.pop
  super(vars)
end

#resolve(_name) ⇒ Object



816
817
818
# File 'lib/ridl/node.rb', line 816

def resolve(_name)
  @template.resolve(_name)
end