The JIT that runs makepad apps from source: lexer, front end, type checker, lazy borrow checker (Gandalf; `--check-first` opts in), codegen, session and warm/cold caches keyed by compiler stamp, provided crates bound late, startup images, live patching. User-facing name is `makepad run` (binary `makepad`, MAKEPAD_RUN_* env, ~/.makepad-run); libs/relax stays the internal library name. `makepad check` reports rustc-style diagnostics with rustc error codes and checks a whole workspace (`--workspace`). Runs on macOS, Linux, Windows and Android. makepad-remote: one tool schema for apps and the WM (app/1): grabs, captures, traces, frame profiles and tweaks. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
52 lines
2.3 KiB
Rust
52 lines
2.3 KiB
Rust
// rustc --edition=2021 --test lazy_reexport.rs
|
|
// makepad test lazy_reexport.rs
|
|
// lazy_reload_tests::deferred_reexport_signatures also loads this fixture with
|
|
// child.rs and other.rs forcibly deferred, exercising the signature retry loop.
|
|
|
|
#[path = "lazy_reexport/child.rs"]
|
|
mod child;
|
|
#[path = "lazy_reexport/other.rs"]
|
|
mod other;
|
|
use child::T;
|
|
|
|
mod fallback {
|
|
#[allow(non_snake_case)]
|
|
pub fn T() -> u32 { 7 }
|
|
}
|
|
|
|
struct Holder {
|
|
value: T,
|
|
}
|
|
|
|
#[test]
|
|
fn child_reexport_resolves_type_and_value_independently() {
|
|
let holder = Holder { value: T { value: 42 } };
|
|
assert_eq!(holder.value.value, 42);
|
|
assert_eq!(T(), 7);
|
|
}
|
|
|
|
// `makepad test` itself loads single-file inputs eagerly. Exercise its lazy
|
|
// package driver in a fresh process; rustc checks the same Rust semantics above.
|
|
#[cfg(relax)]
|
|
#[test]
|
|
fn lazy_package_check_retries_the_type_namespace() {
|
|
let dir = std::env::temp_dir().join(format!("relax-lazy-reexport-{}", std::process::id()));
|
|
std::fs::create_dir_all(dir.join("lazy_reexport")).unwrap();
|
|
std::fs::write(dir.join("Cargo.toml"), "[package]\nname=\"lazy_reexport\"\nversion=\"0.1.0\"\nedition=\"2021\"\n[[bin]]\nname=\"lazy_reexport\"\npath=\"main.rs\"\n").unwrap();
|
|
let source = include_str!("lazy_reexport.rs").to_string()
|
|
+ "\nfn main() { let h = Holder { value: T { value: 42 } }; assert_eq!(h.value.value, 42); assert_eq!(T(), 7); }\n";
|
|
std::fs::write(dir.join("main.rs"), source).unwrap();
|
|
std::fs::write(dir.join("lazy_reexport/child.rs"), include_str!("lazy_reexport/child.rs")).unwrap();
|
|
std::fs::write(dir.join("lazy_reexport/other.rs"), include_str!("lazy_reexport/other.rs")).unwrap();
|
|
let output = std::process::Command::new(std::env::current_exe().unwrap())
|
|
.args(["check", "lazy_reexport"])
|
|
.current_dir(&dir)
|
|
.env("MAKEPAD_RUN_LAZY_DEFER", "lazy_reexport/child.rs,lazy_reexport/other.rs")
|
|
.env("MAKEPAD_RUN_DEFERRED_TRACE", "1")
|
|
.output().unwrap();
|
|
std::fs::remove_dir_all(dir).unwrap();
|
|
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
let stderr = String::from_utf8_lossy(&output.stderr);
|
|
assert!(output.status.success(), "{stdout}\n{stderr}");
|
|
assert!(stderr.contains("signatures name types in"), "lazy signature recovery was not exercised: {stderr}");
|
|
}
|