{"record":{"id":"5481bda67d318dd2","repo":"swc-project/swc","slug":"unable-to-access-unknown-nodes-5481bd","errorCode":null,"errorMessage":"unable to access unknown nodes","messagePattern":"unable to access unknown nodes","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/swc_estree_compat/src/babelify/typescript.rs","lineNumber":89,"sourceCode":"#[derive(Debug, Clone, Serialize, Deserialize)]\npub enum TsFnParamOutput {\n    Id(Identifier),\n    Array(ArrayPattern),\n    Rest(RestElement),\n    Object(ObjectPattern),\n}\n\nimpl Babelify for TsFnParam {\n    type Output = TsFnParamOutput;\n\n    fn babelify(self, ctx: &Context) -> Self::Output {\n        match self {\n            TsFnParam::Ident(i) => TsFnParamOutput::Id(i.babelify(ctx)),\n            TsFnParam::Array(a) => TsFnParamOutput::Array(a.babelify(ctx)),\n            TsFnParam::Rest(r) => TsFnParamOutput::Rest(r.babelify(ctx)),\n            TsFnParam::Object(o) => TsFnParamOutput::Object(o.babelify(ctx)),\n            #[cfg(swc_ast_unknown)]\n            _ => panic!(\"unable to access unknown nodes\"),\n        }\n    }\n}\n\nimpl From<TsFnParamOutput> for IdOrRest {\n    fn from(o: TsFnParamOutput) -> Self {\n        match o {\n            TsFnParamOutput::Id(i) => IdOrRest::Id(i),\n            TsFnParamOutput::Rest(r) => IdOrRest::Rest(r),\n            _ => panic!(\"illegal conversion: Cannot convert {:?} to IdOrRest\", &o),\n        }\n    }\n}\n\nimpl From<TsFnParamOutput> for Identifier {\n    fn from(o: TsFnParamOutput) -> Self {\n        match o {\n            TsFnParamOutput::Id(i) => i,","sourceCodeStart":71,"sourceCodeEnd":107,"githubUrl":"https://github.com/swc-project/swc/blob/5176682b65416c6b5de6b47379ae1588ea3ecb3f/crates/swc_estree_compat/src/babelify/typescript.rs#L71-L107","documentation":"babelify maps TS function-parameter kinds (Ident, Array, Rest, Object) to TsFnParamOutput for signatures in interfaces and type literals. The `_` arm is compiled only under the `swc_ast_unknown` cfg and panics on a TsFnParam variant this build of swc_estree_compat does not recognize.","triggerScenarios":"Babelify a TypeScript interface/method signature whose parameter node carries an Unknown/newer TsFnParam variant while built with `--cfg=swc_ast_unknown` — e.g. converting an AST from a newer swc_ecma_ast inside a plugin host.","commonSituations":"Plugin development with the cfg auto-set; version drift between swc_ecma_ast and swc_estree_compat; converting deserialized ASTs across swc versions.","solutions":["Build the babelify path without `--cfg=swc_ast_unknown`","Pin all swc crates to one swc_core release","Cross boundaries via serialization so unknown variants error at decode","Add the missing TsFnParam arm in typescript.rs upstream"],"exampleFix":"# before\nRUSTFLAGS=\"--cfg=swc_ast_unknown\" cargo build\n\n# after\ncargo build","handlingStrategy":"validation","validationCode":"#[cfg(swc_ast_unknown)]\ncompile_error!(\"babelify panics on Unknown TsFnParam nodes; build without --cfg=swc_ast_unknown\");","typeGuard":null,"tryCatchPattern":"use std::panic::{catch_unwind, AssertUnwindSafe};\n\ncatch_unwind(AssertUnwindSafe(|| program.babelify()))\n    .map_err(|p| anyhow!(\"babelify panicked: {:?}\", p))?;","preventionTips":["Build estree hosts without --cfg=swc_ast_unknown","Keep swc_ecma_ast / swc_estree_compat versions aligned","Use serialization for ASTs crossing swc versions","Track TypeScript AST additions in swc releases you adopt"],"tags":["rust","swc","babelify","typescript","function-parameters","cfg-flag","version-mismatch","panic"],"backgroundTag":"unknown-ast-variant-panic","analyzedSha":"5176682b65416c6b5de6b47379ae1588ea3ecb3f","analyzedAt":"2026-08-17T16:16:52.067Z","schemaVersion":2},"datasetVersion":"2026-08-22T14:17:55.899Z"}