Skip to content

Commit 2fa942a

Browse files
bors[bot]GrayJackVeykril
authored
Merge #6251 #6310
6251: Semantic Highlight: Add Callable modifier for variables r=matklad a=GrayJack This PR added the `HighlightModifier::Callable` variant and assigned it to variables and parameters that are fn pointers, closures and implements FnOnce trait. This allows to colorize these variables/parameters when used in call expression. 6310: Rewrite algo::diff to support insertion and deletion r=matklad a=Veykril This in turn also makes `algo::diff` generate finer diffs(maybe even minimal diffs?) as insertions and deletions aren't always represented as as replacements of parent nodes now. Required for #6287 to go on. Co-authored-by: GrayJack <[email protected]> Co-authored-by: Lukas Wirth <[email protected]>
3 parents c483212 + a35ff6e + 0059188 commit 2fa942a

File tree

13 files changed

+469
-32
lines changed

13 files changed

+469
-32
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/hir/src/code_model.rs

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,7 @@ use hir_ty::{
3131
autoderef,
3232
display::{HirDisplayError, HirFormatter},
3333
method_resolution,
34-
traits::Solution,
35-
traits::SolutionVariables,
34+
traits::{FnTrait, Solution, SolutionVariables},
3635
ApplicationTy, BoundVar, CallableDefId, Canonical, DebruijnIndex, FnSig, GenericPredicate,
3736
InEnvironment, Obligation, ProjectionPredicate, ProjectionTy, Substs, TraitEnvironment, Ty,
3837
TyDefId, TyKind, TypeCtor,
@@ -1386,6 +1385,28 @@ impl Type {
13861385
)
13871386
}
13881387

1388+
/// Checks that particular type `ty` implements `std::ops::FnOnce`.
1389+
///
1390+
/// This function can be used to check if a particular type is callable, since FnOnce is a
1391+
/// supertrait of Fn and FnMut, so all callable types implements at least FnOnce.
1392+
pub fn impls_fnonce(&self, db: &dyn HirDatabase) -> bool {
1393+
let krate = self.krate;
1394+
1395+
let fnonce_trait = match FnTrait::FnOnce.get_id(db, krate) {
1396+
Some(it) => it,
1397+
None => return false,
1398+
};
1399+
1400+
let canonical_ty = Canonical { value: self.ty.value.clone(), kinds: Arc::new([]) };
1401+
method_resolution::implements_trait(
1402+
&canonical_ty,
1403+
db,
1404+
self.ty.environment.clone(),
1405+
krate,
1406+
fnonce_trait,
1407+
)
1408+
}
1409+
13891410
pub fn impls_trait(&self, db: &dyn HirDatabase, trait_: Trait, args: &[Type]) -> bool {
13901411
let trait_ref = hir_ty::TraitRef {
13911412
trait_: trait_.id,

crates/ide/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ doctest = false
1111

1212
[dependencies]
1313
either = "1.5.3"
14-
indexmap = "1.3.2"
14+
indexmap = "1.4.0"
1515
itertools = "0.9.0"
1616
log = "0.4.8"
1717
rustc-hash = "1.1.0"

crates/ide/src/diagnostics.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -613,7 +613,7 @@ fn main() {
613613
pub struct Foo { pub a: i32, pub b: i32 }
614614
"#,
615615
r#"
616-
fn {a:42, b: ()} {}
616+
fn some(, b: ()} {}
617617
fn items() {}
618618
fn here() {}
619619

crates/ide/src/syntax_highlighting.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -763,6 +763,9 @@ fn highlight_def(db: &RootDatabase, def: Definition) -> Highlight {
763763
if local.is_mut(db) || local.ty(db).is_mutable_reference() {
764764
h |= HighlightModifier::Mutable;
765765
}
766+
if local.ty(db).as_callable(db).is_some() || local.ty(db).impls_fnonce(db) {
767+
h |= HighlightModifier::Callable;
768+
}
766769
return h;
767770
}
768771
}

crates/ide/src/syntax_highlighting/tags.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ pub enum HighlightModifier {
6464
Mutable,
6565
Consuming,
6666
Unsafe,
67+
Callable,
6768
}
6869

6970
impl HighlightTag {
@@ -122,6 +123,7 @@ impl HighlightModifier {
122123
HighlightModifier::Mutable,
123124
HighlightModifier::Consuming,
124125
HighlightModifier::Unsafe,
126+
HighlightModifier::Callable,
125127
];
126128

127129
fn as_str(self) -> &'static str {
@@ -134,6 +136,7 @@ impl HighlightModifier {
134136
HighlightModifier::Mutable => "mutable",
135137
HighlightModifier::Consuming => "consuming",
136138
HighlightModifier::Unsafe => "unsafe",
139+
HighlightModifier::Callable => "callable",
137140
}
138141
}
139142

crates/ide/src/syntax_highlighting/test_data/highlighting.html

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,17 @@
4444
<span class="keyword">pub</span> <span class="keyword">trait</span> <span class="trait declaration">Copy</span> <span class="punctuation">{</span><span class="punctuation">}</span>
4545
<span class="punctuation">}</span>
4646

47+
<span class="keyword">pub</span> <span class="keyword">mod</span> <span class="module declaration">ops</span> <span class="punctuation">{</span>
48+
<span class="attribute">#</span><span class="attribute">[</span><span class="function attribute">lang</span><span class="attribute"> </span><span class="operator">=</span><span class="attribute"> </span><span class="string_literal">"fn_once"</span><span class="attribute">]</span>
49+
<span class="keyword">pub</span> <span class="keyword">trait</span> <span class="trait declaration">FnOnce</span><span class="punctuation">&lt;</span><span class="type_param declaration">Args</span><span class="punctuation">&gt;</span> <span class="punctuation">{</span><span class="punctuation">}</span>
50+
51+
<span class="attribute">#</span><span class="attribute">[</span><span class="function attribute">lang</span><span class="attribute"> </span><span class="operator">=</span><span class="attribute"> </span><span class="string_literal">"fn_mut"</span><span class="attribute">]</span>
52+
<span class="keyword">pub</span> <span class="keyword">trait</span> <span class="trait declaration">FnMut</span><span class="punctuation">&lt;</span><span class="type_param declaration">Args</span><span class="punctuation">&gt;</span><span class="punctuation">:</span> <span class="trait">FnOnce</span><span class="punctuation">&lt;</span><span class="type_param">Args</span><span class="punctuation">&gt;</span> <span class="punctuation">{</span><span class="punctuation">}</span>
53+
54+
<span class="attribute">#</span><span class="attribute">[</span><span class="function attribute">lang</span><span class="attribute"> </span><span class="operator">=</span><span class="attribute"> </span><span class="string_literal">"fn"</span><span class="attribute">]</span>
55+
<span class="keyword">pub</span> <span class="keyword">trait</span> <span class="trait declaration">Fn</span><span class="punctuation">&lt;</span><span class="type_param declaration">Args</span><span class="punctuation">&gt;</span><span class="punctuation">:</span> <span class="trait">FnMut</span><span class="punctuation">&lt;</span><span class="type_param">Args</span><span class="punctuation">&gt;</span> <span class="punctuation">{</span><span class="punctuation">}</span>
56+
<span class="punctuation">}</span>
57+
4758

4859
<span class="keyword">struct</span> <span class="struct declaration">Foo</span> <span class="punctuation">{</span>
4960
<span class="keyword">pub</span> <span class="field declaration">x</span><span class="punctuation">:</span> <span class="builtin_type">i32</span><span class="punctuation">,</span>
@@ -99,6 +110,11 @@
99110
<span class="function">foo</span><span class="operator">::</span><span class="punctuation">&lt;</span><span class="lifetime">'a</span><span class="punctuation">,</span> <span class="builtin_type">i32</span><span class="punctuation">&gt;</span><span class="punctuation">(</span><span class="punctuation">)</span>
100111
<span class="punctuation">}</span>
101112

113+
<span class="keyword">use</span> <span class="module">ops</span><span class="operator">::</span><span class="trait">Fn</span><span class="punctuation">;</span>
114+
<span class="keyword">fn</span> <span class="function declaration">baz</span><span class="punctuation">&lt;</span><span class="type_param declaration">F</span><span class="punctuation">:</span> <span class="trait">Fn</span><span class="punctuation">(</span><span class="punctuation">)</span> <span class="operator">-&gt;</span> <span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">&gt;</span><span class="punctuation">(</span><span class="value_param declaration callable">f</span><span class="punctuation">:</span> <span class="type_param">F</span><span class="punctuation">)</span> <span class="punctuation">{</span>
115+
<span class="value_param callable">f</span><span class="punctuation">(</span><span class="punctuation">)</span>
116+
<span class="punctuation">}</span>
117+
102118
<span class="macro">macro_rules!</span> <span class="macro declaration">def_fn</span> <span class="punctuation">{</span>
103119
<span class="punctuation">(</span><span class="punctuation">$</span><span class="punctuation">(</span><span class="punctuation">$</span>tt<span class="punctuation">:</span>tt<span class="punctuation">)</span><span class="punctuation">*</span><span class="punctuation">)</span> <span class="operator">=</span><span class="punctuation">&gt;</span> <span class="punctuation">{</span><span class="punctuation">$</span><span class="punctuation">(</span><span class="punctuation">$</span>tt<span class="punctuation">)</span><span class="punctuation">*</span><span class="punctuation">}</span>
104120
<span class="punctuation">}</span>
@@ -157,6 +173,9 @@
157173
<span class="variable mutable">copy</span><span class="punctuation">.</span><span class="function">quop</span><span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">;</span>
158174
<span class="variable mutable">copy</span><span class="punctuation">.</span><span class="function mutable">qux</span><span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">;</span>
159175
<span class="variable mutable">copy</span><span class="punctuation">.</span><span class="function">baz</span><span class="punctuation">(</span><span class="variable mutable">copy</span><span class="punctuation">)</span><span class="punctuation">;</span>
176+
177+
<span class="keyword">let</span> <span class="variable declaration callable">a</span> <span class="operator">=</span> <span class="punctuation">|</span><span class="value_param declaration">x</span><span class="punctuation">|</span> <span class="value_param">x</span><span class="punctuation">;</span>
178+
<span class="keyword">let</span> <span class="variable declaration callable">bar</span> <span class="operator">=</span> <span class="struct">Foo</span><span class="operator">::</span><span class="function">baz</span><span class="punctuation">;</span>
160179
<span class="punctuation">}</span>
161180

162181
<span class="keyword">enum</span> <span class="enum declaration">Option</span><span class="punctuation">&lt;</span><span class="type_param declaration">T</span><span class="punctuation">&gt;</span> <span class="punctuation">{</span>

crates/ide/src/syntax_highlighting/tests.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,17 @@ pub mod marker {
1818
pub trait Copy {}
1919
}
2020
21+
pub mod ops {
22+
#[lang = "fn_once"]
23+
pub trait FnOnce<Args> {}
24+
25+
#[lang = "fn_mut"]
26+
pub trait FnMut<Args>: FnOnce<Args> {}
27+
28+
#[lang = "fn"]
29+
pub trait Fn<Args>: FnMut<Args> {}
30+
}
31+
2132
2233
struct Foo {
2334
pub x: i32,
@@ -73,6 +84,11 @@ fn foo<'a, T>() -> T {
7384
foo::<'a, i32>()
7485
}
7586
87+
use ops::Fn;
88+
fn baz<F: Fn() -> ()>(f: F) {
89+
f()
90+
}
91+
7692
macro_rules! def_fn {
7793
($($tt:tt)*) => {$($tt)*}
7894
}
@@ -131,6 +147,9 @@ fn main() {
131147
copy.quop();
132148
copy.qux();
133149
copy.baz(copy);
150+
151+
let a = |x| x;
152+
let bar = Foo::baz;
134153
}
135154
136155
enum Option<T> {

crates/rust-analyzer/src/semantic_tokens.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ define_semantic_token_modifiers![
7777
(CONSUMING, "consuming"),
7878
(UNSAFE, "unsafe"),
7979
(ATTRIBUTE_MODIFIER, "attribute"),
80+
(CALLABLE, "callable"),
8081
];
8182

8283
#[derive(Default)]

crates/rust-analyzer/src/to_proto.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -425,6 +425,7 @@ fn semantic_token_type_and_modifiers(
425425
HighlightModifier::Mutable => semantic_tokens::MUTABLE,
426426
HighlightModifier::Consuming => semantic_tokens::CONSUMING,
427427
HighlightModifier::Unsafe => semantic_tokens::UNSAFE,
428+
HighlightModifier::Callable => semantic_tokens::CALLABLE,
428429
};
429430
mods |= modifier;
430431
}

0 commit comments

Comments
 (0)