{"record":{"id":"88a3f23a38e974c0","repo":"swc-project/swc","slug":"spread-should-be-removed-before-applying-generator","errorCode":null,"errorMessage":"spread should be removed before applying generator","messagePattern":"spread should be removed before applying generator","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/swc_ecma_compat_es2015/src/generator.rs","lineNumber":740,"sourceCode":"                            .props\n                            .iter_mut()\n                            .take(num_initial_properties)\n                            .map(|v| v.take())\n                            .collect(),\n                    }\n                    .into(),\n                    None,\n                );\n\n                let mut expressions = node\n                    .props\n                    .iter_mut()\n                    .skip(num_initial_properties)\n                    .map(|v| v.take())\n                    .fold(Vec::<CompiledProp>::new(), |mut props, p| {\n                        match p {\n                            PropOrSpread::Spread(_) => {\n                                unreachable!(\"spread should be removed before applying generator\")\n                            }\n                            PropOrSpread::Prop(p) => match *p {\n                                Prop::Getter(p) => {\n                                    if let Some(CompiledProp::Accessor(g, _)) =\n                                        props.iter_mut().find(|prev| match prev {\n                                            CompiledProp::Accessor(_, Some(s)) => {\n                                                s.key.eq_ignore_span(&p.key)\n                                            }\n                                            _ => false,\n                                        })\n                                    {\n                                        *g = Some(p);\n                                    } else {\n                                        props.push(CompiledProp::Accessor(Some(p), None))\n                                    }\n                                }\n                                Prop::Setter(p) => {\n                                    if let Some(CompiledProp::Accessor(_, s)) =","sourceCodeStart":722,"sourceCodeEnd":758,"githubUrl":"https://github.com/swc-project/swc/blob/5176682b65416c6b5de6b47379ae1588ea3ecb3f/crates/swc_ecma_compat_es2015/src/generator.rs#L722-L758","documentation":"When the es2015 generator pass converts an object literal inside a generator body into a sequence of assignments to a temp object, it asserts that no spread properties remain (PropOrSpread::Spread). Object spread (`{...x}`) is an ES2018 feature that the es2018::object_rest_spread pass is expected to remove (rewriting to Object.assign/_extends) before generator lowering runs.","triggerScenarios":"Running swc_ecma_compat_es2015 generator (or a chain containing it) on code with object-spread properties inside generator functions / async functions, when es2018::object_rest_spread has not executed first — typically a manually ordered pass chain or preset ordering broken by version skew.","commonSituations":"Custom Chain-of-passes drivers targeting ES5 that run the generator pass without the es2018 spread lowering; spack/bundlers embedding swc_core with partial compat pipelines; swc_core downgrades.","solutions":["Insert es2018::object_rest_spread (and the rest of the es2018 block) before es2015::generator in manual chains.","Use preset_env / CompatEnv so ordering is handled for you.","Verify all swc crates resolve to one swc_core version.","If ordering is right, report with a repro of `{...spread}` inside a generator."],"exampleFix":"// before: object spread reaches the generator pass\nlet pass = Chain::new(swc_ecma_compat_es2015::generator());\n// after\nlet pass = Chain::new(\n    swc_ecma_compat_es2018::object_rest_spread(Default::default()),\n    swc_ecma_compat_es2015::generator(),\n);","handlingStrategy":"validation","validationCode":"// Reject object-spread before the generator pass runs\nuse swc_ecma_ast::*; use swc_ecma_visit::{Visit, VisitWith};\nstruct SpreadScan(bool); impl Visit for SpreadScan {\n    fn visit_prop_or_spread(&mut self, p: &PropOrSpread) {\n        self.0 |= matches!(p, PropOrSpread::Spread(_));\n        p.visit_children_with(self);\n    }\n}\n// if SpreadScan scan is true, run es2018 object_rest_spread before generator()","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Order es2018 object_rest_spread before es2015 generator in every chain targeting ES5.","Smoke-test generators containing `{...obj}` literals through your pipeline.","Rely on preset_env ordering rather than manual pass lists."],"tags":["swc","compat-es2015","generator","object-spread","es2018","pass-ordering","panic"],"backgroundTag":"compiler-pass-ordering","analyzedSha":"5176682b65416c6b5de6b47379ae1588ea3ecb3f","analyzedAt":"2026-08-17T16:16:52.067Z","schemaVersion":2},"datasetVersion":"2026-08-23T01:17:44.959Z"}