prism 0.27.0 → 0.29.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +45 -1
- data/config.yml +68 -44
- data/docs/configuration.md +1 -0
- data/ext/prism/api_node.c +854 -847
- data/ext/prism/extconf.rb +27 -23
- data/ext/prism/extension.c +5 -3
- data/ext/prism/extension.h +1 -1
- data/include/prism/ast.h +70 -48
- data/include/prism/diagnostic.h +23 -6
- data/include/prism/options.h +2 -2
- data/include/prism/parser.h +10 -0
- data/include/prism/static_literals.h +8 -6
- data/include/prism/version.h +2 -2
- data/lib/prism/desugar_compiler.rb +4 -4
- data/lib/prism/dot_visitor.rb +54 -38
- data/lib/prism/dsl.rb +24 -24
- data/lib/prism/ffi.rb +4 -4
- data/lib/prism/inspect_visitor.rb +2156 -0
- data/lib/prism/lex_compat.rb +1 -1
- data/lib/prism/mutation_compiler.rb +2 -2
- data/lib/prism/node.rb +737 -1863
- data/lib/prism/node_ext.rb +176 -5
- data/lib/prism/parse_result/comments.rb +1 -1
- data/lib/prism/parse_result/newlines.rb +1 -1
- data/lib/prism/parse_result.rb +78 -0
- data/lib/prism/pattern.rb +12 -6
- data/lib/prism/polyfill/byteindex.rb +13 -0
- data/lib/prism/polyfill/unpack1.rb +14 -0
- data/lib/prism/reflection.rb +20 -20
- data/lib/prism/serialize.rb +32 -15
- data/lib/prism/translation/parser/compiler.rb +156 -26
- data/lib/prism/translation/parser.rb +7 -7
- data/lib/prism/translation/ripper.rb +29 -25
- data/lib/prism/translation/ruby_parser.rb +13 -13
- data/lib/prism.rb +2 -1
- data/prism.gemspec +37 -38
- data/rbi/prism/compiler.rbi +3 -5
- data/rbi/prism/inspect_visitor.rbi +12 -0
- data/rbi/prism/node.rbi +405 -370
- data/rbi/prism/node_ext.rbi +5 -0
- data/rbi/prism/parse_result.rbi +23 -0
- data/rbi/prism/translation/ripper.rbi +1 -11
- data/sig/prism/dsl.rbs +12 -12
- data/sig/prism/inspect_visitor.rbs +22 -0
- data/sig/prism/lex_compat.rbs +10 -0
- data/sig/prism/node.rbs +108 -91
- data/sig/prism/node_ext.rbs +4 -0
- data/sig/prism/parse_result.rbs +12 -0
- data/src/diagnostic.c +66 -33
- data/src/node.c +89 -64
- data/src/options.c +2 -2
- data/src/prettyprint.c +109 -66
- data/src/prism.c +862 -317
- data/src/serialize.c +21 -18
- data/src/static_literals.c +120 -34
- data/src/token_type.c +6 -6
- metadata +8 -9
- data/lib/prism/node_inspector.rb +0 -68
- data/lib/prism/polyfill/string.rb +0 -12
- data/rbi/prism/desugar_compiler.rbi +0 -5
- data/rbi/prism/mutation_compiler.rbi +0 -5
- data/rbi/prism/translation/parser/compiler.rbi +0 -13
- data/rbi/prism/translation/ripper/ripper_compiler.rbi +0 -5
- data/rbi/prism/translation/ruby_parser.rbi +0 -11
data/lib/prism/dot_visitor.rb
CHANGED
@@ -765,11 +765,11 @@ module Prism
|
|
765
765
|
# write_name
|
766
766
|
table.field("write_name", node.write_name.inspect)
|
767
767
|
|
768
|
-
#
|
769
|
-
table.field("
|
768
|
+
# binary_operator
|
769
|
+
table.field("binary_operator", node.binary_operator.inspect)
|
770
770
|
|
771
|
-
#
|
772
|
-
table.field("
|
771
|
+
# binary_operator_loc
|
772
|
+
table.field("binary_operator_loc", location_inspect(node.binary_operator_loc))
|
773
773
|
|
774
774
|
# value
|
775
775
|
table.field("value", port: true)
|
@@ -1060,15 +1060,15 @@ module Prism
|
|
1060
1060
|
# name_loc
|
1061
1061
|
table.field("name_loc", location_inspect(node.name_loc))
|
1062
1062
|
|
1063
|
-
#
|
1064
|
-
table.field("
|
1063
|
+
# binary_operator_loc
|
1064
|
+
table.field("binary_operator_loc", location_inspect(node.binary_operator_loc))
|
1065
1065
|
|
1066
1066
|
# value
|
1067
1067
|
table.field("value", port: true)
|
1068
1068
|
digraph.edge("#{id}:value -> #{node_id(node.value)};")
|
1069
1069
|
|
1070
|
-
#
|
1071
|
-
table.field("
|
1070
|
+
# binary_operator
|
1071
|
+
table.field("binary_operator", node.binary_operator.inspect)
|
1072
1072
|
|
1073
1073
|
digraph.nodes << <<~DOT
|
1074
1074
|
#{id} [
|
@@ -1205,15 +1205,15 @@ module Prism
|
|
1205
1205
|
# name_loc
|
1206
1206
|
table.field("name_loc", location_inspect(node.name_loc))
|
1207
1207
|
|
1208
|
-
#
|
1209
|
-
table.field("
|
1208
|
+
# binary_operator_loc
|
1209
|
+
table.field("binary_operator_loc", location_inspect(node.binary_operator_loc))
|
1210
1210
|
|
1211
1211
|
# value
|
1212
1212
|
table.field("value", port: true)
|
1213
1213
|
digraph.edge("#{id}:value -> #{node_id(node.value)};")
|
1214
1214
|
|
1215
|
-
#
|
1216
|
-
table.field("
|
1215
|
+
# binary_operator
|
1216
|
+
table.field("binary_operator", node.binary_operator.inspect)
|
1217
1217
|
|
1218
1218
|
digraph.nodes << <<~DOT
|
1219
1219
|
#{id} [
|
@@ -1287,13 +1287,15 @@ module Prism
|
|
1287
1287
|
digraph.edge("#{id}:parent -> #{node_id(parent)};")
|
1288
1288
|
end
|
1289
1289
|
|
1290
|
-
#
|
1291
|
-
table.field("
|
1292
|
-
digraph.edge("#{id}:child -> #{node_id(node.child)};")
|
1290
|
+
# name
|
1291
|
+
table.field("name", node.name.inspect)
|
1293
1292
|
|
1294
1293
|
# delimiter_loc
|
1295
1294
|
table.field("delimiter_loc", location_inspect(node.delimiter_loc))
|
1296
1295
|
|
1296
|
+
# name_loc
|
1297
|
+
table.field("name_loc", location_inspect(node.name_loc))
|
1298
|
+
|
1297
1299
|
digraph.nodes << <<~DOT
|
1298
1300
|
#{id} [
|
1299
1301
|
label=<#{table.to_dot.gsub(/\n/, "\n ")}>
|
@@ -1312,15 +1314,15 @@ module Prism
|
|
1312
1314
|
table.field("target", port: true)
|
1313
1315
|
digraph.edge("#{id}:target -> #{node_id(node.target)};")
|
1314
1316
|
|
1315
|
-
#
|
1316
|
-
table.field("
|
1317
|
+
# binary_operator_loc
|
1318
|
+
table.field("binary_operator_loc", location_inspect(node.binary_operator_loc))
|
1317
1319
|
|
1318
1320
|
# value
|
1319
1321
|
table.field("value", port: true)
|
1320
1322
|
digraph.edge("#{id}:value -> #{node_id(node.value)};")
|
1321
1323
|
|
1322
|
-
#
|
1323
|
-
table.field("
|
1324
|
+
# binary_operator
|
1325
|
+
table.field("binary_operator", node.binary_operator.inspect)
|
1324
1326
|
|
1325
1327
|
digraph.nodes << <<~DOT
|
1326
1328
|
#{id} [
|
@@ -1367,13 +1369,15 @@ module Prism
|
|
1367
1369
|
digraph.edge("#{id}:parent -> #{node_id(parent)};")
|
1368
1370
|
end
|
1369
1371
|
|
1370
|
-
#
|
1371
|
-
table.field("
|
1372
|
-
digraph.edge("#{id}:child -> #{node_id(node.child)};")
|
1372
|
+
# name
|
1373
|
+
table.field("name", node.name.inspect)
|
1373
1374
|
|
1374
1375
|
# delimiter_loc
|
1375
1376
|
table.field("delimiter_loc", location_inspect(node.delimiter_loc))
|
1376
1377
|
|
1378
|
+
# name_loc
|
1379
|
+
table.field("name_loc", location_inspect(node.name_loc))
|
1380
|
+
|
1377
1381
|
digraph.nodes << <<~DOT
|
1378
1382
|
#{id} [
|
1379
1383
|
label=<#{table.to_dot.gsub(/\n/, "\n ")}>
|
@@ -1912,15 +1916,15 @@ module Prism
|
|
1912
1916
|
# name_loc
|
1913
1917
|
table.field("name_loc", location_inspect(node.name_loc))
|
1914
1918
|
|
1915
|
-
#
|
1916
|
-
table.field("
|
1919
|
+
# binary_operator_loc
|
1920
|
+
table.field("binary_operator_loc", location_inspect(node.binary_operator_loc))
|
1917
1921
|
|
1918
1922
|
# value
|
1919
1923
|
table.field("value", port: true)
|
1920
1924
|
digraph.edge("#{id}:value -> #{node_id(node.value)};")
|
1921
1925
|
|
1922
|
-
#
|
1923
|
-
table.field("
|
1926
|
+
# binary_operator
|
1927
|
+
table.field("binary_operator", node.binary_operator.inspect)
|
1924
1928
|
|
1925
1929
|
digraph.nodes << <<~DOT
|
1926
1930
|
#{id} [
|
@@ -2318,11 +2322,11 @@ module Prism
|
|
2318
2322
|
digraph.edge("#{id}:block -> #{node_id(block)};")
|
2319
2323
|
end
|
2320
2324
|
|
2321
|
-
#
|
2322
|
-
table.field("
|
2325
|
+
# binary_operator
|
2326
|
+
table.field("binary_operator", node.binary_operator.inspect)
|
2323
2327
|
|
2324
|
-
#
|
2325
|
-
table.field("
|
2328
|
+
# binary_operator_loc
|
2329
|
+
table.field("binary_operator_loc", location_inspect(node.binary_operator_loc))
|
2326
2330
|
|
2327
2331
|
# value
|
2328
2332
|
table.field("value", port: true)
|
@@ -2467,15 +2471,15 @@ module Prism
|
|
2467
2471
|
# name_loc
|
2468
2472
|
table.field("name_loc", location_inspect(node.name_loc))
|
2469
2473
|
|
2470
|
-
#
|
2471
|
-
table.field("
|
2474
|
+
# binary_operator_loc
|
2475
|
+
table.field("binary_operator_loc", location_inspect(node.binary_operator_loc))
|
2472
2476
|
|
2473
2477
|
# value
|
2474
2478
|
table.field("value", port: true)
|
2475
2479
|
digraph.edge("#{id}:value -> #{node_id(node.value)};")
|
2476
2480
|
|
2477
|
-
#
|
2478
|
-
table.field("
|
2481
|
+
# binary_operator
|
2482
|
+
table.field("binary_operator", node.binary_operator.inspect)
|
2479
2483
|
|
2480
2484
|
digraph.nodes << <<~DOT
|
2481
2485
|
#{id} [
|
@@ -2924,8 +2928,8 @@ module Prism
|
|
2924
2928
|
# name_loc
|
2925
2929
|
table.field("name_loc", location_inspect(node.name_loc))
|
2926
2930
|
|
2927
|
-
#
|
2928
|
-
table.field("
|
2931
|
+
# binary_operator_loc
|
2932
|
+
table.field("binary_operator_loc", location_inspect(node.binary_operator_loc))
|
2929
2933
|
|
2930
2934
|
# value
|
2931
2935
|
table.field("value", port: true)
|
@@ -2934,8 +2938,8 @@ module Prism
|
|
2934
2938
|
# name
|
2935
2939
|
table.field("name", node.name.inspect)
|
2936
2940
|
|
2937
|
-
#
|
2938
|
-
table.field("
|
2941
|
+
# binary_operator
|
2942
|
+
table.field("binary_operator", node.binary_operator.inspect)
|
2939
2943
|
|
2940
2944
|
# depth
|
2941
2945
|
table.field("depth", node.depth.inspect)
|
@@ -3999,6 +4003,9 @@ module Prism
|
|
3999
4003
|
table = Table.new("ReturnNode")
|
4000
4004
|
id = node_id(node)
|
4001
4005
|
|
4006
|
+
# flags
|
4007
|
+
table.field("flags", return_node_flags_inspect(node))
|
4008
|
+
|
4002
4009
|
# keyword_loc
|
4003
4010
|
table.field("keyword_loc", location_inspect(node.keyword_loc))
|
4004
4011
|
|
@@ -4569,6 +4576,7 @@ module Prism
|
|
4569
4576
|
# comma-separated list.
|
4570
4577
|
def arguments_node_flags_inspect(node)
|
4571
4578
|
flags = [] #: Array[String]
|
4579
|
+
flags << "contains_keywords" if node.contains_keywords?
|
4572
4580
|
flags << "contains_keyword_splat" if node.contains_keyword_splat?
|
4573
4581
|
flags.join(", ")
|
4574
4582
|
end
|
@@ -4671,6 +4679,14 @@ module Prism
|
|
4671
4679
|
flags.join(", ")
|
4672
4680
|
end
|
4673
4681
|
|
4682
|
+
# Inspect a node that has return_node_flags flags to display the flags as a
|
4683
|
+
# comma-separated list.
|
4684
|
+
def return_node_flags_inspect(node)
|
4685
|
+
flags = [] #: Array[String]
|
4686
|
+
flags << "redundant" if node.redundant?
|
4687
|
+
flags.join(", ")
|
4688
|
+
end
|
4689
|
+
|
4674
4690
|
# Inspect a node that has shareable_constant_node_flags flags to display the flags as a
|
4675
4691
|
# comma-separated list.
|
4676
4692
|
def shareable_constant_node_flags_inspect(node)
|
data/lib/prism/dsl.rb
CHANGED
@@ -10,7 +10,7 @@ module Prism
|
|
10
10
|
# The DSL module provides a set of methods that can be used to create prism
|
11
11
|
# nodes in a more concise manner. For example, instead of writing:
|
12
12
|
#
|
13
|
-
# source = Prism::Source.
|
13
|
+
# source = Prism::Source.for("[1]")
|
14
14
|
#
|
15
15
|
# Prism::ArrayNode.new(
|
16
16
|
# [
|
@@ -28,7 +28,7 @@ module Prism
|
|
28
28
|
#
|
29
29
|
# you could instead write:
|
30
30
|
#
|
31
|
-
# source = Prism::Source.
|
31
|
+
# source = Prism::Source.for("[1]")
|
32
32
|
#
|
33
33
|
# ArrayNode(
|
34
34
|
# IntegerNode(Prism::IntegerBaseFlags::DECIMAL, 1, Location(source, 1, 1)), source),
|
@@ -143,8 +143,8 @@ module Prism
|
|
143
143
|
end
|
144
144
|
|
145
145
|
# Create a new CallOperatorWriteNode node
|
146
|
-
def CallOperatorWriteNode(flags, receiver, call_operator_loc, message_loc, read_name, write_name,
|
147
|
-
CallOperatorWriteNode.new(source, flags, receiver, call_operator_loc, message_loc, read_name, write_name,
|
146
|
+
def CallOperatorWriteNode(flags, receiver, call_operator_loc, message_loc, read_name, write_name, binary_operator, binary_operator_loc, value, source = nil, location = Location())
|
147
|
+
CallOperatorWriteNode.new(source, flags, receiver, call_operator_loc, message_loc, read_name, write_name, binary_operator, binary_operator_loc, value, location)
|
148
148
|
end
|
149
149
|
|
150
150
|
# Create a new CallOrWriteNode node
|
@@ -183,8 +183,8 @@ module Prism
|
|
183
183
|
end
|
184
184
|
|
185
185
|
# Create a new ClassVariableOperatorWriteNode node
|
186
|
-
def ClassVariableOperatorWriteNode(name, name_loc,
|
187
|
-
ClassVariableOperatorWriteNode.new(source, name, name_loc,
|
186
|
+
def ClassVariableOperatorWriteNode(name, name_loc, binary_operator_loc, value, binary_operator, source = nil, location = Location())
|
187
|
+
ClassVariableOperatorWriteNode.new(source, name, name_loc, binary_operator_loc, value, binary_operator, location)
|
188
188
|
end
|
189
189
|
|
190
190
|
# Create a new ClassVariableOrWriteNode node
|
@@ -213,8 +213,8 @@ module Prism
|
|
213
213
|
end
|
214
214
|
|
215
215
|
# Create a new ConstantOperatorWriteNode node
|
216
|
-
def ConstantOperatorWriteNode(name, name_loc,
|
217
|
-
ConstantOperatorWriteNode.new(source, name, name_loc,
|
216
|
+
def ConstantOperatorWriteNode(name, name_loc, binary_operator_loc, value, binary_operator, source = nil, location = Location())
|
217
|
+
ConstantOperatorWriteNode.new(source, name, name_loc, binary_operator_loc, value, binary_operator, location)
|
218
218
|
end
|
219
219
|
|
220
220
|
# Create a new ConstantOrWriteNode node
|
@@ -228,13 +228,13 @@ module Prism
|
|
228
228
|
end
|
229
229
|
|
230
230
|
# Create a new ConstantPathNode node
|
231
|
-
def ConstantPathNode(parent,
|
232
|
-
ConstantPathNode.new(source, parent,
|
231
|
+
def ConstantPathNode(parent, name, delimiter_loc, name_loc, source = nil, location = Location())
|
232
|
+
ConstantPathNode.new(source, parent, name, delimiter_loc, name_loc, location)
|
233
233
|
end
|
234
234
|
|
235
235
|
# Create a new ConstantPathOperatorWriteNode node
|
236
|
-
def ConstantPathOperatorWriteNode(target,
|
237
|
-
ConstantPathOperatorWriteNode.new(source, target,
|
236
|
+
def ConstantPathOperatorWriteNode(target, binary_operator_loc, value, binary_operator, source = nil, location = Location())
|
237
|
+
ConstantPathOperatorWriteNode.new(source, target, binary_operator_loc, value, binary_operator, location)
|
238
238
|
end
|
239
239
|
|
240
240
|
# Create a new ConstantPathOrWriteNode node
|
@@ -243,8 +243,8 @@ module Prism
|
|
243
243
|
end
|
244
244
|
|
245
245
|
# Create a new ConstantPathTargetNode node
|
246
|
-
def ConstantPathTargetNode(parent,
|
247
|
-
ConstantPathTargetNode.new(source, parent,
|
246
|
+
def ConstantPathTargetNode(parent, name, delimiter_loc, name_loc, source = nil, location = Location())
|
247
|
+
ConstantPathTargetNode.new(source, parent, name, delimiter_loc, name_loc, location)
|
248
248
|
end
|
249
249
|
|
250
250
|
# Create a new ConstantPathWriteNode node
|
@@ -343,8 +343,8 @@ module Prism
|
|
343
343
|
end
|
344
344
|
|
345
345
|
# Create a new GlobalVariableOperatorWriteNode node
|
346
|
-
def GlobalVariableOperatorWriteNode(name, name_loc,
|
347
|
-
GlobalVariableOperatorWriteNode.new(source, name, name_loc,
|
346
|
+
def GlobalVariableOperatorWriteNode(name, name_loc, binary_operator_loc, value, binary_operator, source = nil, location = Location())
|
347
|
+
GlobalVariableOperatorWriteNode.new(source, name, name_loc, binary_operator_loc, value, binary_operator, location)
|
348
348
|
end
|
349
349
|
|
350
350
|
# Create a new GlobalVariableOrWriteNode node
|
@@ -408,8 +408,8 @@ module Prism
|
|
408
408
|
end
|
409
409
|
|
410
410
|
# Create a new IndexOperatorWriteNode node
|
411
|
-
def IndexOperatorWriteNode(flags, receiver, call_operator_loc, opening_loc, arguments, closing_loc, block,
|
412
|
-
IndexOperatorWriteNode.new(source, flags, receiver, call_operator_loc, opening_loc, arguments, closing_loc, block,
|
411
|
+
def IndexOperatorWriteNode(flags, receiver, call_operator_loc, opening_loc, arguments, closing_loc, block, binary_operator, binary_operator_loc, value, source = nil, location = Location())
|
412
|
+
IndexOperatorWriteNode.new(source, flags, receiver, call_operator_loc, opening_loc, arguments, closing_loc, block, binary_operator, binary_operator_loc, value, location)
|
413
413
|
end
|
414
414
|
|
415
415
|
# Create a new IndexOrWriteNode node
|
@@ -428,8 +428,8 @@ module Prism
|
|
428
428
|
end
|
429
429
|
|
430
430
|
# Create a new InstanceVariableOperatorWriteNode node
|
431
|
-
def InstanceVariableOperatorWriteNode(name, name_loc,
|
432
|
-
InstanceVariableOperatorWriteNode.new(source, name, name_loc,
|
431
|
+
def InstanceVariableOperatorWriteNode(name, name_loc, binary_operator_loc, value, binary_operator, source = nil, location = Location())
|
432
|
+
InstanceVariableOperatorWriteNode.new(source, name, name_loc, binary_operator_loc, value, binary_operator, location)
|
433
433
|
end
|
434
434
|
|
435
435
|
# Create a new InstanceVariableOrWriteNode node
|
@@ -508,8 +508,8 @@ module Prism
|
|
508
508
|
end
|
509
509
|
|
510
510
|
# Create a new LocalVariableOperatorWriteNode node
|
511
|
-
def LocalVariableOperatorWriteNode(name_loc,
|
512
|
-
LocalVariableOperatorWriteNode.new(source, name_loc,
|
511
|
+
def LocalVariableOperatorWriteNode(name_loc, binary_operator_loc, value, name, binary_operator, depth, source = nil, location = Location())
|
512
|
+
LocalVariableOperatorWriteNode.new(source, name_loc, binary_operator_loc, value, name, binary_operator, depth, location)
|
513
513
|
end
|
514
514
|
|
515
515
|
# Create a new LocalVariableOrWriteNode node
|
@@ -698,8 +698,8 @@ module Prism
|
|
698
698
|
end
|
699
699
|
|
700
700
|
# Create a new ReturnNode node
|
701
|
-
def ReturnNode(keyword_loc, arguments, source = nil, location = Location())
|
702
|
-
ReturnNode.new(source, keyword_loc, arguments, location)
|
701
|
+
def ReturnNode(flags, keyword_loc, arguments, source = nil, location = Location())
|
702
|
+
ReturnNode.new(source, flags, keyword_loc, arguments, location)
|
703
703
|
end
|
704
704
|
|
705
705
|
# Create a new SelfNode node
|
data/lib/prism/ffi.rb
CHANGED
@@ -317,7 +317,7 @@ module Prism
|
|
317
317
|
buffer.read
|
318
318
|
end
|
319
319
|
|
320
|
-
Serialize.load_tokens(Source.
|
320
|
+
Serialize.load_tokens(Source.for(code), serialized)
|
321
321
|
end
|
322
322
|
|
323
323
|
def parse_common(string, code, options) # :nodoc:
|
@@ -329,7 +329,7 @@ module Prism
|
|
329
329
|
LibRubyParser::PrismBuffer.with do |buffer|
|
330
330
|
LibRubyParser.pm_serialize_parse_comments(buffer.pointer, string.pointer, string.length, dump_options(options))
|
331
331
|
|
332
|
-
source = Source.
|
332
|
+
source = Source.for(code)
|
333
333
|
loader = Serialize::Loader.new(source, buffer.read)
|
334
334
|
|
335
335
|
loader.load_header
|
@@ -343,7 +343,7 @@ module Prism
|
|
343
343
|
LibRubyParser::PrismBuffer.with do |buffer|
|
344
344
|
LibRubyParser.pm_serialize_parse_lex(buffer.pointer, string.pointer, string.length, dump_options(options))
|
345
345
|
|
346
|
-
source = Source.
|
346
|
+
source = Source.for(code)
|
347
347
|
loader = Serialize::Loader.new(source, buffer.read)
|
348
348
|
|
349
349
|
tokens = loader.load_tokens
|
@@ -408,7 +408,7 @@ module Prism
|
|
408
408
|
values << dump_options_command_line(options)
|
409
409
|
|
410
410
|
template << "C"
|
411
|
-
values << { nil => 0, "3.3.0" => 1, "3.4.0" => 0, "latest" => 0 }.fetch(options[:version])
|
411
|
+
values << { nil => 0, "3.3.0" => 1, "3.3.1" => 1, "3.4.0" => 0, "latest" => 0 }.fetch(options[:version])
|
412
412
|
|
413
413
|
template << "L"
|
414
414
|
if (scopes = options[:scopes])
|