diff --git a/evaluate.py b/evaluate.py index 70f7ffe9..36fb0009 100644 --- a/evaluate.py +++ b/evaluate.py @@ -35,7 +35,7 @@ def get_defined_names_for_position(obj, position): return names names_new = [] for n in names: - if (n.line_nr, n.indent) <= position: + if (n.line_nr, n.indent) < position: names_new.append(n) return names_new @@ -167,6 +167,14 @@ class Instance(Executable): if isinstance(var.parent, (parsing.Function)): var = InstanceElement(self, var) names.append(var) + + # check super classes: + for s in self.base.supers: + for cls in follow_statement(s): + # get the inherited names + for i in Instance(cls).get_defined_names(): + if not i.in_iterable(names): + names.append(i) return names def parent(self): diff --git a/ftest.py b/ftest.py index 3ded0335..a6945312 100755 --- a/ftest.py +++ b/ftest.py @@ -15,7 +15,7 @@ path = os.path.join(os.getcwd(), f_name) f = open(path) code = f.read() for i in range(1): - completions = functions.complete(code, 160, 200, path) + completions = functions.complete(code, 180, 200, path) #completions = functions.complete(code, 42, 200, path) print '\n', ', '.join(sorted(str(c) for c in completions)) diff --git a/parsetest.py b/parsetest.py index 21448793..bb88502c 100644 --- a/parsetest.py +++ b/parsetest.py @@ -154,8 +154,27 @@ flow_test.; a12, (b12, c12) = (1,(list, "")); b12. def globalfunc(): global globalvar, globalvar2 globalvar = 3 -a8 = 3 -a8 = tuple -# completion: -a8. -a8=list +a = 3; b = "" +b,a=a,b +a. + +class SuperClass(object): + super_class = 3 + def __init__(self): + self.super_var = '' + def super_method(self) + self.super_var2 = list +class Mixin(SuperClass): + def super_method(self): + return int +class SubClass(Mixin, SuperClass): + sub_class = 3 + def __init__(self): + self.sub_var = '' + def sub_method(self): + self.sub_var2 = list + return tuple +instance = SubClass() + + +instance. diff --git a/parsing.py b/parsing.py index 0dfb761e..26b0aad4 100644 --- a/parsing.py +++ b/parsing.py @@ -884,6 +884,13 @@ class Name(Simple): """ Returns the names in a full string format """ return ".".join(self.names) + def in_iterable(self, iterable): + for i in iterable: + if i.names == self.names: + return True + return False + + def __str__(self): return self.get_code() diff --git a/test/completion/classes.py b/test/completion/classes.py index 6a7031f5..b44e4a09 100644 --- a/test/completion/classes.py +++ b/test/completion/classes.py @@ -92,3 +92,42 @@ strs.second.upper #? ['var_class'] TestClass.var_class.var_class.var_class.var_class + +# ----------------- +# inheritance +# ----------------- + +class SuperClass(object): + class_super = 3 + def __init__(self): + self.var_super = '' + def method_super(self): + self.var2_super = list + +class Mixin(SuperClass): + def method_super(self): + return int + +class SubClass(SuperClass): + class_sub = 3 + def __init__(self): + self.var_sub = '' + def method_sub(self): + self.var_sub = list + return tuple + +instance = SubClass() + +#? ['method_sub', 'method_super'] +instance.method_ +#? ['var2_super', 'var_sub', 'var_super'] +instance.var +#? ['class_sub', 'class_super'] +instance.class_ + +#? ['method_sub', 'method_super'] +SubClass.method_ +#? [] +SubClass.var +#? ['class_sub', 'class_super'] +SubClass.class_ diff --git a/test/completion/ordering.py b/test/completion/ordering.py index 408de135..29c0db25 100644 --- a/test/completion/ordering.py +++ b/test/completion/ordering.py @@ -13,11 +13,24 @@ a.append a = list -b ="";b=1 +b = 1; b = "" +#? ['upper'] +b.upper +#? [] +b.real + +a = 1 +temp = b; +b = a +a = temp #? ['real'] b.real #? [] b.upper +#? [] +a.real +#? ['upper'] +a.upper # ----------------- # tuples exchanges @@ -42,6 +55,15 @@ a.real #? ['upper'] a.upper +b, a = a, b +#? ['real'] +a.real +#? [] +a.upper +#? [] +b.real +#? ['upper'] +b.upper # ----------------- # function stuff