prism 1.1.0 → 1.3.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.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +39 -1
  3. data/Makefile +1 -1
  4. data/config.yml +422 -3
  5. data/docs/build_system.md +8 -11
  6. data/docs/relocation.md +34 -0
  7. data/ext/prism/api_node.c +18 -10
  8. data/ext/prism/extconf.rb +13 -36
  9. data/ext/prism/extension.c +68 -0
  10. data/ext/prism/extension.h +1 -1
  11. data/include/prism/ast.h +427 -3
  12. data/include/prism/defines.h +22 -7
  13. data/include/prism/diagnostic.h +1 -0
  14. data/include/prism/parser.h +25 -12
  15. data/include/prism/version.h +2 -2
  16. data/include/prism.h +47 -0
  17. data/lib/prism/dot_visitor.rb +10 -0
  18. data/lib/prism/dsl.rb +4 -4
  19. data/lib/prism/ffi.rb +49 -2
  20. data/lib/prism/inspect_visitor.rb +2 -0
  21. data/lib/prism/node.rb +1839 -96
  22. data/lib/prism/parse_result/errors.rb +1 -1
  23. data/lib/prism/parse_result.rb +140 -3
  24. data/lib/prism/reflection.rb +2 -2
  25. data/lib/prism/relocation.rb +504 -0
  26. data/lib/prism/serialize.rb +17 -5
  27. data/lib/prism/string_query.rb +30 -0
  28. data/lib/prism/translation/parser/compiler.rb +36 -26
  29. data/lib/prism/translation/parser.rb +3 -3
  30. data/lib/prism/translation/ripper.rb +1 -5
  31. data/lib/prism/translation/ruby_parser.rb +14 -5
  32. data/lib/prism.rb +6 -4
  33. data/prism.gemspec +7 -1
  34. data/rbi/prism/dsl.rbi +4 -4
  35. data/rbi/prism/node.rbi +5118 -1030
  36. data/rbi/prism/parse_result.rbi +29 -0
  37. data/rbi/prism/string_query.rbi +12 -0
  38. data/rbi/prism.rbi +34 -34
  39. data/sig/prism/dsl.rbs +2 -2
  40. data/sig/prism/node.rbs +13 -98
  41. data/sig/prism/parse_result.rbs +20 -0
  42. data/sig/prism/relocation.rbs +185 -0
  43. data/sig/prism/string_query.rbs +11 -0
  44. data/src/diagnostic.c +3 -1
  45. data/src/node.c +18 -0
  46. data/src/prettyprint.c +32 -0
  47. data/src/prism.c +586 -195
  48. data/src/regexp.c +7 -3
  49. data/src/serialize.c +12 -0
  50. data/src/static_literals.c +1 -1
  51. data/src/util/pm_char.c +1 -1
  52. data/src/util/pm_string.c +1 -0
  53. metadata +9 -3
@@ -0,0 +1,185 @@
1
+ module Prism
2
+ module Relocation
3
+ interface _Value
4
+ def start_line: () -> Integer
5
+ def end_line: () -> Integer
6
+ def start_offset: () -> Integer
7
+ def end_offset: () -> Integer
8
+ def start_character_offset: () -> Integer
9
+ def end_character_offset: () -> Integer
10
+ def cached_start_code_units_offset: (_CodeUnitsCache cache) -> Integer
11
+ def cached_end_code_units_offset: (_CodeUnitsCache cache) -> Integer
12
+ def start_column: () -> Integer
13
+ def end_column: () -> Integer
14
+ def start_character_column: () -> Integer
15
+ def end_character_column: () -> Integer
16
+ def cached_start_code_units_column: (_CodeUnitsCache cache) -> Integer
17
+ def cached_end_code_units_column: (_CodeUnitsCache cache) -> Integer
18
+ def leading_comments: () -> Array[Comment]
19
+ def trailing_comments: () -> Array[Comment]
20
+ end
21
+
22
+ interface _Field
23
+ def fields: (_Value value) -> entry_values
24
+ end
25
+
26
+ type entry_value = untyped
27
+ type entry_values = Hash[Symbol, entry_value]
28
+
29
+ class Entry
30
+ class MissingValueError < StandardError
31
+ end
32
+
33
+ def initialize: (Repository repository) -> void
34
+
35
+ def filepath: () -> String
36
+
37
+ def start_line: () -> Integer
38
+ def end_line: () -> Integer
39
+
40
+ def start_offset: () -> Integer
41
+ def end_offset: () -> Integer
42
+ def start_character_offset: () -> Integer
43
+ def end_character_offset: () -> Integer
44
+ def start_code_units_offset: () -> Integer
45
+ def end_code_units_offset: () -> Integer
46
+
47
+ def start_column: () -> Integer
48
+ def end_column: () -> Integer
49
+ def start_character_column: () -> Integer
50
+ def end_character_column: () -> Integer
51
+ def start_code_units_column: () -> Integer
52
+ def end_code_units_column: () -> Integer
53
+
54
+ def leading_comments: () -> Array[CommentsField::Comment]
55
+ def trailing_comments: () -> Array[CommentsField::Comment]
56
+ def comments: () -> Array[CommentsField::Comment]
57
+
58
+ private
59
+
60
+ def fetch_value: (Symbol name) -> entry_value
61
+ def values: () -> entry_values
62
+ end
63
+
64
+ class Source
65
+ attr_reader value: untyped
66
+
67
+ def initialize: (untyped value) -> void
68
+
69
+ def result: () -> ParseResult
70
+ def code_units_cache: (Encoding encoding) -> _CodeUnitsCache
71
+ end
72
+
73
+ class SourceFilepath < Source
74
+ def result: () -> ParseResult
75
+ end
76
+
77
+ class SourceString < Source
78
+ def result: () -> ParseResult
79
+ end
80
+
81
+ class FilepathField
82
+ attr_reader value: String
83
+
84
+ def initialize: (String value) -> void
85
+
86
+ def fields: (_Value value) -> entry_values
87
+ end
88
+
89
+ class LinesField
90
+ def fields: (_Value value) -> entry_values
91
+ end
92
+
93
+ class OffsetsField
94
+ def fields: (_Value value) -> entry_values
95
+ end
96
+
97
+ class CharacterOffsetsField
98
+ def fields: (_Value value) -> entry_values
99
+ end
100
+
101
+ class CodeUnitOffsetsField
102
+ attr_reader repository: Repository
103
+ attr_reader encoding: Encoding
104
+
105
+ def initialize: (Repository repository, Encoding encoding) -> void
106
+ def fields: (_Value value) -> entry_values
107
+
108
+ private
109
+
110
+ def cache: () -> _CodeUnitsCache
111
+ end
112
+
113
+ class ColumnsField
114
+ def fields: (_Value value) -> entry_values
115
+ end
116
+
117
+ class CharacterColumnsField
118
+ def fields: (_Value value) -> entry_values
119
+ end
120
+
121
+ class CodeUnitColumnsField
122
+ attr_reader repository: Repository
123
+ attr_reader encoding: Encoding
124
+
125
+ def initialize: (Repository repository, Encoding encoding) -> void
126
+ def fields: (_Value value) -> entry_values
127
+
128
+ private
129
+
130
+ def cache: () -> _CodeUnitsCache
131
+ end
132
+
133
+ class CommentsField
134
+ class Comment
135
+ attr_reader slice: String
136
+
137
+ def initialize: (String slice) -> void
138
+ end
139
+
140
+ private
141
+
142
+ def comments: (entry_value value) -> Array[Comment]
143
+ end
144
+
145
+ class LeadingCommentsField < CommentsField
146
+ def fields: (_Value value) -> entry_values
147
+ end
148
+
149
+ class TrailingCommentsField < CommentsField
150
+ def fields: (_Value value) -> entry_values
151
+ end
152
+
153
+ class Repository
154
+ class ConfigurationError < StandardError
155
+ end
156
+
157
+ attr_reader source: Source
158
+ attr_reader fields: Hash[Symbol, _Field]
159
+ attr_reader entries: Hash[Integer, Hash[Symbol, Entry]]
160
+
161
+ def initialize: (Source source) -> void
162
+
163
+ def code_units_cache: (Encoding encoding) -> _CodeUnitsCache
164
+
165
+ def filepath: () -> self
166
+ def lines: () -> self
167
+ def offsets: () -> self
168
+ def character_offsets: () -> self
169
+ def code_unit_offsets: (Encoding encoding) -> self
170
+ def columns: () -> self
171
+ def character_columns: () -> self
172
+ def code_unit_columns: (Encoding encoding) -> self
173
+ def leading_comments: () -> self
174
+ def trailing_comments: () -> self
175
+ def comments: () -> self
176
+
177
+ private
178
+
179
+ def field: (Symbol name, _Field) -> self
180
+ end
181
+
182
+ def self.filepath: (String value) -> Repository
183
+ def self.string: (String value) -> Repository
184
+ end
185
+ end
@@ -0,0 +1,11 @@
1
+ module Prism
2
+ class StringQuery
3
+ attr_reader string: String
4
+
5
+ def initialize: (String string) -> void
6
+
7
+ def local?: () -> bool
8
+ def constant?: () -> bool
9
+ def method_name?: () -> bool
10
+ end
11
+ end
data/src/diagnostic.c CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  #include "prism/diagnostic.h"
10
10
 
11
- #define PM_DIAGNOSTIC_ID_MAX 318
11
+ #define PM_DIAGNOSTIC_ID_MAX 319
12
12
 
13
13
  /** This struct holds the data for each diagnostic. */
14
14
  typedef struct {
@@ -231,6 +231,7 @@ static const pm_diagnostic_data_t diagnostic_messages[PM_DIAGNOSTIC_ID_MAX] = {
231
231
  [PM_ERR_INCOMPLETE_VARIABLE_INSTANCE] = { "'%.*s' is not allowed as an instance variable name", PM_ERROR_LEVEL_SYNTAX },
232
232
  [PM_ERR_INSTANCE_VARIABLE_BARE] = { "'@' without identifiers is not allowed as an instance variable name", PM_ERROR_LEVEL_SYNTAX },
233
233
  [PM_ERR_INVALID_BLOCK_EXIT] = { "Invalid %s", PM_ERROR_LEVEL_SYNTAX },
234
+ [PM_ERR_INVALID_COMMA] = { "invalid comma", PM_ERROR_LEVEL_SYNTAX },
234
235
  [PM_ERR_INVALID_ESCAPE_CHARACTER] = { "Invalid escape character syntax", PM_ERROR_LEVEL_SYNTAX },
235
236
  [PM_ERR_INVALID_FLOAT_EXPONENT] = { "invalid exponent", PM_ERROR_LEVEL_SYNTAX },
236
237
  [PM_ERR_INVALID_LOCAL_VARIABLE_READ] = { "identifier %.*s is not valid to get", PM_ERROR_LEVEL_SYNTAX },
@@ -558,6 +559,7 @@ pm_diagnostic_id_human(pm_diagnostic_id_t diag_id) {
558
559
  case PM_ERR_INSTANCE_VARIABLE_BARE: return "instance_variable_bare";
559
560
  case PM_ERR_INVALID_BLOCK_EXIT: return "invalid_block_exit";
560
561
  case PM_ERR_INVALID_CHARACTER: return "invalid_character";
562
+ case PM_ERR_INVALID_COMMA: return "invalid_comma";
561
563
  case PM_ERR_INVALID_ENCODING_MAGIC_COMMENT: return "invalid_encoding_magic_comment";
562
564
  case PM_ERR_INVALID_ESCAPE_CHARACTER: return "invalid_escape_character";
563
565
  case PM_ERR_INVALID_FLOAT_EXPONENT: return "invalid_float_exponent";
data/src/node.c CHANGED
@@ -8418,6 +8418,15 @@ pm_dump_json(pm_buffer_t *buffer, const pm_parser_t *parser, const pm_node_t *no
8418
8418
  pm_buffer_append_string(buffer, "\"keyword_loc\":", 14);
8419
8419
  pm_dump_json_location(buffer, parser, &cast->keyword_loc);
8420
8420
 
8421
+ // Dump the do_keyword_loc field
8422
+ pm_buffer_append_byte(buffer, ',');
8423
+ pm_buffer_append_string(buffer, "\"do_keyword_loc\":", 17);
8424
+ if (cast->do_keyword_loc.start != NULL) {
8425
+ pm_dump_json_location(buffer, parser, &cast->do_keyword_loc);
8426
+ } else {
8427
+ pm_buffer_append_string(buffer, "null", 4);
8428
+ }
8429
+
8421
8430
  // Dump the closing_loc field
8422
8431
  pm_buffer_append_byte(buffer, ',');
8423
8432
  pm_buffer_append_string(buffer, "\"closing_loc\":", 14);
@@ -8511,6 +8520,15 @@ pm_dump_json(pm_buffer_t *buffer, const pm_parser_t *parser, const pm_node_t *no
8511
8520
  pm_buffer_append_string(buffer, "\"keyword_loc\":", 14);
8512
8521
  pm_dump_json_location(buffer, parser, &cast->keyword_loc);
8513
8522
 
8523
+ // Dump the do_keyword_loc field
8524
+ pm_buffer_append_byte(buffer, ',');
8525
+ pm_buffer_append_string(buffer, "\"do_keyword_loc\":", 17);
8526
+ if (cast->do_keyword_loc.start != NULL) {
8527
+ pm_dump_json_location(buffer, parser, &cast->do_keyword_loc);
8528
+ } else {
8529
+ pm_buffer_append_string(buffer, "null", 4);
8530
+ }
8531
+
8514
8532
  // Dump the closing_loc field
8515
8533
  pm_buffer_append_byte(buffer, ',');
8516
8534
  pm_buffer_append_string(buffer, "\"closing_loc\":", 14);
data/src/prettyprint.c CHANGED
@@ -8521,6 +8521,22 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
8521
8521
  pm_buffer_append_string(output_buffer, "\"\n", 2);
8522
8522
  }
8523
8523
 
8524
+ // do_keyword_loc
8525
+ {
8526
+ pm_buffer_concat(output_buffer, prefix_buffer);
8527
+ pm_buffer_append_string(output_buffer, "+-- do_keyword_loc:", 19);
8528
+ pm_location_t *location = &cast->do_keyword_loc;
8529
+ if (location->start == NULL) {
8530
+ pm_buffer_append_string(output_buffer, " nil\n", 5);
8531
+ } else {
8532
+ pm_buffer_append_byte(output_buffer, ' ');
8533
+ prettyprint_location(output_buffer, parser, location);
8534
+ pm_buffer_append_string(output_buffer, " = \"", 4);
8535
+ pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
8536
+ pm_buffer_append_string(output_buffer, "\"\n", 2);
8537
+ }
8538
+ }
8539
+
8524
8540
  // closing_loc
8525
8541
  {
8526
8542
  pm_buffer_concat(output_buffer, prefix_buffer);
@@ -8672,6 +8688,22 @@ prettyprint_node(pm_buffer_t *output_buffer, const pm_parser_t *parser, const pm
8672
8688
  pm_buffer_append_string(output_buffer, "\"\n", 2);
8673
8689
  }
8674
8690
 
8691
+ // do_keyword_loc
8692
+ {
8693
+ pm_buffer_concat(output_buffer, prefix_buffer);
8694
+ pm_buffer_append_string(output_buffer, "+-- do_keyword_loc:", 19);
8695
+ pm_location_t *location = &cast->do_keyword_loc;
8696
+ if (location->start == NULL) {
8697
+ pm_buffer_append_string(output_buffer, " nil\n", 5);
8698
+ } else {
8699
+ pm_buffer_append_byte(output_buffer, ' ');
8700
+ prettyprint_location(output_buffer, parser, location);
8701
+ pm_buffer_append_string(output_buffer, " = \"", 4);
8702
+ pm_buffer_append_source(output_buffer, location->start, (size_t) (location->end - location->start), PM_BUFFER_ESCAPING_RUBY);
8703
+ pm_buffer_append_string(output_buffer, "\"\n", 2);
8704
+ }
8705
+ }
8706
+
8675
8707
  // closing_loc
8676
8708
  {
8677
8709
  pm_buffer_concat(output_buffer, prefix_buffer);