Skip to content

Commit 90ccab0

Browse files
Brooooooklynclaude
andcommitted
fix(angular): thread source_text through remaining metadata builders
- build_ctor_params_metadata: pass source_text so @Inject(...) args with complex expressions are preserved in ɵsetClassMetadata - build_prop_decorators_metadata: pass source_text so @input({...}) with complex transform functions are preserved - extract_provided_in: propagate source_text from parent extract_injectable_metadata into forwardRef extraction Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent f6eabfa commit 90ccab0

File tree

4 files changed

+20
-8
lines changed

4 files changed

+20
-8
lines changed

crates/oxc_angular_compiler/src/class_metadata/builders.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ pub fn build_ctor_params_metadata<'a>(
123123
constructor_deps: Option<&[R3DependencyMetadata<'a>]>,
124124
namespace_registry: &mut NamespaceRegistry<'a>,
125125
import_map: &ImportMap<'a>,
126+
source_text: Option<&'a str>,
126127
) -> Option<OutputExpression<'a>> {
127128
// Find constructor
128129
let constructor = class.body.body.iter().find_map(|element| {
@@ -164,7 +165,8 @@ pub fn build_ctor_params_metadata<'a>(
164165
// Extract decorators from the parameter
165166
let param_decorators = extract_angular_decorators_from_param(param);
166167
if !param_decorators.is_empty() {
167-
let decorators_array = build_decorator_metadata_array(allocator, &param_decorators, None);
168+
let decorators_array =
169+
build_decorator_metadata_array(allocator, &param_decorators, source_text);
168170
map_entries.push(LiteralMapEntry {
169171
key: Ident::from("decorators"),
170172
value: decorators_array,
@@ -206,6 +208,7 @@ pub fn build_ctor_params_metadata<'a>(
206208
pub fn build_prop_decorators_metadata<'a>(
207209
allocator: &'a Allocator,
208210
class: &Class<'a>,
211+
source_text: Option<&'a str>,
209212
) -> Option<OutputExpression<'a>> {
210213
const ANGULAR_PROP_DECORATORS: &[&str] = &[
211214
"Input",
@@ -252,7 +255,8 @@ pub fn build_prop_decorators_metadata<'a>(
252255
}
253256

254257
// Build decorators array for this property
255-
let decorators_array = build_decorator_metadata_array(allocator, &angular_decorators, None);
258+
let decorators_array =
259+
build_decorator_metadata_array(allocator, &angular_decorators, source_text);
256260

257261
prop_entries.push(LiteralMapEntry {
258262
key: prop_name,

crates/oxc_angular_compiler/src/component/transform.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1771,9 +1771,12 @@ pub fn transform_angular_file(
17711771
ctor_deps_slice,
17721772
&mut file_namespace_registry,
17731773
&import_map,
1774+
Some(source),
17741775
),
17751776
prop_decorators: build_prop_decorators_metadata(
1776-
allocator, class,
1777+
allocator,
1778+
class,
1779+
Some(source),
17771780
),
17781781
};
17791782

crates/oxc_angular_compiler/src/injectable/decorator.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ pub fn extract_injectable_metadata<'a>(
252252
};
253253

254254
// Extract providedIn (None if not specified)
255-
let provided_in = extract_provided_in(allocator, config_obj);
255+
let provided_in = extract_provided_in(allocator, config_obj, source_text);
256256

257257
// Extract useClass
258258
let use_class = extract_use_class(allocator, config_obj, source_text);
@@ -303,12 +303,13 @@ fn get_property_key_name<'a>(key: &'a PropertyKey<'a>) -> Option<Ident<'a>> {
303303
fn extract_provided_in<'a>(
304304
allocator: &'a Allocator,
305305
config_obj: &'a oxc_ast::ast::ObjectExpression<'a>,
306+
source_text: Option<&'a str>,
306307
) -> Option<ProvidedInValue<'a>> {
307308
for prop in &config_obj.properties {
308309
if let ObjectPropertyKind::ObjectProperty(prop) = prop {
309310
if let Some(key_name) = get_property_key_name(&prop.key) {
310311
if key_name.as_str() == "providedIn" {
311-
return parse_provided_in_value(allocator, &prop.value);
312+
return parse_provided_in_value(allocator, &prop.value, source_text);
312313
}
313314
}
314315
}
@@ -319,6 +320,7 @@ fn extract_provided_in<'a>(
319320
fn parse_provided_in_value<'a>(
320321
allocator: &'a Allocator,
321322
expr: &'a Expression<'a>,
323+
source_text: Option<&'a str>,
322324
) -> Option<ProvidedInValue<'a>> {
323325
match expr {
324326
Expression::StringLiteral(s) => match s.value.as_str() {
@@ -331,7 +333,7 @@ fn parse_provided_in_value<'a>(
331333
_ => {
332334
// Check for forwardRef
333335
let (expression, is_forward_ref) =
334-
extract_forward_ref_or_expression(allocator, expr, None)?;
336+
extract_forward_ref_or_expression(allocator, expr, source_text)?;
335337
Some(ProvidedInValue::Module { expression, is_forward_ref })
336338
}
337339
}

napi/angular-compiler/src/lib.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1974,7 +1974,8 @@ pub fn compile_class_metadata_sync(
19741974

19751975
// Build decorators array: [{ type: DecoratorClass, args: [...] }]
19761976
let decorator_ref = decorator;
1977-
let decorators_expr = core_build_decorator_metadata_array(&allocator, &[decorator_ref], Some(&source));
1977+
let decorators_expr =
1978+
core_build_decorator_metadata_array(&allocator, &[decorator_ref], Some(&source));
19781979

19791980
// Build constructor parameters metadata
19801981
// This standalone API doesn't have full transform pipeline context (constructor deps
@@ -1988,10 +1989,12 @@ pub fn compile_class_metadata_sync(
19881989
None,
19891990
&mut namespace_registry,
19901991
&empty_import_map,
1992+
Some(&source),
19911993
);
19921994

19931995
// Build property decorators metadata
1994-
let prop_decorators_expr = core_build_prop_decorators_metadata(&allocator, class);
1996+
let prop_decorators_expr =
1997+
core_build_prop_decorators_metadata(&allocator, class, Some(&source));
19951998

19961999
// Create R3ClassMetadata
19972000
let metadata = R3ClassMetadata {

0 commit comments

Comments
 (0)