use hir::{ItemInNs, MacroDef, ModuleDef, Name, PathResolution, Semantics};
use itertools::Itertools;
use syntax::{
- ast::{self, make, HasLoopBody, Ident},
+ ast::{self, make, HasLoopBody},
AstNode, AstToken, Direction, SyntaxElement, SyntaxKind, SyntaxToken, TokenAtOffset, WalkEvent,
T,
};
pub fn get_path_in_derive_attr(
sema: &hir::Semantics<RootDatabase>,
attr: &ast::Attr,
- cursor: &Ident,
+ cursor: &ast::Ident,
) -> Option<ast::Path> {
let path = attr.path()?;
let tt = attr.token_tree()?;
}
/// Parses the path the identifier is part of inside a token tree.
-pub fn get_path_at_cursor_in_tt(cursor: &Ident) -> Option<ast::Path> {
+pub fn get_path_at_cursor_in_tt(cursor: &ast::Ident) -> Option<ast::Path> {
let cursor = cursor.syntax();
let first = cursor
.siblings_with_tokens(Direction::Prev)
.filter_map(SyntaxElement::into_token)
.take_while(|tok| tok != cursor);
- ast::Path::parse(&path_tokens.chain(iter::once(cursor.clone())).join("")).ok()
+ syntax::hacks::parse_expr_from_str(&path_tokens.chain(iter::once(cursor.clone())).join(""))
+ .and_then(|expr| match expr {
+ ast::Expr::PathExpr(it) => it.path(),
+ _ => None,
+ })
}
/// Parses and resolves the path at the cursor position in the given attribute, if it is a derive.
pub fn try_resolve_derive_input(
sema: &hir::Semantics<RootDatabase>,
attr: &ast::Attr,
- cursor: &Ident,
+ cursor: &ast::Ident,
) -> Option<PathResolution> {
let path = get_path_in_derive_attr(sema, attr, cursor)?;
let scope = sema.scope(attr.syntax());
let paths = input_expressions
.into_iter()
.filter_map(|(is_sep, group)| (!is_sep).then(|| group))
- .filter_map(|mut tokens| ast::Path::parse(&tokens.join("")).ok())
+ .filter_map(|mut tokens| {
+ syntax::hacks::parse_expr_from_str(&tokens.join("")).and_then(|expr| match expr {
+ ast::Expr::PathExpr(it) => it.path(),
+ _ => None,
+ })
+ })
.collect();
Some(paths)
}