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.
Files changed (107) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +145 -0
  4. data/Rakefile +45 -0
  5. data/Steepfile +9 -0
  6. data/bin/console +11 -0
  7. data/bin/ryac +134 -0
  8. data/bin/setup +8 -0
  9. data/lib/ryac/analysis/constant/collection.rb +332 -0
  10. data/lib/ryac/analysis/constant/rename_mapping.rb +346 -0
  11. data/lib/ryac/analysis/cvar/collection.rb +37 -0
  12. data/lib/ryac/analysis/gvar/collection.rb +36 -0
  13. data/lib/ryac/analysis/gvar/rename_mapping.rb +82 -0
  14. data/lib/ryac/analysis/ivar/collection.rb +281 -0
  15. data/lib/ryac/analysis/keyword/collection.rb +213 -0
  16. data/lib/ryac/analysis/keyword/rename_mapping.rb +167 -0
  17. data/lib/ryac/analysis/local_scopes.rb +582 -0
  18. data/lib/ryac/analysis/method/collection.rb +298 -0
  19. data/lib/ryac/analysis/method/rename_mapping.rb +337 -0
  20. data/lib/ryac/analysis/method_aliases.rb +83 -0
  21. data/lib/ryac/analysis/method_aliasing.rb +65 -0
  22. data/lib/ryac/analysis/nesting.rb +123 -0
  23. data/lib/ryac/analysis/scope_management.rb +25 -0
  24. data/lib/ryac/analysis/site_bucket_mapping.rb +127 -0
  25. data/lib/ryac/analysis/type_oracle.rb +386 -0
  26. data/lib/ryac/ast_utils.rb +321 -0
  27. data/lib/ryac/errors.rb +32 -0
  28. data/lib/ryac/gem_resolver.rb +55 -0
  29. data/lib/ryac/minifier.rb +169 -0
  30. data/lib/ryac/name_generator.rb +68 -0
  31. data/lib/ryac/pipeline/analyzer.rb +264 -0
  32. data/lib/ryac/pipeline/attr_decl_shorten.rb +61 -0
  33. data/lib/ryac/pipeline/boolean_shorten.rb +26 -0
  34. data/lib/ryac/pipeline/char_shorten.rb +20 -0
  35. data/lib/ryac/pipeline/compactor.rb +1202 -0
  36. data/lib/ryac/pipeline/concatenator.rb +248 -0
  37. data/lib/ryac/pipeline/constant_aliaser.rb +240 -0
  38. data/lib/ryac/pipeline/constant_fold.rb +93 -0
  39. data/lib/ryac/pipeline/control_flow_simplify.rb +352 -0
  40. data/lib/ryac/pipeline/data_types.rb +179 -0
  41. data/lib/ryac/pipeline/endless_method.rb +60 -0
  42. data/lib/ryac/pipeline/errors.rb +94 -0
  43. data/lib/ryac/pipeline/file_collector.rb +360 -0
  44. data/lib/ryac/pipeline/method_renamer.rb +151 -0
  45. data/lib/ryac/pipeline/paren_optimizer.rb +161 -0
  46. data/lib/ryac/pipeline/rename_patcher.rb +274 -0
  47. data/lib/ryac/pipeline/source_patcher.rb +54 -0
  48. data/lib/ryac/pipeline/spelling_shorten.rb +60 -0
  49. data/lib/ryac/pipeline/stage.rb +72 -0
  50. data/lib/ryac/pipeline/stage_runner.rb +84 -0
  51. data/lib/ryac/pipeline/variable_renamer.rb +125 -0
  52. data/lib/ryac/union_find.rb +42 -0
  53. data/lib/ryac/version.rb +5 -0
  54. data/lib/ryac.rb +29 -0
  55. data/rbs_collection.lock.yaml +224 -0
  56. data/rbs_collection.yaml +25 -0
  57. data/sig/ryac/analysis/constant/collection.rbs +30 -0
  58. data/sig/ryac/analysis/constant/rename_mapping.rbs +60 -0
  59. data/sig/ryac/analysis/cvar/collection.rbs +11 -0
  60. data/sig/ryac/analysis/gvar/collection.rbs +9 -0
  61. data/sig/ryac/analysis/gvar/rename_mapping.rbs +23 -0
  62. data/sig/ryac/analysis/ivar/collection.rbs +26 -0
  63. data/sig/ryac/analysis/keyword/collection.rbs +27 -0
  64. data/sig/ryac/analysis/keyword/rename_mapping.rbs +31 -0
  65. data/sig/ryac/analysis/local_scopes.rbs +77 -0
  66. data/sig/ryac/analysis/method/collection.rbs +25 -0
  67. data/sig/ryac/analysis/method/rename_mapping.rbs +82 -0
  68. data/sig/ryac/analysis/method_aliases.rbs +10 -0
  69. data/sig/ryac/analysis/method_aliasing.rbs +9 -0
  70. data/sig/ryac/analysis/nesting.rbs +9 -0
  71. data/sig/ryac/analysis/scope_management.rbs +5 -0
  72. data/sig/ryac/analysis/site_bucket_mapping.rbs +26 -0
  73. data/sig/ryac/analysis/type_oracle.rbs +61 -0
  74. data/sig/ryac/ast_utils.rbs +34 -0
  75. data/sig/ryac/errors.rbs +21 -0
  76. data/sig/ryac/gem_resolver.rbs +28 -0
  77. data/sig/ryac/minifier.rbs +33 -0
  78. data/sig/ryac/name_generator.rbs +14 -0
  79. data/sig/ryac/pipeline/analyzer.rbs +34 -0
  80. data/sig/ryac/pipeline/attr_decl_shorten.rbs +17 -0
  81. data/sig/ryac/pipeline/boolean_shorten.rbs +11 -0
  82. data/sig/ryac/pipeline/char_shorten.rbs +11 -0
  83. data/sig/ryac/pipeline/compactor.rbs +125 -0
  84. data/sig/ryac/pipeline/concatenator.rbs +28 -0
  85. data/sig/ryac/pipeline/constant_aliaser.rbs +35 -0
  86. data/sig/ryac/pipeline/constant_fold.rbs +20 -0
  87. data/sig/ryac/pipeline/control_flow_simplify.rbs +34 -0
  88. data/sig/ryac/pipeline/data_types.rbs +151 -0
  89. data/sig/ryac/pipeline/endless_method.rbs +14 -0
  90. data/sig/ryac/pipeline/errors.rbs +46 -0
  91. data/sig/ryac/pipeline/file_collector.rbs +34 -0
  92. data/sig/ryac/pipeline/method_renamer.rbs +25 -0
  93. data/sig/ryac/pipeline/paren_optimizer.rbs +16 -0
  94. data/sig/ryac/pipeline/rename_patcher.rbs +38 -0
  95. data/sig/ryac/pipeline/source_patcher.rbs +12 -0
  96. data/sig/ryac/pipeline/spelling_shorten.rbs +14 -0
  97. data/sig/ryac/pipeline/stage.rbs +28 -0
  98. data/sig/ryac/pipeline/stage_runner.rbs +18 -0
  99. data/sig/ryac/pipeline/variable_renamer.rbs +21 -0
  100. data/sig/ryac/union_find.rbs +17 -0
  101. data/sig/ryac.rbs +13 -0
  102. data/sig/shims/env.rbs +19 -0
  103. data/sig/shims/typeprof/core/ast.rbs +299 -0
  104. data/sig/shims/typeprof/core/type.rbs +22 -0
  105. data/sig/shims/typeprof/core.rbs +73 -0
  106. data/tools/regen_pins.rb +45 -0
  107. 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
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ryac
4
+ VERSION = "0.2.0"
5
+ end
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
@@ -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