From a7b011c2562695ff860eba3e43323dda291eba28 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Thu, 18 Aug 2022 15:38:12 +0200 Subject: [PATCH] [java-psi] Check not-nullity in TypeAnnotationProvider.Static.create Should supersede EA-636157 - NPE: PsiImmediateClassType.isValid GitOrigin-RevId: a8fa43d196712d62c89ea72eda7725f61106034f --- .../intellij/psi/TypeAnnotationProvider.java | 8 +++++++- .../psi/impl/JavaClassSupersImpl.java | 7 +------ .../impl/cache/TypeAnnotationContainer.java | 19 ++++++++----------- 3 files changed, 16 insertions(+), 18 deletions(-) diff --git a/java/java-psi-api/src/com/intellij/psi/TypeAnnotationProvider.java b/java/java-psi-api/src/com/intellij/psi/TypeAnnotationProvider.java index 564350b8f815..f71944ec1df3 100644 --- a/java/java-psi-api/src/com/intellij/psi/TypeAnnotationProvider.java +++ b/java/java-psi-api/src/com/intellij/psi/TypeAnnotationProvider.java @@ -3,6 +3,8 @@ package com.intellij.psi; import org.jetbrains.annotations.NotNull; +import java.util.Objects; + /** * An object that returns annotations for {@link PsiType}. Since computing type annotations might be computationally expensive sometimes, * this object is used to delay the calculation until annotations are really needed, @@ -41,7 +43,11 @@ public interface TypeAnnotationProvider { @NotNull public static TypeAnnotationProvider create(PsiAnnotation @NotNull [] annotations) { - return annotations.length == 0 ? EMPTY : new Static(annotations); + if (annotations.length == 0) return EMPTY; + for (PsiAnnotation annotation : annotations) { + Objects.requireNonNull(annotation); + } + return new Static(annotations); } } } \ No newline at end of file diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/JavaClassSupersImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/JavaClassSupersImpl.java index 4a40a85a8ca8..f51c1f044c39 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/JavaClassSupersImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/JavaClassSupersImpl.java @@ -118,12 +118,7 @@ public final class JavaClassSupersImpl extends JavaClassSupers { targetType = outer.substituteWithBoundsPromotion((PsiTypeParameter)paramCandidate); if (targetType != null && innerType.getAnnotations().length > 0) { PsiAnnotation[] typeAnnotations = targetType.getAnnotations(); - targetType = targetType.annotate(new TypeAnnotationProvider() { - @Override - public PsiAnnotation @NotNull [] getAnnotations() { - return ArrayUtil.mergeArrays(innerType.getAnnotations(), typeAnnotations); - } - }); + targetType = targetType.annotate(() -> ArrayUtil.mergeArrays(innerType.getAnnotations(), typeAnnotations)); } } else { diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/cache/TypeAnnotationContainer.java b/java/java-psi-impl/src/com/intellij/psi/impl/cache/TypeAnnotationContainer.java index 258e847861f1..8c4579777844 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/cache/TypeAnnotationContainer.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/cache/TypeAnnotationContainer.java @@ -94,19 +94,16 @@ public class TypeAnnotationContainer { */ public TypeAnnotationProvider getProvider(PsiElement parent) { if (isEmpty()) return TypeAnnotationProvider.EMPTY; - return new TypeAnnotationProvider() { - @Override - public PsiAnnotation @NotNull [] getAnnotations() { - List result = new ArrayList<>(); - for (TypeAnnotationEntry entry : myList) { - if (entry.myPath.length == 0) { - PsiAnnotation anno = parent instanceof PsiCompiledElement ? new ClsTypeAnnotationImpl(parent, entry.myText) : - JavaPsiFacade.getElementFactory(parent.getProject()).createAnnotationFromText(entry.myText, parent); - result.add(anno); - } + return () -> { + List result = new ArrayList<>(); + for (TypeAnnotationEntry entry : myList) { + if (entry.myPath.length == 0) { + PsiAnnotation anno = parent instanceof PsiCompiledElement ? new ClsTypeAnnotationImpl(parent, entry.myText) : + JavaPsiFacade.getElementFactory(parent.getProject()).createAnnotationFromText(entry.myText, parent); + result.add(anno); } - return result.toArray(PsiAnnotation.EMPTY_ARRAY); } + return result.toArray(PsiAnnotation.EMPTY_ARRAY); }; }