mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
166 lines
2.8 KiB
Ruby
166 lines
2.8 KiB
Ruby
|
require 'rdoc/code_object'
|
||
|
|
||
|
##
|
||
|
# An attribute created by \#attr, \#attr_reader, \#attr_writer or
|
||
|
# \#attr_accessor
|
||
|
|
||
|
class RDoc::Attr < RDoc::CodeObject
|
||
|
|
||
|
MARSHAL_VERSION = 0 # :nodoc:
|
||
|
|
||
|
##
|
||
|
# Name of the attribute
|
||
|
|
||
|
attr_accessor :name
|
||
|
|
||
|
##
|
||
|
# Is the attribute readable, writable or both?
|
||
|
|
||
|
attr_accessor :rw
|
||
|
|
||
|
##
|
||
|
# Source file token stream
|
||
|
|
||
|
attr_accessor :text
|
||
|
|
||
|
##
|
||
|
# public, protected, private
|
||
|
|
||
|
attr_accessor :visibility
|
||
|
|
||
|
def initialize(text, name, rw, comment)
|
||
|
super()
|
||
|
@text = text
|
||
|
@name = name
|
||
|
@rw = rw
|
||
|
@visibility = :public
|
||
|
self.comment = comment
|
||
|
end
|
||
|
|
||
|
##
|
||
|
# Attributes are ordered by name
|
||
|
|
||
|
def <=>(other)
|
||
|
self.name <=> other.name
|
||
|
end
|
||
|
|
||
|
##
|
||
|
# Attributes are equal when their names and rw is identical
|
||
|
|
||
|
def == other
|
||
|
self.class == other.class and
|
||
|
self.name == other.name and
|
||
|
self.rw == other.rw
|
||
|
end
|
||
|
|
||
|
##
|
||
|
# Returns nil, for duck typing with RDoc::AnyMethod
|
||
|
|
||
|
def block_params
|
||
|
end
|
||
|
|
||
|
##
|
||
|
# Returns nil, for duck typing with RDoc::AnyMethod
|
||
|
|
||
|
def call_seq
|
||
|
end
|
||
|
|
||
|
##
|
||
|
# Partially bogus as Attr has no parent. For duck typing with
|
||
|
# RDoc::AnyMethod.
|
||
|
|
||
|
def full_name
|
||
|
@full_name ||= "#{@parent ? @parent.full_name : '(unknown)'}##{name}"
|
||
|
end
|
||
|
|
||
|
##
|
||
|
# An HTML id-friendly representation of #name
|
||
|
|
||
|
def html_name
|
||
|
@name.gsub(/[^a-z]+/, '-')
|
||
|
end
|
||
|
|
||
|
def inspect # :nodoc:
|
||
|
attr = case rw
|
||
|
when 'RW' then :attr_accessor
|
||
|
when 'R' then :attr_reader
|
||
|
when 'W' then :attr_writer
|
||
|
else
|
||
|
" (#{rw})"
|
||
|
end
|
||
|
|
||
|
"#<%s:0x%x %s.%s :%s>" % [
|
||
|
self.class, object_id,
|
||
|
parent_name, attr, @name,
|
||
|
]
|
||
|
end
|
||
|
|
||
|
##
|
||
|
# Dumps this Attr for use by ri. See also #marshal_load
|
||
|
|
||
|
def marshal_dump
|
||
|
[ MARSHAL_VERSION,
|
||
|
@name,
|
||
|
full_name,
|
||
|
@rw,
|
||
|
@visibility,
|
||
|
parse(@comment),
|
||
|
]
|
||
|
end
|
||
|
|
||
|
##
|
||
|
# Loads this AnyMethod from +array+. For a loaded AnyMethod the following
|
||
|
# methods will return cached values:
|
||
|
#
|
||
|
# * #full_name
|
||
|
# * #parent_name
|
||
|
|
||
|
def marshal_load array
|
||
|
@name = array[1]
|
||
|
@full_name = array[2]
|
||
|
@rw = array[3]
|
||
|
@visibility = array[4]
|
||
|
@comment = array[5]
|
||
|
|
||
|
@parent_name = @full_name
|
||
|
end
|
||
|
|
||
|
##
|
||
|
# Name of our parent with special handling for un-marshaled methods
|
||
|
|
||
|
def parent_name
|
||
|
@parent_name || super
|
||
|
end
|
||
|
|
||
|
##
|
||
|
# URL path for this attribute
|
||
|
|
||
|
def path
|
||
|
"#{@parent.path}##{@name}"
|
||
|
end
|
||
|
|
||
|
##
|
||
|
# For duck typing with RDoc::AnyMethod
|
||
|
|
||
|
def singleton
|
||
|
false
|
||
|
end
|
||
|
|
||
|
def to_s # :nodoc:
|
||
|
"#{type} #{name}\n#{comment}"
|
||
|
end
|
||
|
|
||
|
##
|
||
|
# Returns attr_reader, attr_writer or attr_accessor as appropriate
|
||
|
|
||
|
def type
|
||
|
case @rw
|
||
|
when 'RW' then 'attr_accessor'
|
||
|
when 'R' then 'attr_reader'
|
||
|
when 'W' then 'attr_writer'
|
||
|
end
|
||
|
end
|
||
|
|
||
|
end
|
||
|
|