summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorSeba Gamboa <[email protected]>2015-09-23 15:18:35 -0300
committerSeba Gamboa <[email protected]>2015-09-23 15:18:35 -0300
commitc219bc56094c1e5878e2c7c3ff1de9b8a9fa973a (patch)
tree5800b1527d6f46c79356a8a8f906cafed86db6d6
parentaed91b0fb2fe3c2cd3a74e2e5bc23c8bd95ef1db (diff)
downloadyard-mruby-c219bc56094c1e5878e2c7c3ff1de9b8a9fa973a.tar.gz
yard-mruby-c219bc56094c1e5878e2c7c3ff1de9b8a9fa973a.zip
Handling method definitions
-rw-r--r--lib/yard/handlers/c.rb1
-rw-r--r--lib/yard/handlers/c/mruby_base.rb2
-rw-r--r--lib/yard/handlers/c/mruby_method_handler.rb12
-rw-r--r--lib/yard/handlers/c/mruby_symbol_handler.rb15
-rw-r--r--spec/handlers/c/mruby_method_handler_spec.rb48
5 files changed, 74 insertions, 4 deletions
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