Apply async semantic token modifier to async/await keywords

Only async semantic token modifier
This commit is contained in:
hi-rustin 2021-05-14 10:36:12 +08:00
parent 9803a9a148
commit b98c119ba6
5 changed files with 17 additions and 0 deletions

View File

@ -873,6 +873,10 @@ impl Function {
db.function_data(self.id).is_unsafe() db.function_data(self.id).is_unsafe()
} }
pub fn is_async(self, db: &dyn HirDatabase) -> bool {
db.function_data(self.id).is_async()
}
pub fn diagnostics(self, db: &dyn HirDatabase, sink: &mut DiagnosticSink) { pub fn diagnostics(self, db: &dyn HirDatabase, sink: &mut DiagnosticSink) {
let krate = self.module(db).id.krate(); let krate = self.module(db).id.krate();
hir_def::diagnostics::validate_body(db.upcast(), self.id.into(), sink); hir_def::diagnostics::validate_body(db.upcast(), self.id.into(), sink);

View File

@ -255,6 +255,7 @@ pub(super) fn element(
}) })
.map(|modifier| h | modifier) .map(|modifier| h | modifier)
.unwrap_or(h), .unwrap_or(h),
T![async] | T![await] => h | HlMod::Async,
_ => h, _ => h,
} }
} }
@ -310,6 +311,9 @@ fn highlight_def(db: &RootDatabase, def: Definition) -> Highlight {
if func.is_unsafe(db) { if func.is_unsafe(db) {
h |= HlMod::Unsafe; h |= HlMod::Unsafe;
} }
if func.is_async(db) {
h |= HlMod::Async;
}
return h; return h;
} }
hir::ModuleDef::Adt(hir::Adt::Struct(_)) => HlTag::Symbol(SymbolKind::Struct), hir::ModuleDef::Adt(hir::Adt::Struct(_)) => HlTag::Symbol(SymbolKind::Struct),
@ -409,6 +413,9 @@ fn highlight_method_call(
if func.is_unsafe(sema.db) || sema.is_unsafe_method_call(&method_call) { if func.is_unsafe(sema.db) || sema.is_unsafe_method_call(&method_call) {
h |= HlMod::Unsafe; 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(sema.db)).is_some() {
h |= HlMod::Trait h |= HlMod::Trait
} }

View File

@ -65,6 +65,8 @@ pub enum HlMod {
Static, Static,
/// Used for items in traits and trait impls. /// Used for items in traits and trait impls.
Trait, Trait,
/// Used with keywords like `async` and `await`.
Async,
// Keep this last! // Keep this last!
/// Used for unsafe functions, mutable statics, union accesses and unsafe operations. /// Used for unsafe functions, mutable statics, union accesses and unsafe operations.
Unsafe, Unsafe,
@ -186,6 +188,7 @@ impl HlMod {
HlMod::Mutable, HlMod::Mutable,
HlMod::Static, HlMod::Static,
HlMod::Trait, HlMod::Trait,
HlMod::Async,
HlMod::Unsafe, HlMod::Unsafe,
]; ];
@ -203,6 +206,7 @@ impl HlMod {
HlMod::Mutable => "mutable", HlMod::Mutable => "mutable",
HlMod::Static => "static", HlMod::Static => "static",
HlMod::Trait => "trait", HlMod::Trait => "trait",
HlMod::Async => "async",
HlMod::Unsafe => "unsafe", HlMod::Unsafe => "unsafe",
} }
} }

View File

@ -91,6 +91,7 @@ define_semantic_token_modifiers![
(INJECTED, "injected"), (INJECTED, "injected"),
(MUTABLE, "mutable"), (MUTABLE, "mutable"),
(CONSUMING, "consuming"), (CONSUMING, "consuming"),
(ASYNC, "async"),
(UNSAFE, "unsafe"), (UNSAFE, "unsafe"),
(ATTRIBUTE_MODIFIER, "attribute"), (ATTRIBUTE_MODIFIER, "attribute"),
(TRAIT_MODIFIER, "trait"), (TRAIT_MODIFIER, "trait"),

View File

@ -496,6 +496,7 @@ fn semantic_token_type_and_modifiers(
HlMod::ControlFlow => semantic_tokens::CONTROL_FLOW, HlMod::ControlFlow => semantic_tokens::CONTROL_FLOW,
HlMod::Mutable => semantic_tokens::MUTABLE, HlMod::Mutable => semantic_tokens::MUTABLE,
HlMod::Consuming => semantic_tokens::CONSUMING, HlMod::Consuming => semantic_tokens::CONSUMING,
HlMod::Async => semantic_tokens::ASYNC,
HlMod::Unsafe => semantic_tokens::UNSAFE, HlMod::Unsafe => semantic_tokens::UNSAFE,
HlMod::Callable => semantic_tokens::CALLABLE, HlMod::Callable => semantic_tokens::CALLABLE,
HlMod::Static => lsp_types::SemanticTokenModifier::STATIC, HlMod::Static => lsp_types::SemanticTokenModifier::STATIC,