diff options
Diffstat (limited to 'python/helpers/pydev/_pydev_jy_imports_tipper.py')
-rw-r--r-- | python/helpers/pydev/_pydev_jy_imports_tipper.py | 170 |
1 files changed, 86 insertions, 84 deletions
diff --git a/python/helpers/pydev/_pydev_jy_imports_tipper.py b/python/helpers/pydev/_pydev_jy_imports_tipper.py index 43e4d0b67140..1691e3e1f1dc 100644 --- a/python/helpers/pydev/_pydev_jy_imports_tipper.py +++ b/python/helpers/pydev/_pydev_jy_imports_tipper.py @@ -1,7 +1,5 @@ import StringIO import traceback -from java.lang import StringBuffer #@UnresolvedImport -from java.lang import String #@UnresolvedImport import java.lang #@UnresolvedImport import sys from _pydev_tipper_common import DoFind @@ -14,12 +12,16 @@ except NameError: # version < 2.3 -- didn't have the True/False builtins import __builtin__ setattr(__builtin__, 'True', 1) setattr(__builtin__, 'False', 0) - - + + from org.python.core import PyReflectedFunction #@UnresolvedImport from org.python import core #@UnresolvedImport -from org.python.core import PyClass #@UnresolvedImport + +try: + xrange +except: + xrange = range #completion types. @@ -48,11 +50,11 @@ def Find(name): name = 'org.python.core.PyString' elif name == '__builtin__.dict': name = 'org.python.core.PyDictionary' - + mod = _imp(name) parent = mod foundAs = '' - + if hasattr(mod, '__file__'): f = mod.__file__ @@ -68,29 +70,29 @@ def Find(name): except AttributeError: if old_comp != comp: raise - + if hasattr(mod, '__file__'): f = mod.__file__ else: if len(foundAs) > 0: foundAs = foundAs + '.' foundAs = foundAs + comp - + old_comp = comp - + return f, mod, parent, foundAs def formatParamClassName(paramClassName): if paramClassName.startswith('['): if paramClassName == '[C': paramClassName = 'char[]' - + elif paramClassName == '[B': paramClassName = 'byte[]' - + elif paramClassName == '[I': paramClassName = 'int[]' - + elif paramClassName.startswith('[L') and paramClassName.endswith(';'): paramClassName = paramClassName[2:-1] paramClassName += '[]' @@ -101,17 +103,17 @@ def GenerateTip(data, log=None): data = data.replace('\n', '') if data.endswith('.'): data = data.rstrip('.') - + f, mod, parent, foundAs = Find(data) tips = GenerateImportsTipForModule(mod) return f, tips - + #======================================================================================================================= # Info #======================================================================================================================= class Info: - + def __init__(self, name, **kwargs): self.name = name self.doc = kwargs.get('doc', None) @@ -119,47 +121,47 @@ class Info: self.varargs = kwargs.get('varargs', None) #string self.kwargs = kwargs.get('kwargs', None) #string self.ret = kwargs.get('ret', None) #string - + def basicAsStr(self): '''@returns this class information as a string (just basic format) ''' - + s = 'function:%s args=%s, varargs=%s, kwargs=%s, docs:%s' % \ (str(self.name), str(self.args), str(self.varargs), str(self.kwargs), str(self.doc)) return s - + def getAsDoc(self): s = str(self.name) if self.doc: s += '\n@doc %s\n' % str(self.doc) - + if self.args: s += '\n@params ' for arg in self.args: s += str(formatParamClassName(arg)) s += ' ' - + if self.varargs: s += '\n@varargs ' s += str(self.varargs) - + if self.kwargs: s += '\n@kwargs ' s += str(self.kwargs) - + if self.ret: s += '\n@return ' s += str(formatParamClassName(str(self.ret))) - + return str(s) - + def isclass(cls): return isinstance(cls, core.PyClass) def ismethod(func): '''this function should return the information gathered on a function - + @param func: this is the function we want to get info on @return a tuple where: 0 = indicates whether the parameter passed is a method or not @@ -167,24 +169,24 @@ def ismethod(func): this is a list because when we have methods from java with the same name and different signatures, we actually have many methods, each with its own set of arguments ''' - + try: if isinstance(func, core.PyFunction): #ok, this is from python, created by jython #print_ ' PyFunction' - + def getargs(func_code): """Get information about the arguments accepted by a code object. - + Three things are returned: (args, varargs, varkw), where 'args' is a list of argument names (possibly containing nested lists), and 'varargs' and 'varkw' are the names of the * and ** arguments or None.""" - + nargs = func_code.co_argcount names = func_code.co_varnames args = list(names[:nargs]) step = 0 - + varargs = None if func_code.co_flags & func_code.CO_VARARGS: varargs = func_code.co_varnames[nargs] @@ -193,35 +195,35 @@ def ismethod(func): if func_code.co_flags & func_code.CO_VARKEYWORDS: varkw = func_code.co_varnames[nargs] return args, varargs, varkw - + args = getargs(func.func_code) return 1, [Info(func.func_name, args=args[0], varargs=args[1], kwargs=args[2], doc=func.func_doc)] - + if isinstance(func, core.PyMethod): #this is something from java itself, and jython just wrapped it... - + #things to play in func: #['__call__', '__class__', '__cmp__', '__delattr__', '__dir__', '__doc__', '__findattr__', '__name__', '_doget', 'im_class', #'im_func', 'im_self', 'toString'] #print_ ' PyMethod' #that's the PyReflectedFunction... keep going to get it func = func.im_func - + if isinstance(func, PyReflectedFunction): #this is something from java itself, and jython just wrapped it... - + #print_ ' PyReflectedFunction' - + infos = [] - for i in range(len(func.argslist)): + for i in xrange(len(func.argslist)): #things to play in func.argslist[i]: - + #'PyArgsCall', 'PyArgsKeywordsCall', 'REPLACE', 'StandardCall', 'args', 'compare', 'compareTo', 'data', 'declaringClass' #'flags', 'isStatic', 'matches', 'precedence'] - + #print_ ' ', func.argslist[i].data.__class__ #func.argslist[i].data.__class__ == java.lang.reflect.Method - + if func.argslist[i]: met = func.argslist[i].data name = met.getName() @@ -230,9 +232,9 @@ def ismethod(func): except AttributeError: ret = '' parameterTypes = met.getParameterTypes() - + args = [] - for j in range(len(parameterTypes)): + for j in xrange(len(parameterTypes)): paramTypesClass = parameterTypes[j] try: try: @@ -246,7 +248,7 @@ def ismethod(func): except: paramClassName = repr(paramTypesClass) #just in case something else happens... it will at least be visible #if the parameter equals [C, it means it it a char array, so, let's change it - + a = formatParamClassName(paramClassName) #a = a.replace('[]','Array') #a = a.replace('Object', 'obj') @@ -255,18 +257,18 @@ def ismethod(func): #a = a.replace('Char', 'c') #a = a.replace('Double', 'd') args.append(a) #so we don't leave invalid code - - + + info = Info(name, args=args, ret=ret) #print_ info.basicAsStr() infos.append(info) - + return 1, infos - except Exception, e: + except Exception: s = StringIO.StringIO() traceback.print_exc(file=s) return 1, [Info(str('ERROR'), doc=s.getvalue())] - + return 0, None def ismodule(mod): @@ -274,7 +276,7 @@ def ismodule(mod): if not hasattr(mod, 'getClass') and not hasattr(mod, '__class__') \ and hasattr(mod, '__name__'): return 1 - + return isinstance(mod, core.PyModule) @@ -293,11 +295,11 @@ def dirObj(obj): except TypeError: #may happen on jython when getting the java.lang.Class class c = obj.getSuperclass(obj) - + while c != None: classes.append(c) c = c.getSuperclass() - + #get info about interfaces interfs = [] for obj in classes: @@ -306,57 +308,57 @@ def dirObj(obj): except TypeError: interfs.extend(obj.getInterfaces(obj)) classes.extend(interfs) - + #now is the time when we actually get info on the declared methods and fields for obj in classes: try: declaredMethods = obj.getDeclaredMethods() except TypeError: declaredMethods = obj.getDeclaredMethods(obj) - + try: declaredFields = obj.getDeclaredFields() except TypeError: declaredFields = obj.getDeclaredFields(obj) - - for i in range(len(declaredMethods)): + + for i in xrange(len(declaredMethods)): name = declaredMethods[i].getName() ret.append(name) found.put(name, 1) - - for i in range(len(declaredFields)): + + for i in xrange(len(declaredFields)): name = declaredFields[i].getName() ret.append(name) found.put(name, 1) - - - elif isclass(obj.__class__): + + + elif isclass(obj.__class__): d = dir(obj.__class__) for name in d: ret.append(name) found.put(name, 1) - + #this simple dir does not always get all the info, that's why we have the part before - #(e.g.: if we do a dir on String, some methods that are from other interfaces such as + #(e.g.: if we do a dir on String, some methods that are from other interfaces such as #charAt don't appear) d = dir(original) for name in d: if found.get(name) != 1: ret.append(name) - + return ret def formatArg(arg): '''formats an argument to be shown ''' - + s = str(arg) dot = s.rfind('.') if dot >= 0: s = s[dot + 1:] - + s = s.replace(';', '') s = s.replace('[]', 'Array') if len(s) > 0: @@ -364,13 +366,13 @@ def formatArg(arg): s = c + s[1:] return s - - - + + + def Search(data): '''@return file, line, col ''' - + data = data.replace('\n', '') if data.endswith('.'): data = data.rstrip('.') @@ -379,8 +381,8 @@ def Search(data): return DoFind(f, mod), foundAs except: return DoFind(f, parent), foundAs - - + + def GenerateImportsTipForModule(obj_to_complete, dirComps=None, getattr=getattr, filter=lambda name:True): ''' @param obj_to_complete: the object from where we should get the completions @@ -391,18 +393,18 @@ def GenerateImportsTipForModule(obj_to_complete, dirComps=None, getattr=getattr, name, doc, args, type (from the TYPE_* constants) ''' ret = [] - + if dirComps is None: dirComps = dirObj(obj_to_complete) - + for d in dirComps: if d is None: continue - + if not filter(d): continue - + args = '' doc = '' retType = TYPE_BUILTIN @@ -421,7 +423,7 @@ def GenerateImportsTipForModule(obj_to_complete, dirComps=None, getattr=getattr, #note: this only happens when we add things to the sys.path at runtime, if they are added to the classpath #before the run, everything goes fine. # - #The code below ilustrates what I mean... + #The code below ilustrates what I mean... # #import sys #sys.path.insert(1, r"C:\bin\eclipse310\plugins\org.junit_3.8.1\junit.jar" ) @@ -429,7 +431,7 @@ def GenerateImportsTipForModule(obj_to_complete, dirComps=None, getattr=getattr, #import junit.framework #print_ dir(junit.framework) #shows the TestCase class here # - #import junit.framework.TestCase + #import junit.framework.TestCase # #raises the error: #Traceback (innermost last): @@ -458,19 +460,19 @@ def GenerateImportsTipForModule(obj_to_complete, dirComps=None, getattr=getattr, except TypeError: traceback.print_exc() args = '()' - + retType = TYPE_FUNCTION - + elif isclass(obj): retType = TYPE_CLASS - + elif ismodule(obj): retType = TYPE_IMPORT - + #add token and doc to return - assure only strings. ret.append((d, doc, args, retType)) - - + + return ret |