A Context is something that can hold modules, classes, methods, attributes, aliases, requires, and includes. Classes, modules, and files are all Contexts.
- CLASS RDoc::Context::Section
- #
- A
- C
- D
- E
- F
-
- find_attribute,
- find_attribute_named,
- find_class_method_named,
- find_constant_named,
- find_enclosing_module_named,
- find_external_alias,
- find_external_alias_named,
- find_file_named,
- find_instance_method_named,
- find_local_symbol,
- find_method,
- find_method_named,
- find_module_named,
- find_symbol,
- find_symbol_module,
- full_name,
- fully_documented?
- H
- I
- M
- N
- O
- R
- S
- T
- U
TYPES | = | %w[class instance] |
Types of methods |
[R] | aliases | Class/module aliases |
[R] | attributes | All attr* methods |
[R] | constants | Constants defined |
[R] | constants_hash | Hash of registered constants. |
[W] | current_section | Sets the current documentation section of documentation |
[R] | external_aliases | Aliases that could not eventually be resolved. |
[R] | in_files | Files this context is found in |
[R] | includes | Modules this context includes |
[R] | method_list | Methods defined in this context |
[R] | methods_hash | Hash of registered methods. Attributes are also registered here, twice if they are RW. |
[R] | name | Name of this class excluding namespace. See also #full_name |
[R] | requires | Files this context requires |
[RW] | temporary_section | Use this section for the next method, attribute or constant added. |
[RW] | unmatched_alias_lists | Hash |
[RW] | visibility | Current visibility of this context |
Creates an unnamed empty context with public current visibility
# File ../ruby/lib/rdoc/context.rb, line 210 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
Contexts are sorted by #full_name
Adds an_alias
that is automatically resolved
# File ../ruby/lib/rdoc/context.rb, line 259 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
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.
# File ../ruby/lib/rdoc/context.rb, line 286 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
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.
# File ../ruby/lib/rdoc/context.rb, line 349 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 = RDoc::TopLevel.classes_hash[ename] || RDoc::TopLevel.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 = RDoc::TopLevel.classes_hash[given_name] || RDoc::TopLevel.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 superclass = nil if full_name == 'BasicObject' superclass = nil if full_name == 'Object' and defined?(::BasicObject) superclass = '::BasicObject' if defined?(::BasicObject) and full_name == 'Object' # 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 = RDoc::TopLevel.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 = RDoc::TopLevel.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 = RDoc::TopLevel.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, RDoc::TopLevel.classes_hash) end end klass end
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
.
# File ../ruby/lib/rdoc/context.rb, line 462 def add_class_or_module mod, self_hash, all_hash mod.section = current_section # TODO declaring context? something is # wrong here... mod.parent = self 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
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.
# File ../ruby/lib/rdoc/context.rb, line 481 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
Adds included module include
which should be an RDoc::Include
Adds method
if not already there. If it is (as method or
attribute), updates the comment if it was empty.
# File ../ruby/lib/rdoc/context.rb, line 517 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 known.comment = method.comment if known.comment.empty? else @methods_hash[key] = method method.visibility = @visibility add_to @method_list, method resolve_aliases method end method end
Adds a module named name
. If RDoc already knows
name
is a class then that class is returned instead. See also
add_class.
# File ../ruby/lib/rdoc/context.rb, line 540 def add_module(class_type, name) mod = @classes[name] || @modules[name] return mod if mod full_name = child_name name mod = RDoc::TopLevel.modules_hash[full_name] || class_type.new(name) add_class_or_module(mod, @modules, RDoc::TopLevel.modules_hash) end
Adds an alias from from
(a class or module) to
name
which was defined in file
.
# File ../ruby/lib/rdoc/context.rb, line 554 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 as a class when we find # BasicObject = BlankSlate return from if RDoc::TopLevel.find_class_or_module(to_name) if from.module? then RDoc::TopLevel.modules_hash[to_name] = from @modules[name] = from else RDoc::TopLevel.classes_hash[to_name] = from @classes[name] = from end # HACK: register a constant for this alias: # constant value and comment will be updated after, # when the Ruby parser adds the constant const = RDoc::Constant.new name, nil, '' const.record_location file const.is_alias_for = from add_constant const from end
Adds require
to this context's top level
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 RDoc::Context::Section
Adds thing
to the collection array
Is there any content?
This means any of: comment, aliases, methods, attributes, external aliases, require, constant.
Includes are also checked unless includes == false
.
# File ../ruby/lib/rdoc/context.rb, line 633 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.empty?) end
Creates the full name for a child with name
Class attributes
Class methods
Array of classes in this context
All classes and modules in this namespace
The current documentation section that new items will be added to. If #temporary_section is available it will be used.
Is part of this thing was defined in file
?
Iterator for attributes
Iterator for classes and modules
Iterator for constants
Iterator for included modules
Iterator for methods
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
# File ../ruby/lib/rdoc/context.rb, line 775 def each_section # :yields: section, constants, attributes constants = @constants.group_by do |constant| constant.section end constants.default = [] attributes = @attributes.group_by do |attribute| attribute.section end attributes.default = [] @sections.sort_by { |title, _| title.to_s }.each do |_, section| yield section, constants[section].sort, attributes[section].sort end end
Finds an attribute name
with singleton value
singleton
.
Finds an attribute with name
in this context
Finds a class method with name
in this context
Finds a constant with name
in this context
Finds an external alias name
with singleton value
singleton
.
Finds an external alias with name
in this context
Finds a file with name
in this context
Finds an instance method with name
in this context
Finds a method, constant, attribute, external alias, module or file named
symbol
in this context.
Finds a method named name
with singleton value
singleton
.
Finds a instance or module method with name
in this context
Look up symbol
, first as a module, then as a local symbol.
Look up a module named symbol
.
# File ../ruby/lib/rdoc/context.rb, line 919 def find_symbol_module(symbol) result = nil # look for a class or module 'symbol' case symbol when /^::/ then result = RDoc::TopLevel.find_class_or_module(symbol) when /^(\w+):+(.+)$/ suffix = $2 top = $1 searched = self loop do mod = searched.find_module_named(top) break unless mod result = RDoc::TopLevel.find_class_or_module(mod.full_name + '::' + suffix) break if result || searched.is_a?(RDoc::TopLevel) searched = searched.parent end else searched = self loop do result = searched.find_module_named(symbol) break if result || searched.is_a?(RDoc::TopLevel) searched = searched.parent end end result end
The full name for this context. This method is overridden by subclasses.
Does this context and its methods and constants all have documentation?
(Yes, fully documented doesn't mean everything.)
URL for this with a prefix
Sets the defaults for methods and so-forth
# File ../ruby/lib/rdoc/context.rb, line 232 def initialize_methods_etc @method_list = [] @attributes = [] @aliases = [] @requires = [] @includes = [] @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 = {} end
Instance attributes
Instance methods
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 RDoc::Context::Section will be returned.
# File ../ruby/lib/rdoc/context.rb, line 1000 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
Yields AnyMethod and Attr entries matching the list of names in
methods
.
# File ../ruby/lib/rdoc/context.rb, line 1023 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
Array of modules in this context
Name to use to generate the url. #full_name
by default.
Changes the visibility for new methods to visibility
Record top_level
as a file self
is in.
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
# File ../ruby/lib/rdoc/context.rb, line 1079 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
Removes methods and attributes with a visibility less than
min_visibility
.
Tries to resolve unmatched aliases when a method or attribute has just been added.
# File ../ruby/lib/rdoc/context.rb, line 1118 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
Sections in this context
Sets the current section to a section with title
. See also add_section
Given an array methods
of method names, set the visibility of
each to visibility
Return the TopLevel that owns us
Upgrades NormalModule mod
in enclosing
to a
class_type
# File ../ruby/lib/rdoc/context.rb, line 1178 def upgrade_to_class mod, class_type, enclosing enclosing.modules_hash.delete mod.name klass = RDoc::ClassModule.from_module class_type, mod # if it was there, then we keep it even if done_documenting RDoc::TopLevel.classes_hash[mod.full_name] = klass enclosing.classes_hash[mod.name] = klass klass end