YkLib 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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