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,313 @@
1
+
2
+ class Token
3
+
4
+ MethodChain.override do
5
+ def checkRequireArgStarterWithoutArg
6
+ begin
7
+ super
8
+ rescue WhenWithoutArg => e
9
+ if !parent.trySetUnderCase
10
+ raise e
11
+ end
12
+ end
13
+ end
14
+ def checkRequireArgStarterWithArg
15
+ begin
16
+ super
17
+ rescue ForWithoutIn => e
18
+ if trySetUnderCase
19
+ kind = :for_when
20
+ else
21
+ raise e
22
+ end
23
+ end
24
+ end
25
+ end
26
+
27
+ Modules :OnNl, :OnSemicolon do
28
+ MethodChain.override do
29
+ def onClassify
30
+ begin
31
+ super
32
+ rescue ForWithoutIn => e
33
+ if !parent.trySetUnderCase
34
+ raise e
35
+ end
36
+ parent.kind = :for_when
37
+ end
38
+ end
39
+ end
40
+ end
41
+
42
+ Modules :OnLbrace do
43
+ MethodChain.override do
44
+ def onClassify
45
+ condKinds = [:when, :for, :free_when, :for_when]
46
+ if condKinds.include?(parent.kind) && (condKinds + [:on_comma]).include(prev.kind)
47
+ kind = :case_cond_lbrace
48
+ else
49
+ super
50
+ end
51
+ end
52
+ end
53
+ end
54
+
55
+ Modules :In, :When do
56
+ MethodChain.override do
57
+ def onClassify
58
+ begin
59
+ super
60
+ @case = @wrapper.orgEntity
61
+ @direct = true
62
+ @case.addChild self
63
+ @upperCaseClause = @case
64
+ rescue OrphanContClause => e
65
+ if prev_nl? && trySetUnderCase
66
+ kind = "free_#{@kind}".intern
67
+ spush
68
+ else
69
+ raise e
70
+ end
71
+ rescue ForWhen => e # "for when", "for in"
72
+ parent.kind = "for_#{@kind}".intern
73
+ if !parent.trySetUnderCase
74
+ raise e
75
+ end
76
+ kind = :on_sp
77
+ str = " " * str.size()
78
+ end
79
+ end
80
+ end
81
+ end
82
+
83
+
84
+ class CaseCondList
85
+ def initialize vn, cn
86
+ @vn = vn
87
+ @cn = cn
88
+ @list = []
89
+ end
90
+ def add c
91
+ @list.push c
92
+ end
93
+ def head
94
+ <<~Out
95
+ #{@vn}.pushCondProxy
96
+ begin
97
+ begin
98
+ #{getSubHead}
99
+ rescue #{@vn}.FinishCond
100
+ end
101
+ if #{@vn}.hasTrue?
102
+ Out
103
+ end
104
+ def getSubHead
105
+ emb = ""
106
+ @list.each do |e|
107
+ if e.is_a? CaseCondList
108
+ emb += e.getSubHead
109
+ else
110
+ case e
111
+ when /\A(when|in)\b/
112
+ emb += <<~Out
113
+ if case #{@vn}.case #{e}; true; else false end
114
+ #{@vn}.pushCond true
115
+ #{@vn}.finishCond
116
+ else
117
+ #{@vn}.pushCond false
118
+ end
119
+ Out
120
+ when /\Afor\b/
121
+ emb += <<~Out
122
+ if case #{@vn}.case when #{$'}; true; else false end
123
+ #{@vn}.pushCond true
124
+ else
125
+ #{@vn}.pushCond false
126
+ end
127
+ Out
128
+ end
129
+ end
130
+ end
131
+ emb
132
+ end
133
+ def tail
134
+ emb += <<~Out
135
+ #{
136
+ if ["when", "in"].include? @cn
137
+ #{@vn}.finish
138
+ end
139
+ }
140
+ end # if #{@vn}.hasTrue?
141
+ ensure
142
+ #{@vn}.popCondProxy
143
+ end
144
+ Out
145
+ end
146
+ end
147
+
148
+ def gatherDescendantsCond vn, s, condList
149
+ s.children.each do |e|
150
+ if s != e.parent
151
+ raise Error.new("free case clause '#{e.str}' is not a direct member of argless upper clause, '#{s.str}'")
152
+ end
153
+ if e.argStart # with argument
154
+ ###################...................... eの完全な出力結果で置換する
155
+ condList.add @expr[e.first ... e.argEnd.first]
156
+ Token.add e.range,"if #{vn}.shiftCond;"
157
+ pre = "#{vn}.set_res("
158
+ post = ")" + (e.kind != :for_when ? ".finish" : "")
159
+ if e.sentences
160
+ Token.addMod e.sentences[0].first.first, pre
161
+ Token.addMod e.sentences.last.last.first, post
162
+ else
163
+ Token.addMod e.argEnd.first, pre + "nil" + post
164
+ end
165
+ if e.children # still has children
166
+ e.children.each do |ch|
167
+ eachCaseChild(vn, ch, false)
168
+ end
169
+ end
170
+ elsif e.children # argless when, gather conditions from children
171
+ gatherDescendantsCond(vn, s, cnd = CaseCondList.new(vn, e.str))
172
+ condList.add cnd
173
+ else
174
+ raise Error.new("argument less '#{e.str}' under argument less '#{s.str}'")
175
+ end
176
+ end
177
+ end
178
+
179
+ def eachCaseChild vn, s, direct # 'when', 'in', 'for' with argument
180
+ if !s.arglessWhen? # argument less when
181
+ if s.children # proxy condition for children
182
+ gatherDescendantsCond(vn, s, cnd = CaseCondList.new(vn, s.str))
183
+ h = cnd.head
184
+ t = cnd.tail
185
+ else # unconditional when, in, for : mimic 'else' of traditional 'case'
186
+ h = "begin;"
187
+ t = "end"
188
+ end
189
+ Token.addMod s.range, h
190
+ Token.addMod s.sentences.last.last, (s.kind != :for_when ? ";#{vn}.finish" : "") + t
191
+ else
192
+ if !direct
193
+ Token.add s.first,"if (case #{vn}.case; "
194
+ if (tmp = case s.kind
195
+ when :for_when
196
+ "when"
197
+ when :for_in
198
+ "in"
199
+ end) then
200
+ Token.add s.range, tmp
201
+ end
202
+ Token.add s.last, "; true; else false; end)"
203
+ pre = "#{vn}.set_res("
204
+ post = ")" + (!tmp ? ".finish" : "")
205
+ if s.sentences
206
+ Token.addMod s.sentences[0].first.first, pre
207
+ Token.addMod s.sentences.last.last.first, post
208
+ else
209
+ Token.addMod s.argEnd.first, pre + "nil" + post
210
+ end
211
+ end
212
+ s.children&.each do |s|
213
+ eachCaseChild(vn, s, false)
214
+ end
215
+ end
216
+ end
217
+
218
+ def addChild t
219
+ (@children ||= []).push t
220
+ end
221
+
222
+ attr_reader :case
223
+ def direct?
224
+ @direct
225
+ end
226
+ def requireIfConversion?
227
+ @requireIfConversion
228
+ end
229
+ attr_writer :requireIfConversion
230
+ def trySetUnderCase
231
+ f = eachParent do |par|
232
+ if [:case, :non_free_case].include? par.kind
233
+ @case = par
234
+ break :found
235
+ end
236
+ end
237
+ return false if f != :found
238
+ eachParent do |par|
239
+ if [:when, :in, :for_in, :for_when, :free_when, :free_in, :case, :non_free_case].include?(par.kind)
240
+ || par.kind == :else && par.wrapped.orgEntity == @freeCase
241
+ if par.whenWithoutArg?
242
+ if whenWithoutArg?
243
+ raise Error.new("argless '#{str}' under argless '#{par.str}'")
244
+ elsif par != parent
245
+ raise Error.new("argless '#{par.str}' do not allow '#{str}' clause enclosed by '#{parent.str}...#{parent.ender.str}'")
246
+ end
247
+ end
248
+ par.addChild self
249
+ @upperCaseClause = par
250
+ return true
251
+ end
252
+ end
253
+ return false
254
+ end
255
+
256
+ attr_accessor_predicate :caseCondLBraceReplaced
257
+
258
+ def whenWithoutArg?
259
+ !@argStart || (dnext&.kind == :> && dnext.dnext&.var_able? && [:on_nl, :on_semicolon].include?(dnext&.dnext&.next&.kind))
260
+ end
261
+ def whenWithVar?
262
+ dnext&.kind == :> && dnext.dnext&.var_able?
263
+ end
264
+
265
+ Module :Case, :NonFreeCase do
266
+ def closeBeginner pi
267
+ vn = spVarName
268
+ @direct = true
269
+ children.each do |s|
270
+ if !s.direct? || s.whenWithoutArg? || s.whenWithVar?
271
+ @direct = false
272
+ break
273
+ end
274
+ end
275
+ if @direct
276
+ head = "case(#{vn})"
277
+ end
278
+ Token.addMod range, "#begin (begin #{vn} = FreeCase.new("
279
+ Token.addMod argEnd.first, "); begin #{head}"
280
+ children.each do |s|
281
+ eachCaseChild(vn, s, @direct)
282
+ end
283
+ tmp = dnext
284
+ while tmp != e
285
+ if tmp.kind == :on_ivar && tmp.str == "@"
286
+ if f = tmp.findParent{[:case, :non_free_case].include(_1.kind)}
287
+ if f == self
288
+ if tmp.parent.kind == :case_cond_lbrace
289
+ if !tmp.parent.caseCondLBraceReplaced?
290
+ Token.addMod tmp.parent.ipos, "->"
291
+ tmp.parent.caseCondLBraceReplaced = tue
292
+ end
293
+ Token.addMod tmp.range, "_1"
294
+ end
295
+ Token.addMod tmp.range, f.spVarName
296
+ end
297
+ end
298
+ end
299
+ else
300
+ Token.addMod tmp.range, "#{vn}.case"
301
+ end
302
+ if %i{case non_free_case}.include? tmp.kind
303
+ tmp = tmp.ender
304
+ else
305
+ tmp = tmp.dnext
306
+ end
307
+ end
308
+ ";rescue #{vn}.Finish;ensure #{vn}.pop;end;#{vn}.result);" + "end"
309
+ end
310
+ end
311
+
312
+
313
+ end
@@ -0,0 +1,53 @@
1
+
2
+ require 'each_token'
3
+
4
+
5
+ class Token
6
+ Modules :Then, :Else, :Elsif, :IflessThen, :IflessElse, :IflessElsif do
7
+ def closeBeginner pi
8
+ if !((ps = parent.sentences)[-1].first != self)
9
+ raise Error.new("'#{str}' without 'if' not registered as sentence in upper clause, '#{parent.str}'")
10
+ end
11
+ if !ps[-2]
12
+ raise Error.new("'#{str}' without 'if' missing previous line")
13
+ end
14
+ ps[-2].last = nil
15
+ ps.pop
16
+ Token.addMod ps[-2].first.first, "if("
17
+ case @kind
18
+ when :ifless_then, :then
19
+ Token.addMod orgStarter.first, ")"
20
+ when :ifless_elsif, :ifless_else, :elsif, :else
21
+ Token.addMod orgStarter.first, ")then "
22
+ end
23
+ "end"
24
+ end
25
+ end
26
+ [
27
+ [:Then, :ifless_then]
28
+ [:Else, :ifless_else]
29
+ [:Elsif, :ifless_elseif]
30
+ ].each do |modName, tk|
31
+ Modules modName do
32
+ MethodChain.override do
33
+ module_eval %{
34
+ def onClassify
35
+ begin
36
+ super
37
+ rescue OrphanContClause => e
38
+ if !prev_nl?
39
+ raise e
40
+ else
41
+ spush
42
+ kind = :#{tk}
43
+ end
44
+ end
45
+ end
46
+ }
47
+ end
48
+ end
49
+ end
50
+ end
51
+
52
+
53
+
@@ -0,0 +1,23 @@
1
+
2
+
3
+ require 'each_token'
4
+
5
+
6
+ class Token
7
+ module Ensure do
8
+ MethodChain.override do
9
+ def onClassify
10
+ begin
11
+ super
12
+ rescue OrphanContClause => e
13
+ if !prev_nl?
14
+ raise e
15
+ else
16
+ spush
17
+ kind = :independent_ensure
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+
2
+
3
+ require 'each_token'
4
+
5
+
6
+ class Token
7
+ module Rescue do
8
+ MethodChain.override do
9
+ def onClassify
10
+ begin
11
+ super
12
+ rescue OrphanContClause => e
13
+ if !prev_nl?
14
+ raise e
15
+ else
16
+ spush
17
+ kind = :independent_rescue
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
File without changes
@@ -0,0 +1,16 @@
1
+
2
+ class Token
3
+ module OnPeriod
4
+ def onClassify #
5
+ if isOperand? # should not be parent
6
+ if [:on_ident, :on_const].include?(dnext.kind)
7
+ Token.addMod(first, "___theme_by_period")
8
+ elsif ambiguousPeriodTheme?
9
+ raise Error.new("Nested theme is referenced by single '.'")
10
+ else
11
+ Token.addMod(range, "___theme_by_period")
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,37 @@
1
+
2
+
3
+
4
+
5
+ attr_accessor_predicate :hasAndOp, :andOpProcessed
6
+ def inDirectParen?
7
+ prev.kind == :on_lparen && next.kind == :on_rparen
8
+ end
9
+
10
+ def checkAndOp
11
+ if hasAndOp? && !andOpProcessed? && !inDirectParen? && %i{on_ident on_const ' "}.include?(dprev)
12
+ Token.addMod tb.last, "("
13
+ Token.addMod t.first, ")"
14
+ @andOpProcessed = true
15
+ end
16
+ end
17
+
18
+ Modules :And, :Or, :Not do
19
+ MethodChain.override do
20
+ def onClassify
21
+ super
22
+ if [:on_lbracket, :on_lparen].include?(parent)
23
+ parent.hasAndOp = true
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+ Modules :OnRparen, :OnRbracket do
30
+ MethodChain.override do
31
+ def onClassify
32
+ super
33
+ beginner.checkAndOp
34
+ end
35
+ end
36
+ end
37
+
@@ -0,0 +1,48 @@
1
+
2
+ class Token
3
+
4
+ module PostTestDo
5
+
6
+ def postTestFinalize pi
7
+ if !requireArg?
8
+ raise Error.new("descrepant post test clause")
9
+ end
10
+ @argEnd = pi
11
+ closeSentence pi
12
+ (d = (w = pi.parent).wrapped.orgEntity).iteratorCand = nil
13
+ toReplace = "break " + case w.str
14
+ when "while"
15
+ "unless "
16
+ when "until"
17
+ "if "
18
+ end
19
+ Token.addMod w.range, toReplace
20
+ if (v = d.dnext).kind == :on_symbeg && label = v.var_label
21
+ d.defClsFirstSententence.first.setIteratorLabelVar label
22
+ Token.addMod d.range,
23
+ "begin
24
+ #{label} = ItratorLabel.new
25
+ while true
26
+ begin
27
+ #{label}.setLast((".gsub(/\n/, ";").gsub(/\s+/, " ")
28
+ res = "))
29
+ rescue #{label}.exNext
30
+ next
31
+ rescue #{label}.exRedo
32
+ redo
33
+ end
34
+ end
35
+ #{label}.res #nil or something in case iterator
36
+ rescue #{label}.exBreak
37
+ #{label}.res
38
+ end".gsub(/\n/, ";").gsub(/\s+/, " ")
39
+ else
40
+ Token.addMod d.range, "while true;" # "do" -> "while true;"
41
+ res = ";end;"
42
+ end
43
+ pi.spop
44
+ Token.addMod pi.ipos, res
45
+ end
46
+
47
+ end
48
+ end