diff --git a/jedi/api/__init__.py b/jedi/api/__init__.py index c5f048da..522844ac 100644 --- a/jedi/api/__init__.py +++ b/jedi/api/__init__.py @@ -28,12 +28,12 @@ from jedi.api import classes from jedi.api import interpreter from jedi.api import usages from jedi.api import helpers -from jedi.evaluate import Evaluator, filter_private_variable +from jedi.evaluate import Evaluator from jedi.evaluate import representation as er from jedi.evaluate import compiled from jedi.evaluate import imports from jedi.evaluate.helpers import FakeName, get_module_name_parts -from jedi.evaluate.finder import get_names_of_scope +from jedi.evaluate.finder import get_names_of_scope, filter_private_variable from jedi.evaluate.helpers import search_call_signatures from jedi.evaluate import analysis diff --git a/jedi/evaluate/__init__.py b/jedi/evaluate/__init__.py index 8a7ac03f..52ded108 100644 --- a/jedi/evaluate/__init__.py +++ b/jedi/evaluate/__init__.py @@ -485,19 +485,3 @@ class Evaluator(object): follow_res += self.find_types(s, search_name_part, pos, search_global=search_global, is_goto=True) return follow_res - - -def filter_private_variable(scope, call_scope, var_name): - """private variables begin with a double underline `__`""" - var_name = str(var_name) # var_name could be a Name - if isinstance(var_name, (str, unicode)) and isinstance(scope, er.Instance)\ - and var_name.startswith('__') and not var_name.endswith('__'): - s = call_scope.get_parent_until((pr.Class, er.Instance, compiled.CompiledObject)) - if s != scope: - if isinstance(scope.base, compiled.CompiledObject): - if s != scope.base: - return True - else: - if s != scope.base.base: - return True - return False diff --git a/jedi/evaluate/finder.py b/jedi/evaluate/finder.py index 5c3d6333..bc1705b8 100644 --- a/jedi/evaluate/finder.py +++ b/jedi/evaluate/finder.py @@ -38,7 +38,7 @@ class NameFinder(object): @debug.increase_indent def find(self, scopes, resolve_decorator=True, search_global=False): - names = self.filter_name(scopes) + names = self.filter_name(scopes, search_global) types = self._names_to_types(names, resolve_decorator) if not names and not types \ @@ -65,7 +65,7 @@ class NameFinder(object): return iter([(self.scope, self.scope.get_magic_function_names())]) return self.scope.scope_names_generator(self.position) - def filter_name(self, scope_names_generator): + def filter_name(self, scope_names_generator, search_global=False): """ Filters all variables of a scope (which are defined in the `scope_names_generator`), until the name fits. @@ -91,6 +91,11 @@ class NameFinder(object): scope = stmt.parent if scope in break_scopes: continue + # TODO create a working version for filtering private + # variables. + #if not search_global and filter_private_variable(self.scope, scope, name.value): + # filter_private_variable(name_list_scope, scope, name.value): + # continue # Exclude `arr[1] =` from the result set. if not self._name_is_array_assignment(name, stmt): @@ -595,3 +600,17 @@ def find_assignments(lhs, results, seek_name): return results else: return [] + + +def filter_private_variable(scope, call_scope, var_name): + """private variables begin with a double underline `__`""" + if isinstance(scope, er.Instance) and var_name.startswith('__') and not var_name.endswith('__'): + s = call_scope.get_parent_until((pr.Class, er.Instance, compiled.CompiledObject)) + if s != scope: + if isinstance(scope.base, compiled.CompiledObject): + if s != scope.base: + return True + else: + if s != scope.base.base: + return True + return False diff --git a/jedi/evaluate/param.py b/jedi/evaluate/param.py index 89507c8c..933a22b8 100644 --- a/jedi/evaluate/param.py +++ b/jedi/evaluate/param.py @@ -120,6 +120,8 @@ class Arguments(pr.Base): return (self._trailer or self.argument_node).get_parent_until(pr.IsScope) def eval_args(self): + # TODO this method doesn't work with named args and a lot of other + # things. Use unpack. return [self._evaluator.eval_element(el) for stars, el in self._split()] def __repr__(self): diff --git a/jedi/evaluate/stdlib.py b/jedi/evaluate/stdlib.py index e8559720..d94b7d68 100644 --- a/jedi/evaluate/stdlib.py +++ b/jedi/evaluate/stdlib.py @@ -17,6 +17,7 @@ from jedi.evaluate.helpers import FakeArray, FakeStatement from jedi.parser import Parser from jedi.parser import representation as pr from jedi import debug +from jedi.evaluate import precedence class NotInStdLib(LookupError): @@ -97,7 +98,7 @@ def argument_clinic(string, want_obj=False, want_scope=False): @argument_clinic('object, name[, default], /') def builtins_getattr(evaluator, objects, names, defaults=None): # TODO rename to types - stmts = [] + types = [] # follow the first param for obj in objects: if not isinstance(obj, (er.Instance, er.Class, pr.Module, compiled.CompiledObject)): @@ -105,13 +106,12 @@ def builtins_getattr(evaluator, objects, names, defaults=None): continue for name in names: - s = unicode, str - if isinstance(name, compiled.CompiledObject) and isinstance(name.obj, s): - stmts += evaluator.follow_path(iter([name.obj]), [obj], obj) + if precedence.is_string(name): + return evaluator.find_types(obj, name.obj) else: debug.warning('getattr called without str') continue - return stmts + return types def builtins_type(evaluator, obj, params):