@@ -13,6 +13,7 @@ public class ResolveCommandMatcher : IHandlerMatcher, IHandlerPreProcessorMatche
13
13
{
14
14
private readonly ILogger _logger ;
15
15
internal static string PrivateHandlerTypeName = "$$___handlerType___$$" ;
16
+ internal static string PrivateHandlerKey = "$$___handlerKey___$$" ;
16
17
17
18
public ResolveCommandMatcher ( ILogger logger )
18
19
{
@@ -30,10 +31,15 @@ public IEnumerable<ILspHandlerDescriptor> FindHandler(object parameters, IEnumer
30
31
if ( parameters is ICanBeResolved canBeResolved )
31
32
{
32
33
string handlerType = null ;
34
+ string handlerKey = null ;
33
35
if ( canBeResolved . Data != null && canBeResolved . Data . Type == JTokenType . Object )
36
+ {
34
37
handlerType = canBeResolved . Data ? [ PrivateHandlerTypeName ] ? . ToString ( ) ;
38
+ handlerKey = canBeResolved . Data ? [ PrivateHandlerKey ] ? . ToString ( ) ;
39
+ }
35
40
36
- if ( string . IsNullOrWhiteSpace ( handlerType ) )
41
+ if ( string . IsNullOrWhiteSpace ( handlerType ) &&
42
+ string . IsNullOrWhiteSpace ( handlerKey ) )
37
43
{
38
44
foreach ( var descriptor in descriptors )
39
45
{
@@ -65,7 +71,8 @@ public IEnumerable<ILspHandlerDescriptor> FindHandler(object parameters, IEnumer
65
71
_logger . LogTrace ( "Checking handler {Method}:{Handler}" ,
66
72
descriptor . Method ,
67
73
descriptor . Handler . GetType ( ) . FullName ) ;
68
- if ( descriptor . Handler . GetType ( ) . FullName == handlerType || descriptor . HandlerType . FullName == handlerType )
74
+ if ( ( descriptor . Handler . GetType ( ) . FullName == handlerType || descriptor . HandlerType . FullName == handlerType ) &&
75
+ ( ( descriptor is HandlerDescriptor handlerDescriptor ) && handlerDescriptor . Key == handlerKey ) )
69
76
{
70
77
yield return descriptor ;
71
78
}
@@ -120,8 +127,11 @@ public object Process(ILspHandlerDescriptor descriptor, object parameters)
120
127
121
128
public object Process ( ILspHandlerDescriptor descriptor , object parameters , object response )
122
129
{
130
+ var registrationOptions = descriptor . Registration . RegisterOptions as TextDocumentRegistrationOptions ;
131
+
123
132
// Only pin the handler type, if we know the source handler (codelens) is also the resolver.
124
- if ( response is IEnumerable < ICanBeResolved > canBeResolveds &&
133
+ if ( registrationOptions ? . DocumentSelector != null &&
134
+ response is IEnumerable < ICanBeResolved > canBeResolveds &&
125
135
descriptor ? . CanBeResolvedHandlerType ? . GetTypeInfo ( ) . IsAssignableFrom ( descriptor . Handler . GetType ( ) ) == true )
126
136
{
127
137
_logger . LogTrace ( "Updating Resolve items with wrapped data for {Method}:{Handler}" ,
@@ -135,6 +145,7 @@ public object Process(ILspHandlerDescriptor descriptor, object parameters, objec
135
145
var data = new JObject ( ) ;
136
146
data [ "data" ] = item . Data ;
137
147
data [ PrivateHandlerTypeName ] = descriptor . Handler . GetType ( ) . FullName ;
148
+ data [ PrivateHandlerKey ] = registrationOptions . DocumentSelector . ToString ( ) ;
138
149
item . Data = data ;
139
150
}
140
151
}
0 commit comments