次の DSL の YARD プラグインの作成に問題があります。
class MyClass
my_dsl :do_it, :do_other
def do_it
# do it
end
def do_other
# do other
end
def do_unrelated
# do unrelated
end
end
ここで、DSL によって「影響を受ける」これらのメソッドのドキュメント スニペットにメモを追加したいと思いますmy_dsl
。ハンドラー内でmy_dsl
は、スコープはまったく異なります (新しいドキュメントを追加したくありません。既存のメソッドを拡張したいのです。)
そのため、内部でProxyコード オブジェクトを使用MyDSLHandler#process
して、後で後処理を遅らせるために必要なメソッドをマークすることにしました (これは、組み込みのMethodHandler
on内で発生しdef do_it ; … ; end
ます)。
class MyDSLHandler < YARD::Handlers::Ruby::DSLHandler
handles method_call(:my_dsl)
namespace_only
def process
statement.parameters.each { |astnode|
mthd = astnode.jump(:string_content).source if astnode.respond_to? :jump
obj = YARD::CodeObjects::Proxy.new(namespace, "\##{mthd}", :method)
register(obj)
obj[:my_dsl_params] << {
name: mthd,
file: statement.file, line: statement.line # I need this!
}
}
end
end
問題は、オブジェクトがからではなく、Proxy
プレーンから派生しているため、メソッドが定義されていないことです。Object
YARD::CodeObjects::Base
[]=
[warn]: Load Order / Name Resolution Problem on MyClass#do_it:
[warn]: -
[warn]: Something is trying to call [] on object MyClass#do_it before it has been recognized.
[warn]: This error usually means that you need to modify the order in which you parse files
[warn]: so that MyClass#do_it is parsed before methods or other objects attempt to access it.
[warn]: -
[warn]: YARD will recover from this error and continue to parse but you *may* have problems
[warn]: with your generated documentation. You should probably fix this.
[warn]: -
[error]: Unhandled exception in Yard::Handlers::MyDSLHandler:
[error]: in `example_mydsl.rb`:5:
5: my_dsl :do_it, :do_other
[error]: ProxyMethodError: Proxy cannot call method #[] on object 'MyClass#do_it'
オブジェクトの実際のインスタンス化中に使用できるように、現在のコンテキストからProxy
オブジェクトにいくつかの値を保存するにはどうすればよいですか?