Class: IDL::AST::Union

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

Overview

Member

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

#idltypeObject (readonly)

Returns the value of attribute idltype.



2695
2696
2697
# File 'lib/ridl/node.rb', line 2695

def idltype
  @idltype
end

#switchtypeObject

Returns the value of attribute switchtype.



2696
2697
2698
# File 'lib/ridl/node.rb', line 2696

def switchtype
  @switchtype
end

Instance Method Details

#default_labelObject



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 # No default label detection for wchar
  lbls = members.collect { |m| m.labels.include?(:default) ? [] : m.labels.collect { |l| l.value } }.flatten
  lbls = lbls.sort unless IDL::Type::Boolean === swtype ## work around bug in Ruby 1.9.2
  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

Returns:

  • (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

Returns:

  • (Boolean)


2711
2712
2713
# File 'lib/ridl/node.rb', line 2711

def is_defined?
  @defined
end

#is_forward?Boolean

Returns:

  • (Boolean)


2719
2720
2721
# File 'lib/ridl/node.rb', line 2719

def is_forward?
  @forward
end

#is_local?(recurstk = []) ⇒ Boolean

Returns:

  • (Boolean)


2743
2744
2745
2746
2747
2748
2749
2750
2751
# File 'lib/ridl/node.rb', line 2743

def is_local?(recurstk = [])
  # not local if forward decl or recursion detected
  return false if is_forward? || recurstk.include?(self)

  recurstk.push self # track root node to detect recursion
  ret = members.any? { |m| m.is_local?(recurstk) }
  recurstk.pop
  ret
end

#is_recursive?Boolean

Returns:

  • (Boolean)


2723
2724
2725
# File 'lib/ridl/node.rb', line 2723

def is_recursive?
  @recursive
end

#marshal_dumpObject



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

#membersObject



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

#typesObject



2739
2740
2741
# File 'lib/ridl/node.rb', line 2739

def types
  @children.reject { |c| c.is_a? IDL::AST::UnionMember }
end

#validate_labelsObject



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|
    ## check union case labels for validity
    m.labels.each { |lbl|
      if lbl == :default
        raise "duplicate case label 'default' for #{typename} #{lm_name}" if default_

        default_ = true
      else
        # correct type
        lv = @switchtype.resolved_type.narrow(lbl.value)
        # doubles
        if labelvals.include? lv
          raise "duplicate case label #{lv} for #{typename} #{lm_name}"
        end

        labelvals << lv
      end
    }
  }
  ## check if default allowed if defined
  if default_
    if @switchtype.resolved_type.range_length == labelvals.size
      raise "'default' case label superfluous for #{typename} #{lm_name}"
    end
  end
end

#walk_membersObject



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