def _PreviousIdentifier(min_num_candidate_size_chars, request_data): def PreviousIdentifierOnLine(line, column, filetype): nearest_ident = '' for match in identifier_utils.IdentifierRegexForFiletype( filetype).finditer(line): if match.end() <= column: nearest_ident = match.group() return nearest_ident line_num = request_data['line_num'] - 1 column_num = request_data['column_codepoint'] - 1 filepath = request_data['filepath'] contents_per_line = (SplitLines( request_data['file_data'][filepath]['contents'])) filetype = request_data['first_filetype'] ident = PreviousIdentifierOnLine(contents_per_line[line_num], column_num, filetype) if ident: if len(ident) < min_num_candidate_size_chars: return '' return ident line_num = line_num - 1 if line_num < 0: return '' prev_line = contents_per_line[line_num] ident = PreviousIdentifierOnLine(prev_line, len(prev_line), filetype) if len(ident) < min_num_candidate_size_chars: return '' return ident
def Range(request_data): filepath = request_data['filepath'] lines = SplitLines(request_data['file_data'][filepath]['contents']) start = request_data['range']['start'] start_line_num = start['line_num'] start_line_value = lines[start_line_num - 1] start_codepoint = ByteOffsetToCodepointOffset(start_line_value, start['column_num']) end = request_data['range']['end'] end_line_num = end['line_num'] end_line_value = lines[end_line_num - 1] end_codepoint = ByteOffsetToCodepointOffset(end_line_value, end['column_num']) # LSP requires to use the start of the next line as the end position for a # range that ends with a newline. if end_codepoint >= len(end_line_value): end_line_num += 1 end_line_value = '' end_codepoint = 1 return { 'start': Position(start_line_num, start_line_value, start_codepoint), 'end': Position(end_line_num, end_line_value, end_codepoint) }
def _GetCursorIdentifier(collect_from_comments_and_strings, request_data): filepath = request_data['filepath'] contents = request_data['file_data'][filepath]['contents'] filetype = request_data['first_filetype'] if not collect_from_comments_and_strings: contents = identifier_utils.RemoveIdentifierFreeText( contents, filetype) contents_per_line = SplitLines(contents) line = contents_per_line[request_data['line_num'] - 1] return identifier_utils.IdentifierAtIndex( line, request_data['column_codepoint'] - 1, filetype)
def _CurrentLine(self): current_file = self._request['filepath'] contents = self._request['file_data'][current_file]['contents'] try: return SplitLines(contents)[self._request['line_num'] - 1] except IndexError: _logger.exception('Client returned invalid line number {0} ' 'for file {1}. Assuming empty.'.format( self._request['line_num'], self._request['filepath'])) return ''
def GetFileLines( request_data, filename ): """Like GetFileContents but return the contents as a list of lines. Avoid splitting the lines if they have already been split for the current file.""" if filename == request_data[ 'filepath' ]: return request_data[ 'lines' ] return SplitLines( GetFileContents( request_data, filename ) )
def _CurrentLines(self): current_file = self['filepath'] contents = self['file_data'][current_file]['contents'] return SplitLines(contents)
def ReplaceWithEmptyLines( regex_match ): return '\n' * ( len( SplitLines( regex_match.group( 0 ) ) ) - 1 )
def _CurrentLine(self): current_file = self._request['filepath'] contents = self._request['file_data'][current_file]['contents'] return SplitLines(contents)[self._request['line_num'] - 1]