lib/yard/handlers/ruby/base.rb in yard-0.6.8 vs lib/yard/handlers/ruby/base.rb in yard-0.7.0

- old
+ new

@@ -1,117 +1,117 @@ module YARD module Handlers module Ruby # To implement a custom handler matcher, subclass this class and implement # {#matches?} to return whether a node matches the handler. - # + # # @example A Custom Handler Matcher Extension # # Implements a handler that checks for a specific string # # in the node's source. # class MyExtension < HandlesExtension # def matches?(node) node.source.include?(name) end # end - # + # # # This handler will handle any node where the source includes 'foo' # class MyHandler < Handlers::Ruby::Base - # handles MyExtension.new('foo') + # handles MyExtension.new('foo') # end class HandlesExtension # Creates a new extension with a specific matcher value +name+ # @param [Object] name the matcher value to check against {#matches?} def initialize(name) @name = name end - + # Tests if the node matches the handler # @param [Parser::Ruby::AstNode] node a Ruby node # @return [Boolean] whether the +node+ matches the handler def matches?(node) raise NotImplementedError end - + protected - + # @return [String] the extension matcher value attr_reader :name end - + class MethodCallWrapper < HandlesExtension def matches?(node) case node.type when :var_ref if !node.parent || node.parent.type == :list - return true if node[0].type == :ident && node[0][0] == name + return true if node[0].type == :ident && (name.nil? || node[0][0] == name) end when :fcall, :command - return true if node[0][0] == name + return true if name.nil? || node[0][0] == name when :call, :command_call - return true if node[2][0] == name + return true if name.nil? || node[2][0] == name end false end end - + class TestNodeWrapper < HandlesExtension def matches?(node) !node.send(name).is_a?(FalseClass) end end - + # This is the base handler class for the new-style (1.9) Ruby parser. - # All handlers that subclass this base class will be used when the + # All handlers that subclass this base class will be used when the # new-style parser is used. For implementing legacy handlers, see # {Legacy::Base}. - # + # # @abstract See {Handlers::Base} for subclassing information. # @see Handlers::Base # @see Legacy::Base class Base < Handlers::Base class << self include Parser::Ruby - + # @group Statement Matcher Extensions - + # Matcher for handling any type of method call. Method calls can # be expressed by many {AstNode} types depending on the syntax # with which it is called, so YARD allows you to use this matcher # to simplify matching a method call. - # + # # @example Match the "describe" method call # handles method_call(:describe) - # + # # # The following will be matched: # # describe(...) # # object.describe(...) # # describe "argument" do ... end - # + # # @param [#to_s] name matches the method call of this name # @return [void] - def method_call(name) - MethodCallWrapper.new(name.to_s) + def method_call(name = nil) + MethodCallWrapper.new(name ? name.to_s : nil) end - + # Matcher for handling a node with a specific meta-type. An {AstNode} # has a {AstNode#type} to define its type but can also be associated # with a set of types. For instance, +:if+ and +:unless+ are both # of the meta-type +:condition+. - # - # A meta-type is any method on the {AstNode} class ending in "?", + # + # A meta-type is any method on the {AstNode} class ending in "?", # though you should not include the "?" suffix in your declaration. # Some examples are: "condition", "call", "literal", "kw", "token", # "ref". - # + # # @example Handling any conditional statement (if, unless) # handles meta_type(:condition) # @param [Symbol] type the meta-type to match. A meta-type can be # any method name + "?" that {AstNode} responds to. # @return [void] def meta_type(type) TestNodeWrapper.new(type.to_s + "?") end - + # @group Testing for a Handler - + # @return [Boolean] whether or not an {AstNode} object should be # handled by this handler def handles?(node) - handlers.any? do |a_handler| - case a_handler + handlers.any? do |a_handler| + case a_handler when Symbol a_handler == node.type when String node.source == a_handler when Regexp @@ -124,16 +124,35 @@ end end end include Parser::Ruby - + # @group Parsing an Inner Block - + def parse_block(inner_node, opts = {}) push_state(opts) do nodes = inner_node.type == :list ? inner_node.children : [inner_node] parser.process(nodes) + end + end + + # @group Macro Handling + + def call_params + return [] unless statement.respond_to?(:parameters) + statement.parameters(false).map do |param| + param.jump(:ident, :tstring_content).source + end + end + + def caller_method + if statement.call? + statement.method_name(true).to_s + elsif statement.type == :var_ref + statement[0].jump(:ident).source + else + nil end end end end end \ No newline at end of file