| 28 | |
| 29 | |
| 30 | class CompletionRequest( BaseRequest ): |
| 31 | def __init__( self, request_data ): |
| 32 | super().__init__() |
| 33 | self.request_data = request_data |
| 34 | self._response_future = None |
| 35 | |
| 36 | |
| 37 | def Start( self ): |
| 38 | self._response_future = self.PostDataToHandlerAsync( self.request_data, |
| 39 | 'completions' ) |
| 40 | |
| 41 | |
| 42 | def Done( self ): |
| 43 | return bool( self._response_future ) and self._response_future.done() |
| 44 | |
| 45 | |
| 46 | def _RawResponse( self ): |
| 47 | if not self._response_future: |
| 48 | return NO_COMPLETIONS |
| 49 | |
| 50 | response = self.HandleFuture( self._response_future, |
| 51 | truncate_message = True ) |
| 52 | if not response: |
| 53 | return NO_COMPLETIONS |
| 54 | |
| 55 | # Vim may not be able to convert the 'errors' entry to its internal format |
| 56 | # so we remove it from the response. |
| 57 | errors = response.pop( 'errors', [] ) |
| 58 | for e in errors: |
| 59 | exception = MakeServerException( e ) |
| 60 | _logger.error( exception ) |
| 61 | DisplayServerException( exception, truncate_message = True ) |
| 62 | |
| 63 | response[ 'line' ] = self.request_data[ 'line_num' ] |
| 64 | response[ 'column' ] = self.request_data[ 'column_num' ] |
| 65 | return response |
| 66 | |
| 67 | |
| 68 | def Response( self ): |
| 69 | response = self._RawResponse() |
| 70 | response[ 'completions' ] = _ConvertCompletionDatasToVimDatas( |
| 71 | response[ 'completions' ] ) |
| 72 | # FIXME: Do we really need to do this AdjustCandidateInsertionText ? I feel |
| 73 | # like Vim should do that for us |
| 74 | response[ 'completions' ] = base.AdjustCandidateInsertionText( |
| 75 | response[ 'completions' ] ) |
| 76 | return response |
| 77 | |
| 78 | |
| 79 | def OnCompleteDone( self ): |
| 80 | if not self.Done(): |
| 81 | return |
| 82 | |
| 83 | if 'cs' in vimsupport.CurrentFiletypes(): |
| 84 | self._OnCompleteDone_Csharp() |
| 85 | else: |
| 86 | self._OnCompleteDone_FixIt() |
| 87 |
no outgoing calls