PY-82222: gtd: don't resolve a skeleton when there is a pyi

GitOrigin-RevId: dd0a8f526c9a55e6ccfd9aa163fab53ec2c07a6d
This commit is contained in:
Morgan Bartholomew
2026-01-13 13:02:14 +10:00
committed by intellij-monorepo-bot
parent ad7d7df5e0
commit 48378debba
2 changed files with 41 additions and 7 deletions

View File

@@ -17,16 +17,19 @@ package com.jetbrains.python.psi.impl
import com.intellij.codeInsight.navigation.actions.GotoDeclarationHandlerBase
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.vfs.VfsUtilCore
import com.intellij.psi.PsiElement
import com.intellij.psi.impl.source.resolve.FileContextUtil
import com.jetbrains.python.PyUserInitiatedResolvableReference
import com.jetbrains.python.psi.PyElement
import com.jetbrains.python.psi.PyFile
import com.jetbrains.python.psi.PyQualifiedExpression
import com.jetbrains.python.psi.PyReferenceOwner
import com.jetbrains.python.psi.resolve.PyResolveContext
import com.jetbrains.python.psi.resolve.PyResolveUtil
import com.jetbrains.python.psi.resolve.*
import com.jetbrains.python.psi.types.TypeEvalContext
import com.jetbrains.python.pyi.PyiFile
import com.jetbrains.python.pyi.PyiUtil
import com.jetbrains.python.sdk.PythonSdkUtil
/**
* [com.intellij.codeInsight.navigation.actions.GotoDeclarationAction] uses [PsiElement.findReferenceAt].
@@ -53,11 +56,15 @@ class PyGotoDeclarationHandler : GotoDeclarationHandlerBase() {
val referenceOwner = sourceElement as? PyReferenceOwner ?: parent as? PyReferenceOwner
if (referenceOwner != null) {
val results = PyResolveUtil.multiResolveDeclaration(referenceOwner.getReference(context), context)
.map {
if (PyiUtil.isInsideStub(it) && !PyiUtil.isInsideStub(FileContextUtil.getContextFile(sourceElement)!!)) {
PyiUtil.getOriginalElement(it as PyElement) ?: it
.map { declaration ->
if (
PyiUtil.isInsideStub(declaration)
&& !PyiUtil.isInsideStub(FileContextUtil.getContextFile(sourceElement)!!)
) {
val originalElement = PyiUtil.getOriginalElement(declaration as PyElement)
if ((originalElement ?: declaration).isInSkeleton()) declaration else originalElement ?: declaration
}
else it
else declaration
}
.filter { it !== referenceOwner }
.groupBy { it.containingFile }
@@ -85,4 +92,18 @@ private fun PsiElement.findProvidedReferenceAndResolve(): Array<PsiElement>? =
.firstNotNullOfOrNull { ref ->
(ref as? PyUserInitiatedResolvableReference)?.userInitiatedResolve()?.takeIf { it !== this }
}
?.let { arrayOf(it) }
?.let { arrayOf(it) }
private fun PsiElement.isInSkeleton(): Boolean {
val containingFile = this.containingFile as? PyFile ?: return false
if (containingFile is PyiFile) {
return false
}
val virtualFile = containingFile.virtualFile ?: return false
val sdk = PythonSdkUtil.findPythonSdk(containingFile) ?: return false
val skeletonsDir = PythonSdkUtil.findSkeletonsDir(sdk) ?: return false
return VfsUtilCore.isAncestor(skeletonsDir, virtualFile, false)
}