mirror of
https://github.com/davidhalter/jedi.git
synced 2025-12-06 14:04:26 +08:00
Make version_info understandable so it can be used in for typeshed
This commit is contained in:
@@ -434,6 +434,26 @@ def _bool_to_context(evaluator, bool_):
|
|||||||
return compiled.builtin_from_name(evaluator, force_unicode(str(bool_)))
|
return compiled.builtin_from_name(evaluator, force_unicode(str(bool_)))
|
||||||
|
|
||||||
|
|
||||||
|
def _get_tuple_ints(context):
|
||||||
|
if not isinstance(context, iterable.SequenceLiteralContext):
|
||||||
|
return None
|
||||||
|
numbers = []
|
||||||
|
for lazy_context in context.py__iter__():
|
||||||
|
result = lazy_context.infer()
|
||||||
|
try:
|
||||||
|
number, = result # Must be exactly one element
|
||||||
|
except ValueError:
|
||||||
|
return None
|
||||||
|
|
||||||
|
if not isinstance(number, compiled.CompiledValue):
|
||||||
|
return None
|
||||||
|
value = number.get_safe_value()
|
||||||
|
if not isinstance(value, int):
|
||||||
|
return None
|
||||||
|
numbers.append(value)
|
||||||
|
return numbers
|
||||||
|
|
||||||
|
|
||||||
def _eval_comparison_part(evaluator, context, left, operator, right):
|
def _eval_comparison_part(evaluator, context, left, operator, right):
|
||||||
l_is_num = is_number(left)
|
l_is_num = is_number(left)
|
||||||
r_is_num = is_number(right)
|
r_is_num = is_number(right)
|
||||||
@@ -474,6 +494,16 @@ def _eval_comparison_part(evaluator, context, left, operator, right):
|
|||||||
bool_ = operation(left, right)
|
bool_ = operation(left, right)
|
||||||
return ContextSet([_bool_to_context(evaluator, bool_)])
|
return ContextSet([_bool_to_context(evaluator, bool_)])
|
||||||
|
|
||||||
|
from jedi.plugins.typeshed import VersionInfo
|
||||||
|
if isinstance(left, VersionInfo):
|
||||||
|
version_info = _get_tuple_ints(right)
|
||||||
|
if version_info is not None:
|
||||||
|
bool_result = compiled.access.COMPARISON_OPERATORS[operator](
|
||||||
|
evaluator.environment.version_info,
|
||||||
|
tuple(version_info)
|
||||||
|
)
|
||||||
|
return ContextSet([_bool_to_context(evaluator, bool_result)])
|
||||||
|
|
||||||
return ContextSet([_bool_to_context(evaluator, True), _bool_to_context(evaluator, False)])
|
return ContextSet([_bool_to_context(evaluator, True), _bool_to_context(evaluator, False)])
|
||||||
elif str_operator == 'in':
|
elif str_operator == 'in':
|
||||||
return NO_CONTEXTS
|
return NO_CONTEXTS
|
||||||
|
|||||||
@@ -219,9 +219,16 @@ class NameWithStubMixin(object):
|
|||||||
yield actual_context
|
yield actual_context
|
||||||
|
|
||||||
|
|
||||||
|
class VersionInfo(ContextWrapper):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
class StubOnlyName(TreeNameDefinition):
|
class StubOnlyName(TreeNameDefinition):
|
||||||
def infer(self):
|
def infer(self):
|
||||||
inferred = super(StubOnlyName, self).infer()
|
inferred = super(StubOnlyName, self).infer()
|
||||||
|
if self.string_name == 'version_info' and self.get_root_context().py__name__() == 'sys':
|
||||||
|
return [VersionInfo(c) for c in inferred]
|
||||||
|
|
||||||
return [
|
return [
|
||||||
StubOnlyClass.create_cached(c.evaluator, c) if isinstance(c, ClassContext) else c
|
StubOnlyClass.create_cached(c.evaluator, c) if isinstance(c, ClassContext) else c
|
||||||
for c in inferred
|
for c in inferred
|
||||||
|
|||||||
Reference in New Issue
Block a user