diff --git a/python/python-psi-impl/src/com/jetbrains/python/psi/resolve/PyResolveUtil.java b/python/python-psi-impl/src/com/jetbrains/python/psi/resolve/PyResolveUtil.java index 4c34ba6d2235..b93120651e36 100644 --- a/python/python-psi-impl/src/com/jetbrains/python/psi/resolve/PyResolveUtil.java +++ b/python/python-psi-impl/src/com/jetbrains/python/psi/resolve/PyResolveUtil.java @@ -424,9 +424,14 @@ public final class PyResolveUtil { // Forward references are allowed in annotations according to PEP 563 PsiFile file = element.getContainingFile(); if (file instanceof PyFile pyFile) { - return pyFile.getLanguageLevel().isAtLeast(LanguageLevel.PYTHON37) && - pyFile.hasImportFromFuture(FutureFeature.ANNOTATIONS) && - PsiTreeUtil.getParentOfType(element, PyAnnotation.class) != null; + boolean isAnnotation = pyFile.getLanguageLevel().isAtLeast(LanguageLevel.PYTHON37) && + pyFile.hasImportFromFuture(FutureFeature.ANNOTATIONS) && + PsiTreeUtil.getParentOfType(element, PyAnnotation.class) != null; + if (isAnnotation) return true; + + boolean isReferenceFromTypeParameterList = pyFile.getLanguageLevel().isAtLeast(LanguageLevel.PYTHON312) && + PsiTreeUtil.getParentOfType(element, PyTypeParameter.class, true) != null; + if (isReferenceFromTypeParameterList) return true; } return false; } diff --git a/python/testSrc/com/jetbrains/python/inspections/PyUnresolvedReferencesInspectionTest.java b/python/testSrc/com/jetbrains/python/inspections/PyUnresolvedReferencesInspectionTest.java index 398be1b7c97a..1c446f67b1a8 100644 --- a/python/testSrc/com/jetbrains/python/inspections/PyUnresolvedReferencesInspectionTest.java +++ b/python/testSrc/com/jetbrains/python/inspections/PyUnresolvedReferencesInspectionTest.java @@ -881,6 +881,21 @@ public class PyUnresolvedReferencesInspectionTest extends PyInspectionTestCase { }); } + // PY-76895 + public void testForwardReferenceInTypeParameterBound() { + runWithLanguageLevel(LanguageLevel.PYTHON312, () -> { + doTestByText(""" + class ClassA[S: ForwardReference[int], T: "ForwardReference[str]"]: # OK + ... + class ClassB[T: (ForwardReference[int], "ForwardReference[str]", bytes)]: # OK + ... + class ClassC[T = ForwardReference[int], T1 = "ForwardReference[str]"]: # OK + ... + class ForwardReference[T]: ... + """); + }); + } + @NotNull @Override protected Class getInspectionClass() {