Skip to content

[Bug]: HMR panics when importing same file via barrel export and directly (from two separate dynamic imports) #5259

@RomanHotsiy

Description

@RomanHotsiy

Reproduction link or steps

‼️Important: it is NOT related to treeshake: true, this reproduces with disabled tree-shaking.

Rolldown REPL link: https://repl.rolldown.rs/#eNqdkj1uwzAMha9CaHFSBM7uokuHHqCzFzWmGrUyFeinDWD47qUsK7GDDEUWw3y0Hr9HaxBKNIPQ1OG5/vLpnURzrXfiwOXBkg/gbAzo4QWGlgCUtQ3o/mRd2FT1nkv+vtruUu9DumWPy6nX0siGKJrgIo474awxnf2lmv2V/lzMv9NZkmS1kOD5hE73SEGaJksAx54R0pwJaJyewSH6o/zGBpQ0HpmnpZb4PINCh0pGU8wF8+VMhWmuMkcOBwN76h5GUM72wFFj0Mbvy/qq5zv+KtIhaEubbWZ1GKKjyWhTvacdw5u11ZbPjokib69QzNV/KDyrlHb3KMardDPG8q+tIxauGzXzzSOfLmBXpJTsBnNtdZVXXgU7g/o1vK8ndWJeRL6ciRQ9djeJq6ymJfG+GeuHpxnJVz2I8Q/Wdg9y

rolldown.config.js

export default {
  experimental: {
    hmr: true
  },
  treeshake: false // fails regardless if true or false ❗
};

index.js

const routes = {
  foo: import('./foo.js'),
  bar: import('./bar.js')
}

foo.js

import { trim } from './utils/index.js'; // import via barrel

export default function() {
  return trim('Route Foo');
}

bar.js

import { trim } from './utils/string.js'; // import directly

export default function() {
  return trim('Route Bar');
}

utils/index.js

export * from './string.js'

utils/string.js

export function trim(s) {
  return s.trim();
}

export function unused() {
  return 'unused';
}

What is expected?

Should produce output

What is actually happening?

Crashes with

thread '<unnamed>' panicked at crates/rolldown_common/src/types/symbol_ref_db.rs:216:7:
canonical name not found for SymbolRef { owner: 4, symbol: SymbolId(2) }, original_name: "unused"
stack backtrace:
   0: __rustc::rust_begin_unwind
   1: core::panicking::panic_fmt
   2: rolldown_common::types::symbol_ref_db::SymbolRefDb::canonical_name_for::{{closure}}
             at ./crates/rolldown_common/src/types/symbol_ref_db.rs:216:7
   3: core::option::Option<T>::unwrap_or_else
             at /private/tmp/rust-20250628-8015-2pvnvd/rustc-1.88.0-src/library/core/src/option.rs:1048:21
Full stacktrace
thread '<unnamed>' panicked at crates/rolldown_common/src/types/symbol_ref_db.rs:216:7:
canonical name not found for SymbolRef { owner: 4, symbol: SymbolId(2) }, original_name: "unused"
stack backtrace:
   0: __rustc::rust_begin_unwind
   1: core::panicking::panic_fmt
   2: rolldown_common::types::symbol_ref_db::SymbolRefDb::canonical_name_for::{{closure}}
             at ./crates/rolldown_common/src/types/symbol_ref_db.rs:216:7
   3: core::option::Option<T>::unwrap_or_else
             at /private/tmp/rust-20250628-8015-2pvnvd/rustc-1.88.0-src/library/core/src/option.rs:1048:21
   4: rolldown_common::types::symbol_ref_db::SymbolRefDb::canonical_name_for
             at ./crates/rolldown_common/src/types/symbol_ref_db.rs:215:5
   5: rolldown::module_finalizers::ScopeHoistingFinalizer::canonical_name_for
             at ./crates/rolldown/src/module_finalizers/mod.rs:53:5
   6: rolldown::module_finalizers::ScopeHoistingFinalizer::finalized_expr_for_symbol_ref
             at ./crates/rolldown/src/module_finalizers/mod.rs:235:39
   7: rolldown::module_finalizers::ScopeHoistingFinalizer::generate_declaration_of_module_namespace_object::{{closure}}
             at ./crates/rolldown/src/module_finalizers/mod.rs:396:22
   8: core::iter::traits::iterator::Iterator::for_each::call::{{closure}}
             at /private/tmp/rust-20250628-8015-2pvnvd/rustc-1.88.0-src/library/core/src/iter/traits/iterator.rs:798:29
   9: core::iter::adapters::filter_map::filter_map_fold::{{closure}}
             at /private/tmp/rust-20250628-8015-2pvnvd/rustc-1.88.0-src/library/core/src/iter/adapters/filter_map.rs:40:20
  10: core::iter::traits::iterator::Iterator::fold
             at /private/tmp/rust-20250628-8015-2pvnvd/rustc-1.88.0-src/library/core/src/iter/traits/iterator.rs:2576:21
  11: <core::iter::adapters::filter_map::FilterMap<I,F> as core::iter::traits::iterator::Iterator>::fold
             at /private/tmp/rust-20250628-8015-2pvnvd/rustc-1.88.0-src/library/core/src/iter/adapters/filter_map.rs:146:9
  12: core::iter::traits::iterator::Iterator::for_each
             at /private/tmp/rust-20250628-8015-2pvnvd/rustc-1.88.0-src/library/core/src/iter/traits/iterator.rs:801:9
  13: rolldown::module_finalizers::ScopeHoistingFinalizer::generate_declaration_of_module_namespace_object
             at ./crates/rolldown/src/module_finalizers/mod.rs:388:5
  14: rolldown::module_finalizers::impl_visit_mut::<impl oxc_ast_visit::generated::visit_mut::VisitMut for rolldown::module_finalizers::ScopeHoistingFinalizer>::visit_program
             at ./crates/rolldown/src/module_finalizers/impl_visit_mut.rs:54:7
  15: rolldown::utils::finalize_normal_module::{{closure}}
             at ./crates/rolldown/src/utils/mod.rs:44:5
  16: rolldown_ecmascript::ecma_ast::program_cell::ProgramCell::with_mut::{{closure}}
             at ./crates/rolldown_ecmascript/src/ecma_ast/program_cell.rs:43:9
  17: rolldown_ecmascript::ecma_ast::program_cell::ProgramCell::with_dependent_mut
             at /Users/romanhotsiy/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/self_cell-1.2.0/src/lib.rs:384:13
  18: rolldown_ecmascript::ecma_ast::program_cell::ProgramCell::with_mut
             at ./crates/rolldown_ecmascript/src/ecma_ast/program_cell.rs:41:5
  19: rolldown::utils::finalize_normal_module
             at ./crates/rolldown/src/utils/mod.rs:34:3
  20: rolldown::stages::generate_stage::GenerateStage::generate::{{closure}}::{{closure}}::{{closure}}
             at ./crates/rolldown/src/stages/generate_stage/mod.rs:128:9
  21: <rayon::iter::for_each::ForEachConsumer<F> as rayon::iter::plumbing::Folder<T>>::consume
             at /Users/romanhotsiy/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rayon-1.10.0/src/iter/for_each.rs:47:9
  22: <rayon::iter::filter::FilterFolder<C,P> as rayon::iter::plumbing::Folder<T>>::consume
             at /Users/romanhotsiy/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rayon-1.10.0/src/iter/filter.rs:123:24
  23: rayon::iter::plumbing::Folder::consume_iter
             at /Users/romanhotsiy/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rayon-1.10.0/src/iter/plumbing/mod.rs:178:20
  24: rayon::iter::plumbing::Producer::fold_with
             at /Users/romanhotsiy/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rayon-1.10.0/src/iter/plumbing/mod.rs:109:9
  25: rayon::iter::plumbing::bridge_producer_consumer::helper
             at /Users/romanhotsiy/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rayon-1.10.0/src/iter/plumbing/mod.rs:437:13
  26: rayon::iter::plumbing::bridge_producer_consumer::helper::{{closure}}
             at /Users/romanhotsiy/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rayon-1.10.0/src/iter/plumbing/mod.rs:417:21
  27: rayon_core::join::join_context::call_a::{{closure}}
             at /Users/romanhotsiy/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rayon-core-1.12.1/src/join/mod.rs:124:17
  28: <core::panic::unwind_safe::AssertUnwindSafe<F> as core::ops::function::FnOnce<()>>::call_once
             at /private/tmp/rust-20250628-8015-2pvnvd/rustc-1.88.0-src/library/core/src/panic/unwind_safe.rs:272:9
  29: std::panicking::try::do_call
             at /private/tmp/rust-20250628-8015-2pvnvd/rustc-1.88.0-src/library/std/src/panicking.rs:589:40
  30: ___rust_try
  31: std::panicking::try
             at /private/tmp/rust-20250628-8015-2pvnvd/rustc-1.88.0-src/library/std/src/panicking.rs:552:19
  32: std::panic::catch_unwind
             at /private/tmp/rust-20250628-8015-2pvnvd/rustc-1.88.0-src/library/std/src/panic.rs:359:14
  33: rayon_core::unwind::halt_unwinding
             at /Users/romanhotsiy/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rayon-core-1.12.1/src/unwind.rs:17:5
  34: rayon_core::join::join_context::{{closure}}
             at /Users/romanhotsiy/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rayon-core-1.12.1/src/join/mod.rs:142:24
  35: rayon_core::registry::in_worker
             at /Users/romanhotsiy/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rayon-core-1.12.1/src/registry.rs:951:13
  36: rayon_core::join::join_context
             at /Users/romanhotsiy/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rayon-core-1.12.1/src/join/mod.rs:132:5
  37: rayon::iter::plumbing::bridge_producer_consumer::helper
             at /Users/romanhotsiy/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rayon-1.10.0/src/iter/plumbing/mod.rs:415:47
  38: rayon::iter::plumbing::bridge_producer_consumer::helper::{{closure}}
             at /Users/romanhotsiy/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rayon-1.10.0/src/iter/plumbing/mod.rs:426:21
  39: rayon_core::join::join_context::call_b::{{closure}}
             at /Users/romanhotsiy/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rayon-core-1.12.1/src/join/mod.rs:129:25
  40: rayon_core::job::JobResult<T>::call::{{closure}}
             at /Users/romanhotsiy/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rayon-core-1.12.1/src/job.rs:218:41
  41: <core::panic::unwind_safe::AssertUnwindSafe<F> as core::ops::function::FnOnce<()>>::call_once
             at /private/tmp/rust-20250628-8015-2pvnvd/rustc-1.88.0-src/library/core/src/panic/unwind_safe.rs:272:9
  42: std::panicking::try::do_call
             at /private/tmp/rust-20250628-8015-2pvnvd/rustc-1.88.0-src/library/std/src/panicking.rs:589:40
  43: ___rust_try
  44: std::panicking::try
             at /private/tmp/rust-20250628-8015-2pvnvd/rustc-1.88.0-src/library/std/src/panicking.rs:552:19
  45: std::panic::catch_unwind
             at /private/tmp/rust-20250628-8015-2pvnvd/rustc-1.88.0-src/library/std/src/panic.rs:359:14
  46: rayon_core::unwind::halt_unwinding
             at /Users/romanhotsiy/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rayon-core-1.12.1/src/unwind.rs:17:5
  47: rayon_core::job::JobResult<T>::call
             at /Users/romanhotsiy/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rayon-core-1.12.1/src/job.rs:218:15
  48: <rayon_core::job::StackJob<L,F,R> as rayon_core::job::Job>::execute
             at /Users/romanhotsiy/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rayon-core-1.12.1/src/job.rs:120:32
  49: rayon_core::job::JobRef::execute
             at /Users/romanhotsiy/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rayon-core-1.12.1/src/job.rs:64:9
  50: rayon_core::registry::WorkerThread::execute
             at /Users/romanhotsiy/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rayon-core-1.12.1/src/registry.rs:860:9
  51: rayon_core::registry::WorkerThread::wait_until_cold
             at /Users/romanhotsiy/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rayon-core-1.12.1/src/registry.rs:794:21
  52: rayon_core::registry::WorkerThread::wait_until
             at /Users/romanhotsiy/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rayon-core-1.12.1/src/registry.rs:769:13
  53: rayon_core::registry::WorkerThread::wait_until_out_of_work
             at /Users/romanhotsiy/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rayon-core-1.12.1/src/registry.rs:818:9
  54: rayon_core::registry::main_loop
             at /Users/romanhotsiy/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rayon-core-1.12.1/src/registry.rs:923:5
  55: rayon_core::registry::ThreadBuilder::run
             at /Users/romanhotsiy/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rayon-core-1.12.1/src/registry.rs:53:18
  56: <rayon_core::registry::DefaultSpawn as rayon_core::registry::ThreadSpawn>::spawn::{{closure}}
             at /Users/romanhotsiy/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rayon-core-1.12.1/src/registry.rs:98:20
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
node:internal/process/promises:394
    triggerUncaughtException(err, true /* fromPromise */);
    ^

[Error: Panic in async function] { code: 'GenericFailure' }

System Info

System:
    OS: macOS 15.5
    CPU: (8) arm64 Apple M1 Pro
    Memory: 124.58 MB / 16.00 GB
    Shell: 5.9 - /bin/zsh
  Binaries:
    Node: 22.17.0 - ~/.asdf/cache/installs/nodejs/22.17.0/bin/node
    npm: 10.9.2 - ~/.asdf/cache/plugins/nodejs/shims/npm
    pnpm: 10.10.0 - ~/.asdf/cache/shims/pnpm
    bun: 1.1.36 - ~/.bun/bin/bun
  Browsers:
    Chrome: 138.0.7204.94
    Safari: 18.5

Any additional comments?

Probably related to #5235 but this time it has nothing to do with treeshake as I explicitly disabled treeshake.

My fix for #5235 in #5237 is not fixing this one.

As @hyf0 mentioned in my PR:

HMR is an experitmental and incomplete core feature. The current focus is to make it work in rolldown-vite...
HMR doesn't work with treeshaking is expected so far.

But it repdoduces without treeshaking so it may technically be reproducible with Vite.

Metadata

Metadata

Assignees

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions