prism 0.19.0 → 0.20.0
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/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
|