refract 1.0.0.beta1 → 1.1.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 (162) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/lib/refract/basic_visitor.rb +7 -2
  4. data/lib/refract/converter.rb +197 -23
  5. data/lib/refract/formatter.rb +146 -80
  6. data/lib/refract/mutation_visitor.rb +111 -115
  7. data/lib/refract/nodes/alias_global_variable_node.rb +3 -1
  8. data/lib/refract/nodes/alias_method_node.rb +3 -1
  9. data/lib/refract/nodes/alternation_pattern_node.rb +3 -1
  10. data/lib/refract/nodes/and_node.rb +3 -1
  11. data/lib/refract/nodes/arguments_node.rb +3 -1
  12. data/lib/refract/nodes/array_node.rb +3 -1
  13. data/lib/refract/nodes/array_pattern_node.rb +3 -1
  14. data/lib/refract/nodes/assoc_node.rb +3 -1
  15. data/lib/refract/nodes/assoc_splat_node.rb +3 -1
  16. data/lib/refract/nodes/back_reference_read_node.rb +3 -1
  17. data/lib/refract/nodes/begin_node.rb +3 -1
  18. data/lib/refract/nodes/block_argument_node.rb +3 -1
  19. data/lib/refract/nodes/block_local_variable_node.rb +3 -1
  20. data/lib/refract/nodes/block_node.rb +3 -1
  21. data/lib/refract/nodes/block_parameter_node.rb +3 -1
  22. data/lib/refract/nodes/block_parameters_node.rb +3 -1
  23. data/lib/refract/nodes/break_node.rb +3 -1
  24. data/lib/refract/nodes/call_and_write_node.rb +3 -1
  25. data/lib/refract/nodes/call_node.rb +6 -3
  26. data/lib/refract/nodes/call_operator_write_node.rb +3 -1
  27. data/lib/refract/nodes/call_or_write_node.rb +3 -1
  28. data/lib/refract/nodes/call_target_node.rb +3 -1
  29. data/lib/refract/nodes/capture_pattern_node.rb +3 -1
  30. data/lib/refract/nodes/case_match_node.rb +3 -1
  31. data/lib/refract/nodes/case_node.rb +3 -1
  32. data/lib/refract/nodes/class_node.rb +3 -1
  33. data/lib/refract/nodes/class_variable_and_write_node.rb +3 -1
  34. data/lib/refract/nodes/class_variable_operator_write_node.rb +3 -1
  35. data/lib/refract/nodes/class_variable_or_write_node.rb +3 -1
  36. data/lib/refract/nodes/class_variable_read_node.rb +3 -1
  37. data/lib/refract/nodes/class_variable_target_node.rb +3 -1
  38. data/lib/refract/nodes/class_variable_write_node.rb +3 -1
  39. data/lib/refract/nodes/constant_and_write_node.rb +3 -1
  40. data/lib/refract/nodes/constant_operator_write_node.rb +3 -1
  41. data/lib/refract/nodes/constant_or_write_node.rb +3 -1
  42. data/lib/refract/nodes/constant_path_and_write_node.rb +3 -1
  43. data/lib/refract/nodes/constant_path_node.rb +14 -0
  44. data/lib/refract/nodes/constant_path_operator_write_node.rb +3 -1
  45. data/lib/refract/nodes/constant_path_or_write_node.rb +3 -1
  46. data/lib/refract/nodes/constant_path_target_node.rb +3 -1
  47. data/lib/refract/nodes/constant_path_write_node.rb +3 -1
  48. data/lib/refract/nodes/constant_read_node.rb +3 -1
  49. data/lib/refract/nodes/constant_target_node.rb +3 -1
  50. data/lib/refract/nodes/constant_write_node.rb +3 -1
  51. data/lib/refract/nodes/def_node.rb +3 -1
  52. data/lib/refract/nodes/defined_node.rb +3 -1
  53. data/lib/refract/nodes/else_node.rb +3 -1
  54. data/lib/refract/nodes/embedded_statements_node.rb +3 -1
  55. data/lib/refract/nodes/embedded_variable_node.rb +3 -1
  56. data/lib/refract/nodes/ensure_node.rb +3 -1
  57. data/lib/refract/nodes/false_node.rb +3 -0
  58. data/lib/refract/nodes/find_pattern_node.rb +3 -1
  59. data/lib/refract/nodes/flip_flop_node.rb +3 -1
  60. data/lib/refract/nodes/float_node.rb +3 -1
  61. data/lib/refract/nodes/for_node.rb +3 -1
  62. data/lib/refract/nodes/forwarding_arguments_node.rb +3 -0
  63. data/lib/refract/nodes/forwarding_parameter_node.rb +3 -0
  64. data/lib/refract/nodes/forwarding_super_node.rb +3 -1
  65. data/lib/refract/nodes/global_variable_and_write_node.rb +3 -1
  66. data/lib/refract/nodes/global_variable_operator_write_node.rb +3 -1
  67. data/lib/refract/nodes/global_variable_or_write_node.rb +3 -1
  68. data/lib/refract/nodes/global_variable_read_node.rb +3 -1
  69. data/lib/refract/nodes/global_variable_target_node.rb +3 -1
  70. data/lib/refract/nodes/global_variable_write_node.rb +3 -1
  71. data/lib/refract/nodes/hash_node.rb +3 -1
  72. data/lib/refract/nodes/hash_pattern_node.rb +3 -1
  73. data/lib/refract/nodes/if_node.rb +5 -2
  74. data/lib/refract/nodes/imaginary_node.rb +3 -1
  75. data/lib/refract/nodes/implicit_node.rb +3 -1
  76. data/lib/refract/nodes/implicit_rest_node.rb +3 -0
  77. data/lib/refract/nodes/in_node.rb +3 -1
  78. data/lib/refract/nodes/index_and_write_node.rb +3 -1
  79. data/lib/refract/nodes/index_operator_write_node.rb +3 -1
  80. data/lib/refract/nodes/index_or_write_node.rb +3 -1
  81. data/lib/refract/nodes/index_target_node.rb +4 -2
  82. data/lib/refract/nodes/instance_variable_and_write_node.rb +3 -1
  83. data/lib/refract/nodes/instance_variable_operator_write_node.rb +3 -1
  84. data/lib/refract/nodes/instance_variable_or_write_node.rb +3 -1
  85. data/lib/refract/nodes/instance_variable_read_node.rb +3 -1
  86. data/lib/refract/nodes/instance_variable_target_node.rb +3 -1
  87. data/lib/refract/nodes/instance_variable_write_node.rb +3 -1
  88. data/lib/refract/nodes/integer_node.rb +3 -1
  89. data/lib/refract/nodes/interpolated_match_last_line_node.rb +3 -1
  90. data/lib/refract/nodes/interpolated_regular_expression_node.rb +3 -1
  91. data/lib/refract/nodes/interpolated_string_node.rb +3 -1
  92. data/lib/refract/nodes/interpolated_symbol_node.rb +3 -1
  93. data/lib/refract/nodes/interpolated_x_string_node.rb +3 -1
  94. data/lib/refract/nodes/it_local_variable_read_node.rb +3 -0
  95. data/lib/refract/nodes/it_parameters_node.rb +3 -0
  96. data/lib/refract/nodes/keyword_hash_node.rb +3 -1
  97. data/lib/refract/nodes/keyword_rest_parameter_node.rb +3 -1
  98. data/lib/refract/nodes/lambda_node.rb +3 -1
  99. data/lib/refract/nodes/local_variable_and_write_node.rb +3 -1
  100. data/lib/refract/nodes/local_variable_operator_write_node.rb +3 -1
  101. data/lib/refract/nodes/local_variable_or_write_node.rb +3 -1
  102. data/lib/refract/nodes/local_variable_read_node.rb +3 -1
  103. data/lib/refract/nodes/local_variable_target_node.rb +3 -1
  104. data/lib/refract/nodes/local_variable_write_node.rb +3 -1
  105. data/lib/refract/nodes/match_last_line_node.rb +3 -1
  106. data/lib/refract/nodes/match_predicate_node.rb +3 -1
  107. data/lib/refract/nodes/match_required_node.rb +3 -1
  108. data/lib/refract/nodes/match_write_node.rb +3 -1
  109. data/lib/refract/nodes/missing_node.rb +3 -0
  110. data/lib/refract/nodes/module_node.rb +3 -1
  111. data/lib/refract/nodes/multi_target_node.rb +3 -1
  112. data/lib/refract/nodes/multi_write_node.rb +3 -1
  113. data/lib/refract/nodes/next_node.rb +3 -1
  114. data/lib/refract/nodes/nil_node.rb +3 -0
  115. data/lib/refract/nodes/no_keywords_parameter_node.rb +3 -0
  116. data/lib/refract/nodes/numbered_parameters_node.rb +3 -0
  117. data/lib/refract/nodes/numbered_reference_read_node.rb +3 -1
  118. data/lib/refract/nodes/optional_keyword_parameter_node.rb +3 -1
  119. data/lib/refract/nodes/optional_parameter_node.rb +3 -1
  120. data/lib/refract/nodes/or_node.rb +3 -1
  121. data/lib/refract/nodes/parameters_node.rb +3 -1
  122. data/lib/refract/nodes/parentheses_node.rb +3 -1
  123. data/lib/refract/nodes/pinned_expression_node.rb +3 -1
  124. data/lib/refract/nodes/pinned_variable_node.rb +3 -1
  125. data/lib/refract/nodes/post_execution_node.rb +3 -1
  126. data/lib/refract/nodes/pre_execution_node.rb +3 -1
  127. data/lib/refract/nodes/program_node.rb +4 -2
  128. data/lib/refract/nodes/range_node.rb +3 -1
  129. data/lib/refract/nodes/rational_node.rb +3 -1
  130. data/lib/refract/nodes/redo_node.rb +3 -0
  131. data/lib/refract/nodes/regular_expression_node.rb +3 -1
  132. data/lib/refract/nodes/required_keyword_parameter_node.rb +3 -1
  133. data/lib/refract/nodes/required_parameter_node.rb +3 -1
  134. data/lib/refract/nodes/rescue_modifier_node.rb +3 -1
  135. data/lib/refract/nodes/rescue_node.rb +3 -1
  136. data/lib/refract/nodes/rest_parameter_node.rb +3 -1
  137. data/lib/refract/nodes/retry_node.rb +3 -0
  138. data/lib/refract/nodes/return_node.rb +3 -1
  139. data/lib/refract/nodes/self_node.rb +3 -0
  140. data/lib/refract/nodes/shareable_constant_node.rb +3 -1
  141. data/lib/refract/nodes/singleton_class_node.rb +3 -1
  142. data/lib/refract/nodes/source_encoding_node.rb +3 -0
  143. data/lib/refract/nodes/source_file_node.rb +3 -0
  144. data/lib/refract/nodes/source_line_node.rb +3 -0
  145. data/lib/refract/nodes/splat_node.rb +3 -1
  146. data/lib/refract/nodes/statements_node.rb +3 -1
  147. data/lib/refract/nodes/string_node.rb +3 -1
  148. data/lib/refract/nodes/super_node.rb +3 -1
  149. data/lib/refract/nodes/symbol_node.rb +5 -2
  150. data/lib/refract/nodes/true_node.rb +3 -0
  151. data/lib/refract/nodes/undef_node.rb +3 -1
  152. data/lib/refract/nodes/unless_node.rb +5 -2
  153. data/lib/refract/nodes/until_node.rb +5 -2
  154. data/lib/refract/nodes/when_node.rb +3 -1
  155. data/lib/refract/nodes/while_node.rb +5 -2
  156. data/lib/refract/nodes/x_string_node.rb +3 -1
  157. data/lib/refract/nodes/yield_node.rb +3 -1
  158. data/lib/refract/version.rb +1 -1
  159. data/lib/refract/visitor.rb +4 -4
  160. data/lib/refract.rb +11 -2
  161. metadata +2 -2
  162. data/lib/refract/nodes/constant_path.rb +0 -12
@@ -2,17 +2,31 @@
2
2
 
3
3
  module Refract
4
4
  class Formatter < BasicVisitor
5
- def initialize
6
- super
5
+ Result = Data.define(:source, :source_map)
6
+
7
+ def initialize(starting_line: 1)
8
+ super()
7
9
  @buffer = []
8
10
  @source_map = []
9
- @current_line = 1
11
+ @current_line = starting_line
10
12
  @indent = 0
11
13
  end
12
14
 
15
+ def around_visit(node)
16
+ if (start_line = node.start_line)
17
+ @source_map[@current_line] = start_line
18
+ end
19
+
20
+ super
21
+ end
22
+
13
23
  def format_node(node)
14
24
  visit(node)
15
- @buffer.join
25
+
26
+ Result.new(
27
+ source: @buffer.join,
28
+ source_map: @source_map,
29
+ )
16
30
  end
17
31
 
18
32
  visit AliasGlobalVariableNode do |node|
@@ -69,7 +83,13 @@ module Refract
69
83
  visit AssocNode do |node|
70
84
  case node.key
71
85
  when SymbolNode
72
- push node.key.unescaped
86
+ if node.key.quoted
87
+ doubles do
88
+ push node.key.unescaped.gsub('"', '\"')
89
+ end
90
+ else
91
+ push node.key.unescaped
92
+ end
73
93
  push ":"
74
94
  space unless ImplicitNode === node.value
75
95
  visit node.value
@@ -90,32 +110,30 @@ module Refract
90
110
  end
91
111
 
92
112
  visit BeginNode do |node|
93
- outdent do
94
- push "begin"
95
-
96
- indent do
97
- visit node.statements
98
- end
113
+ push "begin"
99
114
 
100
- new_line
115
+ indent do
116
+ visit node.statements
117
+ end
101
118
 
102
- if node.rescue_clause
103
- visit node.rescue_clause
104
- new_line
105
- end
119
+ new_line
106
120
 
107
- if node.else_clause
108
- visit node.else_clause
109
- new_line
110
- end
121
+ if node.rescue_clause
122
+ visit node.rescue_clause
123
+ new_line
124
+ end
111
125
 
112
- if node.ensure_clause
113
- visit node.ensure_clause
114
- new_line
115
- end
126
+ if node.else_clause
127
+ visit node.else_clause
128
+ new_line
129
+ end
116
130
 
117
- push "end"
131
+ if node.ensure_clause
132
+ visit node.ensure_clause
133
+ new_line
118
134
  end
135
+
136
+ push "end"
119
137
  end
120
138
 
121
139
  visit BlockArgumentNode do |node|
@@ -187,10 +205,11 @@ module Refract
187
205
  visit CallNode do |node|
188
206
  if node.receiver
189
207
  visit node.receiver
208
+ push "&" if node.safe_navigation
190
209
  push "."
191
210
  end
192
211
 
193
- push node.message
212
+ push node.name
194
213
 
195
214
  case node.block
196
215
  when BlockNode
@@ -349,18 +368,18 @@ module Refract
349
368
  visit node.value
350
369
  end
351
370
 
352
- visit ConstantPath do |node|
353
- visit node.parent
354
- push "::"
355
- push node.name
356
- end
357
-
358
371
  visit ConstantPathAndWriteNode do |node|
359
372
  visit node.target
360
373
  push " &&= "
361
374
  visit node.value
362
375
  end
363
376
 
377
+ visit ConstantPathNode do |node|
378
+ visit node.parent
379
+ push "::"
380
+ push node.name
381
+ end
382
+
364
383
  visit ConstantPathOperatorWriteNode do |node|
365
384
  visit node.target
366
385
  space
@@ -563,25 +582,31 @@ module Refract
563
582
  end
564
583
 
565
584
  visit IfNode do |node|
566
- # Check if this is an elsif by looking at the parent
567
- if IfNode === @stack[-2]
568
- push "elsif "
585
+ if node.inline
586
+ visit node.statements
587
+ push " if "
588
+ visit node.predicate
569
589
  else
570
- push "if "
571
- end
572
- visit node.predicate
573
- if node.statements
574
- indent do
575
- visit node.statements
590
+ # Check if this is an elsif by looking at the parent
591
+ if IfNode === @stack[-2]
592
+ push "elsif "
593
+ else
594
+ push "if "
595
+ end
596
+ visit node.predicate
597
+ if node.statements
598
+ indent do
599
+ visit node.statements
600
+ end
601
+ end
602
+ if node.subsequent
603
+ new_line
604
+ visit node.subsequent
605
+ end
606
+ unless IfNode === @stack[-2]
607
+ new_line
608
+ push "end"
576
609
  end
577
- end
578
- if node.subsequent
579
- new_line
580
- visit node.subsequent
581
- end
582
- unless IfNode === @stack[-2]
583
- new_line
584
- push "end"
585
610
  end
586
611
  end
587
612
 
@@ -1101,7 +1126,7 @@ module Refract
1101
1126
  end
1102
1127
 
1103
1128
  visit StatementsNode do |node|
1104
- visit_each(node.body) { new_line }
1129
+ visit_each(node.body.flat_map { |n| (Refract::StatementsNode === n) ? n.body : n }) { new_line }
1105
1130
  end
1106
1131
 
1107
1132
  visit StringNode do |node|
@@ -1112,17 +1137,39 @@ module Refract
1112
1137
 
1113
1138
  visit SuperNode do |node|
1114
1139
  push "super"
1115
- if node.arguments
1140
+ case node.block
1141
+ when BlockNode
1142
+ if node.arguments
1143
+ parens { visit node.arguments }
1144
+ end
1145
+
1146
+ space
1147
+ visit node.block
1148
+ when BlockArgumentNode
1116
1149
  parens do
1117
- visit node.arguments
1150
+ if node.arguments
1151
+ visit node.arguments
1152
+ push ", "
1153
+ end
1154
+
1155
+ visit node.block
1156
+ end
1157
+ else
1158
+ if node.arguments
1159
+ parens { visit node.arguments }
1118
1160
  end
1119
1161
  end
1120
- visit node.block if node.block
1121
1162
  end
1122
1163
 
1123
1164
  visit SymbolNode do |node|
1124
1165
  push ":"
1125
- push node.unescaped
1166
+ if node.quoted
1167
+ doubles do
1168
+ push node.unescaped.gsub('"', '\"')
1169
+ end
1170
+ else
1171
+ push node.unescaped
1172
+ end
1126
1173
  end
1127
1174
 
1128
1175
  visit TrueNode do |node|
@@ -1136,34 +1183,46 @@ module Refract
1136
1183
  end
1137
1184
 
1138
1185
  visit UnlessNode do |node|
1139
- push "unless "
1140
- visit node.predicate
1186
+ if node.inline
1187
+ visit node.statements
1188
+ push " unless "
1189
+ visit node.predicate
1190
+ else
1191
+ push "unless "
1192
+ visit node.predicate
1141
1193
 
1142
- if node.statements
1143
- indent do
1144
- visit node.statements
1194
+ if node.statements
1195
+ indent do
1196
+ visit node.statements
1197
+ end
1198
+ end
1199
+
1200
+ if node.else_clause
1201
+ new_line
1202
+ visit node.else_clause
1145
1203
  end
1146
- end
1147
1204
 
1148
- if node.else_clause
1149
1205
  new_line
1150
- visit node.else_clause
1206
+ push "end"
1151
1207
  end
1152
-
1153
- new_line
1154
- push "end"
1155
1208
  end
1156
1209
 
1157
1210
  visit UntilNode do |node|
1158
- push "until "
1159
- visit node.predicate
1160
- if node.statements
1161
- indent do
1162
- visit node.statements
1211
+ if node.inline
1212
+ visit node.statements
1213
+ push " until "
1214
+ visit node.predicate
1215
+ else
1216
+ push "until "
1217
+ visit node.predicate
1218
+ if node.statements
1219
+ indent do
1220
+ visit node.statements
1221
+ end
1163
1222
  end
1223
+ new_line
1224
+ push "end"
1164
1225
  end
1165
- new_line
1166
- push "end"
1167
1226
  end
1168
1227
 
1169
1228
  visit WhenNode do |node|
@@ -1176,15 +1235,21 @@ module Refract
1176
1235
  end
1177
1236
 
1178
1237
  visit WhileNode do |node|
1179
- push "while "
1180
- visit node.predicate
1181
- if node.statements
1182
- indent do
1183
- visit node.statements
1238
+ if node.inline
1239
+ visit node.statements
1240
+ push " while "
1241
+ visit node.predicate
1242
+ else
1243
+ push "while "
1244
+ visit node.predicate
1245
+ if node.statements
1246
+ indent do
1247
+ visit node.statements
1248
+ end
1184
1249
  end
1250
+ new_line
1251
+ push "end"
1185
1252
  end
1186
- new_line
1187
- push "end"
1188
1253
  end
1189
1254
 
1190
1255
  visit XStringNode do |node|
@@ -1218,7 +1283,8 @@ module Refract
1218
1283
  end
1219
1284
 
1220
1285
  private def new_line
1221
- push "\n#{"\t" * @indent}"
1286
+ @buffer << "\n#{"\t" * @indent}"
1287
+ @current_line += 1
1222
1288
  end
1223
1289
 
1224
1290
  private def indent