Class: RDoc::Context
- Inherits:
-
CodeObject
- Object
- CodeObject
- RDoc::Context
- Includes:
- Comparable
- Defined in:
- lib/rdoc/code_object/context.rb,
lib/rdoc/generator/markup.rb,
lib/rdoc/code_object/context/section.rb
Overview
A Context is something that can hold modules, classes, methods, attributes, aliases, requires, and includes. Classes, modules, and files are all Contexts.
Direct Known Subclasses
Defined Under Namespace
Classes: Section
Constant Summary collapse
- TYPES =
Types of methods
%w[class instance]
- TOMDOC_TITLES =
If a context has these titles it will be sorted in this order.
[nil, 'Public', 'Internal', 'Deprecated']
- TOMDOC_TITLES_SORT =
:nodoc:
TOMDOC_TITLES.sort_by { |title| title.to_s }
Constants included from Text
Text::MARKUP_FORMAT, Text::SPACE_SEPARATED_LETTER_CLASS
Instance Attribute Summary collapse
-
#aliases ⇒ Object
readonly
Class/module aliases.
-
#attributes ⇒ Object
readonly
All attr* methods.
-
#block_params ⇒ Object
Block params to be used in the next MethodAttr parsed under this context.
-
#constants ⇒ Object
readonly
Constants defined.
-
#constants_hash ⇒ Object
readonly
Hash of registered constants.
-
#current_section ⇒ Object
The current documentation section that new items will be added to.
-
#extends ⇒ Object
readonly
Modules this context is extended with.
-
#external_aliases ⇒ Object
readonly
Aliases that could not be resolved.
-
#in_files ⇒ Object
readonly
Files this context is found in.
-
#includes ⇒ Object
readonly
Modules this context includes.
-
#method_list ⇒ Object
readonly
Methods defined in this context.
-
#methods_hash ⇒ Object
readonly
Hash of registered methods.
-
#name ⇒ Object
readonly
Name of this class excluding namespace.
-
#params ⇒ Object
Params to be used in the next MethodAttr parsed under this context.
-
#requires ⇒ Object
readonly
Files this context requires.
-
#temporary_section ⇒ Object
Use this section for the next method, attribute or constant added.
-
#unmatched_alias_lists ⇒ Object
Hash old_name => [aliases], for aliases that haven't (yet) been resolved to a method/attribute.
Attributes inherited from CodeObject
#comment, #document_children, #document_self, #done_documenting, #file, #force_documentation, #line, #metadata, #mixin_from, #parent, #received_nodoc, #section, #store
Attributes included from Text
Instance Method Summary collapse
-
#<=>(other) ⇒ Object
Contexts are sorted by full_name.
-
#add(klass, name, comment) ⇒ Object
Adds an item of type
klasswith the givennameandcommentto the context. -
#add_alias(an_alias) ⇒ Object
Adds
an_aliasthat is automatically resolved. -
#add_attribute(attribute) ⇒ Object
Adds
attributeif not already there. -
#add_class(class_type, given_name, superclass = '::Object') ⇒ Object
Adds a class named
given_namewithsuperclass. -
#add_class_or_module(mod, self_hash, all_hash) ⇒ Object
Adds the class or module
modto the modules or classes Hashself_hash, and toall_hash(either TopLevel::modules_hash or TopLevel::classes_hash), unless #done_documenting istrue. -
#add_constant(constant) ⇒ Object
Adds
constantif not already there. -
#add_extend(ext) ⇒ Object
Adds extension module
extwhich should be an RDoc::Extend. -
#add_include(include) ⇒ Object
Adds included module
includewhich should be an RDoc::Include. -
#add_method(method) ⇒ Object
Adds
methodif not already there. -
#add_module(class_type, name) ⇒ Object
Adds a module named
name. -
#add_module_alias(from, to, file) ⇒ Object
Adds an alias from
from(a class or module) to the constanttowhich was defined infile. -
#add_module_by_normal_module(mod) ⇒ Object
Adds a module by
RDoc::NormalModuleinstance. -
#add_require(require) ⇒ Object
Adds
requireto this context's top level. -
#add_section(title, comment = nil) ⇒ Object
Returns a section with
title, creating it if it doesn't already exist. -
#add_to(array, thing) ⇒ Object
Adds
thingto the collectionarray. -
#any_content(includes = true) ⇒ Object
Is there any content?.
-
#child_name(name) ⇒ Object
Creates the full name for a child with
name. -
#class_method_list ⇒ Object
Class methods.
-
#classes ⇒ Object
Array of classes in this context.
-
#classes_and_modules ⇒ Object
All classes and modules in this namespace.
-
#classes_hash ⇒ Object
Hash of classes keyed by class name.
-
#display(method_attr) ⇒ Object
:nodoc:.
-
#each_ancestor(&_) ⇒ Object
Iterator for ancestors for duck-typing.
-
#each_classmodule(&block) ⇒ Object
Iterator for classes and modules.
-
#each_method ⇒ Object
Iterator for methods.
-
#each_section ⇒ Object
Iterator for each section's contents sorted by title.
-
#find_attribute(name, singleton) ⇒ Object
Finds an attribute
namewith singleton valuesingleton. -
#find_attribute_named(name) ⇒ Object
Finds an attribute with
namein this context. -
#find_class_method_named(name) ⇒ Object
Finds a class method with
namein this context. -
#find_constant_named(name) ⇒ Object
Finds a constant with
namein this context. -
#find_enclosing_module_named(name) ⇒ Object
Tries to find a module at a higher scope.
-
#find_external_alias(name, singleton) ⇒ Object
Finds an external alias
namewith singleton valuesingleton. -
#find_external_alias_named(name) ⇒ Object
Finds an external alias with
namein this context. -
#find_instance_method_named(name) ⇒ Object
Finds an instance method with
namein this context. -
#find_local_symbol(symbol) ⇒ Object
Finds a method, constant, attribute, external alias, module or file named
symbolin this context. -
#find_method(name, singleton) ⇒ Object
Finds a method named
namewith singleton valuesingleton. -
#find_method_named(name) ⇒ Object
Finds a instance or module method with
namein this context. -
#find_module_named(name) ⇒ Object
Find a module with
nametrying to using ruby's scoping rules. -
#find_or_create_constant_owner_for_path(constant_path) ⇒ Object
Returns the owner context and local name for
constant_path, creating missing namespace modules. -
#find_or_create_namespace_path(path) ⇒ Object
Finds or creates the module namespace path under this context.
-
#find_symbol(symbol) ⇒ Object
Look up
symbol, first as a module, then as a local symbol. -
#find_symbol_module(symbol) ⇒ Object
Look up a module named
symbol. -
#full_name ⇒ Object
The full name for this context.
-
#fully_documented? ⇒ Boolean
Does this context and its methods and constants all have documentation?.
-
#get_module_named(name) ⇒ Object
Get a module named
namein this context Don't look up for higher module nesting scopes. -
#http_url ⇒ Object
URL for this with a
prefix. -
#initialize ⇒ Context
constructor
Creates an unnamed empty context.
-
#initialize_methods_etc ⇒ Object
Sets the defaults for methods and so-forth.
-
#instance_methods ⇒ Object
Instance methods.
-
#methods_by_type(section = nil) ⇒ Object
Breaks method_list into a nested hash by type ('class' or 'instance') and visibility (+:public+,
:protected,:private). -
#methods_matching(methods, singleton = false, &block) ⇒ Object
Yields AnyMethod and Attr entries matching the list of names in
methods. -
#modules ⇒ Object
Array of modules in this context.
-
#modules_hash ⇒ Object
Hash of modules keyed by module name.
-
#name_for_path ⇒ Object
Name to use to generate the url.
-
#record_location(top_level) ⇒ Object
Record
top_levelas a fileselfis in. -
#remove_from_documentation? ⇒ Boolean
Should we remove this context from the documentation?.
-
#remove_invisible(min_visibility) ⇒ Object
Removes methods and attributes with a visibility less than
min_visibility. -
#remove_invisible_in(array, min_visibility) ⇒ Object
Only called when min_visibility == :public or :private.
-
#resolve_aliases(added) ⇒ Object
Tries to resolve unmatched aliases when a method or attribute has just been added.
-
#section_contents ⇒ Object
Returns RDoc::Context::Section objects referenced in this context for use in a table of contents.
-
#sections ⇒ Object
Sections in this context.
-
#sections_hash ⇒ Object
:nodoc:.
-
#set_constant_visibility_for(names, visibility) ⇒ Object
Given an array
namesof constants, set the visibility of each constant tovisibility. -
#set_current_section(title, comment) ⇒ Object
Sets the current section to a section with
title. -
#set_visibility_for(methods, visibility, singleton = false) ⇒ Object
Given an array
methodsof method names, set the visibility of each tovisibility. -
#sort_sections ⇒ Object
Sorts sections alphabetically (default) or in TomDoc fashion (none, Public, Internal, Deprecated).
-
#to_s ⇒ Object
:nodoc:.
-
#top_level ⇒ Object
Return the TopLevel that owns us -- FIXME we can be 'owned' by several TopLevel (see #record_location & #in_files).
-
#upgrade_to_class(mod, class_type, enclosing) ⇒ Object
Upgrades NormalModule
modinenclosingto aclass_type.
Methods inherited from CodeObject
#display?, #documented?, #file_name, #full_name=, #ignore, #ignored?, #initialize_visibility, #options, #parent_name, #start_doc, #stop_doc, #suppress, #suppressed?
Methods included from Generator::Markup
#aref_to, #as_href, #canonical_url, #cvs_url, #description, #formatter
Methods included from Text
decode_legacy_label, expand_tabs, #flush_left, #markup, #normalize_comment, #parse, #snippet, #strip_hashes, #strip_newlines, #strip_stars, to_anchor, #wrap
Constructor Details
#initialize ⇒ Context
Creates an unnamed empty context
114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 |
# File 'lib/rdoc/code_object/context.rb', line 114 def initialize super @in_files = [] @name ||= "unknown" @parent = nil @current_section = Section.new self, nil, nil @sections = { nil => @current_section } @temporary_section = nil @classes = {} @modules = {} initialize_methods_etc end |
Instance Attribute Details
#aliases ⇒ Object (readonly)
Class/module aliases
26 27 28 |
# File 'lib/rdoc/code_object/context.rb', line 26 def aliases @aliases end |
#attributes ⇒ Object (readonly)
All attr* methods
31 32 33 |
# File 'lib/rdoc/code_object/context.rb', line 31 def attributes @attributes end |
#block_params ⇒ Object
Block params to be used in the next MethodAttr parsed under this context
36 37 38 |
# File 'lib/rdoc/code_object/context.rb', line 36 def block_params @block_params end |
#constants ⇒ Object (readonly)
Constants defined
41 42 43 |
# File 'lib/rdoc/code_object/context.rb', line 41 def constants @constants end |
#constants_hash ⇒ Object (readonly)
Hash of registered constants.
109 110 111 |
# File 'lib/rdoc/code_object/context.rb', line 109 def constants_hash @constants_hash end |
#current_section ⇒ Object
The current documentation section that new items will be added to. If temporary_section is available it will be used.
675 676 677 678 679 680 681 682 683 |
# File 'lib/rdoc/code_object/context.rb', line 675 def current_section if section = @temporary_section @temporary_section = nil else section = @current_section end section end |
#extends ⇒ Object (readonly)
Modules this context is extended with
61 62 63 |
# File 'lib/rdoc/code_object/context.rb', line 61 def extends @extends end |
#external_aliases ⇒ Object (readonly)
Aliases that could not be resolved.
93 94 95 |
# File 'lib/rdoc/code_object/context.rb', line 93 def external_aliases @external_aliases end |
#in_files ⇒ Object (readonly)
Files this context is found in
51 52 53 |
# File 'lib/rdoc/code_object/context.rb', line 51 def in_files @in_files end |
#includes ⇒ Object (readonly)
Modules this context includes
56 57 58 |
# File 'lib/rdoc/code_object/context.rb', line 56 def includes @includes end |
#method_list ⇒ Object (readonly)
Methods defined in this context
66 67 68 |
# File 'lib/rdoc/code_object/context.rb', line 66 def method_list @method_list end |
#methods_hash ⇒ Object (readonly)
Hash of registered methods. Attributes are also registered here, twice if they are RW.
99 100 101 |
# File 'lib/rdoc/code_object/context.rb', line 99 def methods_hash @methods_hash end |
#name ⇒ Object (readonly)
Name of this class excluding namespace. See also full_name
71 72 73 |
# File 'lib/rdoc/code_object/context.rb', line 71 def name @name end |
#params ⇒ Object
Params to be used in the next MethodAttr parsed under this context
104 105 106 |
# File 'lib/rdoc/code_object/context.rb', line 104 def params @params end |
#requires ⇒ Object (readonly)
Files this context requires
76 77 78 |
# File 'lib/rdoc/code_object/context.rb', line 76 def requires @requires end |
#temporary_section ⇒ Object
Use this section for the next method, attribute or constant added.
81 82 83 |
# File 'lib/rdoc/code_object/context.rb', line 81 def temporary_section @temporary_section end |
#unmatched_alias_lists ⇒ Object
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.)
88 89 90 |
# File 'lib/rdoc/code_object/context.rb', line 88 def unmatched_alias_lists @unmatched_alias_lists end |
Instance Method Details
#<=>(other) ⇒ Object
Contexts are sorted by full_name
158 159 160 161 162 |
# File 'lib/rdoc/code_object/context.rb', line 158 def <=>(other) return nil unless CodeObject === other full_name <=> other.full_name end |
#add(klass, name, comment) ⇒ Object
Adds an item of type klass with the given name and comment to the
context.
Currently only RDoc::Extend and RDoc::Include are supported.
170 171 172 173 174 175 176 177 178 179 180 |
# File 'lib/rdoc/code_object/context.rb', line 170 def add(klass, name, comment) if Extend == klass ext = Extend.new name, comment add_extend ext elsif Include == klass incl = Include.new name, comment add_include incl else raise NotImplementedError, "adding a #{klass} is not implemented" end end |
#add_alias(an_alias) ⇒ Object
Adds an_alias that is automatically resolved
185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 |
# File 'lib/rdoc/code_object/context.rb', line 185 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 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) ⇒ Object
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.
212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 |
# File 'lib/rdoc/code_object/context.rb', line 212 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' key = attribute.pretty_name known = @methods_hash[key] if known known.comment = attribute.comment if known.comment.empty? elsif registered = @methods_hash[attribute.pretty_name + '='] and Attr === registered registered.rw = 'RW' else @methods_hash[key] = attribute register = true end end if attribute.rw.index 'W' key = attribute.pretty_name + '=' known = @methods_hash[key] if known known.comment = attribute.comment if known.comment.empty? elsif registered = @methods_hash[attribute.pretty_name] and Attr === registered registered.rw = 'RW' else @methods_hash[key] = attribute register = true end end if register add_to @attributes, attribute resolve_aliases attribute end attribute end |
#add_class(class_type, given_name, superclass = '::Object') ⇒ 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.
274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 |
# File 'lib/rdoc/code_object/context.rb', line 274 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+)$/ full_name = $1 enclosing = top_level name = full_name.split(/:+/).last else full_name = child_name given_name if full_name =~ /^(.+)::(\w+)$/ 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 # 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) enclosing = find_or_create_namespace_path ename end else name = full_name enclosing = self end end # fix up superclass if full_name == 'BasicObject' superclass = nil elsif full_name == 'Object' superclass = '::BasicObject' end # find the superclass full name if superclass if superclass =~ /^:+/ superclass = $' #' else if superclass =~ /^(\w+):+(.+)$/ 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, NormalClass, mod.parent if mod # e.g., Object < Object superclass = nil if superclass == full_name end klass = @store.classes_hash[full_name] if klass # if TopLevel, it may not be registered in the classes: enclosing.classes_hash[name] = klass # update the superclass if needed if superclass existing = klass.superclass existing = existing.full_name unless existing.is_a?(String) if existing if existing.nil? || (existing == 'Object' && superclass != 'Object') klass.superclass = superclass end end else # this is a new class mod = @store.modules_hash.delete full_name if mod klass = upgrade_to_class mod, 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) ⇒ Object
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.
384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 |
# File 'lib/rdoc/code_object/context.rb', line 384 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 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) ⇒ Object
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.
405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 |
# File 'lib/rdoc/code_object/context.rb', line 405 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 known.comment = constant.comment if known.comment.empty? known.value = constant.value if known.value.nil? or known.value.strip.empty? constant.parent = self known.is_alias_for ||= constant.is_alias_for else @constants_hash[constant.name] = constant add_to @constants, constant end constant end |
#add_extend(ext) ⇒ Object
Adds extension module ext which should be an RDoc::Extend
440 441 442 443 444 |
# File 'lib/rdoc/code_object/context.rb', line 440 def add_extend(ext) add_to @extends, ext ext end |
#add_include(include) ⇒ Object
Adds included module include which should be an RDoc::Include
431 432 433 434 435 |
# File 'lib/rdoc/code_object/context.rb', line 431 def add_include(include) add_to @includes, include include end |
#add_method(method) ⇒ Object
Adds method if not already there. If it is (as method or attribute),
updates the comment if it was empty.
450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 |
# File 'lib/rdoc/code_object/context.rb', line 450 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 if @store # otherwise we are loading known.comment = method.comment if known.comment.empty? previously = ", previously in #{known.file}" unless method.file == known.file @store..warn \ "Duplicate method #{known.full_name} in #{method.file}#{previously}" end else @methods_hash[key] = method add_to @method_list, method resolve_aliases method end method end |
#add_module(class_type, name) ⇒ Object
Adds a module named name. If RDoc already knows name is a class then
that class is returned instead. See also #add_class.
506 507 508 509 510 511 512 513 514 515 516 517 518 519 |
# File 'lib/rdoc/code_object/context.rb', line 506 def add_module(class_type, name) if name.to_s.include?('::') owner, name = find_or_create_constant_owner_for_path name return owner.add_module class_type, name unless owner == self end 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, to, file) ⇒ Object
Adds an alias from from (a class or module) to the constant to which
was defined in file.
532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 |
# File 'lib/rdoc/code_object/context.rb', line 532 def add_module_alias(from, 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 new_to = from.dup new_to.name = to.name new_to.full_name = nil new_to.is_alias_for = from if new_to.module? @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 = 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) ⇒ Object
Adds a module by RDoc::NormalModule instance. See also #add_module.
524 525 526 |
# File 'lib/rdoc/code_object/context.rb', line 524 def add_module_by_normal_module(mod) add_class_or_module mod, @modules, @store.modules_hash end |
#add_require(require) ⇒ Object
Adds require to this context's top level
569 570 571 572 573 574 575 576 577 |
# File 'lib/rdoc/code_object/context.rb', line 569 def add_require(require) return require unless @document_self if TopLevel === self add_to @requires, require else parent.add_require require end end |
#add_section(title, comment = nil) ⇒ Object
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
587 588 589 590 591 592 593 594 595 596 |
# File 'lib/rdoc/code_object/context.rb', line 587 def add_section(title, comment = nil) if section = @sections[title] section.add_comment comment if comment else section = Section.new self, title, comment, @store @sections[title] = section end section end |
#add_to(array, thing) ⇒ Object
Adds thing to the collection array
601 602 603 604 605 606 607 |
# File 'lib/rdoc/code_object/context.rb', line 601 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) ⇒ Object
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.
617 618 619 620 621 622 623 624 625 626 627 628 |
# File 'lib/rdoc/code_object/context.rb', line 617 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) ⇒ Object
Creates the full name for a child with name
633 634 635 636 637 638 639 640 641 |
# File 'lib/rdoc/code_object/context.rb', line 633 def child_name(name) if name =~ /^:+/ $' #' elsif TopLevel === self name else "#{self.full_name}::#{name}" end end |
#class_method_list ⇒ Object
Class methods
646 647 648 |
# File 'lib/rdoc/code_object/context.rb', line 646 def class_method_list method_list.select { |a| a.singleton } end |
#classes ⇒ Object
Array of classes in this context
653 654 655 |
# File 'lib/rdoc/code_object/context.rb', line 653 def classes @classes.values end |
#classes_and_modules ⇒ Object
All classes and modules in this namespace
660 661 662 |
# File 'lib/rdoc/code_object/context.rb', line 660 def classes_and_modules classes + modules end |
#classes_hash ⇒ Object
Hash of classes keyed by class name
667 668 669 |
# File 'lib/rdoc/code_object/context.rb', line 667 def classes_hash @classes end |
#display(method_attr) ⇒ Object
:nodoc:
685 686 687 688 689 690 691 |
# File 'lib/rdoc/code_object/context.rb', line 685 def display(method_attr) # :nodoc: if method_attr.is_a? Attr "#{method_attr.definition} #{method_attr.pretty_name}" else "method #{method_attr.pretty_name}" end end |
#each_ancestor(&_) ⇒ Object
Iterator for ancestors for duck-typing. Does nothing. See RDoc::ClassModule#each_ancestor.
This method exists to make it easy to work with Context subclasses that aren't part of RDoc.
700 701 |
# File 'lib/rdoc/code_object/context.rb', line 700 def each_ancestor(&_) # :nodoc: end |
#each_classmodule(&block) ⇒ Object
Iterator for classes and modules
706 707 708 |
# File 'lib/rdoc/code_object/context.rb', line 706 def each_classmodule(&block) # :yields: module classes_and_modules.sort.each(&block) end |
#each_method ⇒ Object
Iterator for methods
713 714 715 716 717 |
# File 'lib/rdoc/code_object/context.rb', line 713 def each_method # :yields: method return enum_for __method__ unless block_given? @method_list.sort.each { |m| yield m } end |
#each_section ⇒ Object
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
729 730 731 732 733 734 735 736 737 738 739 740 741 |
# File 'lib/rdoc/code_object/context.rb', line 729 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) ⇒ Object
Finds an attribute name with singleton value singleton.
746 747 748 749 |
# File 'lib/rdoc/code_object/context.rb', line 746 def find_attribute(name, singleton) name = $1 if name =~ /^(.*)=$/ @attributes.find { |a| a.name == name && a.singleton == singleton } end |
#find_attribute_named(name) ⇒ Object
Finds an attribute with name in this context
754 755 756 757 758 759 760 761 762 763 |
# File 'lib/rdoc/code_object/context.rb', line 754 def find_attribute_named(name) case name when /\A#/ find_attribute name[1..-1], false when /\A::/ find_attribute name[2..-1], true else @attributes.find { |a| a.name == name } end end |
#find_class_method_named(name) ⇒ Object
Finds a class method with name in this context
768 769 770 |
# File 'lib/rdoc/code_object/context.rb', line 768 def find_class_method_named(name) @method_list.find { |meth| meth.singleton && meth.name == name } end |
#find_constant_named(name) ⇒ Object
Finds a constant with name in this context
775 776 777 778 779 |
# File 'lib/rdoc/code_object/context.rb', line 775 def find_constant_named(name) @constants.find do |m| m.name == name || m.full_name == name end end |
#find_enclosing_module_named(name) ⇒ Object
Tries to find a module at a higher scope. But parent is not always a higher module nesting scope, so the result is not correct. Parent chain can only represent last-opened nesting, and may be broken in some cases. The Ruby parser does not represent module nesting with the parent chain.
787 788 789 |
# File 'lib/rdoc/code_object/context.rb', line 787 def find_enclosing_module_named(name) parent && parent.find_module_named(name) end |
#find_external_alias(name, singleton) ⇒ Object
Finds an external alias name with singleton value singleton.
794 795 796 |
# File 'lib/rdoc/code_object/context.rb', line 794 def find_external_alias(name, singleton) @external_aliases.find { |m| m.name == name && m.singleton == singleton } end |
#find_external_alias_named(name) ⇒ Object
Finds an external alias with name in this context
801 802 803 804 805 806 807 808 809 810 |
# File 'lib/rdoc/code_object/context.rb', line 801 def find_external_alias_named(name) case name when /\A#/ find_external_alias name[1..-1], false when /\A::/ find_external_alias name[2..-1], true else @external_aliases.find { |a| a.name == name } end end |
#find_instance_method_named(name) ⇒ Object
Finds an instance method with name in this context
815 816 817 |
# File 'lib/rdoc/code_object/context.rb', line 815 def find_instance_method_named(name) @method_list.find { |meth| !meth.singleton && meth.name == name } end |
#find_local_symbol(symbol) ⇒ Object
Finds a method, constant, attribute, external alias, module or file
named symbol in this context.
823 824 825 826 827 828 829 830 |
# File 'lib/rdoc/code_object/context.rb', line 823 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 @store.find_file_named(symbol) end |
#find_method(name, singleton) ⇒ Object
Finds a method named name with singleton value singleton.
835 836 837 838 839 840 841 842 843 |
# File 'lib/rdoc/code_object/context.rb', line 835 def find_method(name, singleton) @method_list.find { |m| if m.singleton m.name == name && m.singleton == singleton else m.name == name && !m.singleton && !singleton end } end |
#find_method_named(name) ⇒ Object
Finds a instance or module method with name in this context
848 849 850 851 852 853 854 855 856 857 |
# File 'lib/rdoc/code_object/context.rb', line 848 def find_method_named(name) case name when /\A#/ find_method name[1..-1], false when /\A::/ find_method name[2..-1], true else @method_list.find { |meth| meth.name == name } end end |
#find_module_named(name) ⇒ Object
Find a module with name trying to using ruby's scoping rules.
find_enclosing_module_named cannot use ruby's scoping so the result is not correct.
863 864 865 866 867 868 |
# File 'lib/rdoc/code_object/context.rb', line 863 def find_module_named(name) res = get_module_named(name) return res if res return self if self.name == name find_enclosing_module_named name end |
#find_or_create_constant_owner_for_path(constant_path) ⇒ Object
Returns the owner context and local name for constant_path, creating
missing namespace modules. A leading :: resolves from the top-level.
This only resolves explicit context-tree paths; RDoc::Parser::Ruby has
parser-local lexical helpers for Ruby's nesting-dependent lookup.
480 481 482 483 484 485 486 487 488 489 |
# File 'lib/rdoc/code_object/context.rb', line 480 def find_or_create_constant_owner_for_path(constant_path) # :nodoc: constant_path = constant_path.to_s owner = constant_path.start_with?('::') ? top_level : self constant_path = constant_path.delete_prefix('::') owner_path, separator, name = constant_path.rpartition('::') owner = owner.find_or_create_namespace_path owner_path unless separator.empty? [owner, name] end |
#find_or_create_namespace_path(path) ⇒ Object
Finds or creates the module namespace path under this context.
494 495 496 497 498 499 500 |
# File 'lib/rdoc/code_object/context.rb', line 494 def find_or_create_namespace_path(path) # :nodoc: path.to_s.split('::').inject(self) do |owner, name| owner.classes_hash[name] || owner.modules_hash[name] || owner.add_module(NormalModule, name) end end |
#find_symbol(symbol) ⇒ Object
Look up symbol, first as a module, then as a local symbol.
880 881 882 |
# File 'lib/rdoc/code_object/context.rb', line 880 def find_symbol(symbol) find_symbol_module(symbol) || find_local_symbol(symbol) end |
#find_symbol_module(symbol) ⇒ Object
Look up a module named symbol.
887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 |
# File 'lib/rdoc/code_object/context.rb', line 887 def find_symbol_module(symbol) result = nil # look for a class or module 'symbol' case symbol when /^::/ 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?(TopLevel) searched = searched.parent end else searched = self while searched do result = searched.find_module_named(symbol) break if result || searched.is_a?(TopLevel) searched = searched.parent end end result end |
#full_name ⇒ Object
The full name for this context. This method is overridden by subclasses.
920 921 922 |
# File 'lib/rdoc/code_object/context.rb', line 920 def full_name '(unknown)' end |
#fully_documented? ⇒ Boolean
Does this context and its methods and constants all have documentation?
(Yes, fully documented doesn't mean everything.)
929 930 931 932 933 934 |
# File 'lib/rdoc/code_object/context.rb', line 929 def fully_documented? documented? and attributes.all? { |a| a.documented? } and method_list.all? { |m| m.documented? } and constants.all? { |c| c.documented? } end |
#get_module_named(name) ⇒ Object
Get a module named name in this context
Don't look up for higher module nesting scopes. RDoc::Context doesn't have that information.
873 874 875 |
# File 'lib/rdoc/code_object/context.rb', line 873 def get_module_named(name) @modules[name] || @classes[name] end |
#http_url ⇒ Object
URL for this with a prefix
939 940 941 942 943 944 945 |
# File 'lib/rdoc/code_object/context.rb', line 939 def http_url path = name_for_path path = path.gsub(/<<\s*(\w*)/, 'from-\1') if path =~ /<</ path = path.split('::') File.join(*path.compact) + '.html' end |
#initialize_methods_etc ⇒ Object
Sets the defaults for methods and so-forth
134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 |
# File 'lib/rdoc/code_object/context.rb', line 134 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_methods ⇒ Object
Instance methods
950 951 952 |
# File 'lib/rdoc/code_object/context.rb', line 950 def instance_methods method_list.reject { |a| a.singleton } end |
#methods_by_type(section = nil) ⇒ Object
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.
961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 |
# File 'lib/rdoc/code_object/context.rb', line 961 def methods_by_type(section = nil) methods = {} TYPES.each do |type| visibilities = {} 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) ⇒ Object
Yields AnyMethod and Attr entries matching the list of names in methods.
984 985 986 987 988 989 990 991 992 |
# File 'lib/rdoc/code_object/context.rb', line 984 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 ⇒ Object
Array of modules in this context
997 998 999 |
# File 'lib/rdoc/code_object/context.rb', line 997 def modules @modules.values end |
#modules_hash ⇒ Object
Hash of modules keyed by module name
1004 1005 1006 |
# File 'lib/rdoc/code_object/context.rb', line 1004 def modules_hash @modules end |
#name_for_path ⇒ Object
Name to use to generate the url. #full_name by default.
1012 1013 1014 |
# File 'lib/rdoc/code_object/context.rb', line 1012 def name_for_path full_name end |
#record_location(top_level) ⇒ Object
Record top_level as a file self is in.
1019 1020 1021 |
# File 'lib/rdoc/code_object/context.rb', line 1019 def record_location(top_level) @in_files << top_level unless @in_files.include?(top_level) end |
#remove_from_documentation? ⇒ Boolean
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
1033 1034 1035 1036 1037 1038 1039 1040 1041 |
# File 'lib/rdoc/code_object/context.rb', line 1033 def remove_from_documentation? # Contexts that are still ignored here were created inside a :stopdoc: # region and never received documentable contents afterwards @remove_from_documentation ||= (@received_nodoc || @ignored) && !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) ⇒ Object
Removes methods and attributes with a visibility less than min_visibility.
TODO mark the visibility of attributes in the template (if not public?)
1048 1049 1050 1051 1052 1053 |
# File 'lib/rdoc/code_object/context.rb', line 1048 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 |
#remove_invisible_in(array, min_visibility) ⇒ Object
Only called when min_visibility == :public or :private
1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 |
# File 'lib/rdoc/code_object/context.rb', line 1058 def remove_invisible_in(array, min_visibility) # :nodoc: if min_visibility == :public array.reject! { |e| e.visibility != :public and not e.force_documentation } else array.reject! { |e| e.visibility == :private and not e.force_documentation } end end |
#resolve_aliases(added) ⇒ Object
Tries to resolve unmatched aliases when a method or attribute has just been added.
1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 |
# File 'lib/rdoc/code_object/context.rb', line 1074 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 ⇒ Object
Returns RDoc::Context::Section objects referenced in this context for use in a table of contents.
1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 |
# File 'lib/rdoc/code_object/context.rb', line 1090 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 ⇒ Object
Sections in this context
1114 1115 1116 |
# File 'lib/rdoc/code_object/context.rb', line 1114 def sections @sections.values end |
#sections_hash ⇒ Object
:nodoc:
1118 1119 1120 |
# File 'lib/rdoc/code_object/context.rb', line 1118 def sections_hash # :nodoc: @sections end |
#set_constant_visibility_for(names, visibility) ⇒ Object
Given an array names of constants, set the visibility of each constant to
visibility
1143 1144 1145 1146 1147 1148 |
# File 'lib/rdoc/code_object/context.rb', line 1143 def set_constant_visibility_for(names, visibility) names.each do |name| constant = @constants_hash[name] or next constant.visibility = visibility end end |
#set_current_section(title, comment) ⇒ Object
Sets the current section to a section with title. See also #add_section
1125 1126 1127 |
# File 'lib/rdoc/code_object/context.rb', line 1125 def set_current_section(title, comment) @current_section = add_section title, comment end |
#set_visibility_for(methods, visibility, singleton = false) ⇒ Object
Given an array methods of method names, set the visibility of each to
visibility
1133 1134 1135 1136 1137 |
# File 'lib/rdoc/code_object/context.rb', line 1133 def set_visibility_for(methods, visibility, singleton = false) methods_matching methods, singleton do |m| m.visibility = visibility end end |
#sort_sections ⇒ Object
Sorts sections alphabetically (default) or in TomDoc fashion (none, Public, Internal, Deprecated)
1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 |
# File 'lib/rdoc/code_object/context.rb', line 1154 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 } @sections.values_at(*TOMDOC_TITLES).compact else @sections.sort_by { |title, _| title.to_s }.map { |_, section| section } end end |
#to_s ⇒ Object
:nodoc:
1170 1171 1172 |
# File 'lib/rdoc/code_object/context.rb', line 1170 def to_s # :nodoc: "#{self.class.name} #{self.full_name}" end |
#top_level ⇒ Object
Return the TopLevel that owns us
FIXME we can be 'owned' by several TopLevel (see #record_location & #in_files)
1180 1181 1182 1183 1184 1185 |
# File 'lib/rdoc/code_object/context.rb', line 1180 def top_level return @top_level if defined? @top_level @top_level = self @top_level = @top_level.parent until TopLevel === @top_level @top_level end |
#upgrade_to_class(mod, class_type, enclosing) ⇒ Object
Upgrades NormalModule mod in enclosing to a class_type
1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 |
# File 'lib/rdoc/code_object/context.rb', line 1190 def upgrade_to_class(mod, class_type, enclosing) enclosing.modules_hash.delete mod.name klass = 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 |