Add unstable type_ascribe
macro
This macro serves as a placeholder for future type ascription syntax to make sure that the semantic implementation keeps working.
This commit is contained in:
parent
2a434286a9
commit
6ee0dd97e3
6 changed files with 76 additions and 0 deletions
|
@ -45,6 +45,7 @@ mod log_syntax;
|
||||||
mod source_util;
|
mod source_util;
|
||||||
mod test;
|
mod test;
|
||||||
mod trace_macros;
|
mod trace_macros;
|
||||||
|
mod type_ascribe;
|
||||||
mod util;
|
mod util;
|
||||||
|
|
||||||
pub mod asm;
|
pub mod asm;
|
||||||
|
@ -92,6 +93,7 @@ pub fn register_builtin_macros(resolver: &mut dyn ResolverExpand) {
|
||||||
unreachable: edition_panic::expand_unreachable,
|
unreachable: edition_panic::expand_unreachable,
|
||||||
stringify: source_util::expand_stringify,
|
stringify: source_util::expand_stringify,
|
||||||
trace_macros: trace_macros::expand_trace_macros,
|
trace_macros: trace_macros::expand_trace_macros,
|
||||||
|
type_ascribe: type_ascribe::expand_type_ascribe,
|
||||||
}
|
}
|
||||||
|
|
||||||
register_attr! {
|
register_attr! {
|
||||||
|
|
35
compiler/rustc_builtin_macros/src/type_ascribe.rs
Normal file
35
compiler/rustc_builtin_macros/src/type_ascribe.rs
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
use rustc_ast::ptr::P;
|
||||||
|
use rustc_ast::tokenstream::TokenStream;
|
||||||
|
use rustc_ast::{token, Expr, ExprKind, Ty};
|
||||||
|
use rustc_errors::PResult;
|
||||||
|
use rustc_expand::base::{self, DummyResult, ExtCtxt, MacEager};
|
||||||
|
use rustc_span::Span;
|
||||||
|
|
||||||
|
pub fn expand_type_ascribe(
|
||||||
|
cx: &mut ExtCtxt<'_>,
|
||||||
|
span: Span,
|
||||||
|
tts: TokenStream,
|
||||||
|
) -> Box<dyn base::MacResult + 'static> {
|
||||||
|
let (expr, ty) = match parse_ascribe(cx, tts) {
|
||||||
|
Ok(parsed) => parsed,
|
||||||
|
Err(mut err) => {
|
||||||
|
err.emit();
|
||||||
|
return DummyResult::any(span);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
let asc_expr = cx.expr(span, ExprKind::Type(expr, ty));
|
||||||
|
|
||||||
|
return MacEager::expr(asc_expr);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_ascribe<'a>(cx: &mut ExtCtxt<'a>, stream: TokenStream) -> PResult<'a, (P<Expr>, P<Ty>)> {
|
||||||
|
let mut parser = cx.new_parser_from_tts(stream);
|
||||||
|
|
||||||
|
let expr = parser.parse_expr()?;
|
||||||
|
parser.expect(&token::Comma)?;
|
||||||
|
|
||||||
|
let ty = parser.parse_ty()?;
|
||||||
|
|
||||||
|
Ok((expr, ty))
|
||||||
|
}
|
|
@ -1485,6 +1485,7 @@ symbols! {
|
||||||
ty,
|
ty,
|
||||||
type_alias_enum_variants,
|
type_alias_enum_variants,
|
||||||
type_alias_impl_trait,
|
type_alias_impl_trait,
|
||||||
|
type_ascribe,
|
||||||
type_ascription,
|
type_ascription,
|
||||||
type_changing_struct_update,
|
type_changing_struct_update,
|
||||||
type_id,
|
type_id,
|
||||||
|
|
|
@ -1546,6 +1546,29 @@ pub(crate) mod builtin {
|
||||||
/* compiler built-in */
|
/* compiler built-in */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Unstable placeholder for type ascription.
|
||||||
|
#[rustc_builtin_macro]
|
||||||
|
#[unstable(
|
||||||
|
feature = "type_ascription",
|
||||||
|
issue = "23416",
|
||||||
|
reason = "placeholder syntax for type ascription"
|
||||||
|
)]
|
||||||
|
#[cfg(not(bootstrap))]
|
||||||
|
pub macro type_ascribe($expr:expr, $ty:ty) {
|
||||||
|
/* compiler built-in */
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Unstable placeholder for type ascription.
|
||||||
|
#[unstable(
|
||||||
|
feature = "type_ascription",
|
||||||
|
issue = "23416",
|
||||||
|
reason = "placeholder syntax for type ascription"
|
||||||
|
)]
|
||||||
|
#[cfg(bootstrap)]
|
||||||
|
pub macro type_ascribe($expr:expr, $ty:ty) {
|
||||||
|
$expr: $ty
|
||||||
|
}
|
||||||
|
|
||||||
/// Unstable implementation detail of the `rustc` compiler, do not use.
|
/// Unstable implementation detail of the `rustc` compiler, do not use.
|
||||||
#[rustc_builtin_macro]
|
#[rustc_builtin_macro]
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
|
|
|
@ -98,3 +98,10 @@ pub use crate::macros::builtin::cfg_accessible;
|
||||||
reason = "`cfg_eval` is a recently implemented feature"
|
reason = "`cfg_eval` is a recently implemented feature"
|
||||||
)]
|
)]
|
||||||
pub use crate::macros::builtin::cfg_eval;
|
pub use crate::macros::builtin::cfg_eval;
|
||||||
|
|
||||||
|
#[unstable(
|
||||||
|
feature = "type_ascription",
|
||||||
|
issue = "23416",
|
||||||
|
reason = "placeholder syntax for type ascription"
|
||||||
|
)]
|
||||||
|
pub use crate::macros::builtin::type_ascribe;
|
||||||
|
|
|
@ -85,6 +85,14 @@ pub use core::prelude::v1::cfg_accessible;
|
||||||
)]
|
)]
|
||||||
pub use core::prelude::v1::cfg_eval;
|
pub use core::prelude::v1::cfg_eval;
|
||||||
|
|
||||||
|
// Do not `doc(no_inline)` either.
|
||||||
|
#[unstable(
|
||||||
|
feature = "type_ascription",
|
||||||
|
issue = "23416",
|
||||||
|
reason = "placeholder syntax for type ascription"
|
||||||
|
)]
|
||||||
|
pub use core::prelude::v1::type_ascribe;
|
||||||
|
|
||||||
// The file so far is equivalent to src/libcore/prelude/v1.rs,
|
// The file so far is equivalent to src/libcore/prelude/v1.rs,
|
||||||
// and below to src/liballoc/prelude.rs.
|
// and below to src/liballoc/prelude.rs.
|
||||||
// Those files are duplicated rather than using glob imports
|
// Those files are duplicated rather than using glob imports
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue