Class: IDL::AST::Component

Inherits:
ComponentBase show all
Defined in:
lib/ridl/node.rb,
lib/ridl/node.rb

Overview

Connector

Constant Summary collapse

DEFINABLE =
[IDL::AST::Attribute, IDL::AST::Port]

Instance Attribute Summary

Attributes inherited from ComponentBase

#base, #idltype, #interfaces

Attributes inherited from Leaf

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

Instance Method Summary collapse

Methods inherited from ComponentBase

#add_interfaces, #ancestors, #has_base?, #has_support?, #redefine, #supports?

Methods inherited from Derivable

#has_ancestor?, #search_self, #search_self_before_derived

Methods inherited from Node

#define, #introduce, #is_definable?, #match_members, #redefine, #replace_prefix, #resolve, #select_members, #undo_introduction, #walk_members

Methods inherited from Leaf

#has_annotations?, #is_local?, #is_template?, #lm_name, #lm_scopes, #replace_prefix, #repository_id, #resolve, #scoped_lm_name, #scoped_name, #set_repo_id, #set_repo_version, #typename, #unescaped_name

Constructor Details

#initialize(_name, _enclosure, params) ⇒ Component

Returns a new instance of Component.



1485
1486
1487
1488
1489
# File 'lib/ridl/node.rb', line 1485

def initialize(_name, _enclosure, params)
  @idltype = IDL::Type::Component.new(self)
  super(_name, _enclosure, params)
  @defined = !params[:forward]
end

Instance Method Details

#attributes(include_bases = false, traversed = nil) ⇒ Object



1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
# File 'lib/ridl/node.rb', line 1543

def attributes(include_bases = false, traversed = nil)
  atts = @children.inject([]) do |lst, c|
    if IDL::AST::Port === c
      lst.concat(c.attributes)
    else
      lst << c
    end
    lst
  end
  atts.concat(base_attributes(traversed || [])) if include_bases
  atts
end

#instantiate(instantiation_context, _enclosure) ⇒ Object



1500
1501
1502
1503
# File 'lib/ridl/node.rb', line 1500

def instantiate(instantiation_context, _enclosure)
  # instantiate concrete component def and validate
  super(instantiation_context, _enclosure, { forward: self.is_forward? })
end

#is_defined?Boolean

Returns:

  • (Boolean)


1505
1506
1507
# File 'lib/ridl/node.rb', line 1505

def is_defined?
  @defined
end

#is_forward?Boolean

Returns:

  • (Boolean)


1509
1510
1511
# File 'lib/ridl/node.rb', line 1509

def is_forward?
  not @defined
end

#marshal_dumpObject



1491
1492
1493
# File 'lib/ridl/node.rb', line 1491

def marshal_dump
  super() << @defined
end

#marshal_load(vars) ⇒ Object



1495
1496
1497
1498
# File 'lib/ridl/node.rb', line 1495

def marshal_load(vars)
  @defined = vars.pop
  super(vars)
end

#operations(include_bases = false, traversed = nil) ⇒ Object



1539
1540
1541
# File 'lib/ridl/node.rb', line 1539

def operations(include_bases = false, traversed = nil)
  include_bases ? base_operations(traversed || []) : []
end

#ports(include_bases = false, traversed = nil) ⇒ Object



1530
1531
1532
1533
1534
1535
1536
1537
# File 'lib/ridl/node.rb', line 1530

def ports(include_bases = false, traversed = nil)
  ports = @children.inject([]) do |lst, c|
    lst.concat(c.ports) if IDL::AST::Port === c
    lst
  end
  ports.concat(base_ports(traversed || [])) if include_bases
  ports
end

#set_base(parent) ⇒ Object



1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
# File 'lib/ridl/node.rb', line 1513

def set_base(parent)
  unless parent.is_a?(IDL::Type::ScopedName) && parent.is_node?(IDL::AST::TemplateParam)
    unless (parent.is_a?(IDL::Type::NodeType) && parent.is_node?(self.class))
      raise "invalid inheritance identifier for #{typename} #{scoped_lm_name}: #{parent.typename}"
    end

    @resolved_base = parent.resolved_type.node
    unless @resolved_base.is_defined?
      raise "#{typename} #{scoped_lm_name} cannot inherit from forward declared #{parent.node.typename} #{parent.node.scoped_lm_name}"
    end
    if @resolved_base.has_base?(self)
      raise "circular inheritance detected for #{typename} #{scoped_lm_name}: #{parent.node.scoped_lm_name} is descendant"
    end
  end
  @base = parent.node
end