diff options
22 files changed, 169 insertions, 15 deletions
diff --git a/lib/yard-mruby.rb b/lib/yard-mruby.rb new file mode 100644 index 0000000..4441410 --- /dev/null +++ b/lib/yard-mruby.rb @@ -0,0 +1 @@ +require 'yard/mruby' diff --git a/lib/yard/mruby.rb b/lib/yard/mruby.rb index 960f7cf..d94cd78 100644 --- a/lib/yard/mruby.rb +++ b/lib/yard/mruby.rb @@ -1,7 +1,3 @@ -require "yard/mruby/version" - -module Yard - module Mruby - # Your code goes here... - end -end +require_relative "mruby/version" +require_relative "mruby/code_objects" +require_relative "mruby/handlers" diff --git a/lib/yard/mruby/code_objects.rb b/lib/yard/mruby/code_objects.rb new file mode 100644 index 0000000..83cf18d --- /dev/null +++ b/lib/yard/mruby/code_objects.rb @@ -0,0 +1,3 @@ +require_relative 'code_objects/header_object' +require_relative 'code_objects/function_object' +require_relative 'code_objects/define_object' diff --git a/lib/yard/mruby/code_objects/define_object.rb b/lib/yard/mruby/code_objects/define_object.rb new file mode 100644 index 0000000..2c05d91 --- /dev/null +++ b/lib/yard/mruby/code_objects/define_object.rb @@ -0,0 +1,8 @@ +module YARD::MRuby::CodeObjects + + # A DefineObject represents a MRuby C API define macro declaration inside a header inside an include directory + class DefineObject < YARD::CodeObjects::Base + end +end + + diff --git a/lib/yard/mruby/code_objects/function_object.rb b/lib/yard/mruby/code_objects/function_object.rb new file mode 100644 index 0000000..5eb906e --- /dev/null +++ b/lib/yard/mruby/code_objects/function_object.rb @@ -0,0 +1,7 @@ +module YARD::MRuby::CodeObjects + + # A FunctionObject represents a MRuby C API function declaration inside a header inside an include directory + class FunctionObject < YARD::CodeObjects::Base + end +end + diff --git a/lib/yard/mruby/code_objects/header_object.rb b/lib/yard/mruby/code_objects/header_object.rb new file mode 100644 index 0000000..99fb3cf --- /dev/null +++ b/lib/yard/mruby/code_objects/header_object.rb @@ -0,0 +1,7 @@ +module YARD::MRuby::CodeObjects + + # A HeaderObject represents a MRuby header inside an include directory + # It groups C Functions and define macros. + class HeaderObject < YARD::CodeObjects::NamespaceObject + end +end diff --git a/lib/yard/mruby/handlers.rb b/lib/yard/mruby/handlers.rb new file mode 100644 index 0000000..cb0c898 --- /dev/null +++ b/lib/yard/mruby/handlers.rb @@ -0,0 +1,2 @@ +require_relative 'handlers/source' +require_relative 'handlers/header' diff --git a/lib/yard/mruby/handlers/header.rb b/lib/yard/mruby/handlers/header.rb new file mode 100644 index 0000000..bb39563 --- /dev/null +++ b/lib/yard/mruby/handlers/header.rb @@ -0,0 +1 @@ + require_relative 'header/base' diff --git a/lib/yard/mruby/handlers/header/base.rb b/lib/yard/mruby/handlers/header/base.rb new file mode 100644 index 0000000..35859f7 --- /dev/null +++ b/lib/yard/mruby/handlers/header/base.rb @@ -0,0 +1,11 @@ +module YARD + module MRuby + module Handlers + module Header + class Base < YARD::Handlers::Base + include YARD::Parser::C + end + end + end + end +end diff --git a/lib/yard/mruby/handlers/header/define_handler.rb b/lib/yard/mruby/handlers/header/define_handler.rb new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/lib/yard/mruby/handlers/header/define_handler.rb diff --git a/lib/yard/mruby/handlers/header/function_handler.rb b/lib/yard/mruby/handlers/header/function_handler.rb new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/lib/yard/mruby/handlers/header/function_handler.rb diff --git a/lib/yard/mruby/handlers/header/header_handler.rb b/lib/yard/mruby/handlers/header/header_handler.rb new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/lib/yard/mruby/handlers/header/header_handler.rb diff --git a/lib/yard/mruby/handlers/source.rb b/lib/yard/mruby/handlers/source.rb new file mode 100644 index 0000000..af8b0db --- /dev/null +++ b/lib/yard/mruby/handlers/source.rb @@ -0,0 +1,5 @@ + require_relative 'source/base' + require_relative 'source/class_handler' + require_relative 'source/module_handler' + require_relative 'source/method_handler' + diff --git a/lib/yard/mruby/handlers/source/base.rb b/lib/yard/mruby/handlers/source/base.rb new file mode 100644 index 0000000..4578079 --- /dev/null +++ b/lib/yard/mruby/handlers/source/base.rb @@ -0,0 +1,18 @@ +module YARD + module MRuby + module Handlers + module Source + class Base < YARD::Handlers::C::Base + DEFAULT_NAMESPACES = { + 'mrb->object_class' => 'Object' + } + + def namespace_for_variable(var) + return DEFAULT_NAMESPACES[var] if DEFAULT_NAMESPACES[var] + super + end + end + end + end + end +end diff --git a/lib/yard/mruby/handlers/source/class_handler.rb b/lib/yard/mruby/handlers/source/class_handler.rb new file mode 100644 index 0000000..185aaa6 --- /dev/null +++ b/lib/yard/mruby/handlers/source/class_handler.rb @@ -0,0 +1,35 @@ +module YARD::MRuby::Handlers::Source + class ClassHandler < Base + + TOP_LEVEL_CLASS = /\*([\w]+)\s*=\s*mrb_define_class\s* + \( + \s*\w+\s*, + \s*"(\w+)"\s*, + \s*([\w\->]+)\s* + \) + /mx + + NAMESPACED_CLASS = /\*([\w]+)\s*=\s*mrb_define_class_under\s* + \( + \s*\w+\s*, + \s*(\w+)\s*, + \s*"(\w+)"\s*, + \s*([\w\->]+)\s* + \) + /mx + + handles TOP_LEVEL_CLASS + handles NAMESPACED_CLASS + + statement_class BodyStatement + + process do + statement.source.scan(TOP_LEVEL_CLASS) do |var_name, class_name, parent| + handle_class(var_name, class_name, parent) + end + statement.source.scan(NAMESPACED_CLASS) do |var_name, in_module, class_name, parent| + handle_class(var_name, class_name, parent, in_module) + end + end + end +end diff --git a/lib/yard/mruby/handlers/source/method_handler.rb b/lib/yard/mruby/handlers/source/method_handler.rb new file mode 100644 index 0000000..f3eab8c --- /dev/null +++ b/lib/yard/mruby/handlers/source/method_handler.rb @@ -0,0 +1,22 @@ +module YARD::MRuby::Handlers::Source + class MethodHandler < Base + MATCH1 = /mrb_define_method\s* + \( + \s*\w+\s*, + \s*(\w+)\s*, + \s*"(\w+)"\s*, + \s*(\w+)\s*, + /mx + + handles MATCH1 + statement_class BodyStatement + + process do + puts statement.inspect + statement.source.scan(MATCH1) do |var_name, name, func_name| + handle_method(nil, var_name, name, func_name) + end + end + + end +end diff --git a/lib/yard/mruby/handlers/source/module_handler.rb b/lib/yard/mruby/handlers/source/module_handler.rb new file mode 100644 index 0000000..c9243ac --- /dev/null +++ b/lib/yard/mruby/handlers/source/module_handler.rb @@ -0,0 +1,34 @@ +module YARD::MRuby::Handlers::Source + class ModuleHandler < Base + + TOP_LEVEL_MODULE = /\*([\w]+)\s*=\s*mrb_define_module\s* + \( + \s*\w+\s*, + \s*"(\w+)"\s* + \) + /mx + + NAMESPACED_MODULE = /\*([\w]+)\s*=\s*mrb_define_module_under\s* + \( + \s*\w+\s*, + \s*(\w+)\s*, + \s*"(\w+)"\s* + \) + /mx + + handles TOP_LEVEL_MODULE + handles NAMESPACED_MODULE + + statement_class BodyStatement + + process do + statement.source.scan(TOP_LEVEL_MODULE) do |var_name, module_name| + handle_module(var_name, module_name) + end + statement.source.scan(NAMESPACED_MODULE) do |var_name, in_module, module_name| + handle_module(var_name, module_name, in_module) + end + end + end +end + diff --git a/lib/yard/mruby/version.rb b/lib/yard/mruby/version.rb index 0903733..7aea642 100644 --- a/lib/yard/mruby/version.rb +++ b/lib/yard/mruby/version.rb @@ -1,5 +1,5 @@ -module Yard - module Mruby +module YARD + module MRuby VERSION = "0.1.0" end end diff --git a/sample/.yardopts b/sample/.yardopts index 3b09c69..41b06ea 100644 --- a/sample/.yardopts +++ b/sample/.yardopts @@ -1 +1,3 @@ -mrblib/**/*.rb - README.md LICENSE.txt +--plugin mruby +mrblib/**/*.rb +src/**/*.c diff --git a/sample/README.md b/sample/README.md index 1dea126..657e051 100644 --- a/sample/README.md +++ b/sample/README.md @@ -1,4 +1,4 @@ -# sample +# Sample MRuby GEM TODO: Write your README diff --git a/sample/src/sample.c b/sample/src/sample.c index 43a9e3a..e5cbae7 100644 --- a/sample/src/sample.c +++ b/sample/src/sample.c @@ -11,6 +11,8 @@ void sample_deprecated_method( void ) /** * A sample Ruby method defined from C + * + * @return [String] Hello World! */ mrb_value mrb_Sample_Hello__world(mrb_state *mrb, mrb_value self) { @@ -20,9 +22,9 @@ mrb_value mrb_Sample_Hello__world(mrb_state *mrb, mrb_value self) void mrb_sample_gem_init(mrb_state *mrb) { - struct RClass *Sample = mrb_define_module(mrb, "Sample"); - struct RClass *Sample_Hello = mrb_define_class_under(mrb, Sample, "Hello", mrb->object_class); - mrb_define_method(mrb,Sample_Hello, "world", mrb_Sample_Hello__world, MRB_ARGS_NONE() ); + struct RClass *ns = mrb_define_module(mrb, "Sample"); + struct RClass *cl = mrb_define_class_under(mrb, ns, "Hello", mrb->object_class); + mrb_define_method(mrb,cl, "world", mrb_Sample_Hello__world, MRB_ARGS_NONE() ); } void diff --git a/yard-mruby.gemspec b/yard-mruby.gemspec index 77e8862..08598a4 100644 --- a/yard-mruby.gemspec +++ b/yard-mruby.gemspec @@ -5,7 +5,7 @@ require 'yard/mruby/version' Gem::Specification.new do |spec| spec.name = "yard-mruby" - spec.version = Yard::Mruby::VERSION + spec.version = YARD::MRuby::VERSION spec.authors = ["Seba Gamboa"] spec.email = ["[email protected]"] |
