@@ -10,7 +10,17 @@ interface FileData
10
10
{
11
11
version : number ;
12
12
promise : ManualPromise < vscode . InlayHint [ ] > ;
13
+ typeHints : CppInlayHint [ ] ;
14
+ parameterHints : CppInlayHint [ ] ;
13
15
inlayHints : vscode . InlayHint [ ] ;
16
+
17
+ inlayHintsAutoDeclarationTypes ?: boolean ;
18
+ inlayHintsAutoDeclarationTypesShowOnLeft ?: boolean ;
19
+ inlayHintsParameterNames ?: boolean ;
20
+ inlayHintsParameterNamesHideLeadingUnderscores ?: boolean ;
21
+ inlayHintsParameterNamesSuppressName ?: boolean ;
22
+ inlayHintsReferenceOperator ?: boolean ;
23
+ inlayHintsReferenceOperatorShowSpace ?: boolean ;
14
24
}
15
25
16
26
export interface CppInlayHint {
@@ -35,7 +45,7 @@ export class InlayHintsProvider implements vscode.InlayHintsProvider {
35
45
public onDidChangeInlayHints ?: vscode . Event < void > = this . onDidChangeInlayHintsEvent . event ;
36
46
private allFileData : Map < string , FileData > = new Map < string , FileData > ( ) ;
37
47
38
- public async provideInlayHints ( document : vscode . TextDocument , range : vscode . Range , token : vscode . CancellationToken ) : Promise < vscode . InlayHint [ ] > {
48
+ public async provideInlayHints ( document : vscode . TextDocument , _range : vscode . Range , token : vscode . CancellationToken ) : Promise < vscode . InlayHint [ ] > {
39
49
const uri : vscode . Uri = document . uri ;
40
50
const uriString : string = uri . toString ( ) ;
41
51
let fileData : FileData | undefined = this . allFileData . get ( uriString ) ;
@@ -44,6 +54,36 @@ export class InlayHintsProvider implements vscode.InlayHintsProvider {
44
54
// Make sure file hasn't been changed since the last set of results.
45
55
// If a complete promise is present, there should also be a cache.
46
56
if ( fileData . version === document . version ) {
57
+ const settings : CppSettings = new CppSettings ( vscode . Uri . parse ( uriString ) ) ;
58
+ // Check if any of the settings changed.
59
+ if ( fileData . inlayHintsAutoDeclarationTypes === settings . inlayHintsAutoDeclarationTypes &&
60
+ fileData . inlayHintsAutoDeclarationTypesShowOnLeft === settings . inlayHintsAutoDeclarationTypesShowOnLeft &&
61
+ fileData . inlayHintsParameterNames === settings . inlayHintsParameterNames &&
62
+ fileData . inlayHintsParameterNamesHideLeadingUnderscores === settings . inlayHintsParameterNamesHideLeadingUnderscores &&
63
+ fileData . inlayHintsParameterNamesSuppressName === settings . inlayHintsParameterNamesSuppressName &&
64
+ fileData . inlayHintsReferenceOperator === settings . inlayHintsReferenceOperator &&
65
+ fileData . inlayHintsReferenceOperatorShowSpace === settings . inlayHintsReferenceOperatorShowSpace ) {
66
+ return fileData . promise ;
67
+ }
68
+ fileData . inlayHints = [ ] ;
69
+ fileData . inlayHintsAutoDeclarationTypes = settings . inlayHintsAutoDeclarationTypes ;
70
+ fileData . inlayHintsAutoDeclarationTypesShowOnLeft = settings . inlayHintsAutoDeclarationTypesShowOnLeft ;
71
+ fileData . inlayHintsParameterNames = settings . inlayHintsParameterNames ;
72
+ fileData . inlayHintsParameterNamesHideLeadingUnderscores = settings . inlayHintsParameterNamesHideLeadingUnderscores ;
73
+ fileData . inlayHintsParameterNamesSuppressName = settings . inlayHintsParameterNamesSuppressName ;
74
+ fileData . inlayHintsReferenceOperator = settings . inlayHintsReferenceOperator ;
75
+ fileData . inlayHintsReferenceOperatorShowSpace = settings . inlayHintsReferenceOperatorShowSpace ;
76
+ if ( settings . inlayHintsAutoDeclarationTypes ) {
77
+ const resolvedTypeHints : vscode . InlayHint [ ] = this . resolveTypeHints ( settings , fileData . typeHints ) ;
78
+ Array . prototype . push . apply ( fileData . inlayHints , resolvedTypeHints ) ;
79
+ }
80
+ if ( settings . inlayHintsParameterNames || settings . inlayHintsReferenceOperator ) {
81
+ const resolvedParameterHints : vscode . InlayHint [ ] = this . resolveParameterHints ( settings , fileData . parameterHints ) ;
82
+ Array . prototype . push . apply ( fileData . inlayHints , resolvedParameterHints ) ;
83
+ }
84
+ fileData . promise = new ManualPromise < vscode . InlayHint [ ] > ( ) ;
85
+ fileData . promise . resolve ( fileData . inlayHints ) ;
86
+ this . onDidChangeInlayHintsEvent . fire ( ) ;
47
87
return fileData . promise ;
48
88
}
49
89
} else {
@@ -56,6 +96,8 @@ export class InlayHintsProvider implements vscode.InlayHintsProvider {
56
96
fileData = {
57
97
version : document . version ,
58
98
promise : new ManualPromise < vscode . InlayHint [ ] > ( ) ,
99
+ typeHints : [ ] ,
100
+ parameterHints : [ ] ,
59
101
inlayHints : [ ]
60
102
} ;
61
103
this . allFileData . set ( uriString , fileData ) ;
@@ -93,6 +135,8 @@ export class InlayHintsProvider implements vscode.InlayHintsProvider {
93
135
fileData = {
94
136
version : editor . document . version ,
95
137
promise : new ManualPromise < vscode . InlayHint [ ] > ( ) ,
138
+ typeHints : [ ] ,
139
+ parameterHints : [ ] ,
96
140
inlayHints : [ ]
97
141
} ;
98
142
newPromiseCreated = true ;
@@ -105,25 +149,38 @@ export class InlayHintsProvider implements vscode.InlayHintsProvider {
105
149
}
106
150
if ( fileData . version !== editor . document . version ) {
107
151
fileData . version = editor . document . version ;
152
+ fileData . typeHints = [ ] ;
153
+ fileData . parameterHints = [ ] ;
108
154
fileData . inlayHints = [ ] ;
109
155
}
110
156
}
111
157
return [ fileData , newPromiseCreated ] ;
112
158
} ) ( ) ;
159
+ const settings : CppSettings = new CppSettings ( vscode . Uri . parse ( uriString ) ) ;
113
160
if ( startNewSet ) {
114
161
fileData . inlayHints = [ ] ;
162
+ fileData . typeHints = [ ] ;
163
+ fileData . parameterHints = [ ] ;
164
+ fileData . inlayHintsAutoDeclarationTypes = settings . inlayHintsAutoDeclarationTypes ;
165
+ fileData . inlayHintsAutoDeclarationTypesShowOnLeft = settings . inlayHintsAutoDeclarationTypesShowOnLeft ;
166
+ fileData . inlayHintsParameterNames = settings . inlayHintsParameterNames ;
167
+ fileData . inlayHintsParameterNamesHideLeadingUnderscores = settings . inlayHintsParameterNamesHideLeadingUnderscores ;
168
+ fileData . inlayHintsParameterNamesSuppressName = settings . inlayHintsParameterNamesSuppressName ;
169
+ fileData . inlayHintsReferenceOperator = settings . inlayHintsReferenceOperator ;
170
+ fileData . inlayHintsReferenceOperatorShowSpace = settings . inlayHintsReferenceOperatorShowSpace ;
115
171
}
116
172
117
- const typeHints : CppInlayHint [ ] = cppInlayHints . filter ( h => h . inlayHintKind === InlayHintKind . Type ) ;
118
- const paramHints : CppInlayHint [ ] = cppInlayHints . filter ( h => h . inlayHintKind === InlayHintKind . Parameter ) ;
173
+ const newTypeHints : CppInlayHint [ ] = cppInlayHints . filter ( h => h . inlayHintKind === InlayHintKind . Type ) ;
174
+ const newParameterHints : CppInlayHint [ ] = cppInlayHints . filter ( h => h . inlayHintKind === InlayHintKind . Parameter ) ;
175
+ Array . prototype . push . apply ( fileData . typeHints , newTypeHints ) ;
176
+ Array . prototype . push . apply ( fileData . parameterHints , newParameterHints ) ;
119
177
120
- const settings : CppSettings = new CppSettings ( vscode . Uri . parse ( uriString ) ) ;
121
178
if ( settings . inlayHintsAutoDeclarationTypes ) {
122
- const resolvedTypeHints : vscode . InlayHint [ ] = this . resolveTypeHints ( settings , typeHints ) ;
179
+ const resolvedTypeHints : vscode . InlayHint [ ] = this . resolveTypeHints ( settings , newTypeHints ) ;
123
180
Array . prototype . push . apply ( fileData . inlayHints , resolvedTypeHints ) ;
124
181
}
125
182
if ( settings . inlayHintsParameterNames || settings . inlayHintsReferenceOperator ) {
126
- const resolvedParameterHints : vscode . InlayHint [ ] = this . resolveParameterHints ( settings , paramHints ) ;
183
+ const resolvedParameterHints : vscode . InlayHint [ ] = this . resolveParameterHints ( settings , newParameterHints ) ;
127
184
Array . prototype . push . apply ( fileData . inlayHints , resolvedParameterHints ) ;
128
185
}
129
186
0 commit comments