yard 0.7.5 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of yard might be problematic. Click here for more details.
- data/.yardopts +10 -2
- data/ChangeLog +1263 -38
- data/LEGAL +5 -5
- data/LICENSE +1 -1
- data/README.md +91 -82
- data/Rakefile +6 -6
- data/benchmarks/builtins_vs_eval.rb +1 -1
- data/benchmarks/erb_vs_erubis.rb +4 -4
- data/benchmarks/generation.rb +5 -5
- data/benchmarks/parsing.rb +2 -2
- data/benchmarks/registry_store_types.rb +48 -0
- data/bin/yard +9 -1
- data/bin/yardoc +9 -1
- data/bin/yri +10 -2
- data/docs/CodeObjects.md +10 -10
- data/docs/GettingStarted.md +85 -83
- data/docs/Handlers.md +21 -21
- data/docs/Overview.md +7 -7
- data/docs/Parser.md +30 -30
- data/docs/Tags.md +250 -554
- data/docs/TagsArch.md +123 -0
- data/docs/Templates.md +58 -80
- data/docs/WhatsNew.md +378 -133
- data/docs/templates/default/fulldoc/html/full_list_tag.erb +7 -0
- data/docs/templates/default/fulldoc/html/setup.rb +6 -0
- data/docs/templates/default/layout/html/setup.rb +8 -0
- data/docs/templates/default/layout/html/tag_list.erb +11 -0
- data/docs/templates/default/yard_tags/html/list.erb +18 -0
- data/docs/templates/default/yard_tags/html/setup.rb +27 -0
- data/docs/templates/plugin.rb +65 -0
- data/lib/yard.rb +1 -10
- data/lib/yard/autoload.rb +75 -27
- data/lib/yard/cli/command.rb +5 -2
- data/lib/yard/cli/command_parser.rb +3 -2
- data/lib/yard/cli/diff.rb +1 -1
- data/lib/yard/cli/i18n.rb +69 -0
- data/lib/yard/cli/list.rb +1 -1
- data/lib/yard/cli/server.rb +30 -7
- data/lib/yard/cli/stats.rb +5 -6
- data/lib/yard/cli/yardoc.rb +95 -45
- data/lib/yard/cli/yri.rb +24 -3
- data/lib/yard/code_objects/base.rb +35 -4
- data/lib/yard/code_objects/extra_file_object.rb +1 -1
- data/lib/yard/code_objects/macro_object.rb +56 -99
- data/lib/yard/code_objects/method_object.rb +44 -6
- data/lib/yard/config.rb +18 -8
- data/lib/yard/core_ext/symbol_hash.rb +1 -1
- data/lib/yard/docstring.rb +45 -85
- data/lib/yard/docstring_parser.rb +269 -0
- data/lib/yard/handlers/base.rb +129 -118
- data/lib/yard/handlers/c/alias_handler.rb +15 -0
- data/lib/yard/handlers/c/attribute_handler.rb +13 -0
- data/lib/yard/handlers/c/base.rb +110 -0
- data/lib/yard/handlers/c/class_handler.rb +26 -0
- data/lib/yard/handlers/c/constant_handler.rb +12 -0
- data/lib/yard/handlers/c/handler_methods.rb +165 -0
- data/lib/yard/handlers/c/init_handler.rb +16 -0
- data/lib/yard/handlers/c/method_handler.rb +35 -0
- data/lib/yard/handlers/c/mixin_handler.rb +13 -0
- data/lib/yard/handlers/c/module_handler.rb +16 -0
- data/lib/yard/handlers/c/override_comment_handler.rb +22 -0
- data/lib/yard/handlers/c/path_handler.rb +10 -0
- data/lib/yard/handlers/c/struct_handler.rb +12 -0
- data/lib/yard/handlers/c/symbol_handler.rb +7 -0
- data/lib/yard/handlers/processor.rb +41 -30
- data/lib/yard/handlers/ruby/alias_handler.rb +0 -2
- data/lib/yard/handlers/ruby/attribute_handler.rb +16 -17
- data/lib/yard/handlers/ruby/base.rb +10 -6
- data/lib/yard/handlers/ruby/comment_handler.rb +9 -0
- data/lib/yard/handlers/ruby/dsl_handler.rb +14 -0
- data/lib/yard/handlers/ruby/dsl_handler_methods.rb +71 -0
- data/lib/yard/handlers/ruby/legacy/alias_handler.rb +0 -3
- data/lib/yard/handlers/ruby/legacy/attribute_handler.rb +16 -17
- data/lib/yard/handlers/ruby/legacy/base.rb +28 -6
- data/lib/yard/handlers/ruby/legacy/comment_handler.rb +9 -0
- data/lib/yard/handlers/ruby/legacy/dsl_handler.rb +16 -0
- data/lib/yard/handlers/ruby/legacy/method_handler.rb +0 -2
- data/lib/yard/handlers/ruby/legacy/mixin_handler.rb +1 -1
- data/lib/yard/handlers/ruby/legacy/module_function_handler.rb +18 -0
- data/lib/yard/handlers/ruby/method_handler.rb +10 -15
- data/lib/yard/handlers/ruby/mixin_handler.rb +1 -1
- data/lib/yard/handlers/ruby/module_function_handler.rb +26 -0
- data/lib/yard/handlers/ruby/struct_handler_methods.rb +3 -2
- data/lib/yard/i18n/pot_generator.rb +281 -0
- data/lib/yard/i18n/text.rb +72 -0
- data/lib/yard/logging.rb +3 -7
- data/lib/yard/options.rb +216 -0
- data/lib/yard/parser/c/c_parser.rb +225 -0
- data/lib/yard/parser/c/comment_parser.rb +131 -0
- data/lib/yard/parser/c/statement.rb +63 -0
- data/lib/yard/parser/ruby/ast_node.rb +91 -1
- data/lib/yard/parser/ruby/legacy/ruby_parser.rb +1 -0
- data/lib/yard/parser/ruby/legacy/statement.rb +7 -2
- data/lib/yard/parser/ruby/legacy/statement_list.rb +13 -22
- data/lib/yard/parser/ruby/ruby_parser.rb +87 -26
- data/lib/yard/parser/source_parser.rb +89 -88
- data/lib/yard/rake/yardoc_task.rb +1 -1
- data/lib/yard/registry.rb +21 -10
- data/lib/yard/registry_store.rb +48 -0
- data/lib/yard/serializers/file_system_serializer.rb +18 -20
- data/lib/yard/serializers/yardoc_serializer.rb +1 -0
- data/lib/yard/server/adapter.rb +2 -2
- data/lib/yard/server/commands/base.rb +1 -1
- data/lib/yard/server/commands/display_object_command.rb +13 -6
- data/lib/yard/server/commands/frames_command.rb +4 -21
- data/lib/yard/server/commands/library_command.rb +57 -11
- data/lib/yard/server/commands/list_command.rb +10 -34
- data/lib/yard/server/commands/search_command.rb +8 -2
- data/lib/yard/server/doc_server_helper.rb +34 -0
- data/lib/yard/server/rack_adapter.rb +5 -1
- data/lib/yard/server/router.rb +4 -10
- data/lib/yard/server/static_caching.rb +2 -2
- data/lib/yard/server/templates/default/fulldoc/html/css/custom.css +2 -2
- data/lib/yard/server/templates/default/fulldoc/html/js/live.js +0 -15
- data/lib/yard/server/templates/default/layout/html/breadcrumb.erb +3 -3
- data/lib/yard/server/templates/default/layout/html/script_setup.erb +8 -0
- data/lib/yard/server/templates/doc_server/processing/html/processing.erb +1 -1
- data/lib/yard/server/templates/doc_server/search/html/setup.rb +1 -1
- data/lib/yard/tags/default_factory.rb +31 -4
- data/lib/yard/tags/directives.rb +593 -0
- data/lib/yard/tags/library.rb +437 -35
- data/lib/yard/templates/engine.rb +17 -12
- data/lib/yard/templates/helpers/base_helper.rb +8 -2
- data/lib/yard/templates/helpers/html_helper.rb +57 -14
- data/lib/yard/templates/helpers/markup/rdoc_markup.rb +1 -1
- data/lib/yard/templates/helpers/markup_helper.rb +9 -9
- data/lib/yard/templates/helpers/text_helper.rb +2 -2
- data/lib/yard/templates/template.rb +42 -13
- data/lib/yard/templates/template_options.rb +81 -0
- data/spec/cli/command_parser_spec.rb +4 -4
- data/spec/cli/command_spec.rb +3 -3
- data/spec/cli/config_spec.rb +13 -13
- data/spec/cli/diff_spec.rb +13 -10
- data/spec/cli/gems_spec.rb +12 -12
- data/spec/cli/help_spec.rb +2 -2
- data/spec/cli/i18n_spec.rb +111 -0
- data/spec/cli/server_spec.rb +66 -18
- data/spec/cli/stats_spec.rb +15 -15
- data/spec/cli/yardoc_spec.rb +124 -97
- data/spec/cli/yri_spec.rb +14 -12
- data/spec/code_objects/base_spec.rb +104 -46
- data/spec/code_objects/class_object_spec.rb +33 -33
- data/spec/code_objects/code_object_list_spec.rb +5 -5
- data/spec/code_objects/constants_spec.rb +4 -3
- data/spec/code_objects/extra_file_object_spec.rb +19 -19
- data/spec/code_objects/macro_object_spec.rb +31 -37
- data/spec/code_objects/method_object_spec.rb +46 -23
- data/spec/code_objects/module_object_spec.rb +16 -16
- data/spec/code_objects/namespace_object_spec.rb +6 -6
- data/spec/code_objects/proxy_spec.rb +19 -19
- data/spec/config_spec.rb +33 -24
- data/spec/core_ext/array_spec.rb +1 -1
- data/spec/core_ext/file_spec.rb +8 -8
- data/spec/core_ext/hash_spec.rb +1 -1
- data/spec/core_ext/insertion_spec.rb +3 -3
- data/spec/core_ext/module_spec.rb +1 -1
- data/spec/core_ext/string_spec.rb +6 -6
- data/spec/core_ext/symbol_hash_spec.rb +11 -11
- data/spec/docstring_parser_spec.rb +207 -0
- data/spec/docstring_spec.rb +33 -146
- data/spec/handlers/alias_handler_spec.rb +14 -14
- data/spec/handlers/attribute_handler_spec.rb +20 -20
- data/spec/handlers/base_spec.rb +16 -16
- data/spec/handlers/c/alias_handler_spec.rb +33 -0
- data/spec/handlers/c/attribute_handler_spec.rb +40 -0
- data/spec/handlers/c/class_handler_spec.rb +64 -0
- data/spec/handlers/c/constant_handler_spec.rb +68 -0
- data/spec/handlers/c/init_handler_spec.rb +36 -0
- data/spec/handlers/c/method_handler_spec.rb +228 -0
- data/spec/handlers/c/mixin_handler_spec.rb +27 -0
- data/spec/handlers/c/module_handler_spec.rb +38 -0
- data/spec/handlers/c/override_comment_handler_spec.rb +43 -0
- data/spec/handlers/c/path_handler_spec.rb +35 -0
- data/spec/handlers/c/spec_helper.rb +11 -0
- data/spec/handlers/c/struct_handler_spec.rb +15 -0
- data/spec/handlers/class_condition_handler_spec.rb +10 -10
- data/spec/handlers/class_handler_spec.rb +38 -38
- data/spec/handlers/class_variable_handler_spec.rb +1 -1
- data/spec/handlers/constant_handler_spec.rb +7 -7
- data/spec/handlers/{macro_handler_spec.rb → dsl_handler_spec.rb} +72 -53
- data/spec/handlers/examples/alias_handler_001.rb.txt +5 -5
- data/spec/handlers/examples/class_condition_handler_001.rb.txt +9 -9
- data/spec/handlers/examples/class_handler_001.rb.txt +1 -1
- data/spec/handlers/examples/dsl_handler_001.rb.txt +110 -0
- data/spec/handlers/examples/exception_handler_001.rb.txt +14 -14
- data/spec/handlers/examples/method_condition_handler_001.rb.txt +2 -2
- data/spec/handlers/examples/method_handler_001.rb.txt +16 -16
- data/spec/handlers/examples/mixin_handler_001.rb.txt +8 -4
- data/spec/handlers/examples/private_constant_handler_001.rb.txt +1 -1
- data/spec/handlers/examples/visibility_handler_001.rb.txt +3 -3
- data/spec/handlers/examples/yield_handler_001.rb.txt +13 -14
- data/spec/handlers/exception_handler_spec.rb +9 -9
- data/spec/handlers/extend_handler_spec.rb +2 -2
- data/spec/handlers/legacy_base_spec.rb +34 -34
- data/spec/handlers/method_condition_handler_spec.rb +2 -2
- data/spec/handlers/method_handler_spec.rb +33 -33
- data/spec/handlers/mixin_handler_spec.rb +13 -9
- data/spec/handlers/module_function_handler_spec.rb +82 -0
- data/spec/handlers/module_handler_spec.rb +6 -6
- data/spec/handlers/private_constant_handler_spec.rb +3 -3
- data/spec/handlers/processor_spec.rb +5 -5
- data/spec/handlers/ruby/base_spec.rb +10 -6
- data/spec/handlers/ruby/legacy/base_spec.rb +11 -7
- data/spec/handlers/spec_helper.rb +2 -3
- data/spec/handlers/visibility_handler_spec.rb +6 -6
- data/spec/handlers/yield_handler_spec.rb +8 -8
- data/spec/i18n/pot_generator_spec.rb +244 -0
- data/spec/i18n/text_spec.rb +69 -0
- data/spec/options_spec.rb +160 -0
- data/spec/parser/base_spec.rb +3 -3
- data/spec/parser/c_parser_spec.rb +31 -257
- data/spec/parser/examples/array.c.txt +187 -187
- data/spec/parser/examples/extrafile.c.txt +1 -1
- data/spec/parser/examples/override.c.txt +1 -1
- data/spec/parser/ruby/ast_node_spec.rb +1 -1
- data/spec/parser/ruby/legacy/statement_list_spec.rb +24 -24
- data/spec/parser/ruby/legacy/token_list_spec.rb +7 -7
- data/spec/parser/ruby/ruby_parser_spec.rb +56 -34
- data/spec/parser/source_parser_spec.rb +125 -65
- data/spec/parser/tag_parsing_spec.rb +4 -4
- data/spec/rake/yardoc_task_spec.rb +10 -8
- data/spec/registry_spec.rb +65 -36
- data/spec/registry_store_spec.rb +90 -40
- data/spec/serializers/file_system_serializer_spec.rb +12 -12
- data/spec/serializers/yardoc_serializer_spec.rb +2 -2
- data/spec/server/adapter_spec.rb +3 -3
- data/spec/server/commands/base_spec.rb +8 -8
- data/spec/server/commands/library_command_spec.rb +3 -3
- data/spec/server/commands/static_file_command_spec.rb +7 -7
- data/spec/server/doc_server_helper_spec.rb +1 -1
- data/spec/server/doc_server_serializer_spec.rb +6 -6
- data/spec/server/rack_adapter_spec.rb +3 -3
- data/spec/server/router_spec.rb +19 -19
- data/spec/server/static_caching_spec.rb +4 -4
- data/spec/spec_helper.rb +7 -7
- data/spec/tags/default_factory_spec.rb +24 -16
- data/spec/tags/directives_spec.rb +422 -0
- data/spec/tags/library_spec.rb +15 -4
- data/spec/tags/overload_tag_spec.rb +6 -6
- data/spec/tags/ref_tag_list_spec.rb +8 -8
- data/spec/templates/class_spec.rb +7 -7
- data/spec/templates/constant_spec.rb +7 -7
- data/spec/templates/engine_spec.rb +28 -36
- data/spec/templates/examples/class001.html +108 -108
- data/spec/templates/examples/class002.html +17 -17
- data/spec/templates/examples/constant001.txt +1 -1
- data/spec/templates/examples/method001.html +45 -45
- data/spec/templates/examples/method002.html +25 -25
- data/spec/templates/examples/method003.html +60 -60
- data/spec/templates/examples/method004.html +7 -7
- data/spec/templates/examples/method005.html +28 -28
- data/spec/templates/examples/module001.html +321 -321
- data/spec/templates/examples/module001.txt +1 -1
- data/spec/templates/examples/module002.html +130 -130
- data/spec/templates/examples/module003.html +74 -74
- data/spec/templates/examples/module004.html +388 -0
- data/spec/templates/helpers/base_helper_spec.rb +32 -32
- data/spec/templates/helpers/html_helper_spec.rb +87 -68
- data/spec/templates/helpers/html_syntax_highlight_helper_spec.rb +9 -9
- data/spec/templates/helpers/markup/rdoc_markup_spec.rb +16 -16
- data/spec/templates/helpers/markup_helper_spec.rb +31 -28
- data/spec/templates/helpers/method_helper_spec.rb +7 -7
- data/spec/templates/helpers/shared_signature_examples.rb +9 -7
- data/spec/templates/helpers/text_helper_spec.rb +3 -3
- data/spec/templates/method_spec.rb +13 -13
- data/spec/templates/module_spec.rb +70 -24
- data/spec/templates/onefile_spec.rb +32 -15
- data/spec/templates/section_spec.rb +23 -23
- data/spec/templates/spec_helper.rb +31 -1
- data/spec/templates/tag_spec.rb +5 -5
- data/spec/templates/template_spec.rb +54 -46
- data/spec/verifier_spec.rb +5 -5
- data/templates/default/class/setup.rb +2 -2
- data/templates/default/docstring/html/abstract.erb +1 -1
- data/templates/default/docstring/html/note.erb +1 -1
- data/templates/default/docstring/html/private.erb +1 -1
- data/templates/default/docstring/html/todo.erb +1 -1
- data/templates/default/docstring/setup.rb +2 -2
- data/templates/default/fulldoc/html/css/full_list.css +4 -2
- data/templates/default/fulldoc/html/css/style.css +50 -44
- data/templates/default/fulldoc/html/frames.erb +21 -6
- data/templates/default/fulldoc/html/full_list.erb +5 -3
- data/templates/default/fulldoc/html/{full_list_files.erb → full_list_file.erb} +0 -0
- data/templates/default/fulldoc/html/js/app.js +29 -26
- data/templates/default/fulldoc/html/js/full_list.js +9 -9
- data/templates/default/fulldoc/html/js/jquery.js +4 -16
- data/templates/default/fulldoc/html/setup.rb +42 -38
- data/templates/default/layout/dot/header.erb +1 -1
- data/templates/default/layout/html/breadcrumb.erb +6 -6
- data/templates/default/layout/html/files.erb +1 -1
- data/templates/default/layout/html/footer.erb +1 -1
- data/templates/default/layout/html/headers.erb +3 -6
- data/templates/default/layout/html/index.erb +1 -1
- data/templates/default/layout/html/layout.erb +3 -7
- data/templates/default/layout/html/objects.erb +1 -1
- data/templates/default/layout/html/script_setup.erb +5 -0
- data/templates/default/layout/html/search.erb +4 -1
- data/templates/default/layout/html/setup.rb +8 -8
- data/templates/default/method_details/html/method_signature.erb +10 -3
- data/templates/default/method_details/setup.rb +1 -0
- data/templates/default/module/dot/info.erb +1 -1
- data/templates/default/module/dot/setup.rb +2 -2
- data/templates/default/module/html/attribute_details.erb +1 -1
- data/templates/default/module/html/children.erb +1 -1
- data/templates/default/module/html/defines.erb +1 -1
- data/templates/default/module/html/inherited_methods.erb +5 -4
- data/templates/default/module/html/item_summary.erb +15 -5
- data/templates/default/module/html/method_details_list.erb +2 -2
- data/templates/default/module/setup.rb +25 -12
- data/templates/default/module/text/setup.rb +1 -1
- data/templates/default/onefile/html/layout.erb +1 -1
- data/templates/default/onefile/html/setup.rb +2 -2
- data/templates/default/tags/html/example.erb +4 -2
- data/templates/default/tags/html/option.erb +1 -1
- data/templates/default/tags/html/overload.erb +1 -1
- data/templates/default/tags/html/see.erb +1 -1
- data/templates/default/tags/html/tag.erb +1 -1
- data/templates/default/tags/setup.rb +4 -3
- data/templates/guide/fulldoc/html/css/style.css +8 -8
- data/templates/guide/fulldoc/html/js/app.js +6 -6
- data/templates/guide/fulldoc/html/setup.rb +12 -12
- data/templates/guide/layout/html/layout.erb +11 -11
- data/templates/guide/layout/html/setup.rb +9 -9
- data/templates/guide/method/html/header.erb +2 -2
- data/templates/guide/method/html/setup.rb +1 -1
- metadata +68 -18
- data/bin/yard-graph +0 -4
- data/bin/yard-server +0 -4
- data/docs/Glossary.md +0 -12
- data/lib/yard/handlers/ruby/legacy/macro_handler.rb +0 -39
- data/lib/yard/handlers/ruby/macro_handler.rb +0 -40
- data/lib/yard/handlers/ruby/macro_handler_methods.rb +0 -131
- data/lib/yard/parser/c_parser.rb +0 -497
- data/lib/yard/server/templates/default/layout/html/headers.erb +0 -16
- data/lib/yard/server/templates/doc_server/frames/html/frames.erb +0 -13
- data/lib/yard/server/templates/doc_server/frames/html/setup.rb +0 -3
- data/lib/yard/server/templates/doc_server/full_list/html/full_list.erb +0 -34
- data/lib/yard/server/templates/doc_server/full_list/html/setup.rb +0 -20
- data/spec/handlers/examples/macro_handler_001.rb.txt +0 -83
@@ -0,0 +1,26 @@
|
|
1
|
+
class YARD::Handlers::C::ClassHandler < YARD::Handlers::C::Base
|
2
|
+
MATCH1 = /([\w\.]+)\s* = \s*(?:rb_define_class|boot_defclass)\s*
|
3
|
+
\(
|
4
|
+
\s*"([\w:]+)",
|
5
|
+
\s*(\w+|0)\s*
|
6
|
+
\)/mx
|
7
|
+
|
8
|
+
MATCH2 = /([\w\.]+)\s* = \s*rb_define_class_under\s*
|
9
|
+
\(
|
10
|
+
\s*(\w+),
|
11
|
+
\s*"(\w+)"(?:,
|
12
|
+
\s*([\w\*\s\(\)\.\->]+)\s*)? # for SWIG
|
13
|
+
\s*\)/mx
|
14
|
+
handles MATCH1
|
15
|
+
handles MATCH2
|
16
|
+
statement_class BodyStatement
|
17
|
+
|
18
|
+
process do
|
19
|
+
statement.source.scan(MATCH1) do |var_name, class_name, parent|
|
20
|
+
handle_class(var_name, class_name, parent)
|
21
|
+
end
|
22
|
+
statement.source.scan(MATCH2) do |var_name, in_module, class_name, parent|
|
23
|
+
handle_class(var_name, class_name, parent, in_module)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
class YARD::Handlers::C::ConstantHandler < YARD::Handlers::C::Base
|
2
|
+
MATCH = %r{\brb_define_((?:readonly_)?variable|(?:global_)?const)
|
3
|
+
\s*\((?:\s*(\w+),)?\s*"(\w+)",\s*(.*?)\s*\)\s*;}xm
|
4
|
+
handles MATCH
|
5
|
+
statement_class BodyStatement
|
6
|
+
|
7
|
+
process do
|
8
|
+
statement.source.scan(MATCH) do |type, var_name, const_name, value|
|
9
|
+
handle_constants(type, var_name, const_name, value)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,165 @@
|
|
1
|
+
module YARD
|
2
|
+
module Handlers
|
3
|
+
module C
|
4
|
+
module HandlerMethods
|
5
|
+
include Parser::C
|
6
|
+
include CodeObjects
|
7
|
+
|
8
|
+
def handle_class(var_name, class_name, parent, in_module = nil)
|
9
|
+
parent = nil if parent == "0"
|
10
|
+
namespace = in_module ? namespace_for_variable(in_module) : Registry.root
|
11
|
+
register ClassObject.new(namespace, class_name) do |obj|
|
12
|
+
if parent
|
13
|
+
parent_class = namespace_for_variable(parent)
|
14
|
+
if parent_class.is_a?(Proxy)
|
15
|
+
obj.superclass = "::#{parent_class.path}"
|
16
|
+
obj.superclass.type = :class
|
17
|
+
else
|
18
|
+
obj.superclass = parent_class
|
19
|
+
end
|
20
|
+
end
|
21
|
+
namespaces[var_name] = obj
|
22
|
+
register_file_info(obj, statement.file, statement.line)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def handle_module(var_name, module_name, in_module = nil)
|
27
|
+
namespace = in_module ? namespace_for_variable(in_module) : Registry.root
|
28
|
+
register ModuleObject.new(namespace, module_name) do |obj|
|
29
|
+
namespaces[var_name] = obj
|
30
|
+
register_file_info(obj, statement.file, statement.line)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def handle_method(scope, var_name, name, func_name, source_file = nil)
|
35
|
+
visibility = :public
|
36
|
+
case scope
|
37
|
+
when "singleton_method"; scope = :class
|
38
|
+
when "module_function"; scope = :module
|
39
|
+
when "private_method"; scope = :instance; visibility = :private
|
40
|
+
else; scope = :instance
|
41
|
+
end
|
42
|
+
|
43
|
+
namespace = namespace_for_variable(var_name)
|
44
|
+
return if namespace.nil? # XXX: raise UndocumentableError might be too noisy.
|
45
|
+
register MethodObject.new(namespace, name, scope) do |obj|
|
46
|
+
register_visibility(obj, visibility)
|
47
|
+
find_method_body(obj, func_name)
|
48
|
+
obj.docstring.add_tag(Tags::Tag.new(:return, '', 'Boolean')) if name =~ /\?$/
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def handle_attribute(var_name, name, read, write)
|
53
|
+
values = {:read => read.to_i, :write => write.to_i}
|
54
|
+
{:read => name, :write => "#{name}="}.each do |type, meth_name|
|
55
|
+
next unless values[type] > 0
|
56
|
+
obj = handle_method(:instance, var_name, meth_name, nil)
|
57
|
+
obj.namespace.attributes[:instance][name] ||= SymbolHash[:read => nil, :write => nil]
|
58
|
+
obj.namespace.attributes[:instance][name][type] = obj
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def handle_alias(var_name, new_name, old_name)
|
63
|
+
namespace = namespace_for_variable(var_name)
|
64
|
+
new_meth, old_meth = new_name.to_sym, old_name.to_sym
|
65
|
+
old_obj = namespace.child(:name => old_meth, :scope => :instance)
|
66
|
+
new_obj = register MethodObject.new(namespace, new_meth, :instance) do |o|
|
67
|
+
register_visibility(o, visibility)
|
68
|
+
register_file_info(o, statement.file, statement.line)
|
69
|
+
end
|
70
|
+
|
71
|
+
if old_obj
|
72
|
+
new_obj.signature = old_obj.signature
|
73
|
+
new_obj.source = old_obj.source
|
74
|
+
new_obj.docstring = old_obj.docstring
|
75
|
+
new_obj.docstring.object = new_obj
|
76
|
+
else
|
77
|
+
new_obj.signature = "def #{new_meth}" # this is all we know.
|
78
|
+
end
|
79
|
+
|
80
|
+
namespace.aliases[new_obj] = old_meth
|
81
|
+
end
|
82
|
+
|
83
|
+
def handle_constants(type, var_name, const_name, value)
|
84
|
+
return unless type == 'const'
|
85
|
+
namespace = namespace_for_variable(var_name)
|
86
|
+
register ConstantObject.new(namespace, const_name) do |obj|
|
87
|
+
obj.source_type = :c
|
88
|
+
obj.value = value
|
89
|
+
register_file_info(obj, statement.file, statement.line)
|
90
|
+
find_constant_docstring(obj)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
private
|
95
|
+
|
96
|
+
def find_constant_docstring(object)
|
97
|
+
comment = nil
|
98
|
+
|
99
|
+
# look inside overrides for declaration value
|
100
|
+
override_comments.each do |name, override_comment|
|
101
|
+
next unless override_comment.file == statement.file
|
102
|
+
just_const_name = name.gsub(/\A.+::/, '')
|
103
|
+
if object.path == name || object.name.to_s == just_const_name
|
104
|
+
comment = override_comment.source
|
105
|
+
stmt = override_comment
|
106
|
+
break
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
# use any comments on this statement as a last resort
|
111
|
+
if comment.nil? && statement.comments && statement.comments.source =~ /\S/
|
112
|
+
comment = statement.comments.source
|
113
|
+
stmt = statement.comments
|
114
|
+
end
|
115
|
+
|
116
|
+
# In the case of rb_define_const, the definition and comment are in
|
117
|
+
# "/* definition: comment */" form. The literal ':' and '\' characters
|
118
|
+
# can be escaped with a backslash.
|
119
|
+
if comment
|
120
|
+
comment.scan(/\A\s*(.*?[^\s\\]):\s*(.+)/m) do |new_value, new_comment|
|
121
|
+
object.value = new_value.gsub(/\\:/, ':')
|
122
|
+
comment = new_comment
|
123
|
+
end
|
124
|
+
register_docstring(object, comment, stmt)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
def find_method_body(object, symbol)
|
129
|
+
file, in_file = statement.file, false
|
130
|
+
if statement.comments && statement.comments.source =~ /\A\s*in (\S+)\Z/
|
131
|
+
file, in_file = $1, true
|
132
|
+
process_file(file, object)
|
133
|
+
end
|
134
|
+
|
135
|
+
if src_stmt = symbols[symbol]
|
136
|
+
register_file_info(object, src_stmt.file, src_stmt.line, true)
|
137
|
+
register_source(object, src_stmt)
|
138
|
+
unless src_stmt.comments.nil? || src_stmt.comments.source.empty?
|
139
|
+
register_docstring(object, src_stmt.comments.source, src_stmt)
|
140
|
+
return # found docstring
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
# found source (possibly) but no docstring
|
145
|
+
# so look in overrides
|
146
|
+
override_comments.each do |name, override_comment|
|
147
|
+
next unless override_comment.file == file
|
148
|
+
name = name.gsub(/::([^:]+?)\Z/, '.\1')
|
149
|
+
just_method_name = name.gsub(/\A.+(#|::|\.)/, '')
|
150
|
+
just_method_name = 'initialize' if just_method_name == 'new'
|
151
|
+
if object.path == name || object.name.to_s == just_method_name
|
152
|
+
register_docstring(object, override_comment.source, override_comment)
|
153
|
+
return
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
# use any comments on this statement as a last resort
|
158
|
+
if !in_file && statement.comments && statement.comments.source =~ /\S/
|
159
|
+
register_docstring(object, statement.comments.source, statement)
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# Handles the Init_Libname() method
|
2
|
+
class YARD::Handlers::C::InitHandler < YARD::Handlers::C::Base
|
3
|
+
MATCH = %r{\A\s*(?:static\s+)?void\s+[Ii]nit_(\w+)\s*}
|
4
|
+
handles MATCH
|
5
|
+
statement_class ToplevelStatement
|
6
|
+
|
7
|
+
process do
|
8
|
+
parse_block
|
9
|
+
ns = namespace_for_variable(statement.declaration[MATCH, 1])
|
10
|
+
if ns.is_a?(YARD::CodeObjects::NamespaceObject) && ns.docstring.blank?
|
11
|
+
if statement.comments
|
12
|
+
register_docstring(ns, statement.comments.source, statement)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
class YARD::Handlers::C::MethodHandler < YARD::Handlers::C::Base
|
2
|
+
MATCH1 = %r{rb_define_
|
3
|
+
(
|
4
|
+
singleton_method |
|
5
|
+
method |
|
6
|
+
module_function |
|
7
|
+
private_method
|
8
|
+
)
|
9
|
+
\s*\(\s*([\w\.]+),
|
10
|
+
\s*"([^"]+)",
|
11
|
+
\s*(?:RUBY_METHOD_FUNC\(|VALUEFUNC\()?(\w+)\)?,
|
12
|
+
\s*(-?\w+)\s*\)}xm
|
13
|
+
MATCH2 = %r{rb_define_global_function\s*\(
|
14
|
+
\s*"([^"]+)",
|
15
|
+
\s*(?:RUBY_METHOD_FUNC\(|VALUEFUNC\()?(\w+)\)?,
|
16
|
+
\s*(-?\w+)\s*\)}xm
|
17
|
+
handles MATCH1
|
18
|
+
handles MATCH2
|
19
|
+
statement_class BodyStatement
|
20
|
+
|
21
|
+
process do
|
22
|
+
statement.source.scan(MATCH1) do |type, var_name, name, func_name, param_count|
|
23
|
+
break if var_name == "ruby_top_self"
|
24
|
+
break if var_name == "nstr"
|
25
|
+
break if var_name == "envtbl"
|
26
|
+
|
27
|
+
var_name = "rb_cObject" if var_name == "rb_mKernel"
|
28
|
+
handle_method(type, var_name, name, func_name)
|
29
|
+
end
|
30
|
+
|
31
|
+
statement.source.scan(MATCH2) do |name, func_name, param_count|
|
32
|
+
handle_method("method", "rb_mKernel", name, func_name)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class YARD::Handlers::C::MixinHandler < YARD::Handlers::C::Base
|
2
|
+
MATCH = /rb_include_module\s*\(\s*(\w+?),\s*(\w+?)\s*\)/
|
3
|
+
handles MATCH
|
4
|
+
statement_class BodyStatement
|
5
|
+
|
6
|
+
process do
|
7
|
+
statement.source.scan(MATCH) do |klass_var, mixin_var|
|
8
|
+
namespace = namespace_for_variable(klass_var)
|
9
|
+
ensure_loaded!(namespace)
|
10
|
+
namespace.mixins(:instance) << namespace_for_variable(mixin_var)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class YARD::Handlers::C::ModuleHandler < YARD::Handlers::C::Base
|
2
|
+
MATCH1 = /([\w\.]+)\s* = \s*rb_define_module\s*\(\s*"([\w:]+)"\s*\)/mx
|
3
|
+
MATCH2 = /([\w\.]+)\s* = \s*rb_define_module_under\s*\(\s*(\w+),\s*"(\w+)"\s*\)/mx
|
4
|
+
handles MATCH1
|
5
|
+
handles MATCH2
|
6
|
+
statement_class BodyStatement
|
7
|
+
|
8
|
+
process do
|
9
|
+
statement.source.scan(MATCH1) do |var_name, module_name|
|
10
|
+
handle_module(var_name, module_name)
|
11
|
+
end
|
12
|
+
statement.source.scan(MATCH2) do |var_name, in_module, module_name|
|
13
|
+
handle_module(var_name, module_name, in_module)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# Parses comments
|
2
|
+
class YARD::Handlers::C::OverrideCommentHandler < YARD::Handlers::C::Base
|
3
|
+
handles %r{.}
|
4
|
+
statement_class Comment
|
5
|
+
|
6
|
+
process do
|
7
|
+
return if statement.overrides.empty?
|
8
|
+
statement.overrides.each do |type, name|
|
9
|
+
override_comments << [name, statement]
|
10
|
+
obj = nil
|
11
|
+
case type
|
12
|
+
when :class
|
13
|
+
name, superclass = *name.split(/\s*<\s*/)
|
14
|
+
obj = YARD::CodeObjects::ClassObject.new(:root, name)
|
15
|
+
obj.superclass = "::#{superclass}" if superclass
|
16
|
+
when :module
|
17
|
+
obj = YARD::CodeObjects::ModuleObject.new(:root, name)
|
18
|
+
end
|
19
|
+
register_docstring(obj, statement.source, statement) if obj
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
class YARD::Handlers::C::PathHandler < YARD::Handlers::C::Base
|
2
|
+
MATCH = /([\w\.]+)\s* = \s*rb_path2class\s*\(\s*"([\w:]+)"\)/mx
|
3
|
+
handles MATCH
|
4
|
+
|
5
|
+
process do
|
6
|
+
statement.source.scan(MATCH) do |var_name, path|
|
7
|
+
namespaces[var_name] = P(path)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
class YARD::Handlers::C::StructHandler < YARD::Handlers::C::Base
|
2
|
+
MATCH = /([\w\.]+)\s*=\s*(?:rb_struct_define_without_accessor)\s*
|
3
|
+
\(\s*"([\w:]+)"\s*,\s*(\w+)\s*/mx
|
4
|
+
handles MATCH
|
5
|
+
statement_class BodyStatement
|
6
|
+
|
7
|
+
process do
|
8
|
+
statement.source.scan(MATCH) do |var_name, class_name, parent|
|
9
|
+
handle_class(var_name, class_name, parent)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,7 @@
|
|
1
|
+
# Keeps track of function bodies for symbol lookup during Ruby method declarations
|
2
|
+
class YARD::Handlers::C::SymbolHandler < YARD::Handlers::C::Base
|
3
|
+
MATCH = %r{\A\s*(?:(?:static|SWIGINTERN)\s+)?(?:intern\s+)?VALUE\s+(\w+)\s*\(}
|
4
|
+
handles MATCH
|
5
|
+
statement_class ToplevelStatement
|
6
|
+
process { symbols[statement.source[MATCH, 1]] = statement }
|
7
|
+
end
|
@@ -35,6 +35,7 @@ module YARD
|
|
35
35
|
|
36
36
|
register_handler_namespace :ruby, Ruby
|
37
37
|
register_handler_namespace :ruby18, Ruby::Legacy
|
38
|
+
register_handler_namespace :c, C
|
38
39
|
|
39
40
|
# @return [String] the filename
|
40
41
|
attr_accessor :file
|
@@ -54,22 +55,19 @@ module YARD
|
|
54
55
|
# is set as the owner, in case any extra method information is processed.
|
55
56
|
attr_accessor :owner
|
56
57
|
|
57
|
-
# @return [Boolean] whether or not {Parser::LoadOrderError} is raised
|
58
|
-
attr_accessor :load_order_errors
|
59
|
-
|
60
58
|
# @return [Symbol] the parser type (:ruby, :ruby18, :c)
|
61
59
|
attr_accessor :parser_type
|
62
|
-
|
63
|
-
# Handlers can share state for the entire post processing stage through
|
60
|
+
|
61
|
+
# Handlers can share state for the entire post processing stage through
|
64
62
|
# this attribute. Note that post processing stage spans multiple files.
|
65
63
|
# To share state only within a single file, use {#extra_state}
|
66
|
-
#
|
64
|
+
#
|
67
65
|
# @example Sharing state among two handlers
|
68
66
|
# class Handler1 < YARD::Handlers::Ruby::Base
|
69
67
|
# handles :class
|
70
68
|
# process { globals.foo = :bar }
|
71
69
|
# end
|
72
|
-
#
|
70
|
+
#
|
73
71
|
# class Handler2 < YARD::Handlers::Ruby::Base
|
74
72
|
# handles :method
|
75
73
|
# process { puts globals.foo }
|
@@ -77,41 +75,29 @@ module YARD
|
|
77
75
|
# @return [OpenStruct] global shared state for post-processing stage
|
78
76
|
# @see #extra_state
|
79
77
|
attr_accessor :globals
|
80
|
-
|
78
|
+
|
81
79
|
# Share state across different handlers inside of a file.
|
82
80
|
# This attribute is similar to {#visibility}, {#scope}, {#namespace}
|
83
81
|
# and {#owner}, in that they all maintain state across all handlers
|
84
82
|
# for the entire source file. Use this attribute to store any data
|
85
83
|
# your handler might need to save during the parsing of a file. If
|
86
84
|
# you need to save state across files, see {#globals}.
|
87
|
-
#
|
85
|
+
#
|
88
86
|
# @return [OpenStruct] an open structure that can store arbitrary data
|
89
87
|
# @see #globals
|
90
88
|
attr_accessor :extra_state
|
91
89
|
|
92
90
|
# Creates a new Processor for a +file+.
|
93
|
-
#
|
94
|
-
|
95
|
-
|
96
|
-
# @param [Boolean] load_order_error whether or not to raise {Parser::LoadOrderError}
|
97
|
-
# when a file has unresolved references that need to be parsed first.
|
98
|
-
# If these errors are raised, the processor will attempt to load all
|
99
|
-
# other files before continuing to parse the file.
|
100
|
-
# @param [Symbol] parser_type the parser type (:ruby, :ruby18, :c) from
|
101
|
-
# the parser. Used to select the handler (since handlers are specific
|
102
|
-
# to a parser type).
|
103
|
-
# @param [OpenStruct] globals the object holding all state during the
|
104
|
-
# post processing stage
|
105
|
-
def initialize(file = nil, load_order_errors = false, parser_type = Parser::SourceParser.parser_type, globals = nil)
|
106
|
-
@file = file || "(stdin)"
|
91
|
+
# @param [SourceParser] parser the parser used to initialize the processor
|
92
|
+
def initialize(parser)
|
93
|
+
@file = parser.file || "(stdin)"
|
107
94
|
@namespace = YARD::Registry.root
|
108
95
|
@visibility = :public
|
109
96
|
@scope = :instance
|
110
97
|
@owner = @namespace
|
111
|
-
@
|
112
|
-
@parser_type = parser_type
|
98
|
+
@parser_type = parser.parser_type
|
113
99
|
@handlers_loaded = {}
|
114
|
-
@globals = globals || OpenStruct.new
|
100
|
+
@globals = parser.globals || OpenStruct.new
|
115
101
|
@extra_state = OpenStruct.new
|
116
102
|
load_handlers
|
117
103
|
end
|
@@ -126,8 +112,6 @@ module YARD
|
|
126
112
|
find_handlers(stmt).each do |handler|
|
127
113
|
begin
|
128
114
|
handler.new(self, stmt).process
|
129
|
-
rescue Parser::LoadOrderError => loaderr
|
130
|
-
raise # Pass this up
|
131
115
|
rescue NamespaceMissingError => missingerr
|
132
116
|
log.warn "The #{missingerr.object.type} #{missingerr.object.path} has not yet been recognized."
|
133
117
|
log.warn "If this class/method is part of your source tree, this will affect your documentation results."
|
@@ -145,6 +129,19 @@ module YARD
|
|
145
129
|
end
|
146
130
|
end
|
147
131
|
|
132
|
+
# Continue parsing the remainder of the files in the +globals.ordered_parser+
|
133
|
+
# object. After the remainder of files are parsed, processing will continue
|
134
|
+
# on the current file.
|
135
|
+
#
|
136
|
+
# @return [void]
|
137
|
+
# @see Parser::OrderedParser
|
138
|
+
def parse_remaining_files
|
139
|
+
if globals.ordered_parser
|
140
|
+
globals.ordered_parser.parse
|
141
|
+
log.debug("Re-processing #{@file}...")
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
148
145
|
# Searches for all handlers in {Base.subclasses} that match the +statement+
|
149
146
|
#
|
150
147
|
# @param statement the statement object to match.
|
@@ -153,12 +150,21 @@ module YARD
|
|
153
150
|
Base.subclasses.find_all do |handler|
|
154
151
|
handler_base_class > handler &&
|
155
152
|
(handler.namespace_only? ? owner.is_a?(CodeObjects::NamespaceObject) : true) &&
|
156
|
-
|
153
|
+
handles?(handler, statement)
|
157
154
|
end
|
158
155
|
end
|
159
156
|
|
160
157
|
private
|
161
158
|
|
159
|
+
def handles?(handler, statement)
|
160
|
+
return false unless handler.matches_file?(file)
|
161
|
+
if handler.method(:handles?).arity == 1
|
162
|
+
handler.handles?(statement)
|
163
|
+
elsif [-1, 2].include?(handler.method(:handles?).arity)
|
164
|
+
handler.handles?(statement, self)
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
162
168
|
# Returns the handler base class
|
163
169
|
# @return [Base] the base class
|
164
170
|
def handler_base_class
|
@@ -179,7 +185,12 @@ module YARD
|
|
179
185
|
# @return [void]
|
180
186
|
def load_handlers
|
181
187
|
return if @handlers_loaded[parser_type]
|
182
|
-
handler_base_namespace.constants.each
|
188
|
+
handler_base_namespace.constants.each do |c|
|
189
|
+
const = handler_base_namespace.const_get(c)
|
190
|
+
unless Handlers::Base.subclasses.include?(const)
|
191
|
+
Handlers::Base.subclasses << const
|
192
|
+
end
|
193
|
+
end
|
183
194
|
@handlers_loaded[parser_type] = true
|
184
195
|
end
|
185
196
|
end
|