mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Enable highlighting error elements in type hints (PY-20530)
This commit is contained in:
@@ -9,6 +9,7 @@ import com.intellij.openapi.util.Pair;
|
||||
import com.intellij.openapi.util.Ref;
|
||||
import com.intellij.openapi.util.TextRange;
|
||||
import com.intellij.openapi.util.text.StringUtil;
|
||||
import com.intellij.psi.PsiComment;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.intellij.psi.PsiFile;
|
||||
import com.intellij.psi.ResolveResult;
|
||||
@@ -1407,6 +1408,21 @@ public class PyTypingTypeProvider extends PyTypeProviderBase {
|
||||
return "r";
|
||||
}
|
||||
|
||||
public static boolean isInAnnotationOrTypeComment(@NotNull PsiElement element) {
|
||||
final PsiElement realContext = PyPsiUtils.getRealContext(element);
|
||||
|
||||
if (PsiTreeUtil.getParentOfType(realContext, PyAnnotation.class, false, ScopeOwner.class) != null) {
|
||||
return true;
|
||||
}
|
||||
|
||||
final PsiComment comment = PsiTreeUtil.getParentOfType(realContext, PsiComment.class, false, ScopeOwner.class);
|
||||
if (comment != null && getTypeCommentValue(comment.getText()) != null) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static class Context {
|
||||
@NotNull private final TypeEvalContext myContext;
|
||||
@NotNull private final Set<PsiElement> myCache = new HashSet<>();
|
||||
|
||||
@@ -18,6 +18,7 @@ package com.jetbrains.python.documentation.doctest;
|
||||
import com.intellij.codeInsight.highlighting.HighlightErrorFilter;
|
||||
import com.intellij.psi.PsiErrorElement;
|
||||
import com.intellij.psi.PsiFile;
|
||||
import com.jetbrains.python.codeInsight.typing.PyTypingTypeProvider;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
@@ -27,8 +28,9 @@ import org.jetbrains.annotations.NotNull;
|
||||
*/
|
||||
public class PyDocstringErrorFilter extends HighlightErrorFilter {
|
||||
|
||||
public boolean shouldHighlightErrorElement(@NotNull final PsiErrorElement element) {
|
||||
@Override
|
||||
public boolean shouldHighlightErrorElement(@NotNull PsiErrorElement element) {
|
||||
final PsiFile file = element.getContainingFile();
|
||||
return !(file instanceof PyDocstringFile);
|
||||
return !(file instanceof PyDocstringFile) || PyTypingTypeProvider.isInAnnotationOrTypeComment(element);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,17 +3,14 @@ package com.jetbrains.python.inspections
|
||||
|
||||
import com.intellij.codeInsight.controlflow.ControlFlowUtil
|
||||
import com.intellij.codeInspection.*
|
||||
import com.intellij.lang.injection.InjectedLanguageManager
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.psi.PsiElement
|
||||
import com.intellij.psi.PsiElementVisitor
|
||||
import com.intellij.psi.PsiFileFactory
|
||||
import com.intellij.psi.util.PsiTreeUtil
|
||||
import com.intellij.psi.util.QualifiedName
|
||||
import com.jetbrains.python.PyNames
|
||||
import com.jetbrains.python.codeInsight.controlflow.ControlFlowCache
|
||||
import com.jetbrains.python.codeInsight.controlflow.ReadWriteInstruction
|
||||
import com.jetbrains.python.codeInsight.controlflow.ScopeOwner
|
||||
import com.jetbrains.python.codeInsight.dataflow.scope.ScopeUtil
|
||||
import com.jetbrains.python.codeInsight.functionTypeComments.PyFunctionTypeAnnotationDialect
|
||||
import com.jetbrains.python.codeInsight.typing.PyTypingTypeProvider
|
||||
@@ -283,8 +280,7 @@ class PyTypeHintsInspection : PyInspection() {
|
||||
null,
|
||||
ReplaceWithSubscriptionQuickFix())
|
||||
}
|
||||
else if (InjectedLanguageManager.getInstance(call.project).isInjectedFragment(call.containingFile) ||
|
||||
PsiTreeUtil.getParentOfType(call, PyAnnotation::class.java, true, ScopeOwner::class.java) != null) {
|
||||
else if (PyTypingTypeProvider.isInAnnotationOrTypeComment(call)) {
|
||||
multiFollowAssignmentsChain(callee)
|
||||
.asSequence()
|
||||
.map { if (it is PyFunction) it.containingClass else it }
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
from typing import Union
|
||||
|
||||
|
||||
def a(b: 'Union[int<error descr="']' expected">'</error>) -> 'Union[str<error descr="']' expected">'</error>:
|
||||
pass
|
||||
|
||||
|
||||
def c(d):
|
||||
# type: (Union[int<error descr="']' expected">)</error> -> Union[str<EOLError descr="']' expected"></EOLError>
|
||||
pass
|
||||
|
||||
|
||||
e = None # type: Union[str<EOLError descr="']' expected"></EOLError>
|
||||
|
||||
|
||||
def f(g: Union[int<error descr="']' expected">)</error> -> Union[str:<EOLError descr="':' or ']' expected"></EOLError>
|
||||
pass<EOLError descr="End of statement expected"></EOLError>
|
||||
|
||||
|
||||
h: Union[str<EOLError descr="']' expected"></EOLError>
|
||||
@@ -406,6 +406,11 @@ public class PythonHighlightingTest extends PyTestCase {
|
||||
doTest();
|
||||
}
|
||||
|
||||
// PY-20530
|
||||
public void testUnparsedTypeHints() {
|
||||
doTest(LanguageLevel.PYTHON36, false, false);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private static EditorColorsScheme createTemporaryColorScheme() {
|
||||
EditorColorsManager manager = EditorColorsManager.getInstance();
|
||||
|
||||
Reference in New Issue
Block a user