prism 0.19.0 → 0.20.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 +29 -1
- data/Makefile +5 -0
- data/README.md +8 -6
- data/config.yml +236 -38
- data/docs/build_system.md +19 -2
- data/docs/cruby_compilation.md +27 -0
- data/docs/parser_translation.md +34 -0
- data/docs/parsing_rules.md +19 -0
- data/docs/releasing.md +3 -3
- data/docs/ruby_api.md +1 -1
- data/docs/serialization.md +17 -5
- data/ext/prism/api_node.c +101 -81
- data/ext/prism/extension.c +74 -11
- data/ext/prism/extension.h +1 -1
- data/include/prism/ast.h +1699 -504
- data/include/prism/defines.h +8 -0
- data/include/prism/diagnostic.h +39 -2
- data/include/prism/encoding.h +10 -0
- data/include/prism/options.h +40 -14
- data/include/prism/parser.h +33 -17
- data/include/prism/util/pm_buffer.h +9 -0
- data/include/prism/util/pm_constant_pool.h +7 -0
- data/include/prism/util/pm_newline_list.h +0 -11
- data/include/prism/version.h +2 -2
- data/include/prism.h +19 -2
- data/lib/prism/debug.rb +11 -5
- data/lib/prism/dot_visitor.rb +36 -14
- data/lib/prism/dsl.rb +22 -22
- data/lib/prism/ffi.rb +2 -2
- data/lib/prism/node.rb +1020 -737
- data/lib/prism/node_ext.rb +2 -2
- data/lib/prism/parse_result.rb +17 -9
- data/lib/prism/serialize.rb +53 -29
- data/lib/prism/translation/parser/compiler.rb +1831 -0
- data/lib/prism/translation/parser/lexer.rb +335 -0
- data/lib/prism/translation/parser/rubocop.rb +37 -0
- data/lib/prism/translation/parser.rb +163 -0
- data/lib/prism/translation.rb +11 -0
- data/lib/prism.rb +1 -0
- data/prism.gemspec +12 -5
- data/rbi/prism.rbi +150 -88
- data/rbi/prism_static.rbi +15 -3
- data/sig/prism.rbs +996 -961
- data/sig/prism_static.rbs +123 -46
- data/src/diagnostic.c +259 -219
- data/src/encoding.c +4 -8
- data/src/node.c +2 -6
- data/src/options.c +24 -5
- data/src/prettyprint.c +174 -42
- data/src/prism.c +1136 -328
- data/src/serialize.c +12 -9
- data/src/token_type.c +353 -4
- data/src/util/pm_buffer.c +11 -0
- data/src/util/pm_constant_pool.c +12 -11
- data/src/util/pm_newline_list.c +2 -14
- metadata +10 -3
- data/docs/building.md +0 -29
data/lib/prism/node_ext.rb
CHANGED
@@ -81,7 +81,7 @@ module Prism
|
|
81
81
|
class RationalNode < Node
|
82
82
|
# Returns the value of the node as a Ruby Rational.
|
83
83
|
def value
|
84
|
-
Rational(slice.chomp("r"))
|
84
|
+
Rational(numeric.is_a?(IntegerNode) ? numeric.value : slice.chomp("r"))
|
85
85
|
end
|
86
86
|
end
|
87
87
|
|
@@ -118,7 +118,7 @@ module Prism
|
|
118
118
|
current = current.parent
|
119
119
|
end
|
120
120
|
|
121
|
-
|
121
|
+
if !current.is_a?(ConstantReadNode) && !current.nil?
|
122
122
|
raise DynamicPartsInConstantPathError, "Constant path contains dynamic parts. Cannot compute full name"
|
123
123
|
end
|
124
124
|
|
data/lib/prism/parse_result.rb
CHANGED
@@ -312,20 +312,24 @@ module Prism
|
|
312
312
|
# A Location object representing the location of this error in the source.
|
313
313
|
attr_reader :location
|
314
314
|
|
315
|
+
# The level of this error.
|
316
|
+
attr_reader :level
|
317
|
+
|
315
318
|
# Create a new error object with the given message and location.
|
316
|
-
def initialize(message, location)
|
319
|
+
def initialize(message, location, level)
|
317
320
|
@message = message
|
318
321
|
@location = location
|
322
|
+
@level = level
|
319
323
|
end
|
320
324
|
|
321
325
|
# Implement the hash pattern matching interface for ParseError.
|
322
326
|
def deconstruct_keys(keys)
|
323
|
-
{ message: message, location: location }
|
327
|
+
{ message: message, location: location, level: level }
|
324
328
|
end
|
325
329
|
|
326
330
|
# Returns a string representation of this error.
|
327
331
|
def inspect
|
328
|
-
"#<Prism::ParseError @message=#{@message.inspect} @location=#{@location.inspect}>"
|
332
|
+
"#<Prism::ParseError @message=#{@message.inspect} @location=#{@location.inspect} @level=#{@level.inspect}>"
|
329
333
|
end
|
330
334
|
end
|
331
335
|
|
@@ -337,20 +341,24 @@ module Prism
|
|
337
341
|
# A Location object representing the location of this warning in the source.
|
338
342
|
attr_reader :location
|
339
343
|
|
344
|
+
# The level of this warning.
|
345
|
+
attr_reader :level
|
346
|
+
|
340
347
|
# Create a new warning object with the given message and location.
|
341
|
-
def initialize(message, location)
|
348
|
+
def initialize(message, location, level)
|
342
349
|
@message = message
|
343
350
|
@location = location
|
351
|
+
@level = level
|
344
352
|
end
|
345
353
|
|
346
354
|
# Implement the hash pattern matching interface for ParseWarning.
|
347
355
|
def deconstruct_keys(keys)
|
348
|
-
{ message: message, location: location }
|
356
|
+
{ message: message, location: location, level: level }
|
349
357
|
end
|
350
358
|
|
351
359
|
# Returns a string representation of this warning.
|
352
360
|
def inspect
|
353
|
-
"#<Prism::ParseWarning @message=#{@message.inspect} @location=#{@location.inspect}>"
|
361
|
+
"#<Prism::ParseWarning @message=#{@message.inspect} @location=#{@location.inspect} @level=#{@level.inspect}>"
|
354
362
|
end
|
355
363
|
end
|
356
364
|
|
@@ -369,9 +377,9 @@ module Prism
|
|
369
377
|
# The list of magic comments that were encountered during parsing.
|
370
378
|
attr_reader :magic_comments
|
371
379
|
|
372
|
-
# An optional location that represents the location of the
|
373
|
-
#
|
374
|
-
# file being parsed is the main file being executed.
|
380
|
+
# An optional location that represents the location of the __END__ marker
|
381
|
+
# and the rest of the content of the file. This content is loaded into the
|
382
|
+
# DATA constant when the file being parsed is the main file being executed.
|
375
383
|
attr_reader :data_loc
|
376
384
|
|
377
385
|
# The list of errors that were generated during parsing.
|
data/lib/prism/serialize.rb
CHANGED
@@ -27,7 +27,7 @@ module Prism
|
|
27
27
|
|
28
28
|
# The minor version of prism that we are expecting to find in the serialized
|
29
29
|
# strings.
|
30
|
-
MINOR_VERSION =
|
30
|
+
MINOR_VERSION = 20
|
31
31
|
|
32
32
|
# The patch version of prism that we are expecting to find in the serialized
|
33
33
|
# strings.
|
@@ -103,8 +103,8 @@ module Prism
|
|
103
103
|
comments = load_comments
|
104
104
|
magic_comments = load_varuint.times.map { MagicComment.new(load_location, load_location) }
|
105
105
|
data_loc = load_optional_location
|
106
|
-
errors = load_varuint.times.map { ParseError.new(load_embedded_string, load_location) }
|
107
|
-
warnings = load_varuint.times.map { ParseWarning.new(load_embedded_string, load_location) }
|
106
|
+
errors = load_varuint.times.map { ParseError.new(load_embedded_string, load_location, load_error_level) }
|
107
|
+
warnings = load_varuint.times.map { ParseWarning.new(load_embedded_string, load_location, load_warning_level) }
|
108
108
|
[comments, magic_comments, data_loc, errors, warnings]
|
109
109
|
end
|
110
110
|
|
@@ -218,9 +218,9 @@ module Prism
|
|
218
218
|
|
219
219
|
constant =
|
220
220
|
if start.nobits?(1 << 31)
|
221
|
-
input.byteslice(start, length).to_sym
|
221
|
+
input.byteslice(start, length).force_encoding(@encoding).to_sym
|
222
222
|
else
|
223
|
-
serialized.byteslice(start & ((1 << 31) - 1), length).to_sym
|
223
|
+
serialized.byteslice(start & ((1 << 31) - 1), length).force_encoding(@encoding).to_sym
|
224
224
|
end
|
225
225
|
|
226
226
|
constant_pool[index] = constant
|
@@ -238,6 +238,30 @@ module Prism
|
|
238
238
|
load_constant(index - 1) if index != 0
|
239
239
|
end
|
240
240
|
|
241
|
+
def load_error_level
|
242
|
+
level = io.getbyte
|
243
|
+
|
244
|
+
case level
|
245
|
+
when 0
|
246
|
+
:fatal
|
247
|
+
else
|
248
|
+
raise "Unknown level: #{level}"
|
249
|
+
end
|
250
|
+
end
|
251
|
+
|
252
|
+
def load_warning_level
|
253
|
+
level = io.getbyte
|
254
|
+
|
255
|
+
case level
|
256
|
+
when 0
|
257
|
+
:default
|
258
|
+
when 1
|
259
|
+
:verbose
|
260
|
+
else
|
261
|
+
raise "Unknown level: #{level}"
|
262
|
+
end
|
263
|
+
end
|
264
|
+
|
241
265
|
if RUBY_ENGINE == 'ruby'
|
242
266
|
def load_node
|
243
267
|
type = io.getbyte
|
@@ -259,7 +283,7 @@ module Prism
|
|
259
283
|
when 7 then
|
260
284
|
ArrayPatternNode.new(load_optional_node, Array.new(load_varuint) { load_node }, load_optional_node, Array.new(load_varuint) { load_node }, load_optional_location, load_optional_location, location)
|
261
285
|
when 8 then
|
262
|
-
AssocNode.new(load_node,
|
286
|
+
AssocNode.new(load_node, load_node, load_optional_location, location)
|
263
287
|
when 9 then
|
264
288
|
AssocSplatNode.new(load_optional_node, load_location, location)
|
265
289
|
when 10 then
|
@@ -269,11 +293,11 @@ module Prism
|
|
269
293
|
when 12 then
|
270
294
|
BlockArgumentNode.new(load_optional_node, load_location, location)
|
271
295
|
when 13 then
|
272
|
-
BlockLocalVariableNode.new(load_required_constant, location)
|
296
|
+
BlockLocalVariableNode.new(load_varuint, load_required_constant, location)
|
273
297
|
when 14 then
|
274
|
-
BlockNode.new(Array.new(load_varuint) { load_required_constant },
|
298
|
+
BlockNode.new(Array.new(load_varuint) { load_required_constant }, load_optional_node, load_optional_node, load_location, load_location, location)
|
275
299
|
when 15 then
|
276
|
-
BlockParameterNode.new(load_optional_constant, load_optional_location, load_location, location)
|
300
|
+
BlockParameterNode.new(load_varuint, load_optional_constant, load_optional_location, load_location, location)
|
277
301
|
when 16 then
|
278
302
|
BlockParametersNode.new(load_optional_node, Array.new(load_varuint) { load_node }, load_optional_location, load_optional_location, location)
|
279
303
|
when 17 then
|
@@ -334,7 +358,7 @@ module Prism
|
|
334
358
|
ConstantWriteNode.new(load_required_constant, load_location, load_node, load_location, location)
|
335
359
|
when 45 then
|
336
360
|
load_serialized_length
|
337
|
-
DefNode.new(load_required_constant, load_location, load_optional_node, load_optional_node, load_optional_node, Array.new(load_varuint) { load_required_constant },
|
361
|
+
DefNode.new(load_required_constant, load_location, load_optional_node, load_optional_node, load_optional_node, Array.new(load_varuint) { load_required_constant }, load_location, load_optional_location, load_optional_location, load_optional_location, load_optional_location, load_optional_location, location)
|
338
362
|
when 46 then
|
339
363
|
DefinedNode.new(load_optional_location, load_node, load_optional_location, load_location, location)
|
340
364
|
when 47 then
|
@@ -422,9 +446,9 @@ module Prism
|
|
422
446
|
when 88 then
|
423
447
|
KeywordHashNode.new(load_varuint, Array.new(load_varuint) { load_node }, location)
|
424
448
|
when 89 then
|
425
|
-
KeywordRestParameterNode.new(load_optional_constant, load_optional_location, load_location, location)
|
449
|
+
KeywordRestParameterNode.new(load_varuint, load_optional_constant, load_optional_location, load_location, location)
|
426
450
|
when 90 then
|
427
|
-
LambdaNode.new(Array.new(load_varuint) { load_required_constant },
|
451
|
+
LambdaNode.new(Array.new(load_varuint) { load_required_constant }, load_location, load_location, load_location, load_optional_node, load_optional_node, location)
|
428
452
|
when 91 then
|
429
453
|
LocalVariableAndWriteNode.new(load_location, load_location, load_node, load_required_constant, load_varuint, location)
|
430
454
|
when 92 then
|
@@ -464,9 +488,9 @@ module Prism
|
|
464
488
|
when 109 then
|
465
489
|
NumberedReferenceReadNode.new(load_varuint, location)
|
466
490
|
when 110 then
|
467
|
-
OptionalKeywordParameterNode.new(load_required_constant, load_location, load_node, location)
|
491
|
+
OptionalKeywordParameterNode.new(load_varuint, load_required_constant, load_location, load_node, location)
|
468
492
|
when 111 then
|
469
|
-
OptionalParameterNode.new(load_required_constant, load_location, load_location, load_node, location)
|
493
|
+
OptionalParameterNode.new(load_varuint, load_required_constant, load_location, load_location, load_node, location)
|
470
494
|
when 112 then
|
471
495
|
OrNode.new(load_node, load_node, load_location, location)
|
472
496
|
when 113 then
|
@@ -492,15 +516,15 @@ module Prism
|
|
492
516
|
when 123 then
|
493
517
|
RegularExpressionNode.new(load_varuint, load_location, load_location, load_location, load_string, location)
|
494
518
|
when 124 then
|
495
|
-
RequiredKeywordParameterNode.new(load_required_constant, load_location, location)
|
519
|
+
RequiredKeywordParameterNode.new(load_varuint, load_required_constant, load_location, location)
|
496
520
|
when 125 then
|
497
|
-
RequiredParameterNode.new(load_required_constant, location)
|
521
|
+
RequiredParameterNode.new(load_varuint, load_required_constant, location)
|
498
522
|
when 126 then
|
499
523
|
RescueModifierNode.new(load_node, load_location, load_node, location)
|
500
524
|
when 127 then
|
501
525
|
RescueNode.new(load_location, Array.new(load_varuint) { load_node }, load_optional_location, load_optional_node, load_optional_node, load_optional_node, location)
|
502
526
|
when 128 then
|
503
|
-
RestParameterNode.new(load_optional_constant, load_optional_location, load_location, location)
|
527
|
+
RestParameterNode.new(load_varuint, load_optional_constant, load_optional_location, load_location, location)
|
504
528
|
when 129 then
|
505
529
|
RetryNode.new(location)
|
506
530
|
when 130 then
|
@@ -582,7 +606,7 @@ module Prism
|
|
582
606
|
},
|
583
607
|
-> {
|
584
608
|
location = load_location
|
585
|
-
AssocNode.new(load_node,
|
609
|
+
AssocNode.new(load_node, load_node, load_optional_location, location)
|
586
610
|
},
|
587
611
|
-> {
|
588
612
|
location = load_location
|
@@ -602,15 +626,15 @@ module Prism
|
|
602
626
|
},
|
603
627
|
-> {
|
604
628
|
location = load_location
|
605
|
-
BlockLocalVariableNode.new(load_required_constant, location)
|
629
|
+
BlockLocalVariableNode.new(load_varuint, load_required_constant, location)
|
606
630
|
},
|
607
631
|
-> {
|
608
632
|
location = load_location
|
609
|
-
BlockNode.new(Array.new(load_varuint) { load_required_constant },
|
633
|
+
BlockNode.new(Array.new(load_varuint) { load_required_constant }, load_optional_node, load_optional_node, load_location, load_location, location)
|
610
634
|
},
|
611
635
|
-> {
|
612
636
|
location = load_location
|
613
|
-
BlockParameterNode.new(load_optional_constant, load_optional_location, load_location, location)
|
637
|
+
BlockParameterNode.new(load_varuint, load_optional_constant, load_optional_location, load_location, location)
|
614
638
|
},
|
615
639
|
-> {
|
616
640
|
location = load_location
|
@@ -731,7 +755,7 @@ module Prism
|
|
731
755
|
-> {
|
732
756
|
location = load_location
|
733
757
|
load_serialized_length
|
734
|
-
DefNode.new(load_required_constant, load_location, load_optional_node, load_optional_node, load_optional_node, Array.new(load_varuint) { load_required_constant },
|
758
|
+
DefNode.new(load_required_constant, load_location, load_optional_node, load_optional_node, load_optional_node, Array.new(load_varuint) { load_required_constant }, load_location, load_optional_location, load_optional_location, load_optional_location, load_optional_location, load_optional_location, location)
|
735
759
|
},
|
736
760
|
-> {
|
737
761
|
location = load_location
|
@@ -907,11 +931,11 @@ module Prism
|
|
907
931
|
},
|
908
932
|
-> {
|
909
933
|
location = load_location
|
910
|
-
KeywordRestParameterNode.new(load_optional_constant, load_optional_location, load_location, location)
|
934
|
+
KeywordRestParameterNode.new(load_varuint, load_optional_constant, load_optional_location, load_location, location)
|
911
935
|
},
|
912
936
|
-> {
|
913
937
|
location = load_location
|
914
|
-
LambdaNode.new(Array.new(load_varuint) { load_required_constant },
|
938
|
+
LambdaNode.new(Array.new(load_varuint) { load_required_constant }, load_location, load_location, load_location, load_optional_node, load_optional_node, location)
|
915
939
|
},
|
916
940
|
-> {
|
917
941
|
location = load_location
|
@@ -991,11 +1015,11 @@ module Prism
|
|
991
1015
|
},
|
992
1016
|
-> {
|
993
1017
|
location = load_location
|
994
|
-
OptionalKeywordParameterNode.new(load_required_constant, load_location, load_node, location)
|
1018
|
+
OptionalKeywordParameterNode.new(load_varuint, load_required_constant, load_location, load_node, location)
|
995
1019
|
},
|
996
1020
|
-> {
|
997
1021
|
location = load_location
|
998
|
-
OptionalParameterNode.new(load_required_constant, load_location, load_location, load_node, location)
|
1022
|
+
OptionalParameterNode.new(load_varuint, load_required_constant, load_location, load_location, load_node, location)
|
999
1023
|
},
|
1000
1024
|
-> {
|
1001
1025
|
location = load_location
|
@@ -1047,11 +1071,11 @@ module Prism
|
|
1047
1071
|
},
|
1048
1072
|
-> {
|
1049
1073
|
location = load_location
|
1050
|
-
RequiredKeywordParameterNode.new(load_required_constant, load_location, location)
|
1074
|
+
RequiredKeywordParameterNode.new(load_varuint, load_required_constant, load_location, location)
|
1051
1075
|
},
|
1052
1076
|
-> {
|
1053
1077
|
location = load_location
|
1054
|
-
RequiredParameterNode.new(load_required_constant, location)
|
1078
|
+
RequiredParameterNode.new(load_varuint, load_required_constant, location)
|
1055
1079
|
},
|
1056
1080
|
-> {
|
1057
1081
|
location = load_location
|
@@ -1063,7 +1087,7 @@ module Prism
|
|
1063
1087
|
},
|
1064
1088
|
-> {
|
1065
1089
|
location = load_location
|
1066
|
-
RestParameterNode.new(load_optional_constant, load_optional_location, load_location, location)
|
1090
|
+
RestParameterNode.new(load_varuint, load_optional_constant, load_optional_location, load_location, location)
|
1067
1091
|
},
|
1068
1092
|
-> {
|
1069
1093
|
location = load_location
|