Class: IDL::AST::Union
- Inherits:
-
Node
show all
- Defined in:
- lib/ridl/node.rb,
lib/ridl/node.rb
Overview
Constant Summary
collapse
- DEFINABLE =
[IDL::AST::UnionMember, IDL::AST::Struct, IDL::AST::Union, IDL::AST::Enum, IDL::AST::Enumerator]
Instance Attribute Summary collapse
Attributes inherited from Leaf
#annotations, #enclosure, #intern, #name, #prefix, #scopes
Instance Method Summary
collapse
Methods inherited from Node
#define, #introduce, #is_definable?, #match_members, #redefine, #replace_prefix, #resolve, #select_members, #undo_introduction
Methods inherited from Leaf
#has_annotations?, #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) ⇒ Union
Returns a new instance of Union.
2698
2699
2700
2701
2702
2703
2704
2705
|
# File 'lib/ridl/node.rb', line 2698
def initialize(_name, _enclosure, params)
@defined = false
@recursive = false
@forward = params[:forward] ? true : false
@switchtype = nil
super(_name, _enclosure)
@idltype = IDL::Type::Union.new(self)
end
|
Instance Attribute Details
#idltype ⇒ Object
Returns the value of attribute idltype.
2695
2696
2697
|
# File 'lib/ridl/node.rb', line 2695
def idltype
@idltype
end
|
#switchtype ⇒ Object
Returns the value of attribute switchtype.
2696
2697
2698
|
# File 'lib/ridl/node.rb', line 2696
def switchtype
@switchtype
end
|
Instance Method Details
#default_label ⇒ Object
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
|
# File 'lib/ridl/node.rb', line 2757
def default_label
swtype = @switchtype.resolved_type
return nil if IDL::Type::WChar === swtype lbls = members.collect { |m| m.labels.include?(:default) ? [] : m.labels.collect { |l| l.value } }.flatten
lbls = lbls.sort unless IDL::Type::Boolean === swtype def_lbl = swtype.min
while swtype.in_range?(def_lbl)
return IDL::Expression::Value.new(@switchtype, def_lbl) unless lbls.include?(def_lbl)
return nil if def_lbl == swtype.max
def_lbl = swtype.next(def_lbl)
end
nil
end
|
#defined=(f) ⇒ Object
2715
2716
2717
|
# File 'lib/ridl/node.rb', line 2715
def defined=(f)
@defined = f
end
|
#has_default? ⇒ Boolean
2753
2754
2755
|
# File 'lib/ridl/node.rb', line 2753
def has_default?
members.any? { |m| m.labels.include?(:default) }
end
|
#instantiate(instantiation_context, _enclosure) ⇒ Object
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
|
# File 'lib/ridl/node.rb', line 2817
def instantiate(instantiation_context, _enclosure)
_params = {
forward: @forward
}
_u = super(instantiation_context, _enclosure, _params)
_u.set_switchtype(@switchtype.instantiate(instantiation_context))
_u.validate_labels
_u.defined = self.is_defined?
_u
end
|
#is_defined? ⇒ Boolean
2711
2712
2713
|
# File 'lib/ridl/node.rb', line 2711
def is_defined?
@defined
end
|
#is_forward? ⇒ Boolean
2719
2720
2721
|
# File 'lib/ridl/node.rb', line 2719
def is_forward?
@forward
end
|
#is_local?(recurstk = []) ⇒ Boolean
2743
2744
2745
2746
2747
2748
2749
2750
2751
|
# File 'lib/ridl/node.rb', line 2743
def is_local?(recurstk = [])
return false if is_forward? || recurstk.include?(self)
recurstk.push self ret = members.any? { |m| m.is_local?(recurstk) }
recurstk.pop
ret
end
|
#is_recursive? ⇒ Boolean
2723
2724
2725
|
# File 'lib/ridl/node.rb', line 2723
def is_recursive?
@recursive
end
|
#marshal_dump ⇒ Object
2804
2805
2806
|
# File 'lib/ridl/node.rb', line 2804
def marshal_dump
super() << @defined << @recursive << @forward << @idltype << @switchtype
end
|
#marshal_load(vars) ⇒ Object
2808
2809
2810
2811
2812
2813
2814
2815
|
# File 'lib/ridl/node.rb', line 2808
def marshal_load(vars)
@switchtype = vars.pop
@idltype = vars.pop
@forward = vars.pop
@recursive = vars.pop
@defined = vars.pop
super(vars)
end
|
#members ⇒ Object
2735
2736
2737
|
# File 'lib/ridl/node.rb', line 2735
def members
@children.find_all { |c| c.is_a? IDL::AST::UnionMember }
end
|
#recursive=(f) ⇒ Object
2727
2728
2729
|
# File 'lib/ridl/node.rb', line 2727
def recursive=(f)
@recursive = f
end
|
#set_switchtype(_switchtype) ⇒ Object
2707
2708
2709
|
# File 'lib/ridl/node.rb', line 2707
def set_switchtype(_switchtype)
@switchtype = _switchtype
end
|
#types ⇒ Object
2739
2740
2741
|
# File 'lib/ridl/node.rb', line 2739
def types
@children.reject { |c| c.is_a? IDL::AST::UnionMember }
end
|
#validate_labels ⇒ Object
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
|
# File 'lib/ridl/node.rb', line 2772
def validate_labels
return if self.is_template?
labelvals = []
default_ = false
members.each { |m|
m.labels.each { |lbl|
if lbl == :default
raise "duplicate case label 'default' for #{typename} #{lm_name}" if default_
default_ = true
else
lv = @switchtype.resolved_type.narrow(lbl.value)
if labelvals.include? lv
raise "duplicate case label #{lv} for #{typename} #{lm_name}"
end
labelvals << lv
end
}
}
if default_
if @switchtype.resolved_type.range_length == labelvals.size
raise "'default' case label superfluous for #{typename} #{lm_name}"
end
end
end
|
#walk_members ⇒ Object
2731
2732
2733
|
# File 'lib/ridl/node.rb', line 2731
def walk_members
@children.each { |m| yield(m) unless m.is_a? IDL::AST::UnionMember }
end
|