use hir::{AsAssocItem, HasVisibility, Semantics};
use ide_db::{
defs::{Definition, IdentClass, NameClass, NameRefClass},
- RootDatabase, SymbolKind,
+ FxHashMap, RootDatabase, SymbolKind,
};
-use rustc_hash::FxHashMap;
use syntax::{
ast, match_ast, AstNode, AstToken, NodeOrToken,
SyntaxKind::{self, *},
Highlight, HlMod, HlTag,
};
-pub(super) fn token(sema: &Semantics<RootDatabase>, token: SyntaxToken) -> Option<Highlight> {
+pub(super) fn token(sema: &Semantics<'_, RootDatabase>, token: SyntaxToken) -> Option<Highlight> {
if let Some(comment) = ast::Comment::cast(token.clone()) {
let h = HlTag::Comment;
return Some(match comment.kind().doc {
let highlight: Highlight = match token.kind() {
STRING | BYTE_STRING => HlTag::StringLiteral.into(),
- INT_NUMBER if token.ancestors().nth(1).map(|it| it.kind()) == Some(FIELD_EXPR) => {
+ INT_NUMBER if token.parent_ancestors().nth(1).map(|it| it.kind()) == Some(FIELD_EXPR) => {
SymbolKind::Field.into()
}
INT_NUMBER | FLOAT_NUMBER => HlTag::NumericLiteral.into(),
}
pub(super) fn name_like(
- sema: &Semantics<RootDatabase>,
+ sema: &Semantics<'_, RootDatabase>,
krate: hir::Crate,
bindings_shadow_count: &mut FxHashMap<hir::Name, u32>,
syntactic_name_ref_highlighting: bool,
Some((highlight, binding_hash))
}
-fn punctuation(sema: &Semantics<RootDatabase>, token: SyntaxToken, kind: SyntaxKind) -> Highlight {
+fn punctuation(
+ sema: &Semantics<'_, RootDatabase>,
+ token: SyntaxToken,
+ kind: SyntaxKind,
+) -> Highlight {
let parent = token.parent();
let parent_kind = parent.as_ref().map_or(EOF, SyntaxNode::kind);
match (kind, parent_kind) {
}
}
(T![::] | T![->] | T![=>] | T![..] | T![=] | T![@] | T![.], _) => HlOperator::Other.into(),
- (T![!], MACRO_CALL) => HlPunct::MacroBang.into(),
+ (T![!], MACRO_CALL | MACRO_RULES) => HlPunct::MacroBang.into(),
(T![!], NEVER_TYPE) => HlTag::BuiltinType.into(),
(T![!], PREFIX_EXPR) => HlOperator::Logical.into(),
(T![*], PTR_TYPE) => HlTag::Keyword.into(),
}
fn keyword(
- sema: &Semantics<RootDatabase>,
+ sema: &Semantics<'_, RootDatabase>,
token: SyntaxToken,
kind: SyntaxKind,
) -> Option<Highlight> {
}
fn highlight_name_ref(
- sema: &Semantics<RootDatabase>,
+ sema: &Semantics<'_, RootDatabase>,
krate: hir::Crate,
bindings_shadow_count: &mut FxHashMap<hir::Name, u32>,
binding_hash: &mut Option<u64>,
}
fn highlight_name(
- sema: &Semantics<RootDatabase>,
+ sema: &Semantics<'_, RootDatabase>,
bindings_shadow_count: &mut FxHashMap<hir::Name, u32>,
binding_hash: &mut Option<u64>,
krate: hir::Crate,
hash((name, shadow_count))
}
-fn highlight_def(sema: &Semantics<RootDatabase>, krate: hir::Crate, def: Definition) -> Highlight {
+fn highlight_def(
+ sema: &Semantics<'_, RootDatabase>,
+ krate: hir::Crate,
+ def: Definition,
+) -> Highlight {
let db = sema.db;
let mut h = match def {
Definition::Macro(m) => Highlight::new(HlTag::Symbol(m.kind(sema.db).into())),
Definition::Field(_) => Highlight::new(HlTag::Symbol(SymbolKind::Field)),
Definition::Module(module) => {
let mut h = Highlight::new(HlTag::Symbol(SymbolKind::Module));
- if module.parent(db).is_none() {
- h |= HlMod::CrateRoot
+ if module.is_crate_root(db) {
+ h |= HlMod::CrateRoot;
}
h
}
}
}
- if func.is_unsafe(db) {
+ if func.is_unsafe_to_call(db) {
h |= HlMod::Unsafe;
}
if func.is_async(db) {
Definition::ToolModule(_) => Highlight::new(HlTag::Symbol(SymbolKind::ToolModule)),
};
- let def_crate = def.module(db).map(hir::Module::krate).or_else(|| match def {
- Definition::Module(module) => Some(module.krate()),
- _ => None,
- });
+ let def_crate = def.krate(db);
let is_from_other_crate = def_crate != Some(krate);
let is_from_builtin_crate = def_crate.map_or(false, |def_crate| def_crate.is_builtin(db));
let is_builtin_type = matches!(def, Definition::BuiltinType(_));
}
fn highlight_method_call_by_name_ref(
- sema: &Semantics<RootDatabase>,
+ sema: &Semantics<'_, RootDatabase>,
krate: hir::Crate,
name_ref: &ast::NameRef,
) -> Option<Highlight> {
}
fn highlight_method_call(
- sema: &Semantics<RootDatabase>,
+ sema: &Semantics<'_, RootDatabase>,
krate: hir::Crate,
method_call: &ast::MethodCallExpr,
) -> Option<Highlight> {
let mut h = SymbolKind::Function.into();
h |= HlMod::Associated;
- if func.is_unsafe(sema.db) || sema.is_unsafe_method_call(method_call) {
+ if func.is_unsafe_to_call(sema.db) || sema.is_unsafe_method_call(method_call) {
h |= HlMod::Unsafe;
}
if func.is_async(sema.db) {
h |= HlMod::Async;
}
- if func.as_assoc_item(sema.db).and_then(|it| it.containing_trait(sema.db)).is_some() {
+ if func
+ .as_assoc_item(sema.db)
+ .and_then(|it| it.containing_trait_or_trait_impl(sema.db))
+ .is_some()
+ {
h |= HlMod::Trait;
}
fn highlight_name_ref_by_syntax(
name: ast::NameRef,
- sema: &Semantics<RootDatabase>,
+ sema: &Semantics<'_, RootDatabase>,
krate: hir::Crate,
) -> Highlight {
let default = HlTag::UnresolvedReference;