rdoc 3.1 → 6.3.3

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of rdoc might be problematic. Click here for more details.

Files changed (247) hide show
  1. checksums.yaml +7 -0
  2. data/CONTRIBUTING.rdoc +220 -0
  3. data/CVE-2013-0256.rdoc +49 -0
  4. data/ExampleMarkdown.md +37 -0
  5. data/ExampleRDoc.rdoc +208 -0
  6. data/Gemfile +12 -0
  7. data/History.rdoc +1666 -0
  8. data/LEGAL.rdoc +50 -0
  9. data/LICENSE.rdoc +57 -0
  10. data/README.rdoc +129 -0
  11. data/RI.rdoc +57 -0
  12. data/Rakefile +84 -81
  13. data/TODO.rdoc +59 -0
  14. data/bin/console +7 -0
  15. data/bin/setup +6 -0
  16. data/{bin → exe}/rdoc +11 -2
  17. data/exe/ri +12 -0
  18. data/lib/rdoc/alias.rb +1 -2
  19. data/lib/rdoc/anon_class.rb +3 -2
  20. data/lib/rdoc/any_method.rb +234 -40
  21. data/lib/rdoc/attr.rb +79 -11
  22. data/lib/rdoc/class_module.rb +443 -71
  23. data/lib/rdoc/code_object.rb +216 -20
  24. data/lib/rdoc/code_objects.rb +4 -21
  25. data/lib/rdoc/comment.rb +250 -0
  26. data/lib/rdoc/constant.rb +110 -9
  27. data/lib/rdoc/context/section.rb +232 -0
  28. data/lib/rdoc/context.rb +392 -172
  29. data/lib/rdoc/cross_reference.rb +202 -0
  30. data/lib/rdoc/encoding.rb +83 -28
  31. data/lib/rdoc/erb_partial.rb +19 -0
  32. data/lib/rdoc/erbio.rb +8 -3
  33. data/lib/rdoc/extend.rb +10 -0
  34. data/lib/rdoc/generator/darkfish.rb +507 -84
  35. data/lib/rdoc/generator/json_index.rb +300 -0
  36. data/lib/rdoc/generator/markup.rb +27 -74
  37. data/lib/rdoc/generator/pot/message_extractor.rb +68 -0
  38. data/lib/rdoc/generator/pot/po.rb +84 -0
  39. data/lib/rdoc/generator/pot/po_entry.rb +141 -0
  40. data/lib/rdoc/generator/pot.rb +98 -0
  41. data/lib/rdoc/generator/ri.rb +8 -62
  42. data/lib/rdoc/generator/template/darkfish/_footer.rhtml +5 -0
  43. data/lib/rdoc/generator/template/darkfish/_head.rhtml +22 -0
  44. data/lib/rdoc/generator/template/darkfish/_sidebar_VCS_info.rhtml +19 -0
  45. data/lib/rdoc/generator/template/darkfish/_sidebar_classes.rhtml +9 -0
  46. data/lib/rdoc/generator/template/darkfish/_sidebar_extends.rhtml +15 -0
  47. data/lib/rdoc/generator/template/darkfish/_sidebar_in_files.rhtml +9 -0
  48. data/lib/rdoc/generator/template/darkfish/_sidebar_includes.rhtml +15 -0
  49. data/lib/rdoc/generator/template/darkfish/_sidebar_installed.rhtml +15 -0
  50. data/lib/rdoc/generator/template/darkfish/_sidebar_methods.rhtml +12 -0
  51. data/lib/rdoc/generator/template/darkfish/_sidebar_navigation.rhtml +11 -0
  52. data/lib/rdoc/generator/template/darkfish/_sidebar_pages.rhtml +12 -0
  53. data/lib/rdoc/generator/template/darkfish/_sidebar_parent.rhtml +11 -0
  54. data/lib/rdoc/generator/template/darkfish/_sidebar_search.rhtml +14 -0
  55. data/lib/rdoc/generator/template/darkfish/_sidebar_sections.rhtml +11 -0
  56. data/lib/rdoc/generator/template/darkfish/_sidebar_table_of_contents.rhtml +18 -0
  57. data/lib/rdoc/generator/template/darkfish/class.rhtml +172 -0
  58. data/lib/rdoc/generator/template/darkfish/css/fonts.css +167 -0
  59. data/lib/rdoc/generator/template/darkfish/css/rdoc.css +639 -0
  60. data/lib/rdoc/generator/template/darkfish/fonts/Lato-Light.ttf +0 -0
  61. data/lib/rdoc/generator/template/darkfish/fonts/Lato-LightItalic.ttf +0 -0
  62. data/lib/rdoc/generator/template/darkfish/fonts/Lato-Regular.ttf +0 -0
  63. data/lib/rdoc/generator/template/darkfish/fonts/Lato-RegularItalic.ttf +0 -0
  64. data/lib/rdoc/generator/template/darkfish/fonts/SourceCodePro-Bold.ttf +0 -0
  65. data/lib/rdoc/generator/template/darkfish/fonts/SourceCodePro-Regular.ttf +0 -0
  66. data/lib/rdoc/generator/template/darkfish/images/add.png +0 -0
  67. data/lib/rdoc/generator/template/darkfish/images/arrow_up.png +0 -0
  68. data/lib/rdoc/generator/template/darkfish/images/delete.png +0 -0
  69. data/lib/rdoc/generator/template/darkfish/images/tag_blue.png +0 -0
  70. data/lib/rdoc/generator/template/darkfish/images/transparent.png +0 -0
  71. data/lib/rdoc/generator/template/darkfish/index.rhtml +18 -60
  72. data/lib/rdoc/generator/template/darkfish/js/darkfish.js +51 -83
  73. data/lib/rdoc/generator/template/darkfish/js/search.js +110 -0
  74. data/lib/rdoc/generator/template/darkfish/page.rhtml +18 -0
  75. data/lib/rdoc/generator/template/darkfish/servlet_not_found.rhtml +18 -0
  76. data/lib/rdoc/generator/template/darkfish/servlet_root.rhtml +62 -0
  77. data/lib/rdoc/generator/template/darkfish/table_of_contents.rhtml +58 -0
  78. data/lib/rdoc/generator/template/json_index/.document +1 -0
  79. data/lib/rdoc/generator/template/json_index/js/navigation.js +105 -0
  80. data/lib/rdoc/generator/template/json_index/js/searcher.js +229 -0
  81. data/lib/rdoc/generator.rb +24 -13
  82. data/lib/rdoc/ghost_method.rb +1 -2
  83. data/lib/rdoc/i18n/locale.rb +102 -0
  84. data/lib/rdoc/i18n/text.rb +126 -0
  85. data/lib/rdoc/i18n.rb +10 -0
  86. data/lib/rdoc/include.rb +5 -95
  87. data/lib/rdoc/known_classes.rb +5 -2
  88. data/lib/rdoc/markdown/entities.rb +2132 -0
  89. data/lib/rdoc/markdown/literals.kpeg +23 -0
  90. data/lib/rdoc/markdown/literals.rb +416 -0
  91. data/lib/rdoc/markdown.kpeg +1237 -0
  92. data/lib/rdoc/markdown.rb +16684 -0
  93. data/lib/rdoc/markup/attr_changer.rb +23 -0
  94. data/lib/rdoc/markup/attr_span.rb +36 -0
  95. data/lib/rdoc/markup/attribute_manager.rb +135 -62
  96. data/lib/rdoc/markup/attributes.rb +71 -0
  97. data/lib/rdoc/markup/blank_line.rb +1 -0
  98. data/lib/rdoc/markup/block_quote.rb +15 -0
  99. data/lib/rdoc/markup/document.rb +96 -9
  100. data/lib/rdoc/markup/formatter.rb +138 -25
  101. data/lib/rdoc/markup/hard_break.rb +32 -0
  102. data/lib/rdoc/markup/heading.rb +61 -2
  103. data/lib/rdoc/markup/include.rb +43 -0
  104. data/lib/rdoc/markup/indented_paragraph.rb +48 -0
  105. data/lib/rdoc/markup/list.rb +25 -4
  106. data/lib/rdoc/markup/list_item.rb +18 -4
  107. data/lib/rdoc/markup/paragraph.rb +15 -0
  108. data/lib/rdoc/markup/parser.rb +180 -88
  109. data/lib/rdoc/markup/pre_process.rb +183 -38
  110. data/lib/rdoc/markup/raw.rb +6 -5
  111. data/lib/rdoc/markup/regexp_handling.rb +41 -0
  112. data/lib/rdoc/markup/rule.rb +1 -0
  113. data/lib/rdoc/markup/table.rb +47 -0
  114. data/lib/rdoc/markup/to_ansi.rb +17 -7
  115. data/lib/rdoc/markup/to_bs.rb +5 -8
  116. data/lib/rdoc/markup/to_html.rb +238 -137
  117. data/lib/rdoc/markup/to_html_crossref.rb +125 -152
  118. data/lib/rdoc/markup/to_html_snippet.rb +285 -0
  119. data/lib/rdoc/markup/to_joined_paragraph.rb +47 -0
  120. data/lib/rdoc/markup/to_label.rb +75 -0
  121. data/lib/rdoc/markup/to_markdown.rb +192 -0
  122. data/lib/rdoc/markup/to_rdoc.rb +85 -15
  123. data/lib/rdoc/markup/to_table_of_contents.rb +89 -0
  124. data/lib/rdoc/markup/to_test.rb +2 -4
  125. data/lib/rdoc/markup/to_tt_only.rb +121 -0
  126. data/lib/rdoc/markup/verbatim.rb +39 -0
  127. data/lib/rdoc/markup.rb +388 -110
  128. data/lib/rdoc/meta_method.rb +1 -2
  129. data/lib/rdoc/method_attr.rb +87 -21
  130. data/lib/rdoc/mixin.rb +121 -0
  131. data/lib/rdoc/normal_class.rb +39 -10
  132. data/lib/rdoc/normal_module.rb +22 -7
  133. data/lib/rdoc/options.rb +613 -73
  134. data/lib/rdoc/parser/c.rb +621 -287
  135. data/lib/rdoc/parser/changelog.rb +335 -0
  136. data/lib/rdoc/parser/markdown.rb +24 -0
  137. data/lib/rdoc/parser/rd.rb +23 -0
  138. data/lib/rdoc/parser/ripper_state_lex.rb +590 -0
  139. data/lib/rdoc/parser/ruby.rb +1368 -762
  140. data/lib/rdoc/parser/ruby_tools.rb +42 -35
  141. data/lib/rdoc/parser/simple.rb +23 -11
  142. data/lib/rdoc/parser/text.rb +12 -0
  143. data/lib/rdoc/parser.rb +162 -89
  144. data/lib/rdoc/rd/block_parser.rb +1056 -0
  145. data/lib/rdoc/rd/block_parser.ry +639 -0
  146. data/lib/rdoc/rd/inline.rb +72 -0
  147. data/lib/rdoc/rd/inline_parser.rb +1208 -0
  148. data/lib/rdoc/rd/inline_parser.ry +593 -0
  149. data/lib/rdoc/rd.rb +100 -0
  150. data/lib/rdoc/rdoc.rb +208 -115
  151. data/lib/rdoc/require.rb +1 -2
  152. data/lib/rdoc/ri/driver.rb +734 -239
  153. data/lib/rdoc/ri/formatter.rb +1 -0
  154. data/lib/rdoc/ri/paths.rb +91 -48
  155. data/lib/rdoc/ri/store.rb +3 -261
  156. data/lib/rdoc/ri/task.rb +71 -0
  157. data/lib/rdoc/ri.rb +5 -2
  158. data/lib/rdoc/rubygems_hook.rb +246 -0
  159. data/lib/rdoc/servlet.rb +451 -0
  160. data/lib/rdoc/single_class.rb +14 -2
  161. data/lib/rdoc/stats/normal.rb +19 -12
  162. data/lib/rdoc/stats/quiet.rb +1 -0
  163. data/lib/rdoc/stats/verbose.rb +1 -0
  164. data/lib/rdoc/stats.rb +262 -104
  165. data/lib/rdoc/store.rb +979 -0
  166. data/lib/rdoc/task.rb +84 -44
  167. data/lib/rdoc/text.rb +117 -72
  168. data/lib/rdoc/token_stream.rb +73 -4
  169. data/lib/rdoc/tom_doc.rb +263 -0
  170. data/lib/rdoc/top_level.rb +111 -261
  171. data/lib/rdoc/version.rb +8 -0
  172. data/lib/rdoc.rb +127 -64
  173. data/man/ri.1 +247 -0
  174. data/rdoc.gemspec +249 -0
  175. metadata +171 -291
  176. data/.autotest +0 -16
  177. data/.document +0 -5
  178. data/History.txt +0 -594
  179. data/LICENSE.txt +0 -57
  180. data/Manifest.txt +0 -158
  181. data/README.txt +0 -45
  182. data/RI.txt +0 -58
  183. data/bin/ri +0 -5
  184. data/lib/rdoc/gauntlet.rb +0 -52
  185. data/lib/rdoc/generator/template/darkfish/classpage.rhtml +0 -296
  186. data/lib/rdoc/generator/template/darkfish/filepage.rhtml +0 -124
  187. data/lib/rdoc/generator/template/darkfish/js/jquery.js +0 -32
  188. data/lib/rdoc/generator/template/darkfish/js/quicksearch.js +0 -114
  189. data/lib/rdoc/generator/template/darkfish/js/thickbox-compressed.js +0 -10
  190. data/lib/rdoc/generator/template/darkfish/rdoc.css +0 -706
  191. data/lib/rdoc/markup/formatter_test_case.rb +0 -689
  192. data/lib/rdoc/markup/inline.rb +0 -137
  193. data/lib/rdoc/markup/text_formatter_test_case.rb +0 -116
  194. data/lib/rdoc/ruby_lex.rb +0 -1291
  195. data/lib/rdoc/ruby_token.rb +0 -416
  196. data/test/README +0 -1
  197. data/test/binary.dat +0 -0
  198. data/test/hidden.zip.txt +0 -1
  199. data/test/test.ja.rdoc +0 -10
  200. data/test/test.ja.txt +0 -8
  201. data/test/test.txt +0 -1
  202. data/test/test_attribute_manager.rb +0 -120
  203. data/test/test_rdoc_alias.rb +0 -13
  204. data/test/test_rdoc_any_method.rb +0 -126
  205. data/test/test_rdoc_attr.rb +0 -61
  206. data/test/test_rdoc_class_module.rb +0 -233
  207. data/test/test_rdoc_code_object.rb +0 -165
  208. data/test/test_rdoc_constant.rb +0 -15
  209. data/test/test_rdoc_context.rb +0 -370
  210. data/test/test_rdoc_encoding.rb +0 -166
  211. data/test/test_rdoc_generator_darkfish.rb +0 -119
  212. data/test/test_rdoc_generator_ri.rb +0 -76
  213. data/test/test_rdoc_include.rb +0 -96
  214. data/test/test_rdoc_markup.rb +0 -37
  215. data/test/test_rdoc_markup_attribute_manager.rb +0 -240
  216. data/test/test_rdoc_markup_document.rb +0 -51
  217. data/test/test_rdoc_markup_paragraph.rb +0 -9
  218. data/test/test_rdoc_markup_parser.rb +0 -1395
  219. data/test/test_rdoc_markup_pre_process.rb +0 -185
  220. data/test/test_rdoc_markup_raw.rb +0 -27
  221. data/test/test_rdoc_markup_to_ansi.rb +0 -328
  222. data/test/test_rdoc_markup_to_bs.rb +0 -341
  223. data/test/test_rdoc_markup_to_html.rb +0 -335
  224. data/test/test_rdoc_markup_to_html_crossref.rb +0 -169
  225. data/test/test_rdoc_markup_to_rdoc.rb +0 -327
  226. data/test/test_rdoc_method_attr.rb +0 -122
  227. data/test/test_rdoc_normal_class.rb +0 -17
  228. data/test/test_rdoc_normal_module.rb +0 -31
  229. data/test/test_rdoc_options.rb +0 -342
  230. data/test/test_rdoc_parser.rb +0 -83
  231. data/test/test_rdoc_parser_c.rb +0 -912
  232. data/test/test_rdoc_parser_ruby.rb +0 -1754
  233. data/test/test_rdoc_parser_simple.rb +0 -99
  234. data/test/test_rdoc_rdoc.rb +0 -164
  235. data/test/test_rdoc_require.rb +0 -25
  236. data/test/test_rdoc_ri_driver.rb +0 -846
  237. data/test/test_rdoc_ri_paths.rb +0 -43
  238. data/test/test_rdoc_ri_store.rb +0 -352
  239. data/test/test_rdoc_ruby_lex.rb +0 -23
  240. data/test/test_rdoc_stats.rb +0 -38
  241. data/test/test_rdoc_task.rb +0 -92
  242. data/test/test_rdoc_text.rb +0 -251
  243. data/test/test_rdoc_top_level.rb +0 -120
  244. data/test/xref_data.rb +0 -62
  245. data/test/xref_test_case.rb +0 -61
  246. data.tar.gz.sig +0 -3
  247. metadata.gz.sig +0 -0
@@ -0,0 +1,590 @@
1
+ # frozen_string_literal: true
2
+ require 'ripper'
3
+
4
+ class RDoc::Parser::RipperStateLex
5
+ # TODO: Remove this constants after Ruby 2.4 EOL
6
+ RIPPER_HAS_LEX_STATE = Ripper::Filter.method_defined?(:state)
7
+
8
+ Token = Struct.new(:line_no, :char_no, :kind, :text, :state)
9
+
10
+ EXPR_NONE = 0
11
+ EXPR_BEG = 1
12
+ EXPR_END = 2
13
+ EXPR_ENDARG = 4
14
+ EXPR_ENDFN = 8
15
+ EXPR_ARG = 16
16
+ EXPR_CMDARG = 32
17
+ EXPR_MID = 64
18
+ EXPR_FNAME = 128
19
+ EXPR_DOT = 256
20
+ EXPR_CLASS = 512
21
+ EXPR_LABEL = 1024
22
+ EXPR_LABELED = 2048
23
+ EXPR_FITEM = 4096
24
+ EXPR_VALUE = EXPR_BEG
25
+ EXPR_BEG_ANY = (EXPR_BEG | EXPR_MID | EXPR_CLASS)
26
+ EXPR_ARG_ANY = (EXPR_ARG | EXPR_CMDARG)
27
+ EXPR_END_ANY = (EXPR_END | EXPR_ENDARG | EXPR_ENDFN)
28
+
29
+ class InnerStateLex < Ripper::Filter
30
+ attr_accessor :lex_state
31
+
32
+ def initialize(code)
33
+ @lex_state = EXPR_BEG
34
+ @in_fname = false
35
+ @continue = false
36
+ reset
37
+ super(code)
38
+ end
39
+
40
+ def reset
41
+ @command_start = false
42
+ @cmd_state = @command_start
43
+ end
44
+
45
+ def on_nl(tok, data)
46
+ case @lex_state
47
+ when EXPR_FNAME, EXPR_DOT
48
+ @continue = true
49
+ else
50
+ @continue = false
51
+ @lex_state = EXPR_BEG unless (EXPR_LABEL & @lex_state) != 0
52
+ end
53
+ data << Token.new(lineno, column, __method__, tok, @lex_state)
54
+ end
55
+
56
+ def on_ignored_nl(tok, data)
57
+ case @lex_state
58
+ when EXPR_FNAME, EXPR_DOT
59
+ @continue = true
60
+ else
61
+ @continue = false
62
+ @lex_state = EXPR_BEG unless (EXPR_LABEL & @lex_state) != 0
63
+ end
64
+ data << Token.new(lineno, column, __method__, tok, @lex_state)
65
+ end
66
+
67
+ def on_op(tok, data)
68
+ case tok
69
+ when '&', '|', '!', '!=', '!~'
70
+ case @lex_state
71
+ when EXPR_FNAME, EXPR_DOT
72
+ @lex_state = EXPR_ARG
73
+ else
74
+ @lex_state = EXPR_BEG
75
+ end
76
+ when '<<'
77
+ # TODO next token?
78
+ case @lex_state
79
+ when EXPR_FNAME, EXPR_DOT
80
+ @lex_state = EXPR_ARG
81
+ else
82
+ @lex_state = EXPR_BEG
83
+ end
84
+ when '?'
85
+ @lex_state = EXPR_BEG
86
+ when '&&', '||', '+=', '-=', '*=', '**=',
87
+ '&=', '|=', '^=', '<<=', '>>=', '||=', '&&='
88
+ @lex_state = EXPR_BEG
89
+ when '::'
90
+ case @lex_state
91
+ when EXPR_ARG, EXPR_CMDARG
92
+ @lex_state = EXPR_DOT
93
+ when EXPR_FNAME, EXPR_DOT
94
+ @lex_state = EXPR_ARG
95
+ else
96
+ @lex_state = EXPR_BEG
97
+ end
98
+ else
99
+ case @lex_state
100
+ when EXPR_FNAME, EXPR_DOT
101
+ @lex_state = EXPR_ARG
102
+ else
103
+ @lex_state = EXPR_BEG
104
+ end
105
+ end
106
+ data << Token.new(lineno, column, __method__, tok, @lex_state)
107
+ end
108
+
109
+ def on_kw(tok, data)
110
+ case tok
111
+ when 'class'
112
+ @lex_state = EXPR_CLASS
113
+ @in_fname = true
114
+ when 'def'
115
+ @lex_state = EXPR_FNAME
116
+ @continue = true
117
+ @in_fname = true
118
+ when 'if', 'unless', 'while', 'until'
119
+ if ((EXPR_MID | EXPR_END | EXPR_ENDARG | EXPR_ENDFN | EXPR_ARG | EXPR_CMDARG) & @lex_state) != 0 # postfix if
120
+ @lex_state = EXPR_BEG | EXPR_LABEL
121
+ else
122
+ @lex_state = EXPR_BEG
123
+ end
124
+ when 'begin', 'case', 'when'
125
+ @lex_state = EXPR_BEG
126
+ when 'return', 'break'
127
+ @lex_state = EXPR_MID
128
+ else
129
+ if @lex_state == EXPR_FNAME
130
+ @lex_state = EXPR_END
131
+ else
132
+ @lex_state = EXPR_END
133
+ end
134
+ end
135
+ data << Token.new(lineno, column, __method__, tok, @lex_state)
136
+ end
137
+
138
+ def on_tstring_beg(tok, data)
139
+ @lex_state = EXPR_BEG
140
+ data << Token.new(lineno, column, __method__, tok, @lex_state)
141
+ end
142
+
143
+ def on_tstring_end(tok, data)
144
+ @lex_state = EXPR_END | EXPR_ENDARG
145
+ data << Token.new(lineno, column, __method__, tok, @lex_state)
146
+ end
147
+
148
+ def on_CHAR(tok, data)
149
+ @lex_state = EXPR_END
150
+ data << Token.new(lineno, column, __method__, tok, @lex_state)
151
+ end
152
+
153
+ def on_period(tok, data)
154
+ @lex_state = EXPR_DOT
155
+ data << Token.new(lineno, column, __method__, tok, @lex_state)
156
+ end
157
+
158
+ def on_int(tok, data)
159
+ @lex_state = EXPR_END | EXPR_ENDARG
160
+ data << Token.new(lineno, column, __method__, tok, @lex_state)
161
+ end
162
+
163
+ def on_float(tok, data)
164
+ @lex_state = EXPR_END | EXPR_ENDARG
165
+ data << Token.new(lineno, column, __method__, tok, @lex_state)
166
+ end
167
+
168
+ def on_rational(tok, data)
169
+ @lex_state = EXPR_END | EXPR_ENDARG
170
+ data << Token.new(lineno, column, __method__, tok, @lex_state)
171
+ end
172
+
173
+ def on_imaginary(tok, data)
174
+ @lex_state = EXPR_END | EXPR_ENDARG
175
+ data << Token.new(lineno, column, __method__, tok, @lex_state)
176
+ end
177
+
178
+ def on_symbeg(tok, data)
179
+ @lex_state = EXPR_FNAME
180
+ @continue = true
181
+ @in_fname = true
182
+ data << Token.new(lineno, column, __method__, tok, @lex_state)
183
+ end
184
+
185
+ private def on_variables(event, tok, data)
186
+ if @in_fname
187
+ @lex_state = EXPR_ENDFN
188
+ @in_fname = false
189
+ @continue = false
190
+ elsif @continue
191
+ case @lex_state
192
+ when EXPR_DOT
193
+ @lex_state = EXPR_ARG
194
+ else
195
+ @lex_state = EXPR_ENDFN
196
+ @continue = false
197
+ end
198
+ else
199
+ @lex_state = EXPR_CMDARG
200
+ end
201
+ data << Token.new(lineno, column, event, tok, @lex_state)
202
+ end
203
+
204
+ def on_ident(tok, data)
205
+ on_variables(__method__, tok, data)
206
+ end
207
+
208
+ def on_ivar(tok, data)
209
+ @lex_state = EXPR_END
210
+ on_variables(__method__, tok, data)
211
+ end
212
+
213
+ def on_cvar(tok, data)
214
+ @lex_state = EXPR_END
215
+ on_variables(__method__, tok, data)
216
+ end
217
+
218
+ def on_gvar(tok, data)
219
+ @lex_state = EXPR_END
220
+ on_variables(__method__, tok, data)
221
+ end
222
+
223
+ def on_backref(tok, data)
224
+ @lex_state = EXPR_END
225
+ on_variables(__method__, tok, data)
226
+ end
227
+
228
+ def on_lparen(tok, data)
229
+ @lex_state = EXPR_LABEL | EXPR_BEG
230
+ data << Token.new(lineno, column, __method__, tok, @lex_state)
231
+ end
232
+
233
+ def on_rparen(tok, data)
234
+ @lex_state = EXPR_ENDFN
235
+ data << Token.new(lineno, column, __method__, tok, @lex_state)
236
+ end
237
+
238
+ def on_lbrace(tok, data)
239
+ @lex_state = EXPR_LABEL | EXPR_BEG
240
+ data << Token.new(lineno, column, __method__, tok, @lex_state)
241
+ end
242
+
243
+ def on_rbrace(tok, data)
244
+ @lex_state = EXPR_ENDARG
245
+ data << Token.new(lineno, column, __method__, tok, @lex_state)
246
+ end
247
+
248
+ def on_lbracket(tok, data)
249
+ @lex_state = EXPR_LABEL | EXPR_BEG
250
+ data << Token.new(lineno, column, __method__, tok, @lex_state)
251
+ end
252
+
253
+ def on_rbracket(tok, data)
254
+ @lex_state = EXPR_ENDARG
255
+ data << Token.new(lineno, column, __method__, tok, @lex_state)
256
+ end
257
+
258
+ def on_const(tok, data)
259
+ case @lex_state
260
+ when EXPR_FNAME
261
+ @lex_state = EXPR_ENDFN
262
+ when EXPR_CLASS, EXPR_CMDARG, EXPR_MID
263
+ @lex_state = EXPR_ARG
264
+ else
265
+ @lex_state = EXPR_CMDARG
266
+ end
267
+ data << Token.new(lineno, column, __method__, tok, @lex_state)
268
+ end
269
+
270
+ def on_sp(tok, data)
271
+ data << Token.new(lineno, column, __method__, tok, @lex_state)
272
+ end
273
+
274
+ def on_comma(tok, data)
275
+ @lex_state = EXPR_BEG | EXPR_LABEL if (EXPR_ARG_ANY & @lex_state) != 0
276
+ data << Token.new(lineno, column, __method__, tok, @lex_state)
277
+ end
278
+
279
+ def on_comment(tok, data)
280
+ @lex_state = EXPR_BEG unless (EXPR_LABEL & @lex_state) != 0
281
+ data << Token.new(lineno, column, __method__, tok, @lex_state)
282
+ end
283
+
284
+ def on_ignored_sp(tok, data)
285
+ @lex_state = EXPR_BEG unless (EXPR_LABEL & @lex_state) != 0
286
+ data << Token.new(lineno, column, __method__, tok, @lex_state)
287
+ end
288
+
289
+ def on_heredoc_beg(tok, data)
290
+ data << Token.new(lineno, column, __method__, tok, @lex_state)
291
+ @lex_state = EXPR_END
292
+ data
293
+ end
294
+
295
+ def on_heredoc_end(tok, data)
296
+ data << Token.new(lineno, column, __method__, tok, @lex_state)
297
+ @lex_state = EXPR_BEG
298
+ data
299
+ end
300
+
301
+ def on_default(event, tok, data)
302
+ reset
303
+ data << Token.new(lineno, column, event, tok, @lex_state)
304
+ end
305
+ end unless RIPPER_HAS_LEX_STATE
306
+
307
+ class InnerStateLex < Ripper::Filter
308
+ def initialize(code)
309
+ super(code)
310
+ end
311
+
312
+ def on_default(event, tok, data)
313
+ data << Token.new(lineno, column, event, tok, state)
314
+ end
315
+ end if RIPPER_HAS_LEX_STATE
316
+
317
+ def get_squashed_tk
318
+ if @buf.empty?
319
+ tk = @tokens.shift
320
+ else
321
+ tk = @buf.shift
322
+ end
323
+ return nil if tk.nil?
324
+ case tk[:kind]
325
+ when :on_symbeg then
326
+ tk = get_symbol_tk(tk)
327
+ when :on_tstring_beg then
328
+ tk = get_string_tk(tk)
329
+ when :on_backtick then
330
+ if (tk[:state] & (EXPR_FNAME | EXPR_ENDFN)) != 0
331
+ @inner_lex.lex_state = EXPR_ARG unless RIPPER_HAS_LEX_STATE
332
+ tk[:kind] = :on_ident
333
+ tk[:state] = Ripper::Lexer.const_defined?(:State) ? Ripper::Lexer::State.new(EXPR_ARG) : EXPR_ARG
334
+ else
335
+ tk = get_string_tk(tk)
336
+ end
337
+ when :on_regexp_beg then
338
+ tk = get_regexp_tk(tk)
339
+ when :on_embdoc_beg then
340
+ tk = get_embdoc_tk(tk)
341
+ when :on_heredoc_beg then
342
+ @heredoc_queue << retrieve_heredoc_info(tk)
343
+ @inner_lex.lex_state = EXPR_END unless RIPPER_HAS_LEX_STATE
344
+ when :on_nl, :on_ignored_nl, :on_comment, :on_heredoc_end then
345
+ if !@heredoc_queue.empty?
346
+ get_heredoc_tk(*@heredoc_queue.shift)
347
+ elsif tk[:text].nil? # :on_ignored_nl sometimes gives nil
348
+ tk[:text] = ''
349
+ end
350
+ when :on_words_beg then
351
+ tk = get_words_tk(tk)
352
+ when :on_qwords_beg then
353
+ tk = get_words_tk(tk)
354
+ when :on_symbols_beg then
355
+ tk = get_words_tk(tk)
356
+ when :on_qsymbols_beg then
357
+ tk = get_words_tk(tk)
358
+ when :on_op then
359
+ if '&.' == tk[:text]
360
+ tk[:kind] = :on_period
361
+ else
362
+ tk = get_op_tk(tk)
363
+ end
364
+ end
365
+ tk
366
+ end
367
+
368
+ private def get_symbol_tk(tk)
369
+ is_symbol = true
370
+ symbol_tk = Token.new(tk.line_no, tk.char_no, :on_symbol)
371
+ if ":'" == tk[:text] or ':"' == tk[:text]
372
+ tk1 = get_string_tk(tk)
373
+ symbol_tk[:text] = tk1[:text]
374
+ symbol_tk[:state] = tk1[:state]
375
+ else
376
+ case (tk1 = get_squashed_tk)[:kind]
377
+ when :on_ident
378
+ symbol_tk[:text] = ":#{tk1[:text]}"
379
+ symbol_tk[:state] = tk1[:state]
380
+ when :on_tstring_content
381
+ symbol_tk[:text] = ":#{tk1[:text]}"
382
+ symbol_tk[:state] = get_squashed_tk[:state] # skip :on_tstring_end
383
+ when :on_tstring_end
384
+ symbol_tk[:text] = ":#{tk1[:text]}"
385
+ symbol_tk[:state] = tk1[:state]
386
+ when :on_op
387
+ symbol_tk[:text] = ":#{tk1[:text]}"
388
+ symbol_tk[:state] = tk1[:state]
389
+ when :on_ivar
390
+ symbol_tk[:text] = ":#{tk1[:text]}"
391
+ symbol_tk[:state] = tk1[:state]
392
+ when :on_cvar
393
+ symbol_tk[:text] = ":#{tk1[:text]}"
394
+ symbol_tk[:state] = tk1[:state]
395
+ when :on_gvar
396
+ symbol_tk[:text] = ":#{tk1[:text]}"
397
+ symbol_tk[:state] = tk1[:state]
398
+ when :on_const
399
+ symbol_tk[:text] = ":#{tk1[:text]}"
400
+ symbol_tk[:state] = tk1[:state]
401
+ when :on_kw
402
+ symbol_tk[:text] = ":#{tk1[:text]}"
403
+ symbol_tk[:state] = tk1[:state]
404
+ else
405
+ is_symbol = false
406
+ tk = tk1
407
+ end
408
+ end
409
+ if is_symbol
410
+ tk = symbol_tk
411
+ end
412
+ tk
413
+ end
414
+
415
+ private def get_string_tk(tk)
416
+ string = tk[:text]
417
+ state = nil
418
+ kind = :on_tstring
419
+ loop do
420
+ inner_str_tk = get_squashed_tk
421
+ if inner_str_tk.nil?
422
+ break
423
+ elsif :on_tstring_end == inner_str_tk[:kind]
424
+ string = string + inner_str_tk[:text]
425
+ state = inner_str_tk[:state]
426
+ break
427
+ elsif :on_label_end == inner_str_tk[:kind]
428
+ string = string + inner_str_tk[:text]
429
+ state = inner_str_tk[:state]
430
+ kind = :on_symbol
431
+ break
432
+ else
433
+ string = string + inner_str_tk[:text]
434
+ if :on_embexpr_beg == inner_str_tk[:kind] then
435
+ kind = :on_dstring if :on_tstring == kind
436
+ end
437
+ end
438
+ end
439
+ Token.new(tk.line_no, tk.char_no, kind, string, state)
440
+ end
441
+
442
+ private def get_regexp_tk(tk)
443
+ string = tk[:text]
444
+ state = nil
445
+ loop do
446
+ inner_str_tk = get_squashed_tk
447
+ if inner_str_tk.nil?
448
+ break
449
+ elsif :on_regexp_end == inner_str_tk[:kind]
450
+ string = string + inner_str_tk[:text]
451
+ state = inner_str_tk[:state]
452
+ break
453
+ else
454
+ string = string + inner_str_tk[:text]
455
+ end
456
+ end
457
+ Token.new(tk.line_no, tk.char_no, :on_regexp, string, state)
458
+ end
459
+
460
+ private def get_embdoc_tk(tk)
461
+ string = tk[:text]
462
+ until :on_embdoc_end == (embdoc_tk = get_squashed_tk)[:kind] do
463
+ string = string + embdoc_tk[:text]
464
+ end
465
+ string = string + embdoc_tk[:text]
466
+ Token.new(tk.line_no, tk.char_no, :on_embdoc, string, embdoc_tk.state)
467
+ end
468
+
469
+ private def get_heredoc_tk(heredoc_name, indent)
470
+ string = ''
471
+ start_tk = nil
472
+ prev_tk = nil
473
+ until heredoc_end?(heredoc_name, indent, tk = @tokens.shift) do
474
+ start_tk = tk unless start_tk
475
+ if (prev_tk.nil? or "\n" == prev_tk[:text][-1]) and 0 != tk[:char_no]
476
+ string = string + (' ' * tk[:char_no])
477
+ end
478
+ string = string + tk[:text]
479
+ prev_tk = tk
480
+ end
481
+ start_tk = tk unless start_tk
482
+ prev_tk = tk unless prev_tk
483
+ @buf.unshift tk # closing heredoc
484
+ heredoc_tk = Token.new(start_tk.line_no, start_tk.char_no, :on_heredoc, string, prev_tk.state)
485
+ @buf.unshift heredoc_tk
486
+ end
487
+
488
+ private def retrieve_heredoc_info(tk)
489
+ name = tk[:text].gsub(/\A<<[-~]?(['"`]?)(.+)\1\z/, '\2')
490
+ indent = tk[:text] =~ /\A<<[-~]/
491
+ [name, indent]
492
+ end
493
+
494
+ private def heredoc_end?(name, indent, tk)
495
+ result = false
496
+ if :on_heredoc_end == tk[:kind] then
497
+ tk_name = tk[:text].chomp
498
+ tk_name.lstrip! if indent
499
+ if name == tk_name
500
+ result = true
501
+ end
502
+ end
503
+ result
504
+ end
505
+
506
+ private def get_words_tk(tk)
507
+ string = ''
508
+ start_token = tk[:text]
509
+ start_quote = tk[:text].rstrip[-1]
510
+ line_no = tk[:line_no]
511
+ char_no = tk[:char_no]
512
+ state = tk[:state]
513
+ end_quote =
514
+ case start_quote
515
+ when ?( then ?)
516
+ when ?[ then ?]
517
+ when ?{ then ?}
518
+ when ?< then ?>
519
+ else start_quote
520
+ end
521
+ end_token = nil
522
+ loop do
523
+ tk = get_squashed_tk
524
+ if tk.nil?
525
+ end_token = end_quote
526
+ break
527
+ elsif :on_tstring_content == tk[:kind] then
528
+ string += tk[:text]
529
+ elsif :on_words_sep == tk[:kind] or :on_tstring_end == tk[:kind] then
530
+ if end_quote == tk[:text].strip then
531
+ end_token = tk[:text]
532
+ break
533
+ else
534
+ string += tk[:text]
535
+ end
536
+ else
537
+ string += tk[:text]
538
+ end
539
+ end
540
+ text = "#{start_token}#{string}#{end_token}"
541
+ Token.new(line_no, char_no, :on_dstring, text, state)
542
+ end
543
+
544
+ private def get_op_tk(tk)
545
+ redefinable_operators = %w[! != !~ % & * ** + +@ - -@ / < << <= <=> == === =~ > >= >> [] []= ^ ` | ~]
546
+ if redefinable_operators.include?(tk[:text]) and tk[:state] == EXPR_ARG then
547
+ @inner_lex.lex_state = EXPR_ARG unless RIPPER_HAS_LEX_STATE
548
+ tk[:state] = Ripper::Lexer.const_defined?(:State) ? Ripper::Lexer::State.new(EXPR_ARG) : EXPR_ARG
549
+ tk[:kind] = :on_ident
550
+ elsif tk[:text] =~ /^[-+]$/ then
551
+ tk_ahead = get_squashed_tk
552
+ case tk_ahead[:kind]
553
+ when :on_int, :on_float, :on_rational, :on_imaginary then
554
+ tk[:text] += tk_ahead[:text]
555
+ tk[:kind] = tk_ahead[:kind]
556
+ tk[:state] = tk_ahead[:state]
557
+ when :on_heredoc_beg, :on_tstring, :on_dstring # frozen/non-frozen string literal
558
+ tk[:text] += tk_ahead[:text]
559
+ tk[:kind] = tk_ahead[:kind]
560
+ tk[:state] = tk_ahead[:state]
561
+ else
562
+ @buf.unshift tk_ahead
563
+ end
564
+ end
565
+ tk
566
+ end
567
+
568
+ def initialize(code)
569
+ @buf = []
570
+ @heredoc_queue = []
571
+ @inner_lex = InnerStateLex.new(code)
572
+ @tokens = @inner_lex.parse([])
573
+ end
574
+
575
+ def self.parse(code)
576
+ lex = self.new(code)
577
+ tokens = []
578
+ begin
579
+ while tk = lex.get_squashed_tk
580
+ tokens.push tk
581
+ end
582
+ rescue StopIteration
583
+ end
584
+ tokens
585
+ end
586
+
587
+ def self.end?(token)
588
+ (token[:state] & EXPR_END)
589
+ end
590
+ end