A Context is something that can hold modules, classes, methods, attributes, aliases, requires, and includes. Classes, modules, and files are all Contexts.
- #
- 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
Constants
| TYPES | = | %w[class instance] |
Types of methods |
||
Attributes
| [R] | aliases | Class/module aliases |
| [R] | attributes | All attr* methods |
| [RW] | block_params | Block params to be used in the next MethodAttr parsed under this context |
| [R] | constants | Constants defined |
| [R] | constants_hash |
|
| [W] | current_line_visibility | Current visibility of this line |
| [W] | current_section | Sets the current documentation section of documentation |
| [R] | extends | Modules this context is extended with |
| [R] | external_aliases | Aliases that could not 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 |
|
| [R] | name | Name of this class excluding namespace. See also |
| [RW] | params | Params to be used in the next MethodAttr parsed under this context |
| [R] | requires | Files this context requires |
| [RW] | temporary_section | Use this section for the next method, attribute or constant added. |
| [RW] | unmatched_alias_lists |
|
| [RW] | visibility | Current visibility of this context |
Class Public methods
new() Link
Creates an unnamed empty context with public current visibility
# File ruby/lib/rdoc/context.rb, line 123 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 Public methods
add(klass, name, comment) Link
Adds an item of type klass with the given name and comment to the context.
Currently only RDoc::Extend and RDoc::Include are supported.
# File ruby/lib/rdoc/context.rb, line 183 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) Link
Adds an_alias that is automatically resolved
# File ruby/lib/rdoc/context.rb, line 198 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) Link
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 225 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') Link
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 288 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 = '::BasicObject' 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) Link
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 404 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.full_name = nil 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 if @store.unmatched_constant_alias[mod.full_name] then to, file = @store.unmatched_constant_alias[mod.full_name] add_module_alias mod, mod.name, to, file end end mod end
add_constant(constant) Link
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 429 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) Link
Adds extension module ext which should be an RDoc::Extend
add_include(include) Link
Adds included module include which should be an RDoc::Include
add_method(method) Link
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 473 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 if @current_line_visibility method.visibility, @current_line_visibility = @current_line_visibility, nil else method.visibility = @visibility end add_to @method_list, method resolve_aliases method end method end
add_module(class_type, name) Link
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 506 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, from_name, to, file) Link
Adds an alias from from (a class or module) to name which was defined in file.
# File ruby/lib/rdoc/context.rb, line 527 def add_module_alias from, from_name, to, file return from if @done_documenting to_full_name = child_name to.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_full_name unless from @store.unmatched_constant_alias[child_name(from_name)] = [to, file] return to end new_to = from.dup new_to.name = to.name new_to.full_name = nil if new_to.module? then @store.modules_hash[to_full_name] = new_to @modules[to.name] = new_to else @store.classes_hash[to_full_name] = new_to @classes[to.name] = new_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 to.name, nil, new_to.comment const.record_location file const.is_alias_for = from add_constant const new_to end
add_module_by_normal_module(mod) Link
Adds a module by RDoc::NormalModule instance. See also add_module.
add_require(require) Link
Adds require to this context’s top level
add_section(title, comment = nil) Link
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
add_to(array, thing) Link
Adds thing to the collection array
any_content(includes = true) Link
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.
# File ruby/lib/rdoc/context.rb, line 616 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) Link
Creates the full name for a child with name
classes_and_modules() Link
All classes and modules in this namespace
current_section() Link
The current documentation section that new items will be added to. If temporary_section is available it will be used.
defined_in?(file) Link
Is part of this thing was defined in file?
each_attribute() Link
Iterator for attributes
each_classmodule() Link
Iterator for classes and modules
each_constant() Link
Iterator for constants
each_extend() Link
Iterator for extension modules
each_include() Link
Iterator for included modules
each_method() Link
Iterator for methods
each_section() Link
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 770 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].select(&:display?).sort, attributes[section].select(&:display?).sort end end
find_attribute(name, singleton) Link
Finds an attribute name with singleton value singleton.
find_attribute_named(name) Link
Finds an attribute with name in this context
find_class_method_named(name) Link
Finds a class method with name in this context
find_constant_named(name) Link
Finds a constant with name in this context
find_external_alias(name, singleton) Link
Finds an external alias name with singleton value singleton.
find_external_alias_named(name) Link
Finds an external alias with name in this context
find_file_named(name) Link
Finds a file with name in this context
find_instance_method_named(name) Link
Finds an instance method with name in this context
find_local_symbol(symbol) Link
Finds a method, constant, attribute, external alias, module or file named symbol in this context.
find_method(name, singleton) Link
Finds a method named name with singleton value singleton.
find_method_named(name) Link
Finds a instance or module method with name in this context
find_symbol(symbol) Link
Look up symbol, first as a module, then as a local symbol.
find_symbol_module(symbol) Link
Look up a module named symbol.
# File ruby/lib/rdoc/context.rb, line 924 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() Link
The full name for this context. This method is overridden by subclasses.
fully_documented?() Link
Does this context and its methods and constants all have documentation?
(Yes, fully documented doesn’t mean everything.)
http_url(prefix) Link
URL for this with a prefix
initialize_methods_etc() Link
Sets the defaults for methods and so-forth
# File ruby/lib/rdoc/context.rb, line 145 def initialize_methods_etc @method_list = [] @attributes = [] @aliases = [] @requires = [] @includes = [] @extends = [] @constants = [] @external_aliases = [] @current_line_visibility = nil # 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() Link
Instance attributes
instance_method_list() Link
Instance methods
instance_methods() Link
Instance methods
methods_by_type(section = nil) Link
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 1015 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) Link
Yields AnyMethod and Attr entries matching the list of names in methods.
# File ruby/lib/rdoc/context.rb, line 1038 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
name_for_path() Link
Name to use to generate the url. #full_name by default.
ongoing_visibility=(visibility) Link
Changes the visibility for new methods to visibility
record_location(top_level) Link
Record top_level as a file self is in.
remove_from_documentation?() Link
Should we remove this context from the documentation?
The answer is yes if:
-
received_nodocistrue -
any_contentisfalse(not counting includes) -
All
includesare 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 1094 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
remove_invisible(min_visibility) Link
Removes methods and attributes with a visibility less than min_visibility.
# File ruby/lib/rdoc/context.rb, line 1107 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 remove_invisible_in @constants, min_visibility end
resolve_aliases(added) Link
Tries to resolve unmatched aliases when a method or attribute has just been added.
# File ruby/lib/rdoc/context.rb, line 1133 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() Link
Returns RDoc::Context::Section objects referenced in this context for use in a table of contents.
# File ruby/lib/rdoc/context.rb, line 1149 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() Link
Sections in this context
set_constant_visibility_for(names, visibility) Link
Given an array names of constants, set the visibility of each constant to visibility
set_current_section(title, comment) Link
Sets the current section to a section with title. See also add_section
set_visibility_for(methods, visibility, singleton = false) Link
Given an array methods of method names, set the visibility of each to visibility
sort_sections() Link
Sorts sections alphabetically (default) or in TomDoc fashion (none, Public, Internal, Deprecated)
# File ruby/lib/rdoc/context.rb, line 1213 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() Link
Return the TopLevel that owns us
upgrade_to_class(mod, class_type, enclosing) Link
Upgrades NormalModule mod in enclosing to a class_type
# File ruby/lib/rdoc/context.rb, line 1249 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