Skip to content

Commit 804a9c6

Browse files
authored
feat: Match more class declarations for export alias check (#37)
1 parent f971182 commit 804a9c6

File tree

14 files changed

+177
-5
lines changed

14 files changed

+177
-5
lines changed

src/instrumentation.rs

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,18 @@ impl Instrumentation {
287287
if let Pat::Ident(name) = &decl.name {
288288
traced = self.trace_expr_or_count(func_expr, &name.id.sym);
289289
}
290+
} else if let Some(class_expr) = init.as_mut_class() {
291+
if let Pat::Ident(name) = &decl.name {
292+
if class_expr.ident.is_none() {
293+
class_expr.ident = Some(name.id.clone());
294+
} else {
295+
self.is_correct_class = self
296+
.config
297+
.function_query
298+
.class_name()
299+
.is_none_or(|class| name.id.sym.as_ref() == class);
300+
}
301+
}
290302
}
291303
}
292304
}
@@ -303,11 +315,13 @@ impl Instrumentation {
303315
}
304316

305317
pub fn visit_mut_class_expr(&mut self, node: &mut ClassExpr) -> bool {
306-
self.is_correct_class = self.config.function_query.class_name().is_none_or(|class| {
307-
node.ident
308-
.as_ref()
309-
.is_some_and(|ident| ident.sym.as_ref() == class)
310-
});
318+
if !self.is_correct_class {
319+
self.is_correct_class = self.config.function_query.class_name().is_none_or(|class| {
320+
node.ident
321+
.as_ref()
322+
.is_some_and(|ident| ident.sym.as_ref() == class)
323+
});
324+
}
311325
true
312326
}
313327

@@ -416,6 +430,18 @@ impl Instrumentation {
416430
_ => {}
417431
}
418432
}
433+
} else if let Some(class_expr) = node.right.as_mut_class() {
434+
if let AssignTarget::Simple(SimpleAssignTarget::Ident(name)) = &node.left {
435+
if class_expr.ident.is_none() {
436+
class_expr.ident = Some(name.id.clone());
437+
} else {
438+
self.is_correct_class = self
439+
.config
440+
.function_query
441+
.class_name()
442+
.is_none_or(|class| name.id.sym.as_ref() == class);
443+
}
444+
}
419445
}
420446
!traced
421447
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
const J = class {
2+
async fetch(url) {
3+
return 42;
4+
}
5+
};
6+
7+
export { J as Undici };
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
use crate::common::*;
2+
use orchestrion_js::*;
3+
4+
#[test]
5+
fn const_class_export_alias_mjs() {
6+
transpile_and_test(
7+
file!(),
8+
true,
9+
Config::new_single(InstrumentationConfig::new(
10+
"Undici:fetch",
11+
test_module_matcher(),
12+
FunctionQuery::class_method("Undici", "fetch", FunctionKind::Async).as_export_alias(),
13+
)),
14+
);
15+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { Undici } from './instrumented.mjs';
2+
import { assert, getContext } from '../common/preamble.js';
3+
const context = getContext('orchestrion:undici:Undici:fetch');
4+
const undici = new Undici();
5+
const result = await undici.fetch('https://example.com');
6+
assert.strictEqual(result, 42);
7+
assert.deepStrictEqual(context, {
8+
start: true,
9+
end: true,
10+
asyncStart: 42,
11+
asyncEnd: 42
12+
});

tests/instrumentor_test.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ mod common;
77
mod arguments_mutation;
88
mod class_expression_cjs;
99
mod class_method_cjs;
10+
mod const_class_export_alias_mjs;
1011
mod constructor_cjs;
1112
mod constructor_mjs;
1213
mod decl_cjs;
@@ -18,10 +19,13 @@ mod expr_cjs;
1819
mod expr_mjs;
1920
mod index_cjs;
2021
mod injection_failure;
22+
mod let_class_export_alias_mjs;
2123
mod multiple_class_method_cjs;
2224
mod multiple_load_cjs;
2325
mod nested_functions;
2426
mod object_method_cjs;
2527
mod polyfill_cjs;
2628
mod polyfill_mjs;
2729
mod private_method_cjs;
30+
mod var_class_export_alias_mjs;
31+
mod var_named_class_export_alias_mjs;
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
let J = class {
2+
async fetch(url) {
3+
return 42;
4+
}
5+
};
6+
7+
export { J as Undici };
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
use crate::common::*;
2+
use orchestrion_js::*;
3+
4+
#[test]
5+
fn let_class_export_alias_mjs() {
6+
transpile_and_test(
7+
file!(),
8+
true,
9+
Config::new_single(InstrumentationConfig::new(
10+
"Undici:fetch",
11+
test_module_matcher(),
12+
FunctionQuery::class_method("Undici", "fetch", FunctionKind::Async).as_export_alias(),
13+
)),
14+
);
15+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { Undici } from './instrumented.mjs';
2+
import { assert, getContext } from '../common/preamble.js';
3+
const context = getContext('orchestrion:undici:Undici:fetch');
4+
const undici = new Undici();
5+
const result = await undici.fetch('https://example.com');
6+
assert.strictEqual(result, 42);
7+
assert.deepStrictEqual(context, {
8+
start: true,
9+
end: true,
10+
asyncStart: 42,
11+
asyncEnd: 42
12+
});
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
var J = class {
2+
async fetch(url) {
3+
return 42;
4+
}
5+
};
6+
7+
export { J as Undici };
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
use crate::common::*;
2+
use orchestrion_js::*;
3+
4+
#[test]
5+
fn var_class_export_alias_mjs() {
6+
transpile_and_test(
7+
file!(),
8+
true,
9+
Config::new_single(InstrumentationConfig::new(
10+
"Undici:fetch",
11+
test_module_matcher(),
12+
FunctionQuery::class_method("Undici", "fetch", FunctionKind::Async).as_export_alias(),
13+
)),
14+
);
15+
}

0 commit comments

Comments
 (0)