prism 0.29.0 → 0.30.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 +22 -1
- data/CONTRIBUTING.md +0 -4
- data/README.md +1 -0
- data/config.yml +66 -9
- data/docs/fuzzing.md +1 -1
- data/docs/ripper_translation.md +22 -0
- data/ext/prism/api_node.c +30 -12
- data/ext/prism/extension.c +107 -372
- data/ext/prism/extension.h +1 -1
- data/include/prism/ast.h +138 -70
- data/include/prism/diagnostic.h +7 -2
- data/include/prism/node.h +0 -21
- data/include/prism/parser.h +23 -25
- data/include/prism/regexp.h +17 -8
- data/include/prism/static_literals.h +3 -2
- data/include/prism/util/pm_char.h +1 -2
- data/include/prism/util/pm_constant_pool.h +0 -8
- data/include/prism/util/pm_integer.h +16 -9
- data/include/prism/util/pm_string.h +0 -8
- data/include/prism/version.h +2 -2
- data/include/prism.h +0 -11
- data/lib/prism/compiler.rb +3 -0
- data/lib/prism/dispatcher.rb +14 -0
- data/lib/prism/dot_visitor.rb +22 -3
- data/lib/prism/dsl.rb +7 -2
- data/lib/prism/ffi.rb +24 -3
- data/lib/prism/inspect_visitor.rb +10 -8
- data/lib/prism/mutation_compiler.rb +6 -1
- data/lib/prism/node.rb +166 -241
- data/lib/prism/node_ext.rb +21 -5
- data/lib/prism/parse_result/comments.rb +0 -7
- data/lib/prism/parse_result/newlines.rb +101 -11
- data/lib/prism/parse_result.rb +17 -0
- data/lib/prism/reflection.rb +3 -1
- data/lib/prism/serialize.rb +80 -67
- data/lib/prism/translation/parser/compiler.rb +134 -114
- data/lib/prism/translation/parser.rb +6 -1
- data/lib/prism/translation/ripper.rb +8 -6
- data/lib/prism/translation/ruby_parser.rb +23 -5
- data/lib/prism/visitor.rb +3 -0
- data/lib/prism.rb +0 -4
- data/prism.gemspec +1 -4
- data/rbi/prism/node.rbi +63 -6
- data/rbi/prism/visitor.rbi +3 -0
- data/rbi/prism.rbi +6 -0
- data/sig/prism/dsl.rbs +4 -1
- data/sig/prism/mutation_compiler.rbs +1 -0
- data/sig/prism/node.rbs +28 -4
- data/sig/prism/visitor.rbs +1 -0
- data/sig/prism.rbs +21 -0
- data/src/diagnostic.c +27 -17
- data/src/node.c +408 -1666
- data/src/prettyprint.c +49 -6
- data/src/prism.c +958 -991
- data/src/regexp.c +133 -68
- data/src/serialize.c +6 -1
- data/src/static_literals.c +63 -84
- data/src/token_type.c +2 -2
- data/src/util/pm_constant_pool.c +0 -8
- data/src/util/pm_integer.c +39 -11
- data/src/util/pm_string.c +0 -12
- data/src/util/pm_strpbrk.c +32 -6
- metadata +2 -5
- data/include/prism/util/pm_string_list.h +0 -44
- data/lib/prism/debug.rb +0 -249
- data/src/util/pm_string_list.c +0 -28
data/include/prism/ast.h
CHANGED
@@ -831,194 +831,197 @@ enum pm_node_type {
|
|
831
831
|
/** InterpolatedXStringNode */
|
832
832
|
PM_INTERPOLATED_X_STRING_NODE = 87,
|
833
833
|
|
834
|
+
/** ItLocalVariableReadNode */
|
835
|
+
PM_IT_LOCAL_VARIABLE_READ_NODE = 88,
|
836
|
+
|
834
837
|
/** ItParametersNode */
|
835
|
-
PM_IT_PARAMETERS_NODE =
|
838
|
+
PM_IT_PARAMETERS_NODE = 89,
|
836
839
|
|
837
840
|
/** KeywordHashNode */
|
838
|
-
PM_KEYWORD_HASH_NODE =
|
841
|
+
PM_KEYWORD_HASH_NODE = 90,
|
839
842
|
|
840
843
|
/** KeywordRestParameterNode */
|
841
|
-
PM_KEYWORD_REST_PARAMETER_NODE =
|
844
|
+
PM_KEYWORD_REST_PARAMETER_NODE = 91,
|
842
845
|
|
843
846
|
/** LambdaNode */
|
844
|
-
PM_LAMBDA_NODE =
|
847
|
+
PM_LAMBDA_NODE = 92,
|
845
848
|
|
846
849
|
/** LocalVariableAndWriteNode */
|
847
|
-
PM_LOCAL_VARIABLE_AND_WRITE_NODE =
|
850
|
+
PM_LOCAL_VARIABLE_AND_WRITE_NODE = 93,
|
848
851
|
|
849
852
|
/** LocalVariableOperatorWriteNode */
|
850
|
-
PM_LOCAL_VARIABLE_OPERATOR_WRITE_NODE =
|
853
|
+
PM_LOCAL_VARIABLE_OPERATOR_WRITE_NODE = 94,
|
851
854
|
|
852
855
|
/** LocalVariableOrWriteNode */
|
853
|
-
PM_LOCAL_VARIABLE_OR_WRITE_NODE =
|
856
|
+
PM_LOCAL_VARIABLE_OR_WRITE_NODE = 95,
|
854
857
|
|
855
858
|
/** LocalVariableReadNode */
|
856
|
-
PM_LOCAL_VARIABLE_READ_NODE =
|
859
|
+
PM_LOCAL_VARIABLE_READ_NODE = 96,
|
857
860
|
|
858
861
|
/** LocalVariableTargetNode */
|
859
|
-
PM_LOCAL_VARIABLE_TARGET_NODE =
|
862
|
+
PM_LOCAL_VARIABLE_TARGET_NODE = 97,
|
860
863
|
|
861
864
|
/** LocalVariableWriteNode */
|
862
|
-
PM_LOCAL_VARIABLE_WRITE_NODE =
|
865
|
+
PM_LOCAL_VARIABLE_WRITE_NODE = 98,
|
863
866
|
|
864
867
|
/** MatchLastLineNode */
|
865
|
-
PM_MATCH_LAST_LINE_NODE =
|
868
|
+
PM_MATCH_LAST_LINE_NODE = 99,
|
866
869
|
|
867
870
|
/** MatchPredicateNode */
|
868
|
-
PM_MATCH_PREDICATE_NODE =
|
871
|
+
PM_MATCH_PREDICATE_NODE = 100,
|
869
872
|
|
870
873
|
/** MatchRequiredNode */
|
871
|
-
PM_MATCH_REQUIRED_NODE =
|
874
|
+
PM_MATCH_REQUIRED_NODE = 101,
|
872
875
|
|
873
876
|
/** MatchWriteNode */
|
874
|
-
PM_MATCH_WRITE_NODE =
|
877
|
+
PM_MATCH_WRITE_NODE = 102,
|
875
878
|
|
876
879
|
/** MissingNode */
|
877
|
-
PM_MISSING_NODE =
|
880
|
+
PM_MISSING_NODE = 103,
|
878
881
|
|
879
882
|
/** ModuleNode */
|
880
|
-
PM_MODULE_NODE =
|
883
|
+
PM_MODULE_NODE = 104,
|
881
884
|
|
882
885
|
/** MultiTargetNode */
|
883
|
-
PM_MULTI_TARGET_NODE =
|
886
|
+
PM_MULTI_TARGET_NODE = 105,
|
884
887
|
|
885
888
|
/** MultiWriteNode */
|
886
|
-
PM_MULTI_WRITE_NODE =
|
889
|
+
PM_MULTI_WRITE_NODE = 106,
|
887
890
|
|
888
891
|
/** NextNode */
|
889
|
-
PM_NEXT_NODE =
|
892
|
+
PM_NEXT_NODE = 107,
|
890
893
|
|
891
894
|
/** NilNode */
|
892
|
-
PM_NIL_NODE =
|
895
|
+
PM_NIL_NODE = 108,
|
893
896
|
|
894
897
|
/** NoKeywordsParameterNode */
|
895
|
-
PM_NO_KEYWORDS_PARAMETER_NODE =
|
898
|
+
PM_NO_KEYWORDS_PARAMETER_NODE = 109,
|
896
899
|
|
897
900
|
/** NumberedParametersNode */
|
898
|
-
PM_NUMBERED_PARAMETERS_NODE =
|
901
|
+
PM_NUMBERED_PARAMETERS_NODE = 110,
|
899
902
|
|
900
903
|
/** NumberedReferenceReadNode */
|
901
|
-
PM_NUMBERED_REFERENCE_READ_NODE =
|
904
|
+
PM_NUMBERED_REFERENCE_READ_NODE = 111,
|
902
905
|
|
903
906
|
/** OptionalKeywordParameterNode */
|
904
|
-
PM_OPTIONAL_KEYWORD_PARAMETER_NODE =
|
907
|
+
PM_OPTIONAL_KEYWORD_PARAMETER_NODE = 112,
|
905
908
|
|
906
909
|
/** OptionalParameterNode */
|
907
|
-
PM_OPTIONAL_PARAMETER_NODE =
|
910
|
+
PM_OPTIONAL_PARAMETER_NODE = 113,
|
908
911
|
|
909
912
|
/** OrNode */
|
910
|
-
PM_OR_NODE =
|
913
|
+
PM_OR_NODE = 114,
|
911
914
|
|
912
915
|
/** ParametersNode */
|
913
|
-
PM_PARAMETERS_NODE =
|
916
|
+
PM_PARAMETERS_NODE = 115,
|
914
917
|
|
915
918
|
/** ParenthesesNode */
|
916
|
-
PM_PARENTHESES_NODE =
|
919
|
+
PM_PARENTHESES_NODE = 116,
|
917
920
|
|
918
921
|
/** PinnedExpressionNode */
|
919
|
-
PM_PINNED_EXPRESSION_NODE =
|
922
|
+
PM_PINNED_EXPRESSION_NODE = 117,
|
920
923
|
|
921
924
|
/** PinnedVariableNode */
|
922
|
-
PM_PINNED_VARIABLE_NODE =
|
925
|
+
PM_PINNED_VARIABLE_NODE = 118,
|
923
926
|
|
924
927
|
/** PostExecutionNode */
|
925
|
-
PM_POST_EXECUTION_NODE =
|
928
|
+
PM_POST_EXECUTION_NODE = 119,
|
926
929
|
|
927
930
|
/** PreExecutionNode */
|
928
|
-
PM_PRE_EXECUTION_NODE =
|
931
|
+
PM_PRE_EXECUTION_NODE = 120,
|
929
932
|
|
930
933
|
/** ProgramNode */
|
931
|
-
PM_PROGRAM_NODE =
|
934
|
+
PM_PROGRAM_NODE = 121,
|
932
935
|
|
933
936
|
/** RangeNode */
|
934
|
-
PM_RANGE_NODE =
|
937
|
+
PM_RANGE_NODE = 122,
|
935
938
|
|
936
939
|
/** RationalNode */
|
937
|
-
PM_RATIONAL_NODE =
|
940
|
+
PM_RATIONAL_NODE = 123,
|
938
941
|
|
939
942
|
/** RedoNode */
|
940
|
-
PM_REDO_NODE =
|
943
|
+
PM_REDO_NODE = 124,
|
941
944
|
|
942
945
|
/** RegularExpressionNode */
|
943
|
-
PM_REGULAR_EXPRESSION_NODE =
|
946
|
+
PM_REGULAR_EXPRESSION_NODE = 125,
|
944
947
|
|
945
948
|
/** RequiredKeywordParameterNode */
|
946
|
-
PM_REQUIRED_KEYWORD_PARAMETER_NODE =
|
949
|
+
PM_REQUIRED_KEYWORD_PARAMETER_NODE = 126,
|
947
950
|
|
948
951
|
/** RequiredParameterNode */
|
949
|
-
PM_REQUIRED_PARAMETER_NODE =
|
952
|
+
PM_REQUIRED_PARAMETER_NODE = 127,
|
950
953
|
|
951
954
|
/** RescueModifierNode */
|
952
|
-
PM_RESCUE_MODIFIER_NODE =
|
955
|
+
PM_RESCUE_MODIFIER_NODE = 128,
|
953
956
|
|
954
957
|
/** RescueNode */
|
955
|
-
PM_RESCUE_NODE =
|
958
|
+
PM_RESCUE_NODE = 129,
|
956
959
|
|
957
960
|
/** RestParameterNode */
|
958
|
-
PM_REST_PARAMETER_NODE =
|
961
|
+
PM_REST_PARAMETER_NODE = 130,
|
959
962
|
|
960
963
|
/** RetryNode */
|
961
|
-
PM_RETRY_NODE =
|
964
|
+
PM_RETRY_NODE = 131,
|
962
965
|
|
963
966
|
/** ReturnNode */
|
964
|
-
PM_RETURN_NODE =
|
967
|
+
PM_RETURN_NODE = 132,
|
965
968
|
|
966
969
|
/** SelfNode */
|
967
|
-
PM_SELF_NODE =
|
970
|
+
PM_SELF_NODE = 133,
|
968
971
|
|
969
972
|
/** ShareableConstantNode */
|
970
|
-
PM_SHAREABLE_CONSTANT_NODE =
|
973
|
+
PM_SHAREABLE_CONSTANT_NODE = 134,
|
971
974
|
|
972
975
|
/** SingletonClassNode */
|
973
|
-
PM_SINGLETON_CLASS_NODE =
|
976
|
+
PM_SINGLETON_CLASS_NODE = 135,
|
974
977
|
|
975
978
|
/** SourceEncodingNode */
|
976
|
-
PM_SOURCE_ENCODING_NODE =
|
979
|
+
PM_SOURCE_ENCODING_NODE = 136,
|
977
980
|
|
978
981
|
/** SourceFileNode */
|
979
|
-
PM_SOURCE_FILE_NODE =
|
982
|
+
PM_SOURCE_FILE_NODE = 137,
|
980
983
|
|
981
984
|
/** SourceLineNode */
|
982
|
-
PM_SOURCE_LINE_NODE =
|
985
|
+
PM_SOURCE_LINE_NODE = 138,
|
983
986
|
|
984
987
|
/** SplatNode */
|
985
|
-
PM_SPLAT_NODE =
|
988
|
+
PM_SPLAT_NODE = 139,
|
986
989
|
|
987
990
|
/** StatementsNode */
|
988
|
-
PM_STATEMENTS_NODE =
|
991
|
+
PM_STATEMENTS_NODE = 140,
|
989
992
|
|
990
993
|
/** StringNode */
|
991
|
-
PM_STRING_NODE =
|
994
|
+
PM_STRING_NODE = 141,
|
992
995
|
|
993
996
|
/** SuperNode */
|
994
|
-
PM_SUPER_NODE =
|
997
|
+
PM_SUPER_NODE = 142,
|
995
998
|
|
996
999
|
/** SymbolNode */
|
997
|
-
PM_SYMBOL_NODE =
|
1000
|
+
PM_SYMBOL_NODE = 143,
|
998
1001
|
|
999
1002
|
/** TrueNode */
|
1000
|
-
PM_TRUE_NODE =
|
1003
|
+
PM_TRUE_NODE = 144,
|
1001
1004
|
|
1002
1005
|
/** UndefNode */
|
1003
|
-
PM_UNDEF_NODE =
|
1006
|
+
PM_UNDEF_NODE = 145,
|
1004
1007
|
|
1005
1008
|
/** UnlessNode */
|
1006
|
-
PM_UNLESS_NODE =
|
1009
|
+
PM_UNLESS_NODE = 146,
|
1007
1010
|
|
1008
1011
|
/** UntilNode */
|
1009
|
-
PM_UNTIL_NODE =
|
1012
|
+
PM_UNTIL_NODE = 147,
|
1010
1013
|
|
1011
1014
|
/** WhenNode */
|
1012
|
-
PM_WHEN_NODE =
|
1015
|
+
PM_WHEN_NODE = 148,
|
1013
1016
|
|
1014
1017
|
/** WhileNode */
|
1015
|
-
PM_WHILE_NODE =
|
1018
|
+
PM_WHILE_NODE = 149,
|
1016
1019
|
|
1017
1020
|
/** XStringNode */
|
1018
|
-
PM_X_STRING_NODE =
|
1021
|
+
PM_X_STRING_NODE = 150,
|
1019
1022
|
|
1020
1023
|
/** YieldNode */
|
1021
|
-
PM_YIELD_NODE =
|
1024
|
+
PM_YIELD_NODE = 151,
|
1022
1025
|
|
1023
1026
|
/** A special kind of node used for compilation. */
|
1024
1027
|
PM_SCOPE_NODE
|
@@ -3015,36 +3018,73 @@ typedef struct pm_for_node {
|
|
3015
3018
|
|
3016
3019
|
/**
|
3017
3020
|
* ForNode#index
|
3021
|
+
*
|
3022
|
+
* The index expression for `for` loops.
|
3023
|
+
*
|
3024
|
+
* for i in a end
|
3025
|
+
* ^
|
3018
3026
|
*/
|
3019
3027
|
struct pm_node *index;
|
3020
3028
|
|
3021
3029
|
/**
|
3022
3030
|
* ForNode#collection
|
3031
|
+
*
|
3032
|
+
* The collection to iterate over.
|
3033
|
+
*
|
3034
|
+
* for i in a end
|
3035
|
+
* ^
|
3023
3036
|
*/
|
3024
3037
|
struct pm_node *collection;
|
3025
3038
|
|
3026
3039
|
/**
|
3027
3040
|
* ForNode#statements
|
3041
|
+
*
|
3042
|
+
* Represents the body of statements to execute for each iteration of the loop.
|
3043
|
+
*
|
3044
|
+
* for i in a
|
3045
|
+
* foo(i)
|
3046
|
+
* ^^^^^^
|
3047
|
+
* end
|
3028
3048
|
*/
|
3029
3049
|
struct pm_statements_node *statements;
|
3030
3050
|
|
3031
3051
|
/**
|
3032
3052
|
* ForNode#for_keyword_loc
|
3053
|
+
*
|
3054
|
+
* The location of the `for` keyword.
|
3055
|
+
*
|
3056
|
+
* for i in a end
|
3057
|
+
* ^^^
|
3033
3058
|
*/
|
3034
3059
|
pm_location_t for_keyword_loc;
|
3035
3060
|
|
3036
3061
|
/**
|
3037
3062
|
* ForNode#in_keyword_loc
|
3063
|
+
*
|
3064
|
+
* The location of the `in` keyword.
|
3065
|
+
*
|
3066
|
+
* for i in a end
|
3067
|
+
* ^^
|
3038
3068
|
*/
|
3039
3069
|
pm_location_t in_keyword_loc;
|
3040
3070
|
|
3041
3071
|
/**
|
3042
3072
|
* ForNode#do_keyword_loc
|
3073
|
+
*
|
3074
|
+
* The location of the `do` keyword, if present.
|
3075
|
+
*
|
3076
|
+
* for i in a do end
|
3077
|
+
* ^^
|
3043
3078
|
*/
|
3044
3079
|
pm_location_t do_keyword_loc;
|
3045
3080
|
|
3046
3081
|
/**
|
3047
3082
|
* ForNode#end_keyword_loc
|
3083
|
+
*
|
3084
|
+
* The location of the `end` keyword.
|
3085
|
+
*
|
3086
|
+
* for i in a end
|
3087
|
+
* ^^^
|
3048
3088
|
*/
|
3049
3089
|
pm_location_t end_keyword_loc;
|
3050
3090
|
} pm_for_node_t;
|
@@ -4148,6 +4188,18 @@ typedef struct pm_interpolated_x_string_node {
|
|
4148
4188
|
pm_location_t closing_loc;
|
4149
4189
|
} pm_interpolated_x_string_node_t;
|
4150
4190
|
|
4191
|
+
/**
|
4192
|
+
* ItLocalVariableReadNode
|
4193
|
+
*
|
4194
|
+
* Type: PM_IT_LOCAL_VARIABLE_READ_NODE
|
4195
|
+
*
|
4196
|
+
* @extends pm_node_t
|
4197
|
+
*/
|
4198
|
+
typedef struct pm_it_local_variable_read_node {
|
4199
|
+
/** The embedded base node. */
|
4200
|
+
pm_node_t base;
|
4201
|
+
} pm_it_local_variable_read_node_t;
|
4202
|
+
|
4151
4203
|
/**
|
4152
4204
|
* ItParametersNode
|
4153
4205
|
*
|
@@ -4389,10 +4441,6 @@ typedef struct pm_local_variable_read_node {
|
|
4389
4441
|
* Note that this can also be an underscore followed by a number for the default block parameters.
|
4390
4442
|
*
|
4391
4443
|
* _1 # name `:_1`
|
4392
|
-
*
|
4393
|
-
* Finally, for the default `it` block parameter, the name is `0it`. This is to distinguish it from an `it` local variable that is explicitly declared.
|
4394
|
-
*
|
4395
|
-
* it # name `:0it`
|
4396
4444
|
*/
|
4397
4445
|
pm_constant_id_t name;
|
4398
4446
|
|
@@ -5238,6 +5286,11 @@ typedef struct pm_range_node {
|
|
5238
5286
|
* RationalNode
|
5239
5287
|
*
|
5240
5288
|
* Type: PM_RATIONAL_NODE
|
5289
|
+
* Flags:
|
5290
|
+
* PM_INTEGER_BASE_FLAGS_BINARY
|
5291
|
+
* PM_INTEGER_BASE_FLAGS_DECIMAL
|
5292
|
+
* PM_INTEGER_BASE_FLAGS_OCTAL
|
5293
|
+
* PM_INTEGER_BASE_FLAGS_HEXADECIMAL
|
5241
5294
|
*
|
5242
5295
|
* @extends pm_node_t
|
5243
5296
|
*/
|
@@ -5246,9 +5299,22 @@ typedef struct pm_rational_node {
|
|
5246
5299
|
pm_node_t base;
|
5247
5300
|
|
5248
5301
|
/**
|
5249
|
-
* RationalNode#
|
5302
|
+
* RationalNode#numerator
|
5303
|
+
*
|
5304
|
+
* The numerator of the rational number.
|
5305
|
+
*
|
5306
|
+
* 1.5r # numerator 3
|
5250
5307
|
*/
|
5251
|
-
|
5308
|
+
pm_integer_t numerator;
|
5309
|
+
|
5310
|
+
/**
|
5311
|
+
* RationalNode#denominator
|
5312
|
+
*
|
5313
|
+
* The denominator of the rational number.
|
5314
|
+
*
|
5315
|
+
* 1.5r # denominator 2
|
5316
|
+
*/
|
5317
|
+
pm_integer_t denominator;
|
5252
5318
|
} pm_rational_node_t;
|
5253
5319
|
|
5254
5320
|
/**
|
@@ -5833,7 +5899,9 @@ typedef struct pm_unless_node {
|
|
5833
5899
|
* UnlessNode#then_keyword_loc
|
5834
5900
|
*
|
5835
5901
|
* The location of the `then` keyword, if present.
|
5836
|
-
*
|
5902
|
+
*
|
5903
|
+
* unless cond then bar end
|
5904
|
+
* ^^^^
|
5837
5905
|
*/
|
5838
5906
|
pm_location_t then_keyword_loc;
|
5839
5907
|
|
data/include/prism/diagnostic.h
CHANGED
@@ -143,6 +143,7 @@ typedef enum {
|
|
143
143
|
PM_ERR_EXPRESSION_NOT_WRITABLE_FILE,
|
144
144
|
PM_ERR_EXPRESSION_NOT_WRITABLE_LINE,
|
145
145
|
PM_ERR_EXPRESSION_NOT_WRITABLE_NIL,
|
146
|
+
PM_ERR_EXPRESSION_NOT_WRITABLE_NUMBERED,
|
146
147
|
PM_ERR_EXPRESSION_NOT_WRITABLE_SELF,
|
147
148
|
PM_ERR_EXPRESSION_NOT_WRITABLE_TRUE,
|
148
149
|
PM_ERR_FLOAT_PARSE,
|
@@ -182,6 +183,7 @@ typedef enum {
|
|
182
183
|
PM_ERR_INVALID_NUMBER_UNDERSCORE_INNER,
|
183
184
|
PM_ERR_INVALID_NUMBER_UNDERSCORE_TRAILING,
|
184
185
|
PM_ERR_INVALID_PERCENT,
|
186
|
+
PM_ERR_INVALID_PERCENT_EOF,
|
185
187
|
PM_ERR_INVALID_PRINTABLE_CHARACTER,
|
186
188
|
PM_ERR_INVALID_RETRY_AFTER_ELSE,
|
187
189
|
PM_ERR_INVALID_RETRY_AFTER_ENSURE,
|
@@ -213,9 +215,10 @@ typedef enum {
|
|
213
215
|
PM_ERR_NO_LOCAL_VARIABLE,
|
214
216
|
PM_ERR_NOT_EXPRESSION,
|
215
217
|
PM_ERR_NUMBER_LITERAL_UNDERSCORE,
|
218
|
+
PM_ERR_NUMBERED_PARAMETER_INNER_BLOCK,
|
216
219
|
PM_ERR_NUMBERED_PARAMETER_IT,
|
217
220
|
PM_ERR_NUMBERED_PARAMETER_ORDINARY,
|
218
|
-
|
221
|
+
PM_ERR_NUMBERED_PARAMETER_OUTER_BLOCK,
|
219
222
|
PM_ERR_OPERATOR_MULTI_ASSIGN,
|
220
223
|
PM_ERR_OPERATOR_WRITE_ARGUMENTS,
|
221
224
|
PM_ERR_OPERATOR_WRITE_BLOCK,
|
@@ -232,8 +235,8 @@ typedef enum {
|
|
232
235
|
PM_ERR_PARAMETER_SPLAT_MULTI,
|
233
236
|
PM_ERR_PARAMETER_STAR,
|
234
237
|
PM_ERR_PARAMETER_UNEXPECTED_FWD,
|
235
|
-
PM_ERR_PARAMETER_WILD_LOOSE_COMMA,
|
236
238
|
PM_ERR_PARAMETER_UNEXPECTED_NO_KW,
|
239
|
+
PM_ERR_PARAMETER_WILD_LOOSE_COMMA,
|
237
240
|
PM_ERR_PATTERN_CAPTURE_DUPLICATE,
|
238
241
|
PM_ERR_PATTERN_EXPRESSION_AFTER_BRACKET,
|
239
242
|
PM_ERR_PATTERN_EXPRESSION_AFTER_COMMA,
|
@@ -262,6 +265,7 @@ typedef enum {
|
|
262
265
|
PM_ERR_REGEXP_INCOMPAT_CHAR_ENCODING,
|
263
266
|
PM_ERR_REGEXP_INVALID_UNICODE_RANGE,
|
264
267
|
PM_ERR_REGEXP_NON_ESCAPED_MBC,
|
268
|
+
PM_ERR_REGEXP_PARSE_ERROR,
|
265
269
|
PM_ERR_REGEXP_TERM,
|
266
270
|
PM_ERR_REGEXP_UNKNOWN_OPTIONS,
|
267
271
|
PM_ERR_REGEXP_UTF8_CHAR_NON_UTF8_REGEXP,
|
@@ -303,6 +307,7 @@ typedef enum {
|
|
303
307
|
PM_ERR_XSTRING_TERM,
|
304
308
|
|
305
309
|
// These are the warning diagnostics.
|
310
|
+
PM_WARN_AMBIGUOUS_BINARY_OPERATOR,
|
306
311
|
PM_WARN_AMBIGUOUS_FIRST_ARGUMENT_MINUS,
|
307
312
|
PM_WARN_AMBIGUOUS_FIRST_ARGUMENT_PLUS,
|
308
313
|
PM_WARN_AMBIGUOUS_PREFIX_AMPERSAND,
|
data/include/prism/node.h
CHANGED
@@ -56,27 +56,6 @@ void pm_node_list_free(pm_node_list_t *list);
|
|
56
56
|
*/
|
57
57
|
PRISM_EXPORTED_FUNCTION void pm_node_destroy(pm_parser_t *parser, struct pm_node *node);
|
58
58
|
|
59
|
-
/**
|
60
|
-
* This struct stores the information gathered by the pm_node_memsize function.
|
61
|
-
* It contains both the memory footprint and additionally metadata about the
|
62
|
-
* shape of the tree.
|
63
|
-
*/
|
64
|
-
typedef struct {
|
65
|
-
/** The total memory footprint of the node and all of its children. */
|
66
|
-
size_t memsize;
|
67
|
-
|
68
|
-
/** The number of children the node has. */
|
69
|
-
size_t node_count;
|
70
|
-
} pm_memsize_t;
|
71
|
-
|
72
|
-
/**
|
73
|
-
* Calculates the memory footprint of a given node.
|
74
|
-
*
|
75
|
-
* @param node The node to calculate the memory footprint of.
|
76
|
-
* @param memsize The memory footprint of the node and all of its children.
|
77
|
-
*/
|
78
|
-
PRISM_EXPORTED_FUNCTION void pm_node_memsize(pm_node_t *node, pm_memsize_t *memsize);
|
79
|
-
|
80
59
|
/**
|
81
60
|
* Returns a string representation of the given node type.
|
82
61
|
*
|
data/include/prism/parser.h
CHANGED
@@ -546,6 +546,17 @@ typedef struct pm_locals {
|
|
546
546
|
pm_local_t *locals;
|
547
547
|
} pm_locals_t;
|
548
548
|
|
549
|
+
/** The flags about scope parameters that can be set. */
|
550
|
+
typedef uint8_t pm_scope_parameters_t;
|
551
|
+
static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_NONE = 0x0;
|
552
|
+
static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_FORWARDING_POSITIONALS = 0x1;
|
553
|
+
static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_FORWARDING_KEYWORDS = 0x2;
|
554
|
+
static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_FORWARDING_BLOCK = 0x4;
|
555
|
+
static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_FORWARDING_ALL = 0x8;
|
556
|
+
static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_IMPLICIT_DISALLOWED = 0x10;
|
557
|
+
static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_NUMBERED_INNER = 0x20;
|
558
|
+
static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_NUMBERED_FOUND = 0x40;
|
559
|
+
|
549
560
|
/**
|
550
561
|
* This struct represents a node in a linked list of scopes. Some scopes can see
|
551
562
|
* into their parent scopes, while others cannot.
|
@@ -557,10 +568,19 @@ typedef struct pm_scope {
|
|
557
568
|
/** The IDs of the locals in the given scope. */
|
558
569
|
pm_locals_t locals;
|
559
570
|
|
571
|
+
/**
|
572
|
+
* This is a list of the implicit parameters contained within the block.
|
573
|
+
* These will be processed after the block is parsed to determine the kind
|
574
|
+
* of parameters node that should be used and to check if any errors need to
|
575
|
+
* be added.
|
576
|
+
*/
|
577
|
+
pm_node_list_t implicit_parameters;
|
578
|
+
|
560
579
|
/**
|
561
580
|
* This is a bitfield that indicates the parameters that are being used in
|
562
|
-
* this scope. It is a combination of the
|
563
|
-
* are three different kinds of parameters that can be used in a
|
581
|
+
* this scope. It is a combination of the PM_SCOPE_PARAMETERS_* constants.
|
582
|
+
* There are three different kinds of parameters that can be used in a
|
583
|
+
* scope:
|
564
584
|
*
|
565
585
|
* - Ordinary parameters (e.g., def foo(bar); end)
|
566
586
|
* - Numbered parameters (e.g., def foo; _1; end)
|
@@ -575,15 +595,7 @@ typedef struct pm_scope {
|
|
575
595
|
* - def foo(&); end
|
576
596
|
* - def foo(...); end
|
577
597
|
*/
|
578
|
-
|
579
|
-
|
580
|
-
/**
|
581
|
-
* An integer indicating the number of numbered parameters on this scope.
|
582
|
-
* This is necessary to determine if child blocks are allowed to use
|
583
|
-
* numbered parameters, and to pass information to consumers of the AST
|
584
|
-
* about how many numbered parameters exist.
|
585
|
-
*/
|
586
|
-
int8_t numbered_parameters;
|
598
|
+
pm_scope_parameters_t parameters;
|
587
599
|
|
588
600
|
/**
|
589
601
|
* The current state of constant shareability for this scope. This is
|
@@ -598,20 +610,6 @@ typedef struct pm_scope {
|
|
598
610
|
bool closed;
|
599
611
|
} pm_scope_t;
|
600
612
|
|
601
|
-
static const uint8_t PM_SCOPE_PARAMETERS_NONE = 0x0;
|
602
|
-
static const uint8_t PM_SCOPE_PARAMETERS_ORDINARY = 0x1;
|
603
|
-
static const uint8_t PM_SCOPE_PARAMETERS_NUMBERED = 0x2;
|
604
|
-
static const uint8_t PM_SCOPE_PARAMETERS_IT = 0x4;
|
605
|
-
static const uint8_t PM_SCOPE_PARAMETERS_TYPE_MASK = 0x7;
|
606
|
-
|
607
|
-
static const uint8_t PM_SCOPE_PARAMETERS_FORWARDING_POSITIONALS = 0x8;
|
608
|
-
static const uint8_t PM_SCOPE_PARAMETERS_FORWARDING_KEYWORDS = 0x10;
|
609
|
-
static const uint8_t PM_SCOPE_PARAMETERS_FORWARDING_BLOCK = 0x20;
|
610
|
-
static const uint8_t PM_SCOPE_PARAMETERS_FORWARDING_ALL = 0x40;
|
611
|
-
|
612
|
-
static const int8_t PM_SCOPE_NUMBERED_PARAMETERS_DISALLOWED = -1;
|
613
|
-
static const int8_t PM_SCOPE_NUMBERED_PARAMETERS_NONE = 0;
|
614
|
-
|
615
613
|
/**
|
616
614
|
* A struct that represents a stack of boolean values.
|
617
615
|
*/
|
data/include/prism/regexp.h
CHANGED
@@ -10,7 +10,6 @@
|
|
10
10
|
#include "prism/parser.h"
|
11
11
|
#include "prism/encoding.h"
|
12
12
|
#include "prism/util/pm_memchr.h"
|
13
|
-
#include "prism/util/pm_string_list.h"
|
14
13
|
#include "prism/util/pm_string.h"
|
15
14
|
|
16
15
|
#include <stdbool.h>
|
@@ -18,16 +17,26 @@
|
|
18
17
|
#include <string.h>
|
19
18
|
|
20
19
|
/**
|
21
|
-
*
|
22
|
-
|
20
|
+
* This callback is called when a named capture group is found.
|
21
|
+
*/
|
22
|
+
typedef void (*pm_regexp_name_callback_t)(const pm_string_t *name, void *data);
|
23
|
+
|
24
|
+
/**
|
25
|
+
* This callback is called when a parse error is found.
|
26
|
+
*/
|
27
|
+
typedef void (*pm_regexp_error_callback_t)(const uint8_t *start, const uint8_t *end, const char *message, void *data);
|
28
|
+
|
29
|
+
/**
|
30
|
+
* Parse a regular expression.
|
23
31
|
*
|
32
|
+
* @param parser The parser that is currently being used.
|
24
33
|
* @param source The source code to parse.
|
25
34
|
* @param size The size of the source code.
|
26
|
-
* @param
|
27
|
-
* @param
|
28
|
-
* @param
|
29
|
-
* @
|
35
|
+
* @param name_callback The optional callback to call when a named capture group is found.
|
36
|
+
* @param name_data The optional data to pass to the name callback.
|
37
|
+
* @param error_callback The callback to call when a parse error is found.
|
38
|
+
* @param error_data The data to pass to the error callback.
|
30
39
|
*/
|
31
|
-
PRISM_EXPORTED_FUNCTION
|
40
|
+
PRISM_EXPORTED_FUNCTION void pm_regexp_parse(pm_parser_t *parser, const uint8_t *source, size_t size, pm_regexp_name_callback_t name_callback, void *name_data, pm_regexp_error_callback_t error_callback, void *error_data);
|
32
41
|
|
33
42
|
#endif
|
@@ -95,9 +95,10 @@ typedef struct {
|
|
95
95
|
* @param start_line The line number that the parser starts on.
|
96
96
|
* @param literals The set of static literals to add the node to.
|
97
97
|
* @param node The node to add to the set.
|
98
|
+
* @param replace Whether to replace the previous node if one already exists.
|
98
99
|
* @return A pointer to the node that is being overwritten, if there is one.
|
99
100
|
*/
|
100
|
-
pm_node_t * pm_static_literals_add(const pm_newline_list_t *newline_list, int32_t start_line, pm_static_literals_t *literals, pm_node_t *node);
|
101
|
+
pm_node_t * pm_static_literals_add(const pm_newline_list_t *newline_list, int32_t start_line, pm_static_literals_t *literals, pm_node_t *node, bool replace);
|
101
102
|
|
102
103
|
/**
|
103
104
|
* Free the internal memory associated with the given static literals set.
|
@@ -115,6 +116,6 @@ void pm_static_literals_free(pm_static_literals_t *literals);
|
|
115
116
|
* @param encoding_name The name of the encoding of the source being parsed.
|
116
117
|
* @param node The node to create a string representation of.
|
117
118
|
*/
|
118
|
-
|
119
|
+
void pm_static_literal_inspect(pm_buffer_t *buffer, const pm_newline_list_t *newline_list, int32_t start_line, const char *encoding_name, const pm_node_t *node);
|
119
120
|
|
120
121
|
#endif
|
@@ -34,8 +34,7 @@ size_t pm_strspn_whitespace(const uint8_t *string, ptrdiff_t length);
|
|
34
34
|
* @return The number of characters at the start of the string that are
|
35
35
|
* whitespace.
|
36
36
|
*/
|
37
|
-
size_t
|
38
|
-
pm_strspn_whitespace_newlines(const uint8_t *string, ptrdiff_t length, pm_newline_list_t *newline_list);
|
37
|
+
size_t pm_strspn_whitespace_newlines(const uint8_t *string, ptrdiff_t length, pm_newline_list_t *newline_list);
|
39
38
|
|
40
39
|
/**
|
41
40
|
* Returns the number of characters at the start of the string that are inline
|
@@ -87,14 +87,6 @@ void pm_constant_id_list_insert(pm_constant_id_list_t *list, size_t index, pm_co
|
|
87
87
|
*/
|
88
88
|
bool pm_constant_id_list_includes(pm_constant_id_list_t *list, pm_constant_id_t id);
|
89
89
|
|
90
|
-
/**
|
91
|
-
* Get the memory size of a list of constant ids.
|
92
|
-
*
|
93
|
-
* @param list The list to get the memory size of.
|
94
|
-
* @return The memory size of the list.
|
95
|
-
*/
|
96
|
-
size_t pm_constant_id_list_memsize(pm_constant_id_list_t *list);
|
97
|
-
|
98
90
|
/**
|
99
91
|
* Free the memory associated with a list of constant ids.
|
100
92
|
*
|