{"record":{"id":"5c3b6198132f427a","repo":"swc-project/swc","slug":"not-implemented-5c3b61","errorCode":null,"errorMessage":"not implemented","messagePattern":"not implemented","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/swc_ecma_utils/src/lib.rs","lineNumber":2564,"sourceCode":"            }\n        };\n    }\n\n    pub fn exit_jsx_element_name(&mut self, n: &mut JSXElementName) {\n        if let JSXElementName::Ident(ident) = n {\n            if let Some(expr) = self.query.query_jsx(ident) {\n                *n = expr;\n            }\n        }\n    }\n\n    pub fn exit_jsx_object(&mut self, n: &mut JSXObject) {\n        if let JSXObject::Ident(ident) = n {\n            if let Some(expr) = self.query.query_jsx(ident) {\n                *n = match expr {\n                    JSXElementName::Ident(ident) => ident.into(),\n                    JSXElementName::JSXMemberExpr(expr) => Box::new(expr).into(),\n                    JSXElementName::JSXNamespacedName(..) => unimplemented!(),\n                    #[cfg(swc_ast_unknown)]\n                    _ => return,\n                }\n            }\n        }\n    }\n\n    pub fn exit_object_pat_prop(&mut self, n: &mut ObjectPatProp) {\n        if let ObjectPatProp::Assign(AssignPatProp { key, value, .. }) = n {\n            if let Some(expr) = self.query.query_lhs(&key.id) {\n                let value = value\n                    .take()\n                    .map(|default_value| {\n                        let left = expr.clone().try_into().unwrap();\n                        Box::new(default_value.make_assign_to(op!(\"=\"), left))\n                    })\n                    .unwrap_or(expr);\n","sourceCodeStart":2546,"sourceCodeEnd":2582,"githubUrl":"https://github.com/swc-project/swc/blob/d7d74346665e36e692aa07e13d4ee3ee692ee35c/crates/swc_ecma_utils/src/lib.rs#L2546-L2582","documentation":"`RefRewriter` in swc_ecma_utils replaces identifiers with expressions according to a `QueryRef` mapping (`query_jsx` for JSX positions). When rewriting the object position of a JSX member element (`<Foo.Bar />`), a `query_jsx` result of `JSXElementName::JSXNamespacedName` has no `JSXObject` equivalent, so `exit_jsx_object` panics via `unimplemented!()`. No in-tree query implementation returns namespaced names for that position.","triggerScenarios":"Provide a custom `QueryRef` implementation whose `query_jsx` returns `JSXNamespacedName` for an identifier that appears as the object of `<Foo.Bar />` in JSX using the RefRewriter.","commonSituations":"Custom bundler or plugin code using RefRewriter for aliasing/inlining in JSX-heavy codebases; replacing JSX tag aliases with namespaced names.","solutions":["In your `query_jsx`, return only `Ident` or `JSXMemberExpr` — e.g. encode a namespace as the member expression `ns.tag`","Skip replacement when the identifier may appear as a JSX member object","Report upstream to turn the panic into a graceful skip"],"exampleFix":"// Rust QueryRef impl\n// before\nfn query_jsx(&self, i: &Ident) -> Option<JSXElementName> {\n    Some(JSXElementName::JSXNamespacedName(...)) // panics in <Foo.Bar />\n}\n\n// after\nfn query_jsx(&self, i: &Ident) -> Option<JSXElementName> {\n    Some(JSXElementName::Ident(make_replacement_ident(i)))\n}","handlingStrategy":"type-guard","validationCode":null,"typeGuard":"// Rust: guard query_jsx results so they are usable in member-object position\nfn jsx_name_usable_as_object(n: &JSXElementName) -> bool {\n    matches!(n, JSXElementName::Ident(..) | JSXElementName::JSXMemberExpr(..))\n}","tryCatchPattern":null,"preventionTips":["In custom QueryRef impls, return only Ident or JSXMemberExpr from query_jsx","Encode namespaces as member expressions (`ns.tag`) rather than JSXNamespacedName when replacing identifiers that may appear in `<Foo.Bar />`"],"tags":["jsx","utils","ref-rewriting","extension-point"],"backgroundTag":null,"analyzedSha":"d7d74346665e36e692aa07e13d4ee3ee692ee35c","analyzedAt":"2026-08-16T12:41:13.160Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}