File: transformer/object-into-document/node.rb

Overview
Module Structure
Code

Overview

Module Structure

  module: <Toplevel Module>
  module: TmDoc#10
  module: Transformer
  module: ObjectIntoDocument#12
  module: Node#14
has properties
function: transform_module_structure_node / 4 #18
function: transform_class_hierarchy_node / 4 #108
function: transform_infobox / 4 #180
function: transform_locations_to_links / 2 #234

Code

   1  # $Id: node.rb,v 1.10 2012/04/17 05:30:54 machan Exp $
   2 
   3  require 'tmdoc/tmstd'
   4  require 'tmdoc/constant'
   5  require 'tmdoc/model/object'
   6  require 'tmdoc/model/document'
   7  require 'tmdoc/transformer/object-into-document/link'
   8 
   9 
  10  module TmDoc
  11 
  12  module Transformer::ObjectIntoDocument
  13 
  14  module Node
  15 
  16  module_function
  17 
  18      def transform_module_structure_node(
  19          mo_node_module, mo_focus_module = nil, mo_file = nil, &block
  20      )
  21          ASSERT.kind_of      mo_node_module,     MOLA::GenericModule
  22          ASSERT.opt_kind_of  mo_focus_module,    MOLA::GenericModule
  23          ASSERT.opt_kind_of  mo_file,            MOP::File
  24 
  25          mo_below_modules = mo_node_module.below_modules.select {
  26              |mo_below_module|
  27              ASSERT.kind_of mo_below_module, MOLA::GenericModule
  28 
  29              if mo_below_module.suppressable?
  30                  false
  31              else
  32                  if mo_focus_module && mo_focus_module == mo_below_module
  33                      true
  34                  else
  35                      (
  36                          if block
  37                              block.call mo_below_module
  38                          else
  39                              true
  40                          end
  41                      ) && (
  42                          if mo_below_module.kind_of?(MOLN::Module) ||
  43                                      mo_below_module.kind_of?(MOLN::Class)
  44                              true
  45                          else
  46                              mo_below_module.descendant_modules_any? {
  47                                  |mo_module|
  48                                  ASSERT.kind_of(
  49                                      mo_module, MOLA::GenericModule
  50                                  )
  51 
  52                                  mo_module.kind_of?(MOLN::Module) ||
  53                                  mo_module.kind_of?(MOLN::Class)
  54                              }
  55                          end
  56                      )
  57                  end
  58              end
  59          }
  60 
  61          md_below_modules = mo_below_modules.sort.map { |mo_below_module|
  62              ASSERT.kind_of mo_below_module, MOLA::GenericModule
  63 
  64              transform_module_structure_node(
  65                  mo_below_module, mo_focus_module, mo_file, &block
  66              )
  67          }.compact
  68 
  69          md_infobox =
  70              if mo_file && (
  71                  mo_node_module.locations.any? { |location|
  72                      location.a_file == mo_file
  73                  }
  74              )
  75                  transform_infobox(
  76                      mo_node_module,
  77                      mo_file,
  78                      mo_node_module.kind_of?(MOLA::GenericClass),
  79                      true
  80                  )
  81              else
  82                  nil
  83              end
  84 
  85          opts = {
  86              :infobox        => md_infobox,
  87              :is_focused     => mo_node_module == mo_focus_module,
  88              :links_to_line  => transform_locations_to_links(
  89                  mo_node_module.locations, mo_file
  90              )
  91          }.reject { |key, val| val.nil? }
  92 
  93          MDN::ModuleStructure.new(
  94              Link.transform_link_to_module(mo_node_module),
  95              (
  96                  if md_below_modules.empty?
  97                      MDN::EMPTY_MODULES
  98                  else
  99                      MDN::SeqOfModule.new md_below_modules
 100                  end
 101              ),
 102              opts
 103          )
 104      end
 105 
 106 
 107 
 108      def transform_class_hierarchy_node(
 109          mo_node_class, mo_focus_module = nil, mo_file = nil, &block
 110      )
 111          ASSERT.kind_of      mo_node_class,      MOLA::GenericClass
 112          ASSERT.opt_kind_of  mo_focus_module,    MOLA::GenericModule
 113          ASSERT.opt_kind_of  mo_file,            MOP::File
 114 
 115          mo_subclasses = mo_node_class.subclasses.select { |mo_subclass|
 116              ASSERT.kind_of mo_subclass, MOLN::Class
 117 
 118              if mo_subclass.suppressable?
 119                  false
 120              else
 121                  if block
 122                      block.call mo_subclass
 123                  else
 124                      true
 125                  end
 126              end
 127          }
 128          md_subclasses = mo_subclasses.sort.map { |mo_subclass|
 129              ASSERT.kind_of mo_subclass, MOLN::Class
 130 
 131              transform_class_hierarchy_node(
 132                  mo_subclass, mo_focus_module, mo_file, &block
 133              )
 134          }
 135 
 136          is_focused = mo_node_class == mo_focus_module
 137 
 138          md_infobox =
 139              if is_focused || (
 140                  mo_focus_module &&
 141                  mo_focus_module.kind_of?(MOLN::Class) &&
 142                  mo_focus_module.ancestor_classes.include?(mo_node_class)
 143              )
 144                  transform_infobox mo_node_class, nil, true
 145              else
 146                  nil
 147              end
 148 
 149          is_above_module_equal_to_superclass =
 150              if mo_node_class.kind_of?(MOLA::ChildClass)
 151                  mo_node_class.above_module_equal_to_superclass?
 152              else
 153                  false
 154              end
 155 
 156          opts = {
 157              :infobox        =>  md_infobox,
 158              :is_focused     =>  is_focused,
 159              :is_above_module_equal_to_superclass =>
 160                                      is_above_module_equal_to_superclass,
 161              :links_to_line  =>  transform_locations_to_links(
 162                  mo_node_class.locations, mo_file
 163              )
 164          }.reject { |key, val| val.nil? }
 165 
 166          MDN::ClassHierarchy.new(
 167              Link.transform_link_to_module(mo_node_class),
 168              (
 169                  if md_subclasses.empty?
 170                      MDN::EMPTY_CLASSES
 171                  else
 172                      MDN::SeqOfClass.new(md_subclasses)
 173                  end
 174              ),
 175              opts
 176          )
 177      end
 178 
 179 
 180      def transform_infobox(
 181              mo_node_module,                 mo_file = nil,
 182              is_belongs_to_class = false,    show_superclass = false
 183          )
 184          ASSERT.kind_of      mo_node_module,     MOLA::GenericModule
 185          ASSERT.opt_kind_of  mo_file,            MOP::File
 186          ASSERT.boolean      is_belongs_to_class
 187          ASSERT.boolean      show_superclass
 188 
 189          rows = [
 190              Module::InfoBox.transform_modules(
 191                  mo_node_module.extendee_modules,
 192                  MDM::InfoBox::Row::ExtendeeModules
 193              ),
 194 
 195              Module::InfoBox.transform_modules(
 196                  mo_node_module.includee_modules,
 197                  MDM::InfoBox::Row::IncludeeModules
 198              ),
 199 
 200              if show_superclass && mo_node_module.kind_of?(MOLA::ChildClass)
 201                  mo_superclass = mo_node_module.a_superclass
 202                  if mo_superclass
 203                      Module::InfoBox.transform_module(
 204                          mo_superclass,
 205                          MDM::InfoBox::Row::Superclass
 206                      )
 207                  else
 208                      nil
 209                  end
 210              else
 211                  nil
 212              end,
 213 
 214              Module::InfoBox.transform_properties(
 215                  mo_node_module.properties, is_belongs_to_class, mo_file
 216              )
 217          ].compact
 218 
 219          md_infobox =
 220              unless rows.empty?
 221                  MDN::InfoBox.new(
 222                      Path.transform(mo_node_module.above_path),
 223                      mo_node_module.name,
 224                      MDM::InfoBox::Row::SeqOfRow.new(rows)
 225                  )
 226              else
 227                  nil
 228              end
 229 
 230          ASSERT.opt_kind_of md_infobox, MDN::InfoBox
 231      end
 232 
 233 
 234      def transform_locations_to_links(mo_locations, mo_file)
 235          ASSERT.kind_of      mo_locations,   MOL::SetOfLocation
 236          ASSERT.opt_kind_of  mo_file,        MOP::File
 237 
 238          return nil unless mo_file
 239 
 240          links_to_line = mo_locations.select { |mo_location|
 241              mo_location.a_file == mo_file
 242          }.sort.map { |mo_location|
 243              Link.transform_link_to_line(mo_location)
 244          }
 245          return nil if links_to_line.empty?
 246 
 247          MDL::SeqOfLine.new(links_to_line)
 248      end
 249  end
 250 
 251  end # TmDoc::Transformer::ObjectIntoDocument
 252 
 253  end # TmDoc