mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-04-18 04:21:24 +07:00
PY-82222: gtd: don't resolve a skeleton when there is a pyi
GitOrigin-RevId: dd0a8f526c9a55e6ccfd9aa163fab53ec2c07a6d
This commit is contained in:
committed by
intellij-monorepo-bot
parent
ad7d7df5e0
commit
48378debba
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user