method-ray 0.1.7 → 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 (60) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +33 -0
  3. data/{rust → core}/Cargo.toml +1 -1
  4. data/core/src/analyzer/assignments.rs +499 -0
  5. data/{rust → core}/src/analyzer/attributes.rs +2 -1
  6. data/{rust → core}/src/analyzer/blocks.rs +140 -0
  7. data/{rust → core}/src/analyzer/calls.rs +7 -3
  8. data/{rust → core}/src/analyzer/definitions.rs +12 -7
  9. data/{rust → core}/src/analyzer/dispatch.rs +431 -13
  10. data/core/src/analyzer/exceptions.rs +622 -0
  11. data/{rust → core}/src/analyzer/install.rs +37 -1
  12. data/{rust → core}/src/analyzer/literals.rs +3 -17
  13. data/core/src/analyzer/loops.rs +301 -0
  14. data/{rust → core}/src/analyzer/mod.rs +4 -0
  15. data/{rust → core}/src/analyzer/operators.rs +119 -27
  16. data/{rust → core}/src/analyzer/parameters.rs +214 -5
  17. data/core/src/analyzer/super_calls.rs +285 -0
  18. data/{rust → core}/src/cache/rbs_cache.rs +0 -1
  19. data/{rust → core}/src/cli/commands.rs +3 -3
  20. data/{rust → core}/src/diagnostics/diagnostic.rs +0 -3
  21. data/{rust → core}/src/diagnostics/formatter.rs +0 -1
  22. data/{rust → core}/src/env/box_manager.rs +2 -4
  23. data/{rust → core}/src/env/global_env.rs +28 -7
  24. data/{rust → core}/src/env/local_env.rs +35 -1
  25. data/{rust → core}/src/env/method_registry.rs +117 -25
  26. data/{rust → core}/src/env/scope.rs +91 -4
  27. data/{rust → core}/src/env/vertex_manager.rs +0 -1
  28. data/{rust → core}/src/graph/box.rs +134 -8
  29. data/{rust → core}/src/graph/change_set.rs +14 -0
  30. data/{rust → core}/src/lsp/server.rs +1 -1
  31. data/{rust → core}/src/rbs/loader.rs +1 -2
  32. data/{rust → core}/src/source_map.rs +0 -1
  33. data/{rust → core}/src/types.rs +11 -1
  34. data/ext/Cargo.toml +2 -2
  35. data/lib/methodray/binary_locator.rb +2 -2
  36. data/lib/methodray/commands.rb +1 -1
  37. data/lib/methodray/version.rb +1 -1
  38. metadata +54 -50
  39. /data/{rust → core}/src/analyzer/conditionals.rs +0 -0
  40. /data/{rust → core}/src/analyzer/parentheses.rs +0 -0
  41. /data/{rust → core}/src/analyzer/returns.rs +0 -0
  42. /data/{rust → core}/src/analyzer/variables.rs +0 -0
  43. /data/{rust → core}/src/cache/mod.rs +0 -0
  44. /data/{rust → core}/src/checker.rs +0 -0
  45. /data/{rust → core}/src/cli/args.rs +0 -0
  46. /data/{rust → core}/src/cli/mod.rs +0 -0
  47. /data/{rust → core}/src/diagnostics/mod.rs +0 -0
  48. /data/{rust → core}/src/env/mod.rs +0 -0
  49. /data/{rust → core}/src/env/type_error.rs +0 -0
  50. /data/{rust → core}/src/graph/mod.rs +0 -0
  51. /data/{rust → core}/src/graph/vertex.rs +0 -0
  52. /data/{rust → core}/src/lib.rs +0 -0
  53. /data/{rust → core}/src/lsp/diagnostics.rs +0 -0
  54. /data/{rust → core}/src/lsp/main.rs +0 -0
  55. /data/{rust → core}/src/lsp/mod.rs +0 -0
  56. /data/{rust → core}/src/main.rs +0 -0
  57. /data/{rust → core}/src/parser.rs +0 -0
  58. /data/{rust → core}/src/rbs/converter.rs +0 -0
  59. /data/{rust → core}/src/rbs/error.rs +0 -0
  60. /data/{rust → core}/src/rbs/mod.rs +0 -0
@@ -1,3 +1,5 @@
1
+ use std::collections::HashMap;
2
+
1
3
  use crate::env::GlobalEnv;
2
4
  use crate::graph::change_set::ChangeSet;
3
5
  use crate::graph::vertex::VertexId;
@@ -9,7 +11,6 @@ use crate::types::Type;
9
11
  pub struct BoxId(pub usize);
10
12
 
11
13
  /// Box trait: represents constraints such as method calls
12
- #[allow(dead_code)]
13
14
  pub trait BoxTrait: Send + Sync {
14
15
  fn id(&self) -> BoxId;
15
16
  fn run(&mut self, genv: &mut GlobalEnv, changes: &mut ChangeSet);
@@ -28,14 +29,30 @@ fn propagate_arguments(
28
29
  }
29
30
  }
30
31
 
32
+ /// Propagate keyword argument types to keyword parameter vertices by name
33
+ fn propagate_keyword_arguments(
34
+ kwarg_vtxs: Option<&HashMap<String, VertexId>>,
35
+ kw_param_vtxs: Option<&HashMap<String, VertexId>>,
36
+ changes: &mut ChangeSet,
37
+ ) {
38
+ let (Some(args), Some(params)) = (kwarg_vtxs, kw_param_vtxs) else {
39
+ return;
40
+ };
41
+ for (name, arg_vtx) in args {
42
+ if let Some(&param_vtx) = params.get(name) {
43
+ changes.add_edge(*arg_vtx, param_vtx);
44
+ }
45
+ }
46
+ }
47
+
31
48
  /// Box representing a method call
32
- #[allow(dead_code)]
33
49
  pub struct MethodCallBox {
34
50
  id: BoxId,
35
51
  recv: VertexId,
36
52
  method_name: String,
37
53
  ret: VertexId,
38
54
  arg_vtxs: Vec<VertexId>,
55
+ kwarg_vtxs: Option<HashMap<String, VertexId>>,
39
56
  location: Option<SourceLocation>, // Source code location
40
57
  /// Number of times this box has been rescheduled
41
58
  reschedule_count: u8,
@@ -51,6 +68,7 @@ impl MethodCallBox {
51
68
  method_name: String,
52
69
  ret: VertexId,
53
70
  arg_vtxs: Vec<VertexId>,
71
+ kwarg_vtxs: Option<HashMap<String, VertexId>>,
54
72
  location: Option<SourceLocation>,
55
73
  ) -> Self {
56
74
  Self {
@@ -59,6 +77,7 @@ impl MethodCallBox {
59
77
  method_name,
60
78
  ret,
61
79
  arg_vtxs,
80
+ kwarg_vtxs,
62
81
  location,
63
82
  reschedule_count: 0,
64
83
  }
@@ -90,6 +109,11 @@ impl MethodCallBox {
90
109
  method_info.param_vertices.as_deref(),
91
110
  changes,
92
111
  );
112
+ propagate_keyword_arguments(
113
+ self.kwarg_vtxs.as_ref(),
114
+ method_info.keyword_param_vertices.as_ref(),
115
+ changes,
116
+ );
93
117
  } else {
94
118
  // Builtin/RBS method: create source with fixed return type
95
119
  let ret_src_id = genv.new_source(method_info.return_type.clone());
@@ -118,10 +142,17 @@ impl MethodCallBox {
118
142
  let ret_src = genv.new_source(instance_type.clone());
119
143
  changes.add_edge(ret_src, self.ret);
120
144
 
121
- let init_params = genv
122
- .resolve_method(&instance_type, "initialize")
123
- .and_then(|info| info.param_vertices.as_deref());
124
- propagate_arguments(&self.arg_vtxs, init_params, changes);
145
+ let init_info = genv.resolve_method(&instance_type, "initialize");
146
+ propagate_arguments(
147
+ &self.arg_vtxs,
148
+ init_info.and_then(|info| info.param_vertices.as_deref()),
149
+ changes,
150
+ );
151
+ propagate_keyword_arguments(
152
+ self.kwarg_vtxs.as_ref(),
153
+ init_info.and_then(|info| info.keyword_param_vertices.as_ref()),
154
+ changes,
155
+ );
125
156
  } else {
126
157
  self.report_type_error(recv_ty, genv);
127
158
  }
@@ -166,7 +197,6 @@ impl BoxTrait for MethodCallBox {
166
197
  /// When a method with a block is called (e.g., `str.each_char { |c| ... }`),
167
198
  /// this box resolves the block parameter types from the method's RBS definition
168
199
  /// and propagates them to the block parameter vertices.
169
- #[allow(dead_code)]
170
200
  pub struct BlockParameterTypeBox {
171
201
  id: BoxId,
172
202
  /// Receiver vertex of the method call
@@ -325,6 +355,7 @@ mod tests {
325
355
  "upcase".to_string(),
326
356
  ret_vtx,
327
357
  vec![],
358
+ None,
328
359
  None, // No location in test
329
360
  );
330
361
 
@@ -357,6 +388,7 @@ mod tests {
357
388
  "unknown_method".to_string(),
358
389
  ret_vtx,
359
390
  vec![],
391
+ None,
360
392
  None, // No location in test
361
393
  );
362
394
 
@@ -552,7 +584,7 @@ mod tests {
552
584
  let body_src = genv.new_source(Type::string());
553
585
 
554
586
  // Register user-defined method User#name with return_vertex
555
- genv.register_user_method(Type::instance("User"), "name", body_src, vec![]);
587
+ genv.register_user_method(Type::instance("User"), "name", body_src, vec![], None);
556
588
 
557
589
  // Simulate: user.name (receiver has type User)
558
590
  let recv_vtx = genv.new_vertex();
@@ -568,6 +600,7 @@ mod tests {
568
600
  ret_vtx,
569
601
  vec![],
570
602
  None,
603
+ None,
571
604
  );
572
605
  genv.register_box(box_id, Box::new(call_box));
573
606
 
@@ -598,6 +631,7 @@ mod tests {
598
631
  inner_ret_vtx,
599
632
  vec![],
600
633
  None,
634
+ None,
601
635
  );
602
636
  genv.register_box(inner_box_id, Box::new(inner_call));
603
637
 
@@ -607,6 +641,7 @@ mod tests {
607
641
  "format",
608
642
  inner_ret_vtx,
609
643
  vec![param_vtx],
644
+ None,
610
645
  );
611
646
 
612
647
  // 5. Simulate call: Formatter.new.format(42)
@@ -625,6 +660,7 @@ mod tests {
625
660
  call_ret_vtx,
626
661
  vec![arg_vtx],
627
662
  None,
663
+ None,
628
664
  );
629
665
  genv.register_box(call_box_id, Box::new(call_box));
630
666
 
@@ -637,4 +673,94 @@ mod tests {
637
673
  // Return type should be String (Integer#to_s -> String)
638
674
  assert_eq!(genv.get_vertex(call_ret_vtx).unwrap().show(), "String");
639
675
  }
676
+
677
+ #[test]
678
+ fn test_keyword_arg_propagation() {
679
+ let mut genv = GlobalEnv::new();
680
+
681
+ // Simulate: def greet(name:); name; end
682
+ let param_vtx = genv.new_vertex();
683
+ let mut kw_params = HashMap::new();
684
+ kw_params.insert("name".to_string(), param_vtx);
685
+
686
+ genv.register_user_method(
687
+ Type::instance("Greeter"),
688
+ "greet",
689
+ param_vtx, // return vertex = param (returns name)
690
+ vec![],
691
+ Some(kw_params),
692
+ );
693
+
694
+ // Simulate call: Greeter.new.greet(name: "Alice")
695
+ let recv_vtx = genv.new_vertex();
696
+ let recv_src = genv.new_source(Type::instance("Greeter"));
697
+ genv.add_edge(recv_src, recv_vtx);
698
+
699
+ let arg_vtx = genv.new_source(Type::string());
700
+ let mut kwarg_vtxs = HashMap::new();
701
+ kwarg_vtxs.insert("name".to_string(), arg_vtx);
702
+
703
+ let ret_vtx = genv.new_vertex();
704
+ let box_id = genv.alloc_box_id();
705
+ let call_box = MethodCallBox::new(
706
+ box_id,
707
+ recv_vtx,
708
+ "greet".to_string(),
709
+ ret_vtx,
710
+ vec![],
711
+ Some(kwarg_vtxs),
712
+ None,
713
+ );
714
+ genv.register_box(box_id, Box::new(call_box));
715
+
716
+ genv.run_all();
717
+
718
+ // param_vtx should have String type (propagated from keyword argument)
719
+ assert_eq!(genv.get_vertex(param_vtx).unwrap().show(), "String");
720
+ assert_eq!(genv.get_vertex(ret_vtx).unwrap().show(), "String");
721
+ }
722
+
723
+ #[test]
724
+ fn test_keyword_arg_name_mismatch_skipped() {
725
+ let mut genv = GlobalEnv::new();
726
+
727
+ let param_vtx = genv.new_vertex();
728
+ let mut kw_params = HashMap::new();
729
+ kw_params.insert("name".to_string(), param_vtx);
730
+
731
+ genv.register_user_method(
732
+ Type::instance("Greeter"),
733
+ "greet",
734
+ param_vtx,
735
+ vec![],
736
+ Some(kw_params),
737
+ );
738
+
739
+ let recv_vtx = genv.new_vertex();
740
+ let recv_src = genv.new_source(Type::instance("Greeter"));
741
+ genv.add_edge(recv_src, recv_vtx);
742
+
743
+ // Wrong keyword name: "title" instead of "name"
744
+ let arg_vtx = genv.new_source(Type::string());
745
+ let mut kwarg_vtxs = HashMap::new();
746
+ kwarg_vtxs.insert("title".to_string(), arg_vtx);
747
+
748
+ let ret_vtx = genv.new_vertex();
749
+ let box_id = genv.alloc_box_id();
750
+ let call_box = MethodCallBox::new(
751
+ box_id,
752
+ recv_vtx,
753
+ "greet".to_string(),
754
+ ret_vtx,
755
+ vec![],
756
+ Some(kwarg_vtxs),
757
+ None,
758
+ );
759
+ genv.register_box(box_id, Box::new(call_box));
760
+
761
+ genv.run_all();
762
+
763
+ // param_vtx should remain untyped (name mismatch → no propagation)
764
+ assert_eq!(genv.get_vertex(param_vtx).unwrap().show(), "untyped");
765
+ }
640
766
  }
@@ -10,6 +10,12 @@ pub struct ChangeSet {
10
10
  reschedule_boxes: Vec<BoxId>,
11
11
  }
12
12
 
13
+ impl Default for ChangeSet {
14
+ fn default() -> Self {
15
+ Self::new()
16
+ }
17
+ }
18
+
13
19
  impl ChangeSet {
14
20
  pub fn new() -> Self {
15
21
  Self {
@@ -75,6 +81,14 @@ pub enum EdgeUpdate {
75
81
  mod tests {
76
82
  use super::*;
77
83
 
84
+ #[test]
85
+ fn test_change_set_default() {
86
+ let mut cs = ChangeSet::default();
87
+ cs.add_edge(VertexId(1), VertexId(2));
88
+ let updates = cs.reinstall();
89
+ assert_eq!(updates.len(), 1);
90
+ }
91
+
78
92
  #[test]
79
93
  fn test_change_set_add() {
80
94
  let mut cs = ChangeSet::new();
@@ -132,7 +132,7 @@ pub async fn run_server() {
132
132
  let stdin = tokio::io::stdin();
133
133
  let stdout = tokio::io::stdout();
134
134
 
135
- let (service, socket) = LspService::new(|client| MethodRayServer::new(client));
135
+ let (service, socket) = LspService::new(MethodRayServer::new);
136
136
 
137
137
  Server::new(stdin, stdout, socket).serve(service).await;
138
138
  }
@@ -155,8 +155,7 @@ pub fn register_rbs_methods(genv: &mut GlobalEnv, ruby: &Ruby) -> Result<usize,
155
155
  cache.to_method_infos()
156
156
  } else {
157
157
  eprintln!("Cache invalid, reloading from RBS...");
158
- let methods = load_and_cache_rbs_methods(ruby, methodray_version, &rbs_version)?;
159
- methods
158
+ load_and_cache_rbs_methods(ruby, methodray_version, &rbs_version)?
160
159
  }
161
160
  } else {
162
161
  eprintln!("No cache found, loading from RBS...");
@@ -30,7 +30,6 @@ pub struct SourceLocation {
30
30
  pub length: usize,
31
31
  }
32
32
 
33
- #[allow(dead_code)]
34
33
  impl SourceLocation {
35
34
  pub fn new(line: usize, column: usize, length: usize) -> Self {
36
35
  Self {
@@ -125,7 +125,6 @@ impl From<String> for QualifiedName {
125
125
 
126
126
  /// Type system for graph-based type inference
127
127
  #[derive(Clone, Debug, PartialEq, Eq, Hash)]
128
- #[allow(dead_code)]
129
128
  pub enum Type {
130
129
  /// Instance type: String, Integer, Api::User, etc.
131
130
  Instance { name: QualifiedName },
@@ -277,6 +276,17 @@ impl Type {
277
276
  type_args: vec![element_type],
278
277
  }
279
278
  }
279
+
280
+ /// Collapse a Vec<Type> into a single Type or Union.
281
+ /// Returns the single element if len==1, or Union if len>1.
282
+ /// Panics if the vec is empty.
283
+ pub fn union_of(mut types: Vec<Type>) -> Self {
284
+ match types.len() {
285
+ 0 => panic!("union_of called with empty types"),
286
+ 1 => types.pop().unwrap(),
287
+ _ => Type::Union(types),
288
+ }
289
+ }
280
290
  }
281
291
 
282
292
  #[cfg(test)]
data/ext/Cargo.toml CHANGED
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "methodray"
3
- version = "0.1.6"
3
+ version = "0.1.9"
4
4
  edition = "2021"
5
5
 
6
6
  [lib]
@@ -18,7 +18,7 @@ default = []
18
18
  cli = ["methodray-core/cli", "dep:clap", "dep:anyhow"]
19
19
 
20
20
  [dependencies]
21
- methodray-core = { path = "../rust", features = ["ruby-ffi"] }
21
+ methodray-core = { path = "../core", features = ["ruby-ffi"] }
22
22
  magnus = "0.8"
23
23
  clap = { version = "4", features = ["derive"], optional = true }
24
24
  anyhow = { version = "1", optional = true }
@@ -21,8 +21,8 @@ module MethodRay
21
21
  File.expand_path(@binary_name, LIB_DIR),
22
22
  # Development: target/release (project root)
23
23
  File.expand_path("../../target/release/#{@binary_name}", LIB_DIR),
24
- # Development: rust/target/release (legacy standalone binary)
25
- File.expand_path("../../rust/target/release/#{@legacy_binary_name}", LIB_DIR)
24
+ # Development: core/target/release (legacy standalone binary)
25
+ File.expand_path("../../core/target/release/#{@legacy_binary_name}", LIB_DIR)
26
26
  ]
27
27
  end
28
28
  end
@@ -46,7 +46,7 @@ module MethodRay
46
46
  warn 'Error: CLI binary not found.'
47
47
  warn ''
48
48
  warn 'For development, build with:'
49
- warn ' cd rust && cargo build --release --bin methodray --features cli'
49
+ warn ' cd core && cargo build --release --bin methodray --features cli'
50
50
  warn ''
51
51
  warn 'If installed via gem, this might be a platform compatibility issue.'
52
52
  warn 'Please report at: https://github.com/dak2/method-ray/issues'
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module MethodRay
4
- VERSION = '0.1.7'
4
+ VERSION = '0.1.9'
5
5
  end
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.7
4
+ version: 0.1.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - dak2
@@ -37,6 +37,59 @@ files:
37
37
  - CHANGELOG.md
38
38
  - LICENSE
39
39
  - README.md
40
+ - core/Cargo.toml
41
+ - core/src/analyzer/assignments.rs
42
+ - core/src/analyzer/attributes.rs
43
+ - core/src/analyzer/blocks.rs
44
+ - core/src/analyzer/calls.rs
45
+ - core/src/analyzer/conditionals.rs
46
+ - core/src/analyzer/definitions.rs
47
+ - core/src/analyzer/dispatch.rs
48
+ - core/src/analyzer/exceptions.rs
49
+ - core/src/analyzer/install.rs
50
+ - core/src/analyzer/literals.rs
51
+ - core/src/analyzer/loops.rs
52
+ - core/src/analyzer/mod.rs
53
+ - core/src/analyzer/operators.rs
54
+ - core/src/analyzer/parameters.rs
55
+ - core/src/analyzer/parentheses.rs
56
+ - core/src/analyzer/returns.rs
57
+ - core/src/analyzer/super_calls.rs
58
+ - core/src/analyzer/variables.rs
59
+ - core/src/cache/mod.rs
60
+ - core/src/cache/rbs_cache.rs
61
+ - core/src/checker.rs
62
+ - core/src/cli/args.rs
63
+ - core/src/cli/commands.rs
64
+ - core/src/cli/mod.rs
65
+ - core/src/diagnostics/diagnostic.rs
66
+ - core/src/diagnostics/formatter.rs
67
+ - core/src/diagnostics/mod.rs
68
+ - core/src/env/box_manager.rs
69
+ - core/src/env/global_env.rs
70
+ - core/src/env/local_env.rs
71
+ - core/src/env/method_registry.rs
72
+ - core/src/env/mod.rs
73
+ - core/src/env/scope.rs
74
+ - core/src/env/type_error.rs
75
+ - core/src/env/vertex_manager.rs
76
+ - core/src/graph/box.rs
77
+ - core/src/graph/change_set.rs
78
+ - core/src/graph/mod.rs
79
+ - core/src/graph/vertex.rs
80
+ - core/src/lib.rs
81
+ - core/src/lsp/diagnostics.rs
82
+ - core/src/lsp/main.rs
83
+ - core/src/lsp/mod.rs
84
+ - core/src/lsp/server.rs
85
+ - core/src/main.rs
86
+ - core/src/parser.rs
87
+ - core/src/rbs/converter.rs
88
+ - core/src/rbs/error.rs
89
+ - core/src/rbs/loader.rs
90
+ - core/src/rbs/mod.rs
91
+ - core/src/source_map.rs
92
+ - core/src/types.rs
40
93
  - exe/methodray
41
94
  - ext/Cargo.toml
42
95
  - ext/extconf.rb
@@ -47,55 +100,6 @@ files:
47
100
  - lib/methodray/cli.rb
48
101
  - lib/methodray/commands.rb
49
102
  - lib/methodray/version.rb
50
- - rust/Cargo.toml
51
- - rust/src/analyzer/attributes.rs
52
- - rust/src/analyzer/blocks.rs
53
- - rust/src/analyzer/calls.rs
54
- - rust/src/analyzer/conditionals.rs
55
- - rust/src/analyzer/definitions.rs
56
- - rust/src/analyzer/dispatch.rs
57
- - rust/src/analyzer/install.rs
58
- - rust/src/analyzer/literals.rs
59
- - rust/src/analyzer/mod.rs
60
- - rust/src/analyzer/operators.rs
61
- - rust/src/analyzer/parameters.rs
62
- - rust/src/analyzer/parentheses.rs
63
- - rust/src/analyzer/returns.rs
64
- - rust/src/analyzer/variables.rs
65
- - rust/src/cache/mod.rs
66
- - rust/src/cache/rbs_cache.rs
67
- - rust/src/checker.rs
68
- - rust/src/cli/args.rs
69
- - rust/src/cli/commands.rs
70
- - rust/src/cli/mod.rs
71
- - rust/src/diagnostics/diagnostic.rs
72
- - rust/src/diagnostics/formatter.rs
73
- - rust/src/diagnostics/mod.rs
74
- - rust/src/env/box_manager.rs
75
- - rust/src/env/global_env.rs
76
- - rust/src/env/local_env.rs
77
- - rust/src/env/method_registry.rs
78
- - rust/src/env/mod.rs
79
- - rust/src/env/scope.rs
80
- - rust/src/env/type_error.rs
81
- - rust/src/env/vertex_manager.rs
82
- - rust/src/graph/box.rs
83
- - rust/src/graph/change_set.rs
84
- - rust/src/graph/mod.rs
85
- - rust/src/graph/vertex.rs
86
- - rust/src/lib.rs
87
- - rust/src/lsp/diagnostics.rs
88
- - rust/src/lsp/main.rs
89
- - rust/src/lsp/mod.rs
90
- - rust/src/lsp/server.rs
91
- - rust/src/main.rs
92
- - rust/src/parser.rs
93
- - rust/src/rbs/converter.rs
94
- - rust/src/rbs/error.rs
95
- - rust/src/rbs/loader.rs
96
- - rust/src/rbs/mod.rs
97
- - rust/src/source_map.rs
98
- - rust/src/types.rs
99
103
  homepage: https://github.com/dak2/method-ray
100
104
  licenses:
101
105
  - MIT
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