def __init__(self, includeDict, namespaceContainmentChecker, \ namespaceUsageChecker,\ classUsageChecker=ClassUsageChecker(ClassUsageDictionary())): self.transIncludeDict = TransitiveIncludeDictionary(includeDict) self.namespaceContainmentChecker = namespaceContainmentChecker self.namespaceUsageChecker = namespaceUsageChecker self.classUsageChecker = classUsageChecker self.transInhDict = TransitiveInheritanceDictionary( InheritanceDictionary())
def __init__(self, includeDict, namespaceContainmentChecker, \ namespaceUsageChecker,\ classUsageChecker=ClassUsageChecker(ClassUsageDictionary())): self.transIncludeDict = TransitiveIncludeDictionary(includeDict) self.namespaceContainmentChecker = namespaceContainmentChecker self.namespaceUsageChecker = namespaceUsageChecker self.classUsageChecker = classUsageChecker self.transInhDict = TransitiveInheritanceDictionary(InheritanceDictionary())
class Scope: def __init__(self, includeDict, namespaceContainmentChecker, \ namespaceUsageChecker,\ classUsageChecker=ClassUsageChecker(ClassUsageDictionary())): self.transIncludeDict = TransitiveIncludeDictionary(includeDict) self.namespaceContainmentChecker = namespaceContainmentChecker self.namespaceUsageChecker = namespaceUsageChecker self.classUsageChecker = classUsageChecker self.transInhDict = TransitiveInheritanceDictionary(InheritanceDictionary()) def setTransitiveInheritanceDict(self, transInhDict): self.transInhDict = transInhDict def getTransitiveInheritanceDict(self): return self.transInhDict def getTransitiveIncludeDict(self): return self.transIncludeDict def getNamespaceContainmentChecker(self): return self.namespaceContainmentChecker def getNamespaceUsageChecker(self): return self.namespaceUsageChecker def getClassUsageChecker(self): return self.classUsageChecker ## # Wrapper for other method. ## #def getUsedNamespacesUsingLoc(self, parentNamespaceName, refSrcLoc): def getUsedNamespacesUsingLoc(self, refSrcLoc): #return self.getUsedNamespaces(parentNamespaceName, refSrcLoc.getSourceFile(), refSrcLoc.getStart()) return self.getUsedNamespaces(refSrcLoc.getSourceFile(), refSrcLoc.getStart()) ## # Retrieve a list of qualified names of classes that are imported through # usage declarations in transitively included files ## def getTransitiveUsedClassesUsingLoc(self, refSrcLoc): transIncludedUsedClasses = [] # get the transitively included using directives (excluding current file) transIncludedFiles = self.transIncludeDict.getTransitiveIncludedFiles(refSrcLoc.getSourceFile()) #transIncludedFiles.remove(refSrcLoc.getSourceFile()) classUsageChecker = self.getClassUsageChecker() for transIncludedFile in transIncludedFiles: for classUsageRef in classUsageChecker.getUsingDeclarationsInFile(transIncludedFile): if not(classUsageRef.isContainedInANamespace()): transIncludedUsedClasses.append(classUsageRef.getName()) return transIncludedUsedClasses def getTransitiveUsedClassesLocationsUsingLoc(self, refSrcLoc): transIncludedUsedClasses = [] # get the transitively included using directives (excluding current file) transIncludedFiles = self.transIncludeDict.getTransitiveIncludedFiles(refSrcLoc.getSourceFile()) #transIncludedFiles.remove(refSrcLoc.getSourceFile()) classUsageChecker = self.getClassUsageChecker() for transIncludedFile in transIncludedFiles: for classUsageRef in classUsageChecker.getUsingDeclarationsInFile(transIncludedFile): if not(classUsageRef.isContainedInANamespace()): transIncludedUsedClasses.append(classUsageRef) return transIncludedUsedClasses def getUsedClassesUsingLoc(self, parentNamespaceName, refSrcLoc, \ referencingClassName= ""): return self.getUsedClasses(parentNamespaceName, \ refSrcLoc.getSourceFile(), refSrcLoc.getStart(),\ referencingClassName) ## # Returns a list of qualified class names used at the given location. # # TODO: also append superclasses. ## def getUsedClasses(self, parentNamespaceName, referencingSourceFile,\ referencingLineNr,referencingClassName=""): nestedUsedClasses = [] classUsageChecker = self.getClassUsageChecker() classesUsed = classUsageChecker.getSurroundingNamespaceNames(referencingSourceFile, referencingLineNr) for usedClass in classesUsed: nestedUsedClasses.append(usedClass) usedNamespaces = self.getUsedNamespaces(referencingSourceFile, referencingLineNr) for usedNamespace in usedNamespaces: if usedNamespace == "": continue for usedClass in classesUsed: nestedUsedClass = usedClass if usedNamespace != "": nestedUsedClass = usedNamespace + "::" + usedClass if not(nestedUsedClass in nestedUsedClasses): nestedUsedClasses.append(nestedUsedClass) classesUsed = self.getTransitiveSuperclasses(referencingClassName) for usedClass in classesUsed: if not(usedClass in nestedUsedClasses): nestedUsedClasses.append(usedClass) return nestedUsedClasses def getTransitiveSuperclasses(self,referencingClassName): return self.transInhDict.getTransitiveSuperclasses(referencingClassName) ## # Returns a list of namespaces used at the given location. ## #def getUsedNamespaces(self, parentNamespaceName, referencingSourceFile, referencingLineNr): def getUsedNamespaces(self, referencingSourceFile, referencingLineNr): usedNamespaces = [] namespaceUsageChecker = self.getNamespaceUsageChecker() namespacesUsed = namespaceUsageChecker.getSurroundingNamespaceNames(referencingSourceFile, referencingLineNr) namespaceContainmentChecker = self.getNamespaceContainmentChecker() namespacesDeclared = namespaceContainmentChecker.getSurroundingNamespaceNames(referencingSourceFile, referencingLineNr) for declaredNamespace in namespacesDeclared: if not(declaredNamespace in usedNamespaces): usedNamespaces.append(declaredNamespace) for usedNamespace in namespacesUsed: if not(usedNamespace in usedNamespaces): usedNamespaces.append(usedNamespace) for declaredNamespace in namespacesDeclared: if declaredNamespace == "": continue nestedNamespace = declaredNamespace + "::"+ usedNamespace if not(nestedNamespace in usedNamespaces): usedNamespaces.append(nestedNamespace) if not("" in usedNamespaces): usedNamespaces.append("") return usedNamespaces
class Scope: def __init__(self, includeDict, namespaceContainmentChecker, \ namespaceUsageChecker,\ classUsageChecker=ClassUsageChecker(ClassUsageDictionary())): self.transIncludeDict = TransitiveIncludeDictionary(includeDict) self.namespaceContainmentChecker = namespaceContainmentChecker self.namespaceUsageChecker = namespaceUsageChecker self.classUsageChecker = classUsageChecker self.transInhDict = TransitiveInheritanceDictionary( InheritanceDictionary()) def setTransitiveInheritanceDict(self, transInhDict): self.transInhDict = transInhDict def getTransitiveInheritanceDict(self): return self.transInhDict def getTransitiveIncludeDict(self): return self.transIncludeDict def getNamespaceContainmentChecker(self): return self.namespaceContainmentChecker def getNamespaceUsageChecker(self): return self.namespaceUsageChecker def getClassUsageChecker(self): return self.classUsageChecker ## # Wrapper for other method. ## #def getUsedNamespacesUsingLoc(self, parentNamespaceName, refSrcLoc): def getUsedNamespacesUsingLoc(self, refSrcLoc): #return self.getUsedNamespaces(parentNamespaceName, refSrcLoc.getSourceFile(), refSrcLoc.getStart()) return self.getUsedNamespaces(refSrcLoc.getSourceFile(), refSrcLoc.getStart()) ## # Retrieve a list of qualified names of classes that are imported through # usage declarations in transitively included files ## def getTransitiveUsedClassesUsingLoc(self, refSrcLoc): transIncludedUsedClasses = [] # get the transitively included using directives (excluding current file) transIncludedFiles = self.transIncludeDict.getTransitiveIncludedFiles( refSrcLoc.getSourceFile()) #transIncludedFiles.remove(refSrcLoc.getSourceFile()) classUsageChecker = self.getClassUsageChecker() for transIncludedFile in transIncludedFiles: for classUsageRef in classUsageChecker.getUsingDeclarationsInFile( transIncludedFile): if not (classUsageRef.isContainedInANamespace()): transIncludedUsedClasses.append(classUsageRef.getName()) return transIncludedUsedClasses def getTransitiveUsedClassesLocationsUsingLoc(self, refSrcLoc): transIncludedUsedClasses = [] # get the transitively included using directives (excluding current file) transIncludedFiles = self.transIncludeDict.getTransitiveIncludedFiles( refSrcLoc.getSourceFile()) #transIncludedFiles.remove(refSrcLoc.getSourceFile()) classUsageChecker = self.getClassUsageChecker() for transIncludedFile in transIncludedFiles: for classUsageRef in classUsageChecker.getUsingDeclarationsInFile( transIncludedFile): if not (classUsageRef.isContainedInANamespace()): transIncludedUsedClasses.append(classUsageRef) return transIncludedUsedClasses def getUsedClassesUsingLoc(self, parentNamespaceName, refSrcLoc, \ referencingClassName= ""): return self.getUsedClasses(parentNamespaceName, \ refSrcLoc.getSourceFile(), refSrcLoc.getStart(),\ referencingClassName) ## # Returns a list of qualified class names used at the given location. # # TODO: also append superclasses. ## def getUsedClasses(self, parentNamespaceName, referencingSourceFile,\ referencingLineNr,referencingClassName=""): nestedUsedClasses = [] classUsageChecker = self.getClassUsageChecker() classesUsed = classUsageChecker.getSurroundingNamespaceNames( referencingSourceFile, referencingLineNr) for usedClass in classesUsed: nestedUsedClasses.append(usedClass) usedNamespaces = self.getUsedNamespaces(referencingSourceFile, referencingLineNr) for usedNamespace in usedNamespaces: if usedNamespace == "": continue for usedClass in classesUsed: nestedUsedClass = usedClass if usedNamespace != "": nestedUsedClass = usedNamespace + "::" + usedClass if not (nestedUsedClass in nestedUsedClasses): nestedUsedClasses.append(nestedUsedClass) classesUsed = self.getTransitiveSuperclasses(referencingClassName) for usedClass in classesUsed: if not (usedClass in nestedUsedClasses): nestedUsedClasses.append(usedClass) return nestedUsedClasses def getTransitiveSuperclasses(self, referencingClassName): return self.transInhDict.getTransitiveSuperclasses( referencingClassName) ## # Returns a list of namespaces used at the given location. ## #def getUsedNamespaces(self, parentNamespaceName, referencingSourceFile, referencingLineNr): def getUsedNamespaces(self, referencingSourceFile, referencingLineNr): usedNamespaces = [] namespaceUsageChecker = self.getNamespaceUsageChecker() namespacesUsed = namespaceUsageChecker.getSurroundingNamespaceNames( referencingSourceFile, referencingLineNr) namespaceContainmentChecker = self.getNamespaceContainmentChecker() namespacesDeclared = namespaceContainmentChecker.getSurroundingNamespaceNames( referencingSourceFile, referencingLineNr) for declaredNamespace in namespacesDeclared: if not (declaredNamespace in usedNamespaces): usedNamespaces.append(declaredNamespace) for usedNamespace in namespacesUsed: if not (usedNamespace in usedNamespaces): usedNamespaces.append(usedNamespace) for declaredNamespace in namespacesDeclared: if declaredNamespace == "": continue nestedNamespace = declaredNamespace + "::" + usedNamespace if not (nestedNamespace in usedNamespaces): usedNamespaces.append(nestedNamespace) if not ("" in usedNamespaces): usedNamespaces.append("") return usedNamespaces
typedefDbLoc = dbLoc + ".typedef" log.info(" Parsing typedefs ...") typedefDict = TypedefDictionary() scope = Scope(includeDict, namespaceContainmentChecker, namespaceUsageContainmentChecker, classUsageContainmentChecker) classSelector = ClassSelector(classDict, scope, typedefDict) snavTableReader.parseTypedefs(typedefDbLoc, typedefDict, classSelector, namespaceContainmentChecker) log.info(" Parsing inheritance relations ...") inhDict = InheritanceDictionary() snavTableReader.parseInheritance(inDbLoc, classDict, inhDict, classSelector) # Create a cache of transitive superclasses transInhDict = TransitiveInheritanceDictionary(inhDict) scope.setTransitiveInheritanceDict(transInhDict) methodSourceDict = MethodSourceDictionary( ) # TODO this is a java dictionary, make this general log.info(" Parsing methods ...") invokeableEntityDict = InvokeableEntityDictionary() snavTableReader.parseMethodTables(miDbLoc, mdDbLoc, classSelector, classDict, namespaceContainmentChecker, typedefDict, invokeableEntityDict, methodSourceDict) log.info(" Parsing functions ...") snavTableReader.parseFunctionTables(fuDbLoc, fdDbLoc, typedefDict, namespaceContainmentChecker, classSelector,