@@ -1829,41 +1829,72 @@ impl LanguageClient {
18291829 return Ok ( Value :: Null ) ;
18301830 }
18311831
1832- info ! ( "Begin {}" , lsp:: request:: CodeLensRequest :: METHOD ) ;
18331832 let filename = self . vim ( ) ?. get_filename ( params) ?;
18341833 let language_id = self . vim ( ) ?. get_languageId ( & filename, params) ?;
1835- let client = self . get_client ( & Some ( language_id) ) ?;
1836- let input = lsp:: CodeLensParams {
1837- text_document : TextDocumentIdentifier {
1838- uri : filename. to_url ( ) ?,
1839- } ,
1840- } ;
1834+ let capabilities = self . get ( |state| state. capabilities . clone ( ) ) ?;
1835+ if let Some ( initialize_result) = capabilities. get ( & language_id) {
1836+ // XXX: the capabilities state field stores the initialize result, not the capabilities
1837+ // themselves, so we need to deserialize to InitializeResult.
1838+ let initialize_result: InitializeResult =
1839+ serde_json:: from_value ( initialize_result. clone ( ) ) ?;
1840+ let capabilities = initialize_result. capabilities ;
1841+ if capabilities. code_lens_provider . is_some ( ) {
1842+ info ! ( "Begin {}" , lsp:: request:: CodeLensRequest :: METHOD ) ;
1843+ let client = self . get_client ( & Some ( language_id) ) ?;
1844+ let input = lsp:: CodeLensParams {
1845+ text_document : TextDocumentIdentifier {
1846+ uri : filename. to_url ( ) ?,
1847+ } ,
1848+ } ;
18411849
1842- let results: Value = client. call ( lsp:: request:: CodeLensRequest :: METHOD , & input) ?;
1850+ let results: Value = client. call ( lsp:: request:: CodeLensRequest :: METHOD , & input) ?;
1851+ let code_lens: Option < Vec < CodeLens > > = serde_json:: from_value ( results. clone ( ) ) ?;
18431852
1844- let code_lens: Option < Vec < CodeLens > > = serde_json:: from_value ( results. clone ( ) ) ?;
1845- let mut resolved_code_lens = vec ! [ ] ;
1846- if let Some ( code_lens) = code_lens {
1847- for item in code_lens {
1848- let mut item = item;
1849- if let Some ( _d) = & item. data {
1850- if let Some ( cl) = client. call ( lsp:: request:: CodeLensResolve :: METHOD , & item) ? {
1851- item = cl;
1853+ if capabilities
1854+ . code_lens_provider
1855+ . unwrap ( )
1856+ . resolve_provider
1857+ . is_some ( )
1858+ {
1859+ let mut resolved_code_lens = vec ! [ ] ;
1860+ if let Some ( code_lens) = code_lens {
1861+ for item in code_lens {
1862+ let mut item = item;
1863+ if let Some ( _d) = & item. data {
1864+ if let Some ( cl) =
1865+ client. call ( lsp:: request:: CodeLensResolve :: METHOD , & item) ?
1866+ {
1867+ item = cl;
1868+ }
1869+ }
1870+ resolved_code_lens. push ( item) ;
1871+ }
18521872 }
1873+
1874+ self . update ( |state| {
1875+ state
1876+ . code_lens
1877+ . insert ( filename. to_owned ( ) , resolved_code_lens) ;
1878+ Ok ( Value :: Null )
1879+ } ) ?;
1880+ } else if let Some ( code_lens) = code_lens {
1881+ self . update ( |state| {
1882+ state. code_lens . insert ( filename. to_owned ( ) , code_lens) ;
1883+ Ok ( Value :: Null )
1884+ } ) ?;
18531885 }
1854- resolved_code_lens. push ( item) ;
1886+
1887+ info ! ( "End {}" , lsp:: request:: CodeLensRequest :: METHOD ) ;
1888+ return Ok ( results) ;
1889+ } else {
1890+ info ! (
1891+ "CodeLens not supported. Skipping {}" ,
1892+ lsp:: request:: CodeLensRequest :: METHOD
1893+ ) ;
18551894 }
18561895 }
18571896
1858- self . update ( |state| {
1859- state
1860- . code_lens
1861- . insert ( filename. to_owned ( ) , resolved_code_lens) ;
1862- Ok ( Value :: Null )
1863- } ) ?;
1864-
1865- info ! ( "End {}" , lsp:: request:: CodeLensRequest :: METHOD ) ;
1866- Ok ( results)
1897+ Ok ( Value :: Null )
18671898 }
18681899
18691900 pub fn textDocument_didOpen ( & self , params : & Value ) -> Fallible < ( ) > {
0 commit comments