build.rs 1.63 KiB
Newer Older

#[cfg(feature = "with-syntex")]
pub mod inner {
	use syntex;
	use codegen;
	use syntax::{ast, fold};
	use std::env;
	use std::path::Path;

	fn strip_attributes(krate: ast::Crate) -> ast::Crate {
		/// Helper folder that strips the serde attributes after the extensions have been expanded.
		struct StripAttributeFolder;

		impl fold::Folder for StripAttributeFolder {
			fn fold_attribute(&mut self, attr: ast::Attribute) -> Option<ast::Attribute> {
				if &*attr.value.name.as_str() == "webapp" {
					return None;
				}

				Some(attr)
			}

			fn fold_mac(&mut self, mac: ast::Mac) -> ast::Mac {
				fold::noop_fold_mac(mac, self)
			}
		}

		fold::Folder::fold_crate(&mut StripAttributeFolder, krate)
	}

	pub fn register(reg: &mut syntex::Registry) {
		reg.add_attr("feature(custom_derive)");
		reg.add_attr("feature(custom_attribute)");

		reg.add_decorator("derive_WebAppFiles", codegen::expand_webapp_implementation);
		reg.add_post_expansion_pass(strip_attributes);
	}

	pub fn generate() {
		let out_dir = env::var_os("OUT_DIR").unwrap();
		let mut registry = syntex::Registry::new();
		register(&mut registry);

		let src = Path::new("src/lib.rs.in");
		let dst = Path::new(&out_dir).join("lib.rs");

		registry.expand("", &src, &dst).unwrap();
	}
}

#[cfg(not(feature = "with-syntex"))]
pub mod inner {
	use codegen;

	pub fn register(reg: &mut rustc_plugin::Registry) {
		reg.register_syntax_extension(
			syntax::parse::token::intern("derive_WebAppFiles"),
			syntax::ext::base::MultiDecorator(
				Box::new(codegen::expand_webapp_implementation)));

		reg.register_attribute("webapp".to_owned(), AttributeType::Normal);
	}

	pub fn generate() {}
}