Fix resolving of packages in FQN kdoc links

Assume link [pack.SomeType], pack no more will be marked as unresolved reference
This commit is contained in:
Simon Ogorodnik
2016-11-10 16:54:21 +03:00
parent c93e47febf
commit 62077dafc3
@@ -21,6 +21,7 @@ import org.jetbrains.kotlin.idea.resolve.ResolutionFacade
import org.jetbrains.kotlin.idea.util.getFileResolutionScope import org.jetbrains.kotlin.idea.util.getFileResolutionScope
import org.jetbrains.kotlin.kdoc.parser.KDocKnownTag import org.jetbrains.kotlin.kdoc.parser.KDocKnownTag
import org.jetbrains.kotlin.kdoc.psi.impl.KDocTag import org.jetbrains.kotlin.kdoc.psi.impl.KDocTag
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.KtPsiFactory import org.jetbrains.kotlin.psi.KtPsiFactory
import org.jetbrains.kotlin.psi.KtQualifiedExpression import org.jetbrains.kotlin.psi.KtQualifiedExpression
@@ -48,11 +49,15 @@ fun resolveKDocLink(context: BindingContext,
val scope = getKDocLinkResolutionScope(resolutionFacade, fromDescriptor) val scope = getKDocLinkResolutionScope(resolutionFacade, fromDescriptor)
if (qualifiedName.size == 1) { if (qualifiedName.size == 1) {
val descriptorsByName = scope.collectDescriptorsFiltered(nameFilter = { it.asString() == qualifiedName.single() }) val shortName = qualifiedName.single()
val descriptorsByName = scope.collectDescriptorsFiltered(nameFilter = { it.asString() == shortName })
// Try to find a matching local descriptor (parameter or type parameter) first. // Try to find a matching local descriptor (parameter or type parameter) first.
val localDescriptors = descriptorsByName.filter { it.containingDeclaration == fromDescriptor } val localDescriptors = descriptorsByName.filter { it.containingDeclaration == fromDescriptor }
if (localDescriptors.isNotEmpty()) return localDescriptors if (localDescriptors.isNotEmpty()) return localDescriptors
return descriptorsByName if (descriptorsByName.isNotEmpty()) return descriptorsByName
val moduleDescriptor = fromDescriptor.module
return moduleDescriptor.getSubPackagesOf(FqName.ROOT, { it.asString() == shortName }).map { moduleDescriptor.getPackage(it) }
} }
val moduleDescriptor = fromDescriptor.module val moduleDescriptor = fromDescriptor.module