def collectClassReferences(self, className, namespaceList): classReferences = [] for namespaceName in namespaceList: nestedClassReferences = self.classDict.getClassesByNamespace( className, namespaceName) for classReference in nestedClassReferences: if not (classReference in classReferences): classReferences.append(classReference) qualifiedName = className if namespaceName != "": qualifiedName = namespaceName + "::" + className if self.typeDefDict.containsAlias(qualifiedName): baseType = self.typeDefDict.getBaseType(qualifiedName) parentNamespace = getParentNamespaceName(baseType) nonQualifiedBaseType = getNonQualifiedName(baseType) nestedClassReferences = self.classDict.getClassesByNamespace( nonQualifiedBaseType, parentNamespace) for classReference in nestedClassReferences: if not (classReference in classReferences): classReferences.append(classReference) return classReferences
def add(self, className, sourceFile, lineNr, classData): isAdded = False nonQualifiedClassName = getNonQualifiedName(className) parentNamespaceName = getParentNamespaceName(className) # adjust the given namespace name in case the classname # was qualified if parentNamespaceName != "": givenNamespaceName = getNamespaceName(classData) if givenNamespaceName != "": parentNamespaceName = givenNamespaceName + "::" + parentNamespaceName classData[1] = parentNamespaceName if ( not(nonQualifiedClassName in self.dict) ): self.dict[nonQualifiedClassName] = {} if ( not(sourceFile in self.dict[nonQualifiedClassName]) ): self.dict[nonQualifiedClassName][sourceFile] = {} if ( not(lineNr in self.dict[nonQualifiedClassName][sourceFile]) ): self.dict[nonQualifiedClassName][sourceFile][lineNr]=classData isAdded = True return isAdded
def collectClassReferences(self, className, namespaceList): classReferences = [] for namespaceName in namespaceList: nestedClassReferences = self.classDict.getClassesByNamespace(className, namespaceName) for classReference in nestedClassReferences: if not (classReference in classReferences): classReferences.append(classReference) qualifiedName = className if namespaceName != "": qualifiedName = namespaceName + "::" + className if self.typeDefDict.containsAlias(qualifiedName): baseType = self.typeDefDict.getBaseType(qualifiedName) parentNamespace = getParentNamespaceName(baseType) nonQualifiedBaseType = getNonQualifiedName(baseType) nestedClassReferences = self.classDict.getClassesByNamespace(nonQualifiedBaseType, parentNamespace) for classReference in nestedClassReferences: if not (classReference in classReferences): classReferences.append(classReference) return classReferences
def selectClasses(self, qualifiedClassName, referencingSourceFile, referencingLineNr): relevantClassReferences = [] translatedName = self.translateAsTypeDef(qualifiedClassName) parentNamespaceName = getParentNamespaceName(qualifiedClassName) nonQualifiedClassName = getNonQualifiedName(qualifiedClassName) #namespacesUsed = self.scope.getUsedNamespaces(parentNamespaceName, referencingSourceFile, referencingLineNr) namespacesUsed = self.scope.getUsedNamespaces(referencingSourceFile, referencingLineNr) if parentNamespaceName != "": index = 0 while index < len(namespacesUsed): usedNamespace = namespacesUsed[index] if usedNamespace == "": usedNamespace = parentNamespaceName else: usedNamespace += "::" + parentNamespaceName namespacesUsed[index] = usedNamespace index += 1 classReferences = self.classCollector.collectClassReferences(nonQualifiedClassName, namespacesUsed) # Which classes are reachable through (transitive) #includes? #print qualifiedClassName transIncludeDict = self.scope.getTransitiveIncludeDict() transitiveIncludedFiles=transIncludeDict.getTransitiveIncludedFiles(referencingSourceFile) for classReference in classReferences: sourceFile = classReference.getSourceFile() #print sourceFile, " in ", transitiveIncludedFiles #selectSourceFileMatches(sourceFile,transitiveIncludedFiles) if sourceFile in transitiveIncludedFiles: if not(classReference in relevantClassReferences): relevantClassReferences.append(classReference) else: conf = transIncludeDict.trySymlinkPath(sourceFile, transitiveIncludedFiles) if conf > 1 and not(classReference in relevantClassReferences): relevantClassReferences.append(classReference) sl = SourceLocation(referencingSourceFile, referencingLineNr, referencingLineNr) # TODO: we do an 'or' here, but we should check that (i) it is reachable # via include, and (ii) the namespacing is also ok # Which classes are reachable through namespacing. usedClassesLocations = self.scope.getTransitiveUsedClassesLocationsUsingLoc(sl) for usedClassLoc in usedClassesLocations: # convert to ClassReferenceEntity clsName = usedClassLoc.getNonQualifiedName() nspName = utils.spliceLastPackageName(usedClassLoc.getName(),utils.qualSeparator) sLoc = usedClassLoc.getSourceLocations()[0] cre = ClassReferenceEntity(clsName, nspName, sLoc.sourceFile, sLoc.start, "") if clsName == qualifiedClassName and not cre in relevantClassReferences: relevantClassReferences.append(cre) return relevantClassReferences
def selectClasses(self, qualifiedClassName, referencingSourceFile, referencingLineNr): relevantClassReferences = [] translatedName = self.translateAsTypeDef(qualifiedClassName) parentNamespaceName = getParentNamespaceName(qualifiedClassName) nonQualifiedClassName = getNonQualifiedName(qualifiedClassName) #namespacesUsed = self.scope.getUsedNamespaces(parentNamespaceName, referencingSourceFile, referencingLineNr) namespacesUsed = self.scope.getUsedNamespaces(referencingSourceFile, referencingLineNr) if parentNamespaceName != "": index = 0 while index < len(namespacesUsed): usedNamespace = namespacesUsed[index] if usedNamespace == "": usedNamespace = parentNamespaceName else: usedNamespace += "::" + parentNamespaceName namespacesUsed[index] = usedNamespace index += 1 classReferences = self.classCollector.collectClassReferences( nonQualifiedClassName, namespacesUsed) # Which classes are reachable through (transitive) #includes? #print qualifiedClassName transIncludeDict = self.scope.getTransitiveIncludeDict() transitiveIncludedFiles = transIncludeDict.getTransitiveIncludedFiles( referencingSourceFile) for classReference in classReferences: sourceFile = classReference.getSourceFile() #print sourceFile, " in ", transitiveIncludedFiles #selectSourceFileMatches(sourceFile,transitiveIncludedFiles) if sourceFile in transitiveIncludedFiles: if not (classReference in relevantClassReferences): relevantClassReferences.append(classReference) else: conf = transIncludeDict.trySymlinkPath( sourceFile, transitiveIncludedFiles) if conf > 1 and not (classReference in relevantClassReferences): relevantClassReferences.append(classReference) sl = SourceLocation(referencingSourceFile, referencingLineNr, referencingLineNr) # TODO: we do an 'or' here, but we should check that (i) it is reachable # via include, and (ii) the namespacing is also ok # Which classes are reachable through namespacing. usedClassesLocations = self.scope.getTransitiveUsedClassesLocationsUsingLoc( sl) for usedClassLoc in usedClassesLocations: # convert to ClassReferenceEntity clsName = usedClassLoc.getNonQualifiedName() nspName = utils.spliceLastPackageName(usedClassLoc.getName(), utils.qualSeparator) sLoc = usedClassLoc.getSourceLocations()[0] cre = ClassReferenceEntity(clsName, nspName, sLoc.sourceFile, sLoc.start, "") if clsName == qualifiedClassName and not cre in relevantClassReferences: relevantClassReferences.append(cre) return relevantClassReferences