jsrb 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 364d2bd1fb5aa8359d2396ab0cba0063fc7679a41e7dfd476cce1cf431ff9c33
4
- data.tar.gz: d4b4bc5e5ae5de748f87e431ddcd325386116cc3771a830d3eb688b0ff4a0e5c
3
+ metadata.gz: 648a40f61a953168044bacbdc32e18b5e634b10f7978e6856a0eb5704b7e5659
4
+ data.tar.gz: 6a65ed913dbfccc2dd6518d826e9ae430d66bf96774dc418a874180cb9252f0a
5
5
  SHA512:
6
- metadata.gz: 8f1f633f7475c81868867379eee537c7bdd8ca84502a0849e86cc79dead234ef0a96147018b492b8da4e6fa5f60089809e56d9cb929ab055a705238540d74928
7
- data.tar.gz: 8c61e38d356b3a64cf37cc4a6200756d234baaddc6c4df1b110c1510bc898bc0f537d866d79a15ded681ce543f1db196ae9963124b6668ac5e240540133c3790
6
+ metadata.gz: 077a2481fc02d3b1a50ef6d36a92402b8f170e30764c5db614a58dce4b073615d1bfb7cdd560c4868e3425319388e29cc6fd4517f8f3179b5b38463459713d8a
7
+ data.tar.gz: 02547dbba6d6554cfd37174de4cbba978bef8d0cbafeb43a2d24b698f5dcf7d0598d8050dbf86e71e0f59344f569428686d1f077988c8192f8d71ee2b79a0274
@@ -8,7 +8,7 @@ Metrics/LineLength:
8
8
  Max: 130
9
9
 
10
10
  Metrics/MethodLength:
11
- Max: 30
11
+ Max: 50
12
12
 
13
13
  Metrics/AbcSize:
14
14
  Max: 25
@@ -16,6 +16,11 @@ Metrics/AbcSize:
16
16
  Metrics/ClassLength:
17
17
  Max: 200
18
18
 
19
+ Metrics/BlockLength:
20
+ Max: 50
21
+ Exclude:
22
+ - 'spec/**/*'
23
+
19
24
  Style/MissingRespondToMissing:
20
25
  Enabled: false
21
26
 
@@ -34,7 +39,3 @@ Style/LambdaCall:
34
39
 
35
40
  Style/MethodMissingSuper:
36
41
  Enabled: false
37
-
38
- Metrics/BlockLength:
39
- Exclude:
40
- - 'spec/**/*'
data/.yardopts CHANGED
@@ -1,2 +1,5 @@
1
1
  --markup-provider=redcarpet
2
2
  --markup=markdown
3
+ --no-private
4
+ -
5
+ README.md
data/README.md CHANGED
@@ -6,28 +6,28 @@ Jsrb is a template engine to generate JavaScript code in simple Ruby DSL.
6
6
 
7
7
  # Getting Started
8
8
 
9
- Jsrb handler works in `.jsrb` view files. All ruby syntax is available and `jsrb` is provided in it. You can construct JavaScript code via `jsrb`.
9
+ Jsrb handler works in `.jsrb` view files. All ruby syntax is available and `js` is provided in it. You can construct JavaScript code via `js`.
10
10
 
11
- ```rb
12
- name = jsrb.var!(:name) { 'foo' }
13
- ary = jsrb.var! :ary
14
- obj = jsrb.var! :obj
15
- result = jsrb.var!
11
+ ```ruby
12
+ name = js.var!(:name) { 'foo' }
13
+ ary = js.var! :ary
14
+ obj = js.var! :obj
15
+ result = js.var!
16
16
  # var name = 'foo';
17
17
  # var ary;
18
18
  # var obj;
19
- # var _v1; <- auto generate variable name
19
+ # var _v1; // auto generated
20
20
 
21
- ary.set!([1, 2, 3])
21
+ js.set! ary, [1, 2, 3]
22
22
  # ary = [1, 2, 3];
23
23
 
24
- obj.set!(
24
+ js.set! obj, {
25
25
  name: name,
26
26
  profile: {
27
27
  age: 20,
28
28
  sex: 'm'
29
29
  }
30
- )
30
+ }
31
31
  # obj = {
32
32
  # name: name,
33
33
  # profile: {
@@ -36,22 +36,23 @@ obj.set!(
36
36
  # }
37
37
  # };
38
38
 
39
- result.set! (obj.name + "(" + obj.profile.age + ")")
39
+ js.set! result, (obj.name + "(" + obj.profile.age + ")")
40
40
  # _v1 = obj.name + "(" + obj.profile.age + ")";
41
41
 
42
- ary.set! ary.map { |x| x * 2 }
42
+ js.set! ary, ary.map { |x| x * 2 }
43
43
  # ary = ary.map(function(x) {
44
44
  # return x * 2;
45
45
  # });
46
46
 
47
- jsrb.if!(ary[1] === 4) {
48
- result.set! 'four'
47
+ js.if!(ary[1] === 4) {
48
+ js.set! result, 'four'
49
49
  }.elsif(ary[1] === 2) {
50
- result.set! 'two'
50
+ js.set! result, 'two'
51
51
  }.else {
52
- result.set! 'other'
52
+ js.set! result, 'other'
53
53
  }
54
- # // the actual output doesn't looks like this, but will be better code in regard to variable scope.
54
+ # // The actual output will have certain immediate functions
55
+ # // that preserve variable scope for each case.
55
56
  # if (ary[1] === 4) {
56
57
  # _v1 = 'four'
57
58
  # } else if (ary[1] === 2) {
@@ -60,51 +61,58 @@ jsrb.if!(ary[1] === 4) {
60
61
  # _v1 = 'other'
61
62
  # }
62
63
 
63
- result.set! jsrb.expr.Date.new!
64
+ js.set! result, js.expr.Date.new
64
65
  # _v1 = new Date;
65
66
 
66
- jsrb.expr.console.log('hello').as_statement!
67
+ js.set! js.expr.console.log('hello')
67
68
  # console.log('hello');
68
69
  ```
69
70
 
70
71
  # Usage
71
72
 
73
+ In contrast to Ruby, statements and expressions are
74
+ specifically distinguished as different elements in JavaScript.
75
+ And the program is composed of a list of statements.
76
+ This means that the jsrb file will have a series of statement pushing expression in it.
77
+
78
+ To make clear whether a method is pushing statement or not, jsrb adopted the rule that the name of method pushing statement should be `#..!`.
79
+
72
80
  ## Statements
73
81
 
74
82
  ### Variable declaration
75
83
 
76
- `jsrb.var!` pushes a **VariableDeclaration** into current context.
84
+ `js.var!` pushes a **VariableDeclaration** into current context.
77
85
 
78
- ```rb
86
+ ```ruby
79
87
  # with variable name and initializer
80
- jsrb.var!('varname') { 100 }
88
+ js.var!('varname') { 100 }
81
89
  # var varname = 100;
82
90
 
83
91
  # without initializer
84
- jsrb.var!('varname')
92
+ js.var!('varname')
85
93
  # var varname;
86
94
 
87
95
  # variable name is auto-generated if not specified
88
- jsrb.var!
96
+ js.var!
89
97
  # var _v1;
90
98
 
91
99
  # var! returns Jsrb::ExprChain instance, so that you can
92
100
  # assign value with `.set!` method.
93
- a = jsrb.var!
94
- a.set! 100
101
+ a = js.var!
102
+ js.set! a, 100
95
103
  # var _v1;
96
104
  # v1 = 100;
97
105
  ```
98
106
 
99
107
  ### If statement, and conditional expression
100
108
 
101
- `jsrb.if!` pushes an **IfStatement** into current context, `jsrb.if` to build **a conditional expression**.
109
+ `js.if!` pushes an **IfStatement** into current context, `js.if` to build **a conditional expression**.
102
110
 
103
- ```rb
111
+ ```ruby
104
112
  # start with `#if!`
105
113
  # and chain `#elsif` to add next case.
106
114
  # Note that this is a statement, not expression.
107
- jsrb.if!(v === 1) {
115
+ js.if!(v === 1) {
108
116
  # ..
109
117
  }.elsif(v === 2) {
110
118
  # ..
@@ -113,105 +121,110 @@ jsrb.if!(v === 1) {
113
121
  }
114
122
 
115
123
  # if you don't need else clause, close with `#end`
116
- jsrb.if!(v === 1) {
124
+ js.if!(v === 1) {
117
125
  # ..
118
126
  }.end
119
127
 
120
128
  # if you want to regard this as an expression, use `#if` without exclamation.
121
- v.set! jsrb.if(v === 1) {
129
+ js.set! v, js.if(v === 1) {
122
130
  # ..
123
131
  }.else {
124
132
  # ..
125
133
  }
126
134
  ```
127
135
 
128
- ### Assignment statement
129
-
130
- `ExprChain#set!` pushes an **assignment statement** (ExpressionStatement of AssignmentExpression).
131
-
132
- ```rb
133
- a = jsrb.var! :a
134
- a.set! 100
135
- # var a;
136
- # a = 100;
137
- ```
138
-
139
136
  ### Expression statement
140
137
 
141
- `ExprChain#as_statement!` pushes an **ExpressionStatement** of the left hand side of chain.
138
+ `js.do!` pushes an **ExpressionStatement** of a given expression.
142
139
 
143
- ```rb
144
- get_elements = jsrb.expr['getElements']
145
- get_elements.('.foo').forEach { |n| n.delete.() }.as_statement!
140
+ ```ruby
141
+ get_elements = js.expr[:getElements]
142
+ js.do! get_elements.('.foo').forEach { |n| n.delete.() }
146
143
  # getElements('.foo').forEach(function(n) { return n.delete(); });
147
144
  ```
148
145
 
149
- ## Expression chain
146
+ ## Expressions
150
147
 
151
148
  Expression chain (`ExprChain` class) is an utility class to construct JavaScript expressions.
152
149
 
153
- ### Initialize with wrapping a ruby value
150
+ ### Initialize with wrapping ruby values
154
151
 
155
- `jsrb.expr` create a new `ExprChain` instance, taking an initial value optionally.
156
- Some methods in jsrb automatically convert ruby expression to ExprChain.
152
+ `js.expr` create a new `ExprChain` instance, taking an initial value optionally.
153
+ Some methods in `js` automatically convert ruby value to ExprChain.
157
154
 
158
- ```rb
159
- x = jsrb.var! :x
155
+ ```ruby
156
+ x = js.var! :x
160
157
 
161
- x.set! jsrb.expr(100)
158
+ js.set! x, js.expr(100)
162
159
  # x = 100;
163
- # set! automatically wrap with ExprChain.
164
- x.set! 100
160
+ # set! automatically wraps argument with ExprChain.
161
+ js.set! x, 100
165
162
  # x = 100;
166
- # If you need to compare by operator with another ExprChain,
167
- # you have to wrap first.
168
- x.set!(jsrb.expr(100) < jsrb.expr.y)
169
- # x.set!(100 < jsrb.expr.y) will fail.
163
+ #
164
+ # Note that if you need to compare a ruby value by operator with another one,
165
+ # you have to wrap it.
166
+ js.set! x, (js.expr(100) < js.expr.y) # (100 < js.expr.y) will fail.
170
167
  ```
171
168
 
169
+ See the conversion section to check mappings from ruby value to JavaScript one.
170
+
172
171
  ### Chains
173
172
 
174
173
  #### Member expression
175
174
 
176
- `ExprChain#[], #member!, #..` constructs **MemberExpression**.
175
+ `ExprChain#[], #..` constructs **MemberExpression**.
177
176
  `#[]` and `#member!` is safe. `#..` can be used only if the name has no conflict.
178
177
 
179
- ```rb
180
- x = jsrb.var! :x
178
+ ```ruby
179
+ x = js.var! :x
181
180
 
182
- obj = jsrb.expr['someObj']
183
- # jsrb.expr with no argument constructs empty chain,
181
+ obj = js.expr[:someObj]
182
+ # js.expr with no argument constructs empty chain,
184
183
  # in which every member chain will be an identifier.
185
- x.set! obj.field
186
- # x = someObj['field'];
187
- x.set! obj['field']
184
+ js.set! x, obj.field
188
185
  # x = someObj['field'];
189
- x.set! obj.member! 'field'
186
+ js.set! x, obj[:field]
190
187
  # x = someObj['field'];
191
188
 
192
- x.set! obj.send # NOTE that this is interpreted as a ruby Object's method, and causes an error.
189
+ js.set! x, obj.send # NOTE that this is interpreted as a ruby Object's method, and causes an error.
190
+ ```
191
+
192
+ #### Assignment
193
+
194
+ `ExprChain#set` constructs an **AssignmentExpression**.
195
+
196
+ ```ruby
197
+ a = js.var! :a
198
+ # var a;
199
+
200
+ js.do! a.set 100
201
+ # a = 100;
202
+
203
+ # js.set!(a, b) is short hand of js.do!(a.set(b))
204
+ js.set! a, 100
205
+ # a = 100;
193
206
  ```
194
207
 
195
208
  #### Function Call
196
209
 
197
210
  `ExprChain#call, so #.(), #.. with argument or block` constructs **CallExpression**.
198
211
 
199
- ```rb
200
- x = jsrb.var! :x
201
- console = jsrb.expr['console']
212
+ ```ruby
213
+ console = js.expr[:console]
202
214
 
203
215
  # using call method
204
- console.log.('foo').as_statement!
216
+ js.do! console.log.('foo')
205
217
  # console.log('foo')
206
- console.log.call('foo').as_statement!
218
+ js.do! console.log.call('foo')
207
219
  # console.log('foo')
208
220
 
209
221
  # using dynamic method
210
222
  # if #..() has at least one argument or block, it will be a call expression.
211
- console.log('foo').as_statement!
223
+ js.do! console.log('foo')
212
224
  # console.log('foo')
213
- x.map { |item| item.field }.as_statement!
214
- # x.map(function(item) { return item.field; });
225
+
226
+ js.do! js.expr(:ary).forEach { |item| item.execute.() }
227
+ # ary.forEach(function(item) { return item.execute(); });
215
228
  ```
216
229
 
217
230
  #### Operators
@@ -219,44 +232,44 @@ x.map { |item| item.field }.as_statement!
219
232
  Any ruby-overridable and JS-existing operators are overridden for chaining.
220
233
  Supported operators are: `** + - * / % >> << & ^ | <= < > >= == === != ! && ||`.
221
234
 
222
- ```rb
223
- x = jsrb.var! :x
224
- a = jsrb.expr['a']
235
+ ```ruby
236
+ x = js.var! :x
237
+ a = js.expr[:a]
225
238
 
226
- x.set!(a === 1)
239
+ js.set! x, (a === 1)
227
240
  # x = a === 1;
228
241
 
229
- x.set!(a * a)
242
+ js.set! x, (a * a)
230
243
  # x = a * a;
231
244
 
232
- x.set!(3 * a) # raises an error because Fixnum does not accept ExprChain as RHS.
245
+ js.set! x, (3 * a) # raises an error because the method :* of Fixnum does not accept ExprChain as RHS.
233
246
  ```
234
247
 
235
248
  #### New
236
249
 
237
- `ExprChain#new!` constructs **NewExpression**.
250
+ `ExprChain#new` constructs **NewExpression**.
238
251
 
239
- ```rb
240
- x = jsrb.var! :x
252
+ ```ruby
253
+ x = js.var! :x
241
254
 
242
- x.set! jsrb.expr['Date'].new!
255
+ js.set! x, js.expr[:Date].new
243
256
  # x = new Date;
244
257
  ```
245
258
 
246
259
  #### Function expression
247
260
 
248
- `ExprChain#for_all!` constructs **FunctionExpression**. You can also construct it from Proc directly or passing a block.
261
+ `ExprChain#forall` constructs **FunctionExpression**. You can also construct it directly from Proc or passing a block.
249
262
 
250
- ```rb
251
- ary = jsrb.var! :ary, [1, 2, 3]
263
+ ```ruby
264
+ ary = js.var! :ary, [1, 2, 3]
252
265
 
253
- ary.map((jsrb.expr['x'] * 2).for_all!('x')).as_statement!
266
+ js.do! ary.map((js.expr[:x] * 2).forall('x'))
254
267
  # ary.map(function(x) { return x * 2; });
255
268
 
256
- ary.map { |x| x * 2 }.as_statement!
269
+ js.do! ary.map { |x| x * 2 }
257
270
  # ary.map(function(x) { return x * 2; });
258
271
 
259
- ary.map(->(x) { x * 2 }).as_statement!
272
+ js.do! ary.map(->(x) { x * 2 })
260
273
  # ary.map(function(x) { return x * 2; });
261
274
  ```
262
275
 
@@ -283,10 +296,10 @@ Every Ruby's generic value will be converted to Javascript value by following ru
283
296
 
284
297
  You can add custom chain methods in `ExprChain` via `Jsrb::ExprChain.#add_custom_chain`.
285
298
 
286
- ```rb
299
+ ```ruby
287
300
  Jsrb::ExprChain.add_custom_chain('log_here', '__tap_log__')
288
301
 
289
- jsrb.expr['foo']['bar'].log_here.as_statement!
302
+ js.do! js.expr[:foo][:bar].log_here
290
303
  # __tap_log__(foo['bar']);
291
304
  ```
292
305
 
@@ -4,7 +4,6 @@ lib = File.expand_path('lib', __dir__)
4
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
5
  require 'jsrb/version'
6
6
 
7
- # rubocop:disable Metrics/BlockLength
8
7
  Gem::Specification.new do |spec|
9
8
  spec.name = 'jsrb'
10
9
  spec.version = Jsrb::VERSION
@@ -42,4 +41,3 @@ Gem::Specification.new do |spec|
42
41
  spec.add_development_dependency 'rake', '~> 10.0'
43
42
  spec.add_development_dependency 'rspec', '~> 3.0'
44
43
  end
45
- # rubocop:enable Metrics/BlockLength
@@ -1,13 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Jsrb
4
- # Base is a centralized class for Jsrb template.
5
- # `jsrb`, accessed from views (i.e. `*.js.jsrb` files), is an instance of Jsrb::Base.
4
+ # `Jsrb::Base` is a centralized class for Jsrb template.
5
+ # `js`, accessed from views (i.e. `*.jsrb` files), is an instance of Jsrb::Base.
6
6
  #
7
- # Jsrb::Base provides some utilities to push statements,
8
- # construct expressions and generate the final JavaScript code,
9
- # with preserving a statement context to build the abstract syntax tree.
7
+ # `Jsrb::Base` provides the interface for pushing statements,
8
+ # constructing expressions and generating JavaScript outputs
9
+ # with handling an internal statement context properly.
10
10
  class Base
11
+ # @private
11
12
  def initialize
12
13
  @context = JSStatementContext.new
13
14
  end
@@ -24,29 +25,136 @@ module Jsrb
24
25
  end
25
26
 
26
27
  #
27
- # Pushes a VariableDeclaration to the current context
28
- # and returns an access to created identifier.
28
+ # **Pushes** an ExpressionStatement to the current context
29
29
  #
30
- # @param optional [Symbol] name a name of identifier, autogenerated if not specified.
30
+ # @example
31
+ # js.do!(js.expr[:x].set(100))
32
+ # # =>
33
+ # # x = 100;
34
+ # @param [Jsrb::ExprChain] expr target expression.
35
+ # @return [nil]
36
+ def do!(expr)
37
+ ast = expr.object
38
+ raise ArgumentError, 'Expression is empty' unless ast
39
+
40
+ @context.push(
41
+ type: 'ExpressionStatement',
42
+ expression: ast
43
+ )
44
+ end
45
+
46
+ #
47
+ # **Pushes** an assignment statement `lhs = rhs;`.
48
+ # This is a short hand of `js.do! lhs_expr.set(rhs_expr)`
49
+ #
50
+ # @example
51
+ # a = js.var! :a
52
+ # js.set!(a, 'dog')
53
+ # # =>
54
+ # # var a;
55
+ # # a = 'dog';
56
+ #
57
+ # # directly pass a symbol of identifier name
58
+ # js.set!(:x, 100)
59
+ # # =>
60
+ # # x = 100;
61
+ # @param [Jsrb::ExprChain, String, Symbol] expr target expression.
62
+ # @return [nil]
63
+ def set!(lhs, rhs)
64
+ lhs_expr = lhs.is_a?(ExprChain) ? lhs : expr(lhs)
65
+ do! lhs_expr.set(rhs)
66
+ end
67
+
68
+ #
69
+ # **Pushes** a VariableDeclaration to the current context
70
+ # and returns an access to the created identifier.
71
+ # @example
72
+ # name = js.var!(:name) { 'foo' }
73
+ # # var name = 'foo';
74
+ #
75
+ # ary = js.var! :ary
76
+ # # var ary;
77
+ #
78
+ # obj = js.var! :obj
79
+ # # var obj;
80
+ #
81
+ # result = js.var!
82
+ # # var _v1; //<- auto generate variable name
83
+ # @param [Symbol] name a name of identifier, autogenerated if not given
31
84
  # @yield optional block for initializer
32
- # @yieldreturn an initializer expression (optional)
33
- # @return [Jsrb::ExprChain] the expression that represents constructed new identifier
85
+ # @yieldreturn an initializer expression
86
+ # @return [Jsrb::ExprChain] the expression which represents a newly created identifier
34
87
  def var!(id = nil)
35
88
  id ||= @context.gen_var_name!
36
- if block_given?
37
- raw_expr = yield
38
- val = raw_expr.is_a?(ExprChain) ? raw_expr : expr(@context.ruby_to_js_ast(raw_expr))
39
- val.as_variable_declaration!(id)
89
+ val_ast =
90
+ if block_given?
91
+ raw_expr = yield
92
+ raw_expr.is_a?(ExprChain) ? raw_expr.unwrap : @context.ruby_to_js_ast(raw_expr)
93
+ end
94
+ if val_ast
95
+ @context.push(
96
+ type: 'VariableDeclaration',
97
+ declarations: [{
98
+ type: 'VariableDeclarator',
99
+ id: {
100
+ type: 'Identifier',
101
+ name: id.to_s
102
+ },
103
+ init: val_ast
104
+ }],
105
+ kind: 'var'
106
+ )
40
107
  else
41
- expr.as_variable_declaration!(id)
108
+ @context.push(
109
+ type: 'VariableDeclaration',
110
+ declarations: [{
111
+ type: 'VariableDeclarator',
112
+ id: {
113
+ type: 'Identifier',
114
+ name: id.to_s
115
+ }
116
+ }],
117
+ kind: 'var'
118
+ )
42
119
  end
43
- expr.member!(id)
120
+ expr[id]
44
121
  end
45
122
 
46
123
  #
47
- # Constructs a new conditional chain that **pushes an IfStatement** to the current context
48
- # after the chain ended.
124
+ # **Starts** a new conditional chain that pushes an IfStatement
125
+ # to the current context at end.
126
+ #
127
+ # @example
128
+ # js.if!(expr1) {
129
+ # # ..
130
+ # }.elsif(expr2) {
131
+ # # ..
132
+ # }.else {
133
+ # # ..
134
+ # }
135
+ # # =>
136
+ # # // The actual output will have certain immediate functions
137
+ # # // that preserve variable scope for each case.
138
+ # # if (..expr1..) {
139
+ # # // ..
140
+ # # } else if (..expr2..) {
141
+ # # // ..
142
+ # # } else {
143
+ # # // ..
144
+ # # }
49
145
  #
146
+ # # If you don't have else clause, close with `#end`.
147
+ # js.if!(expr1) {
148
+ # # ..
149
+ # }.elsif(expr2) {
150
+ # # ..
151
+ # }.end
152
+ # # =>
153
+ # # if (..expr1..) {
154
+ # # // ..
155
+ # # } else if (..expr2..) {
156
+ # # // ..
157
+ # # }
50
158
  # @param [Jsrb::ExprChain, convertible ruby values] cond_expr an expression for the test
51
159
  # @yield new context block for the consequent case
52
160
  # @return [Jsrb::CondChain] condition chainable instance
@@ -55,8 +163,31 @@ module Jsrb
55
163
  end
56
164
 
57
165
  #
58
- # Constructs a new conditional chain that **returns a conditional expression** after the chain ended.
166
+ # **Constructs** a new conditional chain that
167
+ # represents a conditional expression at end.
59
168
  #
169
+ # @example
170
+ # result = var!
171
+ # js.do! result, js.if(expr1) {
172
+ # result_expr1
173
+ # }.elsif(expr2) {
174
+ # result_expr2
175
+ # }.else {
176
+ # result_expr3
177
+ # }
178
+ # # =>
179
+ # # // The actual output will have certain immediate functions
180
+ # # // that preserve variable scope for each case.
181
+ # # var _v1;
182
+ # # _v1 = (function() {
183
+ # # if (..expr1..) {
184
+ # # return ..result_expr1..;
185
+ # # } else if (..expr2..) {
186
+ # # return ..result_expr2..;
187
+ # # } else {
188
+ # # return ..result_expr3..;
189
+ # # }
190
+ # # })()
60
191
  # @param [Jsrb::ExprChain, convertible ruby values] cond_expr an expression for the test
61
192
  # @yield new context block for the consequent case
62
193
  # @return [Jsrb::CondChain] condition chainable instance
@@ -65,9 +196,9 @@ module Jsrb
65
196
  end
66
197
 
67
198
  #
68
- # Constructs a new expression chain with a given JavaScript AST node.
199
+ # **Constructs** a new expression chain with a given JavaScript AST node.
69
200
  #
70
- # @param optional [convertible ruby values] object represents JavaScript expression AST node
201
+ # @param [convertible ruby values] object represents JavaScript expression AST node
71
202
  # @return [Jsrb::ExprChain] chainable instance
72
203
  def expr(object = nil)
73
204
  @context.new_expression(object)
@@ -75,22 +206,22 @@ module Jsrb
75
206
 
76
207
  class << self
77
208
  #
78
- # Shows JavaScript generator class name, 'Jsrb::NotFastGenerator' by default.
209
+ # Shows JavaScript generator class name, `'Jsrb::NotFastGenerator'` by default.
79
210
  #
80
211
  # ### **Help wanted!**
81
212
  #
82
213
  # *Jsrb::NotFastGenerator uses ExecJS and escodegen to generate JavaScript.
83
- # It could be more efficient and get better error messages if you
84
- # rewrite in Ruby*.
214
+ # It could be more efficient and get better error messages if we
215
+ # implement it in Ruby*.
85
216
  #
217
+ # @return [String] class name of a code generator
86
218
  def code_generator
87
219
  @code_generator || 'Jsrb::NotFastGenerator'
88
220
  end
89
221
 
90
222
  attr_writer :code_generator
91
223
 
92
- private
93
-
224
+ # @private
94
225
  def code_generator_class
95
226
  @code_generator_class ||= Object.const_get(code_generator)
96
227
  end