yard 0.2.2 → 0.2.3

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.

Files changed (204) hide show
  1. data/LICENSE +1 -1
  2. data/README.markdown +200 -0
  3. data/Rakefile +6 -1
  4. data/benchmarks/format_args.rb +46 -0
  5. data/benchmarks/parsing.rb +13 -1
  6. data/benchmarks/rdoc_vs_yardoc.rb +10 -0
  7. data/benchmarks/ripper_parser.rb +12 -0
  8. data/docs/CODE_OBJECTS.markdown +121 -0
  9. data/docs/FAQ.markdown +34 -0
  10. data/docs/GENERATORS.markdown +211 -0
  11. data/docs/GETTING_STARTED.markdown +263 -0
  12. data/docs/GLOSSARY.markdown +13 -0
  13. data/docs/HANDLERS.markdown +158 -0
  14. data/docs/OVERVIEW.markdown +64 -0
  15. data/docs/PARSER.markdown +180 -0
  16. data/docs/TAGS.markdown +181 -0
  17. data/docs/WHATSNEW.markdown +96 -0
  18. data/docs/images/code-objects-class-diagram.png +0 -0
  19. data/docs/images/handlers-class-diagram.png +0 -0
  20. data/docs/images/overview-class-diagram.png +0 -0
  21. data/docs/images/parser-class-diagram.png +0 -0
  22. data/docs/images/tags-class-diagram.png +0 -0
  23. data/lib/yard.rb +4 -1
  24. data/lib/yard/autoload.rb +79 -31
  25. data/lib/yard/cli/yard_graph.rb +8 -2
  26. data/lib/yard/cli/yardoc.rb +61 -8
  27. data/lib/yard/code_objects/base.rb +78 -135
  28. data/lib/yard/code_objects/class_object.rb +9 -8
  29. data/lib/yard/code_objects/constant_object.rb +1 -0
  30. data/lib/yard/code_objects/extended_method_object.rb +9 -0
  31. data/lib/yard/code_objects/method_object.rb +18 -5
  32. data/lib/yard/code_objects/module_object.rb +8 -1
  33. data/lib/yard/code_objects/namespace_object.rb +25 -16
  34. data/lib/yard/code_objects/proxy.rb +22 -22
  35. data/lib/yard/core_ext/file.rb +1 -1
  36. data/lib/yard/core_ext/string.rb +0 -4
  37. data/lib/yard/core_ext/symbol_hash.rb +3 -2
  38. data/lib/yard/docstring.rb +180 -0
  39. data/lib/yard/generators/base.rb +33 -13
  40. data/lib/yard/generators/class_generator.rb +4 -2
  41. data/lib/yard/generators/constants_generator.rb +3 -2
  42. data/lib/yard/generators/full_doc_generator.rb +76 -9
  43. data/lib/yard/generators/helpers/base_helper.rb +18 -1
  44. data/lib/yard/generators/helpers/filter_helper.rb +2 -2
  45. data/lib/yard/generators/helpers/html_helper.rb +94 -39
  46. data/lib/yard/generators/helpers/html_syntax_highlight_helper.rb +49 -0
  47. data/lib/yard/generators/helpers/markup_helper.rb +86 -0
  48. data/lib/yard/generators/helpers/method_helper.rb +23 -7
  49. data/lib/yard/generators/method_generator.rb +15 -3
  50. data/lib/yard/generators/method_listing_generator.rb +3 -3
  51. data/lib/yard/generators/mixins_generator.rb +8 -2
  52. data/lib/yard/generators/module_generator.rb +3 -2
  53. data/lib/yard/generators/overloads_generator.rb +20 -0
  54. data/lib/yard/generators/quick_doc_generator.rb +3 -9
  55. data/lib/yard/generators/root_generator.rb +32 -0
  56. data/lib/yard/generators/source_generator.rb +2 -17
  57. data/lib/yard/generators/tags_generator.rb +34 -6
  58. data/lib/yard/generators/uml_generator.rb +16 -6
  59. data/lib/yard/handlers/base.rb +88 -253
  60. data/lib/yard/handlers/processor.rb +72 -0
  61. data/lib/yard/handlers/ruby/alias_handler.rb +38 -0
  62. data/lib/yard/handlers/ruby/attribute_handler.rb +69 -0
  63. data/lib/yard/handlers/ruby/base.rb +72 -0
  64. data/lib/yard/handlers/ruby/class_condition_handler.rb +70 -0
  65. data/lib/yard/handlers/ruby/class_handler.rb +74 -0
  66. data/lib/yard/handlers/ruby/class_variable_handler.rb +11 -0
  67. data/lib/yard/handlers/ruby/constant_handler.rb +12 -0
  68. data/lib/yard/handlers/ruby/exception_handler.rb +22 -0
  69. data/lib/yard/handlers/ruby/extend_handler.rb +19 -0
  70. data/lib/yard/handlers/{alias_handler.rb → ruby/legacy/alias_handler.rb} +3 -4
  71. data/lib/yard/handlers/{attribute_handler.rb → ruby/legacy/attribute_handler.rb} +2 -2
  72. data/lib/yard/handlers/ruby/legacy/base.rb +198 -0
  73. data/lib/yard/handlers/{class_handler.rb → ruby/legacy/class_handler.rb} +18 -6
  74. data/lib/yard/handlers/{class_variable_handler.rb → ruby/legacy/class_variable_handler.rb} +1 -1
  75. data/lib/yard/handlers/{constant_handler.rb → ruby/legacy/constant_handler.rb} +2 -2
  76. data/lib/yard/handlers/{exception_handler.rb → ruby/legacy/exception_handler.rb} +3 -3
  77. data/lib/yard/handlers/ruby/legacy/extend_handler.rb +18 -0
  78. data/lib/yard/handlers/ruby/legacy/method_handler.rb +31 -0
  79. data/lib/yard/handlers/ruby/legacy/mixin_handler.rb +28 -0
  80. data/lib/yard/handlers/{module_handler.rb → ruby/legacy/module_handler.rb} +1 -1
  81. data/lib/yard/handlers/{visibility_handler.rb → ruby/legacy/visibility_handler.rb} +1 -1
  82. data/lib/yard/handlers/{yield_handler.rb → ruby/legacy/yield_handler.rb} +4 -4
  83. data/lib/yard/handlers/ruby/method_condition_handler.rb +7 -0
  84. data/lib/yard/handlers/ruby/method_handler.rb +48 -0
  85. data/lib/yard/handlers/ruby/mixin_handler.rb +25 -0
  86. data/lib/yard/handlers/ruby/module_handler.rb +9 -0
  87. data/lib/yard/handlers/ruby/visibility_handler.rb +18 -0
  88. data/lib/yard/handlers/ruby/yield_handler.rb +28 -0
  89. data/lib/yard/parser/ruby/ast_node.rb +263 -0
  90. data/lib/yard/parser/{ruby_lex.rb → ruby/legacy/ruby_lex.rb} +258 -259
  91. data/lib/yard/parser/{statement.rb → ruby/legacy/statement.rb} +8 -4
  92. data/lib/yard/parser/ruby/legacy/statement_list.rb +262 -0
  93. data/lib/yard/parser/{token_list.rb → ruby/legacy/token_list.rb} +1 -1
  94. data/lib/yard/parser/ruby/ruby_parser.rb +307 -0
  95. data/lib/yard/parser/source_parser.rb +76 -45
  96. data/lib/yard/rake/yardoc_task.rb +6 -1
  97. data/lib/yard/registry.rb +45 -19
  98. data/lib/yard/serializers/file_system_serializer.rb +8 -3
  99. data/lib/yard/tags/default_factory.rb +70 -10
  100. data/lib/yard/tags/default_tag.rb +12 -0
  101. data/lib/yard/tags/library.rb +65 -26
  102. data/lib/yard/tags/option_tag.rb +12 -0
  103. data/lib/yard/tags/overload_tag.rb +62 -0
  104. data/lib/yard/tags/ref_tag.rb +7 -0
  105. data/lib/yard/tags/ref_tag_list.rb +27 -0
  106. data/lib/yard/tags/tag.rb +1 -0
  107. data/lib/yard/tags/tag_format_error.rb +6 -0
  108. data/spec/cli/yardoc_spec.rb +43 -0
  109. data/spec/code_objects/base_spec.rb +56 -68
  110. data/spec/code_objects/class_object_spec.rb +18 -6
  111. data/spec/code_objects/constants_spec.rb +2 -0
  112. data/spec/code_objects/method_object_spec.rb +33 -5
  113. data/spec/code_objects/module_object_spec.rb +66 -8
  114. data/spec/code_objects/namespace_object_spec.rb +37 -17
  115. data/spec/code_objects/proxy_spec.rb +13 -2
  116. data/spec/core_ext/string_spec.rb +14 -2
  117. data/spec/core_ext/symbol_hash_spec.rb +9 -3
  118. data/spec/docstring_spec.rb +139 -0
  119. data/spec/generators/full_doc_generator_spec.rb +29 -0
  120. data/spec/generators/helpers/html_helper_spec.rb +74 -0
  121. data/spec/generators/helpers/markup_helper_spec.rb +95 -0
  122. data/spec/handlers/alias_handler_spec.rb +16 -3
  123. data/spec/handlers/attribute_handler_spec.rb +1 -1
  124. data/spec/handlers/base_spec.rb +15 -141
  125. data/spec/handlers/class_condition_handler_spec.rb +49 -0
  126. data/spec/handlers/class_handler_spec.rb +44 -3
  127. data/spec/handlers/class_variable_handler_spec.rb +1 -1
  128. data/spec/handlers/constant_handler_spec.rb +1 -1
  129. data/spec/handlers/examples/alias_handler_001.rb.txt +7 -3
  130. data/spec/handlers/examples/class_condition_handler_001.rb.txt +61 -0
  131. data/spec/handlers/examples/class_handler_001.rb.txt +33 -0
  132. data/spec/handlers/examples/exception_handler_001.rb.txt +1 -1
  133. data/spec/handlers/examples/extend_handler_001.rb.txt +8 -0
  134. data/spec/handlers/examples/method_condition_handler_001.rb.txt +10 -0
  135. data/spec/handlers/examples/method_handler_001.rb.txt +16 -4
  136. data/spec/handlers/examples/mixin_handler_001.rb.txt +10 -2
  137. data/spec/handlers/examples/module_handler_001.rb.txt +4 -0
  138. data/spec/handlers/examples/visibility_handler_001.rb.txt +1 -1
  139. data/spec/handlers/exception_handler_spec.rb +2 -2
  140. data/spec/handlers/extend_handler_spec.rb +15 -0
  141. data/spec/handlers/legacy_base_spec.rb +128 -0
  142. data/spec/handlers/method_condition_handler_spec.rb +14 -0
  143. data/spec/handlers/method_handler_spec.rb +38 -5
  144. data/spec/handlers/mixin_handler_spec.rb +15 -7
  145. data/spec/handlers/module_handler_spec.rb +5 -1
  146. data/spec/handlers/processor_spec.rb +19 -0
  147. data/spec/handlers/ruby/base_spec.rb +90 -0
  148. data/spec/handlers/ruby/legacy/base_spec.rb +53 -0
  149. data/spec/handlers/spec_helper.rb +22 -16
  150. data/spec/handlers/visibility_handler_spec.rb +4 -4
  151. data/spec/handlers/yield_handler_spec.rb +1 -1
  152. data/spec/parser/ruby/ast_node_spec.rb +15 -0
  153. data/spec/parser/ruby/legacy/statement_list_spec.rb +145 -0
  154. data/spec/parser/{token_list_spec.rb → ruby/legacy/token_list_spec.rb} +4 -4
  155. data/spec/parser/source_parser_spec.rb +0 -15
  156. data/spec/rake/yardoc_task_spec.rb +48 -0
  157. data/spec/registry_spec.rb +28 -2
  158. data/spec/serializers/file_system_serializer_spec.rb +7 -1
  159. data/spec/spec_helper.rb +1 -1
  160. data/spec/tags/default_factory_spec.rb +135 -0
  161. data/spec/tags/default_tag_spec.rb +11 -0
  162. data/spec/tags/overload_tag_spec.rb +35 -0
  163. data/spec/tags/ref_tag_list_spec.rb +53 -0
  164. data/templates/default/attributes/html/header.erb +17 -5
  165. data/templates/default/attributes/text/header.erb +1 -1
  166. data/templates/default/fulldoc/html/all_files.erb +19 -0
  167. data/templates/default/fulldoc/html/all_methods.erb +8 -7
  168. data/templates/default/fulldoc/html/all_namespaces.erb +4 -1
  169. data/templates/default/fulldoc/html/app.js +1 -1
  170. data/templates/default/fulldoc/html/{readme.erb → file.erb} +2 -2
  171. data/templates/default/fulldoc/html/header.erb +1 -1
  172. data/templates/default/fulldoc/html/index.erb +4 -3
  173. data/templates/default/fulldoc/html/style.css +13 -3
  174. data/templates/default/fulldoc/html/syntax_highlight.css +8 -5
  175. data/templates/default/method/text/header.erb +1 -0
  176. data/templates/default/method/text/title.erb +1 -0
  177. data/templates/default/methodsignature/html/main.erb +10 -8
  178. data/templates/default/methodsignature/text/main.erb +4 -1
  179. data/templates/default/methodsummary/html/summary.erb +8 -4
  180. data/templates/default/methodsummary/text/summary.erb +4 -1
  181. data/templates/default/mixins/html/header.erb +3 -3
  182. data/templates/default/overloads/html/header.erb +8 -0
  183. data/templates/default/overloads/text/header.erb +8 -0
  184. data/templates/default/root/html/header.erb +4 -0
  185. data/templates/default/tags/html/example.erb +20 -0
  186. data/templates/default/tags/html/option.erb +27 -0
  187. data/templates/default/tags/html/param.erb +21 -0
  188. data/templates/default/tags/html/tags.erb +4 -1
  189. data/templates/default/tags/html/todo.erb +8 -0
  190. data/templates/default/tags/text/example.erb +14 -0
  191. data/templates/default/tags/text/header.erb +3 -3
  192. data/templates/default/tags/text/option.erb +5 -0
  193. data/templates/default/tags/text/param.erb +9 -0
  194. data/templates/default/uml/dot/dependencies.erb +1 -1
  195. data/templates/default/uml/dot/info.erb +1 -1
  196. data/templates/default/uml/dot/superclasses.erb +2 -2
  197. data/templates/javadoc/methodsummary/html/summary.erb +2 -2
  198. data/templates/javadoc/mixins/html/header.erb +3 -3
  199. metadata +108 -139
  200. data/README +0 -211
  201. data/lib/yard/handlers/method_handler.rb +0 -27
  202. data/lib/yard/handlers/mixin_handler.rb +0 -16
  203. data/lib/yard/parser/statement_list.rb +0 -167
  204. 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::Handlers::UndocumentableError, statement.tokens.first.text if names.size != 2
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.line = statement.tokens.first.line_no
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::Handlers::UndocumentableError, attr_type
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::Handlers::UndocumentableError, 'superclass (class was added without superclass)'
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
- parse_block(:namespace => P(namespace, classname), :scope => :class)
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::Handlers::UndocumentableError, "class '#{classname}'"
38
+ raise YARD::Parser::UndocumentableError, "class '#{classname}'"
27
39
  end
28
40
  else
29
- raise YARD::Handlers::UndocumentableError, "class: #{statement.tokens}"
41
+ raise YARD::Parser::UndocumentableError, "class: #{statement.tokens}"
30
42
  end
31
43
  end
32
44
 
@@ -1,4 +1,4 @@
1
- class YARD::Handlers::ClassVariableHandler < YARD::Handlers::Base
1
+ class YARD::Handlers::Ruby::Legacy::ClassVariableHandler < YARD::Handlers::Ruby::Legacy::Base
2
2
  HANDLER_MATCH = /\A@@\S*\s*=\s*/m
3
3
  handles HANDLER_MATCH
4
4
 
@@ -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? :raise
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.tags << YARD::Tags::Tag.new(:raise, '', klass)
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::ModuleHandler < YARD::Handlers::Base
1
+ class YARD::Handlers::Ruby::Legacy::ModuleHandler < YARD::Handlers::Ruby::Legacy::Base
2
2
  handles TkMODULE
3
3
 
4
4
  def process
@@ -1,4 +1,4 @@
1
- class YARD::Handlers::VisibilityHandler < YARD::Handlers::Base
1
+ class YARD::Handlers::Ruby::Legacy::VisibilityHandler < YARD::Handlers::Ruby::Legacy::Base
2
2
  handles /\A(protected|private|public)(\s|\(|$)/
3
3
 
4
4
  def process
@@ -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.tags << yieldtag
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.tags << YARD::Tags::Tag.new(:yieldparam,
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.tags << YARD::Tags::Tag.new(:yieldparam,
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