macro_rules! rust_loc {
() => {{
use crate::codemap::CodeMap;
use crate::codemap::NativeCodeMap;
use crate::eval::runtime::frame_span::FrameSpan;
use crate::eval::runtime::frozen_file_span::FrozenFileSpan;
use crate::values::FrozenRef;
static NATIVE_CODEMAP: NativeCodeMap = NativeCodeMap::new(file!(), line!(), column!());
static CODEMAP: CodeMap = NATIVE_CODEMAP.to_codemap();
static FROZEN_FILE_SPAN: FrameSpan = FrameSpan::new(FrozenFileSpan::new_unchecked(
FrozenRef::new(&CODEMAP),
NativeCodeMap::FULL_SPAN,
));
static LOC: FrozenRef<'static, FrameSpan> = FrozenRef::new(&FROZEN_FILE_SPAN);
LOC
}};
}
pub(crate) use rust_loc;
#[cfg(test)]
mod tests {
use starlark_derive::starlark_module;
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)
}
}
#[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("starlark/src/eval/runtime/rust_loc.rs"),
"output: {:?}",
err
);
assert!(err.contains("<native>"), "output: {:?}", err);
}
}