From c219bc56094c1e5878e2c7c3ff1de9b8a9fa973a Mon Sep 17 00:00:00 2001 From: Seba Gamboa Date: Wed, 23 Sep 2015 15:18:35 -0300 Subject: Handling method definitions --- lib/yard/handlers/c.rb | 1 + lib/yard/handlers/c/mruby_base.rb | 2 ++ lib/yard/handlers/c/mruby_method_handler.rb | 12 ++++--- lib/yard/handlers/c/mruby_symbol_handler.rb | 15 +++++++++ spec/handlers/c/mruby_method_handler_spec.rb | 48 ++++++++++++++++++++++++++++ 5 files changed, 74 insertions(+), 4 deletions(-) create mode 100644 lib/yard/handlers/c/mruby_symbol_handler.rb create mode 100644 spec/handlers/c/mruby_method_handler_spec.rb diff --git a/lib/yard/handlers/c.rb b/lib/yard/handlers/c.rb index 61c4943..a291fa2 100644 --- a/lib/yard/handlers/c.rb +++ b/lib/yard/handlers/c.rb @@ -1,4 +1,5 @@ require_relative 'c/mruby_base' +require_relative 'c/mruby_symbol_handler' require_relative 'c/mruby_class_handler' # require_relative 'c/mruby_module_handler' require_relative 'c/mruby_method_handler' diff --git a/lib/yard/handlers/c/mruby_base.rb b/lib/yard/handlers/c/mruby_base.rb index 83c237a..570dd71 100644 --- a/lib/yard/handlers/c/mruby_base.rb +++ b/lib/yard/handlers/c/mruby_base.rb @@ -8,5 +8,7 @@ module YARD::Handlers::C return DEFAULT_NAMESPACES[var] if DEFAULT_NAMESPACES[var] super end + + end end diff --git a/lib/yard/handlers/c/mruby_method_handler.rb b/lib/yard/handlers/c/mruby_method_handler.rb index 01fb345..a8812ae 100644 --- a/lib/yard/handlers/c/mruby_method_handler.rb +++ b/lib/yard/handlers/c/mruby_method_handler.rb @@ -1,7 +1,11 @@ module YARD::Handlers::C class MRubyMethodHandler < MRubyBase - MATCH1 = /mrb_define_method\s* - \( + MATCH1 = /mrb_define_( + method | + singleton_method | + module_function + ) + \s*\( \s*\w+\s*, \s*(\w+)\s*, \s*"(\w+)"\s*, @@ -12,8 +16,8 @@ module YARD::Handlers::C statement_class BodyStatement process do - statement.source.scan(MATCH1) do |var_name, name, func_name| - handle_method(nil, var_name, name, func_name) + statement.source.scan(MATCH1) do |type,var_name, name, func_name| + handle_method(type, var_name, name, func_name) end end diff --git a/lib/yard/handlers/c/mruby_symbol_handler.rb b/lib/yard/handlers/c/mruby_symbol_handler.rb new file mode 100644 index 0000000..8b256d2 --- /dev/null +++ b/lib/yard/handlers/c/mruby_symbol_handler.rb @@ -0,0 +1,15 @@ +module YARD::Handlers::C + # Keeps track of function bodies for symbol lookup during MRuby method declarations + class MRubySymbolHandler < MRubyBase + MATCH = / + mrb_value\s*(\w+)\s*\(\s*mrb_state\s*\*\s*\w+,\s*mrb_value\s*\w+\s*\) + /mx + + handles MATCH + statement_class ToplevelStatement + + process do + symbols[statement.source[MATCH, 1]] = statement + end + end +end diff --git a/spec/handlers/c/mruby_method_handler_spec.rb b/spec/handlers/c/mruby_method_handler_spec.rb new file mode 100644 index 0000000..4ae86fb --- /dev/null +++ b/spec/handlers/c/mruby_method_handler_spec.rb @@ -0,0 +1,48 @@ +require_relative 'spec_helper' + +describe YARD::Handlers::C::MRubyMethodHandler do + it "should register methods" do + parse_init <<-eof + mFoo = mrb_define_module(mrb, "Foo"); + mrb_define_method(mrb, mFoo, "bar", bar, MRB_ARGS_NONE()); + eof + expect(Registry.at('Foo#bar')).not_to be_nil + expect(Registry.at('Foo#bar').visibility).to be :public + end + + it "should register singleton methods" do + parse_init <<-eof + mFoo = mrb_define_module("Foo"); + mrb_define_singleton_method(mrb, mFoo, "bar", bar, MRB_ARGS_NONE()); + eof + expect(Registry.at('Foo.bar')).not_to be_nil + expect(Registry.at('Foo.bar').visibility).to be :public + end + + it "should register module functions" do + parse <<-eof + /* DOCSTRING + * @return [String] foo! + */ + static mrb_value bar(mrb_state *mrb, mrb_value self) { x(); y(); z(); } + + void mrb_foo_gem_init(mrb_state *mrb) { + mFoo = mrb_define_module(mrb, "Foo"); + mrb_define_module_function(mrb, mFoo, "bar", bar, MRB_ARGS_NONE()); + } + eof + bar_c = Registry.at('Foo.bar') + bar_i = Registry.at('Foo#bar') + + expect(bar_c).to be_module_function + expect(bar_c.visibility).to be :public + expect(bar_c.docstring).to eq "DOCSTRING" + expect(bar_c.tag(:return).object).to eq bar_c + expect(bar_c.source).to eq "static mrb_value bar(mrb_state *mrb, mrb_value self) { x(); y(); z(); }" + expect(bar_i).not_to be_module_function + expect(bar_i.visibility).to be :private + expect(bar_i.docstring).to eq "DOCSTRING" + expect(bar_i.tag(:return).object).to eq bar_i + expect(bar_i.source).to eq bar_c.source + end +end -- cgit v1.2.3