mirror of
https://github.com/davidhalter/jedi.git
synced 2025-12-20 20:41:13 +08:00
Somre more fixes towards basic stuff.
This commit is contained in:
@@ -52,6 +52,7 @@ def get_user_scope(module_context, position):
|
|||||||
Returns the scope in which the user resides. This includes flows.
|
Returns the scope in which the user resides. This includes flows.
|
||||||
"""
|
"""
|
||||||
user_stmt = module_context.module_node.get_statement_for_position(position)
|
user_stmt = module_context.module_node.get_statement_for_position(position)
|
||||||
|
evaluator = module_context.evaluator
|
||||||
if user_stmt is None:
|
if user_stmt is None:
|
||||||
def scan(scope):
|
def scan(scope):
|
||||||
for s in scope.children:
|
for s in scope.children:
|
||||||
@@ -62,9 +63,17 @@ def get_user_scope(module_context, position):
|
|||||||
return scan(s)
|
return scan(s)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
return scan(module) or module_context
|
scanned_node = scan(module_context.module_node)
|
||||||
|
if scanned_node:
|
||||||
|
return evaluator.create_context(module_context, scanned_node)
|
||||||
|
return module_context
|
||||||
else:
|
else:
|
||||||
return user_stmt.get_parent_scope(include_flows=True)
|
scope_node = user_stmt.get_parent_scope(include_flows=True)
|
||||||
|
return evaluator.create_context(module_context, scope_node)
|
||||||
|
|
||||||
|
# TODO need something like this in this func?
|
||||||
|
#if not context.is_scope(): # Might be a flow (if/while/etc).
|
||||||
|
#context = context.get_parent_scope()
|
||||||
|
|
||||||
|
|
||||||
class Completion:
|
class Completion:
|
||||||
@@ -172,16 +181,13 @@ class Completion:
|
|||||||
yield keywords.keyword(self._evaluator, k).name
|
yield keywords.keyword(self._evaluator, k).name
|
||||||
|
|
||||||
def _global_completions(self):
|
def _global_completions(self):
|
||||||
scope = get_user_scope(self._module_context, self._position)
|
context = get_user_scope(self._module_context, self._position)
|
||||||
if not scope.is_scope(): # Might be a flow (if/while/etc).
|
debug.dbg('global completion scope: %s', context)
|
||||||
scope = scope.get_parent_scope()
|
|
||||||
scope = self._evaluator.create_context(self._module_context, scope)
|
|
||||||
debug.dbg('global completion scope: %s', scope)
|
|
||||||
filters = get_global_filters(
|
filters = get_global_filters(
|
||||||
self._evaluator,
|
self._evaluator,
|
||||||
scope,
|
context,
|
||||||
self._position,
|
self._position,
|
||||||
origin_scope=scope
|
origin_scope=context
|
||||||
)
|
)
|
||||||
completion_names = []
|
completion_names = []
|
||||||
for filter in filters:
|
for filter in filters:
|
||||||
@@ -189,13 +195,13 @@ class Completion:
|
|||||||
return completion_names
|
return completion_names
|
||||||
|
|
||||||
def _trailer_completions(self, atom_expr):
|
def _trailer_completions(self, atom_expr):
|
||||||
user_scope = get_user_scope(self._module_context, self._position)
|
user_context = get_user_scope(self._module_context, self._position)
|
||||||
evaluation_context = self._evaluator.create_context(self._module_context, atom_expr)
|
evaluation_context = self._evaluator.create_context(self._module_context, atom_expr)
|
||||||
contexts = self._evaluator.eval_element(evaluation_context, atom_expr)
|
contexts = self._evaluator.eval_element(evaluation_context, atom_expr)
|
||||||
completion_names = []
|
completion_names = []
|
||||||
debug.dbg('trailer completion contexts: %s', contexts)
|
debug.dbg('trailer completion contexts: %s', contexts)
|
||||||
for context in contexts:
|
for context in contexts:
|
||||||
for filter in context.get_filters(search_global=False, origin_scope=user_scope):
|
for filter in context.get_filters(search_global=False, origin_scope=user_context):
|
||||||
completion_names += filter.values()
|
completion_names += filter.values()
|
||||||
return completion_names
|
return completion_names
|
||||||
|
|
||||||
|
|||||||
@@ -377,8 +377,11 @@ def _name_to_types(evaluator, context, name, scope):
|
|||||||
# TODO an exception can also be a tuple. Check for those.
|
# TODO an exception can also be a tuple. Check for those.
|
||||||
# TODO check for types that are not classes and add it to
|
# TODO check for types that are not classes and add it to
|
||||||
# the static analysis report.
|
# the static analysis report.
|
||||||
exceptions = evaluator.eval_element(name.get_previous_sibling().get_previous_sibling())
|
exceptions = context.eval_node(name.get_previous_sibling().get_previous_sibling())
|
||||||
types = set(chain.from_iterable(evaluator.execute(t) for t in exceptions))
|
types = unite(
|
||||||
|
evaluator.execute(t, param.ValuesArguments([]))
|
||||||
|
for t in exceptions
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
raise DeprecationWarning
|
raise DeprecationWarning
|
||||||
types = set([node])
|
types = set([node])
|
||||||
|
|||||||
@@ -191,11 +191,8 @@ class IntegrationTestCase(object):
|
|||||||
parser.get_root_node().move(self.line_nr)
|
parser.get_root_node().move(self.line_nr)
|
||||||
element = parser.get_parsed_node()
|
element = parser.get_parsed_node()
|
||||||
module_context = script._get_module()
|
module_context = script._get_module()
|
||||||
# TODO remove
|
# The context shouldn't matter for the test results.
|
||||||
element.parent = jedi.api.completion.get_user_scope(
|
element.parent = module_context.module_node
|
||||||
module_context,
|
|
||||||
(self.line_nr, self.column)
|
|
||||||
)
|
|
||||||
results = evaluator.eval_element(module_context, element)
|
results = evaluator.eval_element(module_context, element)
|
||||||
if not results:
|
if not results:
|
||||||
raise Exception('Could not resolve %s on line %s'
|
raise Exception('Could not resolve %s on line %s'
|
||||||
|
|||||||
Reference in New Issue
Block a user