123456789_123456789_123456789_123456789_123456789_

Class: RDoc::Context

Relationships & Source Files
Namespace Children
Classes:
Extension / Inclusion / Inheritance Descendants
Subclasses:
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
self, CodeObject
Instance Chain:
self, Comparable, CodeObject, Generator::Markup, Text
Inherits: RDoc::CodeObject
Defined in: lib/rdoc/context.rb

Overview

A Context is something that can hold modules, classes, methods, attributes, aliases, requires, and includes. Classes, modules, and files are all Contexts.

Constant Summary

Text - Included

MARKUP_FORMAT, TO_HTML_CHARACTERS

Class Method Summary

  • .new ⇒ Context constructor

    Creates an unnamed empty context with public current visibility.

CodeObject - Inherited

.new

Creates a new CodeObject that will document itself and its children.

Instance Attribute Summary

CodeObject - Inherited

#comment

Our comment.

#comment=

Replaces our comment with comment, unless it is empty.

#document_children

Do we document our children?

#document_children=

Enables or disables documentation of this CodeObject's children unless it has been turned off by :enddoc:

#document_self

Do we document ourselves?

#document_self=

Enables or disables documentation of this CodeObject unless it has been turned off by :enddoc:.

#done_documenting

Are we done documenting (ie, did we come across a :enddoc:)?

#done_documenting=

Turns documentation on/off, and turns on/off #document_self and #document_children.

#force_documentation

Force documentation of this CodeObject.

#force_documentation=

Force the documentation of this object unless documentation has been turned off by :enddoc:

#line

Line in #file where this CodeObject was defined.

#offset

Offset in #file where this CodeObject was defined.

#parent

Our parent CodeObject.

#parent=

Sets the parent CodeObject.

#section

The section this CodeObject is in.

#section=

Set the section this CodeObject is in.

#store

The Store for this object.

#store=

Sets the store that contains this CodeObject.

#viewer

We are the model of the code, but we know that at some point we will be worked on by viewers.

#display?

Should this CodeObject be displayed in output?

#documented?

Does this object have a comment with content or is #received_nodoc true?

#file

Which file this code object was defined in.

#ignored?

Has this class been ignored?

#metadata

Hash of arbitrary metadata for this CodeObject.

#received_nodoc

Did we ever receive a :nodoc: directive?

#suppressed?

Has this class been suppressed?

#full_name=

Sets the full_name overriding any computed full name.

Instance Method Summary

CodeObject - Inherited

#each_parent

Yields each parent of this CodeObject.

#file_name

File name where this CodeObject was found.

#ignore

Use this to ignore a CodeObject and all its children until found again (#record_location is called).

#options

The options instance from the store this CodeObject is attached to, or a default options instance if the CodeObject is not attached.

#parent_file_name

File name of our parent.

#parent_name

Name of our parent.

#record_location

Records the TopLevel (file) where this code object was defined.

#start_doc

Enable capture of documentation unless documentation has been turned off by :enddoc:

#stop_doc

Disable capture of documentation.

#suppress

Use this to suppress a CodeObject and all its children until the next file it is seen in or documentation is discovered.

Generator::Markup - Included

#aref_to

Generates a relative URL from this object's path to target_path

#as_href

Generates a relative URL from from_path to this object's path.

#cvs_url

Build a webcvs URL starting for the given url with full_path appended as the destination path.

#description

Handy wrapper for marking up this object's comment.

#formatter

Creates an Markup::ToHtmlCrossref formatter.

Text - Included

#expand_tabs

Expands tab characters in text to eight spaces.

#flush_left

Flush text left based on the shortest line.

#markup

Convert a string in markup format into HTML.

#normalize_comment

Strips hashes, expands tabs then flushes text to the left.

#parse

Normalizes text then builds a Markup::Document from it.

#snippet

The first limit characters of text as HTML.

#strip_hashes

Strips leading # characters from text

#strip_newlines

Strips leading and trailing n characters from text

#strip_stars

Strips /* */ style comments.

#to_html

Converts ampersand, dashes, ellipsis, quotes, copyright and registered trademark symbols in text to properly encoded characters.

#wrap

Wraps txt to line_len

Constructor Details

.newContext

Creates an unnamed empty context with public current visibility

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 120

def initialize
  super

  @in_files = []

  @name    ||= "unknown"
  @parent  = nil
  @visibility = :public

  @current_section = Section.new self, nil, nil
  @sections = { nil => @current_section }
  @temporary_section = nil

  @classes = {}
  @modules = {}

  initialize_methods_etc
end

Instance Attribute Details

#aliases (readonly)

Class/module aliases

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 27

attr_reader :aliases

#attributes (readonly)

All attr* methods

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 32

attr_reader :attributes

#block_params (rw)

Block params to be used in the next MethodAttr parsed under this context

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 37

attr_accessor :block_params

#constants (readonly)

Constants defined

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 42

attr_reader :constants

#constants_hash (readonly)

Hash of registered constants.

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 115

attr_reader :constants_hash

#current_section (rw)

The current documentation section that new items will be added to. If temporary_section is available it will be used.

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 656

def current_section
  if section = @temporary_section then
    @temporary_section = nil
  else
    section = @current_section
  end

  section
end

#current_section=(value) (rw)

Sets the current documentation section of documentation

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 47

attr_writer :current_section

#extends (readonly)

Modules this context is extended with

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 62

attr_reader :extends

#external_aliases (readonly)

Aliases that could not be resolved.

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 94

attr_reader :external_aliases

#fully_documented?Boolean (readonly)

Does this context and its methods and constants all have documentation?

(Yes, fully documented doesn't mean everything.)

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 933

def fully_documented?
  documented? and
    attributes.all? { |a| a.documented? } and
    method_list.all? { |m| m.documented? } and
    constants.all? { |c| c.documented? }
end

#in_files (readonly)

Files this context is found in

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 52

attr_reader :in_files

#includes (readonly)

Modules this context includes

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 57

attr_reader :includes

#method_list (readonly)

Methods defined in this context

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 67

attr_reader :method_list

#methods_hash (readonly)

Hash of registered methods. Attributes are also registered here, twice if they are RW.

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 105

attr_reader :methods_hash

#name (readonly)

Name of this class excluding namespace. See also full_name

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 72

attr_reader :name

#ongoing_visibility=(visibility) (writeonly)

Changes the visibility for new methods to #visibility

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 1032

def ongoing_visibility=(visibility)
  @visibility = visibility
end

#params (rw)

Params to be used in the next MethodAttr parsed under this context

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 110

attr_accessor :params

#remove_from_documentation?Boolean (readonly)

Should we remove this context from the documentation?

The answer is yes if:

  • #received_nodoc is true

  • #any_content is false (not counting includes)

  • All #includes are modules (not a string), and their module has #remove_from_documentation? == true

  • All classes and modules have #remove_from_documentation? == true

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 1053

def remove_from_documentation?
  @remove_from_documentation ||=
    @received_nodoc &&
    !any_content(false) &&
    @includes.all? { |i| !i.module.is_a?(String) && i.module.remove_from_documentation? } &&
    classes_and_modules.all? { |cm| cm.remove_from_documentation? }
end

#requires (readonly)

Files this context requires

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 77

attr_reader :requires

#temporary_section (rw)

Use this section for the next method, attribute or constant added.

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 82

attr_accessor :temporary_section

#unmatched_alias_lists (rw)

Hash old_name => [aliases], for aliases that haven't (yet) been resolved to a method/attribute. (Not to be confused with the aliases of the context.)

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 89

attr_accessor :unmatched_alias_lists

#visibility (rw)

Current visibility of this context

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 99

attr_accessor :visibility

Instance Method Details

#<=>(other)

Contexts are sorted by full_name

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 167

def <=>(other)
  return nil unless RDoc::CodeObject === other

  full_name <=> other.full_name
end

#add(klass, name, comment)

Adds an item of type klass with the given #name and comment to the context.

Currently only Extend and Include are supported.

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 179

def add klass, name, comment
  if RDoc::Extend == klass then
    ext = RDoc::Extend.new name, comment
    add_extend ext
  elsif RDoc::Include == klass then
    incl = RDoc::Include.new name, comment
    add_include incl
  else
    raise NotImplementedError, "adding a #{klass} is not implemented"
  end
end

#add_alias(an_alias)

Adds an_alias that is automatically resolved

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 194

def add_alias an_alias
  return an_alias unless @document_self

  method_attr = find_method(an_alias.old_name, an_alias.singleton) ||
                find_attribute(an_alias.old_name, an_alias.singleton)

  if method_attr then
    method_attr.add_alias an_alias, self
  else
    add_to @external_aliases, an_alias
    unmatched_alias_list =
      @unmatched_alias_lists[an_alias.pretty_old_name] ||= []
    unmatched_alias_list.push an_alias
  end

  an_alias
end

#add_attribute(attribute)

Adds attribute if not already there. If it is (as method(s) or attribute), updates the comment if it was empty.

The attribute is registered only if it defines a new method. For instance, attr_reader :foo will not be registered if method foo exists, but attr_accessor :foo will be registered if method foo exists, but foo= does not.

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 221

def add_attribute attribute
  return attribute unless @document_self

  # mainly to check for redefinition of an attribute as a method
  # TODO find a policy for 'attr_reader :foo' + 'def foo=()'
  register = false

  key = nil

  if attribute.rw.index 'R' then
    key = attribute.pretty_name
    known = @methods_hash[key]

    if known then
      known.comment = attribute.comment if known.comment.empty?
    elsif registered = @methods_hash[attribute.pretty_name << '='] and
          RDoc::Attr === registered then
      registered.rw = 'RW'
    else
      @methods_hash[key] = attribute
      register = true
    end
  end

  if attribute.rw.index 'W' then
    key = attribute.pretty_name << '='
    known = @methods_hash[key]

    if known then
      known.comment = attribute.comment if known.comment.empty?
    elsif registered = @methods_hash[attribute.pretty_name] and
          RDoc::Attr === registered then
      registered.rw = 'RW'
    else
      @methods_hash[key] = attribute
      register = true
    end
  end

  if register then
    attribute.visibility = @visibility
    add_to @attributes, attribute
    resolve_aliases attribute
  end

  attribute
end

#add_class(class_type, given_name, superclass = '::Object')

Adds a class named given_name with superclass.

Both given_name and superclass may contain '::', and are interpreted relative to the self context. This allows handling correctly examples like these:

class RDoc::Gauntlet < Gauntlet
module Mod
  class Object   # implies < ::Object
  class SubObject < Object  # this is _not_ ::Object

Given class Container::Item RDoc assumes Container is a module unless it later sees class Container. add_class automatically upgrades given_name to a class in this case.

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 284

def add_class class_type, given_name, superclass = '::Object'
  # superclass nil is passed by the C parser in the following cases:
  # - registering Object in 1.8 (correct)
  # - registering BasicObject in 1.9 (correct)
  # - registering RubyVM in 1.9 in iseq.c (incorrect: < Object in vm.c)
  #
  # If we later find a superclass for a registered class with a nil
  # superclass, we must honor it.

  # find the name & enclosing context
  if given_name =~ /^:(\w)$/ then
    full_name = $1
    enclosing = top_level
    name = full_name.split(/:+/).last
  else
    full_name = child_name given_name

    if full_name =~ /^(.)::(\w)$/ then
      name = $2
      ename = $1
      enclosing = @store.classes_hash[ename] || @store.modules_hash[ename]
      # HACK: crashes in actionpack/lib/action_view/helpers/form_helper.rb (metaprogramming)
      unless enclosing then
        # try the given name at top level (will work for the above example)
        enclosing = @store.classes_hash[given_name] ||
                    @store.modules_hash[given_name]
        return enclosing if enclosing
        # not found: create the parent(s)
        names = ename.split('::')
        enclosing = self
        names.each do |n|
          enclosing = enclosing.classes_hash[n] ||
                      enclosing.modules_hash[n] ||
                      enclosing.add_module(RDoc::NormalModule, n)
        end
      end
    else
      name = full_name
      enclosing = self
    end
  end

  # fix up superclass
  if full_name == 'BasicObject' then
    superclass = nil
  elsif full_name == 'Object' then
    superclass = defined?(::BasicObject) ? '::BasicObject' : nil
  end

  # find the superclass full name
  if superclass then
    if superclass =~ /^:+/ then
      superclass = $' #'
    else
      if superclass =~ /^(\w):(.+)$/ then
        suffix = $2
        mod = find_module_named($1)
        superclass = mod.full_name + '::' + suffix if mod
      else
        mod = find_module_named(superclass)
        superclass = mod.full_name if mod
      end
    end

    # did we believe it was a module?
    mod = @store.modules_hash.delete superclass

    upgrade_to_class mod, RDoc::NormalClass, mod.parent if mod

    # e.g., Object < Object
    superclass = nil if superclass == full_name
  end

  klass = @store.classes_hash[full_name]

  if klass then
    # if TopLevel, it may not be registered in the classes:
    enclosing.classes_hash[name] = klass

    # update the superclass if needed
    if superclass then
      existing = klass.superclass
      existing = existing.full_name unless existing.is_a?(String) if existing
      if existing.nil? ||
         (existing == 'Object' && superclass != 'Object') then
        klass.superclass = superclass
      end
    end
  else
    # this is a new class
    mod = @store.modules_hash.delete full_name

    if mod then
      klass = upgrade_to_class mod, RDoc::NormalClass, enclosing

      klass.superclass = superclass unless superclass.nil?
    else
      klass = class_type.new name, superclass

      enclosing.add_class_or_module(klass, enclosing.classes_hash,
                                    @store.classes_hash)
    end
  end

  klass.parent = self

  klass
end

#add_class_or_module(mod, self_hash, all_hash)

Adds the class or module mod to the modules or classes Hash self_hash, and to all_hash (either TopLevel.modules_hash or TopLevel.classes_hash), unless #done_documenting is true. Sets the #parent of mod to self, and its #section to #current_section. Returns mod.

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 400

def add_class_or_module mod, self_hash, all_hash
  mod.section = current_section # TODO declaring context? something is
                                # wrong here...
  mod.parent = self
  mod.store = @store

  unless @done_documenting then
    self_hash[mod.name] = mod
    # this must be done AFTER adding mod to its parent, so that the full
    # name is correct:
    all_hash[mod.full_name] = mod
  end

  mod
end

#add_constant(constant)

Adds constant if not already there. If it is, updates the comment, value and/or is_alias_for of the known constant if they were empty/nil.

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 420

def add_constant constant
  return constant unless @document_self

  # HACK: avoid duplicate 'PI' & 'E' in math.c (1.8.7 source code)
  # (this is a #ifdef: should be handled by the C parser)
  known = @constants_hash[constant.name]

  if known then
    known.comment = constant.comment if known.comment.empty?

    known.value = constant.value if
      known.value.nil? or known.value.strip.empty?

    known.is_alias_for ||= constant.is_alias_for
  else
    @constants_hash[constant.name] = constant
    add_to @constants, constant
  end

  constant
end

#add_extend(ext)

Adds extension module ext which should be an Extend

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 454

def add_extend ext
  add_to @extends, ext

  ext
end

#add_include(include)

Adds included module include which should be an Include

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 445

def add_include include
  add_to @includes, include

  include
end

#add_method(method)

Adds method if not already there. If it is (as method or attribute), updates the comment if it was empty.

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 464

def add_method method
  return method unless @document_self

  # HACK: avoid duplicate 'new' in io.c & struct.c (1.8.7 source code)
  key = method.pretty_name
  known = @methods_hash[key]

  if known then
    if @store then # otherwise we are loading
      known.comment = method.comment if known.comment.empty?
      previously = ", previously in #{known.file}" unless
        method.file == known.file
      @store.rdoc.options.warn \
        "Duplicate method #{known.full_name} in #{method.file}#{previously}"
    end
  else
    @methods_hash[key] = method
    method.visibility = @visibility
    add_to @method_list, method
    resolve_aliases method
  end

  method
end

#add_module(class_type, name)

Adds a module named #name. If RDoc already knows #name is a class then that class is returned instead. See also #add_class.

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 493

def add_module(class_type, name)
  mod = @classes[name] || @modules[name]
  return mod if mod

  full_name = child_name name
  mod = @store.modules_hash[full_name] || class_type.new(name)

  add_class_or_module mod, @modules, @store.modules_hash
end

#add_module_alias(from, name, file)

Adds an alias from from (a class or module) to #name which was defined in file.

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 507

def add_module_alias from, name, file
  return from if @done_documenting

  to_name = child_name name

  # if we already know this name, don't register an alias:
  # see the metaprogramming in lib/active_support/basic_object.rb,
  # where we already know BasicObject is a class when we find
  # BasicObject = BlankSlate
  return from if @store.find_class_or_module to_name

  to = from.dup
  to.name = name
  to.full_name = nil

  if to.module? then
    @store.modules_hash[to_name] = to
    @modules[name] = to
  else
    @store.classes_hash[to_name] = to
    @classes[name] = to
  end

  # Registers a constant for this alias.  The constant value and comment
  # will be updated later, when the Ruby parser adds the constant
  const = RDoc::Constant.new name, nil, to.comment
  const.record_location file
  const.is_alias_for = from
  add_constant const

  to
end

#add_require(require)

Adds require to this context's top level

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 543

def add_require(require)
  return require unless @document_self

  if RDoc::TopLevel === self then
    add_to @requires, require
  else
    parent.add_require require
  end
end

#add_section(title, comment = nil)

Returns a section with title, creating it if it doesn't already exist. comment will be appended to the section's comment.

A section with a title of nil will return the default section.

See also Context::Section

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 561

def add_section title, comment = nil
  if section = @sections[title] then
    section.add_comment comment if comment
  else
    section = Section.new self, title, comment
    @sections[title] = section
  end

  section
end

#add_to(array, thing)

Adds thing to the collection array

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 575

def add_to array, thing
  array << thing if @document_self

  thing.parent  = self
  thing.store   = @store if @store
  thing.section = current_section
end

#any_content(includes = true)

Is there any content?

This means any of: comment, aliases, methods, attributes, external aliases, require, constant.

Includes and extends are also checked unless includes == false.

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 591

def any_content(includes = true)
  @any_content ||= !(
    @comment.empty? &&
    @method_list.empty? &&
    @attributes.empty? &&
    @aliases.empty? &&
    @external_aliases.empty? &&
    @requires.empty? &&
    @constants.empty?
  )
  @any_content || (includes && !(@includes + @extends).empty? )
end

#child_name(name)

Creates the full name for a child with #name

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 607

def child_name name
  if name =~ /^:+/
    $'  #'
  elsif RDoc::TopLevel === self then
    name
  else
    "#{self.full_name}::#{name}"
  end
end

#class_attributes

Class attributes

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 620

def class_attributes
  @class_attributes ||= attributes.select { |a| a.singleton }
end

#class_method_list

Class methods

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 627

def class_method_list
  @class_method_list ||= method_list.select { |a| a.singleton }
end

#classes

Array of classes in this context

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 634

def classes
  @classes.values
end

#classes_and_modules

All classes and modules in this namespace

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 641

def classes_and_modules
  classes + modules
end

#classes_hash

Hash of classes keyed by class name

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 648

def classes_hash
  @classes
end

#defined_in?(file) ⇒ Boolean

Is part of this thing was defined in file?

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 669

def defined_in?(file)
  @in_files.include?(file)
end

#each_attribute

Iterator for attributes

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 694

def each_attribute # :yields: attribute
  @attributes.each { |a| yield a }
end

#each_classmodule(&block)

Iterator for classes and modules

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 701

def each_classmodule(&block) # :yields: module
  classes_and_modules.sort.each(&block)
end

#each_constant

Iterator for constants

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 708

def each_constant # :yields: constant
  @constants.each {|c| yield c}
end

#each_extend

Iterator for extension modules

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 722

def each_extend # :yields: extend
  @extends.each do |e| yield e end
end

#each_include

Iterator for included modules

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 715

def each_include # :yields: include
  @includes.each do |i| yield i end
end

#each_method

Iterator for methods

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 729

def each_method # :yields: method
  return enum_for __method__ unless block_given?

  @method_list.sort.each { |m| yield m }
end

#each_section

Iterator for each section's contents sorted by title. The section, the section's #constants and the sections #attributes are yielded. The #constants and #attributes collections are sorted.

To retrieve methods in a section use #methods_by_type with the optional section parameter.

NOTE: Do not edit collections yielded by this method

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 745

def each_section # :yields: section, constants, attributes
  return enum_for __method__ unless block_given?

  constants  = @constants.group_by  do |constant|  constant.section end
  attributes = @attributes.group_by do |attribute| attribute.section end

  constants.default  = []
  attributes.default = []

  sort_sections.each do |section|
    yield section, constants[section].sort, attributes[section].sort
  end
end

#find_attribute(name, singleton)

Finds an attribute #name with singleton value singleton.

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 762

def find_attribute(name, singleton)
  name = $1 if name =~ /^(.*)=$/
  @attributes.find { |a| a.name == name && a.singleton == singleton }
end

#find_attribute_named(name)

Finds an attribute with #name in this context

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 770

def find_attribute_named(name)
  case name
  when /\A#/ then
    find_attribute name[1..-1], false
  when /\A::/ then
    find_attribute name[2..-1], true
  else
    @attributes.find { |a| a.name == name }
  end
end

#find_class_method_named(name)

Finds a class method with #name in this context

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 784

def find_class_method_named(name)
  @method_list.find { |meth| meth.singleton && meth.name == name }
end

#find_constant_named(name)

Finds a constant with #name in this context

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 791

def find_constant_named(name)
  @constants.find {|m| m.name == name}
end

#find_enclosing_module_named(name)

Find a module at a higher scope

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 798

def find_enclosing_module_named(name)
  parent && parent.find_module_named(name)
end

#find_external_alias(name, singleton)

Finds an external alias #name with singleton value singleton.

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 805

def find_external_alias(name, singleton)
  @external_aliases.find { |m| m.name == name && m.singleton == singleton }
end

#find_external_alias_named(name)

Finds an external alias with #name in this context

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 812

def find_external_alias_named(name)
  case name
  when /\A#/ then
    find_external_alias name[1..-1], false
  when /\A::/ then
    find_external_alias name[2..-1], true
  else
    @external_aliases.find { |a| a.name == name }
  end
end

#find_file_named(name)

Finds a file with #name in this context

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 826

def find_file_named name
  @store.find_file_named name
end

#find_instance_method_named(name)

Finds an instance method with #name in this context

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 833

def find_instance_method_named(name)
  @method_list.find { |meth| !meth.singleton && meth.name == name }
end

#find_local_symbol(symbol)

Finds a method, constant, attribute, external alias, module or file named symbol in this context.

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 841

def find_local_symbol(symbol)
  find_method_named(symbol) or
  find_constant_named(symbol) or
  find_attribute_named(symbol) or
  find_external_alias_named(symbol) or
  find_module_named(symbol) or
  find_file_named(symbol)
end

#find_method(name, singleton)

Finds a method named #name with singleton value singleton.

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 853

def find_method(name, singleton)
  @method_list.find { |m| m.name == name && m.singleton == singleton }
end

#find_method_named(name)

Finds a instance or module method with #name in this context

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 860

def find_method_named(name)
  case name
  when /\A#/ then
    find_method name[1..-1], false
  when /\A::/ then
    find_method name[2..-1], true
  else
    @method_list.find { |meth| meth.name == name }
  end
end

#find_module_named(name)

Find a module with #name using ruby's scoping rules

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 874

def find_module_named(name)
  res = @modules[name] || @classes[name]
  return res if res
  return self if self.name == name
  find_enclosing_module_named name
end

#find_symbol(symbol)

Look up symbol, first as a module, then as a local symbol.

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 884

def find_symbol(symbol)
  find_symbol_module(symbol) || find_local_symbol(symbol)
end

#find_symbol_module(symbol)

Look up a module named symbol.

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 891

def find_symbol_module(symbol)
  result = nil

  # look for a class or module 'symbol'
  case symbol
  when /^::/ then
    result = @store.find_class_or_module symbol
  when /^(\w):(.+)$/
    suffix = $2
    top = $1
    searched = self
    while searched do
      mod = searched.find_module_named(top)
      break unless mod
      result = @store.find_class_or_module "#{mod.full_name}::#{suffix}"
      break if result || searched.is_a?(RDoc::TopLevel)
      searched = searched.parent
    end
  else
    searched = self
    while searched do
      result = searched.find_module_named(symbol)
      break if result || searched.is_a?(RDoc::TopLevel)
      searched = searched.parent
    end
  end

  result
end

#full_name

The full name for this context. This method is overridden by subclasses.

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 924

def full_name
  '(unknown)'
end

#http_url(prefix)

URL for this with a prefix

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 943

def http_url(prefix)
  path = name_for_path
  path = path.gsub(/<<\s*(\w*)/, 'from-\1') if path =~ /<</
  path = [prefix] + path.split('::')

  File.join(*path.compact) + '.html'
end

#initialize_methods_etc

Sets the defaults for methods and so-forth

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 142

def initialize_methods_etc
  @method_list = []
  @attributes  = []
  @aliases     = []
  @requires    = []
  @includes    = []
  @extends     = []
  @constants   = []
  @external_aliases = []

  # This Hash maps a method name to a list of unmatched aliases (aliases of
  # a method not yet encountered).
  @unmatched_alias_lists = {}

  @methods_hash   = {}
  @constants_hash = {}

  @params = nil

  @store ||= nil
end

#instance_attributes

Instance attributes

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 954

def instance_attributes
  @instance_attributes ||= attributes.reject { |a| a.singleton }
end

#instance_method_list

Instance methods

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 963

def instance_method_list
  @instance_method_list ||= method_list.reject { |a| a.singleton }
end

#methods_by_type(section = nil)

Breaks method_list into a nested hash by type ('class' or 'instance') and visibility (:public, :protected, :private).

If section is provided only methods in that Context::Section will be returned.

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 974

def methods_by_type section = nil
  methods = {}

  TYPES.each do |type|
    visibilities = {}
    RDoc::VISIBILITIES.each do |vis|
      visibilities[vis] = []
    end

    methods[type] = visibilities
  end

  each_method do |method|
    next if section and not method.section == section
    methods[method.type][method.visibility] << method
  end

  methods
end

#methods_matching(methods, singleton = false, &block)

Yields AnyMethod and Attr entries matching the list of names in methods.

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 997

def methods_matching(methods, singleton = false, &block)
  (@method_list + @attributes).each do |m|
    yield m if methods.include?(m.name) and m.singleton == singleton
  end

  each_ancestor do |parent|
    parent.methods_matching(methods, singleton, &block)
  end
end

#modules

Array of modules in this context

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 1010

def modules
  @modules.values
end

#modules_hash

Hash of modules keyed by module name

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 1017

def modules_hash
  @modules
end

#name_for_path

Name to use to generate the url. #full_name by default.

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 1025

def name_for_path
  full_name
end

#record_location(top_level)

Record #top_level as a file self is in.

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 1039

def record_location(top_level)
  @in_files << top_level unless @in_files.include?(top_level)
end

#remove_invisible(min_visibility)

Removes methods and attributes with a visibility less than min_visibility.

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 1066

def remove_invisible min_visibility
  return if [:private, :nodoc].include? min_visibility
  remove_invisible_in @method_list, min_visibility
  remove_invisible_in @attributes, min_visibility
end

#resolve_aliases(added)

Tries to resolve unmatched aliases when a method or attribute has just been added.

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 1091

def resolve_aliases added
  # resolve any pending unmatched aliases
  key = added.pretty_name
  unmatched_alias_list = @unmatched_alias_lists[key]
  return unless unmatched_alias_list
  unmatched_alias_list.each do |unmatched_alias|
    added.add_alias unmatched_alias, self
    @external_aliases.delete unmatched_alias
  end
  @unmatched_alias_lists.delete key
end

#section_contents

Returns Context::Section objects referenced in this context for use in a table of contents.

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 1107

def section_contents
  used_sections = {}

  each_method do |method|
    next unless method.display?

    used_sections[method.section] = true
  end

  # order found sections
  sections = sort_sections.select do |section|
    used_sections[section]
  end

  # only the default section is used
  return [] if
    sections.length == 1 and not sections.first.title

  sections
end

#sections

Sections in this context

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 1131

def sections
  @sections.values
end

#set_current_section(title, comment)

Sets the current section to a section with title. See also #add_section

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 1142

def set_current_section title, comment
  @current_section = add_section title, comment
end

#set_visibility_for(methods, visibility, singleton = false)

Given an array methods of method names, set the visibility of each to #visibility

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 1150

def set_visibility_for(methods, visibility, singleton = false)
  methods_matching methods, singleton do |m|
    m.visibility = visibility
  end
end

#sort_sections

Sorts sections alphabetically (default) or in TomDoc fashion (none, Public, Internal, Deprecated)

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 1160

def sort_sections
  titles = @sections.map { |title, _| title }

  if titles.length > 1 and
     TOMDOC_TITLES_SORT ==
       (titles | TOMDOC_TITLES).sort_by { |title| title.to_s } then
    @sections.values_at(*TOMDOC_TITLES).compact
  else
    @sections.sort_by { |title, _|
      title.to_s
    }.map { |_, section|
      section
    }
  end
end

#top_level

Return the TopLevel that owns us

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 1186

def top_level
  return @top_level if defined? @top_level
  @top_level = self
  @top_level = @top_level.parent until RDoc::TopLevel === @top_level
  @top_level
end

#upgrade_to_class(mod, class_type, enclosing)

Upgrades NormalModule mod in enclosing to a class_type

[ GitHub ]

  
# File 'lib/rdoc/context.rb', line 1196

def upgrade_to_class mod, class_type, enclosing
  enclosing.modules_hash.delete mod.name

  klass = RDoc::ClassModule.from_module class_type, mod
  klass.store = @store

  # if it was there, then we keep it even if done_documenting
  @store.classes_hash[mod.full_name] = klass
  enclosing.classes_hash[mod.name]   = klass

  klass
end