method-ray 0.1.8 → 0.1.9

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 (61) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +18 -0
  3. data/{rust → core}/Cargo.toml +1 -1
  4. data/core/src/analyzer/assignments.rs +499 -0
  5. data/{rust → core}/src/analyzer/blocks.rs +140 -0
  6. data/{rust → core}/src/analyzer/definitions.rs +6 -5
  7. data/{rust → core}/src/analyzer/dispatch.rs +295 -31
  8. data/{rust → core}/src/analyzer/exceptions.rs +104 -3
  9. data/{rust → core}/src/analyzer/install.rs +16 -1
  10. data/{rust → core}/src/analyzer/literals.rs +3 -17
  11. data/{rust → core}/src/analyzer/loops.rs +126 -1
  12. data/{rust → core}/src/analyzer/mod.rs +1 -0
  13. data/{rust → core}/src/analyzer/parameters.rs +160 -0
  14. data/core/src/analyzer/super_calls.rs +285 -0
  15. data/{rust → core}/src/env/global_env.rs +18 -4
  16. data/{rust → core}/src/env/method_registry.rs +109 -23
  17. data/{rust → core}/src/env/scope.rs +78 -0
  18. data/{rust → core}/src/types.rs +11 -0
  19. data/ext/Cargo.toml +2 -2
  20. data/lib/methodray/binary_locator.rb +2 -2
  21. data/lib/methodray/commands.rb +1 -1
  22. data/lib/methodray/version.rb +1 -1
  23. metadata +54 -53
  24. data/rust/src/analyzer/assignments.rs +0 -152
  25. /data/{rust → core}/src/analyzer/attributes.rs +0 -0
  26. /data/{rust → core}/src/analyzer/calls.rs +0 -0
  27. /data/{rust → core}/src/analyzer/conditionals.rs +0 -0
  28. /data/{rust → core}/src/analyzer/operators.rs +0 -0
  29. /data/{rust → core}/src/analyzer/parentheses.rs +0 -0
  30. /data/{rust → core}/src/analyzer/returns.rs +0 -0
  31. /data/{rust → core}/src/analyzer/variables.rs +0 -0
  32. /data/{rust → core}/src/cache/mod.rs +0 -0
  33. /data/{rust → core}/src/cache/rbs_cache.rs +0 -0
  34. /data/{rust → core}/src/checker.rs +0 -0
  35. /data/{rust → core}/src/cli/args.rs +0 -0
  36. /data/{rust → core}/src/cli/commands.rs +0 -0
  37. /data/{rust → core}/src/cli/mod.rs +0 -0
  38. /data/{rust → core}/src/diagnostics/diagnostic.rs +0 -0
  39. /data/{rust → core}/src/diagnostics/formatter.rs +0 -0
  40. /data/{rust → core}/src/diagnostics/mod.rs +0 -0
  41. /data/{rust → core}/src/env/box_manager.rs +0 -0
  42. /data/{rust → core}/src/env/local_env.rs +0 -0
  43. /data/{rust → core}/src/env/mod.rs +0 -0
  44. /data/{rust → core}/src/env/type_error.rs +0 -0
  45. /data/{rust → core}/src/env/vertex_manager.rs +0 -0
  46. /data/{rust → core}/src/graph/box.rs +0 -0
  47. /data/{rust → core}/src/graph/change_set.rs +0 -0
  48. /data/{rust → core}/src/graph/mod.rs +0 -0
  49. /data/{rust → core}/src/graph/vertex.rs +0 -0
  50. /data/{rust → core}/src/lib.rs +0 -0
  51. /data/{rust → core}/src/lsp/diagnostics.rs +0 -0
  52. /data/{rust → core}/src/lsp/main.rs +0 -0
  53. /data/{rust → core}/src/lsp/mod.rs +0 -0
  54. /data/{rust → core}/src/lsp/server.rs +0 -0
  55. /data/{rust → core}/src/main.rs +0 -0
  56. /data/{rust → core}/src/parser.rs +0 -0
  57. /data/{rust → core}/src/rbs/converter.rs +0 -0
  58. /data/{rust → core}/src/rbs/error.rs +0 -0
  59. /data/{rust → core}/src/rbs/loader.rs +0 -0
  60. /data/{rust → core}/src/rbs/mod.rs +0 -0
  61. /data/{rust → core}/src/source_map.rs +0 -0
@@ -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
- }
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes