[java-inspections] Preview feature warning: limit highlighting to method name

Fixes IDEA-362013 Stream.of should not be highlighted because it's not a preview feature


(cherry picked from commit 0818188d2e5ae25916c0433dfe976c808eebf869)

IJ-CR-151174

GitOrigin-RevId: c81154ec031a4da1ef432831628fe93537ce599b
This commit is contained in:
Tagir Valeev
2024-12-09 14:41:59 +01:00
committed by intellij-monorepo-bot
parent f630f8ccd8
commit a35bbc7c9c
6 changed files with 31 additions and 12 deletions

View File

@@ -5,10 +5,7 @@ import com.intellij.codeInsight.daemon.impl.analysis.PreviewFeatureVisitorBase;
import com.intellij.codeInspection.LocalInspectionTool;
import com.intellij.codeInspection.ProblemsHolder;
import com.intellij.pom.java.JavaFeature;
import com.intellij.psi.PsiAnnotation;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiElementVisitor;
import com.intellij.psi.PsiImportStatementBase;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiUtil;
import org.jetbrains.annotations.NotNull;
@@ -42,6 +39,12 @@ public final class PreviewFeatureInspection extends LocalInspectionTool {
protected void registerProblem(PsiElement element, String description, JavaFeature feature, PsiAnnotation annotation) {
// Do not report warnings in imports, because they cannot be suppressed and javac doesn't report them
if (element.getParent() instanceof PsiImportStatementBase) return;
if (element instanceof PsiReferenceExpression ref) {
PsiElement nameElement = ref.getReferenceNameElement();
if (nameElement != null) {
element = nameElement;
}
}
myHolder.registerProblem(element, description);
}
}

View File

@@ -0,0 +1,6 @@
package com.mycom;
public interface PreviewFeatureMethod {
@jdk.internal.PreviewFeature(feature = jdk.internal.PreviewFeature.Feature.SEALED_CLASSES)
void f();
}

View File

@@ -5,10 +5,10 @@ class Main {
public Main(String s) { }
{
var a = new <warning descr="com.mycom.FirstPreviewFeature.Outer.Inner is a preview API and may be removed in a future release"><warning descr="com.mycom.FirstPreviewFeature.Outer is a preview API and may be removed in a future release"><warning descr="com.mycom.FirstPreviewFeature is a preview API and may be removed in a future release">FirstPreviewFeature</warning>.Outer</warning>.Inner</warning>();
<warning descr="com.mycom.FirstPreviewFeature.Outer.Inner#z is a preview API and may be removed in a future release">a.z</warning>();
Runnable r = <warning descr="com.mycom.FirstPreviewFeature.Outer.Inner#z is a preview API and may be removed in a future release">a::z</warning>;
new Main(<warning descr="com.mycom.FirstPreviewFeature#KEY is a preview API and may be removed in a future release"><warning descr="com.mycom.FirstPreviewFeature is a preview API and may be removed in a future release">FirstPreviewFeature</warning>.KEY</warning>);
new Main(<warning descr="com.mycom.FirstPreviewFeature#KEY is a preview API and may be removed in a future release"><warning descr="com.mycom.FirstPreviewFeature is a preview API and may be removed in a future release">FirstPreviewFeature</warning>.KEY</warning> + "");
new Main("" + <warning descr="com.mycom.FirstPreviewFeature#KEY is a preview API and may be removed in a future release"><warning descr="com.mycom.FirstPreviewFeature is a preview API and may be removed in a future release">FirstPreviewFeature</warning>.KEY</warning>);
a.<warning descr="com.mycom.FirstPreviewFeature.Outer.Inner#z is a preview API and may be removed in a future release">z</warning>();
Runnable r = a::<warning descr="com.mycom.FirstPreviewFeature.Outer.Inner#z is a preview API and may be removed in a future release">z</warning>;
new Main(<warning descr="com.mycom.FirstPreviewFeature is a preview API and may be removed in a future release">FirstPreviewFeature</warning>.<warning descr="com.mycom.FirstPreviewFeature#KEY is a preview API and may be removed in a future release">KEY</warning>);
new Main(<warning descr="com.mycom.FirstPreviewFeature is a preview API and may be removed in a future release">FirstPreviewFeature</warning>.<warning descr="com.mycom.FirstPreviewFeature#KEY is a preview API and may be removed in a future release">KEY</warning> + "");
new Main("" + <warning descr="com.mycom.FirstPreviewFeature is a preview API and may be removed in a future release">FirstPreviewFeature</warning>.<warning descr="com.mycom.FirstPreviewFeature#KEY is a preview API and may be removed in a future release">KEY</warning>);
}
}

View File

@@ -3,7 +3,7 @@ import com.mycom.FirstPreviewFeature;
class Main {
{
<warning descr="com.mycom.FirstPreviewFeature#g is a preview API and may be removed in a future release"><warning descr="com.mycom.FirstPreviewFeature is a preview API and may be removed in a future release">FirstPreviewFeature</warning>.g</warning>();
Runnable r = <warning descr="com.mycom.FirstPreviewFeature#g is a preview API and may be removed in a future release"><warning descr="com.mycom.FirstPreviewFeature is a preview API and may be removed in a future release">FirstPreviewFeature</warning>::g</warning>;
<warning descr="com.mycom.FirstPreviewFeature is a preview API and may be removed in a future release">FirstPreviewFeature</warning>.<warning descr="com.mycom.FirstPreviewFeature#g is a preview API and may be removed in a future release">g</warning>();
Runnable r = <warning descr="com.mycom.FirstPreviewFeature is a preview API and may be removed in a future release">FirstPreviewFeature</warning>::<warning descr="com.mycom.FirstPreviewFeature#g is a preview API and may be removed in a future release">g</warning>;
}
}

View File

@@ -0,0 +1,8 @@
import com.mycom.PreviewFeatureMethod;
class Main {
void test(PreviewFeatureMethod m){
m.<warning descr="com.mycom.PreviewFeatureMethod#f is a preview API and may be removed in a future release">f</warning>();
}
}

View File

@@ -18,13 +18,15 @@ public final class PreviewFeatureWarningsTest extends LightJavaCodeInsightFixtur
myFixture.enableInspections(PreviewFeatureInspection.class);
myFixture.configureByFiles(
BASE_PATH + "/../java.base/jdk.internal/PreviewFeature.java",
BASE_PATH + "/../java.base/jdk.internal/FirstPreviewFeature.java"
BASE_PATH + "/../java.base/jdk.internal/FirstPreviewFeature.java",
BASE_PATH + "/../java.base/jdk.internal/PreviewFeatureMethod.java"
);
}
public void testImplementsPreviewFeature() { doTest(); }
public void testAccessInnerClassInsidePreviewFeatureClass() { doTest(); }
public void testAccessStaticMethodInPreviewFeatureClass() { doTest(); }
public void testCallPreviewMethod() { doTest(); }
public void testSuppressPreviewFeatureWarning() { doTest(); }
@Override