rune/modules/macros/
builtin.rs1use crate as rune;
4use crate::compile::{self, ErrorKind};
5use crate::macros::{quote, MacroContext, TokenStream};
6use crate::{ContextError, Module};
7
8#[rune::module(::std::macros::builtin)]
10pub fn module() -> Result<Module, ContextError> {
11 let mut m = Module::from_meta(self::module__meta)?.with_unique("std::macros::builtin");
12 m.macro_meta(file)?;
13 m.macro_meta(line)?;
14 Ok(m)
15}
16
17#[rune::macro_]
25pub(crate) fn line(
26 cx: &mut MacroContext<'_, '_, '_>,
27 stream: &TokenStream,
28) -> compile::Result<TokenStream> {
29 use crate as rune;
30
31 expect_no_input(stream)?;
32
33 let stream = quote!(
34 #[builtin]
35 line!()
36 );
37
38 Ok(stream.into_token_stream(cx)?)
39}
40
41#[rune::macro_]
49pub(crate) fn file(
50 cx: &mut MacroContext<'_, '_, '_>,
51 stream: &TokenStream,
52) -> compile::Result<TokenStream> {
53 use crate as rune;
54
55 expect_no_input(stream)?;
56
57 let stream = quote!(
58 #[builtin]
59 file!()
60 );
61
62 Ok(stream.into_token_stream(cx)?)
63}
64
65fn expect_no_input(stream: &TokenStream) -> compile::Result<()> {
70 let Some(token) = stream.into_iter().next() else {
71 return Ok(());
72 };
73
74 Err(compile::Error::new(
75 token.span,
76 ErrorKind::ExpectedEof { actual: token.kind },
77 ))
78}