from bike.globals import * import os from bike.parsing.fastparser import fastparser class Cache: def __init__(self): self.reset() def reset(self): self.srcnodecache = {} self.typecache = {} self.maskedlinescache = {} instance = None Cache.instance = Cache() class CantLocateSourceNodeException(Exception): pass def getSourceNode(filename_path): #print "getSourceNode:",filename_path sourcenode = None try: sourcenode = Cache.instance.srcnodecache[filename_path] except KeyError: pass if sourcenode is None: from bike.parsing.newstuff import translateFnameToModuleName sourcenode = SourceFile.createFromFile(filename_path, translateFnameToModuleName(filename_path)) if sourcenode is None: raise CantLocateSourceNodeException(filename_path) Cache.instance.srcnodecache[filename_path]=sourcenode return sourcenode class SourceFile: def createFromString(filename, modulename, src): return SourceFile(filename,modulename,src) createFromString = staticmethod(createFromString) def createFromFile(filename,modulename): try: f = file(filename) src = f.read() f.close() except IOError: return None else: return SourceFile(filename,modulename,src) createFromFile = staticmethod(createFromFile) def __init__(self, filename, modulename, src): if os.path.isabs(filename): self.filename = filename else: self.filename = os.path.abspath(filename) self.modulename = modulename self.resetWithSource(src) def resetWithSource(self, source): # fastparser ast self.fastparseroot = fastparser(source,self.modulename,self.filename) self.fastparseroot.setSourceNode(self) self._lines = source.splitlines(1) self.sourcenode = self def __repr__(self): return "Source(%s,%s)"%('source', self.filename) def getChildNodes(self): return self.fastparseroot.getChildNodes() def getSource(self): return "".join(self.getLines()) def getLine(self,linenum): return self.getLines()[linenum-1] # TODO: rename me! def getFlattenedListOfFastParserASTNodes(self): return self.fastparseroot.getFlattenedListOfChildNodes() def getLines(self): return self._lines