def _handleQualnameSetup(node): if node.qualname_setup is not None: if node.isClassDictCreation(): class_assign, qualname_assign = node.qualname_setup class_variable = class_assign.getTargetVariableRef( ).getVariable() if class_variable.isModuleVariable(): qualname_node = qualname_assign.getAssignSource() qualname_node.replaceWith( makeConstantReplacementNode( constant=class_variable.getName(), node=qualname_node)) node.qualname_provider = node.getParentModule() else: function_variable_ref = node.qualname_setup function_variable = function_variable_ref.getVariable() if function_variable.isModuleVariable(): node.qualname_provider = node.getParentModule() # TODO: Actually for nested global classes, this approach # may not work, as their qualnames will be wrong. In that # case a dedicated node for qualname references might be # needed. node.qualname_setup = None
def _handleQualnameSetup(node): if node.qualname_setup is not None: if node.isExpressionClassBody(): class_assign, qualname_assign = node.qualname_setup class_variable = class_assign.getTargetVariableRef().getVariable() if class_variable.isModuleVariable(): qualname_node = qualname_assign.getAssignSource() qualname_node.replaceWith( makeConstantReplacementNode( constant = class_variable.getName(), node = qualname_node ) ) node.qualname_provider = node.getParentModule() else: function_variable_ref = node.qualname_setup function_variable = function_variable_ref.getVariable() if function_variable.isModuleVariable(): node.qualname_provider = node.getParentModule() # TODO: Actually for nested global classes, this approach # may not work, as their "qualname" will be wrong. In that # case a dedicated node for "qualname" references might be # needed. node.qualname_setup = None
def _handleQualnameSetup(node): if node.qualname_setup is not None: if node.isExpressionClassBody(): class_variable_name, qualname_assign = node.qualname_setup class_variable = node.getParentVariableProvider( ).getVariableForAssignment(class_variable_name) if class_variable.isModuleVariable(): qualname_node = qualname_assign.getAssignSource() qualname_node.replaceWith( makeConstantReplacementNode( constant=class_variable.getName(), node=qualname_node)) node.qualname_provider = node.getParentModule() else: function_variable = node.getParentVariableProvider( ).getVariableForAssignment(node.qualname_setup) if function_variable.isModuleVariable(): node.qualname_provider = node.getParentModule() # TODO: Actually for nested global classes, this approach # may not work, as their "qualname" will be wrong. In that # case a dedicated node for "qualname" references might be # needed. node.qualname_setup = None
def makeLong0(source_ref): # pylint: disable=unused-argument return makeConstantReplacementNode( constant=int(), node=node, )
def _handleQualnameSetup(node): if node.qualname_setup is not None: provider = node.getParentVariableProvider() if node.isExpressionClassBody(): class_variable_name, qualname_assign = node.qualname_setup if provider.hasProvidedVariable(class_variable_name): class_variable = provider.getVariableForReference( class_variable_name ) if class_variable.isModuleVariable(): qualname_node = qualname_assign.subnode_value new_node = makeConstantReplacementNode( constant = class_variable.getName(), node = qualname_node ) parent = qualname_node.parent qualname_node.finalize() parent.replaceChild(qualname_node, new_node) node.qualname_provider = node.getParentModule() else: if provider.hasProvidedVariable(node.qualname_setup): function_variable = provider.getVariableForReference( node.qualname_setup ) if function_variable.isModuleVariable(): node.qualname_provider = node.getParentModule() # TODO: Actually for nested global classes, this approach # may not work, as their "qualname" will be wrong. In that # case a dedicated node for "qualname" references might be # needed. node.qualname_setup = None
def _handleQualnameSetup(node): if node.qualname_setup is not None: provider = node.getParentVariableProvider() if node.isExpressionClassBody(): class_variable_name, qualname_assign = node.qualname_setup if provider.hasProvidedVariable(class_variable_name): class_variable = provider.getVariableForReference( class_variable_name ) if class_variable.isModuleVariable(): qualname_node = qualname_assign.subnode_value new_node = makeConstantReplacementNode( constant=class_variable.getName(), node=qualname_node ) parent = qualname_node.parent qualname_node.finalize() parent.replaceChild(qualname_node, new_node) node.qualname_provider = node.getParentModule() else: if provider.hasProvidedVariable(node.qualname_setup): function_variable = provider.getVariableForReference( node.qualname_setup ) if function_variable.isModuleVariable(): node.qualname_provider = node.getParentModule() # TODO: Actually for nested global classes, this approach # may not work, as their "qualname" will be wrong. In that # case a dedicated node for "qualname" references might be # needed. node.qualname_setup = None
def makeBytes0(source_ref): # pylint: disable=unused-argument return makeConstantReplacementNode(constant=bytes(), node=node)
def makeComplex0(source_ref): # pylint: disable=unused-argument return makeConstantReplacementNode(constant=complex(), node=node)
def makeFloat0(source_ref): # pylint: disable=unused-argument return makeConstantReplacementNode(constant=float(), node=node)
def makeLong0(source_ref): # pylint: disable=unused-argument return makeConstantReplacementNode(constant=int(), node=node)
def onEnterNode(self, node): # Mighty complex code with lots of branches and statements, but it # couldn't be less without making it more difficult. # pylint: disable=R0912,R0915 if node.isExpressionTargetVariableRef(): provider = node.getParentVariableProvider() if node.getVariable() is None: variable_name = node.getVariableName() variable = provider.getVariableForAssignment( variable_name = variable_name ) node.setVariable(variable) addVariableUsage(node.getVariable(), provider) elif node.isExpressionTargetTempVariableRef(): provider = node.getParentVariableProvider() addVariableUsage(node.getVariable(), provider) elif node.isExpressionVariableRef(): if node.getVariable() is None: provider = node.getParentVariableProvider() if provider.isEarlyClosure(): node.setVariable( provider.getVariableForReference( variable_name = node.getVariableName() ) ) elif node.isExpressionTempVariableRef(): if node.getVariable().getOwner() != node.getParentVariableProvider(): node.setVariable( node.getParentVariableProvider().addClosureVariable( node.getVariable() ) ) assert node.getVariable().isClosureReference(), \ node.getVariable() elif node.isExpressionFunctionBody(): if python_version >= 300: self._handleNonLocal(node) for variable in node.getParameters().getAllVariables(): addVariableUsage(variable, node) # Python3.4 allows for class declarations to be made global, even # after they were declared, so we need to fix this up. if python_version >= 340 and node.isClassDictCreation(): class_assign, qualname_assign = node.qualname_setup class_variable = class_assign.getTargetVariableRef().getVariable() if class_variable.isModuleVariable() and \ class_variable.isFromGlobalStatement(): qualname_node = qualname_assign.getAssignSource() qualname_node.replaceWith( makeConstantReplacementNode( constant = class_variable.getName(), node = qualname_node ) ) node.qualname_provider = node.getParentModule() # TODO: Actually for nested global classes, this approach # may not work, as their qualnames will be wrong. In that # case a dedicated node for qualname references might be # needed. del node.qualname_setup # Attribute access of names of class functions should be mangled, if # they start with "__", but do not end in "__" as well. elif node.isExpressionAttributeLookup() or \ node.isStatementAssignmentAttribute() or \ node.isStatementDelAttribute(): attribute_name = node.getAttributeName() if attribute_name.startswith( "__" ) and \ not attribute_name.endswith( "__" ): seen_function = False current = node while True: current = current.getParentVariableProvider() if current.isPythonModule(): break assert current.isExpressionFunctionBody() if current.isClassDictCreation(): if seen_function: node.setAttributeName( "_%s%s" % ( current.getName().lstrip("_"), attribute_name ) ) break else: seen_function = True # Check if continue and break are properly in loops. If not, raise a # syntax error. elif node.isStatementBreakLoop() or node.isStatementContinueLoop(): current = node while True: if current.isPythonModule() or current.isExpressionFunctionBody(): if node.isStatementContinueLoop(): message = "'continue' not properly in loop" col_offset = 16 if python_version >= 300 else None display_line = True source_line = None else: message = "'break' outside loop" if isFullCompat(): col_offset = 2 if python_version >= 300 else None display_line = True source_line = "" if python_version >= 300 else None else: col_offset = 13 display_line = True source_line = None source_ref = node.getSourceReference() # source_ref.line += 1 SyntaxErrors.raiseSyntaxError( message, source_ref = node.getSourceReference(), col_offset = col_offset, display_line = display_line, source_line = source_line ) current = current.getParent() if current.isStatementLoop(): break