Test whether it is bang macro properly

This commit is contained in:
Edwin Cheng 2020-05-02 10:16:26 +08:00
parent 291d03949b
commit edf0b4c152
2 changed files with 10 additions and 8 deletions

View file

@ -9,10 +9,7 @@ use hir_expand::{
hygiene::Hygiene, hygiene::Hygiene,
name::{name, AsName}, name::{name, AsName},
}; };
use ra_syntax::{ use ra_syntax::ast::{self, AstNode, TypeAscriptionOwner, TypeBoundsOwner};
ast::{self, AstNode, TypeAscriptionOwner, TypeBoundsOwner},
T,
};
use super::AssociatedTypeBinding; use super::AssociatedTypeBinding;
use crate::{ use crate::{
@ -122,13 +119,14 @@ pub(super) fn lower_path(mut path: ast::Path, hygiene: &Hygiene) -> Option<Path>
// https://github.com/rust-lang/rust/blob/614f273e9388ddd7804d5cbc80b8865068a3744e/src/librustc_resolve/macros.rs#L456 // https://github.com/rust-lang/rust/blob/614f273e9388ddd7804d5cbc80b8865068a3744e/src/librustc_resolve/macros.rs#L456
// We follow what it did anyway :) // We follow what it did anyway :)
if segments.len() == 1 && kind == PathKind::Plain { if segments.len() == 1 && kind == PathKind::Plain {
let next = path.syntax().last_token().and_then(|it| it.next_token()); if let Some(macro_call) = path.syntax().parent().and_then(ast::MacroCall::cast) {
if next.map_or(false, |it| it.kind() == T![!]) { if macro_call.is_bang() {
if let Some(crate_id) = hygiene.local_inner_macros() { if let Some(crate_id) = hygiene.local_inner_macros() {
kind = PathKind::DollarCrate(crate_id); kind = PathKind::DollarCrate(crate_id);
} }
} }
} }
}
let mod_path = ModPath { kind, segments }; let mod_path = ModPath { kind, segments };
return Some(Path { type_anchor, mod_path, generic_args }); return Some(Path { type_anchor, mod_path, generic_args });

View file

@ -423,6 +423,10 @@ impl ast::MacroCall {
None None
} }
} }
pub fn is_bang(&self) -> bool {
self.is_macro_rules().is_none()
}
} }
impl ast::LifetimeParam { impl ast::LifetimeParam {