6

我希望能够将模板化的 YARD 文档样式注释插入到我现有的 Rails 遗留应用程序中。目前评论很少。我想要具有指定参数的类头和方法头(通过从我假定的方法签名中提取)和返回值的占位符。

在 PHP 代码中,我有一些工具可以检查代码并在适当的位置创建插入到代码中的文档标题注释。在带有 Duck 类型等的 Ruby 中,我确信 @params 等的类型不能轻易猜出,我对此表示满意 - 我希望在插入后手动逐个查看代码文件。如果可能的话,只想避免将所有骨架模板插入代码(超过 500 个文件)。

我已经搜索了可以执行此操作的宝石等,但到目前为止还没有遇到过。外面有吗?

4

1 回答 1

1

看来您必须自己编写它,但是访问 Ruby 的S-expressions并不是什么大问题,它会为您解析源代码。所以你可以这样做:

require 'ripper'
def parse_sexp( sexp, stack=[] )
  case sexp[0]
  when :module
    name = sexp[1][1][1]
    line_number = sexp[1][1][2][0]

    parse_sexp(sexp[2], stack+[sexp[0], sexp[1][1][1]])

    puts "#{line_number}: Module: #{name}\n"
  when :class
    name = sexp[1][1][1]
    line_number = sexp[1][1][2][0]

    parse_sexp(sexp[3], stack+[sexp[0], sexp[1][1][1]])
    puts "#{line_number}: Class: #{stack.last}::#{name}\n"
  when :def
    name = sexp[1][1]
    line_number = sexp[1][2][0]

    parse_sexp(sexp[3], stack+[sexp[0], sexp[1][1]])

    puts "#{line_number}: Method: #{stack.last}##{name}\n"
  else
    if sexp.kind_of?(Array)
      sexp.each { |s| parse_sexp(s,stack) if s.kind_of?(Array) }
    end
  end

end


sexp = Ripper.sexp(open 'prog.rb')
parse_sexp(sexp)

Prog.rb 是:

$ cat -n prog.rb 
 1  module M1
 2    class C1
 3      def m1c1
 4        a="test"
 5        puts "hello"
 6        return a if a.empty?
 7        puts "hello2"
 8        a
 9      end
10    end
11    class C2 < C3
12      def m1c2
13        puts "hello"
14      end
15    end
16    class C3
17    end
18  end

你会得到的是:

#line_number    #entity
3: Method: C1#m1c1
2: Class: M1::C1
12: Method: C2#m1c2
11: Class: M1::C2
16: Class: M1::C3
1: Module: M1

所以您只需要自定义模板,并提取同一数组中可用的参数:

#irb > pp Ripper.sexp("def method(param1);nil; end")
...[:def,
   [:@ident, "method", [1, 4]],
   [:paren,
    [:params, [[:@ident, "param1", [1, 11]]]...

稍微困难一点的任务是找出返回的内容,但仍然可行 -在最后一个:return时查找 s并将其添加到方法的最后一个语句中。:defstack

最后将这些注释放在源文件的适当行之上。

于 2015-06-04T00:57:33.240 回答