YkLib 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/.rspec +3 -0
  4. data/.travis.yml +6 -0
  5. data/CODE_OF_CONDUCT.md +74 -0
  6. data/Gemfile +7 -0
  7. data/Gemfile.lock +34 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +44 -0
  10. data/Rakefile +6 -0
  11. data/YkLib.gemspec +29 -0
  12. data/bin/console +14 -0
  13. data/bin/setup +8 -0
  14. data/lib/YkLib/Yk/__advance__.rb +151 -0
  15. data/lib/YkLib/Yk/__defun__.rb +44 -0
  16. data/lib/YkLib/Yk/__hook__.rb +244 -0
  17. data/lib/YkLib/Yk/__minmax__.rb +123 -0
  18. data/lib/YkLib/Yk/__stdlog.rb +329 -0
  19. data/lib/YkLib/Yk/adhocLiterals/email.rb +119 -0
  20. data/lib/YkLib/Yk/adhocLiterals/path.rb +402 -0
  21. data/lib/YkLib/Yk/adhocLiterals/tag.rb +19 -0
  22. data/lib/YkLib/Yk/adhocLiterals/url.rb +36 -0
  23. data/lib/YkLib/Yk/adhocLiterals.rb +199 -0
  24. data/lib/YkLib/Yk/auto_escseq.rb +5 -0
  25. data/lib/YkLib/Yk/auto_pstore.rb +179 -0
  26. data/lib/YkLib/Yk/bsearch.rb +120 -0
  27. data/lib/YkLib/Yk/clambda.rb +309 -0
  28. data/lib/YkLib/Yk/confLine.rb +423 -0
  29. data/lib/YkLib/Yk/create_tty_width_available.rb +24 -0
  30. data/lib/YkLib/Yk/crypt.rb +26 -0
  31. data/lib/YkLib/Yk/debug2 +1 -0
  32. data/lib/YkLib/Yk/debug2.rb +473 -0
  33. data/lib/YkLib/Yk/debugout.rb +139 -0
  34. data/lib/YkLib/Yk/email_tz.rb +533 -0
  35. data/lib/YkLib/Yk/enum_expect.rb +170 -0
  36. data/lib/YkLib/Yk/errlog.rb +5 -0
  37. data/lib/YkLib/Yk/escseq.rb +59 -0
  38. data/lib/YkLib/Yk/eval_alt.rb +281 -0
  39. data/lib/YkLib/Yk/expector.rb +93 -0
  40. data/lib/YkLib/Yk/fetch.rb +556 -0
  41. data/lib/YkLib/Yk/fetch_old.rb +290 -0
  42. data/lib/YkLib/Yk/fib.rb +158 -0
  43. data/lib/YkLib/Yk/file_aux.rb +843 -0
  44. data/lib/YkLib/Yk/file_aux2.rb +919 -0
  45. data/lib/YkLib/Yk/file_aux_old.rb +160 -0
  46. data/lib/YkLib/Yk/filemod.rb +19 -0
  47. data/lib/YkLib/Yk/force_escseq.rb +3 -0
  48. data/lib/YkLib/Yk/generator__.rb +144 -0
  49. data/lib/YkLib/Yk/generator__.rb.org +139 -0
  50. data/lib/YkLib/Yk/indenter/argless_case.rb +46 -0
  51. data/lib/YkLib/Yk/indenter/each_token.rb +671 -0
  52. data/lib/YkLib/Yk/indenter/free_case.rb +313 -0
  53. data/lib/YkLib/Yk/indenter/if_less.rb +53 -0
  54. data/lib/YkLib/Yk/indenter/independent_ensure.rb +23 -0
  55. data/lib/YkLib/Yk/indenter/independent_rescue.rb +23 -0
  56. data/lib/YkLib/Yk/indenter/operand_circumflex.rb +0 -0
  57. data/lib/YkLib/Yk/indenter/operand_period.rb +16 -0
  58. data/lib/YkLib/Yk/indenter/parenless_and.rb +37 -0
  59. data/lib/YkLib/Yk/indenter/post_test.rb +48 -0
  60. data/lib/YkLib/Yk/indenter/token.rb +1525 -0
  61. data/lib/YkLib/Yk/indenter.rb +1382 -0
  62. data/lib/YkLib/Yk/inot.rb +265 -0
  63. data/lib/YkLib/Yk/intf.rb +815 -0
  64. data/lib/YkLib/Yk/io_aux.rb +1332 -0
  65. data/lib/YkLib/Yk/ioctl.rb +60 -0
  66. data/lib/YkLib/Yk/ipcc.rb +87 -0
  67. data/lib/YkLib/Yk/ipcountry.rb +207 -0
  68. data/lib/YkLib/Yk/ipv4adr.rb +318 -0
  69. data/lib/YkLib/Yk/localmail.rb +276 -0
  70. data/lib/YkLib/Yk/method_chain.rb +359 -0
  71. data/lib/YkLib/Yk/misc_tz.rb +1716 -0
  72. data/lib/YkLib/Yk/missing_method.rb +50 -0
  73. data/lib/YkLib/Yk/mojiConv.rb +257 -0
  74. data/lib/YkLib/Yk/nostdlog.rb +4 -0
  75. data/lib/YkLib/Yk/on_marshal.rb +20 -0
  76. data/lib/YkLib/Yk/overrider.rb +47 -0
  77. data/lib/YkLib/Yk/path.rb +293 -0
  78. data/lib/YkLib/Yk/path_aux.rb +883 -0
  79. data/lib/YkLib/Yk/path_aux_alt.rb +0 -0
  80. data/lib/YkLib/Yk/path_rep.rb +1267 -0
  81. data/lib/YkLib/Yk/pg_setup.rb +917 -0
  82. data/lib/YkLib/Yk/procinfo.rb +314 -0
  83. data/lib/YkLib/Yk/proclist.rb +492 -0
  84. data/lib/YkLib/Yk/property.rb +863 -0
  85. data/lib/YkLib/Yk/ranger.rb +606 -0
  86. data/lib/YkLib/Yk/resolv_tz.rb +88 -0
  87. data/lib/YkLib/Yk/rlprompt.rb +73 -0
  88. data/lib/YkLib/Yk/rootexec.rb +48 -0
  89. data/lib/YkLib/Yk/rpm-packageproxy.rb +784 -0
  90. data/lib/YkLib/Yk/rpm-packageproxy2.rb +1430 -0
  91. data/lib/YkLib/Yk/rwhen.rb +21 -0
  92. data/lib/YkLib/Yk/selector.rb +124 -0
  93. data/lib/YkLib/Yk/set.rb +170 -0
  94. data/lib/YkLib/Yk/shellquote.rb +300 -0
  95. data/lib/YkLib/Yk/sio.rb +1001 -0
  96. data/lib/YkLib/Yk/sio0.rb +835 -0
  97. data/lib/YkLib/Yk/sio_aux.rb +1524 -0
  98. data/lib/YkLib/Yk/sio_inot.rb +86 -0
  99. data/lib/YkLib/Yk/sock_aux.rb +42 -0
  100. data/lib/YkLib/Yk/spipe.rb +843 -0
  101. data/lib/YkLib/Yk/sql_table.rb +565 -0
  102. data/lib/YkLib/Yk/stdlog.rb +4 -0
  103. data/lib/YkLib/Yk/syscommand.rb +173 -0
  104. data/lib/YkLib/Yk/sysinit.rb +75 -0
  105. data/lib/YkLib/Yk/ttyFontWidth.rb +46113 -0
  106. data/lib/YkLib/Yk/tty_char.dump +0 -0
  107. data/lib/YkLib/Yk/tty_char.rb +47 -0
  108. data/lib/YkLib/Yk/tty_char_create.rb +437031 -0
  109. data/lib/YkLib/Yk/tty_char_static.rb +437016 -0
  110. data/lib/YkLib/Yk/tty_rewrite.rb +142 -0
  111. data/lib/YkLib/Yk/tty_str.rb +461 -0
  112. data/lib/YkLib/Yk/tty_width.dat.rb +114 -0
  113. data/lib/YkLib/Yk/tty_width.rb +180 -0
  114. data/lib/YkLib/Yk/tty_width_available +569 -0
  115. data/lib/YkLib/Yk/tty_width_list +0 -0
  116. data/lib/YkLib/Yk/tty_width_list.linux +280 -0
  117. data/lib/YkLib/Yk/tty_width_list.windows +324 -0
  118. data/lib/YkLib/Yk/tz_tty +0 -0
  119. data/lib/YkLib/Yk/tz_tty.rb +0 -0
  120. data/lib/YkLib/Yk/uprepos.rb +94 -0
  121. data/lib/YkLib/Yk/userinfo.rb +91 -0
  122. data/lib/YkLib/Yk/with.rb +109 -0
  123. data/lib/YkLib/version.rb +3 -0
  124. data/lib/YkLib.rb +6 -0
  125. metadata +170 -0
@@ -0,0 +1,1525 @@
1
+ class String
2
+ undef gets
3
+ def posReplaceSpace range
4
+ range.first
5
+ end
6
+ def posOf expr, from
7
+ x, y = from[1], from[0] - 1
8
+ lns = expr.lines
9
+ after = lns[y .. -1].join[x .. -1]
10
+ i = after.index expr
11
+ if i
12
+ lns = expr
13
+ else
14
+ nil
15
+ end
16
+ end
17
+ end
18
+
19
+
20
+ class Module
21
+ def attr_accessor_predicate *args
22
+ args.each do |e|
23
+ d = %{
24
+ def #{e}= arg
25
+ @#{e} = arg
26
+ end
27
+ def #{e}?
28
+ arg
29
+ end
30
+ def #{e}
31
+ arg
32
+ end
33
+ }
34
+ case self
35
+ when Class
36
+ class_eval d
37
+ when Module
38
+ module_eval d
39
+ end
40
+ end
41
+ end
42
+ end
43
+
44
+
45
+ require 'ripper'
46
+
47
+
48
+ class Ripper::Lexer::State
49
+ List = %i{
50
+ BEG
51
+ END
52
+ ENDARG
53
+ ENDFN
54
+ ARG
55
+ CMDARG
56
+ MID
57
+ FNAME
58
+ DOT
59
+ CLASS
60
+ LABEL
61
+ LABELED
62
+ FITEM
63
+ }
64
+ List.each_with_index do |s, i|
65
+ self.class_eval %{
66
+ def #{s.to_s.downcase}?
67
+ if (1 << #{i}) & (to_i.to_i + 0) != 0
68
+ self
69
+ else
70
+ nil
71
+ end
72
+ end
73
+ }
74
+ end
75
+ end
76
+
77
+
78
+ class << Ripper
79
+ STUFFER1 = "\v\f\v\f\v\f"
80
+ STUFFER2 = "\v\v\v\f\f\f"
81
+ alias_method :org_lex, :lex
82
+ def lex src, *args, **opts
83
+ res = nil
84
+ rlst = []
85
+ llcor = nil
86
+ begin
87
+ class << src
88
+ alias_method :org_respond_to?, :respond_to?
89
+ def respond_to? label
90
+ if label == :gets
91
+ return false
92
+ else
93
+ org_respond_to? label
94
+ end
95
+ end
96
+ end
97
+ res = catch :restart do
98
+ llst = org_lex src, *args, **opts
99
+ i_pos = 0
100
+ pe = nil
101
+ lcor = nil
102
+ llst.each do |e|
103
+ i_pos += e[2].size
104
+ if !llcor || (llcor[0] < e[0][0] || (llcor[0] == e[0][0] && llcor[1] <= e[0][1]))
105
+ if define?(Endless) && e[1] == :on_sp && e[2][0] == "\\" && (!pe || pe[2] !~ /#{Token.stuffer(:hidden_nl)}$/)
106
+ ex = [[e[0][0], e[0][1] + 1], e[2][1..-1] == "\n" ? :on_nl : :on_sp, e[2][1..-1], Ripper::Lexer::State.new(1)]
107
+ e = [e[0], :on_op, "\\", Ripper::Lexer::State.new(1)]
108
+ elsif e[1] == :on_CHAR &&
109
+ if e[2] == "\\"
110
+ e[1] = :"\\"
111
+ e[3] = Ripper::Lexer::State.new(1)
112
+ elsif e[2] == "\\\t"
113
+ e[1] = :"\\"
114
+ e[2] = :"\\"
115
+ e[3] = Ripper::Lexer::State.new(1)
116
+ ex = [[e[0][0], e[0][1] + 1], :on_sp, "\t", Ripper::Lexer::State.new(1)]
117
+ end
118
+ end
119
+ rlst.push e
120
+ rlst.push ex if ex
121
+ end
122
+ lcor = e[0].clone
123
+ lcor[1] = e[0][1] + e[2].size
124
+ pe = e
125
+ end
126
+ if src.size > i_pos
127
+ loop do
128
+ if src[i_pos .. -1] =~ /\A[\r \f\v]+/
129
+ rlst.push [lcor.clone, :on_sp, $&, Ripper::Lexer::State.new(1)]
130
+ lcor[1] += $&.size
131
+ i_pos += $&.size
132
+ elsif src[i_pos] == "\n"
133
+ rlst.push [lcor.clone, :on_nl, "\n", Ripper::Lexer::State.new(1)]
134
+ lcor[0] += 1
135
+ lcor[1] = 0
136
+ i_pos += 1
137
+ else
138
+ break
139
+ end
140
+ end
141
+ llcor = lcor
142
+ src = "\n" * (lcor[0] - 1) + " " * lcor[1] + src[i_pos .. -1]
143
+ throw :restart, :restart
144
+ end
145
+ end
146
+ #p res
147
+ end while res == :restart
148
+ rlst
149
+ end
150
+ end
151
+
152
+
153
+ class Module
154
+ def ___call_overridden
155
+
156
+ end
157
+ def self.override_method new, old
158
+
159
+ end
160
+ end
161
+
162
+
163
+
164
+ class Token
165
+ attr_accessor :pos, :str, :stat, :first, :tty_pos, :prevNL
166
+ attr_reader :kind, :dprev
167
+ attr_accessor :dnext,
168
+ :parStackI,
169
+ :beginner, :parent,
170
+ :params, :cur
171
+ ModuleList = {}
172
+ def self.registerModule mod, kind
173
+ ModuleList[kind] = true
174
+ end
175
+ def self.getModule kind
176
+ ModuleList[kind] || (
177
+ k = k.to_s.gsub /(\A|_)[a-z]/ do
178
+ ($&[1] || $&[0]).upcase
179
+ end
180
+ eval("defined?(#{k}) && #{k}.is_a?(Module) && #{k}")
181
+ )
182
+ end
183
+ def onClassify
184
+ end
185
+ def classify
186
+ mod = self.class.getModule @kind
187
+ extend mod if mod
188
+ @classified = true
189
+ onClassify
190
+ end
191
+ def prev
192
+ dp = @dprev
193
+ until dp&.kind != :on_sp
194
+ dp = dp.dprev
195
+ end
196
+ return dp
197
+ end
198
+ def prev_non_sp
199
+ dp = @dprev
200
+ until dp&.kind != :on_sp && !SameAsLn.include?(dp.kind)
201
+ dp = dp.dprev
202
+ end
203
+ return dp
204
+ end
205
+ def kind= k
206
+ @kind = k
207
+ if @classified
208
+ classify
209
+ end
210
+ end
211
+ def dprev= arg
212
+ @dprev = arg
213
+ arg.dnext = self
214
+ end
215
+ def initialize po, k, st, sta, i, t, pr
216
+ # [po, k, st, star] <= Ripper.lex.each do |[[Integer, Integer], Symbol, String, Ripper::Lexer::State]|
217
+ @pos = po
218
+ @kind = k
219
+ @str = st
220
+ @stat = sta
221
+ @first = i
222
+ @tty_pos = t
223
+ @prevNL = pr
224
+ end
225
+
226
+ class Params < Struct.new(:dprev, :parStack, :idtStacks, :idtStack)
227
+ def initialize o
228
+ @parStack = [o.wrapped]
229
+ @idtStack = []
230
+ @idtStacks = []
231
+ @dprev = o
232
+ end
233
+ end
234
+ @@cur = Params.new Origin
235
+ @@hdocs = HDocStack.new
236
+ @@curHDocStack = []
237
+ class HDocStack < Array
238
+ def hDocBeginIndex
239
+ llno = last.lno
240
+ i = 0
241
+ reverse_each do |t|
242
+ if llno != t.lno
243
+ break
244
+ end
245
+ i -= 1
246
+ end
247
+ i
248
+ end
249
+ def hDocBegin
250
+ self[hDocBeginIndex]
251
+ end
252
+ def sliceHDocBegin!
253
+ i = hDocBeginIndex
254
+ ret = self[i]
255
+ delete_at i
256
+ ret
257
+ end
258
+ end
259
+ def self.curHDoc
260
+ @@curHDocStack.last
261
+ end
262
+ def self.curSetHDocBegin
263
+ @@hdocs.last.params ||= @@cur
264
+ hDocBeg = @@hdocs.hDocBegin.cloneBase
265
+ @@curHDocStack[-1] = hDocBeg
266
+ @@cur = Params.new hDocBeg
267
+ @@cur.dprev = hDocBeg
268
+ @@cur.parStack = [hDocBeg.wrapped]
269
+ @@cur.idtStacks = []
270
+ @@cur.idtStack = []
271
+ end
272
+ def parentHasPeriodClause
273
+ eachParent do |t|
274
+ case t.kind
275
+ when :on_period, :"&."
276
+ return true
277
+ when :on_lbrace
278
+ return true if t.inserted?
279
+ end
280
+ end
281
+ return false
282
+ end
283
+ def ambiguousPeriodTheme?
284
+ found = false
285
+ eachParent do |t|
286
+ case t.kind
287
+ when :on_period, :"&."
288
+ if (tmp = s.prev).kind == :on_rparen && tmp.beginner.isOperand? && tmp.beginner.multiArgument?
289
+ return true
290
+ end
291
+ found ? return(true) : found = true
292
+ when :on_lbrace
293
+ if t.inserted?
294
+ found ? return(true) : found = true
295
+ end
296
+ end
297
+ end
298
+ return false
299
+ end
300
+ def isOperand? checkParent = true
301
+ case @kind
302
+ when :on_period
303
+ if !checkParent || parentHasPeriodClause
304
+ @prev.isStarter?
305
+ || @prev.isPreOp?
306
+ || [:on_lparen, :on_lbrace, :on_lbracket, :on_comma, :on_semicolon].include?(@prev.kind)
307
+ || [:on_ident, :on_const].include?(@prev.kind) && @dprev != @prev # @dprev == :on_sp
308
+ else
309
+ false
310
+ end
311
+ when :on_lparen
312
+ ![:on_comma, :"::"].include?(@prev.kind) && (![:on_ident, :on_const].include?(@prev.kind) || @dprev != @prev)
313
+ when :on_lbracket # cannot use for "x [1] do ... end" ; when x is a variable, is not operand, when x is a method, is operand
314
+ ![:on_ident, :on_const].include?(@prev.kind) || @dprev != @prev
315
+ when :on_lbrace # cannot use for "-> a { ... }"
316
+ ![:on_ident, :on_const].include?(@prev.kind)
317
+ when :on_rparen, :on_rbrace, :on_rbracket
318
+ false
319
+ else
320
+ if isPreOp?
321
+ (@prev.isStarter? || [:on_lparen, :on_lbrace, :on_lbracket, :on_comma, :on_semicolon].include?(@prev.kind)) &&
322
+ [:on_rparen, :on_rbrace, :on_rbracket, :on_comma, :on_semicolon].include?(@prev.kind)
323
+ elsif @prev.isPreOp?
324
+ true
325
+ else
326
+ false
327
+ end
328
+ end
329
+ end
330
+ LineEnders = [nil, :on_nl, :on_semicolon]
331
+ SpaceOrComment = [:on_sp, :on_nl, :on_comment, :on_ignored_nl, :on_embdoc_beg, :on_embdoc_end, :on_embdoc]
332
+ SameAsLn = [:on_comment, :on_embdoc_beg, :on_embdoc_end, :on_embdoc, :on_ignored_nl]
333
+ StrBegin = [:on_regexp_beg, :on_tstring_beg, :on_qwords_beg,:on_words_beg, :on_symbeg, :on_qsymbols_beg, :on_symbols_beg, :on_backtick]
334
+ def self.next expr, opts, f, lnoBase = 0, ebmode = nil
335
+ if !@@tenum
336
+ @@expr = expr
337
+ @@opts = opts
338
+ @@fName = f
339
+ @@lnoBase = lnoBase
340
+ @@ebmode = ebmode
341
+ tab_stop = opts[:tab_stop]
342
+ llst = Ripper.lex(expr)
343
+ class << llst
344
+ alias_method :org_each, :each
345
+ def each tab_stop
346
+ w_pos = 0
347
+ prevNL = true
348
+ i = 0
349
+ org_each do |e|
350
+ str = e[2]
351
+ e[3] = e[3].to_s.split("|").map{|e|e.intern}
352
+ yield Token.new(*e, i, w_pos, prevNL)
353
+ i += str.size
354
+ if str =~ /(\n|\r)\s*$/
355
+ prevNL = true
356
+ elsif str !~ /^\s*$/
357
+ prevNL = false
358
+ end
359
+ if str[-1] == "\n" || str[-1] == "\r"
360
+ w_pos = 0
361
+ else
362
+ lnpos = str.rindex(/\n|\r/)
363
+ begin
364
+ require 'Yk/tty_width.rb'
365
+ if lnpos
366
+ w_pos = TTYWidth.width str[lnpos + 1 .. -1], tab_stop, 0
367
+ else
368
+ w_pos = TTYWidth.width str, tab_stop, w_pos
369
+ end
370
+ rescue ArgumentError
371
+ w_pos = -1
372
+ end
373
+ end
374
+ end
375
+ end
376
+ end
377
+ # 後置の'は、プロパティ
378
+ # a.{. + 1} /* '.' is self */
379
+ # (a, b, c).{.aFunc + .bFunc + .cFunc} /* cannot use '.' */
380
+ # (a, b, c)::{aFunc + bFunc + cFunc}
381
+ # \\ a + 1, b + 2, x = c + 3 /* \\で変数を定義可能なclause */
382
+ # _1 + _2 + x
383
+ prevLnFirstPos = 0
384
+ enum = Enumerator.new llst, :each, tab_stop
385
+ @@tenum = Enumerator.new do |y|
386
+ checkIsIdent = -> t do
387
+ if t.dprev&.kind == :on_symbeg
388
+ t.kind = :on_tstring_end
389
+ else
390
+ case t.prev.kind
391
+ when :on_period, :"&.", :"::"
392
+ t.kind = :on_ident
393
+ when :on_op
394
+ if t.str == "&." || t.str == "::"
395
+ t.kind == :on_indent
396
+ end
397
+ else
398
+ if [:def, :undef].include?(t.prev&.kind) ||
399
+ t.prev&.kind == :on_kw && ["def", "undef"].include?(t.prev&.str) ||
400
+ t.prev&.kind == :alias ||
401
+ t.prev&.kind == :on_kw && t.prev&.str == "alias" ||
402
+ t.prev&.prev&.kind == :alias && t.prev&.prev&.str == "alias"
403
+ t.kind = :on_ident
404
+ end
405
+ end
406
+ end
407
+ end
408
+ normalize = -> t do
409
+ case t.kind
410
+ when :on_ident, :on_const
411
+ if t.dprev&.kind == :on_symbeg
412
+ t.kind = :on_tstring_end
413
+ end
414
+ when :on_kw
415
+ if !checkIsIdent.(t)
416
+ s = t.str.intern
417
+ if Starters.include?(s)
418
+ if !%i{while until rescue if unless}.include?(s) || %i{on_semicolon. on_nl}.include?(t.prev.kind) # modifier
419
+ t.kind = s
420
+ end
421
+ elsif %i{and or not}.include?(s)
422
+ t.kind = s
423
+ t.setOp
424
+ elsif s == :end
425
+ t.kind = s
426
+ end
427
+ end
428
+ when :on_op
429
+ if !checkIsIdent.(t)
430
+ t.kind = t.str.to_sym
431
+ t.setOp
432
+ end
433
+ when :on_backtick
434
+ checkIsIdent.(t)
435
+ end
436
+ end
437
+ queue = []
438
+ begin
439
+ t = nil
440
+ while true
441
+ if t.lno == @@hdocs.last&.lno && t.str =~ /\n/
442
+ @@curHDocStack.push nil
443
+ curSetHDocBegin
444
+ elsif t.kind == :on_heredoc_end
445
+ hDocBeg = @@hdocs.sliceHDocBegin!
446
+ if hDocBeg.str !~ /^\<\<(\~|\-|)(['"`]|)(.*?)\2/ || t.str !~ /^\s+#{Regexp.escape $3}\n/
447
+ raise Error.new("here document '#{hdBeg.str}' is descrepant with '#{t.str.chomp}'")
448
+ end
449
+ if hDocBeg.lno != @@hdocs.last&.lno
450
+ @@cur = hDocBeg.params
451
+ @@curHDocStack.pop
452
+ else
453
+ curSetHDocBegin
454
+ end
455
+ else
456
+ @@cur.dprev = t
457
+ end
458
+ t = enum.next
459
+ t.cur = @@cur
460
+ if t.kind == :on_heredoc_beg
461
+ @@hdocs.push t
462
+ end
463
+ t.dprev = t.cur.dprev
464
+ case t.kind
465
+ when :on_embexpr_beg
466
+ t.cur.idtStacks.push t.cur.idtStack
467
+ t.cur.idtStack = []
468
+ when :on_embexpr_end
469
+ t.cur.idtStack = t.cur.idtStacks.pop
470
+ end
471
+ # setup first indent
472
+ if t.realToken?
473
+ if t.prev == :origin
474
+ if defined?(Endless) && t.tty_pos != 0
475
+ raise Error.new("first word should not have space before it")
476
+ else
477
+ t.ipush
478
+ end
479
+ elsif t.prev == :on_embexpr_beg
480
+ t.tty_pos = 0
481
+ t.ipush # not spush, "str#{ goo ..." : tty_pos of 'goo' = 0
482
+ elsif t.prev_non_sp == :origin
483
+ if defined?(Endless) && t.tty_pos != 0
484
+ raise Error.new("first word should not have space before it")
485
+ else
486
+ t.ipush
487
+ end
488
+ elsif t.prev_non_sp == :on_embexpr_beg # "set#{ #
489
+ t.ipush # goo # ipush:'goo' thereafter (not here)
490
+ end
491
+ end
492
+
493
+ if t.kind == :on_comment # bare for adhoc literals
494
+ checkExtendedEmbExpr t.first + 2 if AdhocLiterals[:path] || AdhocLiterals[:url] || AdhocLiterals[:email]
495
+ end
496
+ if SameAsLn.include? t.kind
497
+ t.kind = :on_nl
498
+ end
499
+ # 2nd :on_nl is :on_sp
500
+ if t.prev.kind == :on_nl && t.kind == :on_nl
501
+ t.prev.kind = :on_sp
502
+ end
503
+ indentMode = nil
504
+ if t.realToken? && (%i{on_nl origin on_embexpr_beg}.incluide?(t.prev.kind))
505
+ indentMode = prevLnFirstPos <=> t.first
506
+ prevLnFirstPos = t.first
507
+ if defined?(Endless)
508
+ if t.kind == :ident && t.str == "_"
509
+ if indentMode == 1 # indent out
510
+ t.kind = :continue_clause
511
+ t.addMod t.range, " "
512
+ else # t.prev == \n
513
+ t.prev.addMod t.prev.range, "\\\n"
514
+ t.prev.kind = :on_sp
515
+ t.addMod t.range, " "
516
+ t.kind = :on_sp
517
+ t.str = " "
518
+ end
519
+ end
520
+ end
521
+ end
522
+ tpp = t.prev.prev
523
+ if (tpp = t.prev.prev).contOp? # operator before new line
524
+ if indentMode # new line
525
+ if defined?(Endless) && ( # . \n t
526
+ defined?(PeriodTheme) && (tpp.kind == :on_period || tpp.kind == :on_op && tpp.str == "&.") ||
527
+ defined?(DColonTheme) && (tpp.kind == :on_op && tpp.str == "::") )
528
+ if tpp.dprev.terminal? # foo. \n t
529
+ case indentMode
530
+ when 0 #same level
531
+ t.prev.kind = :on_sp
532
+ when -1 #indent out
533
+ raise Error.new("cannot continue '#{tpp.str}'") # error
534
+ end
535
+ elsif tpp.str == "&." # foo &. \n t
536
+ raise Error.new("cannot use '&.' as operand") # error
537
+ end
538
+ elsif !defined?(PeriodTheme) || tpp.kind != :on_period || !tpp.dprev.terminal? # foo . \n
539
+ t.prev.kind = :on_sp
540
+ end
541
+ end
542
+ end
543
+ normalize.(tpp)
544
+ if indentMode
545
+ if !defined?(Endless)
546
+ if tpp.kind == :on_kw && %w{class module def while until if elsif alias undef}.include?(tpp.str)
547
+ t.prev.kind = :on_sp
548
+ end
549
+ if tpp.prev.kind == :on_kw && tpp.str == "alias"
550
+ t.prev.kind = :on_sp
551
+ end
552
+ if !defined?(FreeCase)
553
+ if tpp.kind == :on_kw && %w{when in for}.include?(tpp.str)
554
+ t.prev.kind = :on_sp
555
+ end
556
+ end
557
+ if !defined?(ArglessCase)
558
+ if tpp.kind = :on_kw && tpp.str == "case"
559
+ t.prev.kind = :on_sp
560
+ end
561
+ end
562
+ end
563
+ end
564
+ t.prev_non_sp.prev_non_sp.setGo
565
+ queue.push t
566
+ while !queue.empty?
567
+ qf = queue.first
568
+ break if !qf.go?
569
+ y << queue.shift
570
+ end
571
+ end
572
+ rescue StopIteration
573
+ while !queue.empty?
574
+ qf = queue.first
575
+ normalize.(qf)
576
+ y << queue.shift
577
+ end
578
+ end
579
+ end
580
+ end
581
+ res = @@tenum.next
582
+ res.parent = res.cur.parStack.last.entity
583
+ res.classify
584
+ end
585
+
586
+ require 'Yk/indenter/each_token'
587
+
588
+ Starters = %i{
589
+ begin
590
+ do
591
+ else
592
+ ensure
593
+ then
594
+ rescue
595
+ case
596
+ def
597
+ class
598
+ module
599
+ if
600
+ elsif
601
+ unless
602
+ when
603
+ in
604
+ until
605
+ while
606
+ free_case
607
+ free_in
608
+ for
609
+ free_when
610
+ loop_for
611
+ }
612
+ StartersMayBrace = %i{
613
+ on_tlambda
614
+ \\
615
+ on_nl
616
+ ::
617
+ on_period
618
+ &.
619
+ }
620
+ StartersStr = %i{
621
+ on_regexp_beg
622
+ on_tstring_beg
623
+ on_qwords_beg
624
+ on_words_beg
625
+ on_symbeg
626
+ on_qsymbols_beg
627
+ on_symbols_beg
628
+ on_backtick
629
+ on_heredoc_beg
630
+ }
631
+ def classifyBeginner
632
+ class.implementBginner self
633
+ if Starters.include? @kind
634
+ class.implementStarter self
635
+ end
636
+ if StartersStr.include? @kind
637
+ class.implementStarterStr self
638
+ end
639
+ if StartersMayBrace.include? @kind
640
+ class.implementStarterMayBrace self
641
+ end
642
+ if [:on_lparen, :on_lbrace, :on_lbracket].include? @kind
643
+ class.implementOpener self
644
+ end
645
+ classify
646
+ end
647
+ def setComma t
648
+ ########
649
+ end
650
+ Sentence = Struct.new(:first, :last)
651
+ def self.implementBeginner obj
652
+ class << obj
653
+ attr_reader :ender, :sentences, :idt
654
+ attr_writer :wrapped
655
+ def wrapped
656
+ @wrapped ||= Wrapper.new(self)
657
+ end
658
+ def spop
659
+ w = cur.parStack.pop # wrapped
660
+ w.orgEntity.idt.popsi w
661
+ w.orgEntity.setEnder self
662
+ end
663
+ def openSentence t
664
+ if requireArg?
665
+ (@args ||= []).push Sentence.new(t, nil)
666
+ else
667
+ (@sentences ||= []).push Sentence.new(t, nil)
668
+ if @kind == :case
669
+ if ![:when, :in].include? t.kind
670
+ ######## self.kind = :free_case
671
+ end
672
+ end
673
+ end
674
+ end
675
+ def lines
676
+ if !@lines && @sentences
677
+ @lines = [@sentences[0].first ... nil]
678
+ @sentences.each do |e|
679
+ if @lines[-1].last
680
+ @lines.push(e.first ... nil)
681
+ end
682
+ if e.last.kind == :on_nl
683
+ @lines[-1].last = e.last
684
+ end
685
+ end
686
+ end
687
+ @lines
688
+ end
689
+ def closeSentence t
690
+ if requireArg?
691
+ if @args[-1].last
692
+ raise Error.new("argument of '#{str}' is already closed")
693
+ end
694
+ @args[-1].last = t
695
+ else
696
+ if @sentences[-1].last
697
+ raise Error.new("sentence is already closed")
698
+ end
699
+ @sentences[-1].last = t
700
+ end
701
+ end
702
+ def lastSentenceEnd
703
+ @sentences[-1].last
704
+ end
705
+ def isSentenceHead?
706
+ @parent.senteces.each do |s|
707
+ if s.first == self
708
+ return true
709
+ end
710
+ end
711
+ false
712
+ end
713
+ attr_accessor :inserted
714
+ def inserted?
715
+ @inserted
716
+ end
717
+ end
718
+ end
719
+ def spush
720
+ classifyBeginner
721
+ cur.parStack.push wrapped
722
+ cur.idtStack.last.pushsi wrapped
723
+ @idt = cur.idtStack.last
724
+ end
725
+ def reserve_spush
726
+ @sop = :spush
727
+ end
728
+ def reserve_spop
729
+ @sop = :spop
730
+ end
731
+ def doSop
732
+ case @sop
733
+ when :spush
734
+ spush
735
+ when :spop
736
+ spop
737
+ end
738
+ end
739
+ def self.implementStarterStr obj
740
+ (class << obj; self; end).class_eval do
741
+ end
742
+ end
743
+ def isStarter?
744
+ false
745
+ end
746
+ def isStarterMayBrace?
747
+ false
748
+ end
749
+ def isStarterAll?
750
+ false
751
+ end
752
+ def self.implementStarter obj
753
+ class << obj
754
+ def isStarter?
755
+ true
756
+ end
757
+ def isStarterAll?
758
+ true
759
+ end
760
+ attr_reader :argEnd, :in, :do
761
+ attr_accessor :body
762
+ def argEnd
763
+ if @argEnd
764
+ @argEnd
765
+ elsif @kind == :do || @kind == :on_lbrace
766
+ if (n = next_non_sp).kind == :|
767
+ n.ender.dnext
768
+ else
769
+ @dnext
770
+ end
771
+ end
772
+ end
773
+ def argEnd= t
774
+ @argEnd ||= t
775
+ end
776
+ def closeBeginner pi
777
+ "end"
778
+ end
779
+ def thenRelated? t
780
+ if [:if, :elsif, :rescue, :unless, :when, :in].include?(@kind)
781
+ if @argStarted
782
+ (@argEnd == t && t.kind == :on_semicolon || @argEnd.kind == :on_nl)
783
+ end
784
+ end
785
+ end
786
+ def doRelated?
787
+ !@do && @argStart && ([:while, :until].include?(@kind) || (@kind == :for && @in))
788
+ end
789
+ def clauseWhen t
790
+ case @kind
791
+ when :when
792
+ if !@argEnd
793
+ raise Error.new("when cluase without '#{@kind}' arguments or semicolon, new line")
794
+ end
795
+ when :case
796
+ if !@argStart
797
+ raise Error.new("when cluase without '#{@kind}' arguments")
798
+ end
799
+ @argEnd ||= t
800
+ end
801
+ @wrapped.changeEntity t
802
+ end
803
+ def clauseIn t
804
+ case @kind
805
+ when :when
806
+ if !@argEnd
807
+ raise Error.new("when cluase without '#{@kind}' arguments or semicolon, new line")
808
+ end
809
+ when :case
810
+ if !@argStart
811
+ raise Error.new("when cluase without '#{@kind}' arguments")
812
+ end
813
+ @argEnd ||= t
814
+ end
815
+ @wrapped.changeEntity t
816
+ end
817
+ def clauseRescue t
818
+ case @kind
819
+ when :def, :class, :module, :rescue
820
+ if !@argEnd
821
+ raise Error.new("else cluase without '#{@kind}' arguments or semicolon, new line")
822
+ end
823
+ when :begin
824
+ end
825
+ @wrapped.changeEntity t
826
+ end
827
+ attr_accessor :in
828
+ def setIn t
829
+ @in = t
830
+ t.kind = :loop_for_in
831
+ t.in = t # case in has no @in
832
+ @argEnd = t # range not include end
833
+ @wrapped.changeEntity t
834
+ end
835
+ def clauseElse t
836
+ if requireArg?
837
+ raise Error.new("else cluase without '#{@kind}' arguments or semicolon, new line")
838
+ end
839
+ @wrapped.changeEntity t
840
+ end
841
+ def clauseElseIf t
842
+ if requireArg?
843
+ raise Error.new("else cluase without '#{@kind}' arguments or semicolon, new line")
844
+ end
845
+ @wrapped.changeEntity t
846
+ end
847
+ def clauseEnsure t
848
+ (@ensure ||= []).push t
849
+ @argEnd ||= t
850
+ @wrapped.changeEntity t
851
+ end
852
+ def setThen t
853
+ if @then
854
+ raise Error.new("duplicated then")
855
+ end
856
+ @then = t
857
+ @argEnd ||= t
858
+ end
859
+ def setDo t
860
+ if @do
861
+ raise Error.new("duplicated do")
862
+ end
863
+ @do = t
864
+ @argEnd ||= t
865
+ end
866
+ def requireArg?
867
+ !@argEnd
868
+ && [:def, :class, :module, :if, :elsif, :unless, :case,
869
+ :when, :in, :until, :while, :rescue, :for, :"\\",
870
+ :on_tlambda, :post_test_while, :post_test_until, :for, :loop_for, :loop_for_in, :free_in, :free_when, :case, :non_free_case].include?(kind)
871
+ end
872
+ def argRange
873
+ if @argStart && @argEnd
874
+ @argStart.first .. @argEnd.first
875
+ else
876
+ nil
877
+ end
878
+ end
879
+ def mustWithArg?
880
+ [:def, :class, :module, :if, :elsif, :unless, :in, :until, :while, :post_test_while, :post_test_until, :loop_for, :loop_for_in, :free_case].include?(kind)
881
+ end
882
+ def completed?
883
+ !mustWithArg? || @argEnd
884
+ end
885
+ def nativeContinue? t
886
+ if @kind == :on_tlambda && @body == :do
887
+ t.kind == :end
888
+ else
889
+ (t.kind == :end && isStarter?) || (
890
+ case t.kind
891
+ when :else
892
+ %i{rescue elsif if unless when in then ifless_then ifless_elsif}.include? @kind
893
+ when :when
894
+ %i{when case}.include? @kind
895
+ when :in
896
+ %i{in case}.include? @kind
897
+ when :rescue
898
+ %i{begin def class module}.include? @kind
899
+ when :ensure
900
+ %i{begin def class module rescue}.include? @kind
901
+ when :elsif
902
+ %i{if elsif then ifless_then ifless_elsif}.include? @kind
903
+ when :post_test_while, :post_test_untl
904
+ @kind == :post_test_do
905
+ end
906
+ )
907
+ end
908
+ end
909
+ #def setPostTest t
910
+ # if @kind != :do
911
+ # raise Error.new("not do")
912
+ # else
913
+ # @wrapped.changeEntity t
914
+ # end
915
+ #end
916
+ def isIflessStarter?
917
+ [:then, :elsif, :else, :ifless_then, :ifless_else, :ifless_elsif].include?(@wrapped&.orgEntity&.kind || @kind)
918
+ end
919
+ def continuedClause?
920
+ @parent.nativeContinue?(self) && (!defined?(Endless) || @cur.idtStack.last == @parent)
921
+ end
922
+ def addChild t
923
+ (@children ||= []).push t
924
+ end
925
+ attr_accesor :upperCaseClause
926
+ def trySetUnderCase
927
+ if defined?(FreeCase)
928
+ f = eachParent do |par|
929
+ if [:case, :free_case].include? par.kind
930
+ @case = par
931
+ break :found
932
+ end
933
+ end
934
+ return false if f != :found
935
+ eachParent do |par|
936
+ if [:when, :in, :for, :free_when, :free_in, :free_case].include?(par.kind)
937
+ || par.kind == :else && par.wrapped.orgEntity == @freeCase
938
+ if !par.argStart
939
+ if !@argStart
940
+ raise Error.new("argless '#{str}' under argless '#{par.str}'")
941
+ elsif par != parent
942
+ raise Error.new("argless '#{par.str}' do not allow '#{str}' clause enclosed by '#{parent.str}...#{parent.ender.str}'")
943
+ end
944
+ end
945
+ end
946
+ par.addChild self
947
+ @upperCaseClause = par
948
+ return true
949
+ end
950
+ return false
951
+ end
952
+ raise Error.new("cannot find upper free case clause")
953
+ end
954
+ def case
955
+ if !@case
956
+ oe = wrapper.orgEntity
957
+ return oe if oe.kind == :case
958
+ end
959
+ return nil
960
+ end
961
+ def spVarName
962
+ ##################
963
+ end
964
+ def argCommas
965
+ ###############
966
+ end
967
+ def setComma t
968
+ end
969
+ def eachArgs
970
+ ##################
971
+ end
972
+ def requireIfConversion?
973
+ @requireIfConversion
974
+ end
975
+ def isWhenCondLBrace?
976
+ @isWhenCondLBrace
977
+ end
978
+ def hasAndOp?
979
+ @hasAndOp
980
+ end
981
+ def inDirectParen?
982
+ @prev_non_sp.kind == :on_lparen && @next_non_sp.kind == :on_rparen
983
+ end
984
+ def checkAndOp
985
+ if hasAndOp? && !@andOpProcessed && !inDirectParen? && %i{on_ident on_const ' "}.include?(dprev)
986
+ Token.addMod tb.last, "("
987
+ Token.addMod t.first, ")"
988
+ @andOpProcessed = true
989
+ end
990
+ end
991
+ attr_accessor :hasAndOp, :andOpProcessed
992
+ attr_accessor :ifConverted
993
+ attr_writer :isWhenCondLBrace
994
+ end
995
+ end
996
+ def var_able?
997
+ [:on_const, :on_ident, :on_tstring_end].include?(@kind) && @str =~ /\a#{VAR_REG}\z/
998
+ end
999
+ def var_label
1000
+ (@kind == :on_symbeg && @str =~ /\a:(#{VAR_REG})\z/) ? $1 : nil
1001
+ end
1002
+ def terminal?
1003
+ !isPreOp?
1004
+ && !%i{on_lparen on_lbrace on_lbracket on_period on_comma on_semicolon on_sp on_nl}.include?(@kind)
1005
+ end
1006
+ def self.implementStarterMayBrace obj
1007
+ class << obj
1008
+ def isStarterMayBrace?
1009
+ true
1010
+ end
1011
+ def isStarterAll?
1012
+ true
1013
+ end
1014
+ def isStarter?
1015
+ false
1016
+ end
1017
+ end
1018
+ end
1019
+ def self.implementOpener obj
1020
+ class << obj
1021
+ end
1022
+ end
1023
+ def cloneBase
1024
+ class.new pos, kind, str, stat, first, tty_pos, prevNL
1025
+ end
1026
+ def lno
1027
+ pos[0]
1028
+ end
1029
+ def tty_pos
1030
+ if @kind == :on_embexpr_beg
1031
+ 0
1032
+ else
1033
+ @tty_pos
1034
+ end
1035
+ end
1036
+ def range
1037
+ @first ... @first + str.size
1038
+ end
1039
+ def last
1040
+ @first + str.size
1041
+ end
1042
+ attr_accessor :nextClause, :prevClause, :currentClause
1043
+ class Wrapper
1044
+ def initialize t
1045
+ @entity = t
1046
+ @orgEntity = t
1047
+ end
1048
+ def changeEntity t
1049
+ @entity.nextClause = t
1050
+ @entity.closeSentence t
1051
+ t.prevClause = @entity
1052
+ @entity = t
1053
+ t.wrapped = self
1054
+ @orgEntity.currentClause = t
1055
+ t.classifyBeginner
1056
+ end
1057
+ def orgEntity
1058
+ @orgEntity
1059
+ end
1060
+ end
1061
+ def prev_nl?
1062
+ @prev == :on_nl
1063
+ end
1064
+ def endClose?
1065
+ isStarter? || @body == :do
1066
+ end
1067
+ def opponent? t
1068
+ case kind
1069
+ when :on_lparen
1070
+ t.kind == :on_rparen
1071
+ when :on_rparen
1072
+ t.kind == :on_lparen
1073
+ when :on_lbracket
1074
+ t.kind == :on_rbracket
1075
+ when :on_rbracket
1076
+ t.kind == :on_lbracket
1077
+ when :on_lbrace
1078
+ t.kind == :on_rbrace
1079
+ when :on_rbrace
1080
+ %i{on_lbrace hash_beg lbrace_clause case_cond_lbrace}.include? t.kind
1081
+ when :on_embexpr_beg
1082
+ t.kind == :on_embexpr_end
1083
+ when :on_embexpr_end
1084
+ t.kind == :on_embexpr_beg
1085
+ when :hash_beg, :lbrace_clause
1086
+ t.kind == :on_rbrace
1087
+ when :on_tlambda
1088
+ if body.kind == :on_lambeg
1089
+ t.kind == :on_rbrace
1090
+ elsif body.kind == :do
1091
+ t.kind == :end
1092
+ end
1093
+ when :|
1094
+ t.kind == :|
1095
+ else
1096
+ false
1097
+ end
1098
+ end
1099
+ Origin = self.new(nil, :origin, "", 0, -1, 0, false)
1100
+ def ipush
1101
+ cur.idtStack.push self
1102
+ end
1103
+ def pushsi w
1104
+ (@parStackI ||= []).push w
1105
+ end
1106
+ def popsi w
1107
+ if !@parStackI || @parStackI.empty? || @parStackI.last != w
1108
+ raise Error.new("cannot close '#{t.str}' beyond indentation")
1109
+ else
1110
+ @parStackI.pop
1111
+ end
1112
+ end
1113
+ def isOp?
1114
+ @isOp
1115
+ end
1116
+ attr_writer :go
1117
+ def go?
1118
+ @go
1119
+ end
1120
+ def setGo
1121
+ t = self
1122
+ while t && !t.go?
1123
+ t.go = true
1124
+ t = t.dprev
1125
+ end
1126
+ end
1127
+ def callArgOp?
1128
+ %i{& ** *}.include?(@kind) && dnext.realToken?
1129
+ end
1130
+ def unary?
1131
+ case @kind
1132
+ when *%i{:: ! ~ <: @+ @- @! @~ @<:}
1133
+ true
1134
+ when *%i{+ -}
1135
+ if dnext.realToken?
1136
+ true
1137
+ end
1138
+ when :^
1139
+ if defined?(PinClassOp) && dnext.realToken?
1140
+ true
1141
+ end
1142
+ end
1143
+ end
1144
+ def themeLParen?
1145
+ @kind == :on_lparen &&
1146
+ (@ender.next.kind == :on_period && defined?(PeriodTheme) ||
1147
+ @ender.next.kind == :"::" && defined?(DColonTheme))
1148
+ end
1149
+ def nonBinary?
1150
+ %i{~ ! <: @+ @- @! @~ @<:}.include? @kind
1151
+ end
1152
+ def isPreOp?
1153
+ @isOp && !%i{' "}.include?(@kind)
1154
+ end
1155
+ def contOp? # for preliminal token
1156
+ case @kind
1157
+ when :on_op
1158
+ if @dprev.kind == :on_symbeg
1159
+ return false
1160
+ end
1161
+ pr = defined?(Endless) ? @prev : @prev_non_sp
1162
+ if (pr.kind == :def) || (pr.kind == :on_kw && %w{def alias undef}.include?(pr.str))
1163
+ return false
1164
+ end
1165
+ prp = defined?(Endless) ? @prev.prev : @prev_non_sp.prev_non_sp
1166
+ if (prp.kind == :def) || (prp.kind == :on_kw && prp.str == "alias"))
1167
+ return false
1168
+ end
1169
+ if @prev.kind == :on_period
1170
+ return false
1171
+ end
1172
+ return true
1173
+ when :on_kw
1174
+ if %w{or and not}.include? @str
1175
+ return true
1176
+ end
1177
+ when :on_period
1178
+ return true
1179
+ end
1180
+ end
1181
+ def setOp
1182
+ @isOp = true
1183
+ end
1184
+ def continues?
1185
+ isPreOp? ||
1186
+ [:on_comma, :on_lbrace, :on_lbracket, :on_lparen].include?(kind) ||
1187
+ @kind == :on_kw && ["and", "not", "or"].include?(str) ||
1188
+ @kind == :on_period && !%i{on_sp on_nl}.include?(@dprev.kind)
1189
+ end
1190
+ def realToken?
1191
+ ![:on_sp, :on_nl, :on_heredoc_end, :on_tstring_content, :on_ignored_sp, :on_embexpr_beg, :on_embexpr_end].include?(@kind)
1192
+ end
1193
+ def unindent_pos= pos
1194
+ @unindent_pos = pos
1195
+ end
1196
+ def unindent_pos
1197
+ @unindent_pos || @tty_pos
1198
+ end
1199
+ def self.stuffer arg
1200
+ d = Marshal.dump(arg)
1201
+ sz = d.byte_size
1202
+ if sz > 65535
1203
+ raise Error.new("cannot encode stuffer object")
1204
+ end
1205
+ szp = [sz].pack("s*")
1206
+ d = szp + d + szp
1207
+ s = String.new(capacity: sz * 8 + 4)
1208
+ d.each_byte do |b|
1209
+ 8.times do
1210
+ s += if b & 0x1 == 1
1211
+ "\v"
1212
+ else
1213
+ "\f"
1214
+ end
1215
+ b >>= 1
1216
+ end
1217
+ end
1218
+ s
1219
+ end
1220
+ def setPostStuffer arg
1221
+ @@expr[range] = @@expr[range] + STUFFER1 + self.class.stuffer(arg) + STUFFER2
1222
+ end
1223
+ def setPreStuffer arg
1224
+ @@expr[range] = STUFFER2 + self.class.stuffer(arg) + STUFFER1 + @@expr[range]
1225
+ end
1226
+ def _getStuffer pos, sz
1227
+ b = 0
1228
+ i = 0
1229
+ toLoad = String.new(capacity: sz + 1)
1230
+ @@expr[pos, sz * 8].each_char do |c|
1231
+ case c
1232
+ when "\v"
1233
+ b += 1 << (i % 8)
1234
+ when "\f"
1235
+ else
1236
+ raise Error.new("illeagal format for stuffer argument")
1237
+ end
1238
+ i += 1
1239
+ if i % 8 == 0
1240
+ toLoad += b.chr
1241
+ b = 0
1242
+ end
1243
+ end
1244
+ return Marshal.load(toLoad)
1245
+ end
1246
+ private :_getStuffer
1247
+ def getPostStuffer
1248
+ pos = first + str().size
1249
+ if @@expr[pos, STUFFER1.size] == STUFFER1
1250
+ pos += STUFFER1.size
1251
+ sz = @@expr[pos, 2].unpack("s")[0]
1252
+ pos += 2
1253
+ _getStuffer pos, sz
1254
+ end
1255
+ end
1256
+ def getPreStuffer
1257
+ pos = first - STUFFER2.size
1258
+ if @@expr[pos, STUFFER2.size] == STUFFER2
1259
+ pos -= 2
1260
+ sz = @@expr[pos, 2].unpack("s")[0]
1261
+ pos -= sz * 8
1262
+ _getStuffer pos, sz
1263
+ end
1264
+ end
1265
+ #def addLineTop t
1266
+ # (@lineTops ||= []).push t
1267
+ #end
1268
+ #def addSentenceTop t
1269
+ # (@sentenceTops ||= []).push t
1270
+ # if t.parent != self
1271
+ # raise Error.new("parent of line and sentence, discrepant")
1272
+ # end
1273
+ #end
1274
+ def parentKind k
1275
+ eachParent do |par|
1276
+ if par.kind == k
1277
+ return par
1278
+ end
1279
+ end
1280
+ end
1281
+ def eachParent beyodMethod = false
1282
+ if @parent
1283
+ yield @parent
1284
+ if beyodMethod || ![:class, :module, :def].include(@parent.wrapped.orgEntity.kind)
1285
+ @parent.eachParent do |par|
1286
+ yield par
1287
+ end
1288
+ end
1289
+ end
1290
+ nil
1291
+ end
1292
+ def defClsFirstSententence
1293
+ t = nil
1294
+ eachParent do |e|
1295
+ t = e
1296
+ end
1297
+ if t.sentences
1298
+ t.sentences[0].first
1299
+ else
1300
+ raise Error.new("cannot find first sentence")
1301
+ end
1302
+ end
1303
+ def isLineHead?
1304
+ par = s.parent
1305
+ if par&.args&.find{|e| e.first == self}
1306
+ return true
1307
+ elsif par&.sentences&.find{|e| e.first == self}
1308
+ return true
1309
+ end
1310
+ end
1311
+ def isUnaryOperator?
1312
+ @kind == :~ || @kind == :"!"
1313
+ end
1314
+ attr_accessor :clauseStart
1315
+ def iteratorMethod= t
1316
+ @iteratorMethod = t
1317
+ t.clauseStart = self
1318
+ end
1319
+ def starterHead= t
1320
+ @starterHead = t
1321
+ t.clauseStart = self
1322
+ end
1323
+ def self.addMod pos, str
1324
+ (@@modList ||= []).push [pos, str]
1325
+ end
1326
+ def addMod pos, str
1327
+ (@@modList ||= []).push [pos, str]
1328
+ end
1329
+ def setIteratorLabelVar label
1330
+ if (@iteratorLabelVars ||= []).include? label
1331
+ raise Error.new("iterator label '#{label}' is already defined.")
1332
+ else
1333
+ @iteratorLabelVars.push label
1334
+ Token.addMod first, "#{label} = nil;"
1335
+ end
1336
+ end
1337
+ def insertVer var, data = "nil"
1338
+ @insertedVar ||= Hash.new
1339
+ if !@insertedVar[var]
1340
+ @insertedVar[var] = data
1341
+ Token.addMod first, "#{var} = #{data};"
1342
+ end
1343
+ end
1344
+ METHOD_TOP = '[^\x00-\x40\x5b-\x5e\x60\x7b-\x7f]' #exclude numeric and operators
1345
+ MED_CHAR = '[^\x00-\x2f\x3a-\x41\x5b-\x5e\x60x7b-\x7f]' #exclude operators
1346
+ VAR_TOP = '[^\x00-\x60\x7b-\x7f]' #exclude numeric and operators and capitals
1347
+ METHOD_REG = "#{METHOD_TOP}#{MED_CHAR}*([?!]|)"
1348
+ VAR_REG = "#{VAR_TOP}#{MED_CHAR}*"
1349
+ attr_accessor :iteratorCand
1350
+ def next_meaningful
1351
+ n = self
1352
+ begin
1353
+ n = n.dnext
1354
+ end while n == :on_sp
1355
+ n
1356
+ end
1357
+ def next_non_sp
1358
+ n = self
1359
+ begin
1360
+ n = n.dnext
1361
+ end while [:on_sp, :on_nl].include?(n)
1362
+ n
1363
+ end
1364
+ def maybeIteratorLabel? checkAfter = false
1365
+ if [:on_label, :on_ident, :on_const].include? kind
1366
+ if @@expr[first ... @dnext.last] =~ /\a#{METHOD_REG}:#{VAR_REG}\z/
1367
+ if checkAfter
1368
+ case (m = @dnext.next_meaningful).kind
1369
+ when :on_rparen, :on_rbrace,
1370
+ :on_rbracket, :on_semicolon
1371
+ when :on_comma, :^, :"::"
1372
+ if [:on_sp, :on_nl].include? m.dprev.kind
1373
+ true
1374
+ end
1375
+ else
1376
+ if !m.isPreOp? || m.unary?
1377
+ true
1378
+ end
1379
+ end
1380
+ else
1381
+ true
1382
+ end
1383
+ end
1384
+ end
1385
+ end
1386
+ def chunkTop
1387
+ ##########
1388
+ end
1389
+ def trySetupIterator mode, doOrBrace, ed = nil
1390
+ mthd = trySetupIteratorEach mode
1391
+ # while until -> argEnd
1392
+ # general -> :do, \\, \n
1393
+ # |a, b, c|の後
1394
+ case mthd
1395
+ when :hash
1396
+ when nil
1397
+ else
1398
+ label = mthd.label
1399
+ if label
1400
+ defClsFirstSententence.first.setIteratorLabelVar label
1401
+ Token.addMod mthd.chunkTop.first,
1402
+ "begin
1403
+ #{label} = ItratorLabel.new
1404
+ ".gsub(/\n/, ";").gsub(/\s+/, " ")
1405
+ Token.addMod doOrBrace.argEnd.last,
1406
+ " begin
1407
+ #{label}.setLast((".
1408
+ gsub(/\n/, ";").gsub(/\s+/, " ")
1409
+ ins =
1410
+ "))
1411
+ rescue #{label}.exNext
1412
+ next
1413
+ rescue #{label}.exRedo
1414
+ redo
1415
+ end
1416
+ end
1417
+ #{label}.res #nil or something in case iterator
1418
+ rescue #{label}.exBreak
1419
+ #{label}.res
1420
+ end".gsub(/\n/, ";").gsub(/\s+/, " ")
1421
+ else
1422
+ "end"
1423
+ end
1424
+ end
1425
+ mthd
1426
+ end
1427
+ def invoker?
1428
+ #######
1429
+ end
1430
+ def trySetupIteratorEach mode
1431
+ case mode
1432
+ when :forward # while:label :while, *on_symbeg, on_tstring_end
1433
+ if %i{while until}.include?(@kind)
1434
+ if @dnext.kind == :on_symbeg && @dnext.dnext.var_able?
1435
+ @label = @dnext.dnext.str
1436
+ Token.addMod @dnext.range, ""
1437
+ end
1438
+ return self
1439
+ end
1440
+ when :preset
1441
+ # foo:label on_label, *ident
1442
+ if var_able? && @dprev.kind == :on_label
1443
+ @dprev.label = @str
1444
+ Token.addMod @dprev.range, @dprev.str.chop
1445
+ Token.addMod range, ""
1446
+ return @dprev
1447
+ end
1448
+ # *ident, symbeg, tstring_end
1449
+ # *:'"', symbeg, tstring_end
1450
+ if %i{on_const on_ident " '}.include(@kind)
1451
+ if @dnext.kind == :on_symbeg && @dnext.dnext.var_able?
1452
+ @label = @dnext.dnext.str
1453
+ Token.addMod @dnext.range, ""
1454
+ Token.addMod @dnext.dnext.range, ""
1455
+ end
1456
+ return self
1457
+ end
1458
+ when :back
1459
+ # foo:label on_label, *ident
1460
+ if var_able?
1461
+ if @dprev.kind == :on_label
1462
+ @dprev.label = @str
1463
+ Token.addMod @dprev.range, @dprev.str.chop
1464
+ Token.addMod range, ""
1465
+ return @dprev
1466
+ # ident, symbeg, *tstring_end
1467
+ # :'"', symbeg, *tstring_end
1468
+ elsif @dprev.kind == :on_symbeg && %i{on_const on_ident "}.include(@dprev.dprev.kind)
1469
+ @dprev.dprev.label = @str
1470
+ Token.addMod @dprev.range, ""
1471
+ Token.addMod range, ""
1472
+ if @dnext.respond_to? :checkAndOp
1473
+ if %i{on_lparen on_lbracket}.include? @dnext.kind
1474
+ @dnext.checkAndOp
1475
+ end
1476
+ end
1477
+ return @dprev.dprev
1478
+ end
1479
+ end
1480
+ # foo { } should be hash # {a => b}
1481
+ if next_non_sp.kind == :on_lbrace && next.kind == :on_sp
1482
+ next_non_sp.kind = :hash_beg
1483
+ Token.addMod next_non_sp.range, "Hash.new("
1484
+ Token.addMod next_non_sp.next_non_sp.range, ")"
1485
+ return :hash
1486
+ end
1487
+ if %i{on_const on_ident " '}.include(@kind)
1488
+ return self
1489
+ end
1490
+ end
1491
+ end
1492
+ def setupIteratorLabel
1493
+ if @kind == :on_label
1494
+ @str = @str.chop
1495
+ if @str == "while" || @str == "until" || @str == "do"
1496
+ self.kind = @str.intern
1497
+ else
1498
+ self.kind = :on_ident
1499
+ end
1500
+ @dnext.kind = :on_symbeg
1501
+ @dnext.str = ":" + @dnext.str
1502
+ end
1503
+ self
1504
+ end
1505
+ def findParent
1506
+ eachParent do |par|
1507
+ return par if yield par
1508
+ end
1509
+ return nil
1510
+ end
1511
+ def usePeriod?
1512
+ ##########
1513
+ end
1514
+ end # class Token
1515
+ class Beginner < Token
1516
+ def ender= arg
1517
+ @ender = arg
1518
+ arg.beginner = self
1519
+ end
1520
+ attr_accessor :beginner
1521
+ end
1522
+ class Opener < Beginner # (, [, { ,| (closeure argument)
1523
+ end
1524
+ class Starter < Encloser # if unless case while until
1525
+ end