@@ -5,6 +5,17 @@ import * as ra from './lsp_ext';
5
5
import { Ctx , Disposable } from './ctx' ;
6
6
import { sendRequestWithRetry , isRustDocument , RustDocument , RustEditor , sleep } from './util' ;
7
7
8
+ interface InlayHintStyle {
9
+ decorationType : vscode . TextEditorDecorationType ;
10
+ toDecoration ( hint : ra . InlayHint , conv : lc . Protocol2CodeConverter ) : vscode . DecorationOptions ;
11
+ } ;
12
+
13
+ interface InlayHintsStyles {
14
+ typeHints : InlayHintStyle ;
15
+ paramHints : InlayHintStyle ;
16
+ chainingHints : InlayHintStyle ;
17
+ }
18
+
8
19
9
20
export function activateInlayHints ( ctx : Ctx ) {
10
21
const maybeUpdater = {
@@ -19,6 +30,7 @@ export function activateInlayHints(ctx: Ctx) {
19
30
20
31
await sleep ( 100 ) ;
21
32
if ( this . updater ) {
33
+ this . updater . updateInlayHintsStyles ( ) ;
22
34
this . updater . syncCacheAndRenderHints ( ) ;
23
35
} else {
24
36
this . updater = new HintsUpdater ( ctx ) ;
@@ -39,11 +51,7 @@ export function activateInlayHints(ctx: Ctx) {
39
51
maybeUpdater . onConfigChange ( ) . catch ( console . error ) ;
40
52
}
41
53
42
- const typeHints = createHintStyle ( "type" ) ;
43
- const paramHints = createHintStyle ( "parameter" ) ;
44
- const chainingHints = createHintStyle ( "chaining" ) ;
45
-
46
- function createHintStyle ( hintKind : "type" | "parameter" | "chaining" ) {
54
+ function createHintStyle ( hintKind : "type" | "parameter" | "chaining" , smallerHints : boolean ) : InlayHintStyle {
47
55
// U+200C is a zero-width non-joiner to prevent the editor from forming a ligature
48
56
// between code and type hints
49
57
const [ pos , render ] = ( {
@@ -61,7 +69,7 @@ function createHintStyle(hintKind: "type" | "parameter" | "chaining") {
61
69
backgroundColor : bg ,
62
70
fontStyle : "normal" ,
63
71
fontWeight : "normal" ,
64
- textDecoration : ";font-size:smaller" ,
72
+ textDecoration : smallerHints ? ";font-size:smaller" : "none ",
65
73
} ,
66
74
} ) ,
67
75
toDecoration ( hint : ra . InlayHint , conv : lc . Protocol2CodeConverter ) : vscode . DecorationOptions {
@@ -73,9 +81,23 @@ function createHintStyle(hintKind: "type" | "parameter" | "chaining") {
73
81
} ;
74
82
}
75
83
84
+ const smallHintsStyles = {
85
+ typeHints : createHintStyle ( "type" , true ) ,
86
+ paramHints : createHintStyle ( "parameter" , true ) ,
87
+ chainingHints : createHintStyle ( "chaining" , true ) ,
88
+ } ;
89
+
90
+ const biggerHintsStyles = {
91
+ typeHints : createHintStyle ( "type" , false ) ,
92
+ paramHints : createHintStyle ( "parameter" , false ) ,
93
+ chainingHints : createHintStyle ( "chaining" , false ) ,
94
+ } ;
95
+
76
96
class HintsUpdater implements Disposable {
77
97
private sourceFiles = new Map < string , RustSourceFile > ( ) ; // map Uri -> RustSourceFile
78
98
private readonly disposables : Disposable [ ] = [ ] ;
99
+ private pendingDisposeDecorations : undefined | InlayHintsStyles = undefined ;
100
+ private inlayHintsStyles ! : InlayHintsStyles ;
79
101
80
102
constructor ( private readonly ctx : Ctx ) {
81
103
vscode . window . onDidChangeVisibleTextEditors (
@@ -100,6 +122,7 @@ class HintsUpdater implements Disposable {
100
122
}
101
123
) ) ;
102
124
125
+ this . updateInlayHintsStyles ( ) ;
103
126
this . syncCacheAndRenderHints ( ) ;
104
127
}
105
128
@@ -114,6 +137,15 @@ class HintsUpdater implements Disposable {
114
137
this . syncCacheAndRenderHints ( ) ;
115
138
}
116
139
140
+ updateInlayHintsStyles ( ) {
141
+ const inlayHintsStyles = this . ctx . config . inlayHints . smallerHints ? smallHintsStyles : biggerHintsStyles ;
142
+
143
+ if ( inlayHintsStyles !== this . inlayHintsStyles ) {
144
+ this . pendingDisposeDecorations = this . inlayHintsStyles ;
145
+ this . inlayHintsStyles = inlayHintsStyles ;
146
+ }
147
+ }
148
+
117
149
syncCacheAndRenderHints ( ) {
118
150
this . sourceFiles . forEach ( ( file , uri ) => this . fetchHints ( file ) . then ( hints => {
119
151
if ( ! hints ) return ;
@@ -161,12 +193,20 @@ class HintsUpdater implements Disposable {
161
193
}
162
194
163
195
private renderDecorations ( editor : RustEditor , decorations : InlaysDecorations ) {
196
+ const { typeHints, paramHints, chainingHints } = this . inlayHintsStyles ;
197
+ if ( this . pendingDisposeDecorations !== undefined ) {
198
+ const { typeHints, paramHints, chainingHints } = this . pendingDisposeDecorations ;
199
+ editor . setDecorations ( typeHints . decorationType , [ ] ) ;
200
+ editor . setDecorations ( paramHints . decorationType , [ ] ) ;
201
+ editor . setDecorations ( chainingHints . decorationType , [ ] ) ;
202
+ }
164
203
editor . setDecorations ( typeHints . decorationType , decorations . type ) ;
165
204
editor . setDecorations ( paramHints . decorationType , decorations . param ) ;
166
205
editor . setDecorations ( chainingHints . decorationType , decorations . chaining ) ;
167
206
}
168
207
169
208
private hintsToDecorations ( hints : ra . InlayHint [ ] ) : InlaysDecorations {
209
+ const { typeHints, paramHints, chainingHints } = this . inlayHintsStyles ;
170
210
const decorations : InlaysDecorations = { type : [ ] , param : [ ] , chaining : [ ] } ;
171
211
const conv = this . ctx . client . protocol2CodeConverter ;
172
212
0 commit comments