AnyMethod is the base class for objects representing methods
Creates a new AnyMethod with a token stream text and name
# File ruby-3.1.2/lib/rdoc/any_method.rb, line 46
def initialize text, name
super
@c_function = nil
@dont_rename_initialize = false
@token_stream = nil
@calls_super = false
@superclass_method = nil
end
Adds an_alias as an alias for this method in context.
# File ruby-3.1.2/lib/rdoc/any_method.rb, line 59
def add_alias an_alias, context = nil
method = self.class.new an_alias.text, an_alias.new_name
method.record_location an_alias.file
method.singleton = self.singleton
method.params = self.params
method.visibility = self.visibility
method.comment = an_alias.comment
method.is_alias_for = self
@aliases << method
context.add_method method if context
method
end
Prefix for aref is 'method'.
# File ruby-3.1.2/lib/rdoc/any_method.rb, line 76
def aref_prefix
'method'
end
Different ways to call this method
# File ruby-3.1.2/lib/rdoc/any_method.rb, line 96
def call_seq
unless call_seq = _call_seq
call_seq = is_alias_for._call_seq if is_alias_for
end
return unless call_seq
deduplicate_call_seq(call_seq)
end
Sets the different ways you can call this method. If an empty call_seq is given nil is assumed.
See also param_seq
# File ruby-3.1.2/lib/rdoc/any_method.rb, line 112
def call_seq= call_seq
return if call_seq.empty?
@call_seq = call_seq
end
Dumps this AnyMethod for use by ri. See also marshal_load
# File ruby-3.1.2/lib/rdoc/any_method.rb, line 140
def marshal_dump
aliases = @aliases.map do |a|
[a.name, parse(a.comment)]
end
is_alias_for = [
@is_alias_for.parent.full_name,
@is_alias_for.singleton,
@is_alias_for.name
] if @is_alias_for
[ MARSHAL_VERSION,
@name,
full_name,
@singleton,
@visibility,
parse(@comment),
@call_seq,
@block_params,
aliases,
@params,
@file.relative_name,
@calls_super,
@parent.name,
@parent.class,
@section.title,
is_alias_for,
]
end
Loads this AnyMethod from array. For a loaded AnyMethod the following methods will return cached values:
# File ruby-3.1.2/lib/rdoc/any_method.rb, line 177
def marshal_load array
initialize_visibility
@dont_rename_initialize = nil
@token_stream = nil
@aliases = []
@parent = nil
@parent_name = nil
@parent_class = nil
@section = nil
@file = nil
version = array[0]
@name = array[1]
@full_name = array[2]
@singleton = array[3]
@visibility = array[4]
@comment = array[5]
@call_seq = array[6]
@block_params = array[7]
# 8 handled below
@params = array[9]
# 10 handled below
@calls_super = array[11]
@parent_name = array[12]
@parent_title = array[13]
@section_title = array[14]
@is_alias_for = array[15]
array[8].each do |new_name, comment|
add_alias RDoc::Alias.new(nil, @name, new_name, comment, @singleton)
end
@parent_name ||= if @full_name =~ /#/ then
$`
else
name = @full_name.split('::')
name.pop
name.join '::'
end
@file = RDoc::TopLevel.new array[10] if version > 0
end
A list of this method's method and yield parameters. call-seq params are preferred over parsed method and block params.
# File ruby-3.1.2/lib/rdoc/any_method.rb, line 239
def param_list
if @call_seq then
params = @call_seq.split("\n").last
params = params.sub(/.*?\((.*)\)/, '\1')
params = params.sub(/(\{|do)\s*\|([^|]*)\|.*/, ',\2')
elsif @params then
params = @params.sub(/\((.*)\)/, '\1')
params << ",#{@block_params}" if @block_params
elsif @block_params then
params = @block_params
else
return []
end
if @block_params then
# If this method has explicit block parameters, remove any explicit
# &block
params = params.sub(/,?\s*&\w+/, '')
else
params = params.sub(/\&(\w+)/, '\1')
end
params = params.gsub(/\s+/, '').split(',').reject(&:empty?)
params.map { |param| param.sub(/=.*/, '') }
end
Pretty parameter list for this method. If the method's parameters were given by call-seq it is preferred over the parsed values.
# File ruby-3.1.2/lib/rdoc/any_method.rb, line 271
def param_seq
if @call_seq then
params = @call_seq.split("\n").last
params = params.sub(/[^( ]+/, '')
params = params.sub(/(\|[^|]+\|)\s*\.\.\.\s*(end|\})/, '\1 \2')
elsif @params then
params = @params.gsub(/\s*\#.*/, '')
params = params.tr_s("\n ", " ")
params = "(#{params})" unless params[0] == ?(
else
params = ''
end
if @block_params then
# If this method has explicit block parameters, remove any explicit
# &block
params = params.sub(/,?\s*&\w+/, '')
block = @block_params.tr_s("\n ", " ")
if block[0] == ?(
block = block.sub(/^\(/, '').sub(/\)/, '')
end
params << " { |#{block}| ... }"
end
params
end
Sets the store for this method and its referenced code objects.
# File ruby-3.1.2/lib/rdoc/any_method.rb, line 302
def store= store
super
@file = @store.add_file @file.full_name if @file
end
For methods that super, find the superclass method that would be called.
# File ruby-3.1.2/lib/rdoc/any_method.rb, line 311
def superclass_method
return unless @calls_super
return @superclass_method if @superclass_method
parent.each_ancestor do |ancestor|
if method = ancestor.method_list.find { |m| m.name == @name } then
@superclass_method = method
break
end
end
@superclass_method
end
call_seq without deduplication and alias lookup.
# File ruby-3.1.2/lib/rdoc/any_method.rb, line 330
def _call_seq
@call_seq if defined?(@call_seq) && @call_seq
end
call_seq with alias examples information removed, if this method is an alias method.
# File ruby-3.1.2/lib/rdoc/any_method.rb, line 340
def deduplicate_call_seq(call_seq)
return call_seq unless is_alias_for || !aliases.empty?
method_name = self.name
method_name = method_name[0, 1] if method_name =~ /\A\[/
entries = call_seq.split "\n"
ignore = aliases.map(&:name)
if is_alias_for
ignore << is_alias_for.name
ignore.concat is_alias_for.aliases.map(&:name)
end
ignore.map! { |n| n =~ /\A\[/ ? n[0, 1] : n}
ignore.delete(method_name)
ignore = Regexp.union(ignore)
matching = entries.reject do |entry|
entry =~ /^\w*\.?#{ignore}/ or
entry =~ /\s#{ignore}\s/
end
matching.empty? ? nil : matching.join("\n")
end