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,225 @@
|
|
1
|
+
module YARD
|
2
|
+
module Parser
|
3
|
+
module C
|
4
|
+
class CParser < Base
|
5
|
+
def initialize(source, file = '(stdin)')
|
6
|
+
@file = file
|
7
|
+
@namespaces = {}
|
8
|
+
@content = source
|
9
|
+
@index = 0
|
10
|
+
@line = 1
|
11
|
+
@state = nil
|
12
|
+
@newline = true
|
13
|
+
@statements = []
|
14
|
+
@last_comment = nil
|
15
|
+
@last_statement = nil
|
16
|
+
end
|
17
|
+
|
18
|
+
def parse
|
19
|
+
parse_toplevel
|
20
|
+
enumerator
|
21
|
+
end
|
22
|
+
|
23
|
+
def enumerator
|
24
|
+
@statements
|
25
|
+
end
|
26
|
+
|
27
|
+
def tokenize
|
28
|
+
raise NotImplementedError, "no tokenization support for C/C++ files"
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def parse_toplevel
|
34
|
+
advance_loop do
|
35
|
+
case char
|
36
|
+
when /['"]/; consume_quote(char)
|
37
|
+
when '#'; consume_directive
|
38
|
+
when '/'; consume_comment
|
39
|
+
when /\s/; consume_whitespace
|
40
|
+
else consume_toplevel_statement
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def consume_quote(type = '"')
|
46
|
+
advance
|
47
|
+
advance_loop do
|
48
|
+
case char
|
49
|
+
when "\n"; advance; nextline
|
50
|
+
when '\\'; advance(2)
|
51
|
+
when type; advance; return
|
52
|
+
else advance
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def consume_directive
|
58
|
+
return unless @newline
|
59
|
+
@last_comment = nil
|
60
|
+
@last_statement = nil
|
61
|
+
advance_loop do
|
62
|
+
if char == '\\' && nextchar =~ /[\r\n]/
|
63
|
+
advance_loop { advance; break(nextline) if char == "\n" }
|
64
|
+
elsif char == "\n"
|
65
|
+
return
|
66
|
+
end
|
67
|
+
advance
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def consume_toplevel_statement
|
72
|
+
@newline = false
|
73
|
+
start = @index
|
74
|
+
line = @line
|
75
|
+
decl = consume_until(/[{;]/)
|
76
|
+
return nil if decl =~ /\A\s*\Z/
|
77
|
+
statement = ToplevelStatement.new(nil, @file, line)
|
78
|
+
@statements << statement
|
79
|
+
attach_comment(statement)
|
80
|
+
stmts = nil
|
81
|
+
if prevchar == '{'
|
82
|
+
stmts = consume_body_statements
|
83
|
+
consume_until(';') if decl =~ /\A(typedef|enum|class|struct|union)\b/
|
84
|
+
end
|
85
|
+
statement.source = @content[start..@index]
|
86
|
+
statement.block = stmts
|
87
|
+
statement.declaration = decl
|
88
|
+
end
|
89
|
+
|
90
|
+
def consume_body_statements
|
91
|
+
stmts = []
|
92
|
+
brace_level = 1
|
93
|
+
while true
|
94
|
+
strip_non_statement_data
|
95
|
+
start, line = @index, @line
|
96
|
+
consume_until(/[{};]/)
|
97
|
+
brace_level += 1 if prevchar == '{'
|
98
|
+
brace_level -= 1 if prevchar == '}'
|
99
|
+
|
100
|
+
break if prevchar.empty? || (brace_level <= 0 && prevchar == '}')
|
101
|
+
end_chr = @index
|
102
|
+
end_chr -= 1 if prevchar == '}'
|
103
|
+
src = @content[start...@index]
|
104
|
+
if src && src !~ /\A\s*\Z|\A\}\Z/
|
105
|
+
stmt = BodyStatement.new(src, @file, line)
|
106
|
+
attach_comment(stmt)
|
107
|
+
stmts << stmt
|
108
|
+
end
|
109
|
+
end
|
110
|
+
stmts
|
111
|
+
end
|
112
|
+
|
113
|
+
def strip_non_statement_data
|
114
|
+
start = @index
|
115
|
+
begin
|
116
|
+
start = @index
|
117
|
+
case char
|
118
|
+
when /\s/; consume_whitespace
|
119
|
+
when '#'; consume_directive
|
120
|
+
when '/'; consume_comment
|
121
|
+
end
|
122
|
+
end until start == @index
|
123
|
+
end
|
124
|
+
|
125
|
+
def consume_whitespace
|
126
|
+
advance_loop { nextline if char == "\n"; break if char =~ /\S/; advance }
|
127
|
+
end
|
128
|
+
|
129
|
+
def consume_comment(add_comment = true)
|
130
|
+
return(advance) unless nextchar == '*' || nextchar == '/'
|
131
|
+
line = @line
|
132
|
+
type = nextchar == '*' ? :multi : :line
|
133
|
+
advance(2)
|
134
|
+
comment = ""
|
135
|
+
advance_loop do
|
136
|
+
comment << char
|
137
|
+
if type == :multi
|
138
|
+
nextline if char == "\n"
|
139
|
+
if char(2) == '*/'
|
140
|
+
if add_comment
|
141
|
+
comment << '/'
|
142
|
+
stmt = Comment.new(comment, @file, line)
|
143
|
+
stmt.type = type
|
144
|
+
attach_comment(stmt)
|
145
|
+
@statements << stmt
|
146
|
+
end
|
147
|
+
return advance(2)
|
148
|
+
end
|
149
|
+
elsif char == "\n"
|
150
|
+
if add_comment
|
151
|
+
stmt = Comment.new(comment[0...-1], @file, line)
|
152
|
+
stmt.type = type
|
153
|
+
attach_comment(stmt)
|
154
|
+
@statements << stmt
|
155
|
+
end
|
156
|
+
return
|
157
|
+
end
|
158
|
+
advance
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
def consume_until(end_char, bracket_level = 0, brace_level = 0, add_comment = true)
|
163
|
+
end_char = /#{end_char}/ if end_char.is_a?(String)
|
164
|
+
start = @index
|
165
|
+
advance_loop do
|
166
|
+
chr = char
|
167
|
+
case chr
|
168
|
+
when /\s/; consume_whitespace
|
169
|
+
when /['"]/; consume_quote(char)
|
170
|
+
when '#'; consume_directive
|
171
|
+
when '/'; consume_comment(add_comment)
|
172
|
+
when '{'; advance; brace_level += 1
|
173
|
+
when '}'; advance; brace_level -= 1
|
174
|
+
when '('; advance; bracket_level += 1
|
175
|
+
when ')'; advance; bracket_level -= 1
|
176
|
+
else advance
|
177
|
+
end
|
178
|
+
@newline = false if chr !~ /\s/
|
179
|
+
|
180
|
+
if chr =~ end_char && (chr == '{' || chr == '(')
|
181
|
+
break
|
182
|
+
elsif chr =~ end_char && bracket_level <= 0 && brace_level <= 0
|
183
|
+
break
|
184
|
+
end
|
185
|
+
end
|
186
|
+
return @content[start...@index]
|
187
|
+
end
|
188
|
+
|
189
|
+
def attach_comment(statement)
|
190
|
+
if Comment === statement
|
191
|
+
if @last_statement && @last_statement.line == statement.line
|
192
|
+
@last_statement.comments = statement
|
193
|
+
statement.statement = @last_statement
|
194
|
+
end
|
195
|
+
@last_comment = statement
|
196
|
+
@last_statement = nil
|
197
|
+
else
|
198
|
+
if @last_comment
|
199
|
+
statement.comments = @last_comment
|
200
|
+
@last_comment.statement = statement
|
201
|
+
end
|
202
|
+
@last_statement = statement
|
203
|
+
@last_comment = nil
|
204
|
+
end
|
205
|
+
end
|
206
|
+
|
207
|
+
def advance(num = 1) @index += num end
|
208
|
+
def back(num = 1) @index -= num end
|
209
|
+
|
210
|
+
def advance_loop(&block)
|
211
|
+
while @index <= @content.size; yield end
|
212
|
+
end
|
213
|
+
|
214
|
+
def nextline
|
215
|
+
@line += 1
|
216
|
+
@newline = true
|
217
|
+
end
|
218
|
+
|
219
|
+
def char(num = 1) @content[@index, num] end
|
220
|
+
def prevchar(num = 1) @content[@index - 1, num] end
|
221
|
+
def nextchar(num = 1) @content[@index + 1, num] end
|
222
|
+
end
|
223
|
+
end
|
224
|
+
end
|
225
|
+
end
|
@@ -0,0 +1,131 @@
|
|
1
|
+
module YARD
|
2
|
+
module Parser
|
3
|
+
module C
|
4
|
+
module CommentParser
|
5
|
+
protected
|
6
|
+
|
7
|
+
def parse_comments(comments)
|
8
|
+
@overrides = []
|
9
|
+
spaces = nil
|
10
|
+
comments = remove_private_comments(comments)
|
11
|
+
comments = comments.split(/\r?\n/).map do |line|
|
12
|
+
line.gsub!(%r{^\s*/?\*/?}, '')
|
13
|
+
line.gsub!(%r{\*/\s*$}, '')
|
14
|
+
if line =~ /^\s*$/
|
15
|
+
next if spaces.nil?
|
16
|
+
next ""
|
17
|
+
end
|
18
|
+
spaces = (line[/^(\s+)/, 1] || "").size if spaces.nil?
|
19
|
+
line.gsub(/^\s{0,#{spaces}}/, '').rstrip
|
20
|
+
end.compact
|
21
|
+
|
22
|
+
comments = parse_overrides(comments)
|
23
|
+
comments = parse_callseq(comments)
|
24
|
+
comments.join("\n")
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def parse_overrides(comments)
|
30
|
+
comments.map do |line|
|
31
|
+
type, name = *line.scan(/^\s*Document-(class|module|method|const):\s*(\S.*)\s*$/).first
|
32
|
+
if type
|
33
|
+
@overrides << [type.to_sym, name]
|
34
|
+
nil
|
35
|
+
else
|
36
|
+
line
|
37
|
+
end
|
38
|
+
end.compact
|
39
|
+
end
|
40
|
+
|
41
|
+
def parse_callseq(comments)
|
42
|
+
return comments unless comments[0] =~ /\Acall-seq:\s*(\S.+)?/
|
43
|
+
if $1
|
44
|
+
comments[0] = " #{$1}"
|
45
|
+
else
|
46
|
+
comments.shift
|
47
|
+
end
|
48
|
+
overloads = []
|
49
|
+
seen_data = false
|
50
|
+
while comments.first =~ /^\s+(\S.+)/ || comments.first =~ /^\s*$/
|
51
|
+
line = comments.shift.strip
|
52
|
+
break if line.empty? && seen_data
|
53
|
+
next if line.empty?
|
54
|
+
seen_data = true
|
55
|
+
line.sub!(/^\w+[\.#]/, '')
|
56
|
+
signature, types = *line.split(/ [-=]> /)
|
57
|
+
types = parse_types(types)
|
58
|
+
if signature.sub!(/\[?\s*(\{(?:\s*\|(.+?)\|)?.*\})\s*\]?\s*$/, '') && $1
|
59
|
+
blk, blkparams = $1, $2
|
60
|
+
else
|
61
|
+
blk, blkparams = nil, nil
|
62
|
+
end
|
63
|
+
case signature
|
64
|
+
when /^(\w+)\s*=\s+(\w+)/
|
65
|
+
signature = "#{$1}=(#{$2})"
|
66
|
+
when /^\w+\s+\S/
|
67
|
+
signature = signature.split(/\s+/)
|
68
|
+
signature = "#{signature[1]}#{signature[2] ? '(' + signature[2..-1].join(' ') + ')' : ''}"
|
69
|
+
when /^\w+\[(.+?)\]\s*(=)?/
|
70
|
+
signature = "[]#{$2}(#{$1})"
|
71
|
+
when /^\w+\s+(#{CodeObjects::METHODMATCH})\s+(\w+)/
|
72
|
+
signature = "#{$1}(#{$2})"
|
73
|
+
end
|
74
|
+
break unless signature =~ /^#{CodeObjects::METHODNAMEMATCH}/
|
75
|
+
signature = signature.rstrip
|
76
|
+
overloads << "@overload #{signature}"
|
77
|
+
overloads << " @yield [#{blkparams}]" if blk
|
78
|
+
overloads << " @return [#{types.join(', ')}]" unless types.empty?
|
79
|
+
end
|
80
|
+
|
81
|
+
comments + [""] + overloads
|
82
|
+
end
|
83
|
+
|
84
|
+
def parse_types(types)
|
85
|
+
if types =~ /true or false/
|
86
|
+
["Boolean"]
|
87
|
+
else
|
88
|
+
(types||"").split(/,| or /).map do |t|
|
89
|
+
case t.strip.gsub(/^an?_/, '')
|
90
|
+
when "class"; "Class"
|
91
|
+
when "obj", "object", "anObject"; "Object"
|
92
|
+
when "arr", "array", "anArray", /^\[/; "Array"
|
93
|
+
when /^char\s*\*/, "char", "str", "string", "new_str"; "String"
|
94
|
+
when "enum", "anEnumerator"; "Enumerator"
|
95
|
+
when "exc", "exception"; "Exception"
|
96
|
+
when "proc", "proc_obj", "prc"; "Proc"
|
97
|
+
when "binding"; "Binding"
|
98
|
+
when "hsh", "hash", "aHash"; "Hash"
|
99
|
+
when "ios", "io"; "IO"
|
100
|
+
when "file"; "File"
|
101
|
+
when "float"; "Float"
|
102
|
+
when "time", "new_time"; "Time"
|
103
|
+
when "dir", "aDir"; "Dir"
|
104
|
+
when "regexp", "new_regexp"; "Regexp"
|
105
|
+
when "matchdata"; "MatchData"
|
106
|
+
when "encoding"; "Encoding"
|
107
|
+
when "fixnum", "fix"; "Fixnum"
|
108
|
+
when /^(?:un)?signed$/, /^(?:(?:un)?signed\s*)?(?:short|int|long|long\s+long)$/, "integer", "Integer"; "Integer"
|
109
|
+
when "num", "numeric", "Numeric", "number"; "Numeric"
|
110
|
+
when "aBignum"; "Bignum"
|
111
|
+
when "nil"; "nil"
|
112
|
+
when "true"; "true"
|
113
|
+
when "false"; "false"
|
114
|
+
when "bool", "boolean", "Boolean"; "Boolean"
|
115
|
+
when "self"; "self"
|
116
|
+
when /^[-+]?\d/; t
|
117
|
+
when /[A-Z][_a-z0-9]+/; t
|
118
|
+
end
|
119
|
+
end.compact
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
def remove_private_comments(comment)
|
124
|
+
comment = comment.gsub(/\/?\*--\n(.*?)\/?\*\+\+/m, '')
|
125
|
+
comment = comment.sub(/\/?\*--\n.*/m, '')
|
126
|
+
comment
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module YARD
|
2
|
+
module Parser
|
3
|
+
module C
|
4
|
+
class Statement
|
5
|
+
attr_accessor :source
|
6
|
+
attr_accessor :line
|
7
|
+
attr_accessor :file
|
8
|
+
|
9
|
+
# @deprecated Groups are now defined by directives
|
10
|
+
# @see Tags::GroupDirective
|
11
|
+
attr_accessor :group
|
12
|
+
|
13
|
+
attr_accessor :comments_hash_flag
|
14
|
+
|
15
|
+
def initialize(source, file = nil, line = nil)
|
16
|
+
@source = source
|
17
|
+
@file = file
|
18
|
+
@line = line
|
19
|
+
end
|
20
|
+
|
21
|
+
def line_range
|
22
|
+
line...(line + source.count("\n"))
|
23
|
+
end
|
24
|
+
|
25
|
+
def comments_range
|
26
|
+
comments.line_range
|
27
|
+
end
|
28
|
+
|
29
|
+
def first_line
|
30
|
+
source.split(/\n/).first
|
31
|
+
end
|
32
|
+
|
33
|
+
def show
|
34
|
+
"\t#{line}: #{first_line}"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
class BodyStatement < Statement
|
39
|
+
attr_accessor :comments
|
40
|
+
end
|
41
|
+
|
42
|
+
class ToplevelStatement < Statement
|
43
|
+
attr_accessor :block
|
44
|
+
attr_accessor :declaration
|
45
|
+
attr_accessor :comments
|
46
|
+
end
|
47
|
+
|
48
|
+
class Comment < Statement
|
49
|
+
include CommentParser
|
50
|
+
|
51
|
+
attr_accessor :type
|
52
|
+
attr_accessor :overrides
|
53
|
+
attr_accessor :statement
|
54
|
+
|
55
|
+
def initialize(source, file = nil, line = nil)
|
56
|
+
super(parse_comments(source), file, line)
|
57
|
+
end
|
58
|
+
|
59
|
+
def comments; self end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -39,7 +39,12 @@ module YARD
|
|
39
39
|
# the AstNode children of the node, use {#children}.
|
40
40
|
class AstNode < Array
|
41
41
|
attr_accessor :docstring_hash_flag
|
42
|
-
attr_accessor :docstring, :docstring_range, :source
|
42
|
+
attr_accessor :docstring, :docstring_range, :source
|
43
|
+
|
44
|
+
# @deprecated Groups are now defined by directives
|
45
|
+
# @see Tags::GroupDirective
|
46
|
+
attr_accessor :group
|
47
|
+
|
43
48
|
attr_writer :source_range, :line_range, :file, :full_source
|
44
49
|
alias comments docstring
|
45
50
|
alias comments_range docstring_range
|
@@ -110,6 +115,14 @@ module YARD
|
|
110
115
|
MethodCallNode
|
111
116
|
when :if, :elsif, :if_mod, :unless, :unless_mod
|
112
117
|
ConditionalNode
|
118
|
+
when :for, :while, :while_mod, :until, :until_mod
|
119
|
+
LoopNode
|
120
|
+
when :def, :defs
|
121
|
+
MethodDefinitionNode
|
122
|
+
when :class, :sclass
|
123
|
+
ClassNode
|
124
|
+
when :module
|
125
|
+
ModuleNode
|
113
126
|
else
|
114
127
|
if type.to_s =~ /_ref\Z/
|
115
128
|
ReferenceNode
|
@@ -226,11 +239,26 @@ module YARD
|
|
226
239
|
false
|
227
240
|
end
|
228
241
|
|
242
|
+
# @return [Boolean] whether the node is a method definition
|
243
|
+
def def?
|
244
|
+
false
|
245
|
+
end
|
246
|
+
|
229
247
|
# @return [Boolean] whether the node is a if/elsif/else condition
|
230
248
|
def condition?
|
231
249
|
false
|
232
250
|
end
|
233
251
|
|
252
|
+
# @return [Boolean] whether the node is a loop
|
253
|
+
def loop?
|
254
|
+
false
|
255
|
+
end
|
256
|
+
|
257
|
+
# @return [Boolean] whether the node has a block
|
258
|
+
def block?
|
259
|
+
respond_to?(:block) || condition?
|
260
|
+
end
|
261
|
+
|
234
262
|
# @group Getting Line Information
|
235
263
|
|
236
264
|
# @return [Boolean] whether the node has a {#line_range} set
|
@@ -296,6 +324,13 @@ module YARD
|
|
296
324
|
's(' + typeinfo + map(&:inspect).join(", ") + ')'
|
297
325
|
end
|
298
326
|
|
327
|
+
# @group Managing node state
|
328
|
+
|
329
|
+
# Resets node state in tree
|
330
|
+
def unfreeze
|
331
|
+
@children = nil
|
332
|
+
end
|
333
|
+
|
299
334
|
# @endgroup
|
300
335
|
|
301
336
|
private
|
@@ -367,6 +402,9 @@ module YARD
|
|
367
402
|
end
|
368
403
|
|
369
404
|
def block_param; parameters.last end
|
405
|
+
def block
|
406
|
+
last.type == :do_block || last.type == :brace_block ? last : nil
|
407
|
+
end
|
370
408
|
|
371
409
|
private
|
372
410
|
|
@@ -379,6 +417,31 @@ module YARD
|
|
379
417
|
end
|
380
418
|
end
|
381
419
|
|
420
|
+
class MethodDefinitionNode < AstNode
|
421
|
+
def kw?; true end
|
422
|
+
def def?; true end
|
423
|
+
def namespace; first if index_adjust > 0 end
|
424
|
+
|
425
|
+
def method_name(name_only = false)
|
426
|
+
name = self[index_adjust]
|
427
|
+
name_only ? name.jump(:ident).first.to_sym : name
|
428
|
+
end
|
429
|
+
|
430
|
+
def parameters(include_block_param = true)
|
431
|
+
params = self[1 + index_adjust]
|
432
|
+
params = params[0] if params.type == :paren
|
433
|
+
include_block_param ? params : params[0...-1]
|
434
|
+
end
|
435
|
+
|
436
|
+
alias block last
|
437
|
+
|
438
|
+
private
|
439
|
+
|
440
|
+
def index_adjust
|
441
|
+
type == :defs ? 2 : 0
|
442
|
+
end
|
443
|
+
end
|
444
|
+
|
382
445
|
class ConditionalNode < KeywordNode
|
383
446
|
def condition?; true end
|
384
447
|
def condition; first end
|
@@ -394,6 +457,33 @@ module YARD
|
|
394
457
|
|
395
458
|
def cmod?; type =~ /_mod$/ end
|
396
459
|
end
|
460
|
+
|
461
|
+
class ClassNode < KeywordNode
|
462
|
+
def class_name; first end
|
463
|
+
def superclass; type == :sclass ? nil : self[1] end
|
464
|
+
def block; last end
|
465
|
+
end
|
466
|
+
|
467
|
+
class ModuleNode < KeywordNode
|
468
|
+
def module_name; first end
|
469
|
+
def block; last end
|
470
|
+
end
|
471
|
+
|
472
|
+
class LoopNode < KeywordNode
|
473
|
+
def loop?; true end
|
474
|
+
def condition; type == :for ? s(self[0], self[1]) : first end
|
475
|
+
def block; last end
|
476
|
+
end
|
477
|
+
|
478
|
+
# Represents a lone comment block in source
|
479
|
+
class CommentNode < AstNode
|
480
|
+
def docstring; first end
|
481
|
+
def docstring=(value) end
|
482
|
+
alias comments docstring
|
483
|
+
|
484
|
+
def source; "" end
|
485
|
+
def first_line; "" end
|
486
|
+
end
|
397
487
|
end
|
398
488
|
end
|
399
489
|
end
|