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";