ruby2js 3.0.8 → 3.0.9
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 +4 -4
- data/lib/ruby2js/converter/case.rb +9 -1
- data/lib/ruby2js/converter/class2.rb +7 -1
- data/lib/ruby2js/converter/def.rb +2 -4
- data/lib/ruby2js/converter/dstr.rb +23 -22
- data/lib/ruby2js/converter/masgn.rb +16 -2
- data/lib/ruby2js/converter/regexp.rb +25 -17
- data/lib/ruby2js/converter/return.rb +19 -0
- data/lib/ruby2js/converter/send.rb +50 -0
- data/lib/ruby2js/filter/functions.rb +12 -0
- data/lib/ruby2js/serializer.rb +5 -0
- data/lib/ruby2js/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 075b7a63226221fc941c3ccd747285d1bf9a3e94cfefd39926e530c9e41ba0a0
|
4
|
+
data.tar.gz: 7a01d0dfef5bba7c05393a4059f4899631d6bac7894b98801dfc04634b4fcb84
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 62e0c730806b6bb3dc2060028d37dee4a181c9aa43be77415ed9cfca016ebae821388ae1b696d6de9a1f634730163b2a2f9d3b95aac321ca6a11ddfabbc1383e
|
7
|
+
data.tar.gz: ae0a44b9d2a547def9fcc86b5af2dd1e5134881b0224c4e65a80e614215b1803a6be80649270622113829f531070aacfceed99a2edca364f661f2c75521fb214
|
@@ -47,7 +47,15 @@ module Ruby2JS
|
|
47
47
|
end
|
48
48
|
|
49
49
|
parse code, :statement
|
50
|
-
|
50
|
+
last = code
|
51
|
+
while last.type == :begin
|
52
|
+
last = last.children.last
|
53
|
+
end
|
54
|
+
|
55
|
+
if other or index < whens.length-1
|
56
|
+
put "#{@sep}"
|
57
|
+
put "break#@sep" unless last.type == :return
|
58
|
+
end
|
51
59
|
end
|
52
60
|
|
53
61
|
(put "#{@nl}default:#@ws"; parse other, :statement) if other
|
@@ -38,6 +38,8 @@ module Ruby2JS
|
|
38
38
|
skipped = false
|
39
39
|
body.each_with_index do |m, index|
|
40
40
|
put(index == 0 ? @nl : @sep) unless skipped
|
41
|
+
comments = comments(m)
|
42
|
+
location = output_location
|
41
43
|
skipped = false
|
42
44
|
|
43
45
|
# intercept async definitions
|
@@ -136,7 +138,11 @@ module Ruby2JS
|
|
136
138
|
end
|
137
139
|
end
|
138
140
|
|
139
|
-
|
141
|
+
if skipped
|
142
|
+
post << m if skipped
|
143
|
+
else
|
144
|
+
comments.reverse.each {|comment| insert location, comment}
|
145
|
+
end
|
140
146
|
end
|
141
147
|
|
142
148
|
put @nl unless skipped
|
@@ -8,9 +8,6 @@ module Ruby2JS
|
|
8
8
|
|
9
9
|
handle :def, :defm, :async do |name, args, body=nil|
|
10
10
|
body ||= s(:begin)
|
11
|
-
if name =~ /[!?]$/
|
12
|
-
raise Error.new("invalid method name #{ name }", @ast)
|
13
|
-
end
|
14
11
|
|
15
12
|
vars = {}
|
16
13
|
vars.merge! @vars unless name
|
@@ -99,6 +96,7 @@ module Ruby2JS
|
|
99
96
|
while expr.type == :begin and expr.children.length == 1
|
100
97
|
expr = expr.children.first
|
101
98
|
end
|
99
|
+
expr = expr.children.first if expr.type == :return
|
102
100
|
|
103
101
|
if EXPRESSIONS.include? expr.type
|
104
102
|
if expr.type == :send and expr.children[0..1] == [nil, :raise]
|
@@ -131,7 +129,7 @@ module Ruby2JS
|
|
131
129
|
put @prop
|
132
130
|
@prop = nil
|
133
131
|
elsif name
|
134
|
-
put "function #{name}"
|
132
|
+
put "function #{name.to_s.sub(/[?!]$/, '')}"
|
135
133
|
else
|
136
134
|
put 'function'
|
137
135
|
end
|
@@ -11,29 +11,30 @@ module Ruby2JS
|
|
11
11
|
|
12
12
|
handle :dstr, :dsym do |*children|
|
13
13
|
if es2015
|
14
|
-
put '`'
|
15
|
-
|
16
14
|
# gather length of string parts; if long enough, newlines will
|
17
|
-
# not be escaped
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
15
|
+
# not be escaped (poor man's HEREDOC)
|
16
|
+
strings = children.select {|child| child.type==:str}.
|
17
|
+
map {|child| child.children.last}.join
|
18
|
+
heredoc = (strings.length > 40 and strings.scan("\n").length > 3)
|
19
|
+
|
20
|
+
put '`'
|
21
|
+
children.each do |child|
|
22
|
+
if child.type == :str
|
23
|
+
str = child.children.first.inspect[1..-2].gsub('${', '$\{')
|
24
|
+
if heredoc
|
25
|
+
put! str.gsub("\\n", "\n")
|
26
|
+
else
|
27
|
+
put str
|
28
|
+
end
|
29
|
+
else
|
30
|
+
put '${'
|
31
|
+
parse child
|
32
|
+
put '}'
|
33
|
+
end
|
34
|
+
end
|
35
|
+
put '`'
|
36
|
+
|
37
|
+
return
|
37
38
|
end
|
38
39
|
|
39
40
|
children.each_with_index do |child, index|
|
@@ -45,10 +45,24 @@ module Ruby2JS
|
|
45
45
|
end
|
46
46
|
put "] = "
|
47
47
|
parse rhs
|
48
|
+
|
49
|
+
elsif rhs.type == :array
|
50
|
+
|
51
|
+
if lhs.children.length == rhs.children.length
|
52
|
+
block = []
|
53
|
+
lhs.children.zip rhs.children.zip do |var, val|
|
54
|
+
block << s(var.type, *var.children, *val)
|
55
|
+
end
|
56
|
+
parse s(:begin, *block), @state
|
57
|
+
else
|
58
|
+
raise Error.new("unmatched assignment", @ast)
|
59
|
+
end
|
60
|
+
|
48
61
|
else
|
62
|
+
|
49
63
|
block = []
|
50
|
-
lhs.children.
|
51
|
-
block << s(var.type, *var.children,
|
64
|
+
lhs.children.each_with_index do |var, i|
|
65
|
+
block << s(var.type, *var.children, s(:send, rhs, :[], s(:int, i)))
|
52
66
|
end
|
53
67
|
parse s(:begin, *block), @state
|
54
68
|
end
|
@@ -6,36 +6,44 @@ module Ruby2JS
|
|
6
6
|
# (regopt :i))
|
7
7
|
|
8
8
|
handle :regexp do |*parts, opt|
|
9
|
+
# remove "extended" from list of options
|
9
10
|
extended = false
|
10
11
|
opts = opt.children
|
11
12
|
if opts.include? :x
|
12
|
-
opts = opts
|
13
|
+
opts = opts - [:x]
|
13
14
|
extended = true
|
14
15
|
end
|
15
16
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
unless str.include? '/'
|
20
|
-
return put "/#{ str }/#{ opts.join }"
|
21
|
-
end
|
22
|
-
put "new RegExp(#{ str.inspect }"
|
23
|
-
else
|
24
|
-
put 'new RegExp('
|
25
|
-
|
26
|
-
parts.each_with_index do |part, index|
|
27
|
-
put ' + ' unless index == 0
|
28
|
-
|
17
|
+
# remove whitespace and comments from extended regular expressions
|
18
|
+
if extended
|
19
|
+
parts.map! do |part|
|
29
20
|
if part.type == :str
|
30
21
|
str = part.children.first
|
31
|
-
str = str.gsub(/ #.*/,'').gsub(/\s/,'')
|
32
|
-
|
22
|
+
str = str.gsub(/ #.*/,'').gsub(/\s/,'')
|
23
|
+
s(:str, str)
|
33
24
|
else
|
34
|
-
|
25
|
+
part
|
35
26
|
end
|
36
27
|
end
|
37
28
|
end
|
38
29
|
|
30
|
+
# use slash syntax if there are few embedded slashes in the regexp
|
31
|
+
if parts.all? {|part| part.type == :str}
|
32
|
+
str = parts.map {|part| part.children.first}.join
|
33
|
+
unless str.scan('/').length - str.scan("\\").length > 3
|
34
|
+
return put "/#{ str.gsub('/', '\\/') }/#{ opts.join }"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# create a new RegExp object
|
39
|
+
put 'new RegExp('
|
40
|
+
|
41
|
+
if parts.length == 1
|
42
|
+
parse parts.first
|
43
|
+
else
|
44
|
+
parse s(:dstr, *parts)
|
45
|
+
end
|
46
|
+
|
39
47
|
unless opts.empty?
|
40
48
|
put ", #{ opts.join.inspect}"
|
41
49
|
end
|
@@ -26,6 +26,7 @@ module Ruby2JS
|
|
26
26
|
return if block == []
|
27
27
|
if EXPRESSIONS.include? block.last.type
|
28
28
|
block.push @ast.updated(:return, [block.pop])
|
29
|
+
|
29
30
|
elsif block.last.type == :if
|
30
31
|
node = block.pop
|
31
32
|
if node.children[1] and node.children[2] and
|
@@ -49,6 +50,24 @@ module Ruby2JS
|
|
49
50
|
end
|
50
51
|
end
|
51
52
|
block.push node
|
53
|
+
|
54
|
+
elsif block.last.type == :case
|
55
|
+
node = block.pop
|
56
|
+
children = node.children.dup
|
57
|
+
(1...children.length).each do |i|
|
58
|
+
if children[i].type == :when
|
59
|
+
gchildren = children[i].children.dup
|
60
|
+
if !gchildren.empty? and EXPRESSIONS.include? gchildren.last.type
|
61
|
+
gchildren.push s(:return, gchildren.pop)
|
62
|
+
children[i] = children[i].updated(nil, gchildren)
|
63
|
+
else
|
64
|
+
end
|
65
|
+
elsif EXPRESSIONS.include? children[i].type
|
66
|
+
children[i] = children[i].updated(:return, [children[i]])
|
67
|
+
end
|
68
|
+
end
|
69
|
+
block.push node.updated(nil, children)
|
70
|
+
|
52
71
|
elsif block.last.type == :lvasgn
|
53
72
|
block.push s(:return, s(:lvar, block.last.children.first))
|
54
73
|
elsif block.last.type == :ivasgn
|
@@ -16,6 +16,13 @@ module Ruby2JS
|
|
16
16
|
handle :send, :sendw, :await, :attr, :call do |receiver, method, *args|
|
17
17
|
ast = @ast
|
18
18
|
|
19
|
+
if
|
20
|
+
args.length == 1 and method == :+
|
21
|
+
then
|
22
|
+
node = collapse_strings(ast)
|
23
|
+
return parse node if node != ast
|
24
|
+
end
|
25
|
+
|
19
26
|
# strip '!' and '?' decorations
|
20
27
|
method = method.to_s[0..-2] if method =~ /\w[!?]$/
|
21
28
|
|
@@ -285,5 +292,48 @@ module Ruby2JS
|
|
285
292
|
put '...'
|
286
293
|
parse expr
|
287
294
|
end
|
295
|
+
|
296
|
+
# do string concatenation when possible
|
297
|
+
def collapse_strings(node)
|
298
|
+
left = node.children[0]
|
299
|
+
return node unless left
|
300
|
+
right = node.children[2]
|
301
|
+
|
302
|
+
# recursively evaluate left hand side
|
303
|
+
if
|
304
|
+
left.type == :send and left.children.length == 3 and
|
305
|
+
left.children[1] == :+
|
306
|
+
then
|
307
|
+
left = collapse_strings(left)
|
308
|
+
end
|
309
|
+
|
310
|
+
# recursively evaluate right hand side
|
311
|
+
if
|
312
|
+
right.type == :send and right.children.length == 3 and
|
313
|
+
right.children[1] == :+
|
314
|
+
then
|
315
|
+
right = collapse_strings(right)
|
316
|
+
end
|
317
|
+
|
318
|
+
# if left and right are both strings, perform concatenation
|
319
|
+
if [:dstr, :str].include? left.type and [:dstr, :str].include? right.type
|
320
|
+
if left.type == :str and right.type == :str
|
321
|
+
return left.updated nil,
|
322
|
+
[left.children.first + right.children.first]
|
323
|
+
else
|
324
|
+
left = s(:dstr, left) if left.type == :str
|
325
|
+
right = s(:dstr, right) if right.type == :str
|
326
|
+
return left.updated(nil, left.children + right.children)
|
327
|
+
end
|
328
|
+
end
|
329
|
+
|
330
|
+
# if left and right are unchanged, return original node; otherwise
|
331
|
+
# return node modified to include new left and/or right hand sides.
|
332
|
+
if left == node.children[0] and right == node.children[2]
|
333
|
+
return node
|
334
|
+
else
|
335
|
+
return node.updated(nil, [left, :+, right])
|
336
|
+
end
|
337
|
+
end
|
288
338
|
end
|
289
339
|
end
|
@@ -289,6 +289,18 @@ module Ruby2JS
|
|
289
289
|
# prevent chained delete methods from being converted to undef
|
290
290
|
S(:send, target.updated(:sendw), *node.children[1..-1])
|
291
291
|
|
292
|
+
elsif es2017 and method==:entries and args.length==0 and node.is_method?
|
293
|
+
process node.updated(nil, [s(:const, nil, :Object), :entries, target])
|
294
|
+
|
295
|
+
elsif es2017 and method==:values and args.length==0 and node.is_method?
|
296
|
+
process node.updated(nil, [s(:const, nil, :Object), :values, target])
|
297
|
+
|
298
|
+
elsif es2017 and method==:rjust
|
299
|
+
process node.updated(nil, [target, :padStart, *args])
|
300
|
+
|
301
|
+
elsif es2017 and method==:ljust
|
302
|
+
process node.updated(nil, [target, :padEnd, *args])
|
303
|
+
|
292
304
|
else
|
293
305
|
super
|
294
306
|
end
|
data/lib/ruby2js/serializer.rb
CHANGED
@@ -143,6 +143,11 @@ module Ruby2JS
|
|
143
143
|
end
|
144
144
|
end
|
145
145
|
|
146
|
+
# add a single token to the current line without checking for newline
|
147
|
+
def put!(string)
|
148
|
+
@line << Token.new(string.gsub("\r", "\n"), @ast)
|
149
|
+
end
|
150
|
+
|
146
151
|
# add a single token to the current line and then advance to next line
|
147
152
|
def puts(string)
|
148
153
|
unless String === string and string.include? "\n"
|
data/lib/ruby2js/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby2js
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0.
|
4
|
+
version: 3.0.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sam Ruby
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-05-
|
11
|
+
date: 2018-05-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: parser
|