def createPathAssignment(source_ref):
    if Options.getFileReferenceMode() == "original":
        path_value = ExpressionConstantRef(
            constant=[dirname(source_ref.getFilename())],
            source_ref=source_ref,
            user_provided=True)
    else:
        path_value = ExpressionMakeList(elements=(ExpressionCallNoKeywords(
            called=ExpressionAttributeLookup(source=ExpressionImportModuleHard(
                module_name="os", import_name="path", source_ref=source_ref),
                                             attribute_name="dirname",
                                             source_ref=source_ref),
            args=ExpressionMakeTuple(
                elements=(ExpressionModuleFileAttributeRef(
                    source_ref=source_ref, ), ),
                source_ref=source_ref,
            ),
            source_ref=source_ref,
        ), ),
                                        source_ref=source_ref)

    return StatementAssignmentVariable(
        variable_ref=ExpressionTargetVariableRef(variable_name="__path__",
                                                 source_ref=source_ref),
        source=path_value,
        source_ref=source_ref)
def createPathAssignment(package, source_ref):
    if Options.getFileReferenceMode() == "original":
        path_value = makeConstantRefNode(
            constant=[os.path.dirname(source_ref.getFilename())],
            source_ref=source_ref,
            user_provided=True)
    else:
        elements = [
            ExpressionCallNoKeywords(
                called=ExpressionAttributeLookup(
                    source=ExpressionImportModuleNameHard(
                        module_name="os",
                        import_name="path",
                        source_ref=source_ref),
                    attribute_name="dirname",
                    source_ref=source_ref),
                args=ExpressionMakeTuple(
                    elements=(ExpressionModuleAttributeFileRef(
                        variable=package.getVariableForReference("__file__"),
                        source_ref=source_ref,
                    ), ),
                    source_ref=source_ref,
                ),
                source_ref=source_ref,
            )
        ]

        if package.canHaveExternalImports():
            parts = package.getFullName().split('.')

            for count in range(len(parts)):
                path_part = _makeCall(
                    "os", "environ", "get", source_ref,
                    makeConstantRefNode(
                        constant="NUITKA_PACKAGE_%s" %
                        '_'.join(parts[:count + 1]),
                        source_ref=source_ref,
                    ),
                    makeConstantRefNode(
                        constant="/notexist",
                        source_ref=source_ref,
                    ))

                if parts[count + 1:]:
                    path_part = _makeCall(
                        "os", "path", "join", source_ref, path_part,
                        makeConstantRefNode(
                            constant=os.path.join(*parts[count + 1:]),
                            source_ref=source_ref,
                        ))

                elements.append(path_part)

        path_value = ExpressionMakeList(elements=elements,
                                        source_ref=source_ref)

    return StatementAssignmentVariableName(provider=package,
                                           variable_name="__path__",
                                           source=path_value,
                                           source_ref=source_ref)
Esempio n. 3
0
def makeSequenceCreationOrConstant(sequence_kind, elements, source_ref):
    # Sequence creation. Tries to avoid creations with only constant
    # elements. Would be caught by optimization, but would be useless churn. For
    # mutable constants we cannot do it though.

    # Due to the many sequence types, there is a lot of cases here
    # pylint: disable=R0912

    for element in elements:
        if not element.isExpressionConstantRef():
            constant = False
            break
    else:
        constant = True

    sequence_kind = sequence_kind.upper()

    if Options.isFullCompat() and elements:
        source_ref = elements[-1].getSourceReference()

    # Note: This would happen in optimization instead, but lets just do it
    # immediately to save some time.
    if constant:
        if sequence_kind == "TUPLE":
            const_type = tuple
        elif sequence_kind == "LIST":
            const_type = list
        elif sequence_kind == "SET":
            const_type = set
        else:
            assert False, sequence_kind

        return ExpressionConstantRef(
            constant      = const_type(
                element.getConstant()
                for element in
                elements
            ),
            source_ref    = source_ref,
            user_provided = True
        )
    else:
        if sequence_kind == "TUPLE":
            return ExpressionMakeTuple(
                elements   = elements,
                source_ref = source_ref
            )
        elif sequence_kind == "LIST":
            return ExpressionMakeList(
                elements   = elements,
                source_ref = source_ref
            )
        elif sequence_kind == "SET":
            return ExpressionMakeSet(
                elements   = elements,
                source_ref = source_ref
            )
        else:
            assert False, sequence_kind
Esempio n. 4
0
def makeSequenceCreationOrConstant(sequence_kind, elements, source_ref):
    # Sequence creation. Tries to avoid creations with only constant
    # elements. Would be caught by optimization, but would be useless churn. For
    # mutable constants we cannot do it though.

    # Due to the many sequence types, there is a lot of cases here
    # pylint: disable=too-many-branches

    for element in elements:
        if not element.isExpressionConstantRef():
            constant = False
            break
    else:
        constant = True

    sequence_kind = sequence_kind.lower()

    # Note: This would happen in optimization instead, but lets just do it
    # immediately to save some time.
    if constant:
        if sequence_kind == "tuple":
            const_type = tuple
        elif sequence_kind == "list":
            const_type = list
        elif sequence_kind == "set":
            const_type = set

            if needsSetLiteralReverseInsertion():
                elements = tuple(reversed(elements))
        else:
            assert False, sequence_kind

        result = makeConstantRefNode(
            constant=const_type(element.getConstant() for element in elements),
            source_ref=source_ref,
            user_provided=True,
        )
    else:
        if sequence_kind == "tuple":
            result = ExpressionMakeTuple(elements=elements,
                                         source_ref=source_ref)
        elif sequence_kind == "list":
            result = ExpressionMakeList(elements=elements,
                                        source_ref=source_ref)
        elif sequence_kind == "set":
            result = ExpressionMakeSetLiteral(elements=elements,
                                              source_ref=source_ref)
        else:
            assert False, sequence_kind

    if elements:
        result.setCompatibleSourceReference(
            source_ref=elements[-1].getCompatibleSourceReference())

    return result
Esempio n. 5
0
def buildSequenceCreationNode(provider, node, source_ref):
    # Sequence creation. Tries to avoid creations with only constant elements. Would be
    # caught by optimization, but would be useless churn. For mutable constants we cannot
    # do it though.

    elements = buildNodeList(provider, node.elts, source_ref)

    for element in elements:
        if not element.isExpressionConstantRef() or element.isMutable():
            constant = False
            break
    else:
        constant = True

    sequence_kind = getKind(node).upper()

    # Note: This would happen in optimization instead, but lets just do it immediately to
    # save some time.
    if constant:
        if sequence_kind == "TUPLE":
            const_type = tuple
        elif sequence_kind == "LIST":
            const_type = list
        elif sequence_kind == "SET":
            const_type = set
        else:
            assert False, sequence_kind

        return ExpressionConstantRef(constant=const_type(
            element.getConstant() for element in elements),
                                     source_ref=source_ref)
    else:
        if sequence_kind == "TUPLE":
            return ExpressionMakeTuple(elements=elements,
                                       source_ref=source_ref)
        elif sequence_kind == "LIST":
            return ExpressionMakeList(elements=elements, source_ref=source_ref)
        elif sequence_kind == "SET":
            return ExpressionMakeSet(elements=elements, source_ref=source_ref)
        else:
            assert False, sequence_kind