compiler plugin -> proc macro

This commit is contained in:
Jorge Aparicio 2017-07-11 23:44:54 -05:00
parent 8485a24d36
commit 59afbf02aa
5 changed files with 12 additions and 46 deletions

View file

@ -1,64 +1,26 @@
#![deny(warnings)]
#![feature(plugin_registrar)]
#![feature(proc_macro_internals)]
#![feature(rustc_private)]
#![feature(proc_macro)]
#![recursion_limit = "128"]
extern crate proc_macro;
#[macro_use]
extern crate quote;
extern crate rustc_errors;
extern crate rustc_plugin;
extern crate syn;
extern crate syntax as rustc_syntax;
use proc_macro::TokenStream;
use rustc_errors::Handler;
use rustc_errors::emitter::ColorConfig;
use rustc_plugin::Registry;
use rustc_syntax::codemap::{CodeMap, FilePathMapping};
use rustc_syntax::ext::base::SyntaxExtension;
use rustc_syntax::parse::ParseSess;
use rustc_syntax::symbol::Symbol;
use rustc_syntax::tokenstream::TokenStream as TokenStream_;
use std::rc::Rc;
use std::str::FromStr;
mod check;
mod syntax;
mod trans;
mod util;
fn expand_rtfm(ts: TokenStream_) -> TokenStream_ {
use proc_macro::TokenStream;
#[proc_macro]
pub fn rtfm(ts: TokenStream) -> TokenStream {
let input = format!("{}", ts);
let app = syntax::parse::app(&input);
let ceilings = util::compute_ceilings(&app);
check::resources(&app.resources, &ceilings);
let output = format!("{}", trans::app(&app, &ceilings));
let mapping = FilePathMapping::empty();
let codemap = Rc::new(CodeMap::new(mapping));
let tty_handler = Handler::with_tty_emitter(
ColorConfig::Auto,
true,
false,
Some(codemap.clone()),
);
let sess = ParseSess::with_span_handler(tty_handler, codemap.clone());
proc_macro::__internal::set_parse_sess(&sess, || {
let ts = TokenStream::from_str(&output).unwrap();
proc_macro::__internal::token_stream_inner(ts)
})
}
#[plugin_registrar]
pub fn plugin_registrar(reg: &mut Registry) {
reg.register_syntax_extension(
Symbol::intern("rtfm"),
SyntaxExtension::ProcMacro(Box::new(expand_rtfm)),
);
format!("{}", trans::app(&app, &ceilings)).parse().unwrap()
}