Module: YARD::Handlers::Ruby::StructHandlerMethods
- Includes:
- CodeObjects
- Included in:
- ClassHandler, ConstantHandler, Legacy::ClassHandler, Legacy::ConstantHandler
- Defined in:
- lib/yard/handlers/ruby/struct_handler_methods.rb
Overview
Helper methods to parse @attr_* tags on a class.
Constant Summary
Constants included from CodeObjects
CodeObjects::BUILTIN_ALL, CodeObjects::BUILTIN_CLASSES, CodeObjects::BUILTIN_EXCEPTIONS, CodeObjects::BUILTIN_EXCEPTIONS_HASH, CodeObjects::BUILTIN_MODULES, CodeObjects::CONSTANTMATCH, CodeObjects::CSEP, CodeObjects::CSEPQ, CodeObjects::ISEP, CodeObjects::ISEPQ, CodeObjects::METHODMATCH, CodeObjects::METHODNAMEMATCH, CodeObjects::NAMESPACEMATCH, CodeObjects::NSEP, CodeObjects::NSEPQ
Instance Method Summary collapse
-
#add_reader_tags(klass, new_method, member) ⇒ String
Creates the auto-generated docstring for the getter method of a struct’s member.
-
#add_writer_tags(klass, new_method, member) ⇒ String
Creates the auto-generated docstring for the setter method of a struct’s member.
-
#create_attributes(klass, members) ⇒ Object
Creates the given member methods and attaches them to the given ClassObject.
-
#create_class(classname, superclass) ⇒ ClassObject
Creates and registers a class object with the given name and superclass name.
-
#create_member_method?(klass, member, type = :read) ⇒ Boolean
Determines whether to create an attribute method based on the class’s tags.
-
#create_reader(klass, member) ⇒ Object
Creates the getter (reader) method and attaches it to the class as an attribute.
-
#create_writer(klass, member) ⇒ Object
Creates the setter (writer) method and attaches it to the class as an attribute.
-
#member_tag_for_member(klass, member, type = :read) ⇒ Tags::Tag?
Extracts the user’s defined @member tag for a given class and its member.
-
#members_from_tags(klass) ⇒ Array<String>
Retrieves all members defined in @attr* tags.
-
#return_type_from_tag(member_tag) ⇒ String
Gets the return type for the member in a nicely formatted string.
Instance Method Details
#add_reader_tags(klass, new_method, member) ⇒ String
Creates the auto-generated docstring for the getter method of a struct’s member. This is used so the generated documentation will look just like that of an attribute defined using attr_accessor.
60 61 62 63 64 65 66 |
# File 'lib/yard/handlers/ruby/struct_handler_methods.rb', line 60 def (klass, new_method, member) member_tag = member_tag_for_member(klass, member, :read) return_type = return_type_from_tag(member_tag) getter_doc_text = member_tag ? member_tag.text : "Returns the value of attribute #{member}" new_method.docstring.replace(getter_doc_text) new_method.docstring.add_tag YARD::Tags::Tag.new(:return, "the current value of #{member}", return_type) end |
#add_writer_tags(klass, new_method, member) ⇒ String
Creates the auto-generated docstring for the setter method of a struct’s member. This is used so the generated documentation will look just like that of an attribute defined using attr_accessor.
75 76 77 78 79 80 81 82 |
# File 'lib/yard/handlers/ruby/struct_handler_methods.rb', line 75 def (klass, new_method, member) member_tag = member_tag_for_member(klass, member, :write) return_type = return_type_from_tag(member_tag) setter_doc_text = member_tag ? member_tag.text : "Sets the attribute #{member}" new_method.docstring.replace(setter_doc_text) new_method.docstring.add_tag YARD::Tags::Tag.new(:param, "the value to set the attribute #{member} to.", return_type, "value") new_method.docstring.add_tag YARD::Tags::Tag.new(:return, "the newly set value", return_type) end |
#create_attributes(klass, members) ⇒ Object
Creates the given member methods and attaches them to the given ClassObject.
132 133 134 135 136 137 138 139 |
# File 'lib/yard/handlers/ruby/struct_handler_methods.rb', line 132 def create_attributes(klass, members) # For each parameter, add reader and writers members.each do |member| klass.attributes[:instance][member] = SymbolHash[:read => nil, :write => nil] create_writer klass, member if create_member_method?(klass, member, :write) create_reader klass, member if create_member_method?(klass, member, :read) end end |
#create_class(classname, superclass) ⇒ ClassObject
Creates and registers a class object with the given name and superclass name. Returns it for further use.
90 91 92 93 94 95 |
# File 'lib/yard/handlers/ruby/struct_handler_methods.rb', line 90 def create_class(classname, superclass) register ClassObject.new(namespace, classname) do |o| o.superclass = superclass if superclass o.superclass.type = :class if o.superclass.is_a?(Proxy) end end |
#create_member_method?(klass, member, type = :read) ⇒ Boolean
Determines whether to create an attribute method based on the class’s tags.
35 36 37 38 39 40 |
# File 'lib/yard/handlers/ruby/struct_handler_methods.rb', line 35 def create_member_method?(klass, member, type = :read) return true if (klass.(:attr) + klass.(:attr_reader) + klass.(:attr_writer)).empty? return true if member_tag_for_member(klass, member, type) return !member_tag_for_member(klass, member, :write) if type == :read return !member_tag_for_member(klass, member, :read) end |
#create_reader(klass, member) ⇒ Object
Creates the getter (reader) method and attaches it to the class as an attribute. Also sets up the docstring to prettify the documentation output.
119 120 121 122 123 124 125 126 |
# File 'lib/yard/handlers/ruby/struct_handler_methods.rb', line 119 def create_reader(klass, member) new_meth = register MethodObject.new(klass, member, :instance) do |o| o.signature ||= "def #{member}" o.source ||= "#{o.signature}\n @#{member}\nend" end (klass, new_meth, member) klass.attributes[:instance][member][:read] = new_meth end |
#create_writer(klass, member) ⇒ Object
Creates the setter (writer) method and attaches it to the class as an attribute. Also sets up the docstring to prettify the documentation output.
102 103 104 105 106 107 108 109 110 111 112 |
# File 'lib/yard/handlers/ruby/struct_handler_methods.rb', line 102 def create_writer(klass, member) # We want to convert these members into attributes just like # as if they were declared using attr_accessor. new_meth = register MethodObject.new(klass, "#{member}=", :instance) do |o| o.parameters = [['value', nil]] o.signature ||= "def #{member}=(value)" o.source ||= "#{o.signature}\n @#{member} = value\nend" end (klass, new_meth, member) klass.attributes[:instance][member][:write] = new_meth end |
#member_tag_for_member(klass, member, type = :read) ⇒ Tags::Tag?
Extracts the user’s defined @member tag for a given class and its member. Returns nil if the user did not define a @member tag for this struct entry.
14 15 16 17 |
# File 'lib/yard/handlers/ruby/struct_handler_methods.rb', line 14 def member_tag_for_member(klass, member, type = :read) specific_tag = type == :read ? :attr_reader : :attr_writer (klass.(specific_tag) + klass.(:attr)).find {|tag| tag.name == member} end |
#members_from_tags(klass) ⇒ Array<String>
Retrieves all members defined in @attr* tags
23 24 25 26 |
# File 'lib/yard/handlers/ruby/struct_handler_methods.rb', line 23 def (klass) = klass.(:attr) + klass.(:attr_reader) + klass.(:attr_writer) .map {|t| t.name }.uniq end |
#return_type_from_tag(member_tag) ⇒ String
Gets the return type for the member in a nicely formatted string. Used to be injected into auto-generated docstrings.
49 50 51 |
# File 'lib/yard/handlers/ruby/struct_handler_methods.rb', line 49 def return_type_from_tag(member_tag) (member_tag && member_tag.types) ? member_tag.types : "Object" end |