Enable highlighting error elements in type hints (PY-20530)

This commit is contained in:
Semyon Proshev
2018-06-13 23:12:46 +03:00
parent adec865a52
commit 0d9bf8ebff
5 changed files with 46 additions and 7 deletions
@@ -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();