diff --git a/builtin.py b/builtin.py index ab81ad70..938b8fcd 100644 --- a/builtin.py +++ b/builtin.py @@ -2,6 +2,7 @@ import re import sys import os import types +import io import inspect import debug @@ -71,7 +72,7 @@ class Parser(CachedModule): } if sys.hexversion >= 0x03000000: - map_types['file object'] = 'import io; return io.TextWrapper(file)' + map_types['file object'] = 'import io; return io.TextIOWrapper(file)' module_cache = {} @@ -244,7 +245,11 @@ class Parser(CachedModule): # variables for name, value in stmts.items(): - if type(value) == types.FileType: + if sys.hexversion >= 0x03000000: + file_type = io.TextIOWrapper + else: + file_type = types.FileType + if type(value) == file_type: value = 'open()' elif type(value).__name__ in ['int', 'bool', 'float', 'dict', 'list', 'tuple']: diff --git a/parsing.py b/parsing.py index 26aff7be..ac996367 100644 --- a/parsing.py +++ b/parsing.py @@ -32,6 +32,7 @@ from _compatibility import next, literal_eval, tokenize_func, BytesIO import tokenize import re +import keyword import debug @@ -1007,9 +1008,18 @@ class PyFuzzyParser(object): :rtype: list """ imports = [] + brackets = False + continue_kw = [",", ";", "\n", ')'] \ + + list(set(keyword.kwlist) - set(['as'])) while True: + token_type, tok, indent = self.next() + if brackets and tok == '\n': + self.next() + if tok == '(': # python allows only one `(` in the statement. + brackets = True + self.next() name, token_type, tok, start_indent, start_line = \ - self._parsedotname() + self._parsedotname(self.current) if not name: break name2 = None @@ -1019,9 +1029,9 @@ class PyFuzzyParser(object): name2 = Name(name2, start_indent2, start_line, self.line_nr) i = Name(name, start_indent, start_line, self.line_nr) imports.append((i, name2)) - while tok not in [",", ";", "\n"]: + while tok not in continue_kw: token_type, tok, indent = self.next() - if tok != ",": + if not (tok == "," or brackets and tok == '\n'): break return imports diff --git a/test/completion/imports.py b/test/completion/imports.py index f99e6493..5f7bde35 100644 --- a/test/completion/imports.py +++ b/test/completion/imports.py @@ -14,6 +14,23 @@ import os #? ['dirname'] os.path.dirname +from itertools import (tee, + islice) +#? ['islice'] +islice + +from functools import (partial, wraps) +#? ['wraps'] +wraps + +from keyword import kwlist, \ + iskeyword +#? ['kwlist'] +kwlist + +from tokenize import io +tokenize.generate_tokens + # ----------------- # builtins # ----------------- diff --git a/test/completion/invalid.py b/test/completion/invalid.py index 57b4b00d..f8462d97 100644 --- a/test/completion/invalid.py +++ b/test/completion/invalid.py @@ -1,3 +1,6 @@ +from a import (b +def blub(): + return 0 def openbrace(): asdf = 3 asdf