macro_rules! rust_loc {
() => {{
use std::sync::LazyLock;
use crate::codemap::CodeMap;
use crate::codemap::NativeCodeMap;
use crate::eval::runtime::frame_span::FrameSpan;
use crate::eval::runtime::frozen_file_span::FrozenFileSpan;
static NATIVE_CODEMAP: NativeCodeMap = NativeCodeMap::new(file!(), line!(), column!());
pagable::static_value!(
NATIVE_CODEMAP_STATIC: NativeCodeMap = &NATIVE_CODEMAP,
starlark_syntax::codemap::NativeCodeMapStaticEntry
);
crate::static_starlark_any!(
@no_impl CODEMAP: CodeMap = NativeCodeMap::to_codemap(NATIVE_CODEMAP_STATIC)
);
static FRAME_SPAN: LazyLock<FrameSpan> = LazyLock::new(|| {
FrameSpan::new(FrozenFileSpan::new_unchecked(
CODEMAP.unpack_any(),
NativeCodeMap::FULL_SPAN,
))
});
&*FRAME_SPAN
}};
}
pub(crate) use rust_loc;
#[cfg(test)]
mod tests {
use starlark_derive::starlark_module;
use starlark_syntax::error::StarlarkResultExt;
use crate as starlark;
use crate::assert::Assert;
use crate::environment::GlobalsBuilder;
use crate::eval::Arguments;
use crate::eval::Evaluator;
use crate::values::Value;
#[starlark_module]
fn rust_loc_globals(globals: &mut GlobalsBuilder) {
fn invoke<'v>(f: Value<'v>, eval: &mut Evaluator<'v, '_, '_>) -> anyhow::Result<Value<'v>> {
f.invoke_with_loc(Some(rust_loc!()), &Arguments::default(), eval)
.into_anyhow_result()
}
}
#[test]
fn test_rust_loc() {
let mut a = Assert::new();
a.globals_add(rust_loc_globals);
let err = a.fail("invoke(fail)", "");
let err = err.to_string();
assert!(
err.replace('\\', "/")
.contains("src/eval/runtime/rust_loc.rs"),
"output: {err:?}"
);
assert!(err.contains("<native>"), "output: {err:?}");
}
}