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)
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
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
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