diff options
| author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2021-05-14 09:50:36 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-05-14 09:50:36 +0000 |
| commit | ab528e85f71da188722ae031b31a3a70bac1cadd (patch) | |
| tree | 08d457f7e9e401200c72d9de3ff9bb6b221fb09c | |
| parent | 9803a9a148e1c5850d2f649ffbc1bb3575cfa929 (diff) | |
| parent | 765ccf2eca2c21af4e2d76b006809446d0034bc7 (diff) | |
| download | rust-ab528e85f71da188722ae031b31a3a70bac1cadd.tar.gz rust-ab528e85f71da188722ae031b31a3a70bac1cadd.zip | |
Merge #8831
8831: Apply async semantic token modifier to async/await keywords r=Veykril a=hi-rustin close https://github.com/rust-analyzer/rust-analyzer/issues/8633 Co-authored-by: hi-rustin <rustin.liu@gmail.com>
| -rw-r--r-- | crates/hir/src/lib.rs | 4 | ||||
| -rw-r--r-- | crates/ide/src/syntax_highlighting/highlight.rs | 11 | ||||
| -rw-r--r-- | crates/ide/src/syntax_highlighting/tags.rs | 4 | ||||
| -rw-r--r-- | crates/ide/src/syntax_highlighting/test_data/highlighting.html | 11 | ||||
| -rw-r--r-- | crates/ide/src/syntax_highlighting/tests.rs | 11 | ||||
| -rw-r--r-- | crates/rust-analyzer/src/semantic_tokens.rs | 1 | ||||
| -rw-r--r-- | crates/rust-analyzer/src/to_proto.rs | 1 |
7 files changed, 41 insertions, 2 deletions
diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs index c9ef4b42056..6233bca83ae 100644 --- a/crates/hir/src/lib.rs +++ b/crates/hir/src/lib.rs @@ -873,6 +873,10 @@ impl Function { 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) { let krate = self.module(db).id.krate(); hir_def::diagnostics::validate_body(db.upcast(), self.id.into(), sink); diff --git a/crates/ide/src/syntax_highlighting/highlight.rs b/crates/ide/src/syntax_highlighting/highlight.rs index b586dcc1798..baed8e2170f 100644 --- a/crates/ide/src/syntax_highlighting/highlight.rs +++ b/crates/ide/src/syntax_highlighting/highlight.rs @@ -227,8 +227,8 @@ pub(super) fn element( k if k.is_keyword() => { let h = Highlight::new(HlTag::Keyword); match k { - T![await] - | T![break] + T![await] => h | HlMod::Async | HlMod::ControlFlow, + T![break] | T![continue] | T![else] | T![if] @@ -255,6 +255,7 @@ pub(super) fn element( }) .map(|modifier| h | modifier) .unwrap_or(h), + T![async] => h | HlMod::Async, _ => h, } } @@ -310,6 +311,9 @@ fn highlight_def(db: &RootDatabase, def: Definition) -> Highlight { if func.is_unsafe(db) { h |= HlMod::Unsafe; } + if func.is_async(db) { + h |= HlMod::Async; + } return h; } 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) { 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() { h |= HlMod::Trait } diff --git a/crates/ide/src/syntax_highlighting/tags.rs b/crates/ide/src/syntax_highlighting/tags.rs index a304b325064..f4a2e7506a6 100644 --- a/crates/ide/src/syntax_highlighting/tags.rs +++ b/crates/ide/src/syntax_highlighting/tags.rs @@ -65,6 +65,8 @@ pub enum HlMod { Static, /// Used for items in traits and trait impls. Trait, + /// Used with keywords like `async` and `await`. + Async, // Keep this last! /// Used for unsafe functions, mutable statics, union accesses and unsafe operations. Unsafe, @@ -186,6 +188,7 @@ impl HlMod { HlMod::Mutable, HlMod::Static, HlMod::Trait, + HlMod::Async, HlMod::Unsafe, ]; @@ -203,6 +206,7 @@ impl HlMod { HlMod::Mutable => "mutable", HlMod::Static => "static", HlMod::Trait => "trait", + HlMod::Async => "async", HlMod::Unsafe => "unsafe", } } diff --git a/crates/ide/src/syntax_highlighting/test_data/highlighting.html b/crates/ide/src/syntax_highlighting/test_data/highlighting.html index df419219494..33bc6b0f3b0 100644 --- a/crates/ide/src/syntax_highlighting/test_data/highlighting.html +++ b/crates/ide/src/syntax_highlighting/test_data/highlighting.html @@ -234,4 +234,15 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd <span class="variable declaration">Nope</span> <span class="operator">=></span> <span class="variable">Nope</span><span class="comma">,</span> <span class="brace">}</span> <span class="brace">}</span> +<span class="brace">}</span> + +<span class="keyword async">async</span> <span class="keyword">fn</span> <span class="function declaration async">learn_and_sing</span><span class="parenthesis">(</span><span class="parenthesis">)</span> <span class="brace">{</span> + <span class="keyword">let</span> <span class="variable declaration">song</span> <span class="operator">=</span> <span class="unresolved_reference">learn_song</span><span class="parenthesis">(</span><span class="parenthesis">)</span><span class="operator">.</span><span class="keyword control async">await</span><span class="semicolon">;</span> + <span class="unresolved_reference">sing_song</span><span class="parenthesis">(</span><span class="variable consuming">song</span><span class="parenthesis">)</span><span class="operator">.</span><span class="keyword control async">await</span><span class="semicolon">;</span> +<span class="brace">}</span> + +<span class="keyword async">async</span> <span class="keyword">fn</span> <span class="function declaration async">async_main</span><span class="parenthesis">(</span><span class="parenthesis">)</span> <span class="brace">{</span> + <span class="keyword">let</span> <span class="variable declaration">f1</span> <span class="operator">=</span> <span class="function async">learn_and_sing</span><span class="parenthesis">(</span><span class="parenthesis">)</span><span class="semicolon">;</span> + <span class="keyword">let</span> <span class="variable declaration">f2</span> <span class="operator">=</span> <span class="unresolved_reference">dance</span><span class="parenthesis">(</span><span class="parenthesis">)</span><span class="semicolon">;</span> + futures::<span class="macro">join!</span><span class="parenthesis">(</span>f1<span class="comma">,</span> f2<span class="parenthesis">)</span><span class="semicolon">;</span> <span class="brace">}</span></code></pre> \ No newline at end of file diff --git a/crates/ide/src/syntax_highlighting/tests.rs b/crates/ide/src/syntax_highlighting/tests.rs index b6e952b0888..32f2d9038ea 100644 --- a/crates/ide/src/syntax_highlighting/tests.rs +++ b/crates/ide/src/syntax_highlighting/tests.rs @@ -208,6 +208,17 @@ impl<T> Option<T> { } } } + +async fn learn_and_sing() { + let song = learn_song().await; + sing_song(song).await; +} + +async fn async_main() { + let f1 = learn_and_sing(); + let f2 = dance(); + futures::join!(f1, f2); +} "# .trim(), expect_file!["./test_data/highlighting.html"], diff --git a/crates/rust-analyzer/src/semantic_tokens.rs b/crates/rust-analyzer/src/semantic_tokens.rs index ecab89b2a8c..c9d38693e81 100644 --- a/crates/rust-analyzer/src/semantic_tokens.rs +++ b/crates/rust-analyzer/src/semantic_tokens.rs @@ -91,6 +91,7 @@ define_semantic_token_modifiers