forked from VimPlug/jedi
Introduce the property return annotation
This commit is contained in:
@@ -9,7 +9,7 @@ import re
|
|||||||
import builtins
|
import builtins
|
||||||
import typing
|
import typing
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Optional, Tuple
|
from typing import Optional, Tuple, Union
|
||||||
|
|
||||||
from jedi.inference.compiled.getattr_static import getattr_static
|
from jedi.inference.compiled.getattr_static import getattr_static
|
||||||
|
|
||||||
@@ -147,7 +147,7 @@ class AccessPath:
|
|||||||
self.accesses = accesses
|
self.accesses = accesses
|
||||||
|
|
||||||
|
|
||||||
def create_access_path(inference_state, obj):
|
def create_access_path(inference_state, obj) -> AccessPath:
|
||||||
access = create_access(inference_state, obj)
|
access = create_access(inference_state, obj)
|
||||||
return AccessPath(access.get_access_path_tuples())
|
return AccessPath(access.get_access_path_tuples())
|
||||||
|
|
||||||
@@ -175,7 +175,7 @@ class DirectObjectAccess:
|
|||||||
def _create_access(self, obj):
|
def _create_access(self, obj):
|
||||||
return create_access(self._inference_state, obj)
|
return create_access(self._inference_state, obj)
|
||||||
|
|
||||||
def _create_access_path(self, obj):
|
def _create_access_path(self, obj) -> AccessPath:
|
||||||
return create_access_path(self._inference_state, obj)
|
return create_access_path(self._inference_state, obj)
|
||||||
|
|
||||||
def py__bool__(self):
|
def py__bool__(self):
|
||||||
@@ -329,7 +329,7 @@ class DirectObjectAccess:
|
|||||||
except TypeError:
|
except TypeError:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def is_allowed_getattr(self, name, safe=True) -> Tuple[bool, bool]:
|
def is_allowed_getattr(self, name, safe=True) -> Tuple[bool, bool, Optional[AccessPath]]:
|
||||||
# TODO this API is ugly.
|
# TODO this API is ugly.
|
||||||
try:
|
try:
|
||||||
attr, is_get_descriptor = getattr_static(self._obj, name)
|
attr, is_get_descriptor = getattr_static(self._obj, name)
|
||||||
@@ -344,18 +344,22 @@ class DirectObjectAccess:
|
|||||||
with warnings.catch_warnings(record=True):
|
with warnings.catch_warnings(record=True):
|
||||||
warnings.simplefilter("always")
|
warnings.simplefilter("always")
|
||||||
try:
|
try:
|
||||||
return hasattr(self._obj, name), False
|
return hasattr(self._obj, name), False, None
|
||||||
except Exception:
|
except Exception:
|
||||||
# Obviously has an attribute (probably a property) that
|
# Obviously has an attribute (probably a property) that
|
||||||
# gets executed, so just avoid all exceptions here.
|
# gets executed, so just avoid all exceptions here.
|
||||||
pass
|
pass
|
||||||
return False, False
|
return False, False, None
|
||||||
else:
|
else:
|
||||||
if is_get_descriptor and type(attr) not in ALLOWED_DESCRIPTOR_ACCESS:
|
if is_get_descriptor and type(attr) not in ALLOWED_DESCRIPTOR_ACCESS:
|
||||||
|
if isinstance(attr, property):
|
||||||
|
if hasattr(attr.fget, '__annotations__'):
|
||||||
|
a = DirectObjectAccess(self._inference_state, attr)
|
||||||
|
return True, True, a.get_return_annotation()
|
||||||
# In case of descriptors that have get methods we cannot return
|
# In case of descriptors that have get methods we cannot return
|
||||||
# it's value, because that would mean code execution.
|
# it's value, because that would mean code execution.
|
||||||
return True, True
|
return True, True, None
|
||||||
return True, False
|
return True, False, None
|
||||||
|
|
||||||
def getattr_paths(self, name, default=_sentinel):
|
def getattr_paths(self, name, default=_sentinel):
|
||||||
try:
|
try:
|
||||||
@@ -515,7 +519,7 @@ class DirectObjectAccess:
|
|||||||
# the signature. In that case we just want a simple escape for now.
|
# the signature. In that case we just want a simple escape for now.
|
||||||
raise ValueError
|
raise ValueError
|
||||||
|
|
||||||
def get_return_annotation(self):
|
def get_return_annotation(self) -> Optional[AccessPath]:
|
||||||
try:
|
try:
|
||||||
o = self._obj.__annotations__.get('return')
|
o = self._obj.__annotations__.get('return')
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
|
|||||||
@@ -444,7 +444,7 @@ class CompiledValueFilter(AbstractFilter):
|
|||||||
"""
|
"""
|
||||||
To remove quite a few access calls we introduced the callback here.
|
To remove quite a few access calls we introduced the callback here.
|
||||||
"""
|
"""
|
||||||
has_attribute, is_descriptor = allowed_getattr_callback(
|
has_attribute, is_descriptor, property_return_annotation = allowed_getattr_callback(
|
||||||
name,
|
name,
|
||||||
)
|
)
|
||||||
if check_has_attribute and not has_attribute:
|
if check_has_attribute and not has_attribute:
|
||||||
|
|||||||
Reference in New Issue
Block a user