method
resolve
v1_9_3_392 -
Show latest stable
- Class:
RDoc::CrossReference
resolve(name, text)public
Returns a reference to name.
If the reference is found and name is not documented text will be returned. If name is escaped name is returned. If name is not found text is returned.
# File lib/rdoc/cross_reference.rb, line 107
def resolve name, text
return @seen[name] if @seen.include? name
# Find class, module, or method in class or module.
#
# Do not, however, use an if/elsif/else chain to do so. Instead, test
# each possible pattern until one matches. The reason for this is that a
# string like "YAML.txt" could be the txt() class method of class YAML (in
# which case it would match the first pattern, which splits the string
# into container and method components and looks up both) or a filename
# (in which case it would match the last pattern, which just checks
# whether the string as a whole is a known symbol).
if /#{CLASS_REGEXP_STR}([.#]|::)#{METHOD_REGEXP_STR}/ =~ name then
type = $2
type = '' if type == '.' # will find either #method or ::method
method = "#{type}#{$3}"
container = @context.find_symbol_module($1)
elsif /^([.#]|::)#{METHOD_REGEXP_STR}/ =~ name then
type = $1
type = '' if type == '.'
method = "#{type}#{$2}"
container = @context
else
container = nil
end
if container then
ref = container.find_local_symbol method
unless ref || RDoc::TopLevel === container then
ref = container.find_ancestor_local_symbol method
end
end
ref = case name
when /^\\(#{CLASS_REGEXP_STR})$/ then
ref = @context.find_symbol $1
else
ref = @context.find_symbol name
end unless ref
ref = nil if RDoc::Alias === ref # external alias: can't link to it
out = if name == '\' then
name
elsif name =~ /^\\/ then
# we remove the \ only in front of what we know:
# other backslashes are treated later, only outside of <tt>
ref ? $' : name
elsif ref then
if ref.display? then
ref
else
text
end
else
text
end
@seen[name] = out
out
end