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,7 @@
1
+ class YARD::Handlers::Ruby::MethodConditionHandler < YARD::Handlers::Ruby::Base
2
+ handles :if_mod, :unless_mod
3
+
4
+ def process
5
+ parse_block(statement.then_block, owner: owner)
6
+ end
7
+ end
@@ -0,0 +1,48 @@
1
+ class YARD::Handlers::Ruby::MethodHandler < YARD::Handlers::Ruby::Base
2
+ handles :def, :defs
3
+
4
+ def process
5
+ nobj = namespace
6
+ mscope = scope
7
+ if statement.type == :defs
8
+ meth = statement[2][0]
9
+ nobj = P(namespace, statement[0].source) unless statement[0].source == "self"
10
+ args = format_args(statement[3])
11
+ blk = statement[4]
12
+ mscope = :class
13
+ else
14
+ meth = statement[0][0]
15
+ args = format_args(statement[1])
16
+ blk = statement[2]
17
+ end
18
+
19
+ obj = register MethodObject.new(nobj, meth, mscope) do |o|
20
+ o.visibility = visibility
21
+ o.source = statement.source
22
+ o.signature = method_signature(meth)
23
+ o.explicit = true
24
+ o.parameters = args
25
+ end
26
+
27
+ parse_block(blk, :owner => obj) # mainly for yield/exceptions
28
+ end
29
+
30
+ def format_args(args)
31
+ args = args.jump(:params)
32
+ params = []
33
+ params += args.required_params.map {|a| [a.source, nil] } if args.required_params
34
+ params += args.optional_params.map {|a| [a[0].source, a[1].source] } if args.optional_params
35
+ params << ["*" + args.splat_param.source, nil] if args.splat_param
36
+ params += args.required_end_params.map {|a| [a.source, nil] } if args.required_end_params
37
+ params << ["&" + args.block_param.source, nil] if args.block_param
38
+ params
39
+ end
40
+
41
+ def method_signature(method_name)
42
+ if statement[1]
43
+ "def #{method_name}(#{statement[1].jump(:params).source})"
44
+ else
45
+ "def #{method_name}"
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,25 @@
1
+ class YARD::Handlers::Ruby::MixinHandler < YARD::Handlers::Ruby::Base
2
+ namespace_only
3
+ handles method_call(:include)
4
+
5
+ def process
6
+ statement.parameters(false).each {|mixin| process_mixin(mixin) }
7
+ end
8
+
9
+ protected
10
+
11
+ def process_mixin(mixin)
12
+ unless mixin.ref?
13
+ raise YARD::Parser::UndocumentableError, "mixin #{mixin.source} for class #{namespace.path}"
14
+ end
15
+
16
+ case obj = Proxy.new(namespace, mixin.source)
17
+ when Proxy
18
+ obj.type = :module
19
+ when ConstantObject # If a constant is included, use its value as the real object
20
+ obj = Proxy.new(namespace, obj.value)
21
+ end
22
+
23
+ namespace.mixins(scope) << obj
24
+ end
25
+ end
@@ -0,0 +1,9 @@
1
+ class YARD::Handlers::Ruby::ModuleHandler < YARD::Handlers::Ruby::Base
2
+ handles :module
3
+
4
+ def process
5
+ modname = statement[0].source
6
+ mod = register ModuleObject.new(namespace, modname)
7
+ parse_block(statement[1], :namespace => mod)
8
+ end
9
+ end
@@ -0,0 +1,18 @@
1
+ class YARD::Handlers::Ruby::VisibilityHandler < YARD::Handlers::Ruby::Base
2
+ handles method_call(:private)
3
+ handles method_call(:protected)
4
+ handles method_call(:public)
5
+
6
+ def process
7
+ return if (ident = statement.jump(:ident)) == statement
8
+ case statement.type
9
+ when :var_ref
10
+ self.visibility = ident.first
11
+ when :fcall, :command
12
+ statement[1].traverse do |node|
13
+ next unless node.type == :ident || node.type == :string_content
14
+ MethodObject.new(namespace, node.source, scope) {|o| o.visibility = ident.first }
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,28 @@
1
+ class YARD::Handlers::Ruby::YieldHandler < YARD::Handlers::Ruby::Base
2
+ handles :yield, :yield0
3
+
4
+ def process
5
+ return unless owner.is_a?(MethodObject) # Only methods yield
6
+ return if owner.has_tag? :yield # Don't override yield tags
7
+ return if owner.has_tag? :yieldparam # Same thing.
8
+
9
+ yieldtag = YARD::Tags::Tag.new(:yield, "", [])
10
+ owner.docstring.add_tag(yieldtag)
11
+
12
+ if statement.type == :yield
13
+ statement.jump(:list).children.each do |item|
14
+ if item == s(:var_ref, s(:kw, "self"))
15
+ yieldtag.types << '_self'
16
+ owner.docstring.add_tag YARD::Tags::Tag.new(:yieldparam,
17
+ "the object that the method was called on", owner.namespace.path, '_self')
18
+ elsif item == s(:zsuper)
19
+ yieldtag.types << '_super'
20
+ owner.docstring.add_tag YARD::Tags::Tag.new(:yieldparam,
21
+ "the result of the method from the superclass", nil, '_super')
22
+ else
23
+ yieldtag.types << item.source
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,263 @@
1
+ module YARD
2
+ module Parser
3
+ module Ruby
4
+ def s(*args)
5
+ type = Symbol === args.first ? args.shift : :list
6
+ opts = Hash === args.last ? args.pop : {}
7
+ AstNode.node_class_for(type).new(type, args, opts)
8
+ end
9
+
10
+ class AstNode < Array
11
+ attr_accessor :type, :parent, :docstring, :file, :full_source, :source
12
+ attr_accessor :source_range, :line_range
13
+ alias comments docstring
14
+ alias to_s source
15
+
16
+ KEYWORDS = { class: true, alias: true, lambda: true, do_block: true,
17
+ def: true, defs: true, begin: true, rescue: true, rescue_mod: true,
18
+ if: true, if_mod: true, else: true, elsif: true, case: true,
19
+ when: true, next: true, break: true, retry: true, redo: true,
20
+ return: true, throw: true, catch: true, until: true, until_mod: true,
21
+ while: true, while_mod: true, yield: true, yield0: true, zsuper: true,
22
+ unless: true, unless_mod: true, for: true, super: true, return0: true }
23
+
24
+ def self.node_class_for(type)
25
+ case type
26
+ when :params
27
+ ParameterNode
28
+ when :call, :fcall, :command, :command_call
29
+ MethodCallNode
30
+ when :if, :elsif, :if_mod, :unless, :unless_mod
31
+ ConditionalNode
32
+ when /_ref\Z/
33
+ ReferenceNode
34
+ else
35
+ AstNode
36
+ end
37
+ end
38
+
39
+ def initialize(type, arr, opts = {})
40
+ super(arr)
41
+ self.type = type
42
+ self.line_range = opts[:line]
43
+ self.source_range = opts[:char]
44
+ @fallback_line = opts[:listline]
45
+ @fallback_source = opts[:listchar]
46
+ @token = true if opts[:token]
47
+ end
48
+
49
+ def ==(ast)
50
+ super && type == ast.type
51
+ end
52
+
53
+ def show
54
+ "\t#{line}: #{first_line}"
55
+ end
56
+
57
+ def source_range
58
+ reset_line_info unless @source_range
59
+ @source_range
60
+ end
61
+
62
+ def line_range
63
+ reset_line_info unless @line_range
64
+ @line_range
65
+ end
66
+
67
+ def has_line?
68
+ @line_range ? true : false
69
+ end
70
+
71
+ def line
72
+ line_range && line_range.first
73
+ end
74
+
75
+ def first_line
76
+ full_source.split(/\r?\n/)[line - 1].strip
77
+ end
78
+
79
+ def jump(*node_types)
80
+ traverse {|child| return(child) if node_types.include?(child.type) }
81
+ self
82
+ end
83
+
84
+ def children
85
+ @children ||= select {|e| AstNode === e }
86
+ end
87
+
88
+ def token?
89
+ @token
90
+ end
91
+
92
+ def ref?
93
+ false
94
+ end
95
+
96
+ def literal?
97
+ @literal ||= type =~ /_literal$/ ? true : false
98
+ end
99
+
100
+ def kw?
101
+ @kw ||= KEYWORDS.has_key?(type)
102
+ end
103
+
104
+ def call?
105
+ false
106
+ end
107
+
108
+ def condition?
109
+ false
110
+ end
111
+
112
+ def file
113
+ return parent.file if parent
114
+ @file
115
+ end
116
+
117
+ def full_source
118
+ return parent.full_source if parent
119
+ return @full_source if @full_source
120
+ return IO.read(@file) if file && File.exist?(file)
121
+ end
122
+
123
+ def source
124
+ return parent.full_source[source_range] if parent
125
+ full_source
126
+ end
127
+
128
+ def pretty_print(q)
129
+ objs = [*self.dup, :__last__]
130
+ objs.unshift(type) if type && type != :list
131
+
132
+ options = {}
133
+ if @docstring
134
+ options[:docstring] = docstring
135
+ end
136
+ if @source_range || @line_range
137
+ options[:line] = line_range
138
+ options[:source] = source_range
139
+ end
140
+ objs.pop if options.size == 0
141
+
142
+ q.group(3, 's(', ')') do
143
+ q.seplist(objs, nil, :each) do |v|
144
+ if v == :__last__
145
+ q.seplist(options, nil, :each) do |k, v|
146
+ q.group(3) do
147
+ q.text k
148
+ q.group(3) do
149
+ q.text ': '
150
+ q.pp v
151
+ end
152
+ end
153
+ end
154
+ else
155
+ q.pp v
156
+ end
157
+ end
158
+ end
159
+ end
160
+
161
+ def inspect
162
+ typeinfo = type && type != :list ? ':' + type.to_s + ', ' : ''
163
+ 's(' + typeinfo + map(&:inspect).join(", ") + ')'
164
+ end
165
+
166
+ def traverse
167
+ nodes = [self]
168
+ nodes.each.with_index do |node, index|
169
+ yield node
170
+ nodes.insert index+1, *node.children
171
+ end
172
+ end
173
+
174
+ private
175
+
176
+ def reset_line_info
177
+ if size == 0
178
+ self.line_range = @fallback_line
179
+ self.source_range = @fallback_source
180
+ elsif children.size > 0
181
+ f, l = children.first, children.last
182
+ self.line_range = Range.new(f.line_range.first, l.line_range.last)
183
+ self.source_range = Range.new(f.source_range.first, l.source_range.last)
184
+ elsif @fallback_line || @fallback_source
185
+ self.line_range = @fallback_line
186
+ self.source_range = @fallback_source
187
+ else
188
+ self.line_range = 0...0
189
+ self.source_range = 0...0
190
+ end
191
+ end
192
+ end
193
+
194
+ class ReferenceNode < AstNode
195
+ def ref?; true end
196
+
197
+ def path
198
+ Array.new flatten
199
+ end
200
+
201
+ def namespace
202
+ Array.new flatten[0...-1]
203
+ end
204
+
205
+ def source
206
+ super.split(/\s+/).first
207
+ end
208
+ end
209
+
210
+ class ParameterNode < AstNode
211
+ def required_params; self[0] end
212
+ def required_end_params; self[3] end
213
+ def optional_params; self[1] end
214
+ def splat_param; self[2] ? self[2][0] : nil end
215
+ def block_param; self[4] ? self[4][0] : nil end
216
+ end
217
+
218
+ class MethodCallNode < AstNode
219
+ def call?; true end
220
+ def namespace; first if index_adjust > 0 end
221
+
222
+ def method_name(name_only = false)
223
+ name = self[index_adjust]
224
+ name_only ? name.jump(:ident).first.to_sym : name
225
+ end
226
+
227
+ def parameters(include_block_param = true)
228
+ params = self[1 + index_adjust]
229
+ params = call_has_paren? ? params.first : params
230
+ include_block_param ? params : params[0...-1]
231
+ end
232
+
233
+ def block_param; parameters.last end
234
+
235
+ private
236
+
237
+ def index_adjust
238
+ [:call, :command_call].include?(type) ? 2 : 0
239
+ end
240
+
241
+ def call_has_paren?
242
+ [:fcall, :call].include?(type)
243
+ end
244
+ end
245
+
246
+ class ConditionalNode < AstNode
247
+ def condition?; true end
248
+ def condition; first end
249
+ def then_block; self[1] end
250
+
251
+ def else_block
252
+ if self[2] && !cmod?
253
+ self[2].type == :elsif ? self[2] : self[2][0]
254
+ end
255
+ end
256
+
257
+ private
258
+
259
+ def cmod?; type =~ /_mod$/ end
260
+ end
261
+ end
262
+ end
263
+ end
@@ -2,7 +2,7 @@ require "e2mmap"
2
2
  require "irb/slex"
3
3
 
4
4
  module YARD
5
- module Parser
5
+ module Parser::Ruby::Legacy
6
6
  module RubyToken
7
7
  EXPR_BEG = :EXPR_BEG
8
8
  EXPR_MID = :EXPR_MID
@@ -95,7 +95,7 @@ module YARD
95
95
  when String, Symbol
96
96
  source = token.kind_of?(String) ? TkReading2Token : TkSymbol2Token
97
97
  if (tk = source[token]).nil?
98
- IRB.fail TkReading2TokenNoKey, token
98
+ IRB.fail TkReading2TokenNoKey, token
99
99
  end
100
100
  tk = Token(tk[0], value)
101
101
  else
@@ -105,7 +105,7 @@ module YARD
105
105
  else
106
106
  token.new(@prev_line_no, @prev_char_no, value)
107
107
  end
108
- end
108
+ end
109
109
  end
110
110
  tk
111
111
  end
@@ -113,38 +113,38 @@ module YARD
113
113
  TokenDefinitions = [
114
114
  [:TkCLASS, TkKW, "class", EXPR_CLASS],
115
115
  [:TkMODULE, TkKW, "module", EXPR_BEG],
116
- [:TkDEF, TkKW, "def", EXPR_FNAME],
116
+ [:TkDEF, TkKW, "def", EXPR_FNAME],
117
117
  [:TkUNDEF, TkKW, "undef", EXPR_FNAME],
118
118
  [:TkBEGIN, TkKW, "begin", EXPR_BEG],
119
119
  [:TkRESCUE, TkKW, "rescue", EXPR_MID],
120
120
  [:TkENSURE, TkKW, "ensure", EXPR_BEG],
121
- [:TkEND, TkKW, "end", EXPR_END],
121
+ [:TkEND, TkKW, "end", EXPR_END],
122
122
  [:TkIF, TkKW, "if", EXPR_BEG, :TkIF_MOD],
123
123
  [:TkUNLESS, TkKW, "unless", EXPR_BEG, :TkUNLESS_MOD],
124
- [:TkTHEN, TkKW, "then", EXPR_BEG],
124
+ [:TkTHEN, TkKW, "then", EXPR_BEG],
125
125
  [:TkELSIF, TkKW, "elsif", EXPR_BEG],
126
- [:TkELSE, TkKW, "else", EXPR_BEG],
127
- [:TkCASE, TkKW, "case", EXPR_BEG],
128
- [:TkWHEN, TkKW, "when", EXPR_BEG],
126
+ [:TkELSE, TkKW, "else", EXPR_BEG],
127
+ [:TkCASE, TkKW, "case", EXPR_BEG],
128
+ [:TkWHEN, TkKW, "when", EXPR_BEG],
129
129
  [:TkWHILE, TkKW, "while", EXPR_BEG, :TkWHILE_MOD],
130
130
  [:TkUNTIL, TkKW, "until", EXPR_BEG, :TkUNTIL_MOD],
131
- [:TkFOR, TkKW, "for", EXPR_BEG],
131
+ [:TkFOR, TkKW, "for", EXPR_BEG],
132
132
  [:TkBREAK, TkKW, "break", EXPR_END],
133
- [:TkNEXT, TkKW, "next", EXPR_END],
134
- [:TkREDO, TkKW, "redo", EXPR_END],
133
+ [:TkNEXT, TkKW, "next", EXPR_END],
134
+ [:TkREDO, TkKW, "redo", EXPR_END],
135
135
  [:TkRETRY, TkKW, "retry", EXPR_END],
136
- [:TkIN, TkKW, "in", EXPR_BEG],
137
- [:TkDO, TkKW, "do", EXPR_BEG],
136
+ [:TkIN, TkKW, "in", EXPR_BEG],
137
+ [:TkDO, TkKW, "do", EXPR_BEG],
138
138
  [:TkRETURN, TkKW, "return", EXPR_MID],
139
139
  [:TkYIELD, TkKW, "yield", EXPR_END],
140
140
  [:TkSUPER, TkKW, "super", EXPR_END],
141
- [:TkSELF, TkKW, "self", EXPR_END],
142
- [:TkNIL, TkKW, "nil", EXPR_END],
143
- [:TkTRUE, TkKW, "true", EXPR_END],
141
+ [:TkSELF, TkKW, "self", EXPR_END],
142
+ [:TkNIL, TkKW, "nil", EXPR_END],
143
+ [:TkTRUE, TkKW, "true", EXPR_END],
144
144
  [:TkFALSE, TkKW, "false", EXPR_END],
145
- [:TkAND, TkKW, "and", EXPR_BEG],
146
- [:TkOR, TkKW, "or", EXPR_BEG],
147
- [:TkNOT, TkKW, "not", EXPR_BEG],
145
+ [:TkAND, TkKW, "and", EXPR_BEG],
146
+ [:TkOR, TkKW, "or", EXPR_BEG],
147
+ [:TkNOT, TkKW, "not", EXPR_BEG],
148
148
  [:TkIF_MOD, TkKW],
149
149
  [:TkUNLESS_MOD, TkKW],
150
150
  [:TkWHILE_MOD, TkKW],
@@ -152,14 +152,14 @@ module YARD
152
152
  [:TkALIAS, TkKW, "alias", EXPR_FNAME],
153
153
  [:TkDEFINED, TkKW, "defined?", EXPR_END],
154
154
  [:TklBEGIN, TkKW, "BEGIN", EXPR_END],
155
- [:TklEND, TkKW, "END", EXPR_END],
155
+ [:TklEND, TkKW, "END", EXPR_END],
156
156
  [:Tk__LINE__, TkKW, "__LINE__", EXPR_END],
157
157
  [:Tk__FILE__, TkKW, "__FILE__", EXPR_END],
158
158
 
159
159
  [:TkIDENTIFIER, TkId],
160
- [:TkFID, TkId],
161
- [:TkGVAR, TkId],
162
- [:TkIVAR, TkId],
160
+ [:TkFID, TkId],
161
+ [:TkGVAR, TkId],
162
+ [:TkIVAR, TkId],
163
163
  [:TkCONSTANT, TkId],
164
164
 
165
165
  [:TkINTEGER, TkVal],
@@ -178,28 +178,28 @@ module YARD
178
178
 
179
179
  [:TkUPLUS, TkOp, "+@"],
180
180
  [:TkUMINUS, TkOp, "-@"],
181
- [:TkPOW, TkOp, "**"],
182
- [:TkCMP, TkOp, "<=>"],
183
- [:TkEQ, TkOp, "=="],
184
- [:TkEQQ, TkOp, "==="],
185
- [:TkNEQ, TkOp, "!="],
186
- [:TkGEQ, TkOp, ">="],
187
- [:TkLEQ, TkOp, "<="],
181
+ [:TkPOW, TkOp, "**"],
182
+ [:TkCMP, TkOp, "<=>"],
183
+ [:TkEQ, TkOp, "=="],
184
+ [:TkEQQ, TkOp, "==="],
185
+ [:TkNEQ, TkOp, "!="],
186
+ [:TkGEQ, TkOp, ">="],
187
+ [:TkLEQ, TkOp, "<="],
188
188
  [:TkANDOP, TkOp, "&&"],
189
- [:TkOROP, TkOp, "||"],
189
+ [:TkOROP, TkOp, "||"],
190
190
  [:TkMATCH, TkOp, "=~"],
191
191
  [:TkNMATCH, TkOp, "!~"],
192
- [:TkDOT2, TkOp, ".."],
193
- [:TkDOT3, TkOp, "..."],
194
- [:TkAREF, TkOp, "[]"],
195
- [:TkASET, TkOp, "[]="],
192
+ [:TkDOT2, TkOp, ".."],
193
+ [:TkDOT3, TkOp, "..."],
194
+ [:TkAREF, TkOp, "[]"],
195
+ [:TkASET, TkOp, "[]="],
196
196
  [:TkLSHFT, TkOp, "<<"],
197
197
  [:TkRSHFT, TkOp, ">>"],
198
198
  [:TkCOLON2, TkOp],
199
199
  [:TkCOLON3, TkOp],
200
- [:OPASGN, TkOp], # +=, -= etc. #
200
+ [:OPASGN, TkOp], # +=, -= etc. #
201
201
  [:TkASSOC, TkOp, "=>"],
202
- [:TkQUESTION, TkOp, "?"], #?
202
+ [:TkQUESTION, TkOp, "?"], #?
203
203
  [:TkCOLON, TkOp, ":"], #:
204
204
 
205
205
  # [:TkfLPAREN], # func( #
@@ -209,13 +209,13 @@ module YARD
209
209
  [:TkAMPER], # &arg #
210
210
  # [:TkSYMBOL, TkId], # :SYMBOL
211
211
  [:TkSYMBEG, TkId],
212
- [:TkGT, TkOp, ">"],
213
- [:TkLT, TkOp, "<"],
214
- [:TkPLUS, TkOp, "+"],
212
+ [:TkGT, TkOp, ">"],
213
+ [:TkLT, TkOp, "<"],
214
+ [:TkPLUS, TkOp, "+"],
215
215
  [:TkMINUS, TkOp, "-"],
216
- [:TkMULT, TkOp, "*"],
217
- [:TkDIV, TkOp, "/"],
218
- [:TkMOD, TkOp, "%"],
216
+ [:TkMULT, TkOp, "*"],
217
+ [:TkDIV, TkOp, "/"],
218
+ [:TkMOD, TkOp, "%"],
219
219
  [:TkBITOR, TkOp, "|"],
220
220
  [:TkBITXOR, TkOp, "^"],
221
221
  [:TkBITAND, TkOp, "&"],
@@ -225,7 +225,7 @@ module YARD
225
225
  [:TkBACKQUOTE, TkOp, "`"],
226
226
 
227
227
  [:TkASSIGN, Token, "="],
228
- [:TkDOT, Token, "."],
228
+ [:TkDOT, Token, "."],
229
229
  [:TkLPAREN, Token, "("], #(exp)
230
230
  [:TkLBRACK, Token, "["], #[arry]
231
231
  [:TkLBRACE, Token, "{"], #{hash}
@@ -241,7 +241,7 @@ module YARD
241
241
  [:TkEND_OF_SCRIPT, TkWhitespace],
242
242
 
243
243
  [:TkBACKSLASH, TkUnknownChar, "\\"],
244
- [:TkAT, TkUnknownChar, "@"],
244
+ [:TkAT, TkUnknownChar, "@"],
245
245
  [:TkDOLLAR, TkUnknownChar, "\$"], #"
246
246
  ]
247
247
 
@@ -253,21 +253,21 @@ module YARD
253
253
  def RubyToken.def_token(token_n, super_token = Token, reading = nil, *opts)
254
254
  token_n = token_n.id2name unless token_n.kind_of?(String)
255
255
  if RubyToken.const_defined?(token_n)
256
- #IRB.fail AlreadyDefinedToken, token_n
256
+ # IRB.fail AlreadyDefinedToken, token_n
257
257
  end
258
258
 
259
259
  token_c = Class.new super_token
260
260
  RubyToken.const_set token_n, token_c
261
- # token_c.inspect
261
+ # token_c.inspect
262
262
 
263
263
  if reading
264
264
  if TkReading2Token[reading]
265
- IRB.fail TkReading2TokenDuplicateError, token_n, reading
265
+ IRB.fail TkReading2TokenDuplicateError, token_n, reading
266
266
  end
267
267
  if opts.empty?
268
- TkReading2Token[reading] = [token_c]
268
+ TkReading2Token[reading] = [token_c]
269
269
  else
270
- TkReading2Token[reading] = [token_c].concat(opts)
270
+ TkReading2Token[reading] = [token_c].concat(opts)
271
271
  end
272
272
  end
273
273
  TkSymbol2Token[token_n.intern] = token_c
@@ -414,7 +414,7 @@ module YARD
414
414
  def_exception(:TkReading2TokenNoKey, "key nothing(key='%s')")
415
415
  def_exception(:TkSymbol2TokenNoKey, "key nothing(key='%s')")
416
416
  def_exception(:TkReading2TokenDuplicateError,
417
- "key duplicate(token_n='%s', key='%s')")
417
+ "key duplicate(token_n='%s', key='%s')")
418
418
  def_exception(:SyntaxError, "%s")
419
419
 
420
420
  include RubyToken
@@ -502,8 +502,8 @@ module YARD
502
502
  def lex
503
503
  catch(:eof) do
504
504
  until (((tk = token).kind_of?(TkNL) || tk.kind_of?(TkEND_OF_SCRIPT)) &&
505
- !@continue or
506
- tk.nil?)
505
+ !@continue or
506
+ tk.nil?)
507
507
  end
508
508
  line = get_read
509
509
 
@@ -520,17 +520,17 @@ module YARD
520
520
  catch(:eof) do
521
521
  begin
522
522
  begin
523
- tk = @OP.match(self)
524
- @space_seen = tk.kind_of?(TkSPACE)
523
+ tk = @OP.match(self)
524
+ @space_seen = tk.kind_of?(TkSPACE)
525
525
  rescue SyntaxError
526
- abort if @exception_on_syntax_error
527
- tk = TkError.new(line_no, char_no)
526
+ abort if @exception_on_syntax_error
527
+ tk = TkError.new(line_no, char_no)
528
528
  end
529
529
  end while @skip_space and tk.kind_of?(TkSPACE)
530
530
  if @read_auto_clean_up
531
531
  get_read
532
532
  end
533
- # throw :eof unless tk
533
+ # throw :eof unless tk
534
534
  p tk if $DEBUG
535
535
  tk.lex_state = lex_state if tk
536
536
  tk
@@ -629,20 +629,20 @@ module YARD
629
629
  @colonblock_seen = false
630
630
  case @lex_state
631
631
  when EXPR_BEG, EXPR_FNAME, EXPR_DOT
632
- @continue = TRUE
632
+ @continue = TRUE
633
633
  else
634
- @continue = FALSE
635
- @lex_state = EXPR_BEG
634
+ @continue = FALSE
635
+ @lex_state = EXPR_BEG
636
636
  end
637
637
  Token(TkNL).set_text("\n")
638
638
  end
639
639
 
640
- @OP.def_rules("*", "**",
641
- "!", "!=", "!~",
642
- "=", "==", "===",
643
- "=~", "<=>",
644
- "<", "<=",
645
- ">", ">=", ">>") do |op, io|
640
+ @OP.def_rules("*", "**",
641
+ "!", "!=", "!~",
642
+ "=", "==", "===",
643
+ "=~", "<=>",
644
+ "<", "<=",
645
+ ">", ">=", ">>") do |op, io|
646
646
  @lex_state = EXPR_BEG
647
647
  Token(op).set_text(op)
648
648
  end
@@ -651,8 +651,8 @@ module YARD
651
651
  tk = nil
652
652
  if @lex_state != EXPR_END && @lex_state != EXPR_CLASS &&
653
653
  (@lex_state != EXPR_ARG || @space_seen)
654
- c = peek(0)
655
- tk = identify_here_document if /[-\w_\"\'\`]/ =~ c
654
+ c = peek(0)
655
+ tk = identify_here_document if /[-\w_\"\'\`]/ =~ c
656
656
  end
657
657
  if !tk
658
658
  @lex_state = EXPR_BEG
@@ -667,31 +667,31 @@ module YARD
667
667
 
668
668
  @OP.def_rules("`") do |op, io|
669
669
  if @lex_state == EXPR_FNAME
670
- Token(op).set_text(op)
670
+ Token(op).set_text(op)
671
671
  else
672
- identify_string(op)
672
+ identify_string(op)
673
673
  end
674
674
  end
675
675
 
676
676
  @OP.def_rules('?') do |op, io|
677
677
  if @lex_state == EXPR_END
678
- @lex_state = EXPR_BEG
679
- Token(TkQUESTION).set_text(op)
678
+ @lex_state = EXPR_BEG
679
+ Token(TkQUESTION).set_text(op)
680
680
  else
681
- ch = getc
682
- if @lex_state == EXPR_ARG && ch !~ /\s/
683
- ungetc
684
- @lex_state = EXPR_BEG
685
- Token(TkQUESTION).set_text(op)
686
- else
681
+ ch = getc
682
+ if @lex_state == EXPR_ARG && ch !~ /\s/
683
+ ungetc
684
+ @lex_state = EXPR_BEG
685
+ Token(TkQUESTION).set_text(op)
686
+ else
687
687
  str = op
688
688
  str << ch
689
- if (ch == '\\') #'
690
- str << read_escape
691
- end
692
- @lex_state = EXPR_END
693
- Token(TkINTEGER).set_text(str)
694
- end
689
+ if (ch == '\\') #'
690
+ str << read_escape
691
+ end
692
+ @lex_state = EXPR_END
693
+ Token(TkINTEGER).set_text(str)
694
+ end
695
695
  end
696
696
  end
697
697
 
@@ -701,7 +701,7 @@ module YARD
701
701
  end
702
702
 
703
703
  @OP.def_rules("+=", "-=", "*=", "**=",
704
- "&=", "|=", "^=", "<<=", ">>=", "||=", "&&=") do |op, io|
704
+ "&=", "|=", "^=", "<<=", ">>=", "||=", "&&=") do |op, io|
705
705
  @lex_state = EXPR_BEG
706
706
  op =~ /^(.*)=$/
707
707
  Token(TkOPASGN, $1).set_text(op)
@@ -717,30 +717,30 @@ module YARD
717
717
 
718
718
  @OP.def_rules("+", "-") do |op, io|
719
719
  catch(:RET) do
720
- if @lex_state == EXPR_ARG
721
- if @space_seen and peek(0) =~ /[0-9]/
722
- throw :RET, identify_number(op)
723
- else
724
- @lex_state = EXPR_BEG
725
- end
726
- elsif @lex_state != EXPR_END and peek(0) =~ /[0-9]/
727
- throw :RET, identify_number(op)
728
- else
729
- @lex_state = EXPR_BEG
730
- end
731
- Token(op).set_text(op)
720
+ if @lex_state == EXPR_ARG
721
+ if @space_seen and peek(0) =~ /[0-9]/
722
+ throw :RET, identify_number(op)
723
+ else
724
+ @lex_state = EXPR_BEG
725
+ end
726
+ elsif @lex_state != EXPR_END and peek(0) =~ /[0-9]/
727
+ throw :RET, identify_number(op)
728
+ else
729
+ @lex_state = EXPR_BEG
730
+ end
731
+ Token(op).set_text(op)
732
732
  end
733
733
  end
734
734
 
735
735
  @OP.def_rule(".") do
736
736
  @lex_state = EXPR_BEG
737
737
  if peek(0) =~ /[0-9]/
738
- ungetc
739
- identify_number("")
738
+ ungetc
739
+ identify_number("")
740
740
  else
741
- # for obj.if
742
- @lex_state = EXPR_DOT
743
- Token(TkDOT).set_text(".")
741
+ # for obj.if
742
+ @lex_state = EXPR_DOT
743
+ Token(TkDOT).set_text(".")
744
744
  end
745
745
  end
746
746
 
@@ -761,39 +761,39 @@ module YARD
761
761
  end
762
762
 
763
763
  @OP.def_rule(":") do
764
- if @colonblock_seen || peek(0) =~ /\s/
765
- @lex_state = EXPR_BEG
766
- tk = Token(TkCOLON)
764
+ if (@colonblock_seen && @lex_state != EXPR_BEG) || peek(0) =~ /\s/
765
+ @lex_state = EXPR_BEG
766
+ tk = Token(TkCOLON)
767
767
  else
768
- @lex_state = EXPR_FNAME
769
- tk = Token(TkSYMBEG)
768
+ @lex_state = EXPR_FNAME
769
+ tk = Token(TkSYMBEG)
770
770
  end
771
771
  tk.set_text(":")
772
772
  end
773
773
 
774
774
  @OP.def_rule("::") do
775
- # p @lex_state.id2name, @space_seen
775
+ # p @lex_state.id2name, @space_seen
776
776
  if @lex_state == EXPR_BEG or @lex_state == EXPR_ARG && @space_seen
777
- @lex_state = EXPR_BEG
778
- tk = Token(TkCOLON3)
777
+ @lex_state = EXPR_BEG
778
+ tk = Token(TkCOLON3)
779
779
  else
780
- @lex_state = EXPR_DOT
781
- tk = Token(TkCOLON2)
780
+ @lex_state = EXPR_DOT
781
+ tk = Token(TkCOLON2)
782
782
  end
783
783
  tk.set_text("::")
784
784
  end
785
785
 
786
786
  @OP.def_rule("/") do |op, io|
787
787
  if @lex_state == EXPR_BEG || @lex_state == EXPR_MID
788
- identify_string(op)
788
+ identify_string(op)
789
789
  elsif peek(0) == '='
790
- getc
791
- @lex_state = EXPR_BEG
792
- Token(TkOPASGN, :/).set_text("/=") #")
790
+ getc
791
+ @lex_state = EXPR_BEG
792
+ Token(TkOPASGN, :/).set_text("/=") #")
793
793
  elsif @lex_state == EXPR_ARG and @space_seen and peek(0) !~ /\s/
794
- identify_string(op)
794
+ identify_string(op)
795
795
  else
796
- @lex_state = EXPR_BEG
796
+ @lex_state = EXPR_BEG
797
797
  Token("/").set_text(op)
798
798
  end
799
799
  end
@@ -803,10 +803,10 @@ module YARD
803
803
  Token("^").set_text("^")
804
804
  end
805
805
 
806
- # @OP.def_rules("^=") do
807
- # @lex_state = EXPR_BEG
808
- # Token(TkOPASGN, :^)
809
- # end
806
+ # @OP.def_rules("^=") do
807
+ # @lex_state = EXPR_BEG
808
+ # Token(TkOPASGN, :^)
809
+ # end
810
810
 
811
811
  @OP.def_rules(",", ";") do |op, io|
812
812
  @colonblock_seen = false
@@ -826,13 +826,13 @@ module YARD
826
826
 
827
827
  @OP.def_rule("(") do
828
828
  @indent += 1
829
- #if @lex_state == EXPR_BEG || @lex_state == EXPR_MID
830
- # @lex_state = EXPR_BEG
831
- # tk = Token(TkfLPAREN)
832
- #else
833
- @lex_state = EXPR_BEG
834
- tk = Token(TkLPAREN)
835
- #end
829
+ # if @lex_state == EXPR_BEG || @lex_state == EXPR_MID
830
+ # @lex_state = EXPR_BEG
831
+ # tk = Token(TkfLPAREN)
832
+ # else
833
+ @lex_state = EXPR_BEG
834
+ tk = Token(TkLPAREN)
835
+ # end
836
836
  tk.set_text("(")
837
837
  end
838
838
 
@@ -846,16 +846,16 @@ module YARD
846
846
 
847
847
  @OP.def_rule("[") do
848
848
  @indent += 1
849
- # if @lex_state == EXPR_FNAME
850
- # t = Token(TkfLBRACK)
851
- # else
852
- # if @lex_state == EXPR_BEG || @lex_state == EXPR_MID
853
- # t = Token(TkLBRACK)
854
- # elsif @lex_state == EXPR_ARG && @space_seen
855
- # else
856
- # t = Token(TkfLBRACK)
857
- # end
858
- # end
849
+ # if @lex_state == EXPR_FNAME
850
+ # t = Token(TkfLBRACK)
851
+ # else
852
+ # if @lex_state == EXPR_BEG || @lex_state == EXPR_MID
853
+ # t = Token(TkLBRACK)
854
+ # elsif @lex_state == EXPR_ARG && @space_seen
855
+ # else
856
+ # t = Token(TkfLBRACK)
857
+ # end
858
+ # end
859
859
  t = Token(TkLBRACK)
860
860
  @lex_state = EXPR_BEG
861
861
  t.set_text("[")
@@ -863,11 +863,11 @@ module YARD
863
863
 
864
864
  @OP.def_rule("{") do
865
865
  @indent += 1
866
- #if @lex_state != EXPR_END && @lex_state != EXPR_ARG
867
- # t = Token(TkLBRACE)
868
- #else
869
- # t = Token(TkfLBRACE)
870
- #end
866
+ # if @lex_state != EXPR_END && @lex_state != EXPR_ARG
867
+ # t = Token(TkLBRACE)
868
+ # else
869
+ # t = Token(TkfLBRACE)
870
+ # end
871
871
  t = Token(TkLBRACE)
872
872
  @lex_state = EXPR_BEG
873
873
  t.set_text("{")
@@ -875,27 +875,27 @@ module YARD
875
875
 
876
876
  @OP.def_rule('\\') do #'
877
877
  if getc == "\n"
878
- @space_seen = true
879
- @continue = true
880
- Token(TkSPACE).set_text("\\\n")
878
+ @space_seen = true
879
+ @continue = true
880
+ Token(TkSPACE).set_text("\\\n")
881
881
  else
882
- ungetc
883
- Token("\\").set_text("\\") #"
882
+ ungetc
883
+ Token("\\").set_text("\\") #"
884
884
  end
885
885
  end
886
886
 
887
887
  @OP.def_rule('%') do
888
888
  |op, io|
889
889
  if @lex_state == EXPR_BEG || @lex_state == EXPR_MID
890
- identify_quotation('%')
890
+ identify_quotation('%')
891
891
  elsif peek(0) == '='
892
- getc
893
- Token(TkOPASGN, "%").set_text("%=")
892
+ getc
893
+ Token(TkOPASGN, "%").set_text("%=")
894
894
  elsif @lex_state == EXPR_ARG and @space_seen and peek(0) !~ /\s/
895
- identify_quotation('%')
895
+ identify_quotation('%')
896
896
  else
897
- @lex_state = EXPR_BEG
898
- Token("%").set_text("%")
897
+ @lex_state = EXPR_BEG
898
+ Token("%").set_text("%")
899
899
  end
900
900
  end
901
901
 
@@ -905,34 +905,33 @@ module YARD
905
905
 
906
906
  @OP.def_rule('@') do
907
907
  if peek(0) =~ /[@\w_]/
908
- ungetc
909
- identify_identifier
908
+ ungetc
909
+ identify_identifier
910
910
  else
911
- Token("@").set_text("@")
911
+ Token("@").set_text("@")
912
912
  end
913
913
  end
914
914
 
915
- # @OP.def_rule("def", proc{|op, io| /\s/ =~ io.peek(0)}) do
916
- # |op, io|
917
- # @indent += 1
918
- # @lex_state = EXPR_FNAME
919
- # # @lex_state = EXPR_END
920
- # # until @rests[0] == "\n" or @rests[0] == ";"
921
- # # rests.shift
922
- # # end
923
- # end
915
+ # @OP.def_rule("def", proc{|op, io| /\s/ =~ io.peek(0)}) do
916
+ # |op, io|
917
+ # @indent += 1
918
+ # @lex_state = EXPR_FNAME
919
+ # # @lex_state = EXPR_END
920
+ # # until @rests[0] == "\n" or @rests[0] == ";"
921
+ # # rests.shift
922
+ # # end
923
+ # end
924
924
 
925
925
  @OP.def_rule("__END__", proc{@prev_char_no == 0 && peek(0) =~ /[\r\n]/}) do
926
926
  throw :eof
927
927
  end
928
928
 
929
- @OP.def_rule("") do
930
- |op, io|
929
+ @OP.def_rule("") do |op, io|
931
930
  printf "MATCH: start %s: %s\n", op, io.inspect if RubyLex.debug?
932
931
  if peek(0) =~ /[0-9]/
933
- t = identify_number("")
932
+ t = identify_number("")
934
933
  elsif peek(0) =~ /[\w_]/
935
- t = identify_identifier
934
+ t = identify_identifier
936
935
  end
937
936
  printf "MATCH: end %s: %s\n", op, io.inspect if RubyLex.debug?
938
937
  t
@@ -1007,41 +1006,41 @@ module YARD
1007
1006
 
1008
1007
  token_c, *trans = TkReading2Token[token]
1009
1008
  if token_c
1010
- # reserved word?
1011
-
1012
- if (@lex_state != EXPR_BEG &&
1013
- @lex_state != EXPR_FNAME &&
1014
- trans[1])
1015
- # modifiers
1016
- token_c = TkSymbol2Token[trans[1]]
1017
- @lex_state = trans[0]
1018
- else
1019
- if @lex_state != EXPR_FNAME
1020
- if ENINDENT_CLAUSE.include?(token)
1021
- @indent += 1
1022
-
1023
- if ACCEPTS_COLON.include?(token)
1024
- @colonblock_seen = true
1025
- else
1026
- @colonblock_seen = false
1027
- end
1028
- elsif DEINDENT_CLAUSE.include?(token)
1029
- @indent -= 1
1030
- @colonblock_seen = false
1031
- end
1032
- @lex_state = trans[0]
1033
- else
1034
- @lex_state = EXPR_END
1035
- end
1036
- end
1037
- return Token(token_c, token).set_text(token)
1009
+ # reserved word?
1010
+
1011
+ if (@lex_state != EXPR_BEG &&
1012
+ @lex_state != EXPR_FNAME &&
1013
+ trans[1])
1014
+ # modifiers
1015
+ token_c = TkSymbol2Token[trans[1]]
1016
+ @lex_state = trans[0]
1017
+ else
1018
+ if @lex_state != EXPR_FNAME
1019
+ if ENINDENT_CLAUSE.include?(token)
1020
+ @indent += 1
1021
+
1022
+ if ACCEPTS_COLON.include?(token)
1023
+ @colonblock_seen = true
1024
+ else
1025
+ @colonblock_seen = false
1026
+ end
1027
+ elsif DEINDENT_CLAUSE.include?(token)
1028
+ @indent -= 1
1029
+ @colonblock_seen = false
1030
+ end
1031
+ @lex_state = trans[0]
1032
+ else
1033
+ @lex_state = EXPR_END
1034
+ end
1035
+ end
1036
+ return Token(token_c, token).set_text(token)
1038
1037
  end
1039
1038
  end
1040
1039
 
1041
1040
  if @lex_state == EXPR_FNAME
1042
1041
  @lex_state = EXPR_END
1043
1042
  if peek(0) == '='
1044
- token.concat getc
1043
+ token.concat getc
1045
1044
  end
1046
1045
  elsif @lex_state == EXPR_BEG || @lex_state == EXPR_DOT
1047
1046
  @lex_state = EXPR_ARG
@@ -1068,13 +1067,13 @@ module YARD
1068
1067
  lt = ch
1069
1068
  quoted = ""
1070
1069
  while (c = getc) && c != lt
1071
- quoted.concat c
1070
+ quoted.concat c
1072
1071
  end
1073
1072
  else
1074
1073
  lt = '"'
1075
1074
  quoted = ch.dup
1076
1075
  while (c = getc) && c =~ /\w/
1077
- quoted.concat c
1076
+ quoted.concat c
1078
1077
  end
1079
1078
  ungetc
1080
1079
  end
@@ -1086,9 +1085,9 @@ module YARD
1086
1085
  reserve << ch
1087
1086
  if ch == "\\" #"
1088
1087
  ch = getc
1089
- reserve << ch
1088
+ reserve << ch
1090
1089
  elsif ch == "\n"
1091
- break
1090
+ break
1092
1091
  end
1093
1092
  end
1094
1093
 
@@ -1115,13 +1114,13 @@ module YARD
1115
1114
  elsif ch =~ /\W/
1116
1115
  lt = "\""
1117
1116
  else
1118
- # RubyLex.fail SyntaxError, "unknown type of %string ('#{ch}')"
1117
+ # RubyLex.fail SyntaxError, "unknown type of %string ('#{ch}')"
1119
1118
  end
1120
- # if ch !~ /\W/
1121
- # ungetc
1122
- # next
1123
- # end
1124
- #@ltype = lt
1119
+ # if ch !~ /\W/
1120
+ # ungetc
1121
+ # next
1122
+ # end
1123
+ # @ltype = lt
1125
1124
  @quoted = ch unless @quoted = PERCENT_PAREN[ch]
1126
1125
  identify_string(lt, @quoted, ch, initial_char) if lt
1127
1126
  end
@@ -1164,25 +1163,25 @@ module YARD
1164
1163
  str << ch
1165
1164
 
1166
1165
  when allow_point && "."
1167
- type = TkFLOAT
1168
- if peek(0) !~ /[0-9]/
1169
- ungetc
1170
- break
1171
- end
1166
+ type = TkFLOAT
1167
+ if peek(0) !~ /[0-9]/
1168
+ ungetc
1169
+ break
1170
+ end
1172
1171
  str << ch
1173
- allow_point = false
1172
+ allow_point = false
1174
1173
 
1175
1174
  when allow_e && "e", allow_e && "E"
1176
1175
  str << ch
1177
- type = TkFLOAT
1178
- if peek(0) =~ /[+-]/
1179
- str << getc
1180
- end
1181
- allow_e = false
1182
- allow_point = false
1176
+ type = TkFLOAT
1177
+ if peek(0) =~ /[+-]/
1178
+ str << getc
1179
+ end
1180
+ allow_e = false
1181
+ allow_point = false
1183
1182
  else
1184
- ungetc
1185
- break
1183
+ ungetc
1184
+ break
1186
1185
  end
1187
1186
  end
1188
1187
  Token(type).set_text(str)
@@ -1200,8 +1199,8 @@ module YARD
1200
1199
  nest = 0
1201
1200
  begin
1202
1201
  while ch = getc
1203
- str << ch
1204
- if @quoted == ch
1202
+ str << ch
1203
+ if @quoted == ch
1205
1204
  if nest == 0
1206
1205
  break
1207
1206
  else
@@ -1209,7 +1208,7 @@ module YARD
1209
1208
  end
1210
1209
  elsif opener == ch
1211
1210
  nest += 1
1212
- elsif @ltype != "'" && @ltype != "]" and ch == "#"
1211
+ elsif @ltype != "'" && @ltype != "]" and ch == "#"
1213
1212
  ch = getc
1214
1213
  if ch == "{"
1215
1214
  subtype = true
@@ -1217,19 +1216,19 @@ module YARD
1217
1216
  else
1218
1217
  ungetc(ch)
1219
1218
  end
1220
- elsif ch == '\\' #'
1221
- str << read_escape
1222
- end
1219
+ elsif ch == '\\' #'
1220
+ str << read_escape
1221
+ end
1223
1222
  end
1224
1223
  if @ltype == "/"
1225
- if peek(0) =~ /i|o|n|e|s/
1226
- str << getc
1227
- end
1224
+ if peek(0) =~ /i|o|n|e|s/
1225
+ str << getc
1226
+ end
1228
1227
  end
1229
1228
  if subtype
1230
- Token(DLtype2Token[ltype], str)
1229
+ Token(DLtype2Token[ltype], str)
1231
1230
  else
1232
- Token(Ltype2Token[ltype], str)
1231
+ Token(Ltype2Token[ltype], str)
1233
1232
  end.set_text(str)
1234
1233
  ensure
1235
1234
  @ltype = nil
@@ -1282,49 +1281,49 @@ module YARD
1282
1281
  when /[0-7]/
1283
1282
  ungetc ch
1284
1283
  3.times do
1285
- case ch = getc
1286
- when /[0-7]/
1287
- when nil
1288
- break
1289
- else
1290
- ungetc
1291
- break
1292
- end
1284
+ case ch = getc
1285
+ when /[0-7]/
1286
+ when nil
1287
+ break
1288
+ else
1289
+ ungetc
1290
+ break
1291
+ end
1293
1292
  res << ch
1294
1293
  end
1295
1294
 
1296
1295
  when "x"
1297
1296
  res << ch
1298
1297
  2.times do
1299
- case ch = getc
1300
- when /[0-9a-fA-F]/
1301
- when nil
1302
- break
1303
- else
1304
- ungetc
1305
- break
1306
- end
1298
+ case ch = getc
1299
+ when /[0-9a-fA-F]/
1300
+ when nil
1301
+ break
1302
+ else
1303
+ ungetc
1304
+ break
1305
+ end
1307
1306
  res << ch
1308
1307
  end
1309
1308
 
1310
1309
  when "M"
1311
1310
  res << ch
1312
1311
  if (ch = getc) != '-'
1313
- ungetc
1312
+ ungetc
1314
1313
  else
1315
1314
  res << ch
1316
- if (ch = getc) == "\\" #"
1315
+ if (ch = getc) == "\\" #"
1317
1316
  res << ch
1318
- res << read_escape
1317
+ res << read_escape
1319
1318
  else
1320
1319
  res << ch
1321
- end
1320
+ end
1322
1321
  end
1323
1322
 
1324
1323
  when "C", "c" #, "^"
1325
1324
  res << ch
1326
1325
  if ch == "C" and (ch = getc) != "-"
1327
- ungetc
1326
+ ungetc
1328
1327
  else
1329
1328
  res << ch
1330
1329
  if (ch = getc) == "\\" #"
@@ -1341,4 +1340,4 @@ module YARD
1341
1340
  end
1342
1341
  end
1343
1342
  end
1344
- end
1343
+ end