1
0
forked from VimPlug/jedi

changing completion of python file objects

This commit is contained in:
Dave Halter
2014-01-12 18:07:58 +01:00
parent 99fe204496
commit 2bde6cde08
5 changed files with 36 additions and 23 deletions

View File

@@ -4,13 +4,13 @@ import os
import time import time
try: try:
if not os.name == 'nt': if os.name == 'nt':
# does not work on Windows, as pyreadline and colorama interfere
raise ImportError
else:
# Use colorama for nicer console output. # Use colorama for nicer console output.
from colorama import Fore, init from colorama import Fore, init
init() init()
# does not work on Windows, as pyreadline and colorama interfere
else:
raise ImportError
except ImportError: except ImportError:
class Fore(object): class Fore(object):
RED = '' RED = ''

View File

@@ -6,7 +6,7 @@ import re
import sys import sys
import os import os
from jedi._compatibility import builtins as _builtins, is_py3k, exec_function from jedi._compatibility import builtins as _builtins, exec_function
from jedi import debug from jedi import debug
from jedi.parser.representation import Base from jedi.parser.representation import Base
from jedi.cache import underscore_memoization from jedi.cache import underscore_memoization
@@ -22,6 +22,7 @@ class PyObject(Base):
# comply with the parser # comply with the parser
start_pos = 0, 0 start_pos = 0, 0
asserts = [] asserts = []
path = None # modules have this attribute - set it to None.
def __init__(self, obj, parent=None): def __init__(self, obj, parent=None):
self.obj = obj self.obj = obj
@@ -183,12 +184,6 @@ docstr_defaults = {
'string': 'str', 'string': 'str',
} }
if is_py3k:
#docstr_defaults['file object'] = 'import io; return io.TextIOWrapper()'
pass # TODO reenable
else:
docstr_defaults['file object'] = 'file'
def _parse_function_doc(doc): def _parse_function_doc(doc):
""" """

View File

@@ -11,6 +11,7 @@ import inspect
from jedi._compatibility import is_py3k, builtins from jedi._compatibility import is_py3k, builtins
from jedi.parser import Parser from jedi.parser import Parser
from jedi.parser.representation import Class from jedi.parser.representation import Class
from jedi.evaluate.helpers import FakeName
modules = {} modules = {}
@@ -76,16 +77,24 @@ def _load_faked_module(module):
except IOError: except IOError:
return return
module = Parser(source, module_name).module module = Parser(source, module_name).module
if module_name == 'builtins' and not is_py3k:
# There are two implementations of `open` for either python 2/3.
# -> Rename the python2 version.
open_func = search_scope(module, 'open')
open_func.name = FakeName('open_python3')
open_func = search_scope(module, 'open_python2')
open_func.name = FakeName('open')
modules[module_name] = module modules[module_name] = module
return module return module
def _faked(module, obj, name=None): def search_scope(scope, obj_name):
def from_scope(scope, obj_name): for s in scope.subscopes:
for s in scope.subscopes: if str(s.name) == obj_name:
if str(s.name) == obj_name: return s
return s
def _faked(module, obj, name=None):
# Crazy underscore actions to try to escape all the internal madness. # Crazy underscore actions to try to escape all the internal madness.
obj = obj.__class__ if is_class_instance(obj) else obj obj = obj.__class__ if is_class_instance(obj) else obj
if module is None: if module is None:
@@ -110,21 +119,21 @@ def _faked(module, obj, name=None):
# for methods. # for methods.
if name is None: if name is None:
if inspect.isbuiltin(obj): if inspect.isbuiltin(obj):
return from_scope(faked_mod, obj.__name__) return search_scope(faked_mod, obj.__name__)
elif not inspect.isclass(obj): elif not inspect.isclass(obj):
# object is a method or descriptor # object is a method or descriptor
cls = from_scope(faked_mod, obj.__objclass__.__name__) cls = search_scope(faked_mod, obj.__objclass__.__name__)
if cls is None: if cls is None:
return return
return from_scope(cls, obj.__name__) return search_scope(cls, obj.__name__)
else: else:
if obj == module: if obj == module:
return from_scope(faked_mod, name) return search_scope(faked_mod, name)
else: else:
cls = from_scope(faked_mod, obj.__name__) cls = search_scope(faked_mod, obj.__name__)
if cls is None: if cls is None:
return return
return from_scope(cls, name) return search_scope(cls, name)
def get_faked(*args, **kwargs): def get_faked(*args, **kwargs):

View File

@@ -1,3 +1,3 @@
class TextIOWrapper(): class TextIOWrapper():
def __next__(self): def __next__(self):
return '' return 'hacked io return'

View File

@@ -45,6 +45,15 @@ class xrange():
return 1 return 1
def open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True):
import io
return io.TextIOWrapper(file, mode, buffering, encoding, errors, newline, closefd)
def open_python2(name, mode=None, buffering=None):
return file(name, mode, buffering)
#-------------------------------------------------------- #--------------------------------------------------------
# descriptors # descriptors
#-------------------------------------------------------- #--------------------------------------------------------