From 040255a82e5f86671626cec1aa0b9f436af914fa Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 9 Feb 2016 17:10:07 +0100 Subject: [PATCH] use smart pointers in java class name completion items (EA-77885 - PIEAE: StubBasedPsiElementBase.getContainingFile) --- .../JavaPsiClassReferenceElement.java | 42 ++++--------------- 1 file changed, 7 insertions(+), 35 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaPsiClassReferenceElement.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaPsiClassReferenceElement.java index 2713ca52a1ea..74177b08e43a 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaPsiClassReferenceElement.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaPsiClassReferenceElement.java @@ -25,13 +25,10 @@ import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleSettingsManager; import com.intellij.psi.util.PsiFormatUtil; import com.intellij.psi.util.PsiUtilCore; -import com.intellij.reference.SoftReference; -import com.intellij.util.Function; +import com.intellij.util.ObjectUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.lang.ref.Reference; -import java.lang.ref.WeakReference; import java.util.Collections; import java.util.Set; @@ -40,8 +37,7 @@ import java.util.Set; */ public class JavaPsiClassReferenceElement extends LookupItem implements TypedLookupItem { public static final ClassConditionKey CLASS_CONDITION_KEY = ClassConditionKey.create(JavaPsiClassReferenceElement.class); - private final Object myClass; - private volatile Reference myCache; + private final SmartPsiElementPointer myClass; private final String myQualifiedName; private String myForcedPresentableName; private String myPackageDisplayName; @@ -50,8 +46,7 @@ public class JavaPsiClassReferenceElement extends LookupItem implements public JavaPsiClassReferenceElement(PsiClass psiClass) { super(psiClass.getName(), psiClass.getName()); myQualifiedName = psiClass.getQualifiedName(); - final PsiFile file = psiClass.getContainingFile(); - myClass = file == null || file.getVirtualFile() == null || myQualifiedName == null ? psiClass : PsiAnchor.create(psiClass); + myClass = SmartPointerManager.getInstance(psiClass.getProject()).createSmartPsiElementPointer(psiClass); setInsertHandler(AllClassesGetter.TRY_SHORTENING); setTailType(TailType.NONE); myPackageDisplayName = PsiFormatUtil.getPackageDisplayName(psiClass); @@ -102,31 +97,12 @@ public class JavaPsiClassReferenceElement extends LookupItem implements @NotNull @Override public PsiClass getObject() { - if (myClass instanceof PsiAnchor) { - PsiClass psiClass = SoftReference.dereference(myCache); - if (psiClass != null) { - return psiClass; - } - - PsiAnchor anchor = (PsiAnchor)myClass; - final PsiClass retrieve = (PsiClass)anchor.retrieve(); - if (retrieve == null) { - throw new AssertionError(myQualifiedName + "; anchor=" + anchor + "; diagnostics=" + - (anchor instanceof PsiAnchor.StubIndexReference ? ((PsiAnchor.StubIndexReference)anchor).diagnoseNull() : null)); - } - myCache = new WeakReference(retrieve); - return retrieve; - } - return (PsiClass)myClass; + return ObjectUtils.assertNotNull(myClass.getElement()); } @Override public boolean isValid() { - if (myClass instanceof PsiClass) { - return ((PsiClass)myClass).isValid(); - } - - return ((PsiAnchor)myClass).retrieve() != null; + return myClass.getElement() != null; } @Override @@ -178,12 +154,8 @@ public class JavaPsiClassReferenceElement extends LookupItem implements } } if (substitutor == PsiSubstitutor.EMPTY && !diamond && psiClass.getTypeParameters().length > 0) { - tailText = "<" + StringUtil.join(psiClass.getTypeParameters(), new Function() { - @Override - public String fun(PsiTypeParameter psiTypeParameter) { - return psiTypeParameter.getName(); - } - }, "," + (showSpaceAfterComma(psiClass) ? " " : "")) + ">" + tailText; + String separator = "," + (showSpaceAfterComma(psiClass) ? " " : ""); + tailText = "<" + StringUtil.join(psiClass.getTypeParameters(), PsiTypeParameter::getName, separator) + ">" + tailText; } presentation.setTailText(tailText, true); }