ruby--ruby/lib/rdoc/top_level.rb

249 lines
4.3 KiB
Ruby

require 'rdoc/context'
##
# A TopLevel context is a representation of the contents of a single file
class RDoc::TopLevel < RDoc::Context
##
# This TopLevel's File::Stat struct
attr_accessor :file_stat
##
# Relative name of this file
attr_accessor :relative_name
##
# Absolute name of this file
attr_accessor :absolute_name
attr_accessor :diagram
##
# The parser that processed this file
attr_accessor :parser
##
# Returns all classes and modules discovered by RDoc
def self.all_classes_and_modules
classes_hash.values + modules_hash.values
end
##
# Returns all classes discovered by RDoc
def self.classes
classes_hash.values
end
##
# Hash of all classes known to RDoc
def self.classes_hash
@all_classes
end
##
# All TopLevels known to RDoc
def self.files
@all_files.values
end
##
# Hash of all files known to RDoc
def self.files_hash
@all_files
end
##
# Finds the class with +name+ in all discovered classes
def self.find_class_named(name)
classes_hash[name]
end
##
# Finds the class with +name+ starting in namespace +from+
def self.find_class_named_from name, from
from = find_class_named from unless RDoc::Context === from
until RDoc::TopLevel === from do
return nil unless from
klass = from.find_class_named name
return klass if klass
from = from.parent
end
find_class_named name
end
##
# Finds the class or module with +name+
def self.find_class_or_module(name)
name =~ /^::/
name = $' || name
RDoc::TopLevel.classes_hash[name] || RDoc::TopLevel.modules_hash[name]
end
##
# Finds the file with +name+ in all discovered files
def self.find_file_named(name)
@all_files[name]
end
##
# Finds the module with +name+ in all discovered modules
def self.find_module_named(name)
modules_hash[name]
end
##
# Returns all modules discovered by RDoc
def self.modules
modules_hash.values
end
##
# Hash of all modules known to RDoc
def self.modules_hash
@all_modules
end
##
# Empties RDoc of stored class, module and file information
def self.reset
@all_classes = {}
@all_modules = {}
@all_files = {}
end
reset
##
# Creates a new TopLevel for +file_name+
def initialize(file_name)
super()
@name = nil
@relative_name = file_name
@absolute_name = file_name
@file_stat = File.stat(file_name) rescue nil # HACK for testing
@diagram = nil
@parser = nil
RDoc::TopLevel.files_hash[file_name] = self
end
##
# Adds +method+ to Object instead of RDoc::TopLevel
def add_method(method)
object = self.class.find_class_named 'Object'
object = add_class RDoc::NormalClass, 'Object' unless object
object.add_method method
end
##
# Base name of this file
def base_name
File.basename @absolute_name
end
##
# See RDoc::TopLevel.find_class_or_module
def find_class_or_module name
RDoc::TopLevel.find_class_or_module name
end
##
# Finds a class or module named +symbol+
def find_local_symbol(symbol)
find_class_or_module(symbol) || super
end
##
# Finds a module or class with +name+
def find_module_named(name)
find_class_or_module(name) || find_enclosing_module_named(name)
end
##
# The name of this file
def full_name
@relative_name
end
##
# URL for this with a +prefix+
def http_url(prefix)
path = [prefix, @relative_name.tr('.', '_')]
File.join(*path.compact) + '.html'
end
def inspect # :nodoc:
"#<%s:0x%x %p modules: %p classes: %p>" % [
self.class, object_id,
base_name,
@modules.map { |n,m| m },
@classes.map { |n,c| c }
]
end
##
# Date this file was last modified, if known
def last_modified
@file_stat ? file_stat.mtime.to_s : 'Unknown'
end
##
# Base name of this file
alias name base_name
##
# Path to this file
def path
http_url RDoc::RDoc.current.generator.file_dir
end
def pretty_print q # :nodoc:
q.group 2, "[#{self.class}: ", "]" do
q.text "base name: #{base_name.inspect}"
q.breakable
items = @modules.map { |n,m| m }
items.push(*@modules.map { |n,c| c })
q.seplist items do |mod| q.pp mod end
end
end
end