@@ -23,6 +23,13 @@ IEnumerator IEnumerable.GetEnumerator()
2323 return GetEnumerator ( ) ;
2424 }
2525
26+ public IDisposable Add ( string method , IJsonRpcHandler handler )
27+ {
28+ var descriptor = GetDescriptor ( method , handler . GetType ( ) , handler ) ;
29+ _handlers . Add ( descriptor ) ;
30+ return descriptor ;
31+ }
32+
2633 public IDisposable Add ( IEnumerable < IJsonRpcHandler > handlers )
2734 {
2835 return Add ( handlers . ToArray ( ) ) ;
@@ -33,40 +40,12 @@ public IDisposable Add(params IJsonRpcHandler[] handlers)
3340 var descriptors = new HashSet < HandlerDescriptor > ( ) ;
3441 foreach ( var handler in handlers )
3542 {
36- foreach ( var implementedInterface in handler . GetType ( ) . GetTypeInfo ( )
43+ foreach ( var ( method , implementedInterface ) in handler . GetType ( ) . GetTypeInfo ( )
3744 . ImplementedInterfaces
38- . Where ( x => ! string . IsNullOrWhiteSpace ( LspHelper . GetMethodName ( x ) ) ) )
45+ . Select ( x => ( method : LspHelper . GetMethodName ( x ) , implementedInterface : x ) )
46+ . Where ( x => ! string . IsNullOrWhiteSpace ( x . method ) ) )
3947 {
40- var @interface = HandlerTypeHelpers . GetHandlerInterface ( implementedInterface ) ;
41- var registration = UnwrapGenericType ( typeof ( IRegistration < > ) , implementedInterface ) ;
42- var capability = UnwrapGenericType ( typeof ( ICapability < > ) , implementedInterface ) ;
43-
44- Type @params = null ;
45- if ( @interface . GetTypeInfo ( ) . IsGenericType )
46- {
47- @params = @interface . GetTypeInfo ( ) . GetGenericArguments ( ) [ 0 ] ;
48- }
49-
50- var key = "default" ;
51- if ( handler is IRegistration < TextDocumentRegistrationOptions > )
52- {
53- if ( GetTextDocumentRegistrationOptionsMethod
54- . MakeGenericMethod ( registration )
55- . Invoke ( handler , new object [ ] { handler } ) is TextDocumentRegistrationOptions options )
56- key = options . DocumentSelector ;
57- }
58-
59- var h = new HandlerDescriptor (
60- LspHelper . GetMethodName ( implementedInterface ) ,
61- key ,
62- handler ,
63- @interface ,
64- @params ,
65- registration ,
66- capability ,
67- ( ) => _handlers . RemoveWhere ( instance => instance . Handler == handler ) ) ;
68-
69- descriptors . Add ( h ) ;
48+ descriptors . Add ( GetDescriptor ( method , implementedInterface , handler ) ) ;
7049 }
7150 }
7251
@@ -78,6 +57,38 @@ public IDisposable Add(params IJsonRpcHandler[] handlers)
7857 return new ImmutableDisposable ( descriptors ) ;
7958 }
8059
60+ private HandlerDescriptor GetDescriptor ( string method , Type implementedType , IJsonRpcHandler handler )
61+ {
62+ var @interface = HandlerTypeHelpers . GetHandlerInterface ( implementedType ) ;
63+ var registration = UnwrapGenericType ( typeof ( IRegistration < > ) , implementedType ) ;
64+ var capability = UnwrapGenericType ( typeof ( ICapability < > ) , implementedType ) ;
65+
66+ Type @params = null ;
67+ if ( @interface . GetTypeInfo ( ) . IsGenericType )
68+ {
69+ @params = @interface . GetTypeInfo ( ) . GetGenericArguments ( ) [ 0 ] ;
70+ }
71+
72+ var key = "default" ;
73+ if ( handler is IRegistration < TextDocumentRegistrationOptions > )
74+ {
75+ if ( GetTextDocumentRegistrationOptionsMethod
76+ . MakeGenericMethod ( registration )
77+ . Invoke ( handler , new object [ ] { handler } ) is TextDocumentRegistrationOptions options )
78+ key = options . DocumentSelector ;
79+ }
80+
81+ return new HandlerDescriptor (
82+ method ,
83+ key ,
84+ handler ,
85+ @interface ,
86+ @params ,
87+ registration ,
88+ capability ,
89+ ( ) => _handlers . RemoveWhere ( instance => instance . Handler == handler ) ) ;
90+ }
91+
8192 private static readonly MethodInfo GetTextDocumentRegistrationOptionsMethod = typeof ( HandlerCollection ) . GetTypeInfo ( )
8293 . GetMethod ( nameof ( GetTextDocumentRegistrationOptions ) , BindingFlags . Static | BindingFlags . NonPublic ) ;
8394
0 commit comments