parent
a07c9a20b7
commit
203d22762d
|
@ -11,8 +11,9 @@
|
||||||
use rustc::hir::def_id::{CrateNum, DefId, DefIndex};
|
use rustc::hir::def_id::{CrateNum, DefId, DefIndex};
|
||||||
use rustc::hir::map::Map;
|
use rustc::hir::map::Map;
|
||||||
use rustc::ty::TyCtxt;
|
use rustc::ty::TyCtxt;
|
||||||
use syntax::ast::{self, LitKind, NodeId, StrStyle};
|
use syntax::ast::{self, NodeId};
|
||||||
use syntax::codemap::CodeMap;
|
use syntax::codemap::CodeMap;
|
||||||
|
use syntax::print::pprust;
|
||||||
use syntax_pos::Span;
|
use syntax_pos::Span;
|
||||||
|
|
||||||
use data::{self, Visibility, SigElement};
|
use data::{self, Visibility, SigElement};
|
||||||
|
@ -67,16 +68,22 @@ impl SpanData {
|
||||||
/// Represent an arbitrary attribute on a code element
|
/// Represent an arbitrary attribute on a code element
|
||||||
#[derive(Clone, Debug, RustcEncodable)]
|
#[derive(Clone, Debug, RustcEncodable)]
|
||||||
pub struct Attribute {
|
pub struct Attribute {
|
||||||
value: AttributeItem,
|
value: String,
|
||||||
span: SpanData,
|
span: SpanData,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Lower for ast::Attribute {
|
impl Lower for ast::Attribute {
|
||||||
type Target = Attribute;
|
type Target = Attribute;
|
||||||
|
|
||||||
fn lower(self, tcx: TyCtxt) -> Attribute {
|
fn lower(mut self, tcx: TyCtxt) -> Attribute {
|
||||||
|
// strip #[] and #![] from the original attributes
|
||||||
|
self.style = ast::AttrStyle::Outer;
|
||||||
|
let value = pprust::attribute_to_string(&self);
|
||||||
|
// #[] are all ASCII which makes this slice save
|
||||||
|
let value = value[2..value.len()-1].to_string();
|
||||||
|
|
||||||
Attribute {
|
Attribute {
|
||||||
value: self.value.lower(tcx),
|
value: value,
|
||||||
span: SpanData::from_span(self.span, tcx.sess.codemap()),
|
span: SpanData::from_span(self.span, tcx.sess.codemap()),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -90,76 +97,6 @@ impl Lower for Vec<ast::Attribute> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A single item as part of an attribute
|
|
||||||
#[derive(Clone, Debug, RustcEncodable)]
|
|
||||||
pub struct AttributeItem {
|
|
||||||
name: LitKind,
|
|
||||||
kind: AttributeItemKind,
|
|
||||||
span: SpanData,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Lower for ast::MetaItem {
|
|
||||||
type Target = AttributeItem;
|
|
||||||
|
|
||||||
fn lower(self, tcx: TyCtxt) -> AttributeItem {
|
|
||||||
AttributeItem {
|
|
||||||
name: LitKind::Str(self.name, StrStyle::Cooked),
|
|
||||||
kind: self.node.lower(tcx),
|
|
||||||
span: SpanData::from_span(self.span, tcx.sess.codemap()),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Lower for ast::NestedMetaItem {
|
|
||||||
type Target = AttributeItem;
|
|
||||||
|
|
||||||
fn lower(self, tcx: TyCtxt) -> AttributeItem {
|
|
||||||
match self.node {
|
|
||||||
ast::NestedMetaItemKind::MetaItem(item) => item.lower(tcx),
|
|
||||||
ast::NestedMetaItemKind::Literal(lit) => {
|
|
||||||
AttributeItem {
|
|
||||||
name: lit.node,
|
|
||||||
kind: AttributeItemKind::Literal,
|
|
||||||
span: SpanData::from_span(lit.span, tcx.sess.codemap()),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone, Debug, RustcEncodable)]
|
|
||||||
pub enum AttributeItemKind {
|
|
||||||
/// Word meta item.
|
|
||||||
///
|
|
||||||
/// E.g. `test` as in `#[test]`
|
|
||||||
Literal,
|
|
||||||
/// Name value meta item.
|
|
||||||
///
|
|
||||||
/// E.g. `feature = "foo"` as in `#[feature = "foo"]`
|
|
||||||
NameValue(LitKind, SpanData),
|
|
||||||
/// List meta item.
|
|
||||||
///
|
|
||||||
/// E.g. the `derive(..)` as in `#[derive(..)]`
|
|
||||||
List(Vec<AttributeItem>),
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Lower for ast::MetaItemKind {
|
|
||||||
type Target = AttributeItemKind;
|
|
||||||
|
|
||||||
fn lower(self, tcx: TyCtxt) -> AttributeItemKind {
|
|
||||||
match self {
|
|
||||||
ast::MetaItemKind::Word => AttributeItemKind::Literal,
|
|
||||||
ast::MetaItemKind::List(items) => {
|
|
||||||
AttributeItemKind::List(items.into_iter().map(|x| x.lower(tcx)).collect())
|
|
||||||
}
|
|
||||||
ast::MetaItemKind::NameValue(lit) => {
|
|
||||||
let span = SpanData::from_span(lit.span, tcx.sess.codemap());
|
|
||||||
AttributeItemKind::NameValue(lit.node, span)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, RustcEncodable)]
|
#[derive(Debug, RustcEncodable)]
|
||||||
pub struct CratePreludeData {
|
pub struct CratePreludeData {
|
||||||
pub crate_name: String,
|
pub crate_name: String,
|
||||||
|
|
Loading…
Reference in New Issue