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;
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() {
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,