]> git.lizzy.rs Git - rust.git/blobdiff - crates/ide/src/expand_macro.rs
Prefer identifier tokens in expand_macro
[rust.git] / crates / ide / src / expand_macro.rs
index cc43c57720c662f0f1b8c4f034c137d14c5a3406..12a091ac47cf4f8faafec5124d982f9864630c65 100644 (file)
@@ -2,7 +2,10 @@
 
 use hir::Semantics;
 use ide_db::RootDatabase;
-use syntax::{ast, ted, AstNode, NodeOrToken, SyntaxKind, SyntaxKind::*, SyntaxNode, WalkEvent, T};
+use syntax::{
+    ast, ted, AstNode, NodeOrToken, SyntaxKind, SyntaxKind::*, SyntaxNode, SyntaxToken,
+    TokenAtOffset, WalkEvent, T,
+};
 
 use crate::FilePosition;
 
@@ -26,7 +29,7 @@ pub(crate) fn expand_macro(db: &RootDatabase, position: FilePosition) -> Option<
     let sema = Semantics::new(db);
     let file = sema.parse(position.file_id);
 
-    let tok = file.syntax().token_at_offset(position.offset).left_biased()?;
+    let tok = pick_best(file.syntax().token_at_offset(position.offset))?;
     let mut expanded = None;
     let mut name = None;
     for node in tok.ancestors() {
@@ -54,6 +57,16 @@ pub(crate) fn expand_macro(db: &RootDatabase, position: FilePosition) -> Option<
     Some(ExpandedMacro { name: name?, expansion })
 }
 
+fn pick_best(tokens: TokenAtOffset<SyntaxToken>) -> Option<SyntaxToken> {
+    return tokens.max_by_key(priority);
+    fn priority(n: &SyntaxToken) -> usize {
+        match n.kind() {
+            IDENT => 1,
+            _ => 0,
+        }
+    }
+}
+
 fn expand_macro_recur(
     sema: &Semantics<RootDatabase>,
     macro_call: &ast::MacroCall,