A Context is something that can hold modules, classes, methods, attributes, aliases, requires, and includes. Classes, modules, and files are all Contexts.
# File rdoc/code_objects.rb, line 163 def initialize super() @in_files = [] @name ||= "unknown" @comment ||= "" @parent = nil @visibility = :public @current_section = Section.new(nil, nil) @sections = [ @current_section ] initialize_methods_etc initialize_classes_and_modules end
allow us to sort modules by name
# File rdoc/code_objects.rb, line 370 def <=>(other) name <=> other.name end
# File rdoc/code_objects.rb, line 247 def add_alias(an_alias) meth = find_instance_method_named(an_alias.old_name) if meth new_meth = AnyMethod.new(an_alias.text, an_alias.new_name) new_meth.is_alias_for = meth new_meth.singleton = meth.singleton new_meth.params = meth.params new_meth.comment = "Alias for \##{meth.name}" meth.add_alias(new_meth) add_method(new_meth) else add_to(@aliases, an_alias) end end
# File rdoc/code_objects.rb, line 243 def add_attribute(an_attribute) add_to(@attributes, an_attribute) end
# File rdoc/code_objects.rb, line 229 def add_class(class_type, name, superclass) add_class_or_module(@classes, class_type, name, superclass) end
# File rdoc/code_objects.rb, line 279 def add_class_or_module(collection, class_type, name, superclass=nil) cls = collection[name] if cls puts "Reusing class/module #{name}" if $DEBUG else cls = class_type.new(name, superclass) puts "Adding class/module #{name} to #@name" if $DEBUG # collection[name] = cls if @document_self && !@done_documenting collection[name] = cls if !@done_documenting cls.parent = self cls.section = @current_section end cls end
# File rdoc/code_objects.rb, line 266 def add_constant(const) add_to(@constants, const) end
# File rdoc/code_objects.rb, line 262 def add_include(an_include) add_to(@includes, an_include) end
# File rdoc/code_objects.rb, line 237 def add_method(a_method) puts "Adding #@visibility method #{a_method.name} to #@name" if $DEBUG a_method.visibility = @visibility add_to(@method_list, a_method) end
# File rdoc/code_objects.rb, line 233 def add_module(class_type, name) add_class_or_module(@modules, class_type, name, nil) end
Requires always get added to the top-level (file) context
# File rdoc/code_objects.rb, line 271 def add_require(a_require) if self.kind_of? TopLevel add_to(@requires, a_require) else parent.add_require(a_require) end end
# File rdoc/code_objects.rb, line 294 def add_to(array, thing) array << thing if @document_self && !@done_documenting thing.parent = self thing.section = @current_section end
map the class hash to an array externally
# File rdoc/code_objects.rb, line 181 def classes @classes.values end
Return true if at least part of this thing was defined in file
# File rdoc/code_objects.rb, line 225 def defined_in?(file) @in_files.include?(file) end
# File rdoc/code_objects.rb, line 352 def each_attribute @attributes.each {|a| yield a} end
Iterate over all the classes and modules in this object
# File rdoc/code_objects.rb, line 343 def each_classmodule @modules.each_value {|m| yield m} @classes.each_value {|c| yield c} end
# File rdoc/code_objects.rb, line 356 def each_constant @constants.each {|c| yield c} end
# File rdoc/code_objects.rb, line 348 def each_method @method_list.each {|m| yield m} end
find a module at a higher scope
# File rdoc/code_objects.rb, line 336 def find_enclosing_module_named(name) parent && parent.find_module_named(name) end
# File rdoc/code_objects.rb, line 422 def find_local_symbol(symbol) res = find_method_named(symbol) || find_constant_named(symbol) || find_attribute_named(symbol) || find_module_named(symbol) end
Find a named module
# File rdoc/code_objects.rb, line 328 def find_module_named(name) return self if self.name == name res = @modules[name] || @classes[name] return res if res find_enclosing_module_named(name) end
Look up the given symbol. If method is non-nil, then we assume the symbol references a module that contains that method
# File rdoc/code_objects.rb, line 377 def find_symbol(symbol, method=nil) result = nil case symbol when /^::(.*)/ result = toplevel.find_symbol($1) when /::/ modules = symbol.split(/::/) unless modules.empty? module_name = modules.shift result = find_module_named(module_name) if result modules.each do |module_name| result = result.find_module_named(module_name) break unless result end end end else # if a method is specified, then we're definitely looking for # a module, otherwise it could be any symbol if method result = find_module_named(symbol) else result = find_local_symbol(symbol) if result.nil? if symbol =~ /^[A-Z]/ result = parent while result && result.name != symbol result = result.parent end end end end end if result && method if !result.respond_to?(:find_local_symbol) p result.name p method fail end result = result.find_local_symbol(method) end result end
# File rdoc/code_objects.rb, line 322 def initialize_classes_and_modules @classes = {} @modules = {} end
# File rdoc/code_objects.rb, line 308 def initialize_methods_etc @method_list = [] @attributes = [] @aliases = [] @requires = [] @includes = [] @constants = [] end
map the module hash to an array externally
# File rdoc/code_objects.rb, line 186 def modules @modules.values end
Change the default visibility for new methods
# File rdoc/code_objects.rb, line 191 def ongoing_visibility=(vis) @visibility = vis end
Record the file that we happen to find it in
# File rdoc/code_objects.rb, line 220 def record_location(toplevel) @in_files << toplevel unless @in_files.include?(toplevel) end
and remove classes and modules when we see a :nodoc: all
# File rdoc/code_objects.rb, line 318 def remove_classes_and_modules initialize_classes_and_modules end
If a class's documentation is turned off after we've started collecting methods etc., we need to remove the ones we have
# File rdoc/code_objects.rb, line 304 def remove_methods_etc initialize_methods_etc end
Handle sections
# File rdoc/code_objects.rb, line 431 def set_current_section(title, comment) @current_section = Section.new(title, comment) @sections << @current_section end
Given an array methods
of method names, set the visibility of
the corresponding AnyMethod object
# File rdoc/code_objects.rb, line 198 def set_visibility_for(methods, vis, singleton=false) count = 0 @method_list.each do |m| if methods.include?(m.name) && m.singleton == singleton m.visibility = vis count += 1 end end return if count == methods.size || singleton # perhaps we need to look at attributes @attributes.each do |a| if methods.include?(a.name) a.visibility = vis count += 1 end end end