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.
- package/dist/config/backcompat.test.d.ts +1 -0
- package/dist/config/backcompat.test.js +188 -0
- package/dist/config/index.d.ts +5 -3
- package/dist/config/index.js +37 -54
- package/dist/config/providers/file.d.ts +3 -1
- package/dist/config/providers/file.js +47 -53
- package/dist/config/providers/providers.default.js +0 -1
- package/dist/config/providers/request.js +1 -1
- package/dist/config/types.d.ts +0 -1
- package/dist/config/types.js +2 -18
- package/dist/graph/edges/callEdges.js +97 -5
- package/dist/graph/edges/callEdges.test.js +154 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/jobs/queue/memory.js +12 -1
- package/dist/parser/extractors/classes.js +23 -4
- package/dist/parser/extractors/functions.d.ts +10 -3
- package/dist/parser/extractors/functions.js +135 -65
- package/dist/parser/extractors/hooks.js +5 -29
- package/dist/parser/extractors/objectMethods.js +3 -4
- package/dist/parser/index.js +11 -6
- package/dist/parser/overloads.d.ts +2 -0
- package/dist/parser/overloads.js +96 -0
- package/dist/parser/overloads.test.d.ts +1 -0
- package/dist/parser/overloads.test.js +175 -0
- package/dist/parser/typeUtils.d.ts +2 -0
- package/dist/parser/typeUtils.js +2 -0
- package/dist/summarizer/providers/index.js +4 -4
- package/dist/summarizer/providers/openai.js +1 -1
- package/dist/types.d.ts +6 -0
- package/extractors/go/bin/darwin-amd64/devlens_go_extractor +0 -0
- package/extractors/go/bin/darwin-arm64/devlens_go_extractor +0 -0
- package/extractors/go/bin/linux-amd64/devlens_go_extractor +0 -0
- package/extractors/go/bin/linux-arm64/devlens_go_extractor +0 -0
- package/extractors/go/bin/windows-amd64/devlens_go_extractor.exe +0 -0
- package/extractors/go/calls.go +134 -2
- package/extractors/go/contract.go +1 -0
- package/extractors/go/exports.go +107 -0
- package/extractors/go/exports_test.go +64 -0
- package/extractors/go/extractor.go +1 -0
- package/extractors/go/lookup.go +63 -7
- package/extractors/go/nodes.go +28 -0
- package/extractors/go/parser.go +51 -8
- package/extractors/java/devlens_java_extractor.jar +0 -0
- package/extractors/java/src/devlens/extractor/ExportsMapBuilder.java +148 -0
- package/extractors/java/src/devlens/extractor/Extractor.java +34 -0
- package/extractors/java/src/devlens/extractor/LookupMaps.java +12 -0
- package/extractors/java/src/devlens/extractor/Overloads.java +290 -0
- package/extractors/java/src/devlens/extractor/Parser.java +39 -0
- package/extractors/java/src/devlens/extractor/TypeSolverFactory.java +9 -0
- package/extractors/java/src/devlens/extractor/edges/Calls.java +42 -36
- package/extractors/java/src/devlens/extractor/edges/Routes.java +10 -3
- package/extractors/python/devlens_extractors_python/edges/calls.py +127 -26
- package/extractors/python/devlens_extractors_python/exports_map.py +263 -0
- package/extractors/python/devlens_extractors_python/extractor.py +7 -1
- package/extractors/python/devlens_extractors_python/lookup.py +6 -0
- package/extractors/python/devlens_extractors_python/parser/__init__.py +6 -0
- package/extractors/python/devlens_extractors_python/parser/functions.py +103 -6
- package/extractors/python/devlens_extractors_python/parser/overloads.py +105 -0
- package/extractors/rust/bin/darwin-amd64/devlens_rust_extractor +0 -0
- package/extractors/rust/bin/darwin-arm64/devlens_rust_extractor +0 -0
- package/extractors/rust/bin/linux-amd64/devlens_rust_extractor +0 -0
- package/extractors/rust/bin/linux-arm64/devlens_rust_extractor +0 -0
- package/extractors/rust/bin/windows-amd64/devlens_rust_extractor.exe +0 -0
- package/extractors/rust/src/calls.rs +27 -16
- package/extractors/rust/src/contract.rs +2 -0
- package/extractors/rust/src/exports.rs +387 -0
- package/extractors/rust/src/exports_test.rs +105 -0
- package/extractors/rust/src/extractor.rs +2 -0
- package/extractors/rust/src/lookup.rs +60 -0
- package/extractors/rust/src/main.rs +4 -0
- package/extractors/rust/src/nodes.rs +19 -0
- package/extractors/rust/src/parser.rs +66 -1
- package/extractors/rust/src/routes.rs +2 -1
- 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
|
-
|
|
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
|
+
"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": [
|
|
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
|
+
}
|