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,42 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Ryac
|
|
4
|
+
module UnionFind
|
|
5
|
+
def uf_init
|
|
6
|
+
@parent = {}
|
|
7
|
+
@rank = {}
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def uf_root(key)
|
|
11
|
+
@parent[key] = uf_root(@parent[key]) if @parent[key] != key
|
|
12
|
+
@parent[key]
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def merge_groups(key1, key2)
|
|
16
|
+
root1 = uf_root(key1)
|
|
17
|
+
root2 = uf_root(key2)
|
|
18
|
+
return if root1 == root2
|
|
19
|
+
|
|
20
|
+
if @rank[root1] < @rank[root2]
|
|
21
|
+
@parent[root1] = root2
|
|
22
|
+
elsif @rank[root1] > @rank[root2]
|
|
23
|
+
@parent[root2] = root1
|
|
24
|
+
else
|
|
25
|
+
@parent[root2] = root1
|
|
26
|
+
@rank[root1] += 1
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
private
|
|
31
|
+
|
|
32
|
+
def uf_add(key)
|
|
33
|
+
@parent[key] ||= key
|
|
34
|
+
@rank[key] ||= 0
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def uf_remove(key)
|
|
38
|
+
@parent.delete(key)
|
|
39
|
+
@rank.delete(key)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
data/lib/ryac/version.rb
ADDED
data/lib/ryac.rb
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'prism'
|
|
4
|
+
require 'rbconfig'
|
|
5
|
+
|
|
6
|
+
require_relative "ryac/errors"
|
|
7
|
+
require_relative "ryac/ast_utils"
|
|
8
|
+
require_relative "ryac/version"
|
|
9
|
+
require_relative "ryac/name_generator"
|
|
10
|
+
require_relative "ryac/analysis/method_aliases"
|
|
11
|
+
require_relative "ryac/analysis/constant/rename_mapping"
|
|
12
|
+
require_relative "ryac/analysis/scope_management"
|
|
13
|
+
require_relative "ryac/analysis/local_scopes"
|
|
14
|
+
require_relative "ryac/analysis/nesting"
|
|
15
|
+
require_relative "ryac/analysis/type_oracle"
|
|
16
|
+
require_relative "ryac/analysis/constant/collection"
|
|
17
|
+
require_relative "ryac/analysis/method_aliasing"
|
|
18
|
+
require_relative "ryac/union_find"
|
|
19
|
+
require_relative "ryac/analysis/method/rename_mapping"
|
|
20
|
+
require_relative "ryac/analysis/method/collection"
|
|
21
|
+
require_relative "ryac/analysis/site_bucket_mapping"
|
|
22
|
+
require_relative "ryac/analysis/ivar/collection"
|
|
23
|
+
require_relative "ryac/analysis/cvar/collection"
|
|
24
|
+
require_relative "ryac/analysis/gvar/rename_mapping"
|
|
25
|
+
require_relative "ryac/analysis/gvar/collection"
|
|
26
|
+
require_relative "ryac/analysis/keyword/rename_mapping"
|
|
27
|
+
require_relative "ryac/analysis/keyword/collection"
|
|
28
|
+
require_relative "ryac/minifier"
|
|
29
|
+
require_relative "ryac/gem_resolver"
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
---
|
|
2
|
+
path: ".gem_rbs_collection"
|
|
3
|
+
gems:
|
|
4
|
+
- name: activesupport
|
|
5
|
+
version: '7.0'
|
|
6
|
+
source:
|
|
7
|
+
type: git
|
|
8
|
+
name: ruby/gem_rbs_collection
|
|
9
|
+
revision: 9ab762c8247028f90620fc93c4e7aac20eb693d7
|
|
10
|
+
remote: https://github.com/ruby/gem_rbs_collection.git
|
|
11
|
+
repo_dir: gems
|
|
12
|
+
- name: ast
|
|
13
|
+
version: '2.4'
|
|
14
|
+
source:
|
|
15
|
+
type: git
|
|
16
|
+
name: ruby/gem_rbs_collection
|
|
17
|
+
revision: 9ab762c8247028f90620fc93c4e7aac20eb693d7
|
|
18
|
+
remote: https://github.com/ruby/gem_rbs_collection.git
|
|
19
|
+
repo_dir: gems
|
|
20
|
+
- name: base64
|
|
21
|
+
version: 0.3.0
|
|
22
|
+
source:
|
|
23
|
+
type: rubygems
|
|
24
|
+
- name: bigdecimal
|
|
25
|
+
version: 4.1.2
|
|
26
|
+
source:
|
|
27
|
+
type: rubygems
|
|
28
|
+
- name: concurrent-ruby
|
|
29
|
+
version: '1.1'
|
|
30
|
+
source:
|
|
31
|
+
type: git
|
|
32
|
+
name: ruby/gem_rbs_collection
|
|
33
|
+
revision: 9ab762c8247028f90620fc93c4e7aac20eb693d7
|
|
34
|
+
remote: https://github.com/ruby/gem_rbs_collection.git
|
|
35
|
+
repo_dir: gems
|
|
36
|
+
- name: connection_pool
|
|
37
|
+
version: '2.4'
|
|
38
|
+
source:
|
|
39
|
+
type: git
|
|
40
|
+
name: ruby/gem_rbs_collection
|
|
41
|
+
revision: 9ab762c8247028f90620fc93c4e7aac20eb693d7
|
|
42
|
+
remote: https://github.com/ruby/gem_rbs_collection.git
|
|
43
|
+
repo_dir: gems
|
|
44
|
+
- name: csv
|
|
45
|
+
version: '3.3'
|
|
46
|
+
source:
|
|
47
|
+
type: git
|
|
48
|
+
name: ruby/gem_rbs_collection
|
|
49
|
+
revision: 9ab762c8247028f90620fc93c4e7aac20eb693d7
|
|
50
|
+
remote: https://github.com/ruby/gem_rbs_collection.git
|
|
51
|
+
repo_dir: gems
|
|
52
|
+
- name: date
|
|
53
|
+
version: '0'
|
|
54
|
+
source:
|
|
55
|
+
type: stdlib
|
|
56
|
+
- name: digest
|
|
57
|
+
version: '0'
|
|
58
|
+
source:
|
|
59
|
+
type: stdlib
|
|
60
|
+
- name: erb
|
|
61
|
+
version: '0'
|
|
62
|
+
source:
|
|
63
|
+
type: stdlib
|
|
64
|
+
- name: ffi
|
|
65
|
+
version: 1.17.4
|
|
66
|
+
source:
|
|
67
|
+
type: rubygems
|
|
68
|
+
- name: fileutils
|
|
69
|
+
version: '0'
|
|
70
|
+
source:
|
|
71
|
+
type: stdlib
|
|
72
|
+
- name: forwardable
|
|
73
|
+
version: '0'
|
|
74
|
+
source:
|
|
75
|
+
type: stdlib
|
|
76
|
+
- name: i18n
|
|
77
|
+
version: '1.10'
|
|
78
|
+
source:
|
|
79
|
+
type: git
|
|
80
|
+
name: ruby/gem_rbs_collection
|
|
81
|
+
revision: 9ab762c8247028f90620fc93c4e7aac20eb693d7
|
|
82
|
+
remote: https://github.com/ruby/gem_rbs_collection.git
|
|
83
|
+
repo_dir: gems
|
|
84
|
+
- name: io-console
|
|
85
|
+
version: '0'
|
|
86
|
+
source:
|
|
87
|
+
type: stdlib
|
|
88
|
+
- name: json
|
|
89
|
+
version: '0'
|
|
90
|
+
source:
|
|
91
|
+
type: stdlib
|
|
92
|
+
- name: listen
|
|
93
|
+
version: '3.9'
|
|
94
|
+
source:
|
|
95
|
+
type: git
|
|
96
|
+
name: ruby/gem_rbs_collection
|
|
97
|
+
revision: 9ab762c8247028f90620fc93c4e7aac20eb693d7
|
|
98
|
+
remote: https://github.com/ruby/gem_rbs_collection.git
|
|
99
|
+
repo_dir: gems
|
|
100
|
+
- name: logger
|
|
101
|
+
version: '1.7'
|
|
102
|
+
source:
|
|
103
|
+
type: git
|
|
104
|
+
name: ruby/gem_rbs_collection
|
|
105
|
+
revision: 9ab762c8247028f90620fc93c4e7aac20eb693d7
|
|
106
|
+
remote: https://github.com/ruby/gem_rbs_collection.git
|
|
107
|
+
repo_dir: gems
|
|
108
|
+
- name: minitest
|
|
109
|
+
version: '5.25'
|
|
110
|
+
source:
|
|
111
|
+
type: git
|
|
112
|
+
name: ruby/gem_rbs_collection
|
|
113
|
+
revision: 9ab762c8247028f90620fc93c4e7aac20eb693d7
|
|
114
|
+
remote: https://github.com/ruby/gem_rbs_collection.git
|
|
115
|
+
repo_dir: gems
|
|
116
|
+
- name: monitor
|
|
117
|
+
version: '0'
|
|
118
|
+
source:
|
|
119
|
+
type: stdlib
|
|
120
|
+
- name: openssl
|
|
121
|
+
version: '0'
|
|
122
|
+
source:
|
|
123
|
+
type: stdlib
|
|
124
|
+
- name: optparse
|
|
125
|
+
version: '0'
|
|
126
|
+
source:
|
|
127
|
+
type: stdlib
|
|
128
|
+
- name: parser
|
|
129
|
+
version: '3.2'
|
|
130
|
+
source:
|
|
131
|
+
type: git
|
|
132
|
+
name: ruby/gem_rbs_collection
|
|
133
|
+
revision: 9ab762c8247028f90620fc93c4e7aac20eb693d7
|
|
134
|
+
remote: https://github.com/ruby/gem_rbs_collection.git
|
|
135
|
+
repo_dir: gems
|
|
136
|
+
- name: pp
|
|
137
|
+
version: '0'
|
|
138
|
+
source:
|
|
139
|
+
type: stdlib
|
|
140
|
+
- name: prettyprint
|
|
141
|
+
version: '0'
|
|
142
|
+
source:
|
|
143
|
+
type: stdlib
|
|
144
|
+
- name: prism
|
|
145
|
+
version: 1.9.0
|
|
146
|
+
source:
|
|
147
|
+
type: rubygems
|
|
148
|
+
- name: rainbow
|
|
149
|
+
version: '3.0'
|
|
150
|
+
source:
|
|
151
|
+
type: git
|
|
152
|
+
name: ruby/gem_rbs_collection
|
|
153
|
+
revision: 9ab762c8247028f90620fc93c4e7aac20eb693d7
|
|
154
|
+
remote: https://github.com/ruby/gem_rbs_collection.git
|
|
155
|
+
repo_dir: gems
|
|
156
|
+
- name: rake
|
|
157
|
+
version: '13.0'
|
|
158
|
+
source:
|
|
159
|
+
type: git
|
|
160
|
+
name: ruby/gem_rbs_collection
|
|
161
|
+
revision: 9ab762c8247028f90620fc93c4e7aac20eb693d7
|
|
162
|
+
remote: https://github.com/ruby/gem_rbs_collection.git
|
|
163
|
+
repo_dir: gems
|
|
164
|
+
- name: random-formatter
|
|
165
|
+
version: '0'
|
|
166
|
+
source:
|
|
167
|
+
type: stdlib
|
|
168
|
+
- name: rbs
|
|
169
|
+
version: 4.0.0
|
|
170
|
+
source:
|
|
171
|
+
type: rubygems
|
|
172
|
+
- name: rdoc
|
|
173
|
+
version: '0'
|
|
174
|
+
source:
|
|
175
|
+
type: stdlib
|
|
176
|
+
- name: securerandom
|
|
177
|
+
version: '0'
|
|
178
|
+
source:
|
|
179
|
+
type: stdlib
|
|
180
|
+
- name: singleton
|
|
181
|
+
version: '0'
|
|
182
|
+
source:
|
|
183
|
+
type: stdlib
|
|
184
|
+
- name: socket
|
|
185
|
+
version: '0'
|
|
186
|
+
source:
|
|
187
|
+
type: stdlib
|
|
188
|
+
- name: steep
|
|
189
|
+
version: 2.0.0.dev
|
|
190
|
+
source:
|
|
191
|
+
type: rubygems
|
|
192
|
+
- name: stringio
|
|
193
|
+
version: '0'
|
|
194
|
+
source:
|
|
195
|
+
type: stdlib
|
|
196
|
+
- name: strscan
|
|
197
|
+
version: '0'
|
|
198
|
+
source:
|
|
199
|
+
type: stdlib
|
|
200
|
+
- name: time
|
|
201
|
+
version: '0'
|
|
202
|
+
source:
|
|
203
|
+
type: stdlib
|
|
204
|
+
- name: timeout
|
|
205
|
+
version: '0'
|
|
206
|
+
source:
|
|
207
|
+
type: stdlib
|
|
208
|
+
- name: tsort
|
|
209
|
+
version: '0'
|
|
210
|
+
source:
|
|
211
|
+
type: stdlib
|
|
212
|
+
- name: tzinfo
|
|
213
|
+
version: '2.0'
|
|
214
|
+
source:
|
|
215
|
+
type: git
|
|
216
|
+
name: ruby/gem_rbs_collection
|
|
217
|
+
revision: 9ab762c8247028f90620fc93c4e7aac20eb693d7
|
|
218
|
+
remote: https://github.com/ruby/gem_rbs_collection.git
|
|
219
|
+
repo_dir: gems
|
|
220
|
+
- name: uri
|
|
221
|
+
version: '0'
|
|
222
|
+
source:
|
|
223
|
+
type: stdlib
|
|
224
|
+
gemfile_lock_path: Gemfile.lock
|
data/rbs_collection.yaml
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Download sources
|
|
2
|
+
sources:
|
|
3
|
+
- type: git
|
|
4
|
+
name: ruby/gem_rbs_collection
|
|
5
|
+
remote: https://github.com/ruby/gem_rbs_collection.git
|
|
6
|
+
revision: main
|
|
7
|
+
repo_dir: gems
|
|
8
|
+
|
|
9
|
+
# You can specify local directories as sources also.
|
|
10
|
+
# - type: local
|
|
11
|
+
# path: path/to/your/local/repository
|
|
12
|
+
|
|
13
|
+
# A directory to install the downloaded RBSs
|
|
14
|
+
path: .gem_rbs_collection
|
|
15
|
+
|
|
16
|
+
gems:
|
|
17
|
+
- name: typeprof
|
|
18
|
+
ignore: true
|
|
19
|
+
# steep's own dependency; under rbs 4.0 its gem-bundled sig/ directory is
|
|
20
|
+
# loaded once by the collection and once by steep itself, and the double
|
|
21
|
+
# insert raises RBS::DuplicatedDeclarationError — which kills steep's load
|
|
22
|
+
# thread and leaves `steep check` waiting forever. Nothing in lib/ touches
|
|
23
|
+
# the LSP types, so drop the collection-side copy.
|
|
24
|
+
- name: language_server-protocol
|
|
25
|
+
ignore: true
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
module Ryac
|
|
2
|
+
module AnalysisPhases
|
|
3
|
+
def each_constant_event: (Prism::Node prism_root) { (Symbol, Prism::Node, Array[Symbol]?, bool, bool) -> void } -> void
|
|
4
|
+
def class_definition_cpath: (Prism::ClassNode | Prism::ModuleNode node, Array[Symbol] nesting) -> Array[Symbol]?
|
|
5
|
+
def qualified_write_cpath: (Prism::Node target, Array[Symbol] nesting, ?strip_doubled_nesting: bool) -> Array[Symbol]?
|
|
6
|
+
def syntactic_const_segments: (Prism::Node node) -> Array[Symbol]
|
|
7
|
+
def struct_definition_write?: (Prism::Node node) -> bool
|
|
8
|
+
def collect_constants: (Prism::Node prism_root) -> void
|
|
9
|
+
def exclude_private_constants: (Prism::Node prism_root) -> void
|
|
10
|
+
def count_constant_references: (Prism::Node prism_root) -> void
|
|
11
|
+
def increment_constant_read_usage: (Prism::Node node) -> void
|
|
12
|
+
def resolve_user_defined_cpath: (Prism::Node node) -> Array[Symbol]?
|
|
13
|
+
def resolve_superclass_path: (Prism::Node superclass_node, Array[Symbol] class_cpath) -> Array[Symbol]?
|
|
14
|
+
def augment_constant_counts_via_oracle: () -> void
|
|
15
|
+
def collect_external_references: (Prism::Node prism_root) -> void
|
|
16
|
+
def precompute_constant_resolution: () -> void
|
|
17
|
+
def record_constant_read: (Prism::Node node) -> void
|
|
18
|
+
def mark_chain_prefixes: (Prism::Node node, Set[Integer] counted_prefix_ids) -> void
|
|
19
|
+
def external_prefix_for: (Prism::Node node) -> Array[Symbol]?
|
|
20
|
+
def complete_const_chain?: (Prism::Node node) -> bool
|
|
21
|
+
def required_external_root?: (Symbol root) -> bool
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
module BootConstants
|
|
25
|
+
self.@cache: Hash[Array[String], Set[Symbol]?]
|
|
26
|
+
|
|
27
|
+
def self.for: (Array[String] stdlib_requires) -> Set[Symbol]?
|
|
28
|
+
def self.probe: (Array[String] stdlib_requires) -> Set[Symbol]?
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
module Ryac
|
|
2
|
+
class ExternalPrefixInfo
|
|
3
|
+
attr_accessor prefix_path: Array[Symbol]
|
|
4
|
+
attr_accessor prefix_string: String?
|
|
5
|
+
attr_accessor short_name: String?
|
|
6
|
+
attr_accessor usage_count: Integer
|
|
7
|
+
attr_accessor char_savings: Integer
|
|
8
|
+
|
|
9
|
+
def self.new: (?prefix_path: Array[Symbol]?, ?prefix_string: String?, ?short_name: String?, ?usage_count: Integer?, ?char_savings: Integer?) -> ExternalPrefixInfo
|
|
10
|
+
def initialize: (?prefix_path: Array[Symbol]?, ?prefix_string: String?, ?short_name: String?, ?usage_count: Integer?, ?char_savings: Integer?) -> void
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
class ConstantInfo
|
|
14
|
+
attr_accessor original_name: Symbol?
|
|
15
|
+
attr_accessor full_path: Array[Symbol]
|
|
16
|
+
attr_accessor short_name: String?
|
|
17
|
+
attr_accessor usage_count: Integer
|
|
18
|
+
attr_accessor definition_type: Symbol?
|
|
19
|
+
attr_accessor scope_path: Array[Symbol]
|
|
20
|
+
|
|
21
|
+
def self.new: (?original_name: Symbol?, ?full_path: Array[Symbol]?, ?short_name: String?, ?usage_count: Integer?, ?definition_type: Symbol?, ?scope_path: Array[Symbol]?) -> ConstantInfo
|
|
22
|
+
def initialize: (?original_name: Symbol?, ?full_path: Array[Symbol]?, ?short_name: String?, ?usage_count: Integer?, ?definition_type: Symbol?, ?scope_path: Array[Symbol]?) -> void
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
class ConstantRenameMapping
|
|
26
|
+
attr_reader mappings: Hash[Array[Symbol], ConstantInfo]
|
|
27
|
+
attr_reader used_short_names: Set[String]
|
|
28
|
+
|
|
29
|
+
@state: Symbol
|
|
30
|
+
@by_name: Hash[Symbol, Array[ConstantInfo]]
|
|
31
|
+
@external_prefixes: Hash[Array[Symbol], ExternalPrefixInfo]
|
|
32
|
+
|
|
33
|
+
def initialize: (?boot_roots: Set[Symbol]?) -> void
|
|
34
|
+
def empty?: () -> bool
|
|
35
|
+
def finalized?: () -> bool
|
|
36
|
+
def add_definition_with_path: (Array[Symbol] static_cpath, definition_type: Symbol) -> void
|
|
37
|
+
def increment_usage_by_path: (Array[Symbol] static_cpath) -> void
|
|
38
|
+
def increment_usage: (Symbol name) -> void
|
|
39
|
+
def exclude_path: (Array[Symbol] static_cpath) -> void
|
|
40
|
+
def assign_short_names: (NameGenerator name_generator, ?skip_class_modules: bool) -> void
|
|
41
|
+
def generate_alias_declarations: () -> Array[String]
|
|
42
|
+
def short_name_for_path: (Array[Symbol]? static_cpath) -> String?
|
|
43
|
+
def short_name_for: (Symbol name) -> String?
|
|
44
|
+
def user_defined_path?: (Array[Symbol]? static_cpath) -> bool
|
|
45
|
+
def usage_count_for_path: (Array[Symbol] static_cpath) -> Integer
|
|
46
|
+
def set_usage_count_by_path: (Array[Symbol] static_cpath, Integer count) -> void
|
|
47
|
+
def each_user_defined_path: () { (Array[Symbol]) -> void } -> void
|
|
48
|
+
def class_or_module_path?: (Array[Symbol]? static_cpath) -> bool
|
|
49
|
+
def has_user_defined_prefix?: (Array[Symbol] full_path) -> bool
|
|
50
|
+
def add_external_prefix: (Array[Symbol] prefix_path, usage_count: Integer) -> void
|
|
51
|
+
def short_name_for_prefix: (Array[Symbol]? full_path) -> String?
|
|
52
|
+
def generate_prefix_declarations: () -> Array[String]
|
|
53
|
+
|
|
54
|
+
private
|
|
55
|
+
|
|
56
|
+
def external_class_root?: (Array[Symbol] cpath) -> bool
|
|
57
|
+
def runtime_constant?: (Array[Symbol] cpath) -> bool
|
|
58
|
+
def build_alias_declaration: (ConstantInfo info) -> String?
|
|
59
|
+
end
|
|
60
|
+
end
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
module Ryac
|
|
2
|
+
module AnalysisPhases
|
|
3
|
+
DYNAMIC_CVAR_METHODS: Array[Symbol]
|
|
4
|
+
CVAR_WRITE_NODES: Array[Class]
|
|
5
|
+
type cvar_write_node = Prism::ClassVariableWriteNode | Prism::ClassVariableTargetNode | Prism::ClassVariableOperatorWriteNode | Prism::ClassVariableOrWriteNode | Prism::ClassVariableAndWriteNode
|
|
6
|
+
|
|
7
|
+
def collect_cvar_definitions: (Prism::Node prism_root) -> void
|
|
8
|
+
def scan_dynamic_cvar_access: (Prism::Node prism_root) -> void
|
|
9
|
+
def merge_inherited_cvars: () -> void
|
|
10
|
+
end
|
|
11
|
+
end
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
module Ryac
|
|
2
|
+
module AnalysisPhases
|
|
3
|
+
GVAR_NODES: Array[Class]
|
|
4
|
+
type gvar_node = Prism::GlobalVariableReadNode | Prism::GlobalVariableWriteNode | Prism::GlobalVariableTargetNode | Prism::GlobalVariableOperatorWriteNode | Prism::GlobalVariableOrWriteNode | Prism::GlobalVariableAndWriteNode
|
|
5
|
+
|
|
6
|
+
def collect_gvar_definitions: (Prism::Node prism_root) -> void
|
|
7
|
+
def scan_alias_globals: (Prism::Node prism_root) -> void
|
|
8
|
+
end
|
|
9
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module Ryac
|
|
2
|
+
class GvarRenameMapping
|
|
3
|
+
PREFIX: String
|
|
4
|
+
KEPT_NAME_MAX: Integer
|
|
5
|
+
PERL_SPELLINGS: Hash[Symbol, String]
|
|
6
|
+
BUILT_IN_GLOBALS: Set[Symbol]
|
|
7
|
+
|
|
8
|
+
@gvars: Hash[Symbol, Array[Prism::Node]]
|
|
9
|
+
@written_names: Set[Symbol]
|
|
10
|
+
@excluded_names: Set[Symbol]
|
|
11
|
+
@node_short_names: Hash[[Integer, Integer], String]
|
|
12
|
+
|
|
13
|
+
def initialize: () -> void
|
|
14
|
+
|
|
15
|
+
def add_site: (Symbol name, Prism::Node node, ?write: bool) -> void
|
|
16
|
+
|
|
17
|
+
def exclude_name: (Symbol name) -> void
|
|
18
|
+
|
|
19
|
+
def assign_short_names: () -> void
|
|
20
|
+
|
|
21
|
+
def node_mapping: () -> Hash[[Integer, Integer], String]
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
module Ryac
|
|
2
|
+
module AnalysisPhases
|
|
3
|
+
DYNAMIC_IVAR_METHODS: Array[Symbol]
|
|
4
|
+
ATTR_DECLARATION_METHODS: Array[Symbol]
|
|
5
|
+
IVAR_WRITE_NODES: Array[Class]
|
|
6
|
+
type ivar_write_node = Prism::InstanceVariableWriteNode | Prism::InstanceVariableTargetNode | Prism::InstanceVariableOperatorWriteNode | Prism::InstanceVariableOrWriteNode | Prism::InstanceVariableAndWriteNode
|
|
7
|
+
|
|
8
|
+
def collect_ivar_definitions: (Prism::Node prism_root, Hash[Array[Symbol], Set[Symbol]] attr_backed) -> void
|
|
9
|
+
def collect_attr_backed_ivars: (Prism::Node prism_root) -> Hash[Array[Symbol], Set[Symbol]]
|
|
10
|
+
def scan_dynamic_ivar_access: (Prism::Node prism_root) -> void
|
|
11
|
+
def merge_inherited_ivars: () -> void
|
|
12
|
+
def scan_dynamic_sigil_access: (Prism::Node prism_root, Array[Symbol] methods, SiteBucketMapping mapping) -> void
|
|
13
|
+
def merge_inherited_sites: (SiteBucketMapping mapping) -> void
|
|
14
|
+
def reserve_attr_ivar_names: (Prism::Node prism_root) -> void
|
|
15
|
+
def coordinate_attr_renames: (Prism::Node prism_root, Hash[location_key, String] rename_map, Hash[location_key, String] attr_ivar_entries) -> Hash[location_key, Hash[Symbol, String]]
|
|
16
|
+
|
|
17
|
+
type attr_info = Hash[Symbol, untyped]
|
|
18
|
+
|
|
19
|
+
def classify_attr_declarations: (Prism::Node prism_root) -> [Array[attr_info], Array[attr_info]]
|
|
20
|
+
def collect_ivar_nodes_by_key: (Prism::Node prism_root) -> Hash[[Array[Symbol], Symbol], Array[Prism::Node]]
|
|
21
|
+
def assign_ivar_driven_names: (Array[attr_info] path_b_info, Hash[[Array[Symbol], Symbol], Array[Prism::Node]] ivar_nodes_by_key, Hash[[Array[Symbol], Symbol], String] path_a_mapping, Hash[location_key, String] rename_map) -> [Hash[[Array[Symbol], Symbol], String], Hash[[Array[Symbol], Symbol], Symbol]]
|
|
22
|
+
def apply_ivar_renames: (Hash[[Array[Symbol], Symbol], Array[Prism::Node]] ivar_nodes_by_key, Hash[[Array[Symbol], Symbol], String] combined_mapping, Hash[location_key, String] attr_ivar_entries) -> void
|
|
23
|
+
def apply_accessor_call_renames: (Array[attr_info] path_a_info, Array[attr_info] path_b_info, Hash[[Array[Symbol], Symbol], Symbol] path_b_method_mapping, Hash[location_key, String] rename_map) -> void
|
|
24
|
+
def build_attr_rename_map: (Array[attr_info] path_a_info, Array[attr_info] path_b_info, Hash[[Array[Symbol], Symbol], Symbol] path_b_method_mapping) -> Hash[location_key, Hash[Symbol, String]]
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
module Ryac
|
|
2
|
+
module AnalysisPhases
|
|
3
|
+
def collect_keyword_info: (Prism::Node prism_root) -> void
|
|
4
|
+
|
|
5
|
+
private
|
|
6
|
+
|
|
7
|
+
def each_attr_declaration: (Prism::Node prism_root, Array[Symbol] methods, ?require_class_body: bool) { (Prism::CallNode, Array[Symbol], bool, Symbol) -> void } -> void
|
|
8
|
+
def def_keyword_names: (Prism::DefNode def_node) -> Array[Symbol]
|
|
9
|
+
def def_keyword_rest?: (Prism::DefNode def_node) -> bool
|
|
10
|
+
def collect_keyword_call_sites: (Prism::Node prism_root) -> void
|
|
11
|
+
def forwards_parameters_to_super?: (Prism::DefNode def_node) -> bool
|
|
12
|
+
def register_keyword_calls: () -> Hash[Symbol, untyped]
|
|
13
|
+
def merge_super_forwarding: (Array[[method_key, method_key]] super_merges) -> void
|
|
14
|
+
def merge_polymorphic_keyword_groups: (Hash[location_key, Array[method_key]] call_node_to_keys) -> void
|
|
15
|
+
def exclude_unreachable_keyword_methods: (Array[method_key] zero_call_keys, Array[[method_key, method_key]] super_merges) -> void
|
|
16
|
+
def exclude_unresolved_keyword_calls: (Prism::Node prism_root, Set[location_key] resolved_site_keys) -> void
|
|
17
|
+
def carries_keyword_arguments?: (Prism::CallNode call_node) -> bool
|
|
18
|
+
|
|
19
|
+
public
|
|
20
|
+
@keyword_def_node_registry: Hash[method_key, Array[Prism::DefNode]]
|
|
21
|
+
@keyword_forwarding_super_keys: Set[method_key]
|
|
22
|
+
|
|
23
|
+
private
|
|
24
|
+
|
|
25
|
+
def exclude_method_valued_shorthand_calls: (Prism::Node prism_root) -> void
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
module Ryac
|
|
2
|
+
class KeywordRenameMapping
|
|
3
|
+
include UnionFind[method_key]
|
|
4
|
+
|
|
5
|
+
type call_entry = { symbol_node: Prism::SymbolNode, val_node: Prism::Node }
|
|
6
|
+
type keyword_method_info = { keywords: Set[Symbol], call_entries: Hash[Symbol, Array[call_entry]], excluded: bool }
|
|
7
|
+
|
|
8
|
+
@methods: Hash[method_key, keyword_method_info]
|
|
9
|
+
@node_short_names: Hash[location_key, String]
|
|
10
|
+
# Keyed by each group's union-find root.
|
|
11
|
+
@keyword_maps: Hash[method_key, Hash[Symbol, String]]
|
|
12
|
+
@frozen: bool
|
|
13
|
+
|
|
14
|
+
def initialize: () -> void
|
|
15
|
+
def add_keyword_def: (method_key method_key, Symbol keyword_sym) -> void
|
|
16
|
+
def add_keyword_call: (method_key method_key, Symbol keyword_sym, Prism::SymbolNode symbol_node, Prism::Node val_node) -> void
|
|
17
|
+
def exclude_method: (method_key method_key) -> void
|
|
18
|
+
|
|
19
|
+
def exclude_methods_by_mid: (Enumerable[Symbol] mids) -> void
|
|
20
|
+
def merge_groups: (method_key key1, method_key key2) -> void
|
|
21
|
+
def each_method_key: () { (method_key) -> void } -> void
|
|
22
|
+
def assign_short_names: () -> void
|
|
23
|
+
def node_mapping: () -> Hash[location_key, String]
|
|
24
|
+
def def_node_mapping: (Hash[method_key, Array[Prism::DefNode]] def_node_registry) -> Hash[location_key, Hash[Symbol, String]]
|
|
25
|
+
def build_variable_hints: () { (Prism::Node) -> scope_id? } -> Hash[scope_id, Hash[Symbol, String]]
|
|
26
|
+
|
|
27
|
+
private
|
|
28
|
+
|
|
29
|
+
def init_method: (method_key method_key) -> void
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
module Ryac
|
|
2
|
+
class LocalScopes
|
|
3
|
+
include RenameInvariants
|
|
4
|
+
|
|
5
|
+
DYNAMIC_VARIABLE_METHODS: Array[Symbol]
|
|
6
|
+
NUMBERED_PARAM_RE: Regexp
|
|
7
|
+
VARIABLE_NODES: Array[Class]
|
|
8
|
+
|
|
9
|
+
type prism_scope_node = Prism::ProgramNode | Prism::DefNode | Prism::ClassNode
|
|
10
|
+
| Prism::ModuleNode | Prism::SingletonClassNode
|
|
11
|
+
| Prism::BlockNode | Prism::LambdaNode
|
|
12
|
+
type prism_variable_node = Prism::LocalVariableReadNode | Prism::LocalVariableWriteNode
|
|
13
|
+
| Prism::LocalVariableTargetNode | Prism::LocalVariableOperatorWriteNode
|
|
14
|
+
| Prism::LocalVariableOrWriteNode | Prism::LocalVariableAndWriteNode
|
|
15
|
+
|
|
16
|
+
# Runtime class is built via Struct.new(..., keyword_init: true).
|
|
17
|
+
class Scope
|
|
18
|
+
def self.new: (?id: scope_id, ?kind: Symbol, ?node: prism_scope_node, ?parent: Scope?, ?owner_call: Prism::CallNode?, ?mapping: Hash[Symbol, String]?) -> Scope
|
|
19
|
+
|
|
20
|
+
attr_accessor id: scope_id
|
|
21
|
+
attr_accessor kind: Symbol
|
|
22
|
+
attr_accessor node: prism_scope_node
|
|
23
|
+
attr_accessor parent: Scope?
|
|
24
|
+
attr_accessor owner_call: Prism::CallNode?
|
|
25
|
+
attr_accessor mapping: Hash[Symbol, String]?
|
|
26
|
+
|
|
27
|
+
def allocated?: () -> bool
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
@program: Prism::ProgramNode
|
|
31
|
+
@scope_by_node: Hash[Integer, Scope]
|
|
32
|
+
|
|
33
|
+
attr_reader scopes: Array[Scope]
|
|
34
|
+
attr_reader rename_entries: Hash[location_key, String]
|
|
35
|
+
attr_reader def_param_names: Hash[line_col_key, Hash[Symbol, String]]
|
|
36
|
+
attr_reader block_param_names: Hash[location_key, Hash[Symbol, String]]
|
|
37
|
+
attr_reader for_index_names: Hash[line_col_key, String]
|
|
38
|
+
|
|
39
|
+
def initialize: (Prism::ProgramNode program_node) -> void
|
|
40
|
+
def scope_id_at: (Integer offset) -> scope_id?
|
|
41
|
+
def scope_id_of: (Prism::Node node) -> scope_id?
|
|
42
|
+
def allocate: (?kw_def_map: Hash[location_key, Hash[Symbol, String]], ?var_hints: Hash[scope_id, Hash[Symbol, String]]) -> self
|
|
43
|
+
def scope_mappings: () -> scope_mapping_table
|
|
44
|
+
def resolve: () -> self
|
|
45
|
+
|
|
46
|
+
private
|
|
47
|
+
|
|
48
|
+
def scope_range: (Scope scope) -> Range[Integer]
|
|
49
|
+
def add_scope: (Symbol kind, prism_scope_node node, Scope? parent, ?owner_call: Prism::CallNode?) -> Scope
|
|
50
|
+
def build: (Prism::Node? node, ?Scope? current, ?owner_call: Prism::CallNode?) -> void
|
|
51
|
+
def allocate_top: (Scope scope) -> void
|
|
52
|
+
def allocate_def: (Scope scope, Hash[location_key, Hash[Symbol, String]] kw_def_map, Hash[scope_id, Hash[Symbol, String]] var_hints) -> void
|
|
53
|
+
def allocate_block: (Scope scope) -> void
|
|
54
|
+
def ancestor_mapping_values: (Scope scope) -> Array[String]
|
|
55
|
+
def scope_constraints: (Prism::Node? body) -> [bool, Set[Symbol]]
|
|
56
|
+
|
|
57
|
+
def allocated_name: (Symbol var, bool unsafe, Set[Symbol] pinned, NameGenerator generator) -> String
|
|
58
|
+
def unused_rescue_vars: (Prism::Node? body) -> Set[Symbol]
|
|
59
|
+
def keyword_param_names: (Prism::DefNode def_node) -> Array[Symbol]
|
|
60
|
+
def block_parameters: (Prism::BlockNode block_node) -> Prism::ParametersNode?
|
|
61
|
+
def block_formal_names: (Prism::BlockNode block_node) -> Array[Symbol?]
|
|
62
|
+
def block_multi_targets: (Prism::BlockNode block_node) -> Array[Prism::MultiTargetNode]
|
|
63
|
+
def use_numbered_params?: (Prism::BlockNode block_node, Array[Symbol?] f_args, Array[String] parent_names) -> bool
|
|
64
|
+
def collect_multi_target_names: (Prism::MultiTargetNode multi_target_node) -> Array[Symbol]
|
|
65
|
+
def collect_extra_block_param_names: (Prism::ParametersNode prism_params) -> Array[Symbol]
|
|
66
|
+
def block_has_non_required_params?: (Prism::ParametersNode? params) -> boolish
|
|
67
|
+
def walk_all: (Prism::Node? node) { (Prism::Node) -> void } -> void
|
|
68
|
+
def resolve_walk: (Prism::Node? node, Array[Scope] stack) -> void
|
|
69
|
+
def enter_scope: (Scope scope, Array[Scope] stack) -> void
|
|
70
|
+
def record_variable: (prism_variable_node node, Array[Scope] stack) -> void
|
|
71
|
+
def resolved_name: (Symbol name, Integer depth, Array[Scope] stack) -> String
|
|
72
|
+
def record_def_params: (Prism::DefNode def_node, Scope scope) -> void
|
|
73
|
+
def each_def_param_name: (Prism::ParametersNode params) { (Symbol) -> void } -> void
|
|
74
|
+
def record_block_params: (Prism::BlockNode block_node, Scope scope) -> void
|
|
75
|
+
def record_for_index: (Prism::ForNode for_node, Array[Scope] stack) -> void
|
|
76
|
+
end
|
|
77
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module Ryac
|
|
2
|
+
module AnalysisPhases
|
|
3
|
+
def collect_method_definitions: (Prism::Node prism_root) -> void
|
|
4
|
+
def resolve_method_calls: () -> void
|
|
5
|
+
def scan_dynamic_method_references: (Prism::Node prism_root) -> void
|
|
6
|
+
def collect_visibility_modifier_methods: (Prism::Node prism_root) -> void
|
|
7
|
+
def collect_alias_undef_methods: (Prism::Node prism_root) -> void
|
|
8
|
+
|
|
9
|
+
DYNAMIC_DISPATCH_METHODS: Array[Symbol]
|
|
10
|
+
VISIBILITY_MODIFIERS: Array[Symbol]
|
|
11
|
+
UNRESOLVED_CALL_NODES: Array[Class]
|
|
12
|
+
|
|
13
|
+
private
|
|
14
|
+
|
|
15
|
+
def link_module_function_variant: (Prism::DefNode def_node, method_key method_key) -> void
|
|
16
|
+
def merge_super_groups: (Array[[method_key, method_key]] super_merges) -> void
|
|
17
|
+
def merge_polymorphic_groups: (Hash[location_key, Array[method_key]] call_node_to_keys) -> void
|
|
18
|
+
def merge_unresolved_calls: (Set[location_key] resolved_call_keys) -> void
|
|
19
|
+
def classify_unresolved_call: (Symbol mid, Prism::Node node) -> Symbol
|
|
20
|
+
|
|
21
|
+
public
|
|
22
|
+
def collect_shorthand_pun_methods: (Prism::Node prism_root) -> void
|
|
23
|
+
def collect_attr_write_exclusions: (Prism::Node prism_root) -> void
|
|
24
|
+
end
|
|
25
|
+
end
|