1
1
using System ;
2
2
using System . Collections . Generic ;
3
+ using System . Collections . Immutable ;
3
4
using System . Linq ;
4
5
using System . Reflection ;
5
6
using Newtonsoft . Json ;
6
7
using Newtonsoft . Json . Serialization ;
7
8
using OmniSharp . Extensions . LanguageServer . Protocol . Client . Capabilities ;
8
9
using OmniSharp . Extensions . LanguageServer . Protocol . Models ;
10
+ using OmniSharp . Extensions . LanguageServer . Protocol . Models . Proposals ;
9
11
10
12
#pragma warning disable 618
11
13
12
14
namespace OmniSharp . Extensions . LanguageServer . Protocol . Serialization
13
15
{
14
16
internal class LspContractResolver : DefaultContractResolver
15
17
{
16
- private readonly CompletionItemKind [ ] _completionItemKinds ;
17
- private readonly CompletionItemTag [ ] _completionItemTags ;
18
- private readonly SymbolKind [ ] _documentSymbolKinds ;
19
- private readonly SymbolKind [ ] _workspaceSymbolKinds ;
20
- private readonly SymbolTag [ ] _documentSymbolTags ;
21
- private readonly SymbolTag [ ] _workspaceSymbolTags ;
22
- private readonly DiagnosticTag [ ] _diagnosticTags ;
23
- private readonly CodeActionKind [ ] _codeActionKinds ;
18
+ private readonly ImmutableArray < CompletionItemKind > _completionItemKinds ;
19
+ private readonly ImmutableArray < CompletionItemTag > _completionItemTags ;
20
+ private readonly ImmutableArray < SymbolKind > _documentSymbolKinds ;
21
+ private readonly ImmutableArray < SymbolKind > _workspaceSymbolKinds ;
22
+ private readonly ImmutableArray < SymbolTag > _documentSymbolTags ;
23
+ private readonly ImmutableArray < SymbolTag > _workspaceSymbolTags ;
24
+ private readonly ImmutableArray < DiagnosticTag > _diagnosticTags ;
25
+ private readonly ImmutableArray < CodeActionKind > _codeActionKinds ;
26
+ private readonly ImmutableArray < SemanticTokenType > _semanticTokenType ;
27
+ private readonly ImmutableArray < SemanticTokenModifier > _semanticTokenModifier ;
24
28
25
29
public LspContractResolver (
26
- CompletionItemKind [ ] completionItemKinds ,
27
- CompletionItemTag [ ] completionItemTags ,
28
- SymbolKind [ ] documentSymbolKinds ,
29
- SymbolKind [ ] workspaceSymbolKinds ,
30
- SymbolTag [ ] documentSymbolTags ,
31
- SymbolTag [ ] workspaceSymbolTags ,
32
- DiagnosticTag [ ] diagnosticTags ,
33
- CodeActionKind [ ] codeActionKinds
30
+ ImmutableArray < CompletionItemKind > completionItemKinds ,
31
+ ImmutableArray < CompletionItemTag > completionItemTags ,
32
+ ImmutableArray < SymbolKind > documentSymbolKinds ,
33
+ ImmutableArray < SymbolKind > workspaceSymbolKinds ,
34
+ ImmutableArray < SymbolTag > documentSymbolTags ,
35
+ ImmutableArray < SymbolTag > workspaceSymbolTags ,
36
+ ImmutableArray < DiagnosticTag > diagnosticTags ,
37
+ ImmutableArray < CodeActionKind > codeActionKinds ,
38
+ ImmutableArray < SemanticTokenType > semanticTokenType ,
39
+ ImmutableArray < SemanticTokenModifier > semanticTokenModifier
34
40
)
35
41
{
36
42
_completionItemKinds = completionItemKinds ;
@@ -41,6 +47,8 @@ CodeActionKind[] codeActionKinds
41
47
_workspaceSymbolTags = workspaceSymbolTags ;
42
48
_diagnosticTags = diagnosticTags ;
43
49
_codeActionKinds = codeActionKinds ;
50
+ _semanticTokenType = semanticTokenType ;
51
+ _semanticTokenModifier = semanticTokenModifier ;
44
52
NamingStrategy = new CamelCaseNamingStrategy ( true , false , true ) ;
45
53
}
46
54
@@ -83,13 +91,13 @@ protected override JsonProperty CreateProperty(MemberInfo member, MemberSerializ
83
91
84
92
if ( property . DeclaringType == typeof ( CompletionItem ) )
85
93
{
86
- if ( property . PropertyType == typeof ( CompletionItemKind ) )
94
+ if ( property . PropertyType == typeof ( CompletionItemKind ) && _completionItemKinds is { Length : > 0 } )
87
95
{
88
96
property . ValueProvider =
89
97
new RangeValueProvider < CompletionItemKind > ( property . ValueProvider , _completionItemKinds ) ;
90
98
}
91
99
92
- if ( property . PropertyType == typeof ( Container < CompletionItemTag > ) )
100
+ if ( property . PropertyType == typeof ( Container < CompletionItemTag > ) && _completionItemTags is { Length : > 0 } )
93
101
{
94
102
property . ValueProvider =
95
103
new ArrayRangeValueProvider < CompletionItemTag > ( property . ValueProvider , _completionItemTags ) ;
@@ -98,13 +106,13 @@ protected override JsonProperty CreateProperty(MemberInfo member, MemberSerializ
98
106
99
107
if ( property . DeclaringType == typeof ( DocumentSymbol ) )
100
108
{
101
- if ( property . PropertyType == typeof ( SymbolKind ) )
109
+ if ( property . PropertyType == typeof ( SymbolKind ) && _documentSymbolKinds is { Length : > 0 } )
102
110
{
103
111
property . ValueProvider =
104
112
new RangeValueProvider < SymbolKind > ( property . ValueProvider , _documentSymbolKinds ) ;
105
113
}
106
114
107
- if ( property . PropertyType == typeof ( Container < SymbolTag > ) )
115
+ if ( property . PropertyType == typeof ( Container < SymbolTag > ) && _documentSymbolTags is { Length : > 0 } )
108
116
{
109
117
property . ValueProvider =
110
118
new ArrayRangeValueProvider < SymbolTag > ( property . ValueProvider , _documentSymbolTags ) ;
@@ -113,7 +121,7 @@ protected override JsonProperty CreateProperty(MemberInfo member, MemberSerializ
113
121
114
122
if ( property . DeclaringType == typeof ( Diagnostic ) )
115
123
{
116
- if ( property . PropertyType == typeof ( Container < DiagnosticTag > ) )
124
+ if ( property . PropertyType == typeof ( Container < DiagnosticTag > ) && _diagnosticTags is { Length : > 0 } )
117
125
{
118
126
property . ValueProvider =
119
127
new ArrayRangeValueProvider < DiagnosticTag > ( property . ValueProvider , _diagnosticTags ) ;
@@ -122,7 +130,7 @@ protected override JsonProperty CreateProperty(MemberInfo member, MemberSerializ
122
130
123
131
if ( property . DeclaringType == typeof ( CodeAction ) )
124
132
{
125
- if ( property . PropertyType == typeof ( CodeActionKind ) )
133
+ if ( property . PropertyType == typeof ( CodeActionKind ) && _codeActionKinds is { Length : > 0 } )
126
134
{
127
135
property . ValueProvider =
128
136
new RangeValueProvider < CodeActionKind > ( property . ValueProvider , _codeActionKinds ) ;
@@ -131,19 +139,33 @@ protected override JsonProperty CreateProperty(MemberInfo member, MemberSerializ
131
139
132
140
if ( property . DeclaringType == typeof ( SymbolInformation ) )
133
141
{
134
- if ( property . PropertyType == typeof ( SymbolKind ) )
142
+ if ( property . PropertyType == typeof ( SymbolKind ) && _workspaceSymbolKinds is { Length : > 0 } )
135
143
{
136
144
property . ValueProvider =
137
145
new RangeValueProvider < SymbolKind > ( property . ValueProvider , _workspaceSymbolKinds ) ;
138
146
}
139
147
140
- if ( property . PropertyType == typeof ( Container < SymbolTag > ) )
148
+ if ( property . PropertyType == typeof ( Container < SymbolTag > ) && _workspaceSymbolTags is { Length : > 0 } )
141
149
{
142
150
property . ValueProvider =
143
151
new ArrayRangeValueProvider < SymbolTag > ( property . ValueProvider , _workspaceSymbolTags ) ;
144
152
}
145
153
}
146
154
155
+ // TODO: Registration needs to be switched around to pass in the capability
156
+ // if (property.DeclaringType == typeof(SemanticTokensLegend))
157
+ // {
158
+ // if (property.PropertyName == nameof(SemanticTokensLegend.TokenModifiers) && _semanticTokenModifier is { Length: > 0 })
159
+ // {
160
+ // property.ValueProvider = new ArrayRangeValueProvider<SemanticTokenModifier>(property.ValueProvider, _semanticTokenModifier);
161
+ // }
162
+ //
163
+ // if (property.PropertyName == nameof(SemanticTokensLegend.TokenTypes) && _semanticTokenType is { Length: > 0 })
164
+ // {
165
+ // property.ValueProvider = new ArrayRangeValueProvider<SemanticTokenType>(property.ValueProvider, _semanticTokenType);
166
+ // }
167
+ // }
168
+
147
169
return property ;
148
170
}
149
171
@@ -165,10 +187,10 @@ private class RangeValueProvider<T> : IValueProvider
165
187
where T : struct
166
188
{
167
189
private readonly IValueProvider _valueProvider ;
168
- private readonly T [ ] _validValues ;
190
+ private readonly ImmutableArray < T > _validValues ;
169
191
private readonly T _defaultValue ;
170
192
171
- public RangeValueProvider ( IValueProvider valueProvider , T [ ] validValues )
193
+ public RangeValueProvider ( IValueProvider valueProvider , ImmutableArray < T > validValues )
172
194
{
173
195
_valueProvider = valueProvider ;
174
196
_validValues = validValues ;
@@ -193,9 +215,9 @@ private class ArrayRangeValueProvider<T> : IValueProvider
193
215
where T : struct
194
216
{
195
217
private readonly IValueProvider _valueProvider ;
196
- private readonly T [ ] _validValues ;
218
+ private readonly ImmutableArray < T > _validValues ;
197
219
198
- public ArrayRangeValueProvider ( IValueProvider valueProvider , T [ ] validValues )
220
+ public ArrayRangeValueProvider ( IValueProvider valueProvider , ImmutableArray < T > validValues )
199
221
{
200
222
_valueProvider = valueProvider ;
201
223
_validValues = validValues ;
0 commit comments