##// END OF EJS Templates
added @Carreau's suggestion
added @Carreau's suggestion

File last commit:

r11009:e16cf2f8
r11777:d0c201cd
Show More
completion_lexer.py
74 lines | 2.4 KiB | text/x-python | PythonLexer
/ IPython / qt / console / completion_lexer.py
epatters
Initial checkin of Qt frontend code.
r2602 # System library imports
from pygments.token import Token, is_token_subtype
class CompletionLexer(object):
Bernardo B. Marques
remove all trailling spaces
r4872 """ Uses Pygments and some auxillary information to lex code snippets for
epatters
Initial checkin of Qt frontend code.
r2602 symbol contexts.
"""
# Maps Lexer names to a list of possible name separators
separator_map = { 'C' : [ '.', '->' ],
'C++' : [ '.', '->', '::' ],
'Python' : [ '.' ] }
def __init__(self, lexer):
epatters
* Fixed bug in CompletionLexer where a context would be generated for, e.g, 'foo('....
r2640 """ Create a CompletionLexer using the specified Pygments lexer.
"""
epatters
Initial checkin of Qt frontend code.
r2602 self.lexer = lexer
def get_context(self, string):
""" Assuming the cursor is at the end of the specified string, get the
context (a list of names) for the symbol at cursor position.
"""
context = []
reversed_tokens = list(self._lexer.get_tokens(string))
reversed_tokens.reverse()
epatters
* Fixed bug in CompletionLexer where a context would be generated for, e.g, 'foo('....
r2640 # Pygments often tacks on a newline when none is specified in the input.
# Remove this newline.
epatters
Initial checkin of Qt frontend code.
r2602 if reversed_tokens and reversed_tokens[0][1].endswith('\n') and \
not string.endswith('\n'):
reversed_tokens.pop(0)
Bernardo B. Marques
remove all trailling spaces
r4872
epatters
Made use of plain text consistent.
r2720 current_op = ''
epatters
Initial checkin of Qt frontend code.
r2602 for token, text in reversed_tokens:
epatters
* Fixed bug in CompletionLexer where a context would be generated for, e.g, 'foo('....
r2640
if is_token_subtype(token, Token.Name):
# Handle a trailing separator, e.g 'foo.bar.'
if current_op in self._name_separators:
if not context:
epatters
Made use of plain text consistent.
r2720 context.insert(0, '')
epatters
* Fixed bug in CompletionLexer where a context would be generated for, e.g, 'foo('....
r2640
# Handle non-separator operators and punction.
elif current_op:
break
epatters
Initial checkin of Qt frontend code.
r2602 context.insert(0, text)
epatters
Made use of plain text consistent.
r2720 current_op = ''
epatters
* Fixed bug in CompletionLexer where a context would be generated for, e.g, 'foo('....
r2640
# Pygments doesn't understand that, e.g., '->' is a single operator
# in C++. This is why we have to build up an operator from
# potentially several tokens.
epatters
Initial checkin of Qt frontend code.
r2602 elif token is Token.Operator or token is Token.Punctuation:
current_op = text + current_op
epatters
* Fixed bug in CompletionLexer where a context would be generated for, e.g, 'foo('....
r2640
# Break on anything that is not a Operator, Punctuation, or Name.
epatters
Initial checkin of Qt frontend code.
r2602 else:
break
return context
def get_lexer(self, lexer):
return self._lexer
def set_lexer(self, lexer, name_separators=None):
self._lexer = lexer
if name_separators is None:
self._name_separators = self.separator_map.get(lexer.name, ['.'])
else:
self._name_separators = list(name_separators)
lexer = property(get_lexer, set_lexer)
Bernardo B. Marques
remove all trailling spaces
r4872