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

Sign up to get free protection for your applications and to get access to all the features.
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