aboutsummaryrefslogtreecommitdiffstats
path: root/lib/rdoc/attr.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rdoc/attr.rb')
-rw-r--r--lib/rdoc/attr.rb165
1 files changed, 165 insertions, 0 deletions
diff --git a/lib/rdoc/attr.rb b/lib/rdoc/attr.rb
new file mode 100644
index 0000000000..43ded8e610
--- /dev/null
+++ b/lib/rdoc/attr.rb
@@ -0,0 +1,165 @@
+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
+