diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java
index 7089cc697eb7..df3aa7bd58eb 100644
--- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java
+++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java
@@ -7,10 +7,6 @@ import com.intellij.codeInsight.daemon.impl.HighlightInfoType;
import com.intellij.codeInsight.daemon.impl.quickfix.QuickFixAction;
import com.intellij.codeInsight.daemon.impl.quickfix.QuickFixActionRegistrarImpl;
import com.intellij.codeInsight.intention.QuickFixFactory;
-import com.intellij.lang.jvm.JvmEnumField;
-import com.intellij.lang.jvm.annotation.JvmAnnotationAttribute;
-import com.intellij.lang.jvm.annotation.JvmAnnotationAttributeValue;
-import com.intellij.lang.jvm.annotation.JvmAnnotationEnumFieldValue;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.DumbService;
import com.intellij.openapi.project.IndexNotReadyException;
@@ -26,7 +22,6 @@ import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.*;
import com.intellij.psi.impl.PsiClassImplUtil;
import com.intellij.psi.impl.PsiImplUtil;
-import com.intellij.psi.impl.source.resolve.JavaResolveUtil;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.PsiShortNamesCache;
import com.intellij.psi.search.searches.SuperMethodsSearch;
@@ -37,15 +32,12 @@ import com.intellij.util.containers.ContainerUtil;
import com.siyeh.ig.psiutils.VariableAccessUtils;
import gnu.trove.THashMap;
import gnu.trove.THashSet;
-import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.*;
-import static com.intellij.util.ObjectUtils.tryCast;
-
public class GenericsHighlightUtil {
private static final Logger LOG = Logger.getInstance(GenericsHighlightUtil.class);
@@ -1557,49 +1549,10 @@ public class GenericsHighlightUtil {
return null;
}
- @Nullable
- @Contract(value = "null -> null", pure = true)
- static HighlightingFeature extractHighlightingFeature(@Nullable final PsiAnnotation annotation) {
- if (annotation == null) return null;
- if (!CommonClassNames.JDK_INTERNAL_PREVIEW_FEATURE.equals(annotation.getQualifiedName())) return null;
-
- final JvmAnnotationAttribute feature = annotation.findAttribute("feature");
- if (feature == null) return null;
-
- final JvmAnnotationAttributeValue attributeValue = feature.getAttributeValue();
- if (attributeValue == null) return null;
-
- final JvmAnnotationEnumFieldValue annotationEnumFieldValue = tryCast(attributeValue, JvmAnnotationEnumFieldValue.class);
- if (annotationEnumFieldValue == null) return null;
-
- final JvmEnumField field = annotationEnumFieldValue.getField();
- if (field == null) return null;
-
- return HighlightingFeature.convertFromPreviewFeature(field.getName());
- }
-
public static HighlightInfo checkTypePreviewFeatureAnnotation(@NotNull final PsiTypeElement type,
@NotNull final LanguageLevel level) {
final PsiClass clazz = PsiTypesUtil.getPsiClass(type.getType());
- final PsiAnnotation annotation = getPreviewFeatureAnnotation(clazz);
- if (annotation == null) return null;
-
- final HighlightingFeature feature = extractHighlightingFeature(annotation);
- if (feature == null) return null;
-
- return HighlightUtil.checkFeature(type, feature, level, type.getContainingFile());
- }
-
- @Nullable
- @Contract(value = "null -> null", pure = true)
- private static PsiAnnotation getPreviewFeatureAnnotation(@Nullable final PsiClass clazz) {
- if (clazz == null) return null;
- final PsiAnnotation annotation = clazz.getAnnotation(CommonClassNames.JDK_INTERNAL_PREVIEW_FEATURE);
- if (annotation != null) return annotation;
-
- final PsiPackage psiPackage = JavaResolveUtil.getContainingPackage(clazz);
- if (psiPackage == null) return null;
- return psiPackage.getAnnotation(CommonClassNames.JDK_INTERNAL_PREVIEW_FEATURE);
+ return HighlightUtil.checkPreviewFeatureElement(type, clazz, level);
}
}
\ No newline at end of file
diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightClassUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightClassUtil.java
index 7af37992e1c8..1e8af0cfd287 100644
--- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightClassUtil.java
+++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightClassUtil.java
@@ -862,7 +862,7 @@ public class HighlightClassUtil {
/**
* This method validates that the language level of the project where a new expression accesses
- * the constructor that is annotated with {@link CommonClassNames#JDK_INTERNAL_PREVIEW_FEATURE} is sufficient
+ * the constructor that is annotated with {@link HighlightingFeature#JDK_INTERNAL_PREVIEW_FEATURE} is sufficient
*
* @param expression the expression to examine
* @param level the current language level
@@ -872,12 +872,8 @@ public class HighlightClassUtil {
static HighlightInfo checkConstructorPreviewFeature(@NotNull final PsiNewExpression expression,
@NotNull final LanguageLevel level) {
final PsiMethod method = expression.resolveMethod();
- if (method == null) return null;
- final HighlightingFeature feature = GenericsHighlightUtil.extractHighlightingFeature(method.getAnnotation(CommonClassNames.JDK_INTERNAL_PREVIEW_FEATURE));
- if (feature == null) return null;
-
- return HighlightUtil.checkFeature(expression, feature, level, expression.getContainingFile());
+ return HighlightUtil.checkPreviewFeatureElement(expression, method, level);
}
public static HighlightInfo checkCreateInnerClassFromStaticContext(@NotNull PsiElement element,
diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightMethodUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightMethodUtil.java
index 11ea420d1208..34d44ba16991 100644
--- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightMethodUtil.java
+++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightMethodUtil.java
@@ -1321,7 +1321,7 @@ public class HighlightMethodUtil {
/**
* This method validates that the language level of the project where a call expression accesses
- * the method that is annotated with {@link CommonClassNames#JDK_INTERNAL_PREVIEW_FEATURE} is sufficient
+ * the method that is annotated with {@link HighlightingFeature#JDK_INTERNAL_PREVIEW_FEATURE} is sufficient
*
* @param methodCallExpression the expression to examine
* @param level the current language level
@@ -1330,15 +1330,9 @@ public class HighlightMethodUtil {
*/
static HighlightInfo checkMethodCallPreviewFeatureAnnotation(@NotNull final PsiMethodCallExpression methodCallExpression,
@NotNull final LanguageLevel level) {
- final PsiReferenceExpression methodExpression = methodCallExpression.getMethodExpression();
- final PsiElement targetMethod = methodExpression.resolve();
- if (!(targetMethod instanceof PsiJvmModifiersOwner)) return null;
+ final PsiMethod targetMethod = methodCallExpression.resolveMethod();
- final PsiAnnotation annotation = ((PsiJvmModifiersOwner)targetMethod).getAnnotation(CommonClassNames.JDK_INTERNAL_PREVIEW_FEATURE);
- final HighlightingFeature feature = GenericsHighlightUtil.extractHighlightingFeature(annotation);
- if (feature == null) return null;
-
- return HighlightUtil.checkFeature(methodCallExpression, feature, level, methodCallExpression.getContainingFile());
+ return HighlightUtil.checkPreviewFeatureElement(methodCallExpression, targetMethod, level);
}
static HighlightInfo checkConstructorCallsBaseClassConstructor(@NotNull PsiMethod constructor,
diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java
index 4e0c4382db99..98d61610777e 100644
--- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java
+++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java
@@ -62,6 +62,7 @@ import com.intellij.util.ui.UIUtil;
import com.intellij.xml.util.XmlStringUtil;
import com.siyeh.ig.psiutils.ControlFlowUtils;
import gnu.trove.THashMap;
+import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.PropertyKey;
@@ -1592,36 +1593,41 @@ public class HighlightUtil {
return null;
}
- public static HighlightInfo checkFieldPreviewFeatureAnnotation(@NotNull final PsiReferenceExpression expression,
- @NotNull final PsiField field,
- @NotNull final LanguageLevel level) {
- final HighlightingFeature feature = GenericsHighlightUtil.extractHighlightingFeature(field.getAnnotation(CommonClassNames.JDK_INTERNAL_PREVIEW_FEATURE));
- if (feature == null) return null;
-
- return checkFeature(expression, feature, level, expression.getContainingFile());
- }
-
- public static HighlightInfo checkPackagePreviewFeatureAnnotation(@NotNull final PsiImportStatement statement,
+ public static HighlightInfo checkPackagePreviewFeatureAnnotation(@NotNull final PsiImportStatementBase statement,
@NotNull final LanguageLevel level) {
final PsiElement resolve = statement.resolve();
- final PsiPackage psiPackage;
- if (resolve instanceof PsiPackage) {
- psiPackage = (PsiPackage)resolve;
- }
- else if (resolve instanceof PsiClass) {
- psiPackage = JavaResolveUtil.getContainingPackage((PsiClass)resolve);
- }
- else {
- return null;
- }
+ if (!(resolve instanceof PsiModifierListOwner)) return null;
- if (psiPackage == null) return null;
+ final PsiModifierListOwner owner = (PsiModifierListOwner)resolve;
+ return checkPreviewFeatureElement(statement, owner, level);
+ }
- final PsiAnnotation annotation = psiPackage.getAnnotation(CommonClassNames.JDK_INTERNAL_PREVIEW_FEATURE);
- final HighlightingFeature feature = GenericsHighlightUtil.extractHighlightingFeature(annotation);
+ @Nullable
+ @Contract(value = "null, _, _ -> null; _, null, _ -> null", pure = true)
+ static HighlightInfo checkPreviewFeatureElement(@Nullable final PsiElement context,
+ @Nullable final PsiModifierListOwner owner,
+ @NotNull final LanguageLevel level) {
+ if (context == null) return null;
+ if (owner == null) return null;
+
+ final PsiAnnotation annotation = getPreviewFeatureAnnotation(owner);
+ final HighlightingFeature feature = HighlightingFeature.fromPreviewFeatureAnnotation(annotation);
if (feature == null) return null;
- return checkFeature(statement, feature, level, statement.getContainingFile());
+ return checkFeature(context, feature, level, context.getContainingFile());
+ }
+
+ @Nullable
+ @Contract(value = "null -> null", pure = true)
+ private static PsiAnnotation getPreviewFeatureAnnotation(@Nullable final PsiModifierListOwner owner) {
+ if (owner == null) return null;
+
+ final PsiAnnotation annotation = owner.getAnnotation(HighlightingFeature.JDK_INTERNAL_PREVIEW_FEATURE);
+ if (annotation != null) return annotation;
+
+ final PsiPackage psiPackage = JavaResolveUtil.getContainingPackage(owner);
+ if (psiPackage == null) return null;
+ return psiPackage.getAnnotation(HighlightingFeature.JDK_INTERNAL_PREVIEW_FEATURE);
}
private enum SelectorKind { INT, ENUM, STRING }
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 70250ad56adc..0ec6ef566dc8 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
@@ -682,6 +682,9 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh
}
}
}
+ if (!myHolder.hasErrorResults()) {
+ myHolder.add(HighlightUtil.checkPackagePreviewFeatureAnnotation(statement, myLanguageLevel));
+ }
}
@Override
@@ -1405,7 +1408,8 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh
if (!myHolder.hasErrorResults() && resolved instanceof PsiField) {
try {
myHolder.add(HighlightUtil.checkIllegalForwardReferenceToField(expression, (PsiField)resolved));
- if (!myHolder.hasErrorResults()) myHolder.add(HighlightUtil.checkFieldPreviewFeatureAnnotation(expression, (PsiField)resolved, myLanguageLevel));
+ if (!myHolder.hasErrorResults())
+ myHolder.add(HighlightUtil.checkPreviewFeatureElement(expression, (PsiField)resolved, myLanguageLevel));
}
catch (IndexNotReadyException ignored) { }
}
@@ -1424,6 +1428,7 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh
myHolder.add(GenericsHighlightUtil.checkMemberSignatureTypesAccessibility(expression));
}
}
+ if (!myHolder.hasErrorResults() && resolved instanceof PsiClass) myHolder.add(HighlightUtil.checkPreviewFeatureElement(expression, (PsiClass)resolved, myLanguageLevel));
}
@Override
@@ -1913,6 +1918,12 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh
if (!myHolder.hasErrorResults()) myHolder.add(ModuleHighlightUtil.checkFileLocation(module, myFile));
}
+ @Override
+ public void visitModuleStatement(PsiStatement statement) {
+ super.visitModuleStatement(statement);
+ if (!myHolder.hasErrorResults()) myHolder.add(ModuleHighlightUtil.checkModulePreviewFeatureAnnotation(statement, myLanguageLevel));
+ }
+
@Override
public void visitRequiresStatement(PsiRequiresStatement statement) {
super.visitRequiresStatement(statement);
diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightingFeature.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightingFeature.java
index 609132bf1245..84c44082aa86 100644
--- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightingFeature.java
+++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightingFeature.java
@@ -3,13 +3,21 @@ package com.intellij.codeInsight.daemon.impl.analysis;
import com.intellij.codeInsight.daemon.JavaErrorBundle;
import com.intellij.java.analysis.JavaAnalysisBundle;
+import com.intellij.lang.jvm.JvmEnumField;
+import com.intellij.lang.jvm.annotation.JvmAnnotationAttribute;
+import com.intellij.lang.jvm.annotation.JvmAnnotationAttributeValue;
+import com.intellij.lang.jvm.annotation.JvmAnnotationEnumFieldValue;
import com.intellij.pom.java.LanguageLevel;
+import com.intellij.psi.PsiAnnotation;
import com.intellij.psi.PsiElement;
import com.intellij.psi.util.PsiUtil;
+import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.PropertyKey;
+import static com.intellij.util.ObjectUtils.tryCast;
+
public enum HighlightingFeature {
GENERICS(LanguageLevel.JDK_1_5, "feature.generics"),
ANNOTATIONS(LanguageLevel.JDK_1_5, "feature.annotations"),
@@ -63,6 +71,8 @@ public enum HighlightingFeature {
LOCAL_INTERFACES(LanguageLevel.JDK_15_PREVIEW, "feature.local.interfaces"),
LOCAL_ENUMS(LanguageLevel.JDK_15_PREVIEW, "feature.local.enums");
+ public static final String JDK_INTERNAL_PREVIEW_FEATURE = "jdk.internal.PreviewFeature";
+
final LanguageLevel level;
@PropertyKey(resourceBundle = JavaErrorBundle.BUNDLE)
final String key;
@@ -92,7 +102,29 @@ public enum HighlightingFeature {
}
@Nullable
- public static HighlightingFeature convertFromPreviewFeature(@NotNull final String feature) {
+ @Contract(value = "null -> null", pure = true)
+ static HighlightingFeature fromPreviewFeatureAnnotation(@Nullable final PsiAnnotation annotation) {
+ if (annotation == null) return null;
+ if (!annotation.hasQualifiedName(JDK_INTERNAL_PREVIEW_FEATURE)) return null;
+
+ final JvmAnnotationAttribute feature = annotation.findAttribute("feature");
+ if (feature == null) return null;
+
+ final JvmAnnotationAttributeValue attributeValue = feature.getAttributeValue();
+ if (attributeValue == null) return null;
+
+ final JvmAnnotationEnumFieldValue annotationEnumFieldValue = tryCast(attributeValue, JvmAnnotationEnumFieldValue.class);
+ if (annotationEnumFieldValue == null) return null;
+
+ final JvmEnumField field = annotationEnumFieldValue.getField();
+ if (field == null) return null;
+
+ return convertFromPreviewFeatureName(field.getName());
+ }
+
+ @Nullable
+ @Contract(pure = true)
+ private static HighlightingFeature convertFromPreviewFeatureName(@NotNull final String feature) {
switch (feature) {
case "PATTERN_MATCHING_IN_INSTANCEOF":
return PATTERNS;
@@ -100,6 +132,8 @@ public enum HighlightingFeature {
return TEXT_BLOCKS;
case "RECORDS":
return RECORDS;
+ case "SEALED_CLASSES":
+ return SEALED_CLASSES;
default:
return null;
}
diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/ModuleHighlightUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/ModuleHighlightUtil.java
index 260753223b8f..42fca15b75e2 100644
--- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/ModuleHighlightUtil.java
+++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/ModuleHighlightUtil.java
@@ -16,6 +16,7 @@ import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.util.Trinity;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.*;
import com.intellij.psi.PsiPackageAccessibilityStatement.Role;
import com.intellij.psi.search.FilenameIndex;
@@ -423,4 +424,42 @@ class ModuleHighlightUtil {
QuickFixAction.registerQuickFixAction(info, factory().createDeleteFix(refElement, QuickFixBundle.message("delete.reference.fix.text")));
return info;
}
+
+ @Nullable
+ public static HighlightInfo checkModulePreviewFeatureAnnotation(@Nullable final PsiStatement statement,
+ @NotNull final LanguageLevel level) {
+ if (statement instanceof PsiRequiresStatement) {
+ final PsiRequiresStatement requiresStatement = (PsiRequiresStatement)statement;
+ final PsiJavaModule module = requiresStatement.resolve();
+
+ return HighlightUtil.checkPreviewFeatureElement(statement, module, level);
+ }
+ else if (statement instanceof PsiPackageAccessibilityStatement) {
+ final PsiPackageAccessibilityStatement accessibilityStatement = (PsiPackageAccessibilityStatement)statement;
+ final PsiJavaCodeReferenceElement reference = accessibilityStatement.getPackageReference();
+ if (reference == null) return null;
+
+ final PsiElement resolve = reference.resolve();
+ if (!(resolve instanceof PsiPackage)) return null;
+
+ final PsiPackage psiPackage = (PsiPackage)resolve;
+ return HighlightUtil.checkPreviewFeatureElement(statement, psiPackage, level);
+ }
+ else if (statement instanceof PsiProvidesStatement) {
+ final PsiProvidesStatement providesStatement = (PsiProvidesStatement)statement;
+ final PsiReferenceList list = providesStatement.getImplementationList();
+ if (list == null) return null;
+
+ return Arrays.stream(list.getReferenceElements())
+ .map(ref -> ref.resolve())
+ .filter(Objects::nonNull)
+ .filter(clazz -> clazz instanceof PsiClass)
+ .map(clazz -> (PsiClass)clazz)
+ .map(clazz -> HighlightUtil.checkPreviewFeatureElement(statement, clazz, level))
+ .filter(Objects::nonNull)
+ .findAny()
+ .orElse(null);
+ }
+ return null;
+ }
}
\ No newline at end of file
diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/JavaResolveUtil.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/JavaResolveUtil.java
index 412c4b4b514f..5ef7ce6c8a2a 100644
--- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/JavaResolveUtil.java
+++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/JavaResolveUtil.java
@@ -301,8 +301,14 @@ public class JavaResolveUtil {
.resolveConstructor(PsiTypesUtil.getClassType(superClassWhichTheSuperCallMustResolveTo), expressionList, place).getElement();
}
- public static PsiPackage getContainingPackage(@NotNull PsiClass psiClass) {
- PsiDirectory directory = psiClass.getContainingFile().getContainingDirectory();
- return directory == null ? null : JavaDirectoryService.getInstance().getPackage(directory);
+ @Nullable
+ public static PsiPackage getContainingPackage(@NotNull final PsiElement element) {
+ final PsiFile file = element.getContainingFile();
+ if (file == null) return null;
+
+ final PsiDirectory directory = file.getContainingDirectory();
+ if (directory == null) return null;
+
+ return JavaDirectoryService.getInstance().getPackage(directory);
}
}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/previewfeature/CallConstructorWithPreviewFeature.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/previewfeature/CallConstructorWithPreviewFeature.java
index 2218481f2e98..7ba06c254231 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/previewfeature/CallConstructorWithPreviewFeature.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/previewfeature/CallConstructorWithPreviewFeature.java
@@ -11,9 +11,9 @@ class Main {
Main(int i){}
static {
- new Main();
- new Main(42l);
- new Main("42");
+ new Main();
+ new Main(42l);
+ new Main("42");
new Main(42);
}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/previewfeature/CallMethodsWithPreviewFeature.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/previewfeature/CallMethodsWithPreviewFeature.java
index f6398c56d47f..08a9635354fb 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/previewfeature/CallMethodsWithPreviewFeature.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/previewfeature/CallMethodsWithPreviewFeature.java
@@ -3,9 +3,9 @@ import jdk.internal.PreviewFeature.Feature;
class Main {
static {
- requirePatternMatching();
- Main.requireTextBlocks();
- new Main().requireRecords();
+ requirePatternMatching();
+ Main.requireTextBlocks();
+ new Main().requireRecords();
}
@PreviewFeature(feature=Feature.PATTERN_MATCHING_IN_INSTANCEOF)
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/previewfeature/FieldsWithPreviewFeature.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/previewfeature/FieldsWithPreviewFeature.java
index f0900ba2fb3a..3953efbf7e34 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/previewfeature/FieldsWithPreviewFeature.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/previewfeature/FieldsWithPreviewFeature.java
@@ -9,14 +9,14 @@ class Main {
@PreviewFeature(feature=Feature.TEXT_BLOCKS)
String textBlocks;
int i;
- org.myorg.preview.FromPreview preview;
+ org.myorg.preview.FromPreview preview;
static {
- String s = new Main().textBlocks;
- String o = Main.instanceOf;
- long l = records;
+ String s = new Main().textBlocks;
+ String o = Main.instanceOf;
+ long l = records;
int k = new Main().i;
- org.myorg.preview.FromPreview local = null;
+ org.myorg.preview.FromPreview local = null;
}
}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/previewfeature/ImportWithPreviewFeature.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/previewfeature/ImportWithPreviewFeature.java
index 322aec36102d..8574ac624d2f 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/previewfeature/ImportWithPreviewFeature.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/previewfeature/ImportWithPreviewFeature.java
@@ -1,3 +1,9 @@
-import org.myorg.preview.FromPreview;
+import org.myorg.preview.FromPreview;
+import static org.myorg.preview.FromPreview.f;
-class Main { }
+class Main {
+ static {
+ org.myorg.preview.FromPreview.f();
+ f();
+ }
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/previewfeature/PreviewFeature.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/previewfeature/PreviewFeature.java
index e1e1ac37ab3a..045fca795ab1 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/previewfeature/PreviewFeature.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/previewfeature/PreviewFeature.java
@@ -21,6 +21,7 @@ public @interface PreviewFeature {
PATTERN_MATCHING_IN_INSTANCEOF,
TEXT_BLOCKS,
RECORDS,
+ SEALED_CLASSES
;
}
}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/previewfeature/ReferenceWithPreviewFeature.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/previewfeature/ReferenceWithPreviewFeature.java
new file mode 100644
index 000000000000..0494bd40cfe8
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/previewfeature/ReferenceWithPreviewFeature.java
@@ -0,0 +1,27 @@
+import jdk.internal.PreviewFeature;
+import jdk.internal.PreviewFeature.Feature;
+
+class Main {
+ @PreviewFeature(feature=Feature.PATTERN_MATCHING_IN_INSTANCEOF)
+ static class InstanceOf{
+ static void f(){}
+ }
+ @PreviewFeature(feature=Feature.RECORDS)
+ static class Records{
+ static void f(){}
+ }
+ @PreviewFeature(feature=Feature.TEXT_BLOCKS)
+ static class TextBlocks{
+ static void f(){}
+ }
+ static class Empty{
+ static void f(){}
+ }
+
+ static {
+ InstanceOf.f();
+ Records.f();
+ TextBlocks.f();
+ Empty.f();
+ }
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/previewfeature/RequiresModuleWithPreviewFeature.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/previewfeature/RequiresModuleWithPreviewFeature.java
new file mode 100644
index 000000000000..1adb941ef95e
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/previewfeature/RequiresModuleWithPreviewFeature.java
@@ -0,0 +1,5 @@
+module consumer {
+ requires producer;
+
+ provides org.myorg.preview.FromPreview with org.myorg.preview.impl.FromPreviewImpl;
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/previewfeature/TypeWithPreviewFeature.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/previewfeature/TypeWithPreviewFeature.java
index 6077bf3cf6a9..2dd95c97b2a6 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/previewfeature/TypeWithPreviewFeature.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/previewfeature/TypeWithPreviewFeature.java
@@ -10,8 +10,8 @@ class Main {
class TextBlocks{}
class Empty{}
- private void f(InstanceOf o, Empty e) {}
- private void f(Empty e, Records r) {}
- private void f(TextBlocks e, Records r) {}
- private void f(org.myorg.preview.FromPreview p) {}
+ private void f(InstanceOf o, Empty e) {}
+ private void f(Empty e, Records r) {}
+ private void f(TextBlocks e, Records r) {}
+ private void f(org.myorg.preview.FromPreview p) {}
}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/previewfeature/packagepreview.impl/FromPreviewImpl.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/previewfeature/packagepreview.impl/FromPreviewImpl.java
new file mode 100644
index 000000000000..1591c0d10354
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/previewfeature/packagepreview.impl/FromPreviewImpl.java
@@ -0,0 +1,5 @@
+package org.myorg.preview.impl;
+
+public class FromPreviewImpl implements FromPreview {
+ void g() {}
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/previewfeature/packagepreview.impl/package-info.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/previewfeature/packagepreview.impl/package-info.java
new file mode 100644
index 000000000000..5132458e41d9
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/previewfeature/packagepreview.impl/package-info.java
@@ -0,0 +1,2 @@
+@jdk.internal.PreviewFeature(feature=jdk.internal.PreviewFeature.Feature.PATTERN_MATCHING_IN_INSTANCEOF)
+package org.myorg.preview.impl;
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/previewfeature/packagepreview/FromPreview.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/previewfeature/packagepreview/FromPreview.java
index 23889c67d448..593e6c475fa9 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/previewfeature/packagepreview/FromPreview.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/previewfeature/packagepreview/FromPreview.java
@@ -1,3 +1,6 @@
package org.myorg.preview;
-public interface FromPreview {}
+public interface FromPreview {
+ static void f();
+ void g();
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/previewfeature/packagepreview/module-info.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/previewfeature/packagepreview/module-info.java
new file mode 100644
index 000000000000..860e05ee7f7b
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/previewfeature/packagepreview/module-info.java
@@ -0,0 +1,4 @@
+@jdk.internal.PreviewFeature(feature = jdk.internal.PreviewFeature.Feature.TEXT_BLOCKS)
+module producer {
+ exports org.myorg.preview;
+}
\ No newline at end of file
diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/previewfeature/PreviewFeatureAnnotationTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/previewfeature/PreviewFeatureAnnotationTest.java
index 4ac57e48e07f..b6c1d7b3347d 100644
--- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/previewfeature/PreviewFeatureAnnotationTest.java
+++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/previewfeature/PreviewFeatureAnnotationTest.java
@@ -14,23 +14,33 @@ public class PreviewFeatureAnnotationTest extends LightJavaCodeInsightFixtureTes
protected void setUp() throws Exception {
super.setUp();
final String previewFeatureAnnotation = BASE_PATH + "/PreviewFeature.java";
- final String packagePreview = BASE_PATH + "/" + "packagepreview/package-info.java";
- final String interfaceInPreviewPackage = BASE_PATH + "/" + "packagepreview/FromPreview.java";
+ final String packagePreview = BASE_PATH + "/packagepreview/package-info.java";
+ final String interfaceInPreviewPackage = BASE_PATH + "/packagepreview/FromPreview.java";
+ final String moduleInfo = BASE_PATH + "/packagepreview/module-info.java";
myFixture.configureByFile(previewFeatureAnnotation);
myFixture.configureByFile(packagePreview);
myFixture.configureByFile(interfaceInPreviewPackage);
+ myFixture.configureByFile(moduleInfo);
+
+ final String packagePreviewImpl = BASE_PATH + "/packagepreview.impl/package-info.java";
+ final String fromPreviewImpl = BASE_PATH + "/packagepreview.impl/FromPreviewImpl.java";
+
+ myFixture.configureByFile(packagePreviewImpl);
+ myFixture.configureByFile(fromPreviewImpl);
}
@Override
protected @NotNull LightProjectDescriptor getProjectDescriptor() {
- return JAVA_8;
+ return JAVA_9;
}
public void testCallMethodsWithPreviewFeature() { doTest(); }
public void testCallConstructorWithPreviewFeature() { doTest(); }
public void testTypeWithPreviewFeature() { doTest(); }
public void testFieldsWithPreviewFeature() { doTest(); }
- public void testImportWithPreviewFeature() { doTest();}
+ public void testImportWithPreviewFeature() { doTest(); }
+ public void testReferenceWithPreviewFeature() { doTest(); }
+ public void testRequiresModuleWithPreviewFeature() { doTest(); }
private void doTest() {
String filePath = BASE_PATH + "/" + getTestName(false) + ".java";
@@ -42,9 +52,4 @@ public class PreviewFeatureAnnotationTest extends LightJavaCodeInsightFixtureTes
protected String getTestDataPath() {
return JavaTestUtil.getJavaTestDataPath();
}
-
- //@Override
- //protected String getBasePath() {
- // return BASE_PATH;
- //}
}
diff --git a/platform/core-api/src/com/intellij/psi/CommonClassNames.java b/platform/core-api/src/com/intellij/psi/CommonClassNames.java
index f777684d044f..dbed2e1d289b 100644
--- a/platform/core-api/src/com/intellij/psi/CommonClassNames.java
+++ b/platform/core-api/src/com/intellij/psi/CommonClassNames.java
@@ -115,8 +115,6 @@ public interface CommonClassNames {
String JAVA_UTIL_FUNCTION_BI_FUNCTION = "java.util.function.BiFunction";
String JAVA_UTIL_FUNCTION_SUPPLIER = "java.util.function.Supplier";
- String JDK_INTERNAL_PREVIEW_FEATURE = "jdk.internal.PreviewFeature";
-
String JAVA_LANG_INVOKE_MH_POLYMORPHIC = "java.lang.invoke.MethodHandle.PolymorphicSignature";
String CLASS_FILE_EXTENSION = ".class";