123456789_123456789_123456789_123456789_123456789_

Class: RDoc::AnyMethod

Relationships & Source Files
Extension / Inclusion / Inheritance Descendants
Subclasses:
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
Instance Chain:
Inherits: RDoc::MethodAttr
Defined in: lib/rdoc/any_method.rb

Overview

AnyMethod is the base class for objects representing methods

Constant Summary

Text - Included

MARKUP_FORMAT, SPACE_SEPARATED_LETTER_CLASS, TO_HTML_CHARACTERS

Class Method Summary

MethodAttr - Inherited

.new

Creates a new MethodAttr from token stream text and method or attribute name #name.

CodeObject - Inherited

.new

Creates a new CodeObject that will document itself and its children.

Instance Attribute Summary

MethodAttr - Inherited

#aliases

Array of other names for this method/attribute.

#arglists

The call_seq or the param_seq with method name, if there is no call_seq.

#block_params

Parameters yielded by the called block.

#block_params=

Attempts to sanitize the content passed by the Ruby parser: remove outer parentheses, etc.

#call_seq

Different ways to call this method.

#documented?

A method/attribute is documented if any of the following is true: - it was marked with :nodoc:; - it has a comment; - it is an alias for a documented method; - it has a #see method that is documented.

#is_alias_for

The method/attribute we’re aliasing.

#name

Name of this method/attribute.

#param_seq

Pretty parameter list for this method.

#params

Parameters for this method.

#singleton

Is this a singleton method/attribute?

#store=

Sets the store for this class or module and its contained code objects.

#text

Source file token stream.

#visibility

public, protected, private.

CodeObject - Inherited

#comment

Our comment.

#comment=

Replaces our comment with comment, unless it is empty.

#display?

Should this CodeObject be displayed in output?

#document_children

Do we document our children?

#document_children=

Enables or disables documentation of this CodeObject’s children unless it has been turned off by :enddoc:

#document_self

Do we document ourselves?

#document_self=

Enables or disables documentation of this CodeObject unless it has been turned off by :enddoc:.

#documented?

Does this object have a comment with content or is #received_nodoc true?

#done_documenting

Are we done documenting (ie, did we come across a :enddoc:)?

#done_documenting=

Turns documentation on/off, and turns on/off #document_self and #document_children.

#file

Which file this code object was defined in.

#force_documentation

Force documentation of this CodeObject.

#force_documentation=

Force the documentation of this object unless documentation has been turned off by :enddoc:

#full_name=

Sets the full_name overriding any computed full name.

#ignored?

Has this class been ignored?

#line

Line in #file where this CodeObject was defined.

#metadata

Hash of arbitrary metadata for this CodeObject.

#parent

Our parent CodeObject.

#parent=

Sets the parent CodeObject.

#received_nodoc

Did we ever receive a :nodoc: directive?

#section

The section this CodeObject is in.

#section=

Set the section this CodeObject is in.

#store

The Store for this object.

#store=

Sets the store that contains this CodeObject.

#suppressed?

Has this class been suppressed?

#viewer

We are the model of the code, but we know that at some point we will be worked on by viewers.

Text - Included

#language

The language for this text.

Instance Method Summary

TokenStream - Included

#add_token

Adds one token to the collected tokens.

#add_tokens

Adds tokens to the collected tokens.

#collect_tokens

Starts collecting tokens.

#pop_token

Remove the last token from the collected tokens.

#start_collecting_tokens
#token_stream

Current token stream.

#tokens_to_s

Returns a string representation of the token stream.

MethodAttr - Inherited

#<=>

Order by #singleton then #name

#add_alias

Abstract method.

#add_line_numbers

Prepend src with line numbers.

#aref

HTML fragment reference for this method.

#aref_prefix

Prefix for aref, defined by subclasses.

#full_name

Full method/attribute name including namespace.

#html_name

HTML id-friendly method/attribute name.

#markup_code

Turns the method’s token stream into HTML.

#name_prefix

‘::’ for a class method/attribute, ‘#’ for an instance method.

#output_name

Name for output to HTML.

#parent_name

Name of our parent with special handling for un-marshaled methods.

#path

Path to this method for use with HTML generator output.

#pretty_name

Method/attribute name with class/instance indicator.

#search_record

Used by Generator::JsonIndex to create a record for the search engine.

#see

A method/attribute to look at, in particular if this method/attribute has no documentation.

#type

Type of method/attribute (class or instance).

#==, #find_method_or_attribute, #find_see,
#initialize_copy

Resets cached data for the object so it can be rebuilt by accessor methods.

#initialize_visibility, #inspect, #pretty_print, #to_s

CodeObject - Inherited

#each_parent

Yields each parent of this CodeObject.

#file_name

File name where this CodeObject was found.

#ignore

Use this to ignore a CodeObject and all its children until found again (#record_location is called).

#options

The options instance from the store this CodeObject is attached to, or a default options instance if the CodeObject is not attached.

#parent_file_name

File name of our parent.

#parent_name

Name of our parent.

#record_location

Records the TopLevel (file) where this code object was defined.

#start_doc

Enable capture of documentation unless documentation has been turned off by :enddoc:

#stop_doc

Disable capture of documentation.

#suppress

Use this to suppress a CodeObject and all its children until the next file it is seen in or documentation is discovered.

#initialize_visibility

Initializes state for visibility of this CodeObject and its children.

Generator::Markup - Included

#aref_to

Generates a relative URL from this object’s path to target_path

#as_href

Generates a relative URL from from_path to this object’s path.

#cvs_url

Build a webcvs URL starting for the given url with full_path appended as the destination path.

#description

Handy wrapper for marking up this object’s comment.

#formatter

Creates an Markup::ToHtmlCrossref formatter.

Text - Included

#expand_tabs

Expands tab characters in text to eight spaces.

#flush_left

Flush text left based on the shortest line.

#markup

Convert a string in markup format into HTML.

#normalize_comment

Strips hashes, expands tabs then flushes text to the left.

#parse

Normalizes text then builds a Markup::Document from it.

#snippet

The first limit characters of text as HTML.

#strip_hashes

Strips leading # characters from text

#strip_newlines

Strips leading and trailing n characters from text

#strip_stars

Strips /* */ style comments.

#to_html

Converts ampersand, dashes, ellipsis, quotes, copyright and registered trademark symbols in text to properly encoded characters.

#wrap

Wraps txt to line_len

Constructor Details

.new(text, name) ⇒ AnyMethod

Creates a new AnyMethod with a token stream text and #name

[ GitHub ]

  
# File '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

Instance Attribute Details

#c_function (rw)

The C function that implements this method (if it was defined in a C file)

[ GitHub ]

  
# File 'lib/rdoc/any_method.rb', line 27

attr_accessor :c_function

#call_seq (rw)

Different ways to call this method

[ GitHub ]

  
# File '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

#call_seq=(call_seq) (rw)

Sets the different ways you can call this method. If an empty #call_seq is given nil is assumed.

See also #param_seq

[ GitHub ]

  
# File 'lib/rdoc/any_method.rb', line 112

def call_seq= call_seq
  return if call_seq.empty?

  @call_seq = call_seq
end

#calls_super (rw)

If true this method uses super to call a superclass version

[ GitHub ]

  
# File 'lib/rdoc/any_method.rb', line 39

attr_accessor :calls_super

#dont_rename_initialize (rw)

Don’t rename #initialize to ::new

[ GitHub ]

  
# File 'lib/rdoc/any_method.rb', line 22

attr_accessor :dont_rename_initialize

#has_call_seq?Boolean (readonly)

Whether the method has a call-seq.

[ GitHub ]

  
# File 'lib/rdoc/any_method.rb', line 121

def has_call_seq?
  !!(@call_seq || is_alias_for&._call_seq)
end

#params (rw)

Parameters for this method

[ GitHub ]

  
# File 'lib/rdoc/any_method.rb', line 34

attr_accessor :params

#section_title (rw)

The section title of the method (if defined in a C file via :category:)

[ GitHub ]

  
# File 'lib/rdoc/any_method.rb', line 30

attr_accessor :section_title

#skip_description?Boolean (readonly)

Whether to skip the method description, true for methods that have aliases with a call-seq that doesn’t include the method name.

[ GitHub ]

  
# File 'lib/rdoc/any_method.rb', line 310

def skip_description?
  has_call_seq? && call_seq.nil? && !!(is_alias_for || !aliases.empty?)
end

#store=(store) (writeonly)

Sets the store for this method and its referenced code objects.

[ GitHub ]

  
# File 'lib/rdoc/any_method.rb', line 317

def store= store
  super

  @file = @store.add_file @file.full_name if @file
end

Instance Method Details

#_call_seq (protected)

call_seq without deduplication and alias lookup.

[ GitHub ]

  
# File 'lib/rdoc/any_method.rb', line 345

def _call_seq
  @call_seq if defined?(@call_seq) && @call_seq
end

#add_alias(an_alias, context = nil)

Adds an_alias as an alias for this method in context.

[ GitHub ]

  
# File '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

#aref_prefix

Prefix for aref is ‘method’.

[ GitHub ]

  
# File 'lib/rdoc/any_method.rb', line 76

def aref_prefix
  'method'
end

#arglists

The call_seq or the param_seq with method name, if there is no call_seq.

Use this for displaying a method’s argument lists.

[ GitHub ]

  
# File 'lib/rdoc/any_method.rb', line 85

def arglists
  if @call_seq then
    @call_seq
  elsif @params then
    "#{name}#{param_seq}"
  end
end

#deduplicate_call_seq(call_seq) (private)

call_seq with alias examples information removed, if this method is an alias method.

[ GitHub ]

  
# File 'lib/rdoc/any_method.rb', line 355

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}
  ignore.delete(method_name)
  ignore = Regexp.union(ignore)

  matching = entries.reject do |entry|
    entry =~ /^\w*\.?#{ignore}[$\(\s]/ or
      entry =~ /\s#{ignore}\s/
  end

  matching.empty? ? nil : matching.join("\n")
end

#is_alias_for

This method is for internal use only.

Loads is_alias_for from the internal name. Returns nil if the alias cannot be found.

[ GitHub ]

  
# File 'lib/rdoc/any_method.rb', line 129

def is_alias_for # :nodoc:
  case @is_alias_for
  when RDoc::MethodAttr then
    @is_alias_for
  when Array then
    return nil unless @store

    klass_name, singleton, method_name = @is_alias_for

    return nil unless klass = @store.find_class_or_module(klass_name)

    @is_alias_for = klass.find_method method_name, singleton
  end
end

#marshal_dump

Dumps this AnyMethod for use by ri. See also #marshal_load

[ GitHub ]

  
# File 'lib/rdoc/any_method.rb', line 147

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

#marshal_load(array)

Loads this AnyMethod from array. For a loaded AnyMethod the following methods will return cached values:

  • #full_name

  • #parent_name

[ GitHub ]

  
# File 'lib/rdoc/any_method.rb', line 184

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

#name

Method name

If the method has no assigned name, it extracts it from #call_seq.

[ GitHub ]

  
# File 'lib/rdoc/any_method.rb', line 233

def name
  return @name if @name

  @name =
    @call_seq[/^.*?\.(\w+)/, 1] ||
    @call_seq[/^.*?(\w+)/, 1] ||
    @call_seq if @call_seq
end

#param_list

A list of this method’s method and yield parameters. call-seq params are preferred over parsed method and block params.

[ GitHub ]

  
# File 'lib/rdoc/any_method.rb', line 246

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

#param_seq

Pretty parameter list for this method. If the method’s parameters were given by call-seq it is preferred over the parsed values.

[ GitHub ]

  
# File 'lib/rdoc/any_method.rb', line 278

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

#superclass_method

For methods that super, find the superclass method that would be called.

[ GitHub ]

  
# File 'lib/rdoc/any_method.rb', line 326

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