ryac 0.2.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.
- checksums.yaml +7 -0
- data/LICENSE +21 -0
- data/README.md +145 -0
- data/Rakefile +45 -0
- data/Steepfile +9 -0
- data/bin/console +11 -0
- data/bin/ryac +134 -0
- data/bin/setup +8 -0
- data/lib/ryac/analysis/constant/collection.rb +332 -0
- data/lib/ryac/analysis/constant/rename_mapping.rb +346 -0
- data/lib/ryac/analysis/cvar/collection.rb +37 -0
- data/lib/ryac/analysis/gvar/collection.rb +36 -0
- data/lib/ryac/analysis/gvar/rename_mapping.rb +82 -0
- data/lib/ryac/analysis/ivar/collection.rb +281 -0
- data/lib/ryac/analysis/keyword/collection.rb +213 -0
- data/lib/ryac/analysis/keyword/rename_mapping.rb +167 -0
- data/lib/ryac/analysis/local_scopes.rb +582 -0
- data/lib/ryac/analysis/method/collection.rb +298 -0
- data/lib/ryac/analysis/method/rename_mapping.rb +337 -0
- data/lib/ryac/analysis/method_aliases.rb +83 -0
- data/lib/ryac/analysis/method_aliasing.rb +65 -0
- data/lib/ryac/analysis/nesting.rb +123 -0
- data/lib/ryac/analysis/scope_management.rb +25 -0
- data/lib/ryac/analysis/site_bucket_mapping.rb +127 -0
- data/lib/ryac/analysis/type_oracle.rb +386 -0
- data/lib/ryac/ast_utils.rb +321 -0
- data/lib/ryac/errors.rb +32 -0
- data/lib/ryac/gem_resolver.rb +55 -0
- data/lib/ryac/minifier.rb +169 -0
- data/lib/ryac/name_generator.rb +68 -0
- data/lib/ryac/pipeline/analyzer.rb +264 -0
- data/lib/ryac/pipeline/attr_decl_shorten.rb +61 -0
- data/lib/ryac/pipeline/boolean_shorten.rb +26 -0
- data/lib/ryac/pipeline/char_shorten.rb +20 -0
- data/lib/ryac/pipeline/compactor.rb +1202 -0
- data/lib/ryac/pipeline/concatenator.rb +248 -0
- data/lib/ryac/pipeline/constant_aliaser.rb +240 -0
- data/lib/ryac/pipeline/constant_fold.rb +93 -0
- data/lib/ryac/pipeline/control_flow_simplify.rb +352 -0
- data/lib/ryac/pipeline/data_types.rb +179 -0
- data/lib/ryac/pipeline/endless_method.rb +60 -0
- data/lib/ryac/pipeline/errors.rb +94 -0
- data/lib/ryac/pipeline/file_collector.rb +360 -0
- data/lib/ryac/pipeline/method_renamer.rb +151 -0
- data/lib/ryac/pipeline/paren_optimizer.rb +161 -0
- data/lib/ryac/pipeline/rename_patcher.rb +274 -0
- data/lib/ryac/pipeline/source_patcher.rb +54 -0
- data/lib/ryac/pipeline/spelling_shorten.rb +60 -0
- data/lib/ryac/pipeline/stage.rb +72 -0
- data/lib/ryac/pipeline/stage_runner.rb +84 -0
- data/lib/ryac/pipeline/variable_renamer.rb +125 -0
- data/lib/ryac/union_find.rb +42 -0
- data/lib/ryac/version.rb +5 -0
- data/lib/ryac.rb +29 -0
- data/rbs_collection.lock.yaml +224 -0
- data/rbs_collection.yaml +25 -0
- data/sig/ryac/analysis/constant/collection.rbs +30 -0
- data/sig/ryac/analysis/constant/rename_mapping.rbs +60 -0
- data/sig/ryac/analysis/cvar/collection.rbs +11 -0
- data/sig/ryac/analysis/gvar/collection.rbs +9 -0
- data/sig/ryac/analysis/gvar/rename_mapping.rbs +23 -0
- data/sig/ryac/analysis/ivar/collection.rbs +26 -0
- data/sig/ryac/analysis/keyword/collection.rbs +27 -0
- data/sig/ryac/analysis/keyword/rename_mapping.rbs +31 -0
- data/sig/ryac/analysis/local_scopes.rbs +77 -0
- data/sig/ryac/analysis/method/collection.rbs +25 -0
- data/sig/ryac/analysis/method/rename_mapping.rbs +82 -0
- data/sig/ryac/analysis/method_aliases.rbs +10 -0
- data/sig/ryac/analysis/method_aliasing.rbs +9 -0
- data/sig/ryac/analysis/nesting.rbs +9 -0
- data/sig/ryac/analysis/scope_management.rbs +5 -0
- data/sig/ryac/analysis/site_bucket_mapping.rbs +26 -0
- data/sig/ryac/analysis/type_oracle.rbs +61 -0
- data/sig/ryac/ast_utils.rbs +34 -0
- data/sig/ryac/errors.rbs +21 -0
- data/sig/ryac/gem_resolver.rbs +28 -0
- data/sig/ryac/minifier.rbs +33 -0
- data/sig/ryac/name_generator.rbs +14 -0
- data/sig/ryac/pipeline/analyzer.rbs +34 -0
- data/sig/ryac/pipeline/attr_decl_shorten.rbs +17 -0
- data/sig/ryac/pipeline/boolean_shorten.rbs +11 -0
- data/sig/ryac/pipeline/char_shorten.rbs +11 -0
- data/sig/ryac/pipeline/compactor.rbs +125 -0
- data/sig/ryac/pipeline/concatenator.rbs +28 -0
- data/sig/ryac/pipeline/constant_aliaser.rbs +35 -0
- data/sig/ryac/pipeline/constant_fold.rbs +20 -0
- data/sig/ryac/pipeline/control_flow_simplify.rbs +34 -0
- data/sig/ryac/pipeline/data_types.rbs +151 -0
- data/sig/ryac/pipeline/endless_method.rbs +14 -0
- data/sig/ryac/pipeline/errors.rbs +46 -0
- data/sig/ryac/pipeline/file_collector.rbs +34 -0
- data/sig/ryac/pipeline/method_renamer.rbs +25 -0
- data/sig/ryac/pipeline/paren_optimizer.rbs +16 -0
- data/sig/ryac/pipeline/rename_patcher.rbs +38 -0
- data/sig/ryac/pipeline/source_patcher.rbs +12 -0
- data/sig/ryac/pipeline/spelling_shorten.rbs +14 -0
- data/sig/ryac/pipeline/stage.rbs +28 -0
- data/sig/ryac/pipeline/stage_runner.rbs +18 -0
- data/sig/ryac/pipeline/variable_renamer.rbs +21 -0
- data/sig/ryac/union_find.rbs +17 -0
- data/sig/ryac.rbs +13 -0
- data/sig/shims/env.rbs +19 -0
- data/sig/shims/typeprof/core/ast.rbs +299 -0
- data/sig/shims/typeprof/core/type.rbs +22 -0
- data/sig/shims/typeprof/core.rbs +73 -0
- data/tools/regen_pins.rb +45 -0
- metadata +201 -0
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
module TypeProf
|
|
2
|
+
module Core
|
|
3
|
+
class AST
|
|
4
|
+
class Node
|
|
5
|
+
attr_reader lenv: LocalEnv
|
|
6
|
+
attr_reader static_ret: Node?
|
|
7
|
+
attr_reader ret: BasicVertex
|
|
8
|
+
attr_reader raw_node: Prism::Node
|
|
9
|
+
|
|
10
|
+
def traverse: () { (Symbol, Node) -> void } -> void
|
|
11
|
+
def each_subnode: () { (Node) -> void } -> void
|
|
12
|
+
def boxes: (Symbol kind) { (Box) -> void } -> void
|
|
13
|
+
def code_range: () -> TypeProf::CodeRange
|
|
14
|
+
def object_id: () -> Integer
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
class CallBaseNode < Node
|
|
18
|
+
attr_reader recv: Node?
|
|
19
|
+
attr_reader mid: Symbol
|
|
20
|
+
attr_reader positional_args: Array[Node]
|
|
21
|
+
attr_reader block_body: Node?
|
|
22
|
+
attr_reader block_f_args: Array[Symbol]
|
|
23
|
+
attr_reader block_pass: Node?
|
|
24
|
+
attr_reader safe_navigation: bool
|
|
25
|
+
|
|
26
|
+
attr_reader keyword_args: Node?
|
|
27
|
+
attr_reader block_multi_targets: Hash[Integer, Prism::MultiTargetNode]?
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
class CallNode < CallBaseNode
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
class SuperNode < CallBaseNode
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
class ForwardingSuperNode < CallBaseNode
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
class YieldNode < CallBaseNode
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
class OperatorNode < CallBaseNode
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
class IndexReadNode < CallBaseNode
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
class IndexWriteNode < CallBaseNode
|
|
49
|
+
attr_reader rhs: Node?
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
class CallReadNode < CallBaseNode
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
class CallWriteNode < CallBaseNode
|
|
56
|
+
attr_reader rhs: Node?
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
class DefNode < Node
|
|
60
|
+
attr_reader singleton: bool
|
|
61
|
+
attr_reader mid: Symbol
|
|
62
|
+
attr_reader body: Node?
|
|
63
|
+
attr_reader tbl: Array[Symbol]
|
|
64
|
+
attr_reader block: Node?
|
|
65
|
+
attr_reader req_positionals: Array[Symbol]
|
|
66
|
+
attr_reader opt_positionals: Array[Symbol]
|
|
67
|
+
attr_reader rest_positionals: Symbol?
|
|
68
|
+
attr_reader post_positionals: Array[Symbol]
|
|
69
|
+
attr_reader req_keywords: Array[Symbol]?
|
|
70
|
+
attr_reader opt_keywords: Array[Symbol]?
|
|
71
|
+
attr_reader rest_keywords: Symbol?
|
|
72
|
+
attr_reader block_param: Symbol?
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
class LiteralNode < Node
|
|
76
|
+
attr_reader lit: Symbol | String | Integer | Float | Rational | Complex | nil
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
class NilNode < LiteralNode
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
class TrueNode < LiteralNode
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
class FalseNode < LiteralNode
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
class IntegerNode < LiteralNode
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
class FloatNode < LiteralNode
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
class SymbolNode < LiteralNode
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
class StringNode < LiteralNode
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
class LocalVariableReadNode < Node
|
|
101
|
+
attr_reader var: Symbol
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
class LocalVariableWriteNode < Node
|
|
105
|
+
attr_reader var: Symbol
|
|
106
|
+
attr_reader rhs: Node?
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
class InstanceVariableReadNode < Node
|
|
110
|
+
attr_reader var: Symbol
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
class InstanceVariableWriteNode < Node
|
|
114
|
+
attr_reader var: Symbol
|
|
115
|
+
attr_reader rhs: Node?
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
class ConstantReadNode < Node
|
|
119
|
+
attr_reader cname: Symbol
|
|
120
|
+
attr_reader cbase: Node?
|
|
121
|
+
attr_reader toplevel: bool
|
|
122
|
+
# Not an AST node: a Static const-read record (ConstRead/ScopedConstRead),
|
|
123
|
+
# probed via respond_to? at the use site.
|
|
124
|
+
attr_reader static_ret: untyped
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
class ConstantWriteNode < Node
|
|
128
|
+
attr_reader cpath: Array[Symbol]?
|
|
129
|
+
attr_reader rhs: Node?
|
|
130
|
+
attr_reader static_cpath: Array[Symbol]
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
class IfNode < Node
|
|
134
|
+
attr_reader cond: Node?
|
|
135
|
+
attr_reader then_body: Node?
|
|
136
|
+
attr_reader else_body: Node?
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
class UnlessNode < Node
|
|
140
|
+
attr_reader cond: Node?
|
|
141
|
+
attr_reader then_body: Node?
|
|
142
|
+
attr_reader else_body: Node?
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
class WhileNode < Node
|
|
146
|
+
attr_reader cond: Node?
|
|
147
|
+
attr_reader body: Node?
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
class UntilNode < Node
|
|
151
|
+
attr_reader cond: Node?
|
|
152
|
+
attr_reader body: Node?
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
class CaseNode < Node
|
|
156
|
+
attr_reader cond: Node?
|
|
157
|
+
attr_reader whens: Array[Node]?
|
|
158
|
+
attr_reader else_body: Node?
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
class AndNode < Node
|
|
162
|
+
attr_reader e1: Node?
|
|
163
|
+
attr_reader e2: Node?
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
class OrNode < Node
|
|
167
|
+
attr_reader e1: Node?
|
|
168
|
+
attr_reader e2: Node?
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
class ReturnNode < Node
|
|
172
|
+
attr_reader args: Array[Node]?
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
class BreakNode < Node
|
|
176
|
+
attr_reader args: Array[Node]?
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
class NextNode < Node
|
|
180
|
+
attr_reader args: Array[Node]?
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
class BeginNode < Node
|
|
184
|
+
attr_reader body: Node?
|
|
185
|
+
attr_reader rescue_clauses: Array[Node]
|
|
186
|
+
attr_reader else_body: Node?
|
|
187
|
+
attr_reader ensure_body: Node?
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
class RescueModifierNode < Node
|
|
191
|
+
attr_reader body: Node?
|
|
192
|
+
attr_reader rescue_body: Node?
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
class ModuleNode < Node
|
|
196
|
+
attr_reader body: Node?
|
|
197
|
+
attr_reader static_cpath: Array[Symbol]
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
class ClassNode < Node
|
|
201
|
+
attr_reader body: Node?
|
|
202
|
+
attr_reader superclass_cpath: Node?
|
|
203
|
+
attr_reader static_cpath: Array[Symbol]
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
class IncludeMetaNode < Node
|
|
207
|
+
attr_reader args: Array[Node]?
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
class AttrReaderMetaNode < Node
|
|
211
|
+
attr_reader args: Array[Symbol]
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
class AttrAccessorMetaNode < Node
|
|
215
|
+
attr_reader args: Array[Symbol]
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
class StatementsNode < Node
|
|
219
|
+
attr_reader stmts: Array[Node]
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
class DummyNilNode < Node
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
class SplatNode < Node
|
|
226
|
+
attr_reader child: Node?
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
class SelfNode < Node
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
class ArrayNode < Node
|
|
233
|
+
attr_reader elems: Array[Node]?
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
class HashNode < Node
|
|
237
|
+
attr_reader keys: Array[Node?]
|
|
238
|
+
attr_reader vals: Array[Node]
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
class RangeNode < Node
|
|
242
|
+
attr_reader begin_node: Node?
|
|
243
|
+
attr_reader end_node: Node?
|
|
244
|
+
attr_reader exclude_end: bool
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
class InterpolatedStringNode < Node
|
|
248
|
+
attr_reader parts: Array[Node]?
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
class InterpolatedSymbolNode < Node
|
|
252
|
+
attr_reader parts: Array[Node]?
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
class RegexpNode < Node
|
|
256
|
+
attr_reader parts: Array[Node]?
|
|
257
|
+
attr_reader flags: String?
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
class AliasNode < Node
|
|
261
|
+
attr_reader new_mid: Node
|
|
262
|
+
attr_reader old_mid: Node
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
class UndefNode < Node
|
|
266
|
+
attr_reader names: Array[Node]
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
class LambdaNode < Node
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
class ForNode < Node
|
|
273
|
+
attr_reader body: Node?
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
class DefinedNode < Node
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
class GlobalVariableReadNode < Node
|
|
280
|
+
attr_reader var: Symbol
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
class GlobalVariableWriteNode < Node
|
|
284
|
+
attr_reader var: Symbol
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
class AliasGlobalVariableNode < Node
|
|
288
|
+
end
|
|
289
|
+
|
|
290
|
+
class ClassVariableReadNode < Node
|
|
291
|
+
attr_reader var: Symbol
|
|
292
|
+
end
|
|
293
|
+
|
|
294
|
+
class ClassVariableWriteNode < Node
|
|
295
|
+
attr_reader var: Symbol
|
|
296
|
+
end
|
|
297
|
+
end
|
|
298
|
+
end
|
|
299
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module TypeProf
|
|
2
|
+
module Core
|
|
3
|
+
class Type
|
|
4
|
+
def base_type: (GlobalEnv genv) -> Type
|
|
5
|
+
|
|
6
|
+
class Singleton < Type
|
|
7
|
+
attr_reader mod: ModuleEntity
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
class Instance < Type
|
|
11
|
+
attr_reader mod: ModuleEntity
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
class Symbol < Type
|
|
15
|
+
attr_reader sym: ::Symbol
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
class Bot < Type
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
module TypeProf
|
|
2
|
+
class CodePosition
|
|
3
|
+
attr_reader lineno: Integer
|
|
4
|
+
attr_reader column: Integer
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
class CodeRange
|
|
8
|
+
attr_reader first: CodePosition
|
|
9
|
+
attr_reader last: CodePosition
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
module Core
|
|
13
|
+
class Service
|
|
14
|
+
attr_reader genv: GlobalEnv
|
|
15
|
+
def initialize: (Hash[Symbol, bool | String] options) -> void
|
|
16
|
+
def update_rb_file: (String path, String? code) -> void
|
|
17
|
+
def update_rbs_file: (String path, String? code) -> void
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
class GlobalEnv
|
|
21
|
+
def resolve_method: (Array[Symbol] cpath, bool singleton, Symbol mid) -> MethodEntity
|
|
22
|
+
def resolve_const: (Array[Symbol] cpath) -> ValueEntity
|
|
23
|
+
def resolve_cpath: (Array[Symbol] cpath) -> ModuleEntity
|
|
24
|
+
def each_superclass: (ModuleEntity mod, bool singleton) { (ModuleEntity, bool) -> void } -> void
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
class Box
|
|
28
|
+
attr_reader node: AST::Node
|
|
29
|
+
|
|
30
|
+
# Yields one resolution candidate per (entity, receiver type) pair; the
|
|
31
|
+
# entity and types are TypeProf internals, kept untyped on purpose.
|
|
32
|
+
def resolve: (GlobalEnv genv, untyped changes) { (untyped entity, untyped ty, Symbol mid, untyped orig_ty) -> void } -> void
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
class MethodEntity
|
|
36
|
+
attr_reader decls: Set[Box]
|
|
37
|
+
attr_reader defs: Set[Box]
|
|
38
|
+
attr_reader aliases: Hash[Box, Symbol]
|
|
39
|
+
attr_reader method_call_boxes: Set[Box]
|
|
40
|
+
def exist?: () -> bool
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
class ValueEntity
|
|
44
|
+
attr_reader read_boxes: Set[Box]
|
|
45
|
+
attr_reader vtx: BasicVertex
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
class ModuleEntity
|
|
49
|
+
attr_reader cpath: Array[Symbol]
|
|
50
|
+
attr_reader superclass: ModuleEntity?
|
|
51
|
+
attr_reader included_modules: Hash[ModuleEntity, ModuleEntity]
|
|
52
|
+
attr_reader child_modules: Hash[ModuleEntity, ModuleEntity]
|
|
53
|
+
attr_reader consts: Hash[Symbol, ValueEntity]
|
|
54
|
+
attr_reader methods: Hash[bool, Hash[Symbol, MethodEntity]]
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
class BasicVertex
|
|
58
|
+
attr_reader types: Hash[Type, bool]
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
class CRef
|
|
62
|
+
attr_reader cpath: Array[Symbol]
|
|
63
|
+
attr_reader scope_level: Symbol
|
|
64
|
+
attr_reader mid: Symbol?
|
|
65
|
+
attr_reader outer: CRef?
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
class LocalEnv
|
|
69
|
+
attr_reader cref: CRef
|
|
70
|
+
attr_reader locals: Hash[Symbol, BasicVertex]
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
data/tools/regen_pins.rb
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Regenerates the exact-byte pins in tests/ryac/levels/test_level*.rb from
|
|
4
|
+
# the current pipeline. The level tests are the model: run this after a
|
|
5
|
+
# deliberate behavior change, then review the pin diff — a surprising hunk
|
|
6
|
+
# is a caught bug, never a reason to loosen an assertion (see CLAUDE.md).
|
|
7
|
+
#
|
|
8
|
+
# ruby tools/regen_pins.rb
|
|
9
|
+
|
|
10
|
+
ROOT = File.expand_path('..', __dir__)
|
|
11
|
+
$LOAD_PATH.unshift File.join(ROOT, 'lib')
|
|
12
|
+
require 'ryac'
|
|
13
|
+
# The level tests run these exact recipes; regenerating from the same
|
|
14
|
+
# table is what keeps the pins reproducible by a test run.
|
|
15
|
+
require_relative '../tests/support/stage_recipes'
|
|
16
|
+
|
|
17
|
+
CODE = File.read(File.join(ROOT, 'tests/fixtures/level_test_code.rb'), encoding: Encoding::UTF_8)
|
|
18
|
+
|
|
19
|
+
RECIPES = MinifyTestHelper::STAGE_RECIPES
|
|
20
|
+
|
|
21
|
+
# Cosmetic chunking in the pins' style: break after ';' when a natural
|
|
22
|
+
# statement head follows. Lossless by construction (join == original).
|
|
23
|
+
def chunk(code)
|
|
24
|
+
lines = code.gsub(/;(?=(?:def |class |module |alias |attr|puts |end;|define_))/, ";\n").split("\n")
|
|
25
|
+
raise 'chunking lost bytes' unless lines.join == code
|
|
26
|
+
lines
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
RECIPES.each do |level, stages|
|
|
30
|
+
result = Ryac::Minifier.run_stages(CODE, stages)
|
|
31
|
+
path = File.join(ROOT, "tests/ryac/levels/test_level#{level}.rb")
|
|
32
|
+
text = File.read(path, encoding: Encoding::UTF_8)
|
|
33
|
+
|
|
34
|
+
entries = chunk(result.code).map { |line| " #{line.inspect}," }.join("\n")
|
|
35
|
+
block = "expected = [\n#{entries}\n ].join('')"
|
|
36
|
+
new_text = text.sub(/expected = \[.*?\]\.join\(''\)/m) { block }
|
|
37
|
+
raise "expected block not found in #{path}" if new_text == text && !text.include?(block)
|
|
38
|
+
|
|
39
|
+
pre = "assert_equal #{result.preamble.inspect.tr('"', "'")}, result.preamble"
|
|
40
|
+
new_text = new_text.sub(/assert_equal '.*?', result\.preamble/) { pre }
|
|
41
|
+
ali = "assert_equal #{result.aliases.inspect.tr('"', "'")}, result.aliases"
|
|
42
|
+
new_text = new_text.sub(/assert_equal '.*?', result\.aliases/) { ali }
|
|
43
|
+
File.write(path, new_text)
|
|
44
|
+
puts "level #{level}: code=#{result.code.bytesize}B preamble=#{result.preamble.bytesize}B aliases=#{result.aliases.bytesize}B"
|
|
45
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: ryac
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.2.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- ahogappa
|
|
8
|
+
bindir: bin
|
|
9
|
+
cert_chain: []
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
|
+
dependencies:
|
|
12
|
+
- !ruby/object:Gem::Dependency
|
|
13
|
+
name: prism
|
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
|
15
|
+
requirements:
|
|
16
|
+
- - ">="
|
|
17
|
+
- !ruby/object:Gem::Version
|
|
18
|
+
version: 1.4.0
|
|
19
|
+
type: :runtime
|
|
20
|
+
prerelease: false
|
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
22
|
+
requirements:
|
|
23
|
+
- - ">="
|
|
24
|
+
- !ruby/object:Gem::Version
|
|
25
|
+
version: 1.4.0
|
|
26
|
+
- !ruby/object:Gem::Dependency
|
|
27
|
+
name: typeprof
|
|
28
|
+
requirement: !ruby/object:Gem::Requirement
|
|
29
|
+
requirements:
|
|
30
|
+
- - ">="
|
|
31
|
+
- !ruby/object:Gem::Version
|
|
32
|
+
version: 0.32.0
|
|
33
|
+
type: :runtime
|
|
34
|
+
prerelease: false
|
|
35
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
36
|
+
requirements:
|
|
37
|
+
- - ">="
|
|
38
|
+
- !ruby/object:Gem::Version
|
|
39
|
+
version: 0.32.0
|
|
40
|
+
- !ruby/object:Gem::Dependency
|
|
41
|
+
name: rbs
|
|
42
|
+
requirement: !ruby/object:Gem::Requirement
|
|
43
|
+
requirements:
|
|
44
|
+
- - ">="
|
|
45
|
+
- !ruby/object:Gem::Version
|
|
46
|
+
version: 3.6.0
|
|
47
|
+
- - "<"
|
|
48
|
+
- !ruby/object:Gem::Version
|
|
49
|
+
version: 4.1.0
|
|
50
|
+
type: :runtime
|
|
51
|
+
prerelease: false
|
|
52
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
53
|
+
requirements:
|
|
54
|
+
- - ">="
|
|
55
|
+
- !ruby/object:Gem::Version
|
|
56
|
+
version: 3.6.0
|
|
57
|
+
- - "<"
|
|
58
|
+
- !ruby/object:Gem::Version
|
|
59
|
+
version: 4.1.0
|
|
60
|
+
description: 'Ryac minifies Ruby source code using Prism AST transformations and TypeProf
|
|
61
|
+
type inference. It supports multi-file bundling via require_relative, two compression
|
|
62
|
+
levels (stable: whitespace removal, constant folding, constant/variable renaming;
|
|
63
|
+
unstable: adds method renaming), and preserves functional equivalence through scope-aware
|
|
64
|
+
analysis.'
|
|
65
|
+
email:
|
|
66
|
+
- ahogappa@gmail.com
|
|
67
|
+
executables:
|
|
68
|
+
- ryac
|
|
69
|
+
extensions: []
|
|
70
|
+
extra_rdoc_files: []
|
|
71
|
+
files:
|
|
72
|
+
- LICENSE
|
|
73
|
+
- README.md
|
|
74
|
+
- Rakefile
|
|
75
|
+
- Steepfile
|
|
76
|
+
- bin/console
|
|
77
|
+
- bin/ryac
|
|
78
|
+
- bin/setup
|
|
79
|
+
- lib/ryac.rb
|
|
80
|
+
- lib/ryac/analysis/constant/collection.rb
|
|
81
|
+
- lib/ryac/analysis/constant/rename_mapping.rb
|
|
82
|
+
- lib/ryac/analysis/cvar/collection.rb
|
|
83
|
+
- lib/ryac/analysis/gvar/collection.rb
|
|
84
|
+
- lib/ryac/analysis/gvar/rename_mapping.rb
|
|
85
|
+
- lib/ryac/analysis/ivar/collection.rb
|
|
86
|
+
- lib/ryac/analysis/keyword/collection.rb
|
|
87
|
+
- lib/ryac/analysis/keyword/rename_mapping.rb
|
|
88
|
+
- lib/ryac/analysis/local_scopes.rb
|
|
89
|
+
- lib/ryac/analysis/method/collection.rb
|
|
90
|
+
- lib/ryac/analysis/method/rename_mapping.rb
|
|
91
|
+
- lib/ryac/analysis/method_aliases.rb
|
|
92
|
+
- lib/ryac/analysis/method_aliasing.rb
|
|
93
|
+
- lib/ryac/analysis/nesting.rb
|
|
94
|
+
- lib/ryac/analysis/scope_management.rb
|
|
95
|
+
- lib/ryac/analysis/site_bucket_mapping.rb
|
|
96
|
+
- lib/ryac/analysis/type_oracle.rb
|
|
97
|
+
- lib/ryac/ast_utils.rb
|
|
98
|
+
- lib/ryac/errors.rb
|
|
99
|
+
- lib/ryac/gem_resolver.rb
|
|
100
|
+
- lib/ryac/minifier.rb
|
|
101
|
+
- lib/ryac/name_generator.rb
|
|
102
|
+
- lib/ryac/pipeline/analyzer.rb
|
|
103
|
+
- lib/ryac/pipeline/attr_decl_shorten.rb
|
|
104
|
+
- lib/ryac/pipeline/boolean_shorten.rb
|
|
105
|
+
- lib/ryac/pipeline/char_shorten.rb
|
|
106
|
+
- lib/ryac/pipeline/compactor.rb
|
|
107
|
+
- lib/ryac/pipeline/concatenator.rb
|
|
108
|
+
- lib/ryac/pipeline/constant_aliaser.rb
|
|
109
|
+
- lib/ryac/pipeline/constant_fold.rb
|
|
110
|
+
- lib/ryac/pipeline/control_flow_simplify.rb
|
|
111
|
+
- lib/ryac/pipeline/data_types.rb
|
|
112
|
+
- lib/ryac/pipeline/endless_method.rb
|
|
113
|
+
- lib/ryac/pipeline/errors.rb
|
|
114
|
+
- lib/ryac/pipeline/file_collector.rb
|
|
115
|
+
- lib/ryac/pipeline/method_renamer.rb
|
|
116
|
+
- lib/ryac/pipeline/paren_optimizer.rb
|
|
117
|
+
- lib/ryac/pipeline/rename_patcher.rb
|
|
118
|
+
- lib/ryac/pipeline/source_patcher.rb
|
|
119
|
+
- lib/ryac/pipeline/spelling_shorten.rb
|
|
120
|
+
- lib/ryac/pipeline/stage.rb
|
|
121
|
+
- lib/ryac/pipeline/stage_runner.rb
|
|
122
|
+
- lib/ryac/pipeline/variable_renamer.rb
|
|
123
|
+
- lib/ryac/union_find.rb
|
|
124
|
+
- lib/ryac/version.rb
|
|
125
|
+
- rbs_collection.lock.yaml
|
|
126
|
+
- rbs_collection.yaml
|
|
127
|
+
- sig/ryac.rbs
|
|
128
|
+
- sig/ryac/analysis/constant/collection.rbs
|
|
129
|
+
- sig/ryac/analysis/constant/rename_mapping.rbs
|
|
130
|
+
- sig/ryac/analysis/cvar/collection.rbs
|
|
131
|
+
- sig/ryac/analysis/gvar/collection.rbs
|
|
132
|
+
- sig/ryac/analysis/gvar/rename_mapping.rbs
|
|
133
|
+
- sig/ryac/analysis/ivar/collection.rbs
|
|
134
|
+
- sig/ryac/analysis/keyword/collection.rbs
|
|
135
|
+
- sig/ryac/analysis/keyword/rename_mapping.rbs
|
|
136
|
+
- sig/ryac/analysis/local_scopes.rbs
|
|
137
|
+
- sig/ryac/analysis/method/collection.rbs
|
|
138
|
+
- sig/ryac/analysis/method/rename_mapping.rbs
|
|
139
|
+
- sig/ryac/analysis/method_aliases.rbs
|
|
140
|
+
- sig/ryac/analysis/method_aliasing.rbs
|
|
141
|
+
- sig/ryac/analysis/nesting.rbs
|
|
142
|
+
- sig/ryac/analysis/scope_management.rbs
|
|
143
|
+
- sig/ryac/analysis/site_bucket_mapping.rbs
|
|
144
|
+
- sig/ryac/analysis/type_oracle.rbs
|
|
145
|
+
- sig/ryac/ast_utils.rbs
|
|
146
|
+
- sig/ryac/errors.rbs
|
|
147
|
+
- sig/ryac/gem_resolver.rbs
|
|
148
|
+
- sig/ryac/minifier.rbs
|
|
149
|
+
- sig/ryac/name_generator.rbs
|
|
150
|
+
- sig/ryac/pipeline/analyzer.rbs
|
|
151
|
+
- sig/ryac/pipeline/attr_decl_shorten.rbs
|
|
152
|
+
- sig/ryac/pipeline/boolean_shorten.rbs
|
|
153
|
+
- sig/ryac/pipeline/char_shorten.rbs
|
|
154
|
+
- sig/ryac/pipeline/compactor.rbs
|
|
155
|
+
- sig/ryac/pipeline/concatenator.rbs
|
|
156
|
+
- sig/ryac/pipeline/constant_aliaser.rbs
|
|
157
|
+
- sig/ryac/pipeline/constant_fold.rbs
|
|
158
|
+
- sig/ryac/pipeline/control_flow_simplify.rbs
|
|
159
|
+
- sig/ryac/pipeline/data_types.rbs
|
|
160
|
+
- sig/ryac/pipeline/endless_method.rbs
|
|
161
|
+
- sig/ryac/pipeline/errors.rbs
|
|
162
|
+
- sig/ryac/pipeline/file_collector.rbs
|
|
163
|
+
- sig/ryac/pipeline/method_renamer.rbs
|
|
164
|
+
- sig/ryac/pipeline/paren_optimizer.rbs
|
|
165
|
+
- sig/ryac/pipeline/rename_patcher.rbs
|
|
166
|
+
- sig/ryac/pipeline/source_patcher.rbs
|
|
167
|
+
- sig/ryac/pipeline/spelling_shorten.rbs
|
|
168
|
+
- sig/ryac/pipeline/stage.rbs
|
|
169
|
+
- sig/ryac/pipeline/stage_runner.rbs
|
|
170
|
+
- sig/ryac/pipeline/variable_renamer.rbs
|
|
171
|
+
- sig/ryac/union_find.rbs
|
|
172
|
+
- sig/shims/env.rbs
|
|
173
|
+
- sig/shims/typeprof/core.rbs
|
|
174
|
+
- sig/shims/typeprof/core/ast.rbs
|
|
175
|
+
- sig/shims/typeprof/core/type.rbs
|
|
176
|
+
- tools/regen_pins.rb
|
|
177
|
+
homepage: https://github.com/ahogappa/ryac
|
|
178
|
+
licenses:
|
|
179
|
+
- MIT
|
|
180
|
+
metadata:
|
|
181
|
+
homepage_uri: https://github.com/ahogappa/ryac
|
|
182
|
+
source_code_uri: https://github.com/ahogappa/ryac
|
|
183
|
+
changelog_uri: https://github.com/ahogappa/ryac/releases
|
|
184
|
+
rdoc_options: []
|
|
185
|
+
require_paths:
|
|
186
|
+
- lib
|
|
187
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
188
|
+
requirements:
|
|
189
|
+
- - ">="
|
|
190
|
+
- !ruby/object:Gem::Version
|
|
191
|
+
version: 3.4.0
|
|
192
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
193
|
+
requirements:
|
|
194
|
+
- - ">="
|
|
195
|
+
- !ruby/object:Gem::Version
|
|
196
|
+
version: '0'
|
|
197
|
+
requirements: []
|
|
198
|
+
rubygems_version: 4.0.16
|
|
199
|
+
specification_version: 4
|
|
200
|
+
summary: A Ruby source code minifier with type-aware renaming (ryac, read as ryaku)
|
|
201
|
+
test_files: []
|