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.
- checksums.yaml +7 -0
- data/.gitignore +11 -0
- data/.rspec +3 -0
- data/.travis.yml +6 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +7 -0
- data/Gemfile.lock +34 -0
- data/LICENSE.txt +21 -0
- data/README.md +44 -0
- data/Rakefile +6 -0
- data/YkLib.gemspec +29 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/lib/YkLib/Yk/__advance__.rb +151 -0
- data/lib/YkLib/Yk/__defun__.rb +44 -0
- data/lib/YkLib/Yk/__hook__.rb +244 -0
- data/lib/YkLib/Yk/__minmax__.rb +123 -0
- data/lib/YkLib/Yk/__stdlog.rb +329 -0
- data/lib/YkLib/Yk/adhocLiterals/email.rb +119 -0
- data/lib/YkLib/Yk/adhocLiterals/path.rb +402 -0
- data/lib/YkLib/Yk/adhocLiterals/tag.rb +19 -0
- data/lib/YkLib/Yk/adhocLiterals/url.rb +36 -0
- data/lib/YkLib/Yk/adhocLiterals.rb +199 -0
- data/lib/YkLib/Yk/auto_escseq.rb +5 -0
- data/lib/YkLib/Yk/auto_pstore.rb +179 -0
- data/lib/YkLib/Yk/bsearch.rb +120 -0
- data/lib/YkLib/Yk/clambda.rb +309 -0
- data/lib/YkLib/Yk/confLine.rb +423 -0
- data/lib/YkLib/Yk/create_tty_width_available.rb +24 -0
- data/lib/YkLib/Yk/crypt.rb +26 -0
- data/lib/YkLib/Yk/debug2 +1 -0
- data/lib/YkLib/Yk/debug2.rb +473 -0
- data/lib/YkLib/Yk/debugout.rb +139 -0
- data/lib/YkLib/Yk/email_tz.rb +533 -0
- data/lib/YkLib/Yk/enum_expect.rb +170 -0
- data/lib/YkLib/Yk/errlog.rb +5 -0
- data/lib/YkLib/Yk/escseq.rb +59 -0
- data/lib/YkLib/Yk/eval_alt.rb +281 -0
- data/lib/YkLib/Yk/expector.rb +93 -0
- data/lib/YkLib/Yk/fetch.rb +556 -0
- data/lib/YkLib/Yk/fetch_old.rb +290 -0
- data/lib/YkLib/Yk/fib.rb +158 -0
- data/lib/YkLib/Yk/file_aux.rb +843 -0
- data/lib/YkLib/Yk/file_aux2.rb +919 -0
- data/lib/YkLib/Yk/file_aux_old.rb +160 -0
- data/lib/YkLib/Yk/filemod.rb +19 -0
- data/lib/YkLib/Yk/force_escseq.rb +3 -0
- data/lib/YkLib/Yk/generator__.rb +144 -0
- data/lib/YkLib/Yk/generator__.rb.org +139 -0
- data/lib/YkLib/Yk/indenter/argless_case.rb +46 -0
- data/lib/YkLib/Yk/indenter/each_token.rb +671 -0
- data/lib/YkLib/Yk/indenter/free_case.rb +313 -0
- data/lib/YkLib/Yk/indenter/if_less.rb +53 -0
- data/lib/YkLib/Yk/indenter/independent_ensure.rb +23 -0
- data/lib/YkLib/Yk/indenter/independent_rescue.rb +23 -0
- data/lib/YkLib/Yk/indenter/operand_circumflex.rb +0 -0
- data/lib/YkLib/Yk/indenter/operand_period.rb +16 -0
- data/lib/YkLib/Yk/indenter/parenless_and.rb +37 -0
- data/lib/YkLib/Yk/indenter/post_test.rb +48 -0
- data/lib/YkLib/Yk/indenter/token.rb +1525 -0
- data/lib/YkLib/Yk/indenter.rb +1382 -0
- data/lib/YkLib/Yk/inot.rb +265 -0
- data/lib/YkLib/Yk/intf.rb +815 -0
- data/lib/YkLib/Yk/io_aux.rb +1332 -0
- data/lib/YkLib/Yk/ioctl.rb +60 -0
- data/lib/YkLib/Yk/ipcc.rb +87 -0
- data/lib/YkLib/Yk/ipcountry.rb +207 -0
- data/lib/YkLib/Yk/ipv4adr.rb +318 -0
- data/lib/YkLib/Yk/localmail.rb +276 -0
- data/lib/YkLib/Yk/method_chain.rb +359 -0
- data/lib/YkLib/Yk/misc_tz.rb +1716 -0
- data/lib/YkLib/Yk/missing_method.rb +50 -0
- data/lib/YkLib/Yk/mojiConv.rb +257 -0
- data/lib/YkLib/Yk/nostdlog.rb +4 -0
- data/lib/YkLib/Yk/on_marshal.rb +20 -0
- data/lib/YkLib/Yk/overrider.rb +47 -0
- data/lib/YkLib/Yk/path.rb +293 -0
- data/lib/YkLib/Yk/path_aux.rb +883 -0
- data/lib/YkLib/Yk/path_aux_alt.rb +0 -0
- data/lib/YkLib/Yk/path_rep.rb +1267 -0
- data/lib/YkLib/Yk/pg_setup.rb +917 -0
- data/lib/YkLib/Yk/procinfo.rb +314 -0
- data/lib/YkLib/Yk/proclist.rb +492 -0
- data/lib/YkLib/Yk/property.rb +863 -0
- data/lib/YkLib/Yk/ranger.rb +606 -0
- data/lib/YkLib/Yk/resolv_tz.rb +88 -0
- data/lib/YkLib/Yk/rlprompt.rb +73 -0
- data/lib/YkLib/Yk/rootexec.rb +48 -0
- data/lib/YkLib/Yk/rpm-packageproxy.rb +784 -0
- data/lib/YkLib/Yk/rpm-packageproxy2.rb +1430 -0
- data/lib/YkLib/Yk/rwhen.rb +21 -0
- data/lib/YkLib/Yk/selector.rb +124 -0
- data/lib/YkLib/Yk/set.rb +170 -0
- data/lib/YkLib/Yk/shellquote.rb +300 -0
- data/lib/YkLib/Yk/sio.rb +1001 -0
- data/lib/YkLib/Yk/sio0.rb +835 -0
- data/lib/YkLib/Yk/sio_aux.rb +1524 -0
- data/lib/YkLib/Yk/sio_inot.rb +86 -0
- data/lib/YkLib/Yk/sock_aux.rb +42 -0
- data/lib/YkLib/Yk/spipe.rb +843 -0
- data/lib/YkLib/Yk/sql_table.rb +565 -0
- data/lib/YkLib/Yk/stdlog.rb +4 -0
- data/lib/YkLib/Yk/syscommand.rb +173 -0
- data/lib/YkLib/Yk/sysinit.rb +75 -0
- data/lib/YkLib/Yk/ttyFontWidth.rb +46113 -0
- data/lib/YkLib/Yk/tty_char.dump +0 -0
- data/lib/YkLib/Yk/tty_char.rb +47 -0
- data/lib/YkLib/Yk/tty_char_create.rb +437031 -0
- data/lib/YkLib/Yk/tty_char_static.rb +437016 -0
- data/lib/YkLib/Yk/tty_rewrite.rb +142 -0
- data/lib/YkLib/Yk/tty_str.rb +461 -0
- data/lib/YkLib/Yk/tty_width.dat.rb +114 -0
- data/lib/YkLib/Yk/tty_width.rb +180 -0
- data/lib/YkLib/Yk/tty_width_available +569 -0
- data/lib/YkLib/Yk/tty_width_list +0 -0
- data/lib/YkLib/Yk/tty_width_list.linux +280 -0
- data/lib/YkLib/Yk/tty_width_list.windows +324 -0
- data/lib/YkLib/Yk/tz_tty +0 -0
- data/lib/YkLib/Yk/tz_tty.rb +0 -0
- data/lib/YkLib/Yk/uprepos.rb +94 -0
- data/lib/YkLib/Yk/userinfo.rb +91 -0
- data/lib/YkLib/Yk/with.rb +109 -0
- data/lib/YkLib/version.rb +3 -0
- data/lib/YkLib.rb +6 -0
- metadata +170 -0
|
@@ -0,0 +1,671 @@
|
|
|
1
|
+
|
|
2
|
+
class Token
|
|
3
|
+
|
|
4
|
+
Starters = %i{
|
|
5
|
+
begin
|
|
6
|
+
def
|
|
7
|
+
class
|
|
8
|
+
module
|
|
9
|
+
if
|
|
10
|
+
unless
|
|
11
|
+
loop_for
|
|
12
|
+
|
|
13
|
+
ensure
|
|
14
|
+
rescue
|
|
15
|
+
when
|
|
16
|
+
free_in
|
|
17
|
+
free_for
|
|
18
|
+
free_when
|
|
19
|
+
}
|
|
20
|
+
StartersMayBrace = %i{
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
def closeBeginner pi
|
|
24
|
+
""
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
Modules :Begin, :Def, :Class, :Module, :If, :Unless, :LoopFor do
|
|
28
|
+
def closeBeginner pi
|
|
29
|
+
ins = (requireArg? ?
|
|
30
|
+
(closeSentence(pi); argEnd = pi; ?;)
|
|
31
|
+
: ' ') + "end"
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
class ForWithoutIn < Exception
|
|
36
|
+
def initialize
|
|
37
|
+
super "new line or semicolon is not allowed after 'for' arguments"
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
class WhenWithoutArg < Exception
|
|
42
|
+
def initialize (k)
|
|
43
|
+
super "new line or semicolon is not allowed after '#{k}' arguments"
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
class CaseWithoutArg < Exception
|
|
48
|
+
def initialize
|
|
49
|
+
super "missing argment for 'case'"
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
module OnSemicolon
|
|
54
|
+
def onClassify
|
|
55
|
+
case parent.kind
|
|
56
|
+
when :on_lbrace
|
|
57
|
+
parent.kind = :lbrace_clause
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
module OnNl
|
|
63
|
+
def closeBeginner pi
|
|
64
|
+
c = iteratorMethod
|
|
65
|
+
addModPrev, "do"
|
|
66
|
+
c.trySetupIterator(:preset, self) || "end"
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def checkRequireArgStarterWithoutArg
|
|
71
|
+
case parent.kind
|
|
72
|
+
when *%i{if elsif unless while until on_tlambda post_test_while post_test_until \\ =}
|
|
73
|
+
raise Error.new("missing argument for '#{parent.str}'")
|
|
74
|
+
when :for
|
|
75
|
+
if parent.in
|
|
76
|
+
raise Error.new("missing argument for 'in'")
|
|
77
|
+
end
|
|
78
|
+
raise WhenWithoutArg.new(parent.str)
|
|
79
|
+
when :when
|
|
80
|
+
raise WhenWithoutArg.new(parent.str)
|
|
81
|
+
when :in
|
|
82
|
+
raise Error.new("missing argument for 'in'")
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def checkRequireArgStarterWithArg
|
|
87
|
+
case parent.kind
|
|
88
|
+
when :for
|
|
89
|
+
if !parent.in?
|
|
90
|
+
raise ForWithoutIn.new
|
|
91
|
+
end
|
|
92
|
+
when :on_tlambda
|
|
93
|
+
if !defined?(Endless) || kind == :on_semicolon
|
|
94
|
+
raise Error.new("new line or semicolon is not allowed after '->' arguments")
|
|
95
|
+
end
|
|
96
|
+
when :"=" # for one line method
|
|
97
|
+
spop
|
|
98
|
+
when :post_test_while, :post_test_until
|
|
99
|
+
postTestFinalize self
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
Modules :OnSemicolon, :OnNl do
|
|
104
|
+
MethodChain.override do
|
|
105
|
+
def onClassify
|
|
106
|
+
t.parent.closeSentence self
|
|
107
|
+
t.parent.iteratorCand = nil
|
|
108
|
+
begin
|
|
109
|
+
super #raise ForWithoutIn
|
|
110
|
+
if parent.requireArg? # including for, in
|
|
111
|
+
if !parent.argStart
|
|
112
|
+
if defined?(Endless) || kind == :on_semicolon
|
|
113
|
+
checkRequireArgStarterWithoutArg
|
|
114
|
+
end
|
|
115
|
+
else
|
|
116
|
+
checkRequireArgStarterWithArg
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
ensure
|
|
120
|
+
parent.argEnd = self # :rescue is unconditionally close argument
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
attr_accessor :firstRightAssign
|
|
127
|
+
attr_accessor_predicate :maybeRightMatch
|
|
128
|
+
def addComma t
|
|
129
|
+
(@commas ||= []).push t
|
|
130
|
+
end
|
|
131
|
+
module OnComma
|
|
132
|
+
def onClassify
|
|
133
|
+
if idx = [:on_lbrace, :on_lparen].find_index(parent.kind)
|
|
134
|
+
if !parent.iteratorCand
|
|
135
|
+
parent.addComma self
|
|
136
|
+
end
|
|
137
|
+
if idx == 0
|
|
138
|
+
if parent.firstRightAssign # '=>' as in '{ foo => ...'
|
|
139
|
+
parent.maybeRightMatch = true
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
# seup hash
|
|
144
|
+
if parent.kind == :on_lbrace && parent.interatorCand == nil && parent.next.kind == :on_label
|
|
145
|
+
parent.kind = :hash_beg
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def ambiguousPeriodTheme?
|
|
152
|
+
found = false
|
|
153
|
+
eachParent do |t|
|
|
154
|
+
case t.kind
|
|
155
|
+
when :on_period, :"&."
|
|
156
|
+
if (tmp = s.prev).kind == :on_rparen && tmp.beginner.isOperand? && tmp.beginner.multiArgument?
|
|
157
|
+
return true
|
|
158
|
+
end
|
|
159
|
+
found ? return(true) : found = true
|
|
160
|
+
when :on_lbrace
|
|
161
|
+
if t.inserted?
|
|
162
|
+
found ? return(true) : found = true
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
return false
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
def implementOpener
|
|
170
|
+
.....
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
module RightAssignOpn
|
|
174
|
+
::Token.registerModule self, :'=>'
|
|
175
|
+
def onClassify
|
|
176
|
+
# seup hash
|
|
177
|
+
if parent.kind == :on_lbrace && parent.iteratorCand == nil
|
|
178
|
+
if parent.firstRightAssign
|
|
179
|
+
parent.kind = :hash_beg
|
|
180
|
+
else
|
|
181
|
+
parent.firstRightAssign = t
|
|
182
|
+
end
|
|
183
|
+
parent.kind = :hash_beg
|
|
184
|
+
end
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
module VerticalBarOp
|
|
189
|
+
::Token.registerModule self, :|
|
|
190
|
+
def onClassify
|
|
191
|
+
if [:do, :on_lbrace].include?(prev) && parent == prev
|
|
192
|
+
if parent == :on_lbrace
|
|
193
|
+
parent = :lbrace_clause
|
|
194
|
+
end
|
|
195
|
+
implementOpener
|
|
196
|
+
reserve_spush
|
|
197
|
+
elsif parent.kind == :|
|
|
198
|
+
reserve_spop
|
|
199
|
+
else
|
|
200
|
+
raise Error.new("unclosed iterator arguments")
|
|
201
|
+
end
|
|
202
|
+
end
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
attr_accessor :body
|
|
206
|
+
module OnLambeg
|
|
207
|
+
def onClassify
|
|
208
|
+
if parent.kind == :on_tlambda && !parent.body
|
|
209
|
+
parent.body = self
|
|
210
|
+
end
|
|
211
|
+
end
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
Modules :OnLparen, :OnLbracket,
|
|
215
|
+
:OnRegexpBeg, :OnBacktick, :OnEmbexprBeg,
|
|
216
|
+
:OnTstringBeg, :OnQwordsBeg,:OnWordsBeg, :OnSymbeg, :OnQsymbolsBeg, :OnSymbolsBeg do
|
|
217
|
+
def onClassify
|
|
218
|
+
reserve_spush
|
|
219
|
+
end
|
|
220
|
+
end
|
|
221
|
+
Modules :OnRparen, :OnRbracket, :OnRbrace, :OnEmbexprEnd do
|
|
222
|
+
def onClassify
|
|
223
|
+
first = true
|
|
224
|
+
if !parent.opponent?(self)
|
|
225
|
+
toInsert = ""
|
|
226
|
+
while parent.isStarter?
|
|
227
|
+
toInsert = (!parent.requireArg? ? ' ' : ?;) + "end" + toInsert
|
|
228
|
+
reserve_spop
|
|
229
|
+
end
|
|
230
|
+
if !parent.opponent?(self)
|
|
231
|
+
raise Error.new("#{parent.str} is not closed")
|
|
232
|
+
end
|
|
233
|
+
if !toInsert.empty?
|
|
234
|
+
@expr[range] = toInsert + @expr[range]
|
|
235
|
+
raise Restart.new
|
|
236
|
+
end
|
|
237
|
+
end
|
|
238
|
+
reserve_spop
|
|
239
|
+
case @kind
|
|
240
|
+
when :on_rparen, :on_rbracket
|
|
241
|
+
beginner.checkAndOp
|
|
242
|
+
when :on_rbrace
|
|
243
|
+
if @@cur.parStack.size == 0 && RBRACE_MODE.include?(@@ebmode)
|
|
244
|
+
if @@ebmode == :bare
|
|
245
|
+
if AdhocLiterals[:url]
|
|
246
|
+
checkUrl first do |led|
|
|
247
|
+
yield first, :url #back track
|
|
248
|
+
end
|
|
249
|
+
end
|
|
250
|
+
if AdhocLiterals[:email]
|
|
251
|
+
checkEmail first do |led|
|
|
252
|
+
yield first, :email #back track
|
|
253
|
+
end
|
|
254
|
+
end
|
|
255
|
+
if AdhocLiterals[:path]
|
|
256
|
+
checkPath first do |led, pstack|
|
|
257
|
+
yield first, :path, led, pstack #back track
|
|
258
|
+
end
|
|
259
|
+
end
|
|
260
|
+
else
|
|
261
|
+
yield first, @@emode
|
|
262
|
+
end
|
|
263
|
+
# do not return : raise Restart.new
|
|
264
|
+
else
|
|
265
|
+
if beginner.kind == :hash_beg
|
|
266
|
+
beginner.addModPrev, " ("
|
|
267
|
+
addModAfter, ")"
|
|
268
|
+
elsif [:on_lbrace, :lbrace_clause].include? beginner.kind # check iterator
|
|
269
|
+
if [:"&.", :on_period, :"::"].include?((tbp = beginner.prev).kind)
|
|
270
|
+
tbp.closeBeginner self
|
|
271
|
+
else
|
|
272
|
+
case (tt = beginner.prev).kind
|
|
273
|
+
when :on_rparen
|
|
274
|
+
case (ttt = tt.beginner.prev).kind
|
|
275
|
+
when :"&.", :on_period # foo&.(...){...}, foo.(...){...}
|
|
276
|
+
######## (Table1, Table2)::{....}
|
|
277
|
+
beginner.iterator_method = ttt
|
|
278
|
+
# &.(...){...} -> NG
|
|
279
|
+
# .(...){...} -> OK
|
|
280
|
+
when :"::" #foo::(...){...}
|
|
281
|
+
raise Error.new("foo::(...){...} is not implemented")
|
|
282
|
+
else
|
|
283
|
+
unless beginner.iterator_method = ttt.trySetupIterator(:back, beginner.argEnd, self) # foo:label(...){...}
|
|
284
|
+
raise Error.new("cannot find iterator method like 'foo' in 'foo(...){...}'") # foo(...){...}
|
|
285
|
+
end
|
|
286
|
+
end
|
|
287
|
+
# foo'(...){...}
|
|
288
|
+
# foo"(...){...}
|
|
289
|
+
# foo."(...)(...){...}
|
|
290
|
+
# .(...){...}
|
|
291
|
+
when :on_rbracket
|
|
292
|
+
beginner.iterator_method = tt.beginner # a[...]{...} ':[]' is iterator method
|
|
293
|
+
else
|
|
294
|
+
beginner.iterator_method = tt.trySetupIterator(:back, beginner.argEnd, self) # foo:label{...}
|
|
295
|
+
raise Error.new("cannot find iterator method like 'foo' in 'foo{...}'") # foo {...}
|
|
296
|
+
end
|
|
297
|
+
end
|
|
298
|
+
end
|
|
299
|
+
end
|
|
300
|
+
end
|
|
301
|
+
end
|
|
302
|
+
end
|
|
303
|
+
end
|
|
304
|
+
module OnHeredocEnd
|
|
305
|
+
def onClassify
|
|
306
|
+
reserve_spop
|
|
307
|
+
end
|
|
308
|
+
end
|
|
309
|
+
SET_LINE = ".__set_line_num__()"
|
|
310
|
+
module OnTstringEnd
|
|
311
|
+
def onClassify
|
|
312
|
+
case parent.kind
|
|
313
|
+
when :on_tstring_beg
|
|
314
|
+
addModAfter SET_LINE
|
|
315
|
+
reserve_spop
|
|
316
|
+
when :on_qwords_beg, :on_words_beg, :on_symbeg, :on_qsymbols_beg, :on_symbols_beg, :on_backtick
|
|
317
|
+
reserve_spop
|
|
318
|
+
else
|
|
319
|
+
raise Error.new("ERROR: String content closing at #{t.pos} is missing beginning\n")
|
|
320
|
+
end
|
|
321
|
+
if cur.parStack.size == 0 && mode.to_s =~ /_quote$/
|
|
322
|
+
yield first # do not return : raise Retart.new
|
|
323
|
+
end
|
|
324
|
+
end
|
|
325
|
+
end
|
|
326
|
+
module OnLabelEnd
|
|
327
|
+
def onClassify
|
|
328
|
+
if parent.kind == :on_tstring_beg
|
|
329
|
+
reserve_spop
|
|
330
|
+
else
|
|
331
|
+
raise Error.new("ERROR: String content closing at #{t.pos} is missing beginning\n")
|
|
332
|
+
end
|
|
333
|
+
end
|
|
334
|
+
end
|
|
335
|
+
module OnRegexpEnd
|
|
336
|
+
def onClassify
|
|
337
|
+
if parent.kind == :on_regexp_beg
|
|
338
|
+
reserve_spop
|
|
339
|
+
else
|
|
340
|
+
raise Error.new("ERROR: Reglar expression closing at #{t.pos} is missing beginning\n")
|
|
341
|
+
end
|
|
342
|
+
end
|
|
343
|
+
end
|
|
344
|
+
|
|
345
|
+
module BackSlashOp
|
|
346
|
+
::Token.registerModule self, :"\\"
|
|
347
|
+
def closeBeginner pi
|
|
348
|
+
c = iteratorMethod
|
|
349
|
+
barg_op = argRange ? "|" : ""
|
|
350
|
+
addModReplace "do #{barg_op}"
|
|
351
|
+
argEnd.addModPrev barg_op
|
|
352
|
+
if c
|
|
353
|
+
ins = c.trySetupIterator(:preset, self) || "end"
|
|
354
|
+
else
|
|
355
|
+
addModReplace " ::Kernel::proc do #{barg_op}\n"
|
|
356
|
+
argEnd.addModPrev barg_op
|
|
357
|
+
ins = "end"
|
|
358
|
+
if isSentenceHead?
|
|
359
|
+
if !argRange
|
|
360
|
+
ins += ".call"
|
|
361
|
+
else
|
|
362
|
+
raise Error.new("orphan proc with argumnents")
|
|
363
|
+
end
|
|
364
|
+
end
|
|
365
|
+
end
|
|
366
|
+
ins
|
|
367
|
+
end
|
|
368
|
+
def checkStarter
|
|
369
|
+
if prev.continues? || isSentenceHead?
|
|
370
|
+
reserve_spush # without method
|
|
371
|
+
else
|
|
372
|
+
if (iteratorMethod = parent&.iteratorCand)&.setupIteratorLabel
|
|
373
|
+
parent.iteratorCand = nil
|
|
374
|
+
reserve_spush
|
|
375
|
+
else
|
|
376
|
+
raise Error.new("cannot find iterator method")
|
|
377
|
+
end
|
|
378
|
+
end
|
|
379
|
+
end
|
|
380
|
+
end
|
|
381
|
+
|
|
382
|
+
module OnPeriod
|
|
383
|
+
::Token.registerModule self, :"&.", :"::"
|
|
384
|
+
def themeExpr tk
|
|
385
|
+
case tk
|
|
386
|
+
when :"&."
|
|
387
|
+
"___theme_period"
|
|
388
|
+
when :"::"
|
|
389
|
+
"___theme_double_colon"
|
|
390
|
+
when :on_period
|
|
391
|
+
"___theme_period"
|
|
392
|
+
end
|
|
393
|
+
end
|
|
394
|
+
private :themeExpr
|
|
395
|
+
def closeBeginner pi
|
|
396
|
+
bOpener, bCloser = if pi.kind != :on_rbrace
|
|
397
|
+
"{", "}"
|
|
398
|
+
else
|
|
399
|
+
"", ""
|
|
400
|
+
end
|
|
401
|
+
if prev.kind == :on_rparen && prev.beginner.isOperand?
|
|
402
|
+
if kind == :"&." && prev.beginner.multiArgument?
|
|
403
|
+
raise Error.new("multiple theme for &. is not allowed")
|
|
404
|
+
end
|
|
405
|
+
# (Table1, Table2)::\n ... -> ____theme_double_colon___(Table1, Table2){ ... }
|
|
406
|
+
prev.beginner.addModPrev themeExpr(kind)
|
|
407
|
+
addModReplace bOpener
|
|
408
|
+
else # a::\n ... -> a::____theme_double_colon___{ ... }
|
|
409
|
+
addModAfter, themeExpr(kind) + bOpener
|
|
410
|
+
end
|
|
411
|
+
############ implement ".", "@foo", "&&"
|
|
412
|
+
ins = bCloser
|
|
413
|
+
end
|
|
414
|
+
end
|
|
415
|
+
|
|
416
|
+
module OnTlambda
|
|
417
|
+
def onClassify
|
|
418
|
+
reserve_spush
|
|
419
|
+
end
|
|
420
|
+
def closeBeginner pi
|
|
421
|
+
case @body
|
|
422
|
+
when :on_lambeg
|
|
423
|
+
"}"
|
|
424
|
+
when :do
|
|
425
|
+
"end"
|
|
426
|
+
when nil
|
|
427
|
+
if argEnd != :on_nl
|
|
428
|
+
raise Error.new("descrepant -> args")
|
|
429
|
+
end
|
|
430
|
+
argEnd.addModAfter "{"
|
|
431
|
+
ins = "}"
|
|
432
|
+
end
|
|
433
|
+
end
|
|
434
|
+
end
|
|
435
|
+
|
|
436
|
+
module Do
|
|
437
|
+
def onClassify
|
|
438
|
+
if !isOperand?
|
|
439
|
+
t = self
|
|
440
|
+
@parent.instance_eval do
|
|
441
|
+
case @kind
|
|
442
|
+
when :while, :until, :for_in
|
|
443
|
+
if !@do && @argStart
|
|
444
|
+
@do = t
|
|
445
|
+
@argEnd ||= t
|
|
446
|
+
return
|
|
447
|
+
end
|
|
448
|
+
when :on_tlambda
|
|
449
|
+
if !@body
|
|
450
|
+
@body = t
|
|
451
|
+
return
|
|
452
|
+
end
|
|
453
|
+
end
|
|
454
|
+
end
|
|
455
|
+
@iteratorMethod = parent.iteratorCand
|
|
456
|
+
end
|
|
457
|
+
reserve_spush
|
|
458
|
+
end
|
|
459
|
+
def setPostTest t
|
|
460
|
+
@wrapped.changeEntity t
|
|
461
|
+
kind = :post_test_do
|
|
462
|
+
t.kind = ("post_test_" + t.kind.to_s).intern
|
|
463
|
+
end
|
|
464
|
+
def closeBeginner pi
|
|
465
|
+
if c = iteratorMethod
|
|
466
|
+
if parent.iteratorCand == c
|
|
467
|
+
parent.iteratorCand = nil
|
|
468
|
+
end
|
|
469
|
+
c.setupIteratorLabel
|
|
470
|
+
c.trySetupIterator(:preset, self, pi) || "end"
|
|
471
|
+
else
|
|
472
|
+
k = (lop = prev).kind
|
|
473
|
+
if k == :on_rbracket && lop.beginner.prev.terminal? # foo [...] do
|
|
474
|
+
@iteratorMethod = lop.beginner
|
|
475
|
+
"end"
|
|
476
|
+
elsif k == :on_rparen && (tt = lop.beginner.prev).invoker? # foo:label(...), (foo)":label(...), foo'(...)
|
|
477
|
+
tt.trySetupIterator(:back, self, pi) || "end" #tt.dprev = label of foo:label(...)
|
|
478
|
+
else
|
|
479
|
+
ins = "end"
|
|
480
|
+
end
|
|
481
|
+
end
|
|
482
|
+
end
|
|
483
|
+
end
|
|
484
|
+
|
|
485
|
+
Modules :While, :Until do
|
|
486
|
+
def closeBeginner pi
|
|
487
|
+
trySetupIterator(:forward, self, pi) || "end"
|
|
488
|
+
end
|
|
489
|
+
end
|
|
490
|
+
|
|
491
|
+
|
|
492
|
+
def thenRelated? t
|
|
493
|
+
if [:if, :elsif, :rescue, :unless, :when, :in].include?(@kind)
|
|
494
|
+
if @argStarted
|
|
495
|
+
(!@argEnd || @argEnd == t && t.kind == :on_semicolon || @argEnd.kind == :on_nl && @argEnd.prev == t)
|
|
496
|
+
end
|
|
497
|
+
end
|
|
498
|
+
end
|
|
499
|
+
def setThen t
|
|
500
|
+
if @then
|
|
501
|
+
raise Error.new("duplicated then")
|
|
502
|
+
end
|
|
503
|
+
@then = t
|
|
504
|
+
@argEnd ||= t
|
|
505
|
+
end
|
|
506
|
+
class OrphanContClause < ::Exception
|
|
507
|
+
def initialize msg
|
|
508
|
+
super "orphan #{msg}"
|
|
509
|
+
end
|
|
510
|
+
end
|
|
511
|
+
module Then
|
|
512
|
+
def onClassify
|
|
513
|
+
if parent.thenRelated?(prev_non_sp) # prev_non_sp : ';' or '\n'
|
|
514
|
+
parent.setThen self
|
|
515
|
+
else
|
|
516
|
+
raise OrphanContCause.new(str)
|
|
517
|
+
end
|
|
518
|
+
end
|
|
519
|
+
end
|
|
520
|
+
|
|
521
|
+
def clauseCont t
|
|
522
|
+
if requireArg?
|
|
523
|
+
raise Error.new("#{t.str} cluase without '#{@kind}' arguments or semicolon, new line")
|
|
524
|
+
end
|
|
525
|
+
@wrapped.changeEntity t
|
|
526
|
+
end
|
|
527
|
+
[:Else, :Elsif].each do |mod|
|
|
528
|
+
%{
|
|
529
|
+
module #{mod}
|
|
530
|
+
def onClassify
|
|
531
|
+
if continuedClause?
|
|
532
|
+
parent.clauseCont self
|
|
533
|
+
else
|
|
534
|
+
raise OrphanContClause.new(str)
|
|
535
|
+
end
|
|
536
|
+
end
|
|
537
|
+
end
|
|
538
|
+
}
|
|
539
|
+
end
|
|
540
|
+
|
|
541
|
+
Modules :If, :Unless, :Case, :Module, :Begin, :For, :Def do
|
|
542
|
+
def onClassify
|
|
543
|
+
reserve_spush
|
|
544
|
+
end
|
|
545
|
+
end
|
|
546
|
+
|
|
547
|
+
module Class
|
|
548
|
+
def onClassify
|
|
549
|
+
mth = findParent{%i{module class def origin}.include? _1.kind}
|
|
550
|
+
if defined?(Endless)
|
|
551
|
+
n = self.next
|
|
552
|
+
else
|
|
553
|
+
n = next_non_sp
|
|
554
|
+
end
|
|
555
|
+
if (if mth.kind == :def
|
|
556
|
+
n.kind == :<<
|
|
557
|
+
else
|
|
558
|
+
%i{<< on_const ::}.include? n.kind
|
|
559
|
+
end)
|
|
560
|
+
then
|
|
561
|
+
reserve_spush # singleton class
|
|
562
|
+
else # self.class
|
|
563
|
+
kind = :on_ident
|
|
564
|
+
addModPrev "self."
|
|
565
|
+
end
|
|
566
|
+
end
|
|
567
|
+
end
|
|
568
|
+
|
|
569
|
+
class ForWhen < Exception
|
|
570
|
+
def initialize arg
|
|
571
|
+
@whenOrIn = arg
|
|
572
|
+
super "'#{arg.str}' is directly placed after 'for'"
|
|
573
|
+
end
|
|
574
|
+
end
|
|
575
|
+
|
|
576
|
+
module In
|
|
577
|
+
def onClassify
|
|
578
|
+
if continuedClause?
|
|
579
|
+
t = self
|
|
580
|
+
@parent.instance_eval do
|
|
581
|
+
case @kind
|
|
582
|
+
when :in
|
|
583
|
+
if !@argEnd
|
|
584
|
+
raise Error.new("'in' clause started inside previous 'in' clause without arguments or semicolon, new line")
|
|
585
|
+
end
|
|
586
|
+
when :case
|
|
587
|
+
@kind = :non_free_case
|
|
588
|
+
if !@argStart
|
|
589
|
+
raise Error.new("'in' clause started inside previous 'case' clause without arguments or semicolon, new line")
|
|
590
|
+
end
|
|
591
|
+
@argEnd ||= t
|
|
592
|
+
end
|
|
593
|
+
@wrapped.changeEntity t
|
|
594
|
+
end
|
|
595
|
+
elsif parent.kind == :for && cur.idtStack.last == parent
|
|
596
|
+
if parent.argStart
|
|
597
|
+
parent.argEnd = self
|
|
598
|
+
parent.in = self
|
|
599
|
+
parent.kind = :loop_for
|
|
600
|
+
parent.wrapped.changeEntity self
|
|
601
|
+
@kind = :loop_for_in
|
|
602
|
+
else # for in ....
|
|
603
|
+
raise ForWhen.new(self)
|
|
604
|
+
end
|
|
605
|
+
else
|
|
606
|
+
raise OrphanContClause.new(str)
|
|
607
|
+
end
|
|
608
|
+
end
|
|
609
|
+
end
|
|
610
|
+
|
|
611
|
+
module When
|
|
612
|
+
def onClassify
|
|
613
|
+
if continuedClause?
|
|
614
|
+
t = self
|
|
615
|
+
@parent.instance_eval do
|
|
616
|
+
case @kind
|
|
617
|
+
when :when
|
|
618
|
+
if !@argEnd
|
|
619
|
+
raise Error.new("'when' clause started inside previous 'when' clause without arguments or semicolon, new line")
|
|
620
|
+
end
|
|
621
|
+
when :case
|
|
622
|
+
@kind = :non_free_case
|
|
623
|
+
if !@argStart
|
|
624
|
+
raise Error.new("'when' clause started inside previous 'case' clause without arguments or semicolon, new line")
|
|
625
|
+
end
|
|
626
|
+
@argEnd ||= t
|
|
627
|
+
end
|
|
628
|
+
@wrapped.changeEntity t
|
|
629
|
+
end
|
|
630
|
+
elsif parent.kind == :for && cur.idtStack.last == parent && !parent.argStart # for when ....
|
|
631
|
+
raise ForWhen.new(self)
|
|
632
|
+
else
|
|
633
|
+
raise OrphanContClause.new(str)
|
|
634
|
+
end
|
|
635
|
+
end
|
|
636
|
+
end
|
|
637
|
+
|
|
638
|
+
Modules :Rescue, :Ensure do
|
|
639
|
+
def onClassify
|
|
640
|
+
if continuedClause?
|
|
641
|
+
t = self
|
|
642
|
+
@parent.instance_eval do
|
|
643
|
+
case @kind
|
|
644
|
+
when :def, :class, :module, :rescue
|
|
645
|
+
if !@argEnd
|
|
646
|
+
raise Error.new("else cluase without '#{@kind}' arguments or semicolon, new line")
|
|
647
|
+
end
|
|
648
|
+
when :begin
|
|
649
|
+
end
|
|
650
|
+
@wrapped.changeEntity t
|
|
651
|
+
end
|
|
652
|
+
else #independent rescue
|
|
653
|
+
raise OrphanContClause.new(str)
|
|
654
|
+
end
|
|
655
|
+
end
|
|
656
|
+
end
|
|
657
|
+
|
|
658
|
+
module NonFreeCase
|
|
659
|
+
def closeBeginner pi
|
|
660
|
+
"end"
|
|
661
|
+
end
|
|
662
|
+
end
|
|
663
|
+
|
|
664
|
+
module Case
|
|
665
|
+
def closeBeginner pi
|
|
666
|
+
raise ArgumentError.new("'case' missing 'when' or 'in'")
|
|
667
|
+
end
|
|
668
|
+
end
|
|
669
|
+
|
|
670
|
+
end
|
|
671
|
+
|