method-ray 0.1.8 → 0.1.10

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 (74) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +38 -0
  3. data/README.md +9 -11
  4. data/{rust → core}/Cargo.toml +1 -1
  5. data/core/src/analyzer/assignments.rs +219 -0
  6. data/{rust → core}/src/analyzer/blocks.rs +0 -50
  7. data/{rust → core}/src/analyzer/calls.rs +3 -32
  8. data/core/src/analyzer/conditionals.rs +190 -0
  9. data/core/src/analyzer/definitions.rs +205 -0
  10. data/core/src/analyzer/dispatch.rs +455 -0
  11. data/core/src/analyzer/exceptions.rs +168 -0
  12. data/{rust → core}/src/analyzer/install.rs +16 -1
  13. data/{rust → core}/src/analyzer/literals.rs +3 -71
  14. data/core/src/analyzer/loops.rs +94 -0
  15. data/{rust → core}/src/analyzer/mod.rs +1 -15
  16. data/core/src/analyzer/operators.rs +79 -0
  17. data/{rust → core}/src/analyzer/parameters.rs +4 -67
  18. data/core/src/analyzer/parentheses.rs +25 -0
  19. data/core/src/analyzer/returns.rs +39 -0
  20. data/core/src/analyzer/super_calls.rs +74 -0
  21. data/{rust → core}/src/analyzer/variables.rs +5 -25
  22. data/{rust → core}/src/checker.rs +0 -13
  23. data/{rust → core}/src/diagnostics/diagnostic.rs +0 -41
  24. data/{rust → core}/src/diagnostics/formatter.rs +0 -38
  25. data/{rust → core}/src/env/box_manager.rs +0 -30
  26. data/{rust → core}/src/env/global_env.rs +67 -80
  27. data/core/src/env/local_env.rs +42 -0
  28. data/core/src/env/method_registry.rs +173 -0
  29. data/core/src/env/scope.rs +299 -0
  30. data/{rust → core}/src/env/vertex_manager.rs +0 -73
  31. data/core/src/graph/box.rs +347 -0
  32. data/{rust → core}/src/graph/change_set.rs +0 -65
  33. data/{rust → core}/src/graph/vertex.rs +0 -69
  34. data/{rust → core}/src/parser.rs +0 -77
  35. data/{rust → core}/src/types.rs +11 -0
  36. data/ext/Cargo.toml +2 -2
  37. data/lib/methodray/binary_locator.rb +2 -2
  38. data/lib/methodray/commands.rb +1 -1
  39. data/lib/methodray/version.rb +1 -1
  40. metadata +58 -56
  41. data/rust/src/analyzer/assignments.rs +0 -152
  42. data/rust/src/analyzer/conditionals.rs +0 -538
  43. data/rust/src/analyzer/definitions.rs +0 -719
  44. data/rust/src/analyzer/dispatch.rs +0 -1137
  45. data/rust/src/analyzer/exceptions.rs +0 -521
  46. data/rust/src/analyzer/loops.rs +0 -176
  47. data/rust/src/analyzer/operators.rs +0 -284
  48. data/rust/src/analyzer/parentheses.rs +0 -113
  49. data/rust/src/analyzer/returns.rs +0 -191
  50. data/rust/src/env/local_env.rs +0 -92
  51. data/rust/src/env/method_registry.rs +0 -268
  52. data/rust/src/env/scope.rs +0 -596
  53. data/rust/src/graph/box.rs +0 -766
  54. /data/{rust → core}/src/analyzer/attributes.rs +0 -0
  55. /data/{rust → core}/src/cache/mod.rs +0 -0
  56. /data/{rust → core}/src/cache/rbs_cache.rs +0 -0
  57. /data/{rust → core}/src/cli/args.rs +0 -0
  58. /data/{rust → core}/src/cli/commands.rs +0 -0
  59. /data/{rust → core}/src/cli/mod.rs +0 -0
  60. /data/{rust → core}/src/diagnostics/mod.rs +0 -0
  61. /data/{rust → core}/src/env/mod.rs +0 -0
  62. /data/{rust → core}/src/env/type_error.rs +0 -0
  63. /data/{rust → core}/src/graph/mod.rs +0 -0
  64. /data/{rust → core}/src/lib.rs +0 -0
  65. /data/{rust → core}/src/lsp/diagnostics.rs +0 -0
  66. /data/{rust → core}/src/lsp/main.rs +0 -0
  67. /data/{rust → core}/src/lsp/mod.rs +0 -0
  68. /data/{rust → core}/src/lsp/server.rs +0 -0
  69. /data/{rust → core}/src/main.rs +0 -0
  70. /data/{rust → core}/src/rbs/converter.rs +0 -0
  71. /data/{rust → core}/src/rbs/error.rs +0 -0
  72. /data/{rust → core}/src/rbs/loader.rs +0 -0
  73. /data/{rust → core}/src/rbs/mod.rs +0 -0
  74. /data/{rust → core}/src/source_map.rs +0 -0
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: method-ray
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.8
4
+ version: 0.1.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - dak2
@@ -23,9 +23,10 @@ dependencies:
23
23
  - - "~>"
24
24
  - !ruby/object:Gem::Version
25
25
  version: '3.0'
26
- description: |
27
- Method-Ray is a static analysis tool that checks the callability of methods in Ruby code.
28
- It uses graph-based type inference to detect undefined method calls at analysis time.
26
+ description: 'Method-Ray is a static analysis tool that checks the callability of
27
+ methods in Ruby code.
28
+
29
+ '
29
30
  email:
30
31
  - dak2.dev@gmail.com
31
32
  executables:
@@ -37,6 +38,59 @@ files:
37
38
  - CHANGELOG.md
38
39
  - LICENSE
39
40
  - README.md
41
+ - core/Cargo.toml
42
+ - core/src/analyzer/assignments.rs
43
+ - core/src/analyzer/attributes.rs
44
+ - core/src/analyzer/blocks.rs
45
+ - core/src/analyzer/calls.rs
46
+ - core/src/analyzer/conditionals.rs
47
+ - core/src/analyzer/definitions.rs
48
+ - core/src/analyzer/dispatch.rs
49
+ - core/src/analyzer/exceptions.rs
50
+ - core/src/analyzer/install.rs
51
+ - core/src/analyzer/literals.rs
52
+ - core/src/analyzer/loops.rs
53
+ - core/src/analyzer/mod.rs
54
+ - core/src/analyzer/operators.rs
55
+ - core/src/analyzer/parameters.rs
56
+ - core/src/analyzer/parentheses.rs
57
+ - core/src/analyzer/returns.rs
58
+ - core/src/analyzer/super_calls.rs
59
+ - core/src/analyzer/variables.rs
60
+ - core/src/cache/mod.rs
61
+ - core/src/cache/rbs_cache.rs
62
+ - core/src/checker.rs
63
+ - core/src/cli/args.rs
64
+ - core/src/cli/commands.rs
65
+ - core/src/cli/mod.rs
66
+ - core/src/diagnostics/diagnostic.rs
67
+ - core/src/diagnostics/formatter.rs
68
+ - core/src/diagnostics/mod.rs
69
+ - core/src/env/box_manager.rs
70
+ - core/src/env/global_env.rs
71
+ - core/src/env/local_env.rs
72
+ - core/src/env/method_registry.rs
73
+ - core/src/env/mod.rs
74
+ - core/src/env/scope.rs
75
+ - core/src/env/type_error.rs
76
+ - core/src/env/vertex_manager.rs
77
+ - core/src/graph/box.rs
78
+ - core/src/graph/change_set.rs
79
+ - core/src/graph/mod.rs
80
+ - core/src/graph/vertex.rs
81
+ - core/src/lib.rs
82
+ - core/src/lsp/diagnostics.rs
83
+ - core/src/lsp/main.rs
84
+ - core/src/lsp/mod.rs
85
+ - core/src/lsp/server.rs
86
+ - core/src/main.rs
87
+ - core/src/parser.rs
88
+ - core/src/rbs/converter.rs
89
+ - core/src/rbs/error.rs
90
+ - core/src/rbs/loader.rs
91
+ - core/src/rbs/mod.rs
92
+ - core/src/source_map.rs
93
+ - core/src/types.rs
40
94
  - exe/methodray
41
95
  - ext/Cargo.toml
42
96
  - ext/extconf.rb
@@ -47,58 +101,6 @@ files:
47
101
  - lib/methodray/cli.rb
48
102
  - lib/methodray/commands.rb
49
103
  - lib/methodray/version.rb
50
- - rust/Cargo.toml
51
- - rust/src/analyzer/assignments.rs
52
- - rust/src/analyzer/attributes.rs
53
- - rust/src/analyzer/blocks.rs
54
- - rust/src/analyzer/calls.rs
55
- - rust/src/analyzer/conditionals.rs
56
- - rust/src/analyzer/definitions.rs
57
- - rust/src/analyzer/dispatch.rs
58
- - rust/src/analyzer/exceptions.rs
59
- - rust/src/analyzer/install.rs
60
- - rust/src/analyzer/literals.rs
61
- - rust/src/analyzer/loops.rs
62
- - rust/src/analyzer/mod.rs
63
- - rust/src/analyzer/operators.rs
64
- - rust/src/analyzer/parameters.rs
65
- - rust/src/analyzer/parentheses.rs
66
- - rust/src/analyzer/returns.rs
67
- - rust/src/analyzer/variables.rs
68
- - rust/src/cache/mod.rs
69
- - rust/src/cache/rbs_cache.rs
70
- - rust/src/checker.rs
71
- - rust/src/cli/args.rs
72
- - rust/src/cli/commands.rs
73
- - rust/src/cli/mod.rs
74
- - rust/src/diagnostics/diagnostic.rs
75
- - rust/src/diagnostics/formatter.rs
76
- - rust/src/diagnostics/mod.rs
77
- - rust/src/env/box_manager.rs
78
- - rust/src/env/global_env.rs
79
- - rust/src/env/local_env.rs
80
- - rust/src/env/method_registry.rs
81
- - rust/src/env/mod.rs
82
- - rust/src/env/scope.rs
83
- - rust/src/env/type_error.rs
84
- - rust/src/env/vertex_manager.rs
85
- - rust/src/graph/box.rs
86
- - rust/src/graph/change_set.rs
87
- - rust/src/graph/mod.rs
88
- - rust/src/graph/vertex.rs
89
- - rust/src/lib.rs
90
- - rust/src/lsp/diagnostics.rs
91
- - rust/src/lsp/main.rs
92
- - rust/src/lsp/mod.rs
93
- - rust/src/lsp/server.rs
94
- - rust/src/main.rs
95
- - rust/src/parser.rs
96
- - rust/src/rbs/converter.rs
97
- - rust/src/rbs/error.rs
98
- - rust/src/rbs/loader.rs
99
- - rust/src/rbs/mod.rs
100
- - rust/src/source_map.rs
101
- - rust/src/types.rs
102
104
  homepage: https://github.com/dak2/method-ray
103
105
  licenses:
104
106
  - MIT
@@ -1,152 +0,0 @@
1
- //! Multiple Assignment Handlers - Processing Ruby multiple assignment
2
- //!
3
- //! v0.1.8 scope: Only RHS as ArrayNode (multiple literal values) is supported.
4
- //! TODO: Support RHS as single expression (array decomposition)
5
- //! TODO: Support splat target (*rest) as Array type
6
- //! TODO: Support RHS as method return value decomposition
7
- //! TODO: When LHS is longer than RHS, register trailing targets as NilClass
8
-
9
- use crate::env::{GlobalEnv, LocalEnv};
10
- use crate::graph::{ChangeSet, VertexId};
11
-
12
- use super::bytes_to_name;
13
- use super::variables::install_local_var_write;
14
-
15
- /// Process multiple assignment node (e.g., `a, b = 1, "hello"`)
16
- pub(crate) fn process_multi_write_node(
17
- genv: &mut GlobalEnv,
18
- lenv: &mut LocalEnv,
19
- changes: &mut ChangeSet,
20
- source: &str,
21
- node: &ruby_prism::MultiWriteNode,
22
- ) -> Option<VertexId> {
23
- let value = node.value();
24
- let mut last_vtx = None;
25
-
26
- if let Some(array_node) = value.as_array_node() {
27
- for (target, rhs_elem) in node.lefts().iter().zip(array_node.elements().iter()) {
28
- if let Some(target_node) = target.as_local_variable_target_node() {
29
- let var_name = bytes_to_name(target_node.name().as_slice());
30
- let rhs_vtx =
31
- super::install::install_node(genv, lenv, changes, source, &rhs_elem);
32
- if let Some(rv) = rhs_vtx {
33
- last_vtx = Some(install_local_var_write(genv, lenv, changes, var_name, rv));
34
- } else {
35
- let var_vtx = genv.new_vertex();
36
- lenv.new_var(var_name, var_vtx);
37
- last_vtx = Some(var_vtx);
38
- }
39
- }
40
- }
41
- } else {
42
- for target in node.lefts().iter() {
43
- if let Some(target_node) = target.as_local_variable_target_node() {
44
- let var_name = bytes_to_name(target_node.name().as_slice());
45
- let var_vtx = genv.new_vertex();
46
- lenv.new_var(var_name, var_vtx);
47
- last_vtx = Some(var_vtx);
48
- }
49
- }
50
- }
51
-
52
- last_vtx
53
- }
54
-
55
- #[cfg(test)]
56
- mod tests {
57
- use crate::analyzer::install::AstInstaller;
58
- use crate::env::{GlobalEnv, LocalEnv};
59
- use crate::graph::VertexId;
60
- use crate::parser::ParseSession;
61
-
62
- fn analyze(source: &str) -> (GlobalEnv, LocalEnv) {
63
- let session = ParseSession::new();
64
- let parse_result = session.parse_source(source, "test.rb").unwrap();
65
- let root = parse_result.node();
66
- let program = root.as_program_node().unwrap();
67
-
68
- let mut genv = GlobalEnv::new();
69
- let mut lenv = LocalEnv::new();
70
-
71
- let mut installer = AstInstaller::new(&mut genv, &mut lenv, source);
72
- for stmt in &program.statements().body() {
73
- installer.install_node(&stmt);
74
- }
75
- installer.finish();
76
-
77
- (genv, lenv)
78
- }
79
-
80
- fn get_type_show(genv: &GlobalEnv, vtx: VertexId) -> String {
81
- if let Some(vertex) = genv.get_vertex(vtx) {
82
- vertex.show()
83
- } else if let Some(source) = genv.get_source(vtx) {
84
- source.ty.show()
85
- } else {
86
- panic!("vertex {:?} not found as either Vertex or Source", vtx);
87
- }
88
- }
89
-
90
- #[test]
91
- fn test_multi_write_integer_and_string() {
92
- let source = r#"a, b = 1, "hello""#;
93
- let (genv, lenv) = analyze(source);
94
-
95
- let a_vtx = lenv.get_var("a").expect("a should be registered");
96
- assert_eq!(get_type_show(&genv, a_vtx), "Integer");
97
-
98
- let b_vtx = lenv.get_var("b").expect("b should be registered");
99
- assert_eq!(get_type_show(&genv, b_vtx), "String");
100
- }
101
-
102
- #[test]
103
- fn test_multi_write_all_integer() {
104
- let source = "a, b, c = 1, 2, 3";
105
- let (genv, lenv) = analyze(source);
106
-
107
- let a_vtx = lenv.get_var("a").expect("a should be registered");
108
- assert_eq!(get_type_show(&genv, a_vtx), "Integer");
109
-
110
- let b_vtx = lenv.get_var("b").expect("b should be registered");
111
- assert_eq!(get_type_show(&genv, b_vtx), "Integer");
112
-
113
- let c_vtx = lenv.get_var("c").expect("c should be registered");
114
- assert_eq!(get_type_show(&genv, c_vtx), "Integer");
115
- }
116
-
117
- #[test]
118
- fn test_multi_write_variable_reference_after_assignment() {
119
- let source = r#"
120
- a, b = 1, "hello"
121
- x = a
122
- "#;
123
- let (genv, lenv) = analyze(source);
124
-
125
- let x_vtx = lenv.get_var("x").expect("x should be registered");
126
- assert_eq!(get_type_show(&genv, x_vtx), "Integer");
127
- }
128
-
129
- #[test]
130
- fn test_multi_write_lhs_longer_than_rhs() {
131
- let source = "a, b, c = 1, 2";
132
- let (_, lenv) = analyze(source);
133
-
134
- assert!(lenv.get_var("a").is_some(), "a should be registered");
135
- assert!(lenv.get_var("b").is_some(), "b should be registered");
136
- // KNOWN LIMITATION (v0.1.8): In Ruby, c receives nil, but zip skips it here
137
- assert!(
138
- lenv.get_var("c").is_none(),
139
- "c should not be registered (zip skips)"
140
- );
141
- }
142
-
143
- #[test]
144
- fn test_multi_write_does_not_panic_on_non_array_rhs() {
145
- let source = "a, b = some_expr";
146
- let (_, lenv) = analyze(source);
147
-
148
- // Variables should be registered (untyped) without panic
149
- assert!(lenv.get_var("a").is_some(), "a should be registered");
150
- assert!(lenv.get_var("b").is_some(), "b should be registered");
151
- }
152
- }