jruby-prism-parser 0.23.0.pre.SNAPSHOT-java

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 (110) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +401 -0
  3. data/CODE_OF_CONDUCT.md +76 -0
  4. data/CONTRIBUTING.md +62 -0
  5. data/LICENSE.md +7 -0
  6. data/Makefile +101 -0
  7. data/README.md +98 -0
  8. data/config.yml +2902 -0
  9. data/docs/build_system.md +91 -0
  10. data/docs/configuration.md +64 -0
  11. data/docs/cruby_compilation.md +27 -0
  12. data/docs/design.md +53 -0
  13. data/docs/encoding.md +121 -0
  14. data/docs/fuzzing.md +88 -0
  15. data/docs/heredocs.md +36 -0
  16. data/docs/javascript.md +118 -0
  17. data/docs/local_variable_depth.md +229 -0
  18. data/docs/mapping.md +117 -0
  19. data/docs/parser_translation.md +34 -0
  20. data/docs/parsing_rules.md +19 -0
  21. data/docs/releasing.md +98 -0
  22. data/docs/ripper.md +36 -0
  23. data/docs/ruby_api.md +43 -0
  24. data/docs/ruby_parser_translation.md +19 -0
  25. data/docs/serialization.md +209 -0
  26. data/docs/testing.md +55 -0
  27. data/ext/prism/api_node.c +5098 -0
  28. data/ext/prism/api_pack.c +267 -0
  29. data/ext/prism/extconf.rb +110 -0
  30. data/ext/prism/extension.c +1155 -0
  31. data/ext/prism/extension.h +18 -0
  32. data/include/prism/ast.h +5807 -0
  33. data/include/prism/defines.h +102 -0
  34. data/include/prism/diagnostic.h +339 -0
  35. data/include/prism/encoding.h +265 -0
  36. data/include/prism/node.h +57 -0
  37. data/include/prism/options.h +230 -0
  38. data/include/prism/pack.h +152 -0
  39. data/include/prism/parser.h +732 -0
  40. data/include/prism/prettyprint.h +26 -0
  41. data/include/prism/regexp.h +33 -0
  42. data/include/prism/util/pm_buffer.h +155 -0
  43. data/include/prism/util/pm_char.h +205 -0
  44. data/include/prism/util/pm_constant_pool.h +209 -0
  45. data/include/prism/util/pm_list.h +97 -0
  46. data/include/prism/util/pm_memchr.h +29 -0
  47. data/include/prism/util/pm_newline_list.h +93 -0
  48. data/include/prism/util/pm_state_stack.h +42 -0
  49. data/include/prism/util/pm_string.h +150 -0
  50. data/include/prism/util/pm_string_list.h +44 -0
  51. data/include/prism/util/pm_strncasecmp.h +32 -0
  52. data/include/prism/util/pm_strpbrk.h +46 -0
  53. data/include/prism/version.h +29 -0
  54. data/include/prism.h +289 -0
  55. data/jruby-prism.jar +0 -0
  56. data/lib/prism/compiler.rb +486 -0
  57. data/lib/prism/debug.rb +206 -0
  58. data/lib/prism/desugar_compiler.rb +207 -0
  59. data/lib/prism/dispatcher.rb +2150 -0
  60. data/lib/prism/dot_visitor.rb +4634 -0
  61. data/lib/prism/dsl.rb +785 -0
  62. data/lib/prism/ffi.rb +346 -0
  63. data/lib/prism/lex_compat.rb +908 -0
  64. data/lib/prism/mutation_compiler.rb +753 -0
  65. data/lib/prism/node.rb +17864 -0
  66. data/lib/prism/node_ext.rb +212 -0
  67. data/lib/prism/node_inspector.rb +68 -0
  68. data/lib/prism/pack.rb +224 -0
  69. data/lib/prism/parse_result/comments.rb +177 -0
  70. data/lib/prism/parse_result/newlines.rb +64 -0
  71. data/lib/prism/parse_result.rb +498 -0
  72. data/lib/prism/pattern.rb +250 -0
  73. data/lib/prism/serialize.rb +1354 -0
  74. data/lib/prism/translation/parser/compiler.rb +1838 -0
  75. data/lib/prism/translation/parser/lexer.rb +335 -0
  76. data/lib/prism/translation/parser/rubocop.rb +37 -0
  77. data/lib/prism/translation/parser.rb +178 -0
  78. data/lib/prism/translation/ripper.rb +577 -0
  79. data/lib/prism/translation/ruby_parser.rb +1521 -0
  80. data/lib/prism/translation.rb +11 -0
  81. data/lib/prism/version.rb +3 -0
  82. data/lib/prism/visitor.rb +495 -0
  83. data/lib/prism.rb +99 -0
  84. data/prism.gemspec +135 -0
  85. data/rbi/prism.rbi +7767 -0
  86. data/rbi/prism_static.rbi +207 -0
  87. data/sig/prism.rbs +4773 -0
  88. data/sig/prism_static.rbs +201 -0
  89. data/src/diagnostic.c +400 -0
  90. data/src/encoding.c +5132 -0
  91. data/src/node.c +2786 -0
  92. data/src/options.c +213 -0
  93. data/src/pack.c +493 -0
  94. data/src/prettyprint.c +8881 -0
  95. data/src/prism.c +18406 -0
  96. data/src/regexp.c +638 -0
  97. data/src/serialize.c +1554 -0
  98. data/src/token_type.c +700 -0
  99. data/src/util/pm_buffer.c +190 -0
  100. data/src/util/pm_char.c +318 -0
  101. data/src/util/pm_constant_pool.c +322 -0
  102. data/src/util/pm_list.c +49 -0
  103. data/src/util/pm_memchr.c +35 -0
  104. data/src/util/pm_newline_list.c +84 -0
  105. data/src/util/pm_state_stack.c +25 -0
  106. data/src/util/pm_string.c +203 -0
  107. data/src/util/pm_string_list.c +28 -0
  108. data/src/util/pm_strncasecmp.c +24 -0
  109. data/src/util/pm_strpbrk.c +180 -0
  110. metadata +156 -0
@@ -0,0 +1,207 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Prism
4
+ # DesugarCompiler is a compiler that desugars Ruby code into a more primitive
5
+ # form. This is useful for consumers that want to deal with fewer node types.
6
+ class DesugarCompiler < MutationCompiler
7
+ # @@foo &&= bar
8
+ #
9
+ # becomes
10
+ #
11
+ # @@foo && @@foo = bar
12
+ def visit_class_variable_and_write_node(node)
13
+ desugar_and_write_node(node, ClassVariableReadNode, ClassVariableWriteNode, node.name)
14
+ end
15
+
16
+ # @@foo ||= bar
17
+ #
18
+ # becomes
19
+ #
20
+ # defined?(@@foo) ? @@foo : @@foo = bar
21
+ def visit_class_variable_or_write_node(node)
22
+ desugar_or_write_defined_node(node, ClassVariableReadNode, ClassVariableWriteNode, node.name)
23
+ end
24
+
25
+ # @@foo += bar
26
+ #
27
+ # becomes
28
+ #
29
+ # @@foo = @@foo + bar
30
+ def visit_class_variable_operator_write_node(node)
31
+ desugar_operator_write_node(node, ClassVariableReadNode, ClassVariableWriteNode, node.name)
32
+ end
33
+
34
+ # Foo &&= bar
35
+ #
36
+ # becomes
37
+ #
38
+ # Foo && Foo = bar
39
+ def visit_constant_and_write_node(node)
40
+ desugar_and_write_node(node, ConstantReadNode, ConstantWriteNode, node.name)
41
+ end
42
+
43
+ # Foo ||= bar
44
+ #
45
+ # becomes
46
+ #
47
+ # defined?(Foo) ? Foo : Foo = bar
48
+ def visit_constant_or_write_node(node)
49
+ desugar_or_write_defined_node(node, ConstantReadNode, ConstantWriteNode, node.name)
50
+ end
51
+
52
+ # Foo += bar
53
+ #
54
+ # becomes
55
+ #
56
+ # Foo = Foo + bar
57
+ def visit_constant_operator_write_node(node)
58
+ desugar_operator_write_node(node, ConstantReadNode, ConstantWriteNode, node.name)
59
+ end
60
+
61
+ # $foo &&= bar
62
+ #
63
+ # becomes
64
+ #
65
+ # $foo && $foo = bar
66
+ def visit_global_variable_and_write_node(node)
67
+ desugar_and_write_node(node, GlobalVariableReadNode, GlobalVariableWriteNode, node.name)
68
+ end
69
+
70
+ # $foo ||= bar
71
+ #
72
+ # becomes
73
+ #
74
+ # defined?($foo) ? $foo : $foo = bar
75
+ def visit_global_variable_or_write_node(node)
76
+ desugar_or_write_defined_node(node, GlobalVariableReadNode, GlobalVariableWriteNode, node.name)
77
+ end
78
+
79
+ # $foo += bar
80
+ #
81
+ # becomes
82
+ #
83
+ # $foo = $foo + bar
84
+ def visit_global_variable_operator_write_node(node)
85
+ desugar_operator_write_node(node, GlobalVariableReadNode, GlobalVariableWriteNode, node.name)
86
+ end
87
+
88
+ # @foo &&= bar
89
+ #
90
+ # becomes
91
+ #
92
+ # @foo && @foo = bar
93
+ def visit_instance_variable_and_write_node(node)
94
+ desugar_and_write_node(node, InstanceVariableReadNode, InstanceVariableWriteNode, node.name)
95
+ end
96
+
97
+ # @foo ||= bar
98
+ #
99
+ # becomes
100
+ #
101
+ # @foo || @foo = bar
102
+ def visit_instance_variable_or_write_node(node)
103
+ desugar_or_write_node(node, InstanceVariableReadNode, InstanceVariableWriteNode, node.name)
104
+ end
105
+
106
+ # @foo += bar
107
+ #
108
+ # becomes
109
+ #
110
+ # @foo = @foo + bar
111
+ def visit_instance_variable_operator_write_node(node)
112
+ desugar_operator_write_node(node, InstanceVariableReadNode, InstanceVariableWriteNode, node.name)
113
+ end
114
+
115
+ # foo &&= bar
116
+ #
117
+ # becomes
118
+ #
119
+ # foo && foo = bar
120
+ def visit_local_variable_and_write_node(node)
121
+ desugar_and_write_node(node, LocalVariableReadNode, LocalVariableWriteNode, node.name, node.depth)
122
+ end
123
+
124
+ # foo ||= bar
125
+ #
126
+ # becomes
127
+ #
128
+ # foo || foo = bar
129
+ def visit_local_variable_or_write_node(node)
130
+ desugar_or_write_node(node, LocalVariableReadNode, LocalVariableWriteNode, node.name, node.depth)
131
+ end
132
+
133
+ # foo += bar
134
+ #
135
+ # becomes
136
+ #
137
+ # foo = foo + bar
138
+ def visit_local_variable_operator_write_node(node)
139
+ desugar_operator_write_node(node, LocalVariableReadNode, LocalVariableWriteNode, node.name, node.depth)
140
+ end
141
+
142
+ private
143
+
144
+ # Desugar `x &&= y` to `x && x = y`
145
+ def desugar_and_write_node(node, read_class, write_class, *arguments)
146
+ AndNode.new(
147
+ read_class.new(*arguments, node.name_loc),
148
+ write_class.new(*arguments, node.name_loc, node.value, node.operator_loc, node.location),
149
+ node.operator_loc,
150
+ node.location
151
+ )
152
+ end
153
+
154
+ # Desugar `x += y` to `x = x + y`
155
+ def desugar_operator_write_node(node, read_class, write_class, *arguments)
156
+ write_class.new(
157
+ *arguments,
158
+ node.name_loc,
159
+ CallNode.new(
160
+ 0,
161
+ read_class.new(*arguments, node.name_loc),
162
+ nil,
163
+ node.operator_loc.slice.chomp("="),
164
+ node.operator_loc.copy(length: node.operator_loc.length - 1),
165
+ nil,
166
+ ArgumentsNode.new(0, [node.value], node.value.location),
167
+ nil,
168
+ nil,
169
+ node.location
170
+ ),
171
+ node.operator_loc.copy(start_offset: node.operator_loc.end_offset - 1, length: 1),
172
+ node.location
173
+ )
174
+ end
175
+
176
+ # Desugar `x ||= y` to `x || x = y`
177
+ def desugar_or_write_node(node, read_class, write_class, *arguments)
178
+ OrNode.new(
179
+ read_class.new(*arguments, node.name_loc),
180
+ write_class.new(*arguments, node.name_loc, node.value, node.operator_loc, node.location),
181
+ node.operator_loc,
182
+ node.location
183
+ )
184
+ end
185
+
186
+ # Desugar `x ||= y` to `defined?(x) ? x : x = y`
187
+ def desugar_or_write_defined_node(node, read_class, write_class, *arguments)
188
+ IfNode.new(
189
+ node.operator_loc,
190
+ DefinedNode.new(nil, read_class.new(*arguments, node.name_loc), nil, node.operator_loc, node.name_loc),
191
+ node.operator_loc,
192
+ StatementsNode.new([read_class.new(*arguments, node.name_loc)], node.location),
193
+ ElseNode.new(
194
+ node.operator_loc,
195
+ StatementsNode.new(
196
+ [write_class.new(*arguments, node.name_loc, node.value, node.operator_loc, node.location)],
197
+ node.location
198
+ ),
199
+ node.operator_loc,
200
+ node.location
201
+ ),
202
+ node.operator_loc,
203
+ node.location
204
+ )
205
+ end
206
+ end
207
+ end