yard 0.2.2 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of yard might be problematic. Click here for more details.
- data/LICENSE +1 -1
- data/README.markdown +200 -0
- data/Rakefile +6 -1
- data/benchmarks/format_args.rb +46 -0
- data/benchmarks/parsing.rb +13 -1
- data/benchmarks/rdoc_vs_yardoc.rb +10 -0
- data/benchmarks/ripper_parser.rb +12 -0
- data/docs/CODE_OBJECTS.markdown +121 -0
- data/docs/FAQ.markdown +34 -0
- data/docs/GENERATORS.markdown +211 -0
- data/docs/GETTING_STARTED.markdown +263 -0
- data/docs/GLOSSARY.markdown +13 -0
- data/docs/HANDLERS.markdown +158 -0
- data/docs/OVERVIEW.markdown +64 -0
- data/docs/PARSER.markdown +180 -0
- data/docs/TAGS.markdown +181 -0
- data/docs/WHATSNEW.markdown +96 -0
- data/docs/images/code-objects-class-diagram.png +0 -0
- data/docs/images/handlers-class-diagram.png +0 -0
- data/docs/images/overview-class-diagram.png +0 -0
- data/docs/images/parser-class-diagram.png +0 -0
- data/docs/images/tags-class-diagram.png +0 -0
- data/lib/yard.rb +4 -1
- data/lib/yard/autoload.rb +79 -31
- data/lib/yard/cli/yard_graph.rb +8 -2
- data/lib/yard/cli/yardoc.rb +61 -8
- data/lib/yard/code_objects/base.rb +78 -135
- data/lib/yard/code_objects/class_object.rb +9 -8
- data/lib/yard/code_objects/constant_object.rb +1 -0
- data/lib/yard/code_objects/extended_method_object.rb +9 -0
- data/lib/yard/code_objects/method_object.rb +18 -5
- data/lib/yard/code_objects/module_object.rb +8 -1
- data/lib/yard/code_objects/namespace_object.rb +25 -16
- data/lib/yard/code_objects/proxy.rb +22 -22
- data/lib/yard/core_ext/file.rb +1 -1
- data/lib/yard/core_ext/string.rb +0 -4
- data/lib/yard/core_ext/symbol_hash.rb +3 -2
- data/lib/yard/docstring.rb +180 -0
- data/lib/yard/generators/base.rb +33 -13
- data/lib/yard/generators/class_generator.rb +4 -2
- data/lib/yard/generators/constants_generator.rb +3 -2
- data/lib/yard/generators/full_doc_generator.rb +76 -9
- data/lib/yard/generators/helpers/base_helper.rb +18 -1
- data/lib/yard/generators/helpers/filter_helper.rb +2 -2
- data/lib/yard/generators/helpers/html_helper.rb +94 -39
- data/lib/yard/generators/helpers/html_syntax_highlight_helper.rb +49 -0
- data/lib/yard/generators/helpers/markup_helper.rb +86 -0
- data/lib/yard/generators/helpers/method_helper.rb +23 -7
- data/lib/yard/generators/method_generator.rb +15 -3
- data/lib/yard/generators/method_listing_generator.rb +3 -3
- data/lib/yard/generators/mixins_generator.rb +8 -2
- data/lib/yard/generators/module_generator.rb +3 -2
- data/lib/yard/generators/overloads_generator.rb +20 -0
- data/lib/yard/generators/quick_doc_generator.rb +3 -9
- data/lib/yard/generators/root_generator.rb +32 -0
- data/lib/yard/generators/source_generator.rb +2 -17
- data/lib/yard/generators/tags_generator.rb +34 -6
- data/lib/yard/generators/uml_generator.rb +16 -6
- data/lib/yard/handlers/base.rb +88 -253
- data/lib/yard/handlers/processor.rb +72 -0
- data/lib/yard/handlers/ruby/alias_handler.rb +38 -0
- data/lib/yard/handlers/ruby/attribute_handler.rb +69 -0
- data/lib/yard/handlers/ruby/base.rb +72 -0
- data/lib/yard/handlers/ruby/class_condition_handler.rb +70 -0
- data/lib/yard/handlers/ruby/class_handler.rb +74 -0
- data/lib/yard/handlers/ruby/class_variable_handler.rb +11 -0
- data/lib/yard/handlers/ruby/constant_handler.rb +12 -0
- data/lib/yard/handlers/ruby/exception_handler.rb +22 -0
- data/lib/yard/handlers/ruby/extend_handler.rb +19 -0
- data/lib/yard/handlers/{alias_handler.rb → ruby/legacy/alias_handler.rb} +3 -4
- data/lib/yard/handlers/{attribute_handler.rb → ruby/legacy/attribute_handler.rb} +2 -2
- data/lib/yard/handlers/ruby/legacy/base.rb +198 -0
- data/lib/yard/handlers/{class_handler.rb → ruby/legacy/class_handler.rb} +18 -6
- data/lib/yard/handlers/{class_variable_handler.rb → ruby/legacy/class_variable_handler.rb} +1 -1
- data/lib/yard/handlers/{constant_handler.rb → ruby/legacy/constant_handler.rb} +2 -2
- data/lib/yard/handlers/{exception_handler.rb → ruby/legacy/exception_handler.rb} +3 -3
- data/lib/yard/handlers/ruby/legacy/extend_handler.rb +18 -0
- data/lib/yard/handlers/ruby/legacy/method_handler.rb +31 -0
- data/lib/yard/handlers/ruby/legacy/mixin_handler.rb +28 -0
- data/lib/yard/handlers/{module_handler.rb → ruby/legacy/module_handler.rb} +1 -1
- data/lib/yard/handlers/{visibility_handler.rb → ruby/legacy/visibility_handler.rb} +1 -1
- data/lib/yard/handlers/{yield_handler.rb → ruby/legacy/yield_handler.rb} +4 -4
- data/lib/yard/handlers/ruby/method_condition_handler.rb +7 -0
- data/lib/yard/handlers/ruby/method_handler.rb +48 -0
- data/lib/yard/handlers/ruby/mixin_handler.rb +25 -0
- data/lib/yard/handlers/ruby/module_handler.rb +9 -0
- data/lib/yard/handlers/ruby/visibility_handler.rb +18 -0
- data/lib/yard/handlers/ruby/yield_handler.rb +28 -0
- data/lib/yard/parser/ruby/ast_node.rb +263 -0
- data/lib/yard/parser/{ruby_lex.rb → ruby/legacy/ruby_lex.rb} +258 -259
- data/lib/yard/parser/{statement.rb → ruby/legacy/statement.rb} +8 -4
- data/lib/yard/parser/ruby/legacy/statement_list.rb +262 -0
- data/lib/yard/parser/{token_list.rb → ruby/legacy/token_list.rb} +1 -1
- data/lib/yard/parser/ruby/ruby_parser.rb +307 -0
- data/lib/yard/parser/source_parser.rb +76 -45
- data/lib/yard/rake/yardoc_task.rb +6 -1
- data/lib/yard/registry.rb +45 -19
- data/lib/yard/serializers/file_system_serializer.rb +8 -3
- data/lib/yard/tags/default_factory.rb +70 -10
- data/lib/yard/tags/default_tag.rb +12 -0
- data/lib/yard/tags/library.rb +65 -26
- data/lib/yard/tags/option_tag.rb +12 -0
- data/lib/yard/tags/overload_tag.rb +62 -0
- data/lib/yard/tags/ref_tag.rb +7 -0
- data/lib/yard/tags/ref_tag_list.rb +27 -0
- data/lib/yard/tags/tag.rb +1 -0
- data/lib/yard/tags/tag_format_error.rb +6 -0
- data/spec/cli/yardoc_spec.rb +43 -0
- data/spec/code_objects/base_spec.rb +56 -68
- data/spec/code_objects/class_object_spec.rb +18 -6
- data/spec/code_objects/constants_spec.rb +2 -0
- data/spec/code_objects/method_object_spec.rb +33 -5
- data/spec/code_objects/module_object_spec.rb +66 -8
- data/spec/code_objects/namespace_object_spec.rb +37 -17
- data/spec/code_objects/proxy_spec.rb +13 -2
- data/spec/core_ext/string_spec.rb +14 -2
- data/spec/core_ext/symbol_hash_spec.rb +9 -3
- data/spec/docstring_spec.rb +139 -0
- data/spec/generators/full_doc_generator_spec.rb +29 -0
- data/spec/generators/helpers/html_helper_spec.rb +74 -0
- data/spec/generators/helpers/markup_helper_spec.rb +95 -0
- data/spec/handlers/alias_handler_spec.rb +16 -3
- data/spec/handlers/attribute_handler_spec.rb +1 -1
- data/spec/handlers/base_spec.rb +15 -141
- data/spec/handlers/class_condition_handler_spec.rb +49 -0
- data/spec/handlers/class_handler_spec.rb +44 -3
- data/spec/handlers/class_variable_handler_spec.rb +1 -1
- data/spec/handlers/constant_handler_spec.rb +1 -1
- data/spec/handlers/examples/alias_handler_001.rb.txt +7 -3
- data/spec/handlers/examples/class_condition_handler_001.rb.txt +61 -0
- data/spec/handlers/examples/class_handler_001.rb.txt +33 -0
- data/spec/handlers/examples/exception_handler_001.rb.txt +1 -1
- data/spec/handlers/examples/extend_handler_001.rb.txt +8 -0
- data/spec/handlers/examples/method_condition_handler_001.rb.txt +10 -0
- data/spec/handlers/examples/method_handler_001.rb.txt +16 -4
- data/spec/handlers/examples/mixin_handler_001.rb.txt +10 -2
- data/spec/handlers/examples/module_handler_001.rb.txt +4 -0
- data/spec/handlers/examples/visibility_handler_001.rb.txt +1 -1
- data/spec/handlers/exception_handler_spec.rb +2 -2
- data/spec/handlers/extend_handler_spec.rb +15 -0
- data/spec/handlers/legacy_base_spec.rb +128 -0
- data/spec/handlers/method_condition_handler_spec.rb +14 -0
- data/spec/handlers/method_handler_spec.rb +38 -5
- data/spec/handlers/mixin_handler_spec.rb +15 -7
- data/spec/handlers/module_handler_spec.rb +5 -1
- data/spec/handlers/processor_spec.rb +19 -0
- data/spec/handlers/ruby/base_spec.rb +90 -0
- data/spec/handlers/ruby/legacy/base_spec.rb +53 -0
- data/spec/handlers/spec_helper.rb +22 -16
- data/spec/handlers/visibility_handler_spec.rb +4 -4
- data/spec/handlers/yield_handler_spec.rb +1 -1
- data/spec/parser/ruby/ast_node_spec.rb +15 -0
- data/spec/parser/ruby/legacy/statement_list_spec.rb +145 -0
- data/spec/parser/{token_list_spec.rb → ruby/legacy/token_list_spec.rb} +4 -4
- data/spec/parser/source_parser_spec.rb +0 -15
- data/spec/rake/yardoc_task_spec.rb +48 -0
- data/spec/registry_spec.rb +28 -2
- data/spec/serializers/file_system_serializer_spec.rb +7 -1
- data/spec/spec_helper.rb +1 -1
- data/spec/tags/default_factory_spec.rb +135 -0
- data/spec/tags/default_tag_spec.rb +11 -0
- data/spec/tags/overload_tag_spec.rb +35 -0
- data/spec/tags/ref_tag_list_spec.rb +53 -0
- data/templates/default/attributes/html/header.erb +17 -5
- data/templates/default/attributes/text/header.erb +1 -1
- data/templates/default/fulldoc/html/all_files.erb +19 -0
- data/templates/default/fulldoc/html/all_methods.erb +8 -7
- data/templates/default/fulldoc/html/all_namespaces.erb +4 -1
- data/templates/default/fulldoc/html/app.js +1 -1
- data/templates/default/fulldoc/html/{readme.erb → file.erb} +2 -2
- data/templates/default/fulldoc/html/header.erb +1 -1
- data/templates/default/fulldoc/html/index.erb +4 -3
- data/templates/default/fulldoc/html/style.css +13 -3
- data/templates/default/fulldoc/html/syntax_highlight.css +8 -5
- data/templates/default/method/text/header.erb +1 -0
- data/templates/default/method/text/title.erb +1 -0
- data/templates/default/methodsignature/html/main.erb +10 -8
- data/templates/default/methodsignature/text/main.erb +4 -1
- data/templates/default/methodsummary/html/summary.erb +8 -4
- data/templates/default/methodsummary/text/summary.erb +4 -1
- data/templates/default/mixins/html/header.erb +3 -3
- data/templates/default/overloads/html/header.erb +8 -0
- data/templates/default/overloads/text/header.erb +8 -0
- data/templates/default/root/html/header.erb +4 -0
- data/templates/default/tags/html/example.erb +20 -0
- data/templates/default/tags/html/option.erb +27 -0
- data/templates/default/tags/html/param.erb +21 -0
- data/templates/default/tags/html/tags.erb +4 -1
- data/templates/default/tags/html/todo.erb +8 -0
- data/templates/default/tags/text/example.erb +14 -0
- data/templates/default/tags/text/header.erb +3 -3
- data/templates/default/tags/text/option.erb +5 -0
- data/templates/default/tags/text/param.erb +9 -0
- data/templates/default/uml/dot/dependencies.erb +1 -1
- data/templates/default/uml/dot/info.erb +1 -1
- data/templates/default/uml/dot/superclasses.erb +2 -2
- data/templates/javadoc/methodsummary/html/summary.erb +2 -2
- data/templates/javadoc/mixins/html/header.erb +3 -3
- metadata +108 -139
- data/README +0 -211
- data/lib/yard/handlers/method_handler.rb +0 -27
- data/lib/yard/handlers/mixin_handler.rb +0 -16
- data/lib/yard/parser/statement_list.rb +0 -167
- data/lib/yard/tags/merbdoc_factory.rb +0 -47
@@ -0,0 +1,19 @@
|
|
1
|
+
# `extend` works just like `include` except that it always
|
2
|
+
# mixes the module in in class scope,
|
3
|
+
# and that it can handle `extend self`.
|
4
|
+
class YARD::Handlers::Ruby::ExtendHandler < YARD::Handlers::Ruby::MixinHandler
|
5
|
+
namespace_only
|
6
|
+
handles method_call(:extend)
|
7
|
+
|
8
|
+
def scope; :class end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def process_mixin(mixin)
|
13
|
+
if mixin == s(:var_ref, s(:kw, "self"))
|
14
|
+
namespace.mixins(scope) << namespace
|
15
|
+
else
|
16
|
+
super
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
class YARD::Handlers::AliasHandler < YARD::Handlers::Base
|
1
|
+
class YARD::Handlers::Ruby::Legacy::AliasHandler < YARD::Handlers::Ruby::Legacy::Base
|
2
2
|
handles /\Aalias(_method)?(\s|\()/
|
3
3
|
|
4
4
|
def process
|
@@ -8,15 +8,14 @@ class YARD::Handlers::AliasHandler < YARD::Handlers::Base
|
|
8
8
|
else
|
9
9
|
names = tokval_list(statement.tokens[2..-1], :attr)
|
10
10
|
end
|
11
|
-
raise YARD::
|
11
|
+
raise YARD::Parser::UndocumentableError, statement.tokens.first.text if names.size != 2
|
12
12
|
|
13
13
|
new_meth, old_meth = names[0].to_sym, names[1].to_sym
|
14
14
|
old_obj = namespace.child(:name => old_meth, :scope => scope)
|
15
15
|
new_obj = register MethodObject.new(namespace, new_meth, scope) do |o|
|
16
16
|
o.visibility = visibility
|
17
17
|
o.scope = scope
|
18
|
-
o.
|
19
|
-
o.file = parser.file
|
18
|
+
o.add_file(parser.file, statement.tokens.first.line_no)
|
20
19
|
o.docstring = statement.comments
|
21
20
|
|
22
21
|
if old_obj
|
@@ -1,4 +1,4 @@
|
|
1
|
-
class YARD::Handlers::AttributeHandler < YARD::Handlers::Base
|
1
|
+
class YARD::Handlers::Ruby::Legacy::AttributeHandler < YARD::Handlers::Ruby::Legacy::Base
|
2
2
|
handles /\Aattr(?:_(?:reader|writer|accessor))?(?:\s|\()/
|
3
3
|
|
4
4
|
def process
|
@@ -7,7 +7,7 @@ class YARD::Handlers::AttributeHandler < YARD::Handlers::Base
|
|
7
7
|
symbols = tokval_list statement.tokens[2..-1], :attr, TkTRUE, TkFALSE
|
8
8
|
read, write = true, false
|
9
9
|
rescue SyntaxError
|
10
|
-
raise YARD::
|
10
|
+
raise YARD::Parser::UndocumentableError, attr_type
|
11
11
|
end
|
12
12
|
|
13
13
|
# Change read/write based on attr_reader/writer/accessor
|
@@ -0,0 +1,198 @@
|
|
1
|
+
module YARD
|
2
|
+
module Handlers
|
3
|
+
module Ruby::Legacy
|
4
|
+
class Base < Handlers::Base
|
5
|
+
# For tokens like TkDEF, TkCLASS, etc.
|
6
|
+
include YARD::Parser::Ruby::Legacy::RubyToken
|
7
|
+
|
8
|
+
def self.handles?(stmt)
|
9
|
+
handlers.any? do |a_handler|
|
10
|
+
case a_handler
|
11
|
+
when String
|
12
|
+
stmt.tokens.first.text == a_handler
|
13
|
+
when Regexp
|
14
|
+
stmt.tokens.to_s =~ a_handler
|
15
|
+
else
|
16
|
+
a_handler == stmt.tokens.first.class
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
protected
|
22
|
+
|
23
|
+
def parse_block(opts = {})
|
24
|
+
push_state(opts) do
|
25
|
+
if statement.block
|
26
|
+
blk = Parser::Ruby::Legacy::StatementList.new(statement.block)
|
27
|
+
parser.process(blk)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# The string value of a token. For example, the return value for the symbol :sym
|
33
|
+
# would be :sym. The return value for a string "foo #{bar}" would be the literal
|
34
|
+
# "foo #{bar}" without any interpolation. The return value of the identifier
|
35
|
+
# 'test' would be the same value: 'test'. Here is a list of common types and
|
36
|
+
# their return values:
|
37
|
+
#
|
38
|
+
# @example
|
39
|
+
# tokval(TokenList.new('"foo"').first) => "foo"
|
40
|
+
# tokval(TokenList.new(':foo').first) => :foo
|
41
|
+
# tokval(TokenList.new('CONSTANT').first, RubyToken::TkId) => "CONSTANT"
|
42
|
+
# tokval(TokenList.new('identifier').first, RubyToken::TkId) => "identifier"
|
43
|
+
# tokval(TokenList.new('3.25').first) => 3.25
|
44
|
+
# tokval(TokenList.new('/xyz/i').first) => /xyz/i
|
45
|
+
#
|
46
|
+
# @param [Token] token The token of the class
|
47
|
+
#
|
48
|
+
# @param [Array<Class<Token>>, Symbol] accepted_types
|
49
|
+
# The allowed token types that this token can be. Defaults to [{TkVal}].
|
50
|
+
# A list of types would be, for example, [{TkSTRING}, {TkSYMBOL}], to return
|
51
|
+
# the token's value if it is either of those types. If +TkVal+ is accepted,
|
52
|
+
# +TkNode+ is also accepted.
|
53
|
+
#
|
54
|
+
# Certain symbol keys are allowed to specify multiple types in one fell swoop.
|
55
|
+
# These symbols are:
|
56
|
+
# :string => +TkSTRING+, +TkDSTRING+, +TkDXSTRING+ and +TkXSTRING+
|
57
|
+
# :attr => +TkSYMBOL+ and +TkSTRING+
|
58
|
+
# :identifier => +TkIDENTIFIER, +TkFID+ and +TkGVAR+.
|
59
|
+
# :number => +TkFLOAT+, +TkINTEGER+
|
60
|
+
#
|
61
|
+
# @return [Object] if the token is one of the accepted types, in its real value form.
|
62
|
+
# It should be noted that identifiers and constants are kept in String form.
|
63
|
+
# @return [nil] if the token is not any of the specified accepted types
|
64
|
+
def tokval(token, *accepted_types)
|
65
|
+
accepted_types = [TkVal] if accepted_types.empty?
|
66
|
+
accepted_types.push(TkNode) if accepted_types.include? TkVal
|
67
|
+
|
68
|
+
if accepted_types.include?(:attr)
|
69
|
+
accepted_types.push(TkSTRING, TkSYMBOL)
|
70
|
+
end
|
71
|
+
|
72
|
+
if accepted_types.include?(:string)
|
73
|
+
accepted_types.push(TkSTRING, TkDSTRING, TkXSTRING, TkDXSTRING)
|
74
|
+
end
|
75
|
+
|
76
|
+
if accepted_types.include?(:identifier)
|
77
|
+
accepted_types.push(TkIDENTIFIER, TkFID, TkGVAR)
|
78
|
+
end
|
79
|
+
|
80
|
+
if accepted_types.include?(:number)
|
81
|
+
accepted_types.push(TkFLOAT, TkINTEGER)
|
82
|
+
end
|
83
|
+
|
84
|
+
return unless accepted_types.any? {|t| t === token }
|
85
|
+
|
86
|
+
case token
|
87
|
+
when TkSTRING, TkDSTRING, TkXSTRING, TkDXSTRING
|
88
|
+
token.text[1..-2]
|
89
|
+
when TkSYMBOL
|
90
|
+
token.text[1..-1].to_sym
|
91
|
+
when TkFLOAT
|
92
|
+
token.text.to_f
|
93
|
+
when TkINTEGER
|
94
|
+
token.text.to_i
|
95
|
+
when TkREGEXP
|
96
|
+
token.text =~ /\A\/(.+)\/([^\/])\Z/
|
97
|
+
Regexp.new($1, $2)
|
98
|
+
when TkTRUE
|
99
|
+
true
|
100
|
+
when TkFALSE
|
101
|
+
false
|
102
|
+
when TkNIL
|
103
|
+
nil
|
104
|
+
else
|
105
|
+
token.text
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
# Returns a list of symbols or string values from a statement.
|
110
|
+
# The list must be a valid comma delimited list, and values
|
111
|
+
# will only be returned to the end of the list only.
|
112
|
+
#
|
113
|
+
# Example:
|
114
|
+
# attr_accessor :a, 'b', :c, :d => ['a', 'b', 'c', 'd']
|
115
|
+
# attr_accessor 'a', UNACCEPTED_TYPE, 'c' => ['a', 'c']
|
116
|
+
#
|
117
|
+
# The tokval list of a {TokenList} of the above
|
118
|
+
# code would be the {#tokval} value of :a, 'b',
|
119
|
+
# :c and :d.
|
120
|
+
#
|
121
|
+
# It should also be noted that this function stops immediately at
|
122
|
+
# any ruby keyword encountered:
|
123
|
+
# "attr_accessor :a, :b, :c if x == 5" => ['a', 'b', 'c']
|
124
|
+
#
|
125
|
+
# @param [TokenList] tokenlist The list of tokens to process.
|
126
|
+
# @param [Array<Class<Token>>] accepted_types passed to {#tokval}
|
127
|
+
# @return [Array<String>] the list of tokvalues in the list.
|
128
|
+
# @return [Array<EMPTY>] if there are no symbols or Strings in the list
|
129
|
+
# @see #tokval
|
130
|
+
def tokval_list(tokenlist, *accepted_types)
|
131
|
+
return [] unless tokenlist
|
132
|
+
out = [[]]
|
133
|
+
parencount, beforeparen = 0, 0
|
134
|
+
needcomma = false
|
135
|
+
seen_comma = true
|
136
|
+
tokenlist.each do |token|
|
137
|
+
tokval = accepted_types == [:all] ? token.text : tokval(token, *accepted_types)
|
138
|
+
parencond = !out.last.empty? && tokval != nil
|
139
|
+
#puts "#{seen_comma.inspect} #{parencount} #{token.class.class_name} #{out.inspect}"
|
140
|
+
case token
|
141
|
+
when TkCOMMA
|
142
|
+
if parencount == 0
|
143
|
+
out << [] unless out.last.empty?
|
144
|
+
needcomma = false
|
145
|
+
seen_comma = true
|
146
|
+
else
|
147
|
+
out.last << token.text if parencond
|
148
|
+
end
|
149
|
+
when TkLPAREN
|
150
|
+
if seen_comma
|
151
|
+
beforeparen += 1
|
152
|
+
else
|
153
|
+
parencount += 1
|
154
|
+
out.last << token.text if parencond
|
155
|
+
end
|
156
|
+
when TkRPAREN
|
157
|
+
if beforeparen > 0
|
158
|
+
beforeparen -= 1
|
159
|
+
else
|
160
|
+
out.last << token.text if parencount > 0 && tokval != nil
|
161
|
+
parencount -= 1
|
162
|
+
end
|
163
|
+
when TkLBRACE, TkLBRACK, TkDO
|
164
|
+
parencount += 1
|
165
|
+
out.last << token.text if tokval != nil
|
166
|
+
when TkRBRACE, TkRBRACK, TkEND
|
167
|
+
out.last << token.text if tokval != nil
|
168
|
+
parencount -= 1
|
169
|
+
else
|
170
|
+
break if TkKW === token && ![TkTRUE, TkFALSE, TkSUPER, TkSELF, TkNIL].include?(token.class)
|
171
|
+
|
172
|
+
seen_comma = false unless TkWhitespace === token
|
173
|
+
if parencount == 0
|
174
|
+
next if needcomma
|
175
|
+
next if TkWhitespace === token
|
176
|
+
if tokval != nil
|
177
|
+
out.last << tokval
|
178
|
+
else
|
179
|
+
out.last.clear
|
180
|
+
needcomma = true
|
181
|
+
end
|
182
|
+
elsif parencond
|
183
|
+
needcomma = true
|
184
|
+
out.last << token.text
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
if beforeparen == 0 && parencount < 0
|
189
|
+
break
|
190
|
+
end
|
191
|
+
end
|
192
|
+
# Flatten any single element lists
|
193
|
+
out.map {|e| e.empty? ? nil : (e.size == 1 ? e.pop : e.flatten.join) }.compact
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|
197
|
+
end
|
198
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
class YARD::Handlers::ClassHandler < YARD::Handlers::Base
|
1
|
+
class YARD::Handlers::Ruby::Legacy::ClassHandler < YARD::Handlers::Ruby::Legacy::Base
|
2
2
|
handles TkCLASS
|
3
3
|
|
4
4
|
def process
|
@@ -14,19 +14,31 @@ class YARD::Handlers::ClassHandler < YARD::Handlers::Base
|
|
14
14
|
parse_block(:namespace => klass)
|
15
15
|
|
16
16
|
if undocsuper
|
17
|
-
raise YARD::
|
17
|
+
raise YARD::Parser::UndocumentableError, 'superclass (class was added without superclass)'
|
18
18
|
end
|
19
19
|
elsif statement.tokens.to_s =~ /^class\s*<<\s*([\w\:]+)/
|
20
20
|
classname = $1
|
21
|
+
proxy = Proxy.new(namespace, classname)
|
22
|
+
|
23
|
+
# Allow constants to reference class names
|
24
|
+
if ConstantObject === proxy
|
25
|
+
if proxy.value =~ /\A#{NAMESPACEMATCH}\Z/
|
26
|
+
proxy = Proxy.new(namespace, proxy.value)
|
27
|
+
else
|
28
|
+
raise YARD::Parser::UndocumentableError, "constant class reference '#{classname}'"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
21
32
|
if classname == "self"
|
22
33
|
parse_block(:namespace => namespace, :scope => :class)
|
23
|
-
elsif classname[0,1] =~ /[A-Z]/
|
24
|
-
|
34
|
+
elsif classname[0,1] =~ /[A-Z]/
|
35
|
+
register ClassObject.new(namespace, classname) if Proxy === proxy
|
36
|
+
parse_block(:namespace => proxy, :scope => :class)
|
25
37
|
else
|
26
|
-
raise YARD::
|
38
|
+
raise YARD::Parser::UndocumentableError, "class '#{classname}'"
|
27
39
|
end
|
28
40
|
else
|
29
|
-
raise YARD::
|
41
|
+
raise YARD::Parser::UndocumentableError, "class: #{statement.tokens}"
|
30
42
|
end
|
31
43
|
end
|
32
44
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
class YARD::Handlers::ConstantHandler < YARD::Handlers::Base
|
1
|
+
class YARD::Handlers::Ruby::Legacy::ConstantHandler < YARD::Handlers::Ruby::Legacy::Base
|
2
2
|
HANDLER_MATCH = /\A[A-Z]\w*\s*=[^=]\s*/m
|
3
3
|
handles HANDLER_MATCH
|
4
4
|
|
@@ -8,6 +8,6 @@ class YARD::Handlers::ConstantHandler < YARD::Handlers::Base
|
|
8
8
|
return unless owner.is_a? NamespaceObject
|
9
9
|
|
10
10
|
name, value = *statement.tokens.to_s.gsub(/\r?\n/, '').split(/\s*=\s*/, 2)
|
11
|
-
register ConstantObject.new(namespace, name) {|o| o.source = statement }
|
11
|
+
register ConstantObject.new(namespace, name) {|o| o.source = statement; o.value = value.strip }
|
12
12
|
end
|
13
13
|
end
|
@@ -1,12 +1,12 @@
|
|
1
|
-
class YARD::Handlers::ExceptionHandler < YARD::Handlers::Base
|
1
|
+
class YARD::Handlers::Ruby::Legacy::ExceptionHandler < YARD::Handlers::Ruby::Legacy::Base
|
2
2
|
handles /\Araise(\s|\()/
|
3
3
|
|
4
4
|
def process
|
5
5
|
return unless owner.is_a?(MethodObject) # Only methods yield
|
6
|
-
return if owner.has_tag?
|
6
|
+
return if owner.has_tag?(:raise)
|
7
7
|
|
8
8
|
if klass = statement.tokens.to_s[/^raise[\(\s]*(#{NAMESPACEMATCH})(?:\)|,|\s|(?:\s*(?:\.|\:\:)\s*)?new|$)/, 1]
|
9
|
-
owner.
|
9
|
+
owner.docstring.add_tag YARD::Tags::Tag.new(:raise, '', klass)
|
10
10
|
end
|
11
11
|
end
|
12
12
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# `extend` works just like `include` except that it always
|
2
|
+
# mixes the module in in class scope,
|
3
|
+
# and that it can handle `extend self`.
|
4
|
+
class YARD::Handlers::Ruby::Legacy::ExtendHandler < YARD::Handlers::Ruby::Legacy::MixinHandler
|
5
|
+
handles /\Aextend(\s|\()/
|
6
|
+
|
7
|
+
def scope; :class end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def process_mixin(mixin)
|
12
|
+
if mixin == "self"
|
13
|
+
namespace.mixins(scope) << namespace
|
14
|
+
else
|
15
|
+
super
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
class YARD::Handlers::Ruby::Legacy::MethodHandler < YARD::Handlers::Ruby::Legacy::Base
|
2
|
+
handles TkDEF
|
3
|
+
|
4
|
+
def process
|
5
|
+
nobj = namespace
|
6
|
+
mscope = scope
|
7
|
+
|
8
|
+
if statement.tokens.to_s =~ /^def\s+(#{METHODMATCH})(?:(?:\s+|\s*\()(.*)(?:\)\s*$)?)?/m
|
9
|
+
meth, args = $1, $2
|
10
|
+
meth.gsub!(/\s+/,'')
|
11
|
+
args = tokval_list(YARD::Parser::Ruby::Legacy::TokenList.new(args), :all)
|
12
|
+
args.map! {|a| k, v = *a.split('=', 2); [k.strip, (v ? v.strip : nil)] } if args
|
13
|
+
else
|
14
|
+
raise YARD::Parser::UndocumentableError, "method: invalid name"
|
15
|
+
end
|
16
|
+
|
17
|
+
# Class method if prefixed by self(::|.) or Module(::|.)
|
18
|
+
if meth =~ /(?:#{NSEPQ}|#{CSEPQ})([^#{NSEP}#{CSEPQ}]+)$/
|
19
|
+
mscope, meth = :class, $1
|
20
|
+
nobj = P(namespace, $`) unless $` == "self"
|
21
|
+
end
|
22
|
+
|
23
|
+
obj = register MethodObject.new(nobj, meth, mscope) do |o|
|
24
|
+
o.visibility = visibility
|
25
|
+
o.source = statement
|
26
|
+
o.explicit = true
|
27
|
+
o.parameters = args
|
28
|
+
end
|
29
|
+
parse_block(:owner => obj) # mainly for yield/exceptions
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
class YARD::Handlers::Ruby::Legacy::MixinHandler < YARD::Handlers::Ruby::Legacy::Base
|
2
|
+
handles /\Ainclude(\s|\()/
|
3
|
+
|
4
|
+
def process
|
5
|
+
statement.tokens[1..-1].to_s.split(/\s*,\s*/).each do |mixin|
|
6
|
+
process_mixin(mixin.strip)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def process_mixin(mixin)
|
13
|
+
unless mixmatch = mixin[/\A(#{NAMESPACEMATCH})/, 1]
|
14
|
+
raise YARD::Parser::UndocumentableError, "mixin #{mixin} for class #{namespace.path}"
|
15
|
+
end
|
16
|
+
|
17
|
+
obj = Proxy.new(namespace, mixmatch)
|
18
|
+
|
19
|
+
case obj
|
20
|
+
when Proxy
|
21
|
+
obj.type = :module
|
22
|
+
when ConstantObject # If a constant is included, use its value as the real object
|
23
|
+
obj = Proxy.new(namespace, obj.value)
|
24
|
+
end
|
25
|
+
|
26
|
+
namespace.mixins(scope) << obj
|
27
|
+
end
|
28
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
class YARD::Handlers::YieldHandler < YARD::Handlers::Base
|
1
|
+
class YARD::Handlers::Ruby::Legacy::YieldHandler < YARD::Handlers::Ruby::Legacy::Base
|
2
2
|
handles TkYIELD
|
3
3
|
|
4
4
|
def process
|
@@ -7,16 +7,16 @@ class YARD::Handlers::YieldHandler < YARD::Handlers::Base
|
|
7
7
|
return if owner.has_tag? :yieldparam # Same thing.
|
8
8
|
|
9
9
|
yieldtag = YARD::Tags::Tag.new(:yield, "", [])
|
10
|
-
owner.
|
10
|
+
owner.docstring.add_tag(yieldtag)
|
11
11
|
tokval_list(statement.tokens[2..-1], Token).each do |item|
|
12
12
|
item = item.inspect unless item.is_a?(String)
|
13
13
|
if item == "self"
|
14
14
|
yieldtag.types << '_self'
|
15
|
-
owner.
|
15
|
+
owner.docstring.add_tag YARD::Tags::Tag.new(:yieldparam,
|
16
16
|
"the object that the method was called on", owner.namespace.path, '_self')
|
17
17
|
elsif item == "super"
|
18
18
|
yieldtag.types << '_super'
|
19
|
-
owner.
|
19
|
+
owner.docstring.add_tag YARD::Tags::Tag.new(:yieldparam,
|
20
20
|
"the result of the method from the superclass", nil, '_super')
|
21
21
|
else
|
22
22
|
yieldtag.types << item
|