yard 0.9.16 → 0.9.17
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.
- checksums.yaml +5 -5
- data/.yardopts +26 -26
- data/CHANGELOG.md +728 -728
- data/LEGAL +66 -66
- data/LICENSE +22 -22
- data/README.md +328 -328
- data/Rakefile +53 -47
- data/benchmarks/builtins_vs_eval.rb +24 -24
- data/benchmarks/concat_vs_join.rb +13 -13
- data/benchmarks/erb_vs_erubis.rb +54 -54
- data/benchmarks/format_args.rb +47 -47
- data/benchmarks/generation.rb +38 -38
- data/benchmarks/marshal_vs_dbm.rb +64 -64
- data/benchmarks/parsing.rb +46 -46
- data/benchmarks/pathname_vs_string.rb +50 -50
- data/benchmarks/rdoc_vs_yardoc.rb +11 -11
- data/benchmarks/registry_store_types.rb +49 -49
- data/benchmarks/ri_vs_yri.rb +19 -19
- data/benchmarks/ripper_parser.rb +13 -13
- data/benchmarks/splat_vs_flatten.rb +13 -13
- data/benchmarks/template_erb.rb +23 -23
- data/benchmarks/template_format.rb +7 -7
- data/benchmarks/template_profile.rb +18 -18
- data/benchmarks/yri_cache.rb +20 -20
- data/bin/yard +13 -13
- data/bin/yardoc +13 -13
- data/bin/yri +13 -13
- data/docs/CodeObjects.md +115 -115
- data/docs/GettingStarted.md +679 -679
- data/docs/Handlers.md +152 -152
- data/docs/Overview.md +61 -61
- data/docs/Parser.md +191 -191
- data/docs/Tags.md +283 -283
- data/docs/TagsArch.md +123 -123
- data/docs/Templates.md +496 -496
- data/docs/WhatsNew.md +1245 -1245
- data/docs/templates/default/fulldoc/html/full_list_tag.erb +8 -8
- data/docs/templates/default/fulldoc/html/setup.rb +6 -6
- data/docs/templates/default/layout/html/setup.rb +9 -9
- data/docs/templates/default/layout/html/tag_list.erb +11 -11
- data/docs/templates/default/yard_tags/html/list.erb +18 -18
- data/docs/templates/default/yard_tags/html/setup.rb +26 -26
- data/docs/templates/plugin.rb +70 -70
- data/lib/rubygems_plugin.rb +9 -9
- data/lib/yard.rb +69 -69
- data/lib/yard/autoload.rb +303 -303
- data/lib/yard/cli/command.rb +85 -85
- data/lib/yard/cli/command_parser.rb +93 -93
- data/lib/yard/cli/config.rb +198 -198
- data/lib/yard/cli/diff.rb +270 -270
- data/lib/yard/cli/display.rb +69 -69
- data/lib/yard/cli/gems.rb +84 -84
- data/lib/yard/cli/graph.rb +125 -125
- data/lib/yard/cli/help.rb +20 -20
- data/lib/yard/cli/i18n.rb +70 -70
- data/lib/yard/cli/list.rb +23 -23
- data/lib/yard/cli/markup_types.rb +32 -32
- data/lib/yard/cli/server.rb +257 -257
- data/lib/yard/cli/stats.rb +231 -231
- data/lib/yard/cli/yardoc.rb +788 -788
- data/lib/yard/cli/yardopts_command.rb +110 -110
- data/lib/yard/cli/yri.rb +215 -215
- data/lib/yard/code_objects/base.rb +615 -610
- data/lib/yard/code_objects/class_object.rb +146 -146
- data/lib/yard/code_objects/class_variable_object.rb +11 -11
- data/lib/yard/code_objects/constant_object.rb +16 -16
- data/lib/yard/code_objects/extended_method_object.rb +24 -24
- data/lib/yard/code_objects/extra_file_object.rb +131 -131
- data/lib/yard/code_objects/macro_object.rb +172 -172
- data/lib/yard/code_objects/method_object.rb +196 -196
- data/lib/yard/code_objects/module_object.rb +21 -21
- data/lib/yard/code_objects/namespace_mapper.rb +114 -114
- data/lib/yard/code_objects/namespace_object.rb +200 -200
- data/lib/yard/code_objects/proxy.rb +240 -240
- data/lib/yard/code_objects/root_object.rb +19 -19
- data/lib/yard/config.rb +270 -270
- data/lib/yard/core_ext/array.rb +16 -16
- data/lib/yard/core_ext/file.rb +69 -69
- data/lib/yard/core_ext/hash.rb +16 -16
- data/lib/yard/core_ext/insertion.rb +63 -63
- data/lib/yard/core_ext/module.rb +20 -20
- data/lib/yard/core_ext/string.rb +68 -68
- data/lib/yard/core_ext/symbol_hash.rb +75 -75
- data/lib/yard/docstring.rb +386 -378
- data/lib/yard/docstring_parser.rb +345 -345
- data/lib/yard/gem_index.rb +29 -29
- data/lib/yard/globals.rb +22 -22
- data/lib/yard/handlers/base.rb +595 -595
- data/lib/yard/handlers/c/alias_handler.rb +16 -16
- data/lib/yard/handlers/c/attribute_handler.rb +13 -13
- data/lib/yard/handlers/c/base.rb +129 -129
- data/lib/yard/handlers/c/class_handler.rb +27 -27
- data/lib/yard/handlers/c/constant_handler.rb +13 -13
- data/lib/yard/handlers/c/handler_methods.rb +211 -211
- data/lib/yard/handlers/c/init_handler.rb +20 -20
- data/lib/yard/handlers/c/method_handler.rb +45 -36
- data/lib/yard/handlers/c/mixin_handler.rb +21 -21
- data/lib/yard/handlers/c/module_handler.rb +17 -17
- data/lib/yard/handlers/c/override_comment_handler.rb +31 -31
- data/lib/yard/handlers/c/path_handler.rb +11 -11
- data/lib/yard/handlers/c/struct_handler.rb +13 -13
- data/lib/yard/handlers/c/symbol_handler.rb +8 -8
- data/lib/yard/handlers/processor.rb +200 -200
- data/lib/yard/handlers/ruby/alias_handler.rb +44 -44
- data/lib/yard/handlers/ruby/attribute_handler.rb +87 -87
- data/lib/yard/handlers/ruby/base.rb +165 -165
- data/lib/yard/handlers/ruby/class_condition_handler.rb +92 -92
- data/lib/yard/handlers/ruby/class_handler.rb +119 -119
- data/lib/yard/handlers/ruby/class_variable_handler.rb +17 -17
- data/lib/yard/handlers/ruby/comment_handler.rb +10 -10
- data/lib/yard/handlers/ruby/constant_handler.rb +59 -59
- data/lib/yard/handlers/ruby/decorator_handler_methods.rb +123 -123
- data/lib/yard/handlers/ruby/dsl_handler.rb +15 -15
- data/lib/yard/handlers/ruby/dsl_handler_methods.rb +96 -95
- data/lib/yard/handlers/ruby/exception_handler.rb +27 -27
- data/lib/yard/handlers/ruby/extend_handler.rb +22 -22
- data/lib/yard/handlers/ruby/legacy/alias_handler.rb +37 -37
- data/lib/yard/handlers/ruby/legacy/attribute_handler.rb +65 -65
- data/lib/yard/handlers/ruby/legacy/base.rb +245 -245
- data/lib/yard/handlers/ruby/legacy/class_condition_handler.rb +83 -83
- data/lib/yard/handlers/ruby/legacy/class_handler.rb +113 -113
- data/lib/yard/handlers/ruby/legacy/class_variable_handler.rb +15 -15
- data/lib/yard/handlers/ruby/legacy/comment_handler.rb +10 -10
- data/lib/yard/handlers/ruby/legacy/constant_handler.rb +29 -29
- data/lib/yard/handlers/ruby/legacy/dsl_handler.rb +17 -17
- data/lib/yard/handlers/ruby/legacy/exception_handler.rb +13 -13
- data/lib/yard/handlers/ruby/legacy/extend_handler.rb +21 -21
- data/lib/yard/handlers/ruby/legacy/method_handler.rb +90 -90
- data/lib/yard/handlers/ruby/legacy/mixin_handler.rb +39 -39
- data/lib/yard/handlers/ruby/legacy/module_function_handler.rb +19 -19
- data/lib/yard/handlers/ruby/legacy/module_handler.rb +12 -12
- data/lib/yard/handlers/ruby/legacy/private_class_method_handler.rb +22 -22
- data/lib/yard/handlers/ruby/legacy/private_constant_handler.rb +22 -22
- data/lib/yard/handlers/ruby/legacy/visibility_handler.rb +17 -17
- data/lib/yard/handlers/ruby/legacy/yield_handler.rb +29 -29
- data/lib/yard/handlers/ruby/method_condition_handler.rb +9 -9
- data/lib/yard/handlers/ruby/method_handler.rb +118 -118
- data/lib/yard/handlers/ruby/mixin_handler.rb +37 -37
- data/lib/yard/handlers/ruby/module_function_handler.rb +27 -27
- data/lib/yard/handlers/ruby/module_handler.rb +12 -12
- data/lib/yard/handlers/ruby/private_class_method_handler.rb +14 -14
- data/lib/yard/handlers/ruby/private_constant_handler.rb +43 -43
- data/lib/yard/handlers/ruby/public_class_method_handler.rb +14 -14
- data/lib/yard/handlers/ruby/struct_handler_methods.rb +143 -143
- data/lib/yard/handlers/ruby/visibility_handler.rb +22 -22
- data/lib/yard/handlers/ruby/yield_handler.rb +31 -31
- data/lib/yard/i18n/locale.rb +67 -67
- data/lib/yard/i18n/message.rb +57 -57
- data/lib/yard/i18n/messages.rb +56 -56
- data/lib/yard/i18n/po_parser.rb +61 -61
- data/lib/yard/i18n/pot_generator.rb +290 -290
- data/lib/yard/i18n/text.rb +173 -173
- data/lib/yard/logging.rb +205 -205
- data/lib/yard/options.rb +217 -217
- data/lib/yard/parser/base.rb +57 -57
- data/lib/yard/parser/c/c_parser.rb +235 -235
- data/lib/yard/parser/c/comment_parser.rb +134 -134
- data/lib/yard/parser/c/statement.rb +64 -64
- data/lib/yard/parser/ruby/ast_node.rb +540 -540
- data/lib/yard/parser/ruby/legacy/ruby_lex.rb +1354 -1354
- data/lib/yard/parser/ruby/legacy/ruby_parser.rb +32 -32
- data/lib/yard/parser/ruby/legacy/statement.rb +66 -66
- data/lib/yard/parser/ruby/legacy/statement_list.rb +394 -394
- data/lib/yard/parser/ruby/legacy/token_list.rb +74 -74
- data/lib/yard/parser/ruby/ruby_parser.rb +687 -687
- data/lib/yard/parser/ruby/token_resolver.rb +156 -156
- data/lib/yard/parser/source_parser.rb +526 -526
- data/lib/yard/rake/yardoc_task.rb +81 -81
- data/lib/yard/registry.rb +439 -439
- data/lib/yard/registry_resolver.rb +189 -189
- data/lib/yard/registry_store.rb +337 -337
- data/lib/yard/rubygems/backports.rb +10 -10
- data/lib/yard/rubygems/backports/LICENSE.txt +57 -57
- data/lib/yard/rubygems/backports/MIT.txt +20 -20
- data/lib/yard/rubygems/backports/gem.rb +10 -10
- data/lib/yard/rubygems/backports/source_index.rb +365 -365
- data/lib/yard/rubygems/doc_manager.rb +90 -90
- data/lib/yard/rubygems/hook.rb +197 -197
- data/lib/yard/rubygems/specification.rb +50 -50
- data/lib/yard/serializers/base.rb +83 -83
- data/lib/yard/serializers/file_system_serializer.rb +123 -123
- data/lib/yard/serializers/process_serializer.rb +24 -24
- data/lib/yard/serializers/stdout_serializer.rb +34 -34
- data/lib/yard/serializers/yardoc_serializer.rb +152 -152
- data/lib/yard/server.rb +13 -13
- data/lib/yard/server/adapter.rb +100 -100
- data/lib/yard/server/commands/base.rb +209 -209
- data/lib/yard/server/commands/display_file_command.rb +29 -29
- data/lib/yard/server/commands/display_object_command.rb +65 -65
- data/lib/yard/server/commands/frames_command.rb +16 -16
- data/lib/yard/server/commands/library_command.rb +187 -187
- data/lib/yard/server/commands/library_index_command.rb +28 -28
- data/lib/yard/server/commands/list_command.rb +25 -25
- data/lib/yard/server/commands/root_request_command.rb +15 -15
- data/lib/yard/server/commands/search_command.rb +79 -79
- data/lib/yard/server/commands/static_file_command.rb +23 -23
- data/lib/yard/server/commands/static_file_helpers.rb +62 -62
- data/lib/yard/server/doc_server_helper.rb +91 -91
- data/lib/yard/server/doc_server_serializer.rb +39 -39
- data/lib/yard/server/library_version.rb +277 -277
- data/lib/yard/server/rack_adapter.rb +89 -89
- data/lib/yard/server/router.rb +187 -187
- data/lib/yard/server/static_caching.rb +46 -46
- data/lib/yard/server/templates/default/fulldoc/html/css/custom.css +127 -127
- data/lib/yard/server/templates/default/fulldoc/html/js/autocomplete.js +11 -11
- data/lib/yard/server/templates/default/layout/html/breadcrumb.erb +37 -37
- data/lib/yard/server/templates/default/layout/html/script_setup.erb +7 -7
- data/lib/yard/server/templates/default/layout/html/setup.rb +8 -8
- data/lib/yard/server/templates/default/method_details/html/permalink.erb +4 -4
- data/lib/yard/server/templates/default/method_details/html/setup.rb +5 -5
- data/lib/yard/server/templates/doc_server/library_list/html/headers.erb +8 -8
- data/lib/yard/server/templates/doc_server/library_list/html/library_list.erb +14 -14
- data/lib/yard/server/templates/doc_server/library_list/html/listing.erb +13 -13
- data/lib/yard/server/templates/doc_server/library_list/html/setup.rb +6 -6
- data/lib/yard/server/templates/doc_server/library_list/html/title.erb +2 -2
- data/lib/yard/server/templates/doc_server/processing/html/processing.erb +52 -52
- data/lib/yard/server/templates/doc_server/processing/html/setup.rb +4 -4
- data/lib/yard/server/templates/doc_server/search/html/search.erb +18 -18
- data/lib/yard/server/templates/doc_server/search/html/setup.rb +9 -9
- data/lib/yard/server/webrick_adapter.rb +45 -45
- data/lib/yard/tags/default_factory.rb +191 -191
- data/lib/yard/tags/default_tag.rb +13 -13
- data/lib/yard/tags/directives.rb +616 -616
- data/lib/yard/tags/library.rb +633 -633
- data/lib/yard/tags/option_tag.rb +13 -13
- data/lib/yard/tags/overload_tag.rb +71 -71
- data/lib/yard/tags/ref_tag.rb +8 -8
- data/lib/yard/tags/ref_tag_list.rb +28 -28
- data/lib/yard/tags/tag.rb +71 -71
- data/lib/yard/tags/tag_format_error.rb +7 -7
- data/lib/yard/tags/types_explainer.rb +162 -162
- data/lib/yard/templates/engine.rb +186 -186
- data/lib/yard/templates/erb_cache.rb +23 -23
- data/lib/yard/templates/helpers/base_helper.rb +215 -215
- data/lib/yard/templates/helpers/filter_helper.rb +27 -27
- data/lib/yard/templates/helpers/html_helper.rb +646 -642
- data/lib/yard/templates/helpers/html_syntax_highlight_helper.rb +78 -78
- data/lib/yard/templates/helpers/markup/rdoc_markdown.rb +23 -23
- data/lib/yard/templates/helpers/markup/rdoc_markup.rb +109 -109
- data/lib/yard/templates/helpers/markup_helper.rb +172 -172
- data/lib/yard/templates/helpers/method_helper.rb +75 -75
- data/lib/yard/templates/helpers/module_helper.rb +21 -21
- data/lib/yard/templates/helpers/text_helper.rb +112 -112
- data/lib/yard/templates/helpers/uml_helper.rb +47 -47
- data/lib/yard/templates/section.rb +105 -105
- data/lib/yard/templates/template.rb +418 -418
- data/lib/yard/templates/template_options.rb +92 -92
- data/lib/yard/verifier.rb +151 -151
- data/lib/yard/version.rb +3 -1
- data/spec/cli/command_parser_spec.rb +43 -43
- data/spec/cli/command_spec.rb +36 -36
- data/spec/cli/config_spec.rb +148 -148
- data/spec/cli/diff_spec.rb +254 -254
- data/spec/cli/display_spec.rb +30 -30
- data/spec/cli/gems_spec.rb +81 -81
- data/spec/cli/graph_spec.rb +18 -18
- data/spec/cli/help_spec.rb +22 -22
- data/spec/cli/i18n_spec.rb +107 -107
- data/spec/cli/list_spec.rb +8 -8
- data/spec/cli/markup_types_spec.rb +22 -22
- data/spec/cli/server_spec.rb +324 -324
- data/spec/cli/stats_spec.rb +96 -96
- data/spec/cli/yard_on_yard_spec.rb +38 -38
- data/spec/cli/yardoc_spec.rb +862 -849
- data/spec/cli/yri_spec.rb +101 -101
- data/spec/code_objects/base_spec.rb +470 -460
- data/spec/code_objects/class_object_spec.rb +226 -226
- data/spec/code_objects/code_object_list_spec.rb +36 -36
- data/spec/code_objects/constants_spec.rb +116 -116
- data/spec/code_objects/extra_file_object_spec.rb +160 -160
- data/spec/code_objects/macro_object_spec.rb +150 -150
- data/spec/code_objects/method_object_spec.rb +184 -184
- data/spec/code_objects/module_object_spec.rb +142 -142
- data/spec/code_objects/namespace_object_spec.rb +171 -171
- data/spec/code_objects/proxy_spec.rb +141 -141
- data/spec/code_objects/spec_helper.rb +3 -3
- data/spec/config_spec.rb +171 -171
- data/spec/core_ext/array_spec.rb +13 -13
- data/spec/core_ext/file_spec.rb +72 -72
- data/spec/core_ext/hash_spec.rb +14 -14
- data/spec/core_ext/insertion_spec.rb +37 -37
- data/spec/core_ext/module_spec.rb +15 -15
- data/spec/core_ext/string_spec.rb +42 -42
- data/spec/core_ext/symbol_hash_spec.rb +89 -89
- data/spec/docstring_parser_spec.rb +280 -262
- data/spec/docstring_spec.rb +373 -364
- data/spec/examples.txt +1875 -1871
- data/spec/handlers/alias_handler_spec.rb +82 -82
- data/spec/handlers/attribute_handler_spec.rb +96 -96
- data/spec/handlers/base_spec.rb +216 -216
- data/spec/handlers/c/alias_handler_spec.rb +34 -34
- data/spec/handlers/c/attribute_handler_spec.rb +41 -41
- data/spec/handlers/c/class_handler_spec.rb +78 -78
- data/spec/handlers/c/constant_handler_spec.rb +71 -71
- data/spec/handlers/c/init_handler_spec.rb +48 -48
- data/spec/handlers/c/method_handler_spec.rb +325 -325
- data/spec/handlers/c/mixin_handler_spec.rb +44 -44
- data/spec/handlers/c/module_handler_spec.rb +71 -71
- data/spec/handlers/c/override_comment_handler_spec.rb +47 -47
- data/spec/handlers/c/path_handler_spec.rb +36 -36
- data/spec/handlers/c/spec_helper.rb +23 -23
- data/spec/handlers/c/struct_handler_spec.rb +16 -16
- data/spec/handlers/class_condition_handler_spec.rb +87 -87
- data/spec/handlers/class_handler_spec.rb +247 -247
- data/spec/handlers/class_method_handler_shared_examples.rb +133 -133
- data/spec/handlers/class_variable_handler_spec.rb +12 -12
- data/spec/handlers/constant_handler_spec.rb +112 -112
- data/spec/handlers/decorator_handler_methods_spec.rb +393 -393
- data/spec/handlers/dsl_handler_spec.rb +219 -219
- data/spec/handlers/examples/alias_handler_001.rb.txt +45 -45
- data/spec/handlers/examples/attribute_handler_001.rb.txt +31 -31
- data/spec/handlers/examples/class_condition_handler_001.rb.txt +68 -68
- data/spec/handlers/examples/class_handler_001.rb.txt +120 -120
- data/spec/handlers/examples/class_variable_handler_001.rb.txt +9 -9
- data/spec/handlers/examples/constant_handler_001.rb.txt +35 -35
- data/spec/handlers/examples/dsl_handler_001.rb.txt +154 -154
- data/spec/handlers/examples/exception_handler_001.rb.txt +58 -58
- data/spec/handlers/examples/extend_handler_001.rb.txt +15 -15
- data/spec/handlers/examples/method_condition_handler_001.rb.txt +9 -9
- data/spec/handlers/examples/method_handler_001.rb.txt +128 -128
- data/spec/handlers/examples/mixin_handler_001.rb.txt +37 -37
- data/spec/handlers/examples/module_handler_001.rb.txt +29 -29
- data/spec/handlers/examples/private_constant_handler_001.rb.txt +8 -8
- data/spec/handlers/examples/process_handler_001.rb.txt +11 -11
- data/spec/handlers/examples/visibility_handler_001.rb.txt +35 -35
- data/spec/handlers/examples/yield_handler_001.rb.txt +54 -54
- data/spec/handlers/exception_handler_spec.rb +49 -49
- data/spec/handlers/extend_handler_spec.rb +24 -24
- data/spec/handlers/legacy_base_spec.rb +128 -128
- data/spec/handlers/method_condition_handler_spec.rb +15 -15
- data/spec/handlers/method_handler_spec.rb +190 -190
- data/spec/handlers/mixin_handler_spec.rb +56 -56
- data/spec/handlers/module_function_handler_spec.rb +106 -106
- data/spec/handlers/module_handler_spec.rb +35 -35
- data/spec/handlers/private_class_method_handler_spec.rb +11 -11
- data/spec/handlers/private_constant_handler_spec.rb +25 -25
- data/spec/handlers/processor_spec.rb +35 -35
- data/spec/handlers/public_class_method_handler_spec.rb +11 -11
- data/spec/handlers/ruby/base_spec.rb +95 -95
- data/spec/handlers/ruby/legacy/base_spec.rb +84 -84
- data/spec/handlers/spec_helper.rb +33 -33
- data/spec/handlers/visibility_handler_spec.rb +44 -44
- data/spec/handlers/yield_handler_spec.rb +52 -52
- data/spec/i18n/locale_spec.rb +81 -81
- data/spec/i18n/message_spec.rb +52 -52
- data/spec/i18n/messages_spec.rb +67 -67
- data/spec/i18n/pot_generator_spec.rb +295 -295
- data/spec/i18n/text_spec.rb +184 -184
- data/spec/logging_spec.rb +44 -44
- data/spec/options_spec.rb +171 -171
- data/spec/parser/base_spec.rb +24 -24
- data/spec/parser/c_parser_spec.rb +236 -223
- data/spec/parser/examples/array.c.txt +6267 -6267
- data/spec/parser/examples/example1.rb.txt +7 -7
- data/spec/parser/examples/extrafile.c.txt +8 -8
- data/spec/parser/examples/file.c.txt +28 -0
- data/spec/parser/examples/multifile.c.txt +22 -22
- data/spec/parser/examples/namespace.cpp.txt +68 -68
- data/spec/parser/examples/override.c.txt +424 -424
- data/spec/parser/examples/parse_in_order_001.rb.txt +2 -2
- data/spec/parser/examples/parse_in_order_002.rb.txt +1 -1
- data/spec/parser/examples/tag_handler_001.rb.txt +7 -7
- data/spec/parser/ruby/ast_node_spec.rb +33 -33
- data/spec/parser/ruby/legacy/statement_list_spec.rb +299 -299
- data/spec/parser/ruby/legacy/token_list_spec.rb +79 -79
- data/spec/parser/ruby/ruby_parser_spec.rb +508 -508
- data/spec/parser/ruby/token_resolver_spec.rb +165 -165
- data/spec/parser/source_parser_spec.rb +727 -727
- data/spec/parser/tag_parsing_spec.rb +17 -17
- data/spec/rake/yardoc_task_spec.rb +118 -118
- data/spec/registry_spec.rb +463 -463
- data/spec/registry_store_spec.rb +316 -316
- data/spec/rubygems/doc_manager_spec.rb +112 -112
- data/spec/serializers/data/serialized_yardoc/checksums +1 -1
- data/spec/serializers/file_system_serializer_spec.rb +145 -145
- data/spec/serializers/spec_helper.rb +2 -2
- data/spec/serializers/yardoc_serializer_spec.rb +78 -78
- data/spec/server/adapter_spec.rb +39 -39
- data/spec/server/commands/base_spec.rb +91 -91
- data/spec/server/commands/library_command_spec.rb +39 -39
- data/spec/server/doc_server_helper_spec.rb +72 -72
- data/spec/server/doc_server_serializer_spec.rb +60 -60
- data/spec/server/rack_adapter_spec.rb +21 -21
- data/spec/server/router_spec.rb +123 -123
- data/spec/server/spec_helper.rb +22 -22
- data/spec/server/static_caching_spec.rb +47 -47
- data/spec/server/webrick_servlet_spec.rb +20 -20
- data/spec/server_spec.rb +19 -19
- data/spec/spec_helper.rb +212 -212
- data/spec/tags/default_factory_spec.rb +168 -168
- data/spec/tags/default_tag_spec.rb +11 -11
- data/spec/tags/directives_spec.rb +463 -463
- data/spec/tags/library_spec.rb +48 -48
- data/spec/tags/overload_tag_spec.rb +53 -53
- data/spec/tags/ref_tag_list_spec.rb +53 -53
- data/spec/tags/types_explainer_spec.rb +203 -203
- data/spec/templates/class_spec.rb +45 -45
- data/spec/templates/constant_spec.rb +41 -41
- data/spec/templates/engine_spec.rb +131 -131
- data/spec/templates/examples/class001.html +308 -308
- data/spec/templates/examples/class001.txt +36 -36
- data/spec/templates/examples/class002.html +39 -39
- data/spec/templates/examples/constant001.txt +24 -24
- data/spec/templates/examples/constant002.txt +6 -6
- data/spec/templates/examples/constant003.txt +10 -10
- data/spec/templates/examples/method001.html +137 -137
- data/spec/templates/examples/method001.txt +35 -35
- data/spec/templates/examples/method002.html +91 -91
- data/spec/templates/examples/method002.txt +20 -20
- data/spec/templates/examples/method003.html +165 -165
- data/spec/templates/examples/method003.txt +45 -45
- data/spec/templates/examples/method004.html +48 -48
- data/spec/templates/examples/method004.txt +10 -10
- data/spec/templates/examples/method005.html +105 -105
- data/spec/templates/examples/method005.txt +33 -33
- data/spec/templates/examples/method006.html +107 -107
- data/spec/templates/examples/method006.txt +20 -20
- data/spec/templates/examples/module001.dot +33 -33
- data/spec/templates/examples/module001.html +833 -833
- data/spec/templates/examples/module001.txt +33 -33
- data/spec/templates/examples/module002.html +341 -341
- data/spec/templates/examples/module003.html +202 -202
- data/spec/templates/examples/module004.html +394 -394
- data/spec/templates/examples/module005.html +81 -81
- data/spec/templates/examples/tag001.txt +82 -82
- data/spec/templates/helpers/base_helper_spec.rb +171 -171
- data/spec/templates/helpers/html_helper_spec.rb +668 -653
- data/spec/templates/helpers/html_syntax_highlight_helper_spec.rb +65 -65
- data/spec/templates/helpers/markup/rdoc_markup_spec.rb +84 -84
- data/spec/templates/helpers/markup_helper_spec.rb +136 -136
- data/spec/templates/helpers/method_helper_spec.rb +107 -107
- data/spec/templates/helpers/module_helper_spec.rb +35 -35
- data/spec/templates/helpers/shared_signature_examples.rb +126 -126
- data/spec/templates/helpers/text_helper_spec.rb +65 -65
- data/spec/templates/method_spec.rb +118 -118
- data/spec/templates/module_spec.rb +203 -203
- data/spec/templates/onefile_spec.rb +66 -66
- data/spec/templates/section_spec.rb +144 -144
- data/spec/templates/spec_helper.rb +76 -76
- data/spec/templates/tag_spec.rb +52 -52
- data/spec/templates/template_spec.rb +410 -410
- data/spec/verifier_spec.rb +106 -106
- data/templates/default/class/dot/setup.rb +7 -7
- data/templates/default/class/dot/superklass.erb +2 -2
- data/templates/default/class/html/constructor_details.erb +8 -8
- data/templates/default/class/html/setup.rb +2 -2
- data/templates/default/class/html/subclasses.erb +4 -4
- data/templates/default/class/setup.rb +36 -36
- data/templates/default/class/text/setup.rb +12 -12
- data/templates/default/class/text/subclasses.erb +5 -5
- data/templates/default/constant/text/header.erb +11 -11
- data/templates/default/constant/text/setup.rb +4 -4
- data/templates/default/docstring/html/abstract.erb +4 -4
- data/templates/default/docstring/html/deprecated.erb +1 -1
- data/templates/default/docstring/html/index.erb +5 -5
- data/templates/default/docstring/html/note.erb +6 -6
- data/templates/default/docstring/html/private.erb +4 -4
- data/templates/default/docstring/html/text.erb +1 -1
- data/templates/default/docstring/html/todo.erb +6 -6
- data/templates/default/docstring/setup.rb +52 -52
- data/templates/default/docstring/text/abstract.erb +2 -2
- data/templates/default/docstring/text/deprecated.erb +2 -2
- data/templates/default/docstring/text/index.erb +2 -2
- data/templates/default/docstring/text/note.erb +3 -3
- data/templates/default/docstring/text/private.erb +2 -2
- data/templates/default/docstring/text/text.erb +1 -1
- data/templates/default/docstring/text/todo.erb +3 -3
- data/templates/default/fulldoc/html/css/full_list.css +58 -58
- data/templates/default/fulldoc/html/css/style.css +496 -496
- data/templates/default/fulldoc/html/frames.erb +17 -17
- data/templates/default/fulldoc/html/full_list.erb +37 -37
- data/templates/default/fulldoc/html/full_list_class.erb +2 -2
- data/templates/default/fulldoc/html/full_list_file.erb +7 -7
- data/templates/default/fulldoc/html/full_list_method.erb +10 -10
- data/templates/default/fulldoc/html/js/app.js +292 -292
- data/templates/default/fulldoc/html/js/full_list.js +216 -216
- data/templates/default/fulldoc/html/js/jquery.js +3 -3
- data/templates/default/fulldoc/html/setup.rb +241 -241
- data/templates/default/layout/dot/header.erb +5 -5
- data/templates/default/layout/dot/setup.rb +15 -15
- data/templates/default/layout/html/breadcrumb.erb +11 -11
- data/templates/default/layout/html/files.erb +11 -11
- data/templates/default/layout/html/footer.erb +5 -5
- data/templates/default/layout/html/headers.erb +15 -15
- data/templates/default/layout/html/index.erb +2 -2
- data/templates/default/layout/html/layout.erb +23 -23
- data/templates/default/layout/html/listing.erb +4 -4
- data/templates/default/layout/html/objects.erb +32 -32
- data/templates/default/layout/html/script_setup.erb +4 -4
- data/templates/default/layout/html/search.erb +12 -12
- data/templates/default/layout/html/setup.rb +89 -89
- data/templates/default/method/html/header.erb +16 -16
- data/templates/default/method/setup.rb +4 -4
- data/templates/default/method_details/html/header.erb +2 -2
- data/templates/default/method_details/html/method_signature.erb +24 -24
- data/templates/default/method_details/html/source.erb +9 -9
- data/templates/default/method_details/setup.rb +11 -11
- data/templates/default/method_details/text/header.erb +10 -10
- data/templates/default/method_details/text/method_signature.erb +12 -12
- data/templates/default/method_details/text/setup.rb +11 -11
- data/templates/default/module/dot/child.erb +1 -1
- data/templates/default/module/dot/dependencies.erb +2 -2
- data/templates/default/module/dot/header.erb +6 -6
- data/templates/default/module/dot/info.erb +13 -13
- data/templates/default/module/dot/setup.rb +15 -15
- data/templates/default/module/html/attribute_details.erb +10 -10
- data/templates/default/module/html/attribute_summary.erb +8 -8
- data/templates/default/module/html/box_info.erb +43 -43
- data/templates/default/module/html/children.erb +8 -8
- data/templates/default/module/html/constant_summary.erb +17 -17
- data/templates/default/module/html/defines.erb +2 -2
- data/templates/default/module/html/header.erb +5 -5
- data/templates/default/module/html/inherited_attributes.erb +14 -14
- data/templates/default/module/html/inherited_constants.erb +8 -8
- data/templates/default/module/html/inherited_methods.erb +18 -18
- data/templates/default/module/html/item_summary.erb +40 -40
- data/templates/default/module/html/method_details_list.erb +9 -9
- data/templates/default/module/html/method_summary.erb +13 -13
- data/templates/default/module/html/methodmissing.erb +12 -12
- data/templates/default/module/setup.rb +167 -167
- data/templates/default/module/text/children.erb +9 -9
- data/templates/default/module/text/class_meths_list.erb +7 -7
- data/templates/default/module/text/extends.erb +7 -7
- data/templates/default/module/text/header.erb +7 -7
- data/templates/default/module/text/includes.erb +7 -7
- data/templates/default/module/text/instance_meths_list.erb +7 -7
- data/templates/default/module/text/setup.rb +13 -13
- data/templates/default/onefile/html/files.erb +4 -4
- data/templates/default/onefile/html/headers.erb +6 -6
- data/templates/default/onefile/html/layout.erb +17 -17
- data/templates/default/onefile/html/readme.erb +2 -2
- data/templates/default/onefile/html/setup.rb +62 -62
- data/templates/default/root/dot/child.erb +2 -2
- data/templates/default/root/dot/setup.rb +6 -6
- data/templates/default/root/html/setup.rb +2 -2
- data/templates/default/tags/html/example.erb +10 -10
- data/templates/default/tags/html/index.erb +2 -2
- data/templates/default/tags/html/option.erb +24 -24
- data/templates/default/tags/html/overload.erb +13 -13
- data/templates/default/tags/html/see.erb +7 -7
- data/templates/default/tags/html/tag.erb +20 -20
- data/templates/default/tags/setup.rb +57 -57
- data/templates/default/tags/text/example.erb +12 -12
- data/templates/default/tags/text/index.erb +1 -1
- data/templates/default/tags/text/option.erb +20 -20
- data/templates/default/tags/text/overload.erb +19 -19
- data/templates/default/tags/text/see.erb +11 -11
- data/templates/default/tags/text/tag.erb +13 -13
- data/templates/guide/class/html/setup.rb +2 -2
- data/templates/guide/docstring/html/setup.rb +2 -2
- data/templates/guide/fulldoc/html/css/style.css +108 -108
- data/templates/guide/fulldoc/html/js/app.js +33 -33
- data/templates/guide/fulldoc/html/setup.rb +74 -74
- data/templates/guide/layout/html/layout.erb +81 -81
- data/templates/guide/layout/html/setup.rb +25 -25
- data/templates/guide/method/html/header.erb +17 -17
- data/templates/guide/method/html/setup.rb +22 -22
- data/templates/guide/module/html/header.erb +6 -6
- data/templates/guide/module/html/method_list.erb +4 -4
- data/templates/guide/module/html/setup.rb +27 -27
- data/templates/guide/onefile/html/files.erb +4 -4
- data/templates/guide/onefile/html/setup.rb +6 -6
- data/templates/guide/onefile/html/toc.erb +3 -3
- data/templates/guide/tags/html/setup.rb +9 -9
- data/yard.gemspec +43 -43
- metadata +4 -4
@@ -1,32 +1,32 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module YARD
|
3
|
-
module Parser
|
4
|
-
module Ruby
|
5
|
-
module Legacy
|
6
|
-
# Legacy Ruby parser
|
7
|
-
# @since 0.5.6
|
8
|
-
class RubyParser < Parser::Base
|
9
|
-
def initialize(source, _filename)
|
10
|
-
@source = source
|
11
|
-
end
|
12
|
-
|
13
|
-
def parse
|
14
|
-
@parse ||= StatementList.new(@source)
|
15
|
-
self
|
16
|
-
end
|
17
|
-
|
18
|
-
def tokenize
|
19
|
-
@tokenize ||= TokenList.new(@source)
|
20
|
-
end
|
21
|
-
|
22
|
-
def enumerator
|
23
|
-
@parse
|
24
|
-
end
|
25
|
-
|
26
|
-
def encoding_line; @parse.encoding_line end
|
27
|
-
def shebang_line; @parse.shebang_line end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module YARD
|
3
|
+
module Parser
|
4
|
+
module Ruby
|
5
|
+
module Legacy
|
6
|
+
# Legacy Ruby parser
|
7
|
+
# @since 0.5.6
|
8
|
+
class RubyParser < Parser::Base
|
9
|
+
def initialize(source, _filename)
|
10
|
+
@source = source
|
11
|
+
end
|
12
|
+
|
13
|
+
def parse
|
14
|
+
@parse ||= StatementList.new(@source)
|
15
|
+
self
|
16
|
+
end
|
17
|
+
|
18
|
+
def tokenize
|
19
|
+
@tokenize ||= TokenList.new(@source)
|
20
|
+
end
|
21
|
+
|
22
|
+
def enumerator
|
23
|
+
@parse
|
24
|
+
end
|
25
|
+
|
26
|
+
def encoding_line; @parse.encoding_line end
|
27
|
+
def shebang_line; @parse.shebang_line end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -1,66 +1,66 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module YARD
|
3
|
-
module Parser::Ruby::Legacy
|
4
|
-
class Statement
|
5
|
-
attr_reader :tokens, :comments, :block
|
6
|
-
attr_accessor :comments_range
|
7
|
-
|
8
|
-
# @deprecated Groups are now defined by directives
|
9
|
-
# @see Tags::GroupDirective
|
10
|
-
attr_accessor :group
|
11
|
-
|
12
|
-
attr_accessor :comments_hash_flag
|
13
|
-
|
14
|
-
def initialize(tokens, block = nil, comments = nil)
|
15
|
-
@tokens = tokens
|
16
|
-
@block = block
|
17
|
-
@comments = comments
|
18
|
-
@comments_hash_flag = false
|
19
|
-
end
|
20
|
-
|
21
|
-
def first_line
|
22
|
-
to_s.split(/\n/)[0]
|
23
|
-
end
|
24
|
-
|
25
|
-
def to_s(include_block = true)
|
26
|
-
tokens.map do |token|
|
27
|
-
RubyToken::TkBlockContents === token ? (include_block ? block.to_s : '') : token.text
|
28
|
-
end.join
|
29
|
-
end
|
30
|
-
alias source to_s
|
31
|
-
|
32
|
-
def inspect
|
33
|
-
l = line - 1
|
34
|
-
to_s(false).split(/\n/).map do |text|
|
35
|
-
"\t#{l += 1}: #{text}"
|
36
|
-
end.join("\n")
|
37
|
-
end
|
38
|
-
|
39
|
-
def show
|
40
|
-
"\t#{line}: #{first_line}"
|
41
|
-
end
|
42
|
-
|
43
|
-
# @return [Fixnum] the first line of Ruby source
|
44
|
-
def line
|
45
|
-
tokens.first.line_no
|
46
|
-
end
|
47
|
-
|
48
|
-
# @return [Range<Fixnum>] the first to last lines of Ruby source
|
49
|
-
# @since 0.5.4
|
50
|
-
def line_range
|
51
|
-
tokens.first.line_no..tokens.last.line_no
|
52
|
-
end
|
53
|
-
|
54
|
-
private
|
55
|
-
|
56
|
-
def clean_tokens(tokens)
|
57
|
-
last_tk = nil
|
58
|
-
tokens.reject do |tk|
|
59
|
-
tk.is_a?(RubyToken::TkNL) ||
|
60
|
-
(last_tk.is_a?(RubyToken::TkSPACE) &&
|
61
|
-
last_tk.class == tk.class) && last_tk = tk
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module YARD
|
3
|
+
module Parser::Ruby::Legacy
|
4
|
+
class Statement
|
5
|
+
attr_reader :tokens, :comments, :block
|
6
|
+
attr_accessor :comments_range
|
7
|
+
|
8
|
+
# @deprecated Groups are now defined by directives
|
9
|
+
# @see Tags::GroupDirective
|
10
|
+
attr_accessor :group
|
11
|
+
|
12
|
+
attr_accessor :comments_hash_flag
|
13
|
+
|
14
|
+
def initialize(tokens, block = nil, comments = nil)
|
15
|
+
@tokens = tokens
|
16
|
+
@block = block
|
17
|
+
@comments = comments
|
18
|
+
@comments_hash_flag = false
|
19
|
+
end
|
20
|
+
|
21
|
+
def first_line
|
22
|
+
to_s.split(/\n/)[0]
|
23
|
+
end
|
24
|
+
|
25
|
+
def to_s(include_block = true)
|
26
|
+
tokens.map do |token|
|
27
|
+
RubyToken::TkBlockContents === token ? (include_block ? block.to_s : '') : token.text
|
28
|
+
end.join
|
29
|
+
end
|
30
|
+
alias source to_s
|
31
|
+
|
32
|
+
def inspect
|
33
|
+
l = line - 1
|
34
|
+
to_s(false).split(/\n/).map do |text|
|
35
|
+
"\t#{l += 1}: #{text}"
|
36
|
+
end.join("\n")
|
37
|
+
end
|
38
|
+
|
39
|
+
def show
|
40
|
+
"\t#{line}: #{first_line}"
|
41
|
+
end
|
42
|
+
|
43
|
+
# @return [Fixnum] the first line of Ruby source
|
44
|
+
def line
|
45
|
+
tokens.first.line_no
|
46
|
+
end
|
47
|
+
|
48
|
+
# @return [Range<Fixnum>] the first to last lines of Ruby source
|
49
|
+
# @since 0.5.4
|
50
|
+
def line_range
|
51
|
+
tokens.first.line_no..tokens.last.line_no
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
|
56
|
+
def clean_tokens(tokens)
|
57
|
+
last_tk = nil
|
58
|
+
tokens.reject do |tk|
|
59
|
+
tk.is_a?(RubyToken::TkNL) ||
|
60
|
+
(last_tk.is_a?(RubyToken::TkSPACE) &&
|
61
|
+
last_tk.class == tk.class) && last_tk = tk
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -1,394 +1,394 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module YARD
|
3
|
-
module Parser::Ruby::Legacy
|
4
|
-
class StatementList < Array
|
5
|
-
include RubyToken
|
6
|
-
|
7
|
-
attr_accessor :shebang_line, :encoding_line
|
8
|
-
|
9
|
-
# The following list of tokens will require a block to be opened
|
10
|
-
# if used at the beginning of a statement.
|
11
|
-
OPEN_BLOCK_TOKENS = [TkCLASS, TkDEF, TkMODULE, TkUNTIL,
|
12
|
-
TkIF, TkELSIF, TkUNLESS, TkWHILE, TkFOR, TkCASE]
|
13
|
-
|
14
|
-
# Creates a new statement list
|
15
|
-
#
|
16
|
-
# @param [TokenList, String] content the tokens to create the list from
|
17
|
-
def initialize(content)
|
18
|
-
@shebang_line = nil
|
19
|
-
@encoding_line = nil
|
20
|
-
@comments_last_line = nil
|
21
|
-
if content.is_a? TokenList
|
22
|
-
@tokens = content.dup
|
23
|
-
elsif content.is_a? String
|
24
|
-
@tokens = TokenList.new(content.delete("\r"))
|
25
|
-
else
|
26
|
-
raise ArgumentError, "Invalid content for StatementList: #{content.inspect}:#{content.class}"
|
27
|
-
end
|
28
|
-
|
29
|
-
parse_statements
|
30
|
-
end
|
31
|
-
|
32
|
-
private
|
33
|
-
|
34
|
-
def parse_statements
|
35
|
-
loop do
|
36
|
-
stmt = next_statement
|
37
|
-
break if stmt.nil?
|
38
|
-
self << stmt
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
# Returns the next statement in the token stream
|
43
|
-
#
|
44
|
-
# @return [Statement] the next statement
|
45
|
-
def next_statement
|
46
|
-
@state = :first_statement
|
47
|
-
@statement_stack = []
|
48
|
-
@level = 0
|
49
|
-
@block_num = 0
|
50
|
-
@done = false
|
51
|
-
@current_block = nil
|
52
|
-
@comments_line = nil
|
53
|
-
@comments_hash_flag = nil
|
54
|
-
@statement = TokenList.new
|
55
|
-
@block = nil
|
56
|
-
@comments = nil
|
57
|
-
@last_tk = nil
|
58
|
-
@last_ns_tk = nil
|
59
|
-
@before_last_tk = nil
|
60
|
-
@before_last_ns_tk = nil
|
61
|
-
@first_line = nil
|
62
|
-
|
63
|
-
until @done
|
64
|
-
tk = @tokens.shift
|
65
|
-
break if tk.nil?
|
66
|
-
process_token(tk)
|
67
|
-
|
68
|
-
@before_last_tk = @last_tk
|
69
|
-
@last_tk = tk # Save last token
|
70
|
-
unless [TkSPACE, TkNL, TkEND_OF_SCRIPT].include? tk.class
|
71
|
-
@before_last_ns_tk = @last_ns_tk
|
72
|
-
@last_ns_tk = tk
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
# Return the code block with starting token and initial comments
|
77
|
-
# If there is no code in the block, return nil
|
78
|
-
@comments = @comments.compact if @comments
|
79
|
-
if @block || !@statement.empty?
|
80
|
-
sanitize_statement_end
|
81
|
-
sanitize_block
|
82
|
-
@statement.pop if [TkNL, TkSPACE, TkSEMICOLON].include?(@statement.last.class)
|
83
|
-
stmt = Statement.new(@statement, @block, @comments)
|
84
|
-
if @comments && @comments_line
|
85
|
-
stmt.comments_range = (@comments_line..(@comments_line + @comments.size - 1))
|
86
|
-
stmt.comments_hash_flag = @comments_hash_flag
|
87
|
-
end
|
88
|
-
stmt
|
89
|
-
elsif @comments
|
90
|
-
@statement << TkCOMMENT.new(@comments_line, 0)
|
91
|
-
@statement.first.set_text("# " + @comments.join("\n# "))
|
92
|
-
Statement.new(@statement, nil, @comments)
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
def sanitize_statement_end
|
97
|
-
extra = []
|
98
|
-
(@statement.size - 1).downto(0) do |index|
|
99
|
-
token = @statement[index]
|
100
|
-
next unless TkStatementEnd === token
|
101
|
-
|
102
|
-
while [TkNL, TkSPACE, TkSEMICOLON].include?(@statement[index - 1].class)
|
103
|
-
extra.unshift(@statement.delete_at(index - 1))
|
104
|
-
index -= 1
|
105
|
-
end
|
106
|
-
@statement.insert(index + 1, *extra)
|
107
|
-
break
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
def sanitize_block
|
112
|
-
return unless @block
|
113
|
-
extra = []
|
114
|
-
while [TkSPACE, TkNL, TkSEMICOLON].include?(@block.last.class)
|
115
|
-
next(@block.pop) if TkSEMICOLON === @block.last
|
116
|
-
extra.unshift(@block.pop)
|
117
|
-
end
|
118
|
-
|
119
|
-
@statement.each_with_index do |token, index|
|
120
|
-
if TkBlockContents === token
|
121
|
-
@statement[index, 1] = [token, *extra]
|
122
|
-
break
|
123
|
-
end
|
124
|
-
end
|
125
|
-
end
|
126
|
-
|
127
|
-
# Processes a single token
|
128
|
-
#
|
129
|
-
# @param [RubyToken::Token] tk the token to process
|
130
|
-
def process_token(tk)
|
131
|
-
# p tk.class, tk.text, @state, @level, @current_block, "<br/>"
|
132
|
-
case @state
|
133
|
-
when :first_statement
|
134
|
-
return if process_initial_comment(tk)
|
135
|
-
return if @statement.empty? && [TkSPACE, TkNL, TkCOMMENT].include?(tk.class)
|
136
|
-
@comments_last_line = nil
|
137
|
-
if @statement.empty? && tk.class == TkALIAS
|
138
|
-
@state = :alias_statement
|
139
|
-
@alias_values = []
|
140
|
-
push_token(tk)
|
141
|
-
return
|
142
|
-
end
|
143
|
-
return if process_simple_block_opener(tk)
|
144
|
-
push_token(tk)
|
145
|
-
return if process_complex_block_opener(tk)
|
146
|
-
|
147
|
-
if balances?(tk)
|
148
|
-
process_statement_end(tk)
|
149
|
-
else
|
150
|
-
@state = :balance
|
151
|
-
end
|
152
|
-
when :alias_statement
|
153
|
-
push_token(tk)
|
154
|
-
@alias_values << tk unless [TkSPACE, TkNL, TkCOMMENT].include?(tk.class)
|
155
|
-
if @alias_values.size == 2
|
156
|
-
@state = :first_statement
|
157
|
-
if [NilClass, TkNL, TkEND_OF_SCRIPT, TkSEMICOLON].include?(peek_no_space.class)
|
158
|
-
@done = true
|
159
|
-
end
|
160
|
-
end
|
161
|
-
when :balance
|
162
|
-
@statement << tk
|
163
|
-
return unless balances?(tk)
|
164
|
-
@state = :first_statement
|
165
|
-
process_statement_end(tk)
|
166
|
-
when :block_statement
|
167
|
-
push_token(tk)
|
168
|
-
return unless balances?(tk)
|
169
|
-
process_statement_end(tk)
|
170
|
-
when :pre_block
|
171
|
-
@current_block = nil
|
172
|
-
process_block_token(tk) unless tk.class == TkSEMICOLON
|
173
|
-
@state = :block
|
174
|
-
when :block
|
175
|
-
process_block_token(tk)
|
176
|
-
when :post_block
|
177
|
-
if tk.class == TkSPACE
|
178
|
-
@statement << tk
|
179
|
-
return
|
180
|
-
end
|
181
|
-
|
182
|
-
process_statement_end(tk)
|
183
|
-
@state = :block
|
184
|
-
end
|
185
|
-
|
186
|
-
if @first_line == tk.line_no && !@statement.empty? && TkCOMMENT === tk
|
187
|
-
process_initial_comment(tk)
|
188
|
-
end
|
189
|
-
end
|
190
|
-
|
191
|
-
# Processes a token in a block
|
192
|
-
#
|
193
|
-
# @param [RubyToken::Token] tk the token to process
|
194
|
-
def process_block_token(tk)
|
195
|
-
if balances?(tk)
|
196
|
-
@statement << tk
|
197
|
-
@state = :first_statement
|
198
|
-
process_statement_end(tk)
|
199
|
-
elsif @block_num > 1 || (@block.empty? && [TkSPACE, TkNL].include?(tk.class))
|
200
|
-
@statement << tk
|
201
|
-
else
|
202
|
-
if @block.empty?
|
203
|
-
@statement << TkBlockContents.new(tk.line_no, tk.char_no)
|
204
|
-
end
|
205
|
-
@block << tk
|
206
|
-
end
|
207
|
-
end
|
208
|
-
|
209
|
-
# Processes a comment token that comes before a statement
|
210
|
-
#
|
211
|
-
# @param [RubyToken::Token] tk the token to process
|
212
|
-
# @return [Boolean] whether or not +tk+ was processed as an initial comment
|
213
|
-
def process_initial_comment(tk)
|
214
|
-
if @statement.empty? && (@comments_last_line || 0) < tk.line_no - 2
|
215
|
-
@comments = nil
|
216
|
-
end
|
217
|
-
|
218
|
-
return unless tk.class == TkCOMMENT
|
219
|
-
|
220
|
-
case tk.text
|
221
|
-
when Parser::SourceParser::SHEBANG_LINE
|
222
|
-
if !@last_ns_tk && !@encoding_line
|
223
|
-
@shebang_line = tk.text
|
224
|
-
return
|
225
|
-
end
|
226
|
-
when Parser::SourceParser::ENCODING_LINE
|
227
|
-
if (@last_ns_tk.class == TkCOMMENT && @last_ns_tk.text == @shebang_line) ||
|
228
|
-
!@last_ns_tk
|
229
|
-
@encoding_line = tk.text
|
230
|
-
return
|
231
|
-
end
|
232
|
-
end
|
233
|
-
|
234
|
-
return if !@statement.empty? && @comments
|
235
|
-
return if @first_line && tk.line_no > @first_line
|
236
|
-
|
237
|
-
if @comments_last_line && @comments_last_line < tk.line_no - 1
|
238
|
-
if @comments && @statement.empty?
|
239
|
-
@tokens.unshift(tk)
|
240
|
-
return @done = true
|
241
|
-
end
|
242
|
-
@comments = nil
|
243
|
-
end
|
244
|
-
@comments_line = tk.line_no unless @comments
|
245
|
-
|
246
|
-
# Remove the "#" and up to 1 space before the text
|
247
|
-
# Since, of course, the convention is to have "# text"
|
248
|
-
# and not "#text", which I deem ugly (you heard it here first)
|
249
|
-
@comments ||= []
|
250
|
-
if tk.text.start_with?('=begin')
|
251
|
-
lines = tk.text.count("\n")
|
252
|
-
@comments += tk.text.gsub(/\A=begin.*\r?\n|\r?\n=end.*\r?\n?\Z/, '').split(/\r?\n/)
|
253
|
-
@comments_last_line = tk.line_no + lines
|
254
|
-
else
|
255
|
-
@comments << tk.text.gsub(/^(#+)\s{0,1}/, '')
|
256
|
-
@comments_hash_flag = $1 == '##' if @comments_hash_flag.nil?
|
257
|
-
@comments_last_line = tk.line_no
|
258
|
-
end
|
259
|
-
@comments.pop if @comments.size == 1 && @comments.first =~ /^\s*$/
|
260
|
-
true
|
261
|
-
end
|
262
|
-
|
263
|
-
# Processes a simple block-opening token;
|
264
|
-
# that is, a block opener such as +begin+ or +do+
|
265
|
-
# that isn't followed by an expression
|
266
|
-
#
|
267
|
-
# @param [RubyToken::Token] tk the token to process
|
268
|
-
def process_simple_block_opener(tk)
|
269
|
-
return unless [TkLBRACE, TkDO, TkBEGIN, TkELSE].include?(tk.class) &&
|
270
|
-
# Make sure hashes are parsed as hashes, not as blocks
|
271
|
-
(@last_ns_tk.nil? || @last_ns_tk.lex_state != EXPR_BEG)
|
272
|
-
|
273
|
-
@level += 1
|
274
|
-
@state = :block
|
275
|
-
@block_num += 1
|
276
|
-
if @block.nil?
|
277
|
-
@block = TokenList.new
|
278
|
-
tokens = [tk, TkStatementEnd.new(tk.line_no, tk.char_no)]
|
279
|
-
tokens = tokens.reverse if TkBEGIN === tk.class
|
280
|
-
@statement.concat(tokens)
|
281
|
-
else
|
282
|
-
@statement << tk
|
283
|
-
end
|
284
|
-
|
285
|
-
true
|
286
|
-
end
|
287
|
-
|
288
|
-
# Processes a complex block-opening token;
|
289
|
-
# that is, a block opener such as +while+ or +for+
|
290
|
-
# that is followed by an expression
|
291
|
-
#
|
292
|
-
# @param [RubyToken::Token] tk the token to process
|
293
|
-
def process_complex_block_opener(tk)
|
294
|
-
return unless OPEN_BLOCK_TOKENS.include?(tk.class)
|
295
|
-
|
296
|
-
@current_block = tk.class
|
297
|
-
@state = :block_statement
|
298
|
-
|
299
|
-
true
|
300
|
-
end
|
301
|
-
|
302
|
-
# Processes a token that closes a statement
|
303
|
-
#
|
304
|
-
# @param [RubyToken::Token] tk the token to process
|
305
|
-
def process_statement_end(tk)
|
306
|
-
# Whitespace means that we keep the same value of @new_statement as last token
|
307
|
-
return if tk.class == TkSPACE
|
308
|
-
|
309
|
-
return unless
|
310
|
-
# We might be coming after a statement-ending token...
|
311
|
-
(@last_tk && [TkSEMICOLON, TkNL, TkEND_OF_SCRIPT].include?(tk.class)) ||
|
312
|
-
# Or we might be at the beginning of an argument list
|
313
|
-
(@current_block == TkDEF && tk.class == TkRPAREN)
|
314
|
-
|
315
|
-
# Continue line ending on . or ::
|
316
|
-
return if @last_tk && [EXPR_DOT].include?(@last_tk.lex_state)
|
317
|
-
|
318
|
-
# Continue a possible existing new statement unless we just finished an expression...
|
319
|
-
return unless (@last_tk && [EXPR_END, EXPR_ARG].include?(@last_tk.lex_state)) ||
|
320
|
-
# Or we've opened a block and are ready to move into the body
|
321
|
-
(@current_block && [TkNL, TkSEMICOLON].include?(tk.class) &&
|
322
|
-
# Handle the case where the block statement's expression is on the next line
|
323
|
-
#
|
324
|
-
# while
|
325
|
-
# foo
|
326
|
-
# end
|
327
|
-
@last_ns_tk.class != @current_block &&
|
328
|
-
# And the case where part of the expression is on the next line
|
329
|
-
#
|
330
|
-
# while foo ||
|
331
|
-
# bar
|
332
|
-
# end
|
333
|
-
@last_tk.lex_state != EXPR_BEG)
|
334
|
-
|
335
|
-
# Continue with the statement if we've hit a comma in a def
|
336
|
-
return if @current_block == TkDEF && peek_no_space.class == TkCOMMA
|
337
|
-
|
338
|
-
if [TkEND_OF_SCRIPT, TkNL, TkSEMICOLON].include?(tk.class) && @state == :block_statement &&
|
339
|
-
[TkRBRACE, TkEND].include?(@last_ns_tk.class) && @level == 0
|
340
|
-
@current_block = nil
|
341
|
-
end
|
342
|
-
|
343
|
-
unless @current_block
|
344
|
-
@done = true
|
345
|
-
return
|
346
|
-
end
|
347
|
-
|
348
|
-
@state = :pre_block
|
349
|
-
@level += 1
|
350
|
-
@block_num += 1
|
351
|
-
unless @block
|
352
|
-
@block = TokenList.new
|
353
|
-
@statement << TkStatementEnd.new(tk.line_no, tk.char_no)
|
354
|
-
end
|
355
|
-
end
|
356
|
-
|
357
|
-
# Handles the balancing of parentheses and blocks
|
358
|
-
#
|
359
|
-
# @param [RubyToken::Token] tk the token to process
|
360
|
-
# @return [Boolean] whether or not the current statement's parentheses and blocks
|
361
|
-
# are balanced after +tk+
|
362
|
-
def balances?(tk)
|
363
|
-
unless [TkALIAS, TkDEF].include?(@last_ns_tk.class) || @before_last_ns_tk.class == TkALIAS
|
364
|
-
if [TkLPAREN, TkLBRACK, TkLBRACE, TkDO, TkBEGIN].include?(tk.class)
|
365
|
-
@level += 1
|
366
|
-
elsif OPEN_BLOCK_TOKENS.include?(tk.class)
|
367
|
-
@level += 1 unless tk.class == TkELSIF
|
368
|
-
elsif [TkRPAREN, TkRBRACK, TkRBRACE, TkEND].include?(tk.class) && @level > 0
|
369
|
-
@level -= 1
|
370
|
-
end
|
371
|
-
end
|
372
|
-
|
373
|
-
@level == 0
|
374
|
-
end
|
375
|
-
|
376
|
-
# Adds a token to the current statement,
|
377
|
-
# unless it's a newline, semicolon, or comment
|
378
|
-
#
|
379
|
-
# @param [RubyToken::Token] tk the token to process
|
380
|
-
def push_token(tk)
|
381
|
-
@first_line = tk.line_no if @statement.empty?
|
382
|
-
@statement << tk unless @level == 0 && [TkCOMMENT].include?(tk.class)
|
383
|
-
end
|
384
|
-
|
385
|
-
# Returns the next token in the stream that's not a space
|
386
|
-
#
|
387
|
-
# @return [RubyToken::Token] the next non-space token
|
388
|
-
def peek_no_space
|
389
|
-
return @tokens.first unless @tokens.first.class == TkSPACE
|
390
|
-
@tokens[1]
|
391
|
-
end
|
392
|
-
end
|
393
|
-
end
|
394
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module YARD
|
3
|
+
module Parser::Ruby::Legacy
|
4
|
+
class StatementList < Array
|
5
|
+
include RubyToken
|
6
|
+
|
7
|
+
attr_accessor :shebang_line, :encoding_line
|
8
|
+
|
9
|
+
# The following list of tokens will require a block to be opened
|
10
|
+
# if used at the beginning of a statement.
|
11
|
+
OPEN_BLOCK_TOKENS = [TkCLASS, TkDEF, TkMODULE, TkUNTIL,
|
12
|
+
TkIF, TkELSIF, TkUNLESS, TkWHILE, TkFOR, TkCASE]
|
13
|
+
|
14
|
+
# Creates a new statement list
|
15
|
+
#
|
16
|
+
# @param [TokenList, String] content the tokens to create the list from
|
17
|
+
def initialize(content)
|
18
|
+
@shebang_line = nil
|
19
|
+
@encoding_line = nil
|
20
|
+
@comments_last_line = nil
|
21
|
+
if content.is_a? TokenList
|
22
|
+
@tokens = content.dup
|
23
|
+
elsif content.is_a? String
|
24
|
+
@tokens = TokenList.new(content.delete("\r"))
|
25
|
+
else
|
26
|
+
raise ArgumentError, "Invalid content for StatementList: #{content.inspect}:#{content.class}"
|
27
|
+
end
|
28
|
+
|
29
|
+
parse_statements
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def parse_statements
|
35
|
+
loop do
|
36
|
+
stmt = next_statement
|
37
|
+
break if stmt.nil?
|
38
|
+
self << stmt
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# Returns the next statement in the token stream
|
43
|
+
#
|
44
|
+
# @return [Statement] the next statement
|
45
|
+
def next_statement
|
46
|
+
@state = :first_statement
|
47
|
+
@statement_stack = []
|
48
|
+
@level = 0
|
49
|
+
@block_num = 0
|
50
|
+
@done = false
|
51
|
+
@current_block = nil
|
52
|
+
@comments_line = nil
|
53
|
+
@comments_hash_flag = nil
|
54
|
+
@statement = TokenList.new
|
55
|
+
@block = nil
|
56
|
+
@comments = nil
|
57
|
+
@last_tk = nil
|
58
|
+
@last_ns_tk = nil
|
59
|
+
@before_last_tk = nil
|
60
|
+
@before_last_ns_tk = nil
|
61
|
+
@first_line = nil
|
62
|
+
|
63
|
+
until @done
|
64
|
+
tk = @tokens.shift
|
65
|
+
break if tk.nil?
|
66
|
+
process_token(tk)
|
67
|
+
|
68
|
+
@before_last_tk = @last_tk
|
69
|
+
@last_tk = tk # Save last token
|
70
|
+
unless [TkSPACE, TkNL, TkEND_OF_SCRIPT].include? tk.class
|
71
|
+
@before_last_ns_tk = @last_ns_tk
|
72
|
+
@last_ns_tk = tk
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
# Return the code block with starting token and initial comments
|
77
|
+
# If there is no code in the block, return nil
|
78
|
+
@comments = @comments.compact if @comments
|
79
|
+
if @block || !@statement.empty?
|
80
|
+
sanitize_statement_end
|
81
|
+
sanitize_block
|
82
|
+
@statement.pop if [TkNL, TkSPACE, TkSEMICOLON].include?(@statement.last.class)
|
83
|
+
stmt = Statement.new(@statement, @block, @comments)
|
84
|
+
if @comments && @comments_line
|
85
|
+
stmt.comments_range = (@comments_line..(@comments_line + @comments.size - 1))
|
86
|
+
stmt.comments_hash_flag = @comments_hash_flag
|
87
|
+
end
|
88
|
+
stmt
|
89
|
+
elsif @comments
|
90
|
+
@statement << TkCOMMENT.new(@comments_line, 0)
|
91
|
+
@statement.first.set_text("# " + @comments.join("\n# "))
|
92
|
+
Statement.new(@statement, nil, @comments)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def sanitize_statement_end
|
97
|
+
extra = []
|
98
|
+
(@statement.size - 1).downto(0) do |index|
|
99
|
+
token = @statement[index]
|
100
|
+
next unless TkStatementEnd === token
|
101
|
+
|
102
|
+
while [TkNL, TkSPACE, TkSEMICOLON].include?(@statement[index - 1].class)
|
103
|
+
extra.unshift(@statement.delete_at(index - 1))
|
104
|
+
index -= 1
|
105
|
+
end
|
106
|
+
@statement.insert(index + 1, *extra)
|
107
|
+
break
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def sanitize_block
|
112
|
+
return unless @block
|
113
|
+
extra = []
|
114
|
+
while [TkSPACE, TkNL, TkSEMICOLON].include?(@block.last.class)
|
115
|
+
next(@block.pop) if TkSEMICOLON === @block.last
|
116
|
+
extra.unshift(@block.pop)
|
117
|
+
end
|
118
|
+
|
119
|
+
@statement.each_with_index do |token, index|
|
120
|
+
if TkBlockContents === token
|
121
|
+
@statement[index, 1] = [token, *extra]
|
122
|
+
break
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
# Processes a single token
|
128
|
+
#
|
129
|
+
# @param [RubyToken::Token] tk the token to process
|
130
|
+
def process_token(tk)
|
131
|
+
# p tk.class, tk.text, @state, @level, @current_block, "<br/>"
|
132
|
+
case @state
|
133
|
+
when :first_statement
|
134
|
+
return if process_initial_comment(tk)
|
135
|
+
return if @statement.empty? && [TkSPACE, TkNL, TkCOMMENT].include?(tk.class)
|
136
|
+
@comments_last_line = nil
|
137
|
+
if @statement.empty? && tk.class == TkALIAS
|
138
|
+
@state = :alias_statement
|
139
|
+
@alias_values = []
|
140
|
+
push_token(tk)
|
141
|
+
return
|
142
|
+
end
|
143
|
+
return if process_simple_block_opener(tk)
|
144
|
+
push_token(tk)
|
145
|
+
return if process_complex_block_opener(tk)
|
146
|
+
|
147
|
+
if balances?(tk)
|
148
|
+
process_statement_end(tk)
|
149
|
+
else
|
150
|
+
@state = :balance
|
151
|
+
end
|
152
|
+
when :alias_statement
|
153
|
+
push_token(tk)
|
154
|
+
@alias_values << tk unless [TkSPACE, TkNL, TkCOMMENT].include?(tk.class)
|
155
|
+
if @alias_values.size == 2
|
156
|
+
@state = :first_statement
|
157
|
+
if [NilClass, TkNL, TkEND_OF_SCRIPT, TkSEMICOLON].include?(peek_no_space.class)
|
158
|
+
@done = true
|
159
|
+
end
|
160
|
+
end
|
161
|
+
when :balance
|
162
|
+
@statement << tk
|
163
|
+
return unless balances?(tk)
|
164
|
+
@state = :first_statement
|
165
|
+
process_statement_end(tk)
|
166
|
+
when :block_statement
|
167
|
+
push_token(tk)
|
168
|
+
return unless balances?(tk)
|
169
|
+
process_statement_end(tk)
|
170
|
+
when :pre_block
|
171
|
+
@current_block = nil
|
172
|
+
process_block_token(tk) unless tk.class == TkSEMICOLON
|
173
|
+
@state = :block
|
174
|
+
when :block
|
175
|
+
process_block_token(tk)
|
176
|
+
when :post_block
|
177
|
+
if tk.class == TkSPACE
|
178
|
+
@statement << tk
|
179
|
+
return
|
180
|
+
end
|
181
|
+
|
182
|
+
process_statement_end(tk)
|
183
|
+
@state = :block
|
184
|
+
end
|
185
|
+
|
186
|
+
if @first_line == tk.line_no && !@statement.empty? && TkCOMMENT === tk
|
187
|
+
process_initial_comment(tk)
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
# Processes a token in a block
|
192
|
+
#
|
193
|
+
# @param [RubyToken::Token] tk the token to process
|
194
|
+
def process_block_token(tk)
|
195
|
+
if balances?(tk)
|
196
|
+
@statement << tk
|
197
|
+
@state = :first_statement
|
198
|
+
process_statement_end(tk)
|
199
|
+
elsif @block_num > 1 || (@block.empty? && [TkSPACE, TkNL].include?(tk.class))
|
200
|
+
@statement << tk
|
201
|
+
else
|
202
|
+
if @block.empty?
|
203
|
+
@statement << TkBlockContents.new(tk.line_no, tk.char_no)
|
204
|
+
end
|
205
|
+
@block << tk
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
# Processes a comment token that comes before a statement
|
210
|
+
#
|
211
|
+
# @param [RubyToken::Token] tk the token to process
|
212
|
+
# @return [Boolean] whether or not +tk+ was processed as an initial comment
|
213
|
+
def process_initial_comment(tk)
|
214
|
+
if @statement.empty? && (@comments_last_line || 0) < tk.line_no - 2
|
215
|
+
@comments = nil
|
216
|
+
end
|
217
|
+
|
218
|
+
return unless tk.class == TkCOMMENT
|
219
|
+
|
220
|
+
case tk.text
|
221
|
+
when Parser::SourceParser::SHEBANG_LINE
|
222
|
+
if !@last_ns_tk && !@encoding_line
|
223
|
+
@shebang_line = tk.text
|
224
|
+
return
|
225
|
+
end
|
226
|
+
when Parser::SourceParser::ENCODING_LINE
|
227
|
+
if (@last_ns_tk.class == TkCOMMENT && @last_ns_tk.text == @shebang_line) ||
|
228
|
+
!@last_ns_tk
|
229
|
+
@encoding_line = tk.text
|
230
|
+
return
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
234
|
+
return if !@statement.empty? && @comments
|
235
|
+
return if @first_line && tk.line_no > @first_line
|
236
|
+
|
237
|
+
if @comments_last_line && @comments_last_line < tk.line_no - 1
|
238
|
+
if @comments && @statement.empty?
|
239
|
+
@tokens.unshift(tk)
|
240
|
+
return @done = true
|
241
|
+
end
|
242
|
+
@comments = nil
|
243
|
+
end
|
244
|
+
@comments_line = tk.line_no unless @comments
|
245
|
+
|
246
|
+
# Remove the "#" and up to 1 space before the text
|
247
|
+
# Since, of course, the convention is to have "# text"
|
248
|
+
# and not "#text", which I deem ugly (you heard it here first)
|
249
|
+
@comments ||= []
|
250
|
+
if tk.text.start_with?('=begin')
|
251
|
+
lines = tk.text.count("\n")
|
252
|
+
@comments += tk.text.gsub(/\A=begin.*\r?\n|\r?\n=end.*\r?\n?\Z/, '').split(/\r?\n/)
|
253
|
+
@comments_last_line = tk.line_no + lines
|
254
|
+
else
|
255
|
+
@comments << tk.text.gsub(/^(#+)\s{0,1}/, '')
|
256
|
+
@comments_hash_flag = $1 == '##' if @comments_hash_flag.nil?
|
257
|
+
@comments_last_line = tk.line_no
|
258
|
+
end
|
259
|
+
@comments.pop if @comments.size == 1 && @comments.first =~ /^\s*$/
|
260
|
+
true
|
261
|
+
end
|
262
|
+
|
263
|
+
# Processes a simple block-opening token;
|
264
|
+
# that is, a block opener such as +begin+ or +do+
|
265
|
+
# that isn't followed by an expression
|
266
|
+
#
|
267
|
+
# @param [RubyToken::Token] tk the token to process
|
268
|
+
def process_simple_block_opener(tk)
|
269
|
+
return unless [TkLBRACE, TkDO, TkBEGIN, TkELSE].include?(tk.class) &&
|
270
|
+
# Make sure hashes are parsed as hashes, not as blocks
|
271
|
+
(@last_ns_tk.nil? || @last_ns_tk.lex_state != EXPR_BEG)
|
272
|
+
|
273
|
+
@level += 1
|
274
|
+
@state = :block
|
275
|
+
@block_num += 1
|
276
|
+
if @block.nil?
|
277
|
+
@block = TokenList.new
|
278
|
+
tokens = [tk, TkStatementEnd.new(tk.line_no, tk.char_no)]
|
279
|
+
tokens = tokens.reverse if TkBEGIN === tk.class
|
280
|
+
@statement.concat(tokens)
|
281
|
+
else
|
282
|
+
@statement << tk
|
283
|
+
end
|
284
|
+
|
285
|
+
true
|
286
|
+
end
|
287
|
+
|
288
|
+
# Processes a complex block-opening token;
|
289
|
+
# that is, a block opener such as +while+ or +for+
|
290
|
+
# that is followed by an expression
|
291
|
+
#
|
292
|
+
# @param [RubyToken::Token] tk the token to process
|
293
|
+
def process_complex_block_opener(tk)
|
294
|
+
return unless OPEN_BLOCK_TOKENS.include?(tk.class)
|
295
|
+
|
296
|
+
@current_block = tk.class
|
297
|
+
@state = :block_statement
|
298
|
+
|
299
|
+
true
|
300
|
+
end
|
301
|
+
|
302
|
+
# Processes a token that closes a statement
|
303
|
+
#
|
304
|
+
# @param [RubyToken::Token] tk the token to process
|
305
|
+
def process_statement_end(tk)
|
306
|
+
# Whitespace means that we keep the same value of @new_statement as last token
|
307
|
+
return if tk.class == TkSPACE
|
308
|
+
|
309
|
+
return unless
|
310
|
+
# We might be coming after a statement-ending token...
|
311
|
+
(@last_tk && [TkSEMICOLON, TkNL, TkEND_OF_SCRIPT].include?(tk.class)) ||
|
312
|
+
# Or we might be at the beginning of an argument list
|
313
|
+
(@current_block == TkDEF && tk.class == TkRPAREN)
|
314
|
+
|
315
|
+
# Continue line ending on . or ::
|
316
|
+
return if @last_tk && [EXPR_DOT].include?(@last_tk.lex_state)
|
317
|
+
|
318
|
+
# Continue a possible existing new statement unless we just finished an expression...
|
319
|
+
return unless (@last_tk && [EXPR_END, EXPR_ARG].include?(@last_tk.lex_state)) ||
|
320
|
+
# Or we've opened a block and are ready to move into the body
|
321
|
+
(@current_block && [TkNL, TkSEMICOLON].include?(tk.class) &&
|
322
|
+
# Handle the case where the block statement's expression is on the next line
|
323
|
+
#
|
324
|
+
# while
|
325
|
+
# foo
|
326
|
+
# end
|
327
|
+
@last_ns_tk.class != @current_block &&
|
328
|
+
# And the case where part of the expression is on the next line
|
329
|
+
#
|
330
|
+
# while foo ||
|
331
|
+
# bar
|
332
|
+
# end
|
333
|
+
@last_tk.lex_state != EXPR_BEG)
|
334
|
+
|
335
|
+
# Continue with the statement if we've hit a comma in a def
|
336
|
+
return if @current_block == TkDEF && peek_no_space.class == TkCOMMA
|
337
|
+
|
338
|
+
if [TkEND_OF_SCRIPT, TkNL, TkSEMICOLON].include?(tk.class) && @state == :block_statement &&
|
339
|
+
[TkRBRACE, TkEND].include?(@last_ns_tk.class) && @level == 0
|
340
|
+
@current_block = nil
|
341
|
+
end
|
342
|
+
|
343
|
+
unless @current_block
|
344
|
+
@done = true
|
345
|
+
return
|
346
|
+
end
|
347
|
+
|
348
|
+
@state = :pre_block
|
349
|
+
@level += 1
|
350
|
+
@block_num += 1
|
351
|
+
unless @block
|
352
|
+
@block = TokenList.new
|
353
|
+
@statement << TkStatementEnd.new(tk.line_no, tk.char_no)
|
354
|
+
end
|
355
|
+
end
|
356
|
+
|
357
|
+
# Handles the balancing of parentheses and blocks
|
358
|
+
#
|
359
|
+
# @param [RubyToken::Token] tk the token to process
|
360
|
+
# @return [Boolean] whether or not the current statement's parentheses and blocks
|
361
|
+
# are balanced after +tk+
|
362
|
+
def balances?(tk)
|
363
|
+
unless [TkALIAS, TkDEF].include?(@last_ns_tk.class) || @before_last_ns_tk.class == TkALIAS
|
364
|
+
if [TkLPAREN, TkLBRACK, TkLBRACE, TkDO, TkBEGIN].include?(tk.class)
|
365
|
+
@level += 1
|
366
|
+
elsif OPEN_BLOCK_TOKENS.include?(tk.class)
|
367
|
+
@level += 1 unless tk.class == TkELSIF
|
368
|
+
elsif [TkRPAREN, TkRBRACK, TkRBRACE, TkEND].include?(tk.class) && @level > 0
|
369
|
+
@level -= 1
|
370
|
+
end
|
371
|
+
end
|
372
|
+
|
373
|
+
@level == 0
|
374
|
+
end
|
375
|
+
|
376
|
+
# Adds a token to the current statement,
|
377
|
+
# unless it's a newline, semicolon, or comment
|
378
|
+
#
|
379
|
+
# @param [RubyToken::Token] tk the token to process
|
380
|
+
def push_token(tk)
|
381
|
+
@first_line = tk.line_no if @statement.empty?
|
382
|
+
@statement << tk unless @level == 0 && [TkCOMMENT].include?(tk.class)
|
383
|
+
end
|
384
|
+
|
385
|
+
# Returns the next token in the stream that's not a space
|
386
|
+
#
|
387
|
+
# @return [RubyToken::Token] the next non-space token
|
388
|
+
def peek_no_space
|
389
|
+
return @tokens.first unless @tokens.first.class == TkSPACE
|
390
|
+
@tokens[1]
|
391
|
+
end
|
392
|
+
end
|
393
|
+
end
|
394
|
+
end
|