1
Fork 0

Implement CompilerDesugaringKind enum

This commit is contained in:
Hunter Praska 2017-08-12 19:43:43 -05:00
parent 045ca8b43b
commit 4acfef8f63
No known key found for this signature in database
GPG key ID: 3C9EB5EA0CBC4417
3 changed files with 49 additions and 5 deletions

View file

@ -397,11 +397,12 @@ impl<'a> LoweringContext<'a> {
}
fn allow_internal_unstable(&self, reason: &'static str, mut span: Span) -> Span {
let reason = codemap::CompilerDesugaringKind::from(reason);
let mark = Mark::fresh(Mark::root());
mark.set_expn_info(codemap::ExpnInfo {
call_site: span,
callee: codemap::NameAndSpan {
format: codemap::CompilerDesugaring(Symbol::intern(reason)),
format: codemap::CompilerDesugaring(reason),
span: Some(span),
allow_internal_unstable: true,
allow_internal_unsafe: false,

View file

@ -323,8 +323,8 @@ impl NameAndSpan {
pub fn name(&self) -> Symbol {
match self.format {
ExpnFormat::MacroAttribute(s) |
ExpnFormat::MacroBang(s) |
ExpnFormat::CompilerDesugaring(s) => s,
ExpnFormat::MacroBang(s) => s,
ExpnFormat::CompilerDesugaring(ref kind) => kind.as_symbol(),
}
}
}
@ -337,7 +337,39 @@ pub enum ExpnFormat {
/// e.g. `format!()`
MacroBang(Symbol),
/// Desugaring done by the compiler during HIR lowering.
CompilerDesugaring(Symbol)
CompilerDesugaring(CompilerDesugaringKind)
}
/// The kind of compiler desugaring.
#[derive(Clone, Hash, Debug, PartialEq, Eq)]
pub enum CompilerDesugaringKind {
BackArrow,
DotFill,
QuestionMark,
}
impl CompilerDesugaringKind {
pub fn as_symbol(&self) -> Symbol {
use CompilerDesugaringKind::*;
let s = match *self {
BackArrow => "<-",
DotFill => "...",
QuestionMark => "?",
};
Symbol::intern(s)
}
}
impl<'a> From<&'a str> for CompilerDesugaringKind {
fn from(s: &'a str) -> Self {
use CompilerDesugaringKind::*;
match s {
"<-" => BackArrow,
"..." => DotFill,
"?" => QuestionMark,
_ => panic!("Invalid compiler desugaring"),
}
}
}
impl Encodable for SyntaxContext {

View file

@ -47,7 +47,7 @@ extern crate serialize;
extern crate serialize as rustc_serialize; // used by deriving
pub mod hygiene;
pub use hygiene::{SyntaxContext, ExpnInfo, ExpnFormat, NameAndSpan};
pub use hygiene::{SyntaxContext, ExpnInfo, ExpnFormat, NameAndSpan, CompilerDesugaringKind};
pub mod symbol;
@ -153,6 +153,17 @@ impl Span {
}
}
/// Check if this span arises from a compiler desugaring of kind `kind`.
pub fn is_compiler_desugaring(&self, kind: CompilerDesugaringKind) -> bool {
match self.ctxt.outer().expn_info() {
Some(info) => match info.callee.format {
ExpnFormat::CompilerDesugaring(k) => k == kind,
_ => false,
},
None => false,
}
}
/// Check if a span is "internal" to a macro in which `unsafe`
/// can be used without triggering the `unsafe_code` lint
// (that is, a macro marked with `#[allow_internal_unsafe]`).