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:
|
|
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
-
TYPES =
Types of methods
%w[class instance]
Text - Included
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
-
#block_params
rw
Block params to be used in the next MethodAttr parsed under this context.
-
#current_section
rw
The current documentation section that new items will be added to.
-
#current_section=(value)
rw
Sets the current documentation section of documentation.
-
#params
rw
Params to be used in the next MethodAttr parsed under this context.
-
#temporary_section
rw
Use this section for the next method, attribute or constant added.
-
#unmatched_alias_lists
rw
Hash
old_name => [aliases]
, for aliases that haven't (yet) been resolved to a method/attribute. -
#visibility
rw
Current visibility of this context.
-
#aliases
readonly
Class/module aliases.
-
#attributes
readonly
All attr* methods.
-
#constants
readonly
Constants defined.
-
#constants_hash
readonly
Hash of registered constants.
-
#extends
readonly
Modules this context is extended with.
-
#external_aliases
readonly
Aliases that could not be resolved.
-
#fully_documented? ⇒ Boolean
readonly
Does this context and its methods and constants all have documentation?
-
#in_files
readonly
Files this context is found in.
-
#includes
readonly
Modules this context includes.
-
#method_list
readonly
Methods defined in this context.
-
#methods_hash
readonly
Hash of registered methods.
-
#name
readonly
Name of this class excluding namespace.
-
#remove_from_documentation? ⇒ Boolean
readonly
Should we remove this context from the documentation?
-
#requires
readonly
Files this context requires.
-
#ongoing_visibility=(visibility)
writeonly
Changes the visibility for new methods to #visibility
CodeObject - Inherited
#comment | Our comment. |
#comment= | Replaces our comment with |
#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 |
#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 |
#offset | Offset in |
#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 |
#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 |
#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 |
#suppressed? | Has this class been suppressed? |
#full_name= | Sets the full_name overriding any computed full name. |
Instance Method Summary
-
#<=>(other)
Contexts are sorted by full_name.
-
#add(klass, name, comment)
Adds an item of type
klass
with the given #name andcomment
to the context. -
#add_alias(an_alias)
Adds
an_alias
that is automatically resolved. -
#add_attribute(attribute)
Adds
attribute
if not already there. -
#add_class(class_type, given_name, superclass = '::Object')
Adds a class named
given_name
withsuperclass
. -
#add_class_or_module(mod, self_hash, all_hash)
Adds the class or module
mod
to the modules or classes Hashself_hash
, and toall_hash
(eitherTopLevel.modules_hash
orTopLevel.classes_hash
), unless#done_documenting
istrue
. -
#add_constant(constant)
Adds
constant
if not already there. -
#add_extend(ext)
Adds extension module
ext
which should be an Extend -
#add_include(include)
Adds included module
include
which should be an Include -
#add_method(method)
Adds
method
if not already there. -
#add_module(class_type, name)
Adds a module named #name.
-
#add_module_alias(from, name, file)
Adds an alias from
from
(a class or module) to #name which was defined infile
. -
#add_require(require)
Adds
require
to this context's top level. -
#add_section(title, comment = nil)
Returns a section with
title
, creating it if it doesn't already exist. -
#add_to(array, thing)
Adds
thing
to the collectionarray
-
#any_content(includes = true)
Is there any content?
-
#child_name(name)
Creates the full name for a child with #name
-
#class_attributes
Class attributes.
-
#class_method_list
Class methods.
-
#classes
Array of classes in this context.
-
#classes_and_modules
All classes and modules in this namespace.
-
#classes_hash
Hash of classes keyed by class name.
-
#defined_in?(file) ⇒ Boolean
Is part of this thing was defined in
file
? -
#each_attribute
Iterator for attributes.
-
#each_classmodule(&block)
Iterator for classes and modules.
-
#each_constant
Iterator for constants.
-
#each_extend
Iterator for extension modules.
-
#each_include
Iterator for included modules.
-
#each_method
Iterator for methods.
-
#each_section
Iterator for each section's contents sorted by title.
-
#find_attribute(name, singleton)
Finds an attribute #name with singleton value
singleton
. -
#find_attribute_named(name)
Finds an attribute with #name in this context.
-
#find_class_method_named(name)
Finds a class method with #name in this context.
-
#find_constant_named(name)
Finds a constant with #name in this context.
-
#find_enclosing_module_named(name)
Find a module at a higher scope.
-
#find_external_alias(name, singleton)
Finds an external alias #name with singleton value
singleton
. -
#find_external_alias_named(name)
Finds an external alias with #name in this context.
-
#find_file_named(name)
Finds a file with #name in this context.
-
#find_instance_method_named(name)
Finds an instance method with #name in this context.
-
#find_local_symbol(symbol)
Finds a method, constant, attribute, external alias, module or file named
symbol
in this context. -
#find_method(name, singleton)
Finds a method named #name with singleton value
singleton
. -
#find_method_named(name)
Finds a instance or module method with #name in this context.
-
#find_module_named(name)
Find a module with #name using ruby's scoping rules.
-
#find_symbol(symbol)
Look up
symbol
, first as a module, then as a local symbol. -
#find_symbol_module(symbol)
Look up a module named
symbol
. -
#full_name
The full name for this context.
-
#http_url(prefix)
URL for this with a
prefix
-
#initialize_methods_etc
Sets the defaults for methods and so-forth.
-
#instance_attributes
Instance attributes.
-
#instance_method_list
Instance methods.
-
#methods_by_type(section = nil)
Breaks method_list into a nested hash by type (
'class'
or'instance'
) and visibility (:public
,:protected
,:private
). -
#methods_matching(methods, singleton = false, &block)
Yields AnyMethod and Attr entries matching the list of names in
methods
. -
#modules
Array of modules in this context.
-
#modules_hash
Hash of modules keyed by module name.
-
#name_for_path
Name to use to generate the url.
-
#record_location(top_level)
Record #top_level as a file
self
is in. -
#remove_invisible(min_visibility)
Removes methods and attributes with a visibility less than
min_visibility
. -
#resolve_aliases(added)
Tries to resolve unmatched aliases when a method or attribute has just been added.
-
#section_contents
Returns Section objects referenced in this context for use in a table of contents.
-
#sections
Sections in this context.
-
#set_current_section(title, comment)
Sets the current section to a section with
title
. -
#set_visibility_for(methods, visibility, singleton = false)
Given an array
methods
of method names, set the visibility of each to #visibility -
#sort_sections
Sorts sections alphabetically (default) or in TomDoc fashion (none, Public, Internal, Deprecated).
-
#top_level
Return the TopLevel that owns us.
-
#upgrade_to_class(mod, class_type, enclosing)
Upgrades NormalModule
mod
inenclosing
to aclass_type
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 |
#as_href | Generates a relative URL from |
#cvs_url | Build a webcvs URL starting for the given |
#description | Handy wrapper for marking up this object's comment. |
#formatter | Creates an Markup::ToHtmlCrossref formatter. |
Text - Included
#expand_tabs | Expands tab characters in |
#flush_left | Flush |
#markup | Convert a string in markup format into HTML. |
#normalize_comment | Strips hashes, expands tabs then flushes |
#parse | Normalizes |
#snippet | The first |
#strip_hashes | Strips leading # characters from |
#strip_newlines | Strips leading and trailing n characters from |
#strip_stars | Strips /* */ style comments. |
#to_html | Converts ampersand, dashes, ellipsis, quotes, copyright and registered trademark symbols in |
#wrap | Wraps |
Constructor Details
.new ⇒ Context
Creates an unnamed empty context with public current visibility
# 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
# File 'lib/rdoc/context.rb', line 27
attr_reader :aliases
#attributes (readonly)
All attr* methods
# 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
# File 'lib/rdoc/context.rb', line 37
attr_accessor :block_params
#constants (readonly)
Constants defined
# File 'lib/rdoc/context.rb', line 42
attr_reader :constants
#constants_hash (readonly)
Hash of registered constants.
# 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.
# 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
# File 'lib/rdoc/context.rb', line 47
attr_writer :current_section
#extends (readonly)
Modules this context is extended with
# File 'lib/rdoc/context.rb', line 62
attr_reader :extends
#external_aliases (readonly)
Aliases that could not be resolved.
# 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.)
# File 'lib/rdoc/context.rb', line 935
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
# File 'lib/rdoc/context.rb', line 52
attr_reader :in_files
#includes (readonly)
Modules this context includes
# File 'lib/rdoc/context.rb', line 57
attr_reader :includes
#method_list (readonly)
Methods defined in this context
# 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.
# File 'lib/rdoc/context.rb', line 105
attr_reader :methods_hash
#name (readonly)
Name of this class excluding namespace. See also full_name
# File 'lib/rdoc/context.rb', line 72
attr_reader :name
#ongoing_visibility=(visibility) (writeonly)
Changes the visibility for new methods to #visibility
# File 'lib/rdoc/context.rb', line 1034
def ongoing_visibility=(visibility) @visibility = visibility end
#params (rw)
Params to be used in the next MethodAttr parsed under this context
# 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
istrue
-
#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 'lib/rdoc/context.rb', line 1055
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
# File 'lib/rdoc/context.rb', line 77
attr_reader :requires
#temporary_section (rw)
Use this section for the next method, attribute or constant added.
# 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.)
# File 'lib/rdoc/context.rb', line 89
attr_accessor :unmatched_alias_lists
#visibility (rw)
Current visibility of this context
# File 'lib/rdoc/context.rb', line 99
attr_accessor :visibility
Instance Method Details
#<=>(other)
Contexts are sorted by full_name
# 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)
# 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
# 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.
# 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.
# 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 = '::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)
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 '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.
# 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
# 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
# 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.
# 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. .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.
# 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
.
# 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
#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
#add_to(array, thing)
Adds thing
to the collection array
# 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
.
# 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
#class_attributes
Class attributes
# File 'lib/rdoc/context.rb', line 620
def class_attributes @class_attributes ||= attributes.select { |a| a.singleton } end
#class_method_list
Class methods
# 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
# File 'lib/rdoc/context.rb', line 634
def classes @classes.values end
#classes_and_modules
All classes and modules in this namespace
#classes_hash
Hash of classes keyed by class name
# 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
?
# File 'lib/rdoc/context.rb', line 669
def defined_in?(file) @in_files.include?(file) end
#each_attribute
Iterator for attributes
# 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
# 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
# File 'lib/rdoc/context.rb', line 708
def each_constant # :yields: constant @constants.each {|c| yield c} end
#each_extend
Iterator for extension modules
# 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
# 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
# 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
# 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
.
#find_attribute_named(name)
Finds an attribute with #name in this context
# 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
#find_constant_named(name)
Finds a constant with #name in this context
#find_enclosing_module_named(name)
Find a module at a higher scope
# File 'lib/rdoc/context.rb', line 800
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
.
#find_external_alias_named(name)
Finds an external alias with #name in this context
# File 'lib/rdoc/context.rb', line 814
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
#find_instance_method_named(name)
Finds an instance method with #name in this context
#find_local_symbol(symbol)
Finds a method, constant, attribute, external alias, module or file named symbol
in this context.
# File 'lib/rdoc/context.rb', line 843
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
.
#find_method_named(name)
Finds a instance or module method with #name in this context
# File 'lib/rdoc/context.rb', line 862
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
#find_symbol(symbol)
Look up symbol
, first as a module, then as a local symbol.
# File 'lib/rdoc/context.rb', line 886
def find_symbol(symbol) find_symbol_module(symbol) || find_local_symbol(symbol) end
#find_symbol_module(symbol)
Look up a module named symbol
.
# File 'lib/rdoc/context.rb', line 893
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.
# File 'lib/rdoc/context.rb', line 926
def full_name '(unknown)' end
#http_url(prefix)
URL for this with a prefix
# File 'lib/rdoc/context.rb', line 945
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
# 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
# File 'lib/rdoc/context.rb', line 956
def instance_attributes @instance_attributes ||= attributes.reject { |a| a.singleton } end
#instance_method_list
Instance methods
# File 'lib/rdoc/context.rb', line 965
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.
# File 'lib/rdoc/context.rb', line 976
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
.
# File 'lib/rdoc/context.rb', line 999
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
# File 'lib/rdoc/context.rb', line 1012
def modules @modules.values end
#modules_hash
Hash of modules keyed by module name
# File 'lib/rdoc/context.rb', line 1019
def modules_hash @modules end
#name_for_path
Name to use to generate the url. #full_name by default.
# File 'lib/rdoc/context.rb', line 1027
def name_for_path full_name end
#record_location(top_level)
Record #top_level as a file self
is in.
#remove_invisible(min_visibility)
Removes methods and attributes with a visibility less than min_visibility
.
# File 'lib/rdoc/context.rb', line 1068
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.
# File 'lib/rdoc/context.rb', line 1093
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.
# File 'lib/rdoc/context.rb', line 1109
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
# File 'lib/rdoc/context.rb', line 1133
def sections @sections.values end
#set_current_section(title, comment)
Sets the current section to a section with title
. See also #add_section
# File 'lib/rdoc/context.rb', line 1144
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
# File 'lib/rdoc/context.rb', line 1152
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)
# File 'lib/rdoc/context.rb', line 1162
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
#upgrade_to_class(mod, class_type, enclosing)
Upgrades NormalModule mod
in enclosing
to a class_type
# File 'lib/rdoc/context.rb', line 1198
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