2010-12-19 22:22:49 -05:00
|
|
|
require 'rdoc/method_attr'
|
2010-04-01 03:45:16 -04:00
|
|
|
|
|
|
|
##
|
|
|
|
# An attribute created by \#attr, \#attr_reader, \#attr_writer or
|
|
|
|
# \#attr_accessor
|
|
|
|
|
2010-12-19 22:22:49 -05:00
|
|
|
class RDoc::Attr < RDoc::MethodAttr
|
2010-04-01 03:45:16 -04:00
|
|
|
|
2010-12-19 22:22:49 -05:00
|
|
|
MARSHAL_VERSION = 1 # :nodoc:
|
2010-04-01 03:45:16 -04:00
|
|
|
|
|
|
|
##
|
2010-12-19 22:22:49 -05:00
|
|
|
# Is the attribute readable ('R'), writable ('W') or both ('RW')?
|
2010-04-01 03:45:16 -04:00
|
|
|
|
|
|
|
attr_accessor :rw
|
|
|
|
|
|
|
|
##
|
2010-12-19 22:22:49 -05:00
|
|
|
# Creates a new Attr with body +text+, +name+, read/write status +rw+ and
|
|
|
|
# +comment+. +singleton+ marks this as a class attribute.
|
2010-04-01 03:45:16 -04:00
|
|
|
|
2010-12-19 22:22:49 -05:00
|
|
|
def initialize(text, name, rw, comment, singleton = false)
|
|
|
|
super text, name
|
2010-04-01 03:45:16 -04:00
|
|
|
|
|
|
|
@rw = rw
|
2010-12-19 22:22:49 -05:00
|
|
|
@singleton = singleton
|
2010-04-01 03:45:16 -04:00
|
|
|
self.comment = comment
|
|
|
|
end
|
|
|
|
|
|
|
|
##
|
2010-12-19 22:22:49 -05:00
|
|
|
# Attributes are equal when their names, singleton and rw are identical
|
2010-04-01 03:45:16 -04:00
|
|
|
|
|
|
|
def == other
|
|
|
|
self.class == other.class and
|
|
|
|
self.name == other.name and
|
2010-12-19 22:22:49 -05:00
|
|
|
self.rw == other.rw and
|
|
|
|
self.singleton == other.singleton
|
2010-04-01 03:45:16 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
##
|
2010-12-19 22:22:49 -05:00
|
|
|
# Add +an_alias+ as an attribute in +context+.
|
2010-04-01 03:45:16 -04:00
|
|
|
|
2010-12-19 22:22:49 -05:00
|
|
|
def add_alias(an_alias, context)
|
|
|
|
new_attr = self.class.new(self.text, an_alias.new_name, self.rw,
|
|
|
|
self.comment, self.singleton)
|
2010-04-10 02:36:13 -04:00
|
|
|
|
2010-12-19 22:22:49 -05:00
|
|
|
new_attr.record_location an_alias.file
|
|
|
|
new_attr.visibility = self.visibility
|
|
|
|
new_attr.is_alias_for = self
|
|
|
|
@aliases << new_attr
|
|
|
|
context.add_attribute new_attr
|
|
|
|
new_attr
|
2010-04-01 03:45:16 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
##
|
2010-12-19 22:22:49 -05:00
|
|
|
# The #aref prefix for attributes
|
2010-04-01 03:45:16 -04:00
|
|
|
|
2010-12-19 22:22:49 -05:00
|
|
|
def aref_prefix
|
|
|
|
'attribute'
|
2010-04-01 03:45:16 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
##
|
2010-12-19 22:22:49 -05:00
|
|
|
# Returns attr_reader, attr_writer or attr_accessor as appropriate.
|
2010-04-01 03:45:16 -04:00
|
|
|
|
2010-12-19 22:22:49 -05:00
|
|
|
def definition
|
|
|
|
case @rw
|
|
|
|
when 'RW' then 'attr_accessor'
|
|
|
|
when 'R' then 'attr_reader'
|
|
|
|
when 'W' then 'attr_writer'
|
|
|
|
end
|
2010-04-01 03:45:16 -04:00
|
|
|
end
|
|
|
|
|
2011-05-13 20:39:16 -04:00
|
|
|
def inspect # :nodoc:
|
|
|
|
alias_for = @is_alias_for ? " (alias for #{@is_alias_for.name})" : nil
|
|
|
|
visibility = self.visibility
|
|
|
|
visibility = "forced #{visibility}" if force_documentation
|
|
|
|
"#<%s:0x%x %s %s (%s)%s>" % [
|
|
|
|
self.class, object_id,
|
|
|
|
full_name,
|
|
|
|
rw,
|
|
|
|
visibility,
|
|
|
|
alias_for,
|
|
|
|
]
|
|
|
|
end
|
|
|
|
|
2010-04-01 03:45:16 -04:00
|
|
|
##
|
|
|
|
# Dumps this Attr for use by ri. See also #marshal_load
|
|
|
|
|
|
|
|
def marshal_dump
|
|
|
|
[ MARSHAL_VERSION,
|
|
|
|
@name,
|
|
|
|
full_name,
|
|
|
|
@rw,
|
|
|
|
@visibility,
|
|
|
|
parse(@comment),
|
2010-12-19 22:22:49 -05:00
|
|
|
singleton,
|
2010-04-01 03:45:16 -04:00
|
|
|
]
|
|
|
|
end
|
|
|
|
|
|
|
|
##
|
2010-12-19 22:22:49 -05:00
|
|
|
# Loads this Attr from +array+. For a loaded Attr the following
|
2010-04-01 03:45:16 -04:00
|
|
|
# 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]
|
2010-12-19 22:22:49 -05:00
|
|
|
@singleton = array[6] || false # MARSHAL_VERSION == 0
|
2010-04-01 03:45:16 -04:00
|
|
|
|
|
|
|
@parent_name = @full_name
|
|
|
|
end
|
|
|
|
|
|
|
|
def to_s # :nodoc:
|
2010-12-19 22:22:49 -05:00
|
|
|
"#{definition} #{name} in: #{parent}"
|
2010-04-01 03:45:16 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
|