// FIXME: this badly needs rename/rewrite (matklad, 2020-02-06).
use hir::{
- db::HirDatabase, Crate, Field, HasVisibility, Impl, Label, LifetimeParam, Local, MacroDef,
- Module, ModuleDef, Name, PathResolution, Semantics, TypeParam, Visibility,
+ db::HirDatabase, Crate, Field, GenericParam, HasVisibility, Impl, Label, Local, MacroDef,
+ Module, ModuleDef, Name, PathResolution, Semantics, Visibility,
};
use syntax::{
- ast::{self, AstNode},
+ ast::{self, AstNode, PathSegmentKind},
match_ast, SyntaxKind, SyntaxNode,
};
ModuleDef(ModuleDef),
SelfType(Impl),
Local(Local),
- TypeParam(TypeParam),
- LifetimeParam(LifetimeParam),
+ GenericParam(GenericParam),
Label(Label),
}
Definition::ModuleDef(it) => it.module(db),
Definition::SelfType(it) => Some(it.module(db)),
Definition::Local(it) => Some(it.module(db)),
- Definition::TypeParam(it) => Some(it.module(db)),
- Definition::LifetimeParam(it) => Some(it.module(db)),
+ Definition::GenericParam(it) => Some(it.module(db)),
Definition::Label(it) => Some(it.module(db)),
}
}
Definition::ModuleDef(def) => def.definition_visibility(db),
Definition::SelfType(_) => None,
Definition::Local(_) => None,
- Definition::TypeParam(_) => None,
- Definition::LifetimeParam(_) => None,
+ Definition::GenericParam(_) => None,
Definition::Label(_) => None,
}
}
},
Definition::SelfType(_) => return None,
Definition::Local(it) => it.name(db)?,
- Definition::TypeParam(it) => it.name(db),
- Definition::LifetimeParam(it) => it.name(db),
+ Definition::GenericParam(it) => it.name(db),
Definition::Label(it) => it.name(db),
};
Some(name)
let path = use_tree.path()?;
let path_segment = path.segment()?;
let name_ref_class = path_segment
- .name_ref()
- // The rename might be from a `self` token, so fallback to the name higher
- // in the use tree.
- .or_else(||{
- if path_segment.self_token().is_none() {
- return None;
+ .kind()
+ .and_then(|kind| {
+ match kind {
+ // The rename might be from a `self` token, so fallback to the name higher
+ // in the use tree.
+ PathSegmentKind::SelfKw => {
+ let use_tree = use_tree
+ .syntax()
+ .parent()
+ .as_ref()
+ // Skip over UseTreeList
+ .and_then(SyntaxNode::parent)
+ .and_then(ast::UseTree::cast)?;
+ let path = use_tree.path()?;
+ let path_segment = path.segment()?;
+ path_segment.name_ref()
+ },
+ PathSegmentKind::Name(name_ref) => Some(name_ref),
+ _ => return None,
}
-
- let use_tree = use_tree
- .syntax()
- .parent()
- .as_ref()
- // Skip over UseTreeList
- .and_then(SyntaxNode::parent)
- .and_then(ast::UseTree::cast)?;
- let path = use_tree.path()?;
- let path_segment = path.segment()?;
- path_segment.name_ref()
})
.and_then(|name_ref| NameRefClass::classify(sema, &name_ref))?;
Some(NameClass::Definition(Definition::Local(local)))
},
+ ast::SelfParam(it) => {
+ let def = sema.to_def(&it)?;
+ Some(NameClass::Definition(Definition::Local(def.into())))
+ },
ast::RecordField(it) => {
let field: hir::Field = sema.to_def(&it)?;
Some(NameClass::Definition(Definition::Field(field)))
},
ast::TypeParam(it) => {
let def = sema.to_def(&it)?;
- Some(NameClass::Definition(Definition::TypeParam(def)))
+ Some(NameClass::Definition(Definition::GenericParam(def.into())))
+ },
+ ast::ConstParam(it) => {
+ let def = sema.to_def(&it)?;
+ Some(NameClass::Definition(Definition::GenericParam(def.into())))
},
_ => None,
}
match parent {
ast::LifetimeParam(it) => {
let def = sema.to_def(&it)?;
- Some(NameClass::Definition(Definition::LifetimeParam(def)))
+ Some(NameClass::Definition(Definition::GenericParam(def.into())))
},
ast::Label(it) => {
let def = sema.to_def(&it)?;
if let Some(path) = macro_call.path() {
if path.qualifier().is_none() {
// Only use this to resolve single-segment macro calls like `foo!()`. Multi-segment
- // paths are handled below (allowing `log<|>::info!` to resolve to the log crate).
+ // paths are handled below (allowing `log$0::info!` to resolve to the log crate).
if let Some(macro_def) = sema.resolve_macro_call(¯o_call) {
return Some(NameRefClass::Definition(Definition::Macro(macro_def)));
}
| SyntaxKind::WHERE_PRED
| SyntaxKind::REF_TYPE => sema
.resolve_lifetime_param(lifetime)
- .map(Definition::LifetimeParam)
+ .map(GenericParam::LifetimeParam)
+ .map(Definition::GenericParam)
.map(NameRefClass::Definition),
// lifetime bounds, as in the 'b in 'a: 'b aren't wrapped in TypeBound nodes so we gotta check
// if our lifetime is in a LifetimeParam without being the constrained lifetime
!= Some(lifetime) =>
{
sema.resolve_lifetime_param(lifetime)
- .map(Definition::LifetimeParam)
+ .map(GenericParam::LifetimeParam)
+ .map(Definition::GenericParam)
.map(NameRefClass::Definition)
}
_ => None,
Definition::ModuleDef(def)
}
PathResolution::Local(local) => Definition::Local(local),
- PathResolution::TypeParam(par) => Definition::TypeParam(par),
+ PathResolution::TypeParam(par) => Definition::GenericParam(par.into()),
PathResolution::Macro(def) => Definition::Macro(def),
PathResolution::SelfType(impl_def) => Definition::SelfType(impl_def),
+ PathResolution::ConstParam(par) => Definition::GenericParam(par.into()),
}
}
}