예제 #1
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
 def __uniqueDestination(self):
     """ Entry point for trying to resolve to a unique destination """
     found = False
     dstType = utils.spliceLastPackageName(self.content, ".")
     dstName = utils.spliceAllButLastPackageName(self.content, ".")
     mtdCands = self.methDict.getMethodsNamed(dstName)
     if 1 == len(mtdCands): # single method name candidate
         signature = mtdCands.keys()[0]
         found = self.__singleCandidateDestination(signature, dstType, dstName)
     else:
         found = self.__multipleCandidateDestinations(mtdCands, dstType, dstName)
     return found
 def __uniqueDestination(self):
     """ Entry point for trying to resolve to a unique destination """
     found = False
     dstType = utils.spliceLastPackageName(self.content, ".")
     dstName = utils.spliceAllButLastPackageName(self.content, ".")
     mtdCands = self.methDict.getMethodsNamed(dstName)
     if 1 == len(mtdCands):  # single method name candidate
         signature = mtdCands.keys()[0]
         found = self.__singleCandidateDestination(signature, dstType,
                                                   dstName)
     else:
         found = self.__multipleCandidateDestinations(
             mtdCands, dstType, dstName)
     return found
예제 #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
 def getOwnerUniqueName(self):
     return utils.spliceLastPackageName(self.src_unqName, ".")
 def getOwnerUniqueName(self):
     return utils.spliceLastPackageName(self.src_unqName, ".")