mirror of
https://github.com/davidhalter/jedi.git
synced 2026-03-01 23:56:50 +08:00
literal classes mostly working
This commit is contained in:
@@ -563,7 +563,7 @@ def _check_isinstance_type(stmt, search_name):
|
|||||||
# this might be removed if we analyze and, etc
|
# this might be removed if we analyze and, etc
|
||||||
assert len(commands) == 1
|
assert len(commands) == 1
|
||||||
call = commands[0]
|
call = commands[0]
|
||||||
assert type(call) is pr.Call and str(call.name) == 'isinstance'
|
assert isinstance(call, pr.Call) and str(call.name) == 'isinstance'
|
||||||
assert bool(call.execution)
|
assert bool(call.execution)
|
||||||
|
|
||||||
# isinstance check
|
# isinstance check
|
||||||
|
|||||||
@@ -477,7 +477,7 @@ def check_getattr(inst, name_str):
|
|||||||
result = []
|
result = []
|
||||||
# str is important to lose the NamePart!
|
# str is important to lose the NamePart!
|
||||||
module = builtin.Builtin.scope
|
module = builtin.Builtin.scope
|
||||||
name = pr.Call(module, str(name_str), pr.Call.STRING, (0, 0), (0, 0), inst)
|
name = pr.String(module, str(name_str), (0, 0), (0, 0), inst)
|
||||||
with common.ignored(KeyError):
|
with common.ignored(KeyError):
|
||||||
result = inst.execute_subscope_by_name('__getattr__', [name])
|
result = inst.execute_subscope_by_name('__getattr__', [name])
|
||||||
if not result:
|
if not result:
|
||||||
@@ -701,7 +701,7 @@ def follow_call(call):
|
|||||||
|
|
||||||
|
|
||||||
def follow_call_path(path, scope, position):
|
def follow_call_path(path, scope, position):
|
||||||
"""Follows a path generated by `pr.Call.generate_call_path()`"""
|
"""Follows a path generated by `pr.StatementElement.generate_call_path()`"""
|
||||||
current = next(path)
|
current = next(path)
|
||||||
|
|
||||||
if isinstance(current, pr.Array):
|
if isinstance(current, pr.Array):
|
||||||
@@ -712,14 +712,10 @@ def follow_call_path(path, scope, position):
|
|||||||
scopes = find_name(scope, current, position=position,
|
scopes = find_name(scope, current, position=position,
|
||||||
search_global=True)
|
search_global=True)
|
||||||
else:
|
else:
|
||||||
if current.type in (pr.Call.STRING, pr.Call.NUMBER):
|
# for pr.Literal
|
||||||
t = type(current.name).__name__
|
scopes = find_name(builtin.Builtin.scope, current.type_as_string())
|
||||||
scopes = find_name(builtin.Builtin.scope, t)
|
|
||||||
else:
|
|
||||||
debug.warning('unknown type:', current.type, current)
|
|
||||||
scopes = []
|
|
||||||
# Make instances of those number/string objects.
|
# Make instances of those number/string objects.
|
||||||
scopes = [er.Instance(s, (current.name,)) for s in scopes]
|
scopes = [er.Instance(s, (current.value,)) for s in scopes]
|
||||||
result = imports.strip_imports(scopes)
|
result = imports.strip_imports(scopes)
|
||||||
|
|
||||||
return follow_paths(path, result, scope, position=position)
|
return follow_paths(path, result, scope, position=position)
|
||||||
|
|||||||
@@ -860,7 +860,7 @@ class Array(use_metaclass(cache.CachedMetaClass, pr.Base)):
|
|||||||
if len(key_commands) != 1: # cannot deal with complex strings
|
if len(key_commands) != 1: # cannot deal with complex strings
|
||||||
continue
|
continue
|
||||||
key = key_commands[0]
|
key = key_commands[0]
|
||||||
if isinstance(key, pr.Call) and key.type == pr.Call.STRING:
|
if isinstance(key, pr.String):
|
||||||
str_key = key.name
|
str_key = key.name
|
||||||
elif isinstance(key, pr.Name):
|
elif isinstance(key, pr.Name):
|
||||||
str_key = str(key)
|
str_key = str(key)
|
||||||
|
|||||||
@@ -47,14 +47,14 @@ def fast_parent_copy(obj):
|
|||||||
continue
|
continue
|
||||||
elif isinstance(value, list):
|
elif isinstance(value, list):
|
||||||
setattr(new_obj, key, list_rec(value))
|
setattr(new_obj, key, list_rec(value))
|
||||||
elif isinstance(value, (pr.Simple, pr.Call)):
|
elif isinstance(value, pr.Simple):
|
||||||
setattr(new_obj, key, recursion(value))
|
setattr(new_obj, key, recursion(value))
|
||||||
return new_obj
|
return new_obj
|
||||||
|
|
||||||
def list_rec(list_obj):
|
def list_rec(list_obj):
|
||||||
copied_list = list_obj[:] # lists, tuples, strings, unicode
|
copied_list = list_obj[:] # lists, tuples, strings, unicode
|
||||||
for i, el in enumerate(copied_list):
|
for i, el in enumerate(copied_list):
|
||||||
if isinstance(el, (pr.Simple, pr.Call)):
|
if isinstance(el, pr.Simple):
|
||||||
copied_list[i] = recursion(el)
|
copied_list[i] = recursion(el)
|
||||||
elif isinstance(el, list):
|
elif isinstance(el, list):
|
||||||
copied_list[i] = list_rec(el)
|
copied_list[i] = list_rec(el)
|
||||||
@@ -109,7 +109,7 @@ def array_for_pos(stmt, pos, array_types=None):
|
|||||||
arr = None
|
arr = None
|
||||||
if isinstance(command, pr.Array):
|
if isinstance(command, pr.Array):
|
||||||
arr, index = search_array(command, pos)
|
arr, index = search_array(command, pos)
|
||||||
elif isinstance(command, pr.Call):
|
elif isinstance(command, pr.StatementElement):
|
||||||
arr, index = search_call(command, pos)
|
arr, index = search_call(command, pos)
|
||||||
if arr is not None:
|
if arr is not None:
|
||||||
return arr, index
|
return arr, index
|
||||||
@@ -128,7 +128,7 @@ def search_call_signatures(stmt, pos):
|
|||||||
while isinstance(call.parent, pr.Call):
|
while isinstance(call.parent, pr.Call):
|
||||||
call = call.parent
|
call = call.parent
|
||||||
arr.parent.execution = None
|
arr.parent.execution = None
|
||||||
return call if call.type == pr.Call.NAME else None, index, False
|
return call if isinstance(call, pr.Name) else None, index, False
|
||||||
return None, 0, False
|
return None, 0, False
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -807,8 +807,7 @@ class Statement(Simple):
|
|||||||
for stmt in call:
|
for stmt in call:
|
||||||
search_calls(stmt.get_commands())
|
search_calls(stmt.get_commands())
|
||||||
elif isinstance(call, Call):
|
elif isinstance(call, Call):
|
||||||
if call.type == Call.NAME:
|
self._set_vars.append(call.name)
|
||||||
self._set_vars.append(call.name)
|
|
||||||
|
|
||||||
for calls, operation in self.assignment_details:
|
for calls, operation in self.assignment_details:
|
||||||
search_calls(calls)
|
search_calls(calls)
|
||||||
@@ -1138,7 +1137,7 @@ class Param(Statement):
|
|||||||
|
|
||||||
class StatementElement(Simple):
|
class StatementElement(Simple):
|
||||||
def __init__(self, module, start_pos, end_pos, parent):
|
def __init__(self, module, start_pos, end_pos, parent):
|
||||||
super(type(self), self).__init__(module, start_pos, end_pos)
|
super(StatementElement, self).__init__(module, start_pos, end_pos)
|
||||||
|
|
||||||
# parent is not the oposite of next. The parent of c: a = [b.c] would
|
# parent is not the oposite of next. The parent of c: a = [b.c] would
|
||||||
# be an array.
|
# be an array.
|
||||||
@@ -1192,7 +1191,7 @@ class StatementElement(Simple):
|
|||||||
|
|
||||||
class Call(StatementElement):
|
class Call(StatementElement):
|
||||||
def __init__(self, module, name, start_pos, end_pos, parent=None):
|
def __init__(self, module, name, start_pos, end_pos, parent=None):
|
||||||
super(type(self), self).__init__(module, start_pos, end_pos, parent)
|
super(Call, self).__init__(module, start_pos, end_pos, parent)
|
||||||
self.name = name
|
self.name = name
|
||||||
|
|
||||||
def get_code(self):
|
def get_code(self):
|
||||||
@@ -1204,12 +1203,15 @@ class Call(StatementElement):
|
|||||||
|
|
||||||
class Literal(StatementElement):
|
class Literal(StatementElement):
|
||||||
def __init__(self, module, literal, start_pos, end_pos, parent=None):
|
def __init__(self, module, literal, start_pos, end_pos, parent=None):
|
||||||
super(type(self), self).__init__(module, start_pos, end_pos, parent)
|
super(Literal, self).__init__(module, start_pos, end_pos, parent)
|
||||||
self.literal = literal
|
self.literal = literal
|
||||||
self.value = literal_eval(literal)
|
self.value = literal_eval(literal)
|
||||||
|
|
||||||
def get_code(self):
|
def get_code(self):
|
||||||
return self.literal + super(Call, self).get_code()
|
return self.literal + super(Literal, self).get_code()
|
||||||
|
|
||||||
|
def type_as_string(self):
|
||||||
|
return type(self.value).__name__
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "<%s: %s>" % (type(self).__name__, self.literal)
|
return "<%s: %s>" % (type(self).__name__, self.literal)
|
||||||
@@ -1219,7 +1221,7 @@ class String(Literal):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class Number(Call):
|
class Number(Literal):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user