Beispiel #1
0
    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
Beispiel #2
0
	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
Beispiel #3
0
    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
Beispiel #4
0
	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
Beispiel #5
0
    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