lib/yard/handlers/ruby/constant_handler.rb in yard-0.2.3.5 vs lib/yard/handlers/ruby/constant_handler.rb in yard-0.4.0
- old
+ new
@@ -1,12 +1,46 @@
class YARD::Handlers::Ruby::ConstantHandler < YARD::Handlers::Ruby::Base
namespace_only
handles :assign
def process
- if statement[0].type == :var_field && statement[0][0].type == :const
- name = statement[0][0][0]
- value = statement[1].source
- register ConstantObject.new(namespace, name) {|o| o.source = statement; o.value = value.strip }
+ if statement[1].call? && statement[1][0][0] == s(:const, "Struct") &&
+ statement[1][2] == s(:ident, "new")
+ process_structclass(statement)
+ elsif statement[0].type == :var_field && statement[0][0].type == :const
+ process_constant(statement)
+ end
+ end
+
+ private
+
+ def process_constant(statement)
+ name = statement[0][0][0]
+ value = statement[1].source
+ register ConstantObject.new(namespace, name) {|o| o.source = statement; o.value = value.strip }
+ end
+
+ def process_structclass(statement)
+ lhs = statement[0][0]
+ if lhs.type == :const
+ klass = register ClassObject.new(namespace, lhs[0])
+ klass.superclass = P(:Struct)
+ parse_attributes(klass, statement[1].parameters)
+ else
+ raise YARD::Parser::UndocumentableError, "Struct assignment to #{statement[0].source}"
+ end
+ end
+
+ def parse_attributes(klass, attributes)
+ return unless attributes
+
+ scope = :instance
+ attributes.each do |node|
+ next if !node.respond_to?(:type) || node.type != :symbol_literal
+ name = node.jump(:ident).source
+ klass.attributes[scope][name] = SymbolHash[:read => nil, :write => nil]
+ {read: name, write: "#{name}="}.each do |type, meth|
+ klass.attributes[scope][name][type] = MethodObject.new(klass, meth, scope)
+ end
end
end
end
\ No newline at end of file