devlensio 1.0.3 → 1.1.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 (75) hide show
  1. package/dist/config/backcompat.test.d.ts +1 -0
  2. package/dist/config/backcompat.test.js +188 -0
  3. package/dist/config/index.d.ts +5 -3
  4. package/dist/config/index.js +37 -54
  5. package/dist/config/providers/file.d.ts +3 -1
  6. package/dist/config/providers/file.js +47 -53
  7. package/dist/config/providers/providers.default.js +0 -1
  8. package/dist/config/providers/request.js +1 -1
  9. package/dist/config/types.d.ts +0 -1
  10. package/dist/config/types.js +2 -18
  11. package/dist/graph/edges/callEdges.js +97 -5
  12. package/dist/graph/edges/callEdges.test.js +154 -0
  13. package/dist/index.d.ts +1 -1
  14. package/dist/index.js +1 -1
  15. package/dist/jobs/queue/memory.js +12 -1
  16. package/dist/parser/extractors/classes.js +23 -4
  17. package/dist/parser/extractors/functions.d.ts +10 -3
  18. package/dist/parser/extractors/functions.js +135 -65
  19. package/dist/parser/extractors/hooks.js +5 -29
  20. package/dist/parser/extractors/objectMethods.js +3 -4
  21. package/dist/parser/index.js +11 -6
  22. package/dist/parser/overloads.d.ts +2 -0
  23. package/dist/parser/overloads.js +96 -0
  24. package/dist/parser/overloads.test.d.ts +1 -0
  25. package/dist/parser/overloads.test.js +175 -0
  26. package/dist/parser/typeUtils.d.ts +2 -0
  27. package/dist/parser/typeUtils.js +2 -0
  28. package/dist/summarizer/providers/index.js +4 -4
  29. package/dist/summarizer/providers/openai.js +1 -1
  30. package/dist/types.d.ts +6 -0
  31. package/extractors/go/bin/darwin-amd64/devlens_go_extractor +0 -0
  32. package/extractors/go/bin/darwin-arm64/devlens_go_extractor +0 -0
  33. package/extractors/go/bin/linux-amd64/devlens_go_extractor +0 -0
  34. package/extractors/go/bin/linux-arm64/devlens_go_extractor +0 -0
  35. package/extractors/go/bin/windows-amd64/devlens_go_extractor.exe +0 -0
  36. package/extractors/go/calls.go +134 -2
  37. package/extractors/go/contract.go +1 -0
  38. package/extractors/go/exports.go +107 -0
  39. package/extractors/go/exports_test.go +64 -0
  40. package/extractors/go/extractor.go +1 -0
  41. package/extractors/go/lookup.go +63 -7
  42. package/extractors/go/nodes.go +28 -0
  43. package/extractors/go/parser.go +51 -8
  44. package/extractors/java/devlens_java_extractor.jar +0 -0
  45. package/extractors/java/src/devlens/extractor/ExportsMapBuilder.java +148 -0
  46. package/extractors/java/src/devlens/extractor/Extractor.java +34 -0
  47. package/extractors/java/src/devlens/extractor/LookupMaps.java +12 -0
  48. package/extractors/java/src/devlens/extractor/Overloads.java +290 -0
  49. package/extractors/java/src/devlens/extractor/Parser.java +39 -0
  50. package/extractors/java/src/devlens/extractor/TypeSolverFactory.java +9 -0
  51. package/extractors/java/src/devlens/extractor/edges/Calls.java +42 -36
  52. package/extractors/java/src/devlens/extractor/edges/Routes.java +10 -3
  53. package/extractors/python/devlens_extractors_python/edges/calls.py +127 -26
  54. package/extractors/python/devlens_extractors_python/exports_map.py +263 -0
  55. package/extractors/python/devlens_extractors_python/extractor.py +7 -1
  56. package/extractors/python/devlens_extractors_python/lookup.py +6 -0
  57. package/extractors/python/devlens_extractors_python/parser/__init__.py +6 -0
  58. package/extractors/python/devlens_extractors_python/parser/functions.py +103 -6
  59. package/extractors/python/devlens_extractors_python/parser/overloads.py +105 -0
  60. package/extractors/rust/bin/darwin-amd64/devlens_rust_extractor +0 -0
  61. package/extractors/rust/bin/darwin-arm64/devlens_rust_extractor +0 -0
  62. package/extractors/rust/bin/linux-amd64/devlens_rust_extractor +0 -0
  63. package/extractors/rust/bin/linux-arm64/devlens_rust_extractor +0 -0
  64. package/extractors/rust/bin/windows-amd64/devlens_rust_extractor.exe +0 -0
  65. package/extractors/rust/src/calls.rs +27 -16
  66. package/extractors/rust/src/contract.rs +2 -0
  67. package/extractors/rust/src/exports.rs +387 -0
  68. package/extractors/rust/src/exports_test.rs +105 -0
  69. package/extractors/rust/src/extractor.rs +2 -0
  70. package/extractors/rust/src/lookup.rs +60 -0
  71. package/extractors/rust/src/main.rs +4 -0
  72. package/extractors/rust/src/nodes.rs +19 -0
  73. package/extractors/rust/src/parser.rs +66 -1
  74. package/extractors/rust/src/routes.rs +2 -1
  75. package/package.json +10 -3
@@ -113,6 +113,17 @@ pub const KIND_TRAIT: &str = "TRAIT";
113
113
  pub const KIND_IMPL_BLOCK: &str = "IMPL_BLOCK";
114
114
 
115
115
  #[derive(Clone, Default)]
116
+ pub struct CallSite {
117
+ /// call expression text (path or receiver.method form)
118
+ pub name: String,
119
+ /// number of arguments at the call site
120
+ pub arg_count: usize,
121
+ /// coarse literal type tags per argument ("string"/"number"/"boolean"/
122
+ /// "char"/"unknown") — same vocabulary as the TS engine's callSites
123
+ pub arg_types: Vec<String>,
124
+ }
125
+
126
+ #[derive(Clone)]
116
127
  pub struct OrmCall {
117
128
  /// "read" | "write"
118
129
  pub kind: String,
@@ -134,6 +145,10 @@ pub struct ParsedItem {
134
145
  /// method receiver: "&self" / "&mut self" / "self" / "" (free fn)
135
146
  pub receiver: String,
136
147
  pub calls: Vec<String>,
148
+ /// structured call records for overload-aware resolution parity
149
+ pub call_sites: Vec<CallSite>,
150
+ /// declared parameter type strings (receiver excluded)
151
+ pub params: Vec<String>,
137
152
  pub is_test: bool,
138
153
  /// Diesel R/W call facts (collected alongside calls)
139
154
  pub orm_calls: Vec<OrmCall>,
@@ -209,9 +224,24 @@ fn has_cfg_test(attrs: &[syn::Attribute]) -> bool {
209
224
 
210
225
  struct CallCollector {
211
226
  calls: Vec<String>,
227
+ call_sites: Vec<CallSite>,
212
228
  orm_calls: Vec<OrmCall>,
213
229
  }
214
230
 
231
+ /// Coarse literal type tag for one argument expression.
232
+ fn arg_type_tag(e: &syn::Expr) -> String {
233
+ match e {
234
+ syn::Expr::Lit(l) => match &l.lit {
235
+ syn::Lit::Str(_) => "string".to_string(),
236
+ syn::Lit::Int(_) | syn::Lit::Float(_) => "number".to_string(),
237
+ syn::Lit::Bool(_) => "boolean".to_string(),
238
+ syn::Lit::Char(_) | syn::Lit::Byte(_) => "char".to_string(),
239
+ _ => "unknown".to_string(),
240
+ },
241
+ _ => "unknown".to_string(),
242
+ }
243
+ }
244
+
215
245
  /// Diesel query-DSL verbs (documented diesel API — anti-overfit rule).
216
246
  const ORM_READ_VERBS: [&str; 9] = [
217
247
  "filter",
@@ -276,6 +306,12 @@ impl<'ast> Visit<'ast> for CallCollector {
276
306
  other => collapse_tokens(&other.to_token_stream().to_string()),
277
307
  };
278
308
  self.calls.push(name.clone());
309
+ let arg_types: Vec<String> = e.args.iter().map(arg_type_tag).collect();
310
+ self.call_sites.push(CallSite {
311
+ name: name.clone(),
312
+ arg_count: e.args.len(),
313
+ arg_types,
314
+ });
279
315
  // diesel top-level write fns: insert_into(table) / update(table) /
280
316
  // delete(table)
281
317
  if let Some(first) = DIESEL_WRITE_FNS
@@ -296,7 +332,14 @@ impl<'ast> Visit<'ast> for CallCollector {
296
332
  fn visit_expr_method_call(&mut self, e: &'ast syn::ExprMethodCall) {
297
333
  let recv = collapse_tokens(&e.receiver.to_token_stream().to_string());
298
334
  let method = e.method.to_string();
299
- self.calls.push(format!("{}.{}", recv, method));
335
+ let mname = format!("{}.{}", recv, method);
336
+ self.calls.push(mname.clone());
337
+ let arg_types: Vec<String> = e.args.iter().map(arg_type_tag).collect();
338
+ self.call_sites.push(CallSite {
339
+ name: mname,
340
+ arg_count: e.args.len(),
341
+ arg_types,
342
+ });
300
343
  // Diesel query DSL on a table path (receiver contains ::table or
301
344
  // ::dsl::, or is a bare table-name alias)
302
345
  let is_table_path = recv.contains("::table")
@@ -563,6 +606,8 @@ fn base_item(
563
606
  is_async: false,
564
607
  receiver: String::new(),
565
608
  calls: vec![],
609
+ call_sites: vec![],
610
+ params: vec![],
566
611
  is_test: false,
567
612
  orm_calls: vec![],
568
613
  fields: vec![],
@@ -675,9 +720,21 @@ fn parse_fn_like(
675
720
  }
676
721
  }
677
722
 
723
+ // declared param type strings (receiver excluded)
724
+ pi.params = sig
725
+ .inputs
726
+ .iter()
727
+ .filter(|arg| matches!(arg, syn::FnArg::Typed(_)))
728
+ .map(|arg| match arg {
729
+ syn::FnArg::Typed(pt) => collapse_tokens(&pt.ty.to_token_stream().to_string()),
730
+ _ => String::new(),
731
+ })
732
+ .collect();
733
+
678
734
  // calls + Diesel R/W facts within THIS body only (nested items skipped)
679
735
  let mut cc = CallCollector {
680
736
  calls: vec![],
737
+ call_sites: vec![],
681
738
  orm_calls: vec![],
682
739
  };
683
740
  cc.visit_block(block);
@@ -686,6 +743,14 @@ fn parse_fn_like(
686
743
  seen.insert(c);
687
744
  }
688
745
  pi.calls = seen.into_iter().collect();
746
+ // dedupe call sites on the full (name, count, types) triple
747
+ let mut seen_sites: BTreeSet<String> = BTreeSet::new();
748
+ for cs in cc.call_sites {
749
+ let key = format!("{}|{}|{}", cs.name, cs.arg_count, cs.arg_types.join(","));
750
+ if seen_sites.insert(key) {
751
+ pi.call_sites.push(cs);
752
+ }
753
+ }
689
754
  pi.orm_calls = cc.orm_calls;
690
755
  pi
691
756
  }
@@ -624,8 +624,9 @@ fn utoipa_route_op(
624
624
  mf: &ParsedManifest,
625
625
  tp: &mut ThirdPartyRegistry,
626
626
  ) -> Option<RouterOp> {
627
- let node_id = crate::calls::resolve_path_call(
627
+ let (node_id, _) = crate::calls::resolve_path_call(
628
628
  handler_path,
629
+ 0,
629
630
  file,
630
631
  base_module,
631
632
  module_map,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "devlensio",
3
- "version": "1.0.3",
3
+ "version": "1.1.0",
4
4
  "description": "Codebase intelligence engine for TypeScript/JavaScript/React/Next.js, Python, Java, Go, and Rust repositories.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -21,7 +21,14 @@
21
21
  "prepack": "node extractors/java/build.mjs && node extractors/go/build.mjs && node extractors/rust/build.mjs",
22
22
  "postinstall": "node extractors/python/setup.mjs"
23
23
  },
24
- "keywords": ["codebase", "graph", "ast", "typescript", "javascript", "devtools"],
24
+ "keywords": [
25
+ "codebase",
26
+ "graph",
27
+ "ast",
28
+ "typescript",
29
+ "javascript",
30
+ "devtools"
31
+ ],
25
32
  "author": "",
26
33
  "license": "AGPL-3.0",
27
34
  "files": [
@@ -63,4 +70,4 @@
63
70
  "ts-node-dev": "^2.0.0",
64
71
  "typescript": "^5.9.3"
65
72
  }
66
- }
73
+ }