def _classObjectFromFilenameAndLine(self, filename, lineNumber, members): """Construct a class object given its textual definition.""" objectOrNone = self.moduleLevelObject(filename, lineNumber) if objectOrNone is not None: return objectOrNone sourceAst = PyAstUtil.getAstFromFilePath(filename) classAst = PyAstUtil.classDefAtLineNumber(sourceAst, lineNumber) outputLocals = {} globalScope = {} globalScope.update(members) self.importModuleMagicVariables(globalScope, filename) try: code = compile(ast.Module([classAst]), filename, 'exec') exec code in globalScope, outputLocals except: logging.error("Failed to instantiate class at %s:%s\n%s", filename, lineNumber, traceback.format_exc()) raise Exceptions.PyforaError("Failed to instantiate class at %s:%s" % (filename, lineNumber)) assert len(outputLocals) == 1 return list(outputLocals.values())[0]
def _pyObjectNodeForClassOrFunction(self, pyObject, classOrFunction): try: sourceFileText, sourceFileName = PyAstUtil.getSourceFilenameAndText(pyObject) except Exceptions.CantGetSourceTextError as e: raise Exceptions.PythonToForaConversionError(e.message) _, sourceLine = PyforaInspect.getsourcelines(pyObject) sourceAst = PyAstUtil.getSourceFileAst(pyObject) if classOrFunction is PyObjectNodes.FunctionDefinition: pyAst = PyAstUtil.functionDefOrLambdaAtLineNumber(sourceAst, sourceLine) else: assert classOrFunction is PyObjectNodes.ClassDefinition pyAst = PyAstUtil.classDefAtLineNumber(sourceAst, sourceLine) freeVariableMemberAccessChainResolutions = \ self._resolveFreeVariableMemberAccessChains( pyObject, pyAst ) processedFreeVariableMemberAccessChainResolutions = { \ '.'.join(chain): resolution for chain, resolution in \ freeVariableMemberAccessChainResolutions.iteritems() } if sourceFileName in self._fileTextCache: fileObject = self._fileTextCache[sourceFileName] else: fileObject = PyObjectNodes.File(sourceFileName, sourceFileText) self._fileTextCache[sourceFileName] = fileObject return classOrFunction( pyObject, fileObject, sourceLine, processedFreeVariableMemberAccessChainResolutions )
def _pyObjectNodeForClassOrFunction(self, pyObject, classOrFunction): try: sourceFileText, sourceFileName = PyAstUtil.getSourceFilenameAndText( pyObject) except Exceptions.CantGetSourceTextError as e: raise Exceptions.PythonToForaConversionError(e.message) _, sourceLine = PyforaInspect.getsourcelines(pyObject) sourceAst = PyAstUtil.getSourceFileAst(pyObject) if classOrFunction is PyObjectNodes.FunctionDefinition: pyAst = PyAstUtil.functionDefOrLambdaAtLineNumber( sourceAst, sourceLine) else: assert classOrFunction is PyObjectNodes.ClassDefinition pyAst = PyAstUtil.classDefAtLineNumber(sourceAst, sourceLine) freeVariableMemberAccessChainResolutions = \ self._resolveFreeVariableMemberAccessChains( pyObject, pyAst ) processedFreeVariableMemberAccessChainResolutions = { \ '.'.join(chain): resolution for chain, resolution in \ freeVariableMemberAccessChainResolutions.iteritems() } if sourceFileName in self._fileTextCache: fileObject = self._fileTextCache[sourceFileName] else: fileObject = PyObjectNodes.File(sourceFileName, sourceFileText) self._fileTextCache[sourceFileName] = fileObject return classOrFunction( pyObject, fileObject, sourceLine, processedFreeVariableMemberAccessChainResolutions)