Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def _buildWithNode(provider, context_expr, assign_target, body, sync, source_ref):
# Many details, pylint: disable=too-many-locals
with_source = buildNode(provider, context_expr, source_ref)
if python_version < 380 and Options.isFullCompat():
source_ref = with_source.getCompatibleSourceReference()
temp_scope = provider.allocateTempScope("with")
tmp_source_variable = provider.allocateTempVariable(
temp_scope=temp_scope, name="source"
)
tmp_exit_variable = provider.allocateTempVariable(
temp_scope=temp_scope, name="exit"
)
tmp_enter_variable = provider.allocateTempVariable(
temp_scope=temp_scope, name="enter"
)
tmp_indicator_variable = provider.allocateTempVariable(
result = []
for key, value in zip(keys, values):
# TODO: We could be a lot cleverer about the dictionaries for non-starred
# arguments, but lets get this to work first.
if key is None:
result.append(buildNode(provider, value, source_ref))
elif type(key) is str:
result.append(
ExpressionMakeDict(
pairs=(
ExpressionKeyValuePair(
key=makeConstantRefNode(
constant=key, source_ref=source_ref
),
value=buildNode(provider, value, source_ref),
source_ref=source_ref,
),
),
source_ref=source_ref,
)
)
else:
result.append(
ExpressionMakeDict(
pairs=(
ExpressionKeyValuePair(
key=buildNode(provider, key, source_ref),
value=buildNode(provider, value, source_ref),
source_ref=source_ref,
),
),
slice_kind = getKind(node.slice)
if slice_kind == "Index":
return (
"Subscript",
(
buildNode(provider, node.value, source_ref),
buildNode(provider, node.slice.value, source_ref),
),
)
elif slice_kind == "Slice":
lower = buildNode(provider, node.slice.lower, source_ref, True)
upper = buildNode(provider, node.slice.upper, source_ref, True)
if node.slice.step is not None:
step = buildNode(provider, node.slice.step, source_ref)
return (
"Subscript",
(
buildNode(provider, node.value, source_ref),
ExpressionBuiltinSlice(
start=lower, stop=upper, step=step, source_ref=source_ref
),
),
)
else:
return (
"Slice",
(buildNode(provider, node.value, source_ref), lower, upper),
)
elif slice_kind == "ExtSlice":
def buildExtSliceNode(provider, node, source_ref):
elements = []
for dim in node.slice.dims:
dim_kind = getKind(dim)
if dim_kind == "Slice":
lower = buildNode(provider, dim.lower, source_ref, True)
upper = buildNode(provider, dim.upper, source_ref, True)
step = buildNode(provider, dim.step, source_ref, True)
element = ExpressionBuiltinSlice(
start=lower, stop=upper, step=step, source_ref=source_ref
)
elif dim_kind == "Ellipsis":
element = ExpressionConstantEllipsisRef(
source_ref=source_ref, user_provided=True
)
elif dim_kind == "Index":
element = buildNode(
provider=provider, node=dim.value, source_ref=source_ref
)
else:
assert False, dim
def buildListUnpacking(provider, elements, source_ref):
helper_args = []
for element in elements:
# We could be a lot cleverer about the tuples for non-starred
# arguments, but lets get this to work first. And then rely on
# future optimization to inline the list unpacking helper in a
# way that has the same effect.
if getKind(element) == "Starred":
helper_args.append(buildNode(provider, element.value, source_ref))
else:
helper_args.append(
ExpressionMakeTuple(
elements=(buildNode(provider, element, source_ref),),
source_ref=source_ref,
)
)
result = ExpressionFunctionCall(
function=ExpressionFunctionCreation(
function_ref=ExpressionFunctionRef(
function_body=getListUnpackingHelper(), source_ref=source_ref
),
defaults=(),
kw_defaults=None,
annotations=None,
dim_kind = getKind(dim)
if dim_kind == "Slice":
lower = buildNode(provider, dim.lower, source_ref, True)
upper = buildNode(provider, dim.upper, source_ref, True)
step = buildNode(provider, dim.step, source_ref, True)
element = ExpressionBuiltinSlice(
start=lower, stop=upper, step=step, source_ref=source_ref
)
elif dim_kind == "Ellipsis":
element = ExpressionConstantEllipsisRef(
source_ref=source_ref, user_provided=True
)
elif dim_kind == "Index":
element = buildNode(
provider=provider, node=dim.value, source_ref=source_ref
)
else:
assert False, dim
elements.append(element)
return makeSequenceCreationOrConstant(
sequence_kind="tuple", elements=elements, source_ref=source_ref
)
def buildConditionalExpressionNode(provider, node, source_ref):
return ExpressionConditional(
condition=buildNode(provider, node.test, source_ref),
expression_yes=buildNode(provider, node.body, source_ref),
expression_no=buildNode(provider, node.orelse, source_ref),
source_ref=source_ref,
)
for sub_arg in arg.elts:
extractArg(sub_arg)
else:
assert False, getKind(arg)
for arg in node.args.args:
extractArg(arg)
for arg in node.args.kwonlyargs:
extractArg(arg)
if python_version < 340:
if node.args.varargannotation is not None:
addAnnotation(
key=node.args.vararg,
value=buildNode(provider, node.args.varargannotation, source_ref),
)
if node.args.kwargannotation is not None:
addAnnotation(
key=node.args.kwarg,
value=buildNode(provider, node.args.kwargannotation, source_ref),
)
else:
if node.args.vararg is not None:
extractArg(node.args.vararg)
if node.args.kwarg is not None:
extractArg(node.args.kwarg)
# Return value annotation (not there for lambdas)
if hasattr(node, "returns") and node.returns is not None:
addAnnotation(
def buildListUnpacking(provider, elements, source_ref):
helper_args = []
for element in elements:
# We could be a lot cleverer about the tuples for non-starred
# arguments, but lets get this to work first. And then rely on
# future optimization to inline the list unpacking helper in a
# way that has the same effect.
if getKind(element) == "Starred":
helper_args.append(buildNode(provider, element.value, source_ref))
else:
helper_args.append(
ExpressionMakeTuple(
elements=(buildNode(provider, element, source_ref),),
source_ref=source_ref,
)
)
result = ExpressionFunctionCall(
function=ExpressionFunctionCreation(
function_ref=ExpressionFunctionRef(
function_body=getListUnpackingHelper(), source_ref=source_ref
),
defaults=(),
kw_defaults=None,
annotations=None,
source_ref=source_ref,
),
values=(ExpressionMakeTuple(helper_args, source_ref),),
source_ref=source_ref,