ruby2js 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +8 -8
  2. data/lib/ruby2js.rb +2 -2
  3. data/lib/ruby2js/converter.rb +68 -474
  4. data/lib/ruby2js/converter/andasgn.rb +12 -0
  5. data/lib/ruby2js/converter/arg.rb +14 -0
  6. data/lib/ruby2js/converter/args.rb +13 -0
  7. data/lib/ruby2js/converter/array.rb +33 -0
  8. data/lib/ruby2js/converter/begin.rb +13 -0
  9. data/lib/ruby2js/converter/block.rb +16 -0
  10. data/lib/ruby2js/converter/blockpass.rb +11 -0
  11. data/lib/ruby2js/converter/boolean.rb +11 -0
  12. data/lib/ruby2js/converter/break.rb +12 -0
  13. data/lib/ruby2js/converter/case.rb +23 -0
  14. data/lib/ruby2js/converter/casgn.rb +16 -0
  15. data/lib/ruby2js/converter/class.rb +75 -0
  16. data/lib/ruby2js/converter/const.rb +10 -0
  17. data/lib/ruby2js/converter/def.rb +91 -0
  18. data/lib/ruby2js/converter/defined.rb +15 -0
  19. data/lib/ruby2js/converter/dstr.rb +16 -0
  20. data/lib/ruby2js/converter/for.rb +19 -0
  21. data/lib/ruby2js/converter/hash.rb +24 -0
  22. data/lib/ruby2js/converter/if.rb +34 -0
  23. data/lib/ruby2js/converter/ivar.rb +10 -0
  24. data/lib/ruby2js/converter/ivasgn.rb +11 -0
  25. data/lib/ruby2js/converter/kwbegin.rb +44 -0
  26. data/lib/ruby2js/converter/literal.rb +12 -0
  27. data/lib/ruby2js/converter/logical.rb +43 -0
  28. data/lib/ruby2js/converter/masgn.rb +20 -0
  29. data/lib/ruby2js/converter/next.rb +12 -0
  30. data/lib/ruby2js/converter/nil.rb +10 -0
  31. data/lib/ruby2js/converter/opasgn.rb +20 -0
  32. data/lib/ruby2js/converter/orasgn.rb +12 -0
  33. data/lib/ruby2js/converter/regexp.rb +21 -0
  34. data/lib/ruby2js/converter/return.rb +15 -0
  35. data/lib/ruby2js/converter/self.rb +10 -0
  36. data/lib/ruby2js/converter/send.rb +98 -0
  37. data/lib/ruby2js/converter/sym.rb +10 -0
  38. data/lib/ruby2js/converter/undef.rb +12 -0
  39. data/lib/ruby2js/converter/until.rb +12 -0
  40. data/lib/ruby2js/converter/untilpost.rb +13 -0
  41. data/lib/ruby2js/converter/var.rb +11 -0
  42. data/lib/ruby2js/converter/vasgn.rb +41 -0
  43. data/lib/ruby2js/converter/while.rb +12 -0
  44. data/lib/ruby2js/converter/whilepost.rb +14 -0
  45. data/lib/ruby2js/converter/xstr.rb +16 -0
  46. data/lib/ruby2js/filter/angularrb.rb +1 -1
  47. data/lib/ruby2js/filter/jquery.rb +95 -1
  48. data/lib/ruby2js/version.rb +1 -1
  49. data/ruby2js.gemspec +3 -3
  50. metadata +44 -2
@@ -0,0 +1,34 @@
1
+ module Ruby2JS
2
+ class Converter
3
+
4
+ # (if
5
+ # (true)
6
+ # (...)
7
+ # (...))
8
+
9
+ handle :if do |condition, then_block, else_block|
10
+ if else_block and not then_block
11
+ return parse(s(:if, s(:send, condition, :!), else_block, nil), @state)
12
+ end
13
+
14
+ if @state == :statement
15
+ output = "if (#{ parse condition }) {#@nl#{ scope then_block }#@nl}"
16
+ while else_block and else_block.type == :if
17
+ condition, then_block, else_block = else_block.children
18
+ output << " else if (#{ parse condition }) " +
19
+ "{#@nl#{ scope then_block }#@nl}"
20
+ end
21
+ output << " else {#@nl#{ scope else_block }#@nl}" if else_block
22
+
23
+ # use short form when appropriate
24
+ unless output.length > 72 or else_block or then_block.type == :begin
25
+ output = "if (#{ parse condition }) #{ scope then_block }"
26
+ end
27
+
28
+ output
29
+ else
30
+ "(#{ parse condition } ? #{ parse then_block } : #{ parse else_block })"
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,10 @@
1
+ module Ruby2JS
2
+ class Converter
3
+
4
+ # (ivar :@a)
5
+
6
+ handle :ivar do |var|
7
+ var.to_s.sub('@', 'this._')
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,11 @@
1
+ module Ruby2JS
2
+ class Converter
3
+
4
+ # (ivasgn :@a
5
+ # (int 1))
6
+
7
+ handle :ivasgn do |var, expression|
8
+ "#{ var.to_s.sub('@', 'this._') } = #{ parse expression }"
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,44 @@
1
+ module Ruby2JS
2
+ class Converter
3
+
4
+ # (kwbegin
5
+ # (ensure
6
+ # (rescue
7
+ # (send nil :a)
8
+ # (resbody nil nil
9
+ # (send nil :b)) nil)
10
+ # (send nil :c)))
11
+
12
+ handle :kwbegin do |*children|
13
+ block = children.first
14
+ if block.type == :ensure
15
+ block, finally = block.children
16
+ else
17
+ finally = nil
18
+ end
19
+
20
+ if block and block.type == :rescue
21
+ body, recover, otherwise = block.children
22
+ raise NotImplementedError, "block else" if otherwise
23
+ exception, name, recovery = recover.children
24
+ raise NotImplementedError, parse(exception) if exception
25
+ else
26
+ body = block
27
+ end
28
+
29
+ output = "try {#@nl#{ parse body }#@nl}"
30
+
31
+ if recovery
32
+ output += " catch (#{ parse name }) {#@nl#{ parse recovery }#@nl}"
33
+ end
34
+
35
+ output += " finally {#@nl#{ parse finally }#@nl}" if finally
36
+
37
+ if recovery or finally
38
+ output
39
+ else
40
+ parse s(:begin, *children)
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,12 @@
1
+ module Ruby2JS
2
+ class Converter
3
+
4
+ # (int 1)
5
+ # (float 1.1)
6
+ # (str "1"))
7
+
8
+ handle :int, :float, :str do |value|
9
+ value.inspect
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,43 @@
1
+ module Ruby2JS
2
+ class Converter
3
+
4
+ # (and
5
+ # (...)
6
+ # (...))
7
+
8
+ # (or
9
+ # (...)
10
+ # (...))
11
+
12
+ # (not
13
+ # (...))
14
+
15
+ handle :and, :or, :not do |left, right=nil|
16
+ type = @ast.type
17
+ op_index = operator_index type
18
+
19
+ left = left.children.first if left and left.type == :begin
20
+ lgroup = LOGICAL.include?( left.type ) &&
21
+ op_index <= operator_index( left.type )
22
+ left = parse left
23
+ left = "(#{ left })" if lgroup
24
+
25
+ if right
26
+ right = right.children.first if right.type == :begin
27
+ rgroup = LOGICAL.include?( right.type ) &&
28
+ op_index <= operator_index( right.type )
29
+ right = parse right
30
+ right = "(#{ right })" if rgroup
31
+ end
32
+
33
+ case type
34
+ when :and
35
+ "#{ left } && #{ right }"
36
+ when :or
37
+ "#{ left } || #{ right }"
38
+ else
39
+ "!#{ left }"
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,20 @@
1
+ module Ruby2JS
2
+ class Converter
3
+
4
+ # (masgn
5
+ # (mlhs
6
+ # (lvasgn :a)
7
+ # (lvasgn :b))
8
+ # (array
9
+ # (int 1)
10
+ # (int 2)))
11
+
12
+ handle :masgn do |lhs, rhs|
13
+ block = []
14
+ lhs.children.zip rhs.children.zip do |var, val|
15
+ block << s(var.type, *var.children, *val)
16
+ end
17
+ parse s(:begin, *block), @state
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,12 @@
1
+ module Ruby2JS
2
+ class Converter
3
+
4
+ # (next
5
+ # (int 1))
6
+
7
+ handle :next do |n=nil|
8
+ raise NotImplementedError, "next argument #{ n.inspect }" if n
9
+ 'continue'
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,10 @@
1
+ module Ruby2JS
2
+ class Converter
3
+
4
+ # (nil)
5
+
6
+ handle :nil do
7
+ 'null'
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,20 @@
1
+ module Ruby2JS
2
+ class Converter
3
+
4
+ # (op-asgn
5
+ # (lvasgn :a) :+
6
+ # (int 1))
7
+
8
+ handle :op_asgn do |var, op, value|
9
+ if [:+, :-].include?(op) and value.type==:int and value.children==[1]
10
+ if @state == :statement
11
+ "#{ parse var }#{ op }#{ op }"
12
+ else
13
+ "#{ op }#{ op }#{ parse var }"
14
+ end
15
+ else
16
+ "#{ parse var } #{ op }= #{ parse value }"
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,12 @@
1
+ module Ruby2JS
2
+ class Converter
3
+
4
+ # (or-asgn
5
+ # (lvasgn :a
6
+ # (int 1))
7
+
8
+ handle :or_asgn do |var, value|
9
+ "#{ parse var } = #{parse var} || #{ parse value }"
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,21 @@
1
+ module Ruby2JS
2
+ class Converter
3
+
4
+ # (regexp
5
+ # (str "x")
6
+ # (regopt :i))
7
+
8
+ handle :regexp do |str, opt|
9
+ str = str.children.first
10
+ if str.include? '/'
11
+ if opt.children.empty?
12
+ "new RegExp(#{ str.inspect })"
13
+ else
14
+ "new RegExp(#{ str.inspect }, #{ opt.children.join.inspect})"
15
+ end
16
+ else
17
+ "/#{ str }/#{ opt.children.join }"
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,15 @@
1
+ module Ruby2JS
2
+ class Converter
3
+
4
+ # (return
5
+ # (int 1))
6
+
7
+ handle :return do |value=nil|
8
+ if value
9
+ "return #{ parse value }"
10
+ else
11
+ "return"
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,10 @@
1
+ module Ruby2JS
2
+ class Converter
3
+
4
+ # (self)
5
+
6
+ handle :self do
7
+ 'this'
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,98 @@
1
+ module Ruby2JS
2
+ class Converter
3
+
4
+ # (send nil :puts
5
+ # (int 1))
6
+
7
+ # (attr nil :puts
8
+ # (int 1))
9
+
10
+ handle :send, :attr do |receiver, method, *args|
11
+ ast = @ast
12
+
13
+ if method =~ /\w[!?]$/
14
+ raise NotImplementedError, "invalid method name #{ method }"
15
+ end
16
+
17
+ if method == :new and receiver and receiver.children == [nil, :Proc]
18
+ return parse args.first
19
+ elsif not receiver and [:lambda, :proc].include? method
20
+ return parse args.first
21
+ end
22
+
23
+ op_index = operator_index method
24
+ if op_index != -1
25
+ target = args.first
26
+ target = target.children.first if target and target.type == :begin
27
+ receiver = receiver.children.first if receiver.type == :begin
28
+ end
29
+
30
+ group_receiver = receiver.type == :send && op_index <= operator_index( receiver.children[1] ) if receiver
31
+ group_target = target.type == :send && op_index <= operator_index( target.children[1] ) if target
32
+
33
+ if method == :!
34
+ if receiver.type == :defined?
35
+ parse s(:undefined?, *receiver.children)
36
+ else
37
+ group_receiver ||= (receiver.type != :send && receiver.children.length > 1)
38
+ "!#{ group_receiver ? group(receiver) : parse(receiver) }"
39
+ end
40
+
41
+ elsif method == :[]
42
+ "#{ parse receiver }[#{ args.map {|arg| parse arg}.join(', ') }]"
43
+
44
+ elsif method == :[]=
45
+ "#{ parse receiver }[#{ args[0..-2].map {|arg| parse arg}.join(', ') }] = #{ parse args[-1] }"
46
+
47
+ elsif [:-@, :+@, :~].include? method
48
+ "#{ method.to_s[0] }#{ parse receiver }"
49
+
50
+ elsif method == :=~
51
+ "#{ parse args.first }.test(#{ parse receiver })"
52
+
53
+ elsif method == :!~
54
+ "!#{ parse args.first }.test(#{ parse receiver })"
55
+
56
+ elsif OPERATORS.flatten.include? method
57
+ "#{ group_receiver ? group(receiver) : parse(receiver) } #{ method } #{ group_target ? group(target) : parse(target) }"
58
+
59
+ elsif method =~ /=$/
60
+ "#{ parse receiver }#{ '.' if receiver }#{ method.to_s.sub(/=$/, ' =') } #{ parse args.first }"
61
+
62
+ elsif method == :new and receiver
63
+ args = args.map {|a| parse a}.join(', ')
64
+ if args.length > 0 or is_method?(ast)
65
+ "new #{ parse receiver }(#{ args })"
66
+ else
67
+ "new #{ parse receiver }"
68
+ end
69
+
70
+ elsif method == :raise and receiver == nil
71
+ if args.length == 1
72
+ "throw #{ parse args.first }"
73
+ else
74
+ "throw new #{ parse args.first }(#{ parse args[1] })"
75
+ end
76
+
77
+ elsif method == :typeof and receiver == nil
78
+ "typeof #{ parse args.first }"
79
+
80
+ else
81
+ if args.length == 0 and not is_method?(ast)
82
+ if receiver
83
+ "#{ parse receiver }.#{ method }"
84
+ else
85
+ parse s(:lvasgn, method), @state
86
+ end
87
+ elsif args.length > 0 and args.last.type == :splat
88
+ parse s(:send, s(:attr, receiver, method), :apply, receiver,
89
+ s(:send, s(:array, *args[0..-2]), :concat,
90
+ args[-1].children.first))
91
+ else
92
+ args = args.map {|a| parse a}.join(', ')
93
+ "#{ parse receiver }#{ '.' if receiver }#{ method }(#{ args })"
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,10 @@
1
+ module Ruby2JS
2
+ class Converter
3
+
4
+ # (sym :sym))
5
+
6
+ handle :sym do |sym|
7
+ sym.to_s.inspect
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,12 @@
1
+ module Ruby2JS
2
+ class Converter
3
+
4
+ # (undef
5
+ # (sym :foo)
6
+ # (sym :bar))
7
+
8
+ handle :undef do |*syms|
9
+ syms.map {|sym| "delete #{sym.children.last}"}.join @sep
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ module Ruby2JS
2
+ class Converter
3
+
4
+ # (until
5
+ # (true)
6
+ # (...))
7
+
8
+ handle :until do |condition, block|
9
+ parse s(:while, s(:send, condition, :!), block)
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,13 @@
1
+ module Ruby2JS
2
+ class Converter
3
+
4
+ # (until-post
5
+ # (true)
6
+ # (kwbegin
7
+ # (...)))
8
+
9
+ handle :until_post do |condition, block|
10
+ parse s(:while_post, s(:send, condition, :!), block)
11
+ end
12
+ end
13
+ end