mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-01 11:31:15 +00:00
Don't stringify cfg_attr
-gated attributes
This preserves the assigned `TokenId`s
This commit is contained in:
parent
1d6eef1350
commit
99d40e7a3a
@ -106,7 +106,9 @@ impl RawAttrs {
|
|||||||
) -> Self {
|
) -> Self {
|
||||||
let entries = collect_attrs(owner)
|
let entries = collect_attrs(owner)
|
||||||
.flat_map(|(id, attr)| match attr {
|
.flat_map(|(id, attr)| match attr {
|
||||||
Either::Left(attr) => Attr::from_src(db, attr, hygiene, id),
|
Either::Left(attr) => {
|
||||||
|
attr.meta().and_then(|meta| Attr::from_src(db, meta, hygiene, id))
|
||||||
|
}
|
||||||
Either::Right(comment) => comment.doc_comment().map(|doc| Attr {
|
Either::Right(comment) => comment.doc_comment().map(|doc| Attr {
|
||||||
id,
|
id,
|
||||||
input: Some(Interned::new(AttrInput::Literal(SmolStr::new(doc)))),
|
input: Some(Interned::new(AttrInput::Literal(SmolStr::new(doc)))),
|
||||||
@ -172,10 +174,9 @@ impl RawAttrs {
|
|||||||
let index = attr.id;
|
let index = attr.id;
|
||||||
let attrs = parts.filter(|a| !a.is_empty()).filter_map(|attr| {
|
let attrs = parts.filter(|a| !a.is_empty()).filter_map(|attr| {
|
||||||
let tree = Subtree { delimiter: None, token_trees: attr.to_vec() };
|
let tree = Subtree { delimiter: None, token_trees: attr.to_vec() };
|
||||||
let attr = ast::Attr::parse(&format!("#[{}]", tree)).ok()?;
|
|
||||||
// FIXME hygiene
|
// FIXME hygiene
|
||||||
let hygiene = Hygiene::new_unhygienic();
|
let hygiene = Hygiene::new_unhygienic();
|
||||||
Attr::from_src(db, attr, &hygiene, index)
|
Attr::from_tt(db, &tree, &hygiene, index)
|
||||||
});
|
});
|
||||||
|
|
||||||
let cfg_options = &crate_graph[krate].cfg_options;
|
let cfg_options = &crate_graph[krate].cfg_options;
|
||||||
@ -664,7 +665,7 @@ impl fmt::Display for AttrInput {
|
|||||||
impl Attr {
|
impl Attr {
|
||||||
fn from_src(
|
fn from_src(
|
||||||
db: &dyn DefDatabase,
|
db: &dyn DefDatabase,
|
||||||
ast: ast::Attr,
|
ast: ast::Meta,
|
||||||
hygiene: &Hygiene,
|
hygiene: &Hygiene,
|
||||||
id: AttrId,
|
id: AttrId,
|
||||||
) -> Option<Attr> {
|
) -> Option<Attr> {
|
||||||
@ -683,6 +684,19 @@ impl Attr {
|
|||||||
Some(Attr { id, path, input })
|
Some(Attr { id, path, input })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn from_tt(
|
||||||
|
db: &dyn DefDatabase,
|
||||||
|
tt: &tt::Subtree,
|
||||||
|
hygiene: &Hygiene,
|
||||||
|
id: AttrId,
|
||||||
|
) -> Option<Attr> {
|
||||||
|
let (parse, _) =
|
||||||
|
mbe::token_tree_to_syntax_node(tt, hir_expand::FragmentKind::MetaItem).ok()?;
|
||||||
|
let ast = ast::Meta::cast(parse.syntax_node())?;
|
||||||
|
|
||||||
|
Self::from_src(db, ast, hygiene, id)
|
||||||
|
}
|
||||||
|
|
||||||
/// Parses this attribute as a `#[derive]`, returns an iterator that yields all contained paths
|
/// Parses this attribute as a `#[derive]`, returns an iterator that yields all contained paths
|
||||||
/// to derive macros.
|
/// to derive macros.
|
||||||
///
|
///
|
||||||
|
Loading…
x
Reference in New Issue
Block a user