From 771c0d8c083e9c86a309a4380039602817e09fc8 Mon Sep 17 00:00:00 2001 From: Anatol Liu Date: Wed, 4 Nov 2020 20:08:46 -0800 Subject: [PATCH] Add static semantic token modifier for associated functions with no &self refactor logic into code_model.rs --- crates/hir/src/code_model.rs | 23 ++++++++++++++++++++--- crates/ide/src/syntax_highlighting.rs | 16 ++-------------- 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/crates/hir/src/code_model.rs b/crates/hir/src/code_model.rs index afb849b4d9..d04de053f2 100644 --- a/crates/hir/src/code_model.rs +++ b/crates/hir/src/code_model.rs @@ -41,7 +41,7 @@ use rustc_hash::FxHashSet; use stdx::impl_from; use syntax::{ ast::{self, AttrsOwner, NameOwner}, - AstNode, SmolStr, + AstNode, SmolStr, SyntaxKind, }; use tt::{Ident, Leaf, Literal, TokenTree}; @@ -788,8 +788,25 @@ impl Function { db.function_data(self.id).has_body } - pub fn source(self, db: &dyn HirDatabase) -> InFile { - self.id.lookup(db.upcast()).source(db.upcast()) + /// whether this function is associated with some trait/impl + pub fn is_associated(self, db: &dyn HirDatabase) -> bool { + if let Some(_) = self.self_param(db) { + return false; + } + + let fn_parent_kind = self + .source(db) + .value + .syntax() + .parent() + .and_then(|s| s.parent()) + .and_then(|s| Some(s.kind())); + + match fn_parent_kind { + Some(SyntaxKind::IMPL) => true, + Some(SyntaxKind::TRAIT) => true, + _ => false, + } } } diff --git a/crates/ide/src/syntax_highlighting.rs b/crates/ide/src/syntax_highlighting.rs index c28ff849a2..3fcdb5e52f 100644 --- a/crates/ide/src/syntax_highlighting.rs +++ b/crates/ide/src/syntax_highlighting.rs @@ -746,20 +746,8 @@ fn highlight_def(db: &RootDatabase, def: Definition) -> Highlight { if func.is_unsafe(db) { h |= HighlightModifier::Unsafe; } - if let None = func.self_param(db) { - // if enclosing IMPL or TRAIT exists, this is a static method - let fn_parent_kind = func - .source(db) - .value - .syntax() - .parent() - .and_then(|s| s.parent()) - .and_then(|s| Some(s.kind())); - if let Some(SyntaxKind::IMPL) = fn_parent_kind { - h |= HighlightModifier::Static; - } else if let Some(SyntaxKind::TRAIT) = fn_parent_kind { - h |= HighlightModifier::Static; - } + if func.is_associated(db) { + h |= HighlightModifier::Static; } return h; }