From 1fd9cf454d9cb4e656a35972cf53ce06a167098a Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Mon, 1 Apr 2024 10:32:23 +0200 Subject: [PATCH] [java] more precise highlighting for "Annotations are not allowed in deconstruction pattern types" GitOrigin-RevId: 689808b6ab80920e12a0b5d55712df066e84a406 --- .../impl/analysis/HighlightVisitorImpl.java | 7 ++++- .../analysis/PatternHighlightingModel.java | 28 +------------------ .../NotAnnotationsInDeconstructionType.java | 4 +-- 3 files changed, 9 insertions(+), 30 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java index 6a49f6a4dad6..d9867a20af87 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java @@ -1917,7 +1917,12 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh @Override public void visitDeconstructionPattern(@NotNull PsiDeconstructionPattern deconstructionPattern) { super.visitDeconstructionPattern(deconstructionPattern); - add(PatternHighlightingModel.checkReferenceTypeIsNotAnnotated(deconstructionPattern.getTypeElement())); + PsiTreeUtil.processElements(deconstructionPattern.getTypeElement(), PsiAnnotation.class, annotation -> { + add(HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR) + .range(annotation) + .descriptionAndTooltip(JavaErrorBundle.message("deconstruction.pattern.type.contain.annotation"))); + return true; + }); PsiElement parent = deconstructionPattern.getParent(); if (parent instanceof PsiForeachPatternStatement forEach) { add(checkFeature(deconstructionPattern, JavaFeature.RECORD_PATTERNS_IN_FOR_EACH)); diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/PatternHighlightingModel.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/PatternHighlightingModel.java index 6f451a45684b..65d9f55d2f5f 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/PatternHighlightingModel.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/PatternHighlightingModel.java @@ -1,4 +1,4 @@ -// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.codeInsight.daemon.impl.analysis; import com.intellij.codeInsight.daemon.JavaErrorBundle; @@ -331,32 +331,6 @@ final class PatternHighlightingModel { return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(pattern).descriptionAndTooltip(description); } - private static final PsiTypeVisitor HAS_ANNOTATION_TYPE_VISITOR = new PsiTypeVisitor<>() { - @Override - public Boolean visitClassType(@NotNull PsiClassType classType) { - for (PsiType p : classType.getParameters()) { - if (p == null) continue; - if (p.accept(this)) return true; - } - return super.visitClassType(classType); - } - - @Override - public Boolean visitType(@NotNull PsiType type) { - return type.getAnnotations().length != 0; - } - }; - static HighlightInfo.Builder checkReferenceTypeIsNotAnnotated(@NotNull PsiTypeElement typeElement) { - Boolean hasAnnotation = typeElement.getType().accept(HAS_ANNOTATION_TYPE_VISITOR); - if (hasAnnotation) { - String message = JavaErrorBundle.message("deconstruction.pattern.type.contain.annotation"); - return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR) - .range(typeElement) - .descriptionAndTooltip(message); - } - return null; - } - static void checkForEachPatternApplicable(@NotNull PsiDeconstructionPattern pattern, @NotNull PsiType patternType, @NotNull PsiType itemType, diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatterns/NotAnnotationsInDeconstructionType.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatterns/NotAnnotationsInDeconstructionType.java index 77a6e5b6bf6d..7d37d8433766 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatterns/NotAnnotationsInDeconstructionType.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatterns/NotAnnotationsInDeconstructionType.java @@ -4,11 +4,11 @@ import java.lang.annotation.Target; public class NotAnnotationsInDeconstructionType { private void test(T t) { - t instanceof T<@SomeAnnotation String>(String s); + t instanceof T<@SomeAnnotation String>(String s); } private void test2(T[] t) { - if (t instanceof T @SomeAnnotation [](String s)) { + if (t instanceof T @SomeAnnotation [](String s)) { System.out.println(); } }