devlensio 1.0.1 → 1.0.2
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/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/java/devlens_java_extractor.jar +0 -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 +1 -1
- package/extractors/rust/src/enrich.rs +1 -1
- package/extractors/rust/src/imports.rs +1 -1
- package/extractors/rust/src/inheritance.rs +1 -1
- package/extractors/rust/src/nodes.rs +30 -10
- package/extractors/rust/src/orm_edges.rs +2 -2
- package/extractors/rust/src/parser.rs +8 -3
- package/extractors/rust/src/routes.rs +2 -2
- package/extractors/rust/src/tests.rs +1 -1
- package/package.json +1 -1
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -34,7 +34,7 @@ pub fn detect_imports(
|
|
|
34
34
|
let mut seen: std::collections::HashSet<(String, String)> = std::collections::HashSet::new();
|
|
35
35
|
|
|
36
36
|
for pf in &repo.files {
|
|
37
|
-
if pf.
|
|
37
|
+
if pf.is_pure_test_file {
|
|
38
38
|
// test files ARE leaf nodes, but they still import — emit edges
|
|
39
39
|
// from the TEST node (same file id — parentFile covers it)
|
|
40
40
|
}
|
|
@@ -2,9 +2,11 @@
|
|
|
2
2
|
//
|
|
3
3
|
// Contract rules enforced here:
|
|
4
4
|
// - FILE id `file::rel/path.rs`; file nodes parent themselves
|
|
5
|
-
// -
|
|
6
|
-
//
|
|
7
|
-
//
|
|
5
|
+
// - PURE test files (tests/ integration files, or files whose every item is
|
|
6
|
+
// a #[test] fn) = LEAF TEST nodes; Rust's idiomatic inline #[cfg(test)]
|
|
7
|
+
// mod tests must NOT collapse a mixed production file — its non-test items
|
|
8
|
+
// emit normally and #[test] fns emit as FUNCTION nodes flagged
|
|
9
|
+
// metadata.isTestFunction (test bodies stay out of prod call edges there)
|
|
8
10
|
// - rawCode + codeHash on every FUNCTION/METHOD/STRUCT/ENUM/TRAIT/IMPL_BLOCK
|
|
9
11
|
// - deterministic ids (file-scoped; trait-impl method suffix for the
|
|
10
12
|
// same-name-different-trait collision class)
|
|
@@ -17,7 +19,7 @@ use serde_json::{Map, Value};
|
|
|
17
19
|
pub fn collect_file_nodes(files: &[ParsedFile]) -> Vec<CodeNode> {
|
|
18
20
|
let mut out = vec![];
|
|
19
21
|
for pf in files {
|
|
20
|
-
if pf.
|
|
22
|
+
if pf.is_pure_test_file {
|
|
21
23
|
let mut n = file_node(&pf.rel_path, pf.line_count, NODE_TEST);
|
|
22
24
|
let meta = n
|
|
23
25
|
.metadata
|
|
@@ -30,25 +32,43 @@ pub fn collect_file_nodes(files: &[ParsedFile]) -> Vec<CodeNode> {
|
|
|
30
32
|
}
|
|
31
33
|
out.push(n);
|
|
32
34
|
} else {
|
|
33
|
-
|
|
35
|
+
let mut n = file_node(&pf.rel_path, pf.line_count, NODE_FILE);
|
|
36
|
+
// Mixed files keep a testCases index so consumers that never walk
|
|
37
|
+
// FUNCTION nodes still see the file's tests.
|
|
38
|
+
if !pf.test_fns.is_empty() {
|
|
39
|
+
let meta = n
|
|
40
|
+
.metadata
|
|
41
|
+
.entry("testCases".to_string())
|
|
42
|
+
.or_insert_with(|| Value::Array(vec![]));
|
|
43
|
+
if let Value::Array(arr) = meta {
|
|
44
|
+
for t in &pf.test_fns {
|
|
45
|
+
arr.push(Value::from(t.clone()));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
out.push(n);
|
|
34
50
|
}
|
|
35
51
|
}
|
|
36
52
|
out
|
|
37
53
|
}
|
|
38
54
|
|
|
39
|
-
/// Code nodes
|
|
40
|
-
///
|
|
55
|
+
/// Code nodes. PURE test files stay leaves (their fns ride in testCases).
|
|
56
|
+
/// Mixed files emit ALL items; #[test] fns are flagged metadata.isTestFunction
|
|
57
|
+
/// instead of being dropped, so a test function is addressable without a new
|
|
58
|
+
/// node type.
|
|
41
59
|
pub fn collect_code_nodes(files: &[ParsedFile]) -> Vec<CodeNode> {
|
|
42
60
|
let mut out = vec![];
|
|
43
61
|
for pf in files {
|
|
44
|
-
if pf.
|
|
62
|
+
if pf.is_pure_test_file {
|
|
45
63
|
continue;
|
|
46
64
|
}
|
|
47
65
|
for item in &pf.items {
|
|
66
|
+
let mut n = item_node(pf, item);
|
|
48
67
|
if item.is_test {
|
|
49
|
-
|
|
68
|
+
n.metadata
|
|
69
|
+
.insert("isTestFunction".to_string(), Value::from(true));
|
|
50
70
|
}
|
|
51
|
-
out.push(
|
|
71
|
+
out.push(n);
|
|
52
72
|
}
|
|
53
73
|
}
|
|
54
74
|
out
|
|
@@ -21,7 +21,7 @@ use std::collections::HashMap;
|
|
|
21
21
|
pub fn table_to_model_map(repo: &ParsedRepo) -> HashMap<String, String> {
|
|
22
22
|
let mut map = HashMap::new();
|
|
23
23
|
for pf in &repo.files {
|
|
24
|
-
if pf.
|
|
24
|
+
if pf.is_pure_test_file {
|
|
25
25
|
continue;
|
|
26
26
|
}
|
|
27
27
|
for item in &pf.items {
|
|
@@ -89,7 +89,7 @@ pub fn detect_orm_edges(
|
|
|
89
89
|
let table_to_schema_file = table_to_schema_file_map(repo);
|
|
90
90
|
|
|
91
91
|
for pf in &repo.files {
|
|
92
|
-
if pf.
|
|
92
|
+
if pf.is_pure_test_file {
|
|
93
93
|
continue;
|
|
94
94
|
}
|
|
95
95
|
for item in &pf.items {
|
|
@@ -162,7 +162,12 @@ pub struct ParsedFile {
|
|
|
162
162
|
pub items: Vec<ParsedItem>,
|
|
163
163
|
pub tables: Vec<TableDecl>,
|
|
164
164
|
pub test_fns: Vec<String>,
|
|
165
|
-
|
|
165
|
+
/// True only when the file is EXCLUSIVELY tests (every top-level item is a
|
|
166
|
+
/// #[test] fn, or the file only holds inline #[cfg(test)] mods). Rust's
|
|
167
|
+
/// idiomatic inline `#[cfg(test)] mod tests` must NOT collapse a mixed
|
|
168
|
+
/// production file into a TEST leaf — only pure test files get leaf
|
|
169
|
+
/// treatment (mirrors the intent of go's _test.go rule).
|
|
170
|
+
pub is_pure_test_file: bool,
|
|
166
171
|
pub line_count: i64,
|
|
167
172
|
}
|
|
168
173
|
|
|
@@ -326,7 +331,7 @@ pub fn parse_file(rel_path: &str, source: &str) -> Result<ParsedFile, String> {
|
|
|
326
331
|
items: vec![],
|
|
327
332
|
tables: vec![],
|
|
328
333
|
test_fns: vec![],
|
|
329
|
-
|
|
334
|
+
is_pure_test_file: false,
|
|
330
335
|
line_count: line_index.line_count() as i64,
|
|
331
336
|
};
|
|
332
337
|
|
|
@@ -342,7 +347,7 @@ pub fn parse_file(rel_path: &str, source: &str) -> Result<ParsedFile, String> {
|
|
|
342
347
|
}
|
|
343
348
|
pf.ast.items = ast_items;
|
|
344
349
|
|
|
345
|
-
pf.
|
|
350
|
+
pf.is_pure_test_file = !pf.test_fns.is_empty() && pf.items.iter().all(|i| i.is_test);
|
|
346
351
|
Ok(pf)
|
|
347
352
|
}
|
|
348
353
|
|
|
@@ -96,7 +96,7 @@ pub fn detect_routes(
|
|
|
96
96
|
let mut func_lit_vars: HashMap<(String, String), String> = HashMap::new();
|
|
97
97
|
|
|
98
98
|
for pf in &repo.files {
|
|
99
|
-
if pf.
|
|
99
|
+
if pf.is_pure_test_file {
|
|
100
100
|
continue;
|
|
101
101
|
}
|
|
102
102
|
for item in &pf.items {
|
|
@@ -195,7 +195,7 @@ pub fn detect_routes(
|
|
|
195
195
|
// ── actix-web / rocket: attribute macros ──
|
|
196
196
|
if framework == "actix-web" || framework == "rocket" {
|
|
197
197
|
for pf in &repo.files {
|
|
198
|
-
if pf.
|
|
198
|
+
if pf.is_pure_test_file {
|
|
199
199
|
continue;
|
|
200
200
|
}
|
|
201
201
|
for item in &pf.items {
|
package/package.json
CHANGED