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,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
|