use smart pointers in java class name completion items (EA-77885 - PIEAE: StubBasedPsiElementBase.getContainingFile)

This commit is contained in:
peter
2016-02-09 17:38:26 +01:00
parent acc9efdc0b
commit 040255a82e
@@ -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<Object> implements TypedLookupItem {
public static final ClassConditionKey<JavaPsiClassReferenceElement> CLASS_CONDITION_KEY = ClassConditionKey.create(JavaPsiClassReferenceElement.class);
private final Object myClass;
private volatile Reference<PsiClass> myCache;
private final SmartPsiElementPointer<PsiClass> myClass;
private final String myQualifiedName;
private String myForcedPresentableName;
private String myPackageDisplayName;
@@ -50,8 +46,7 @@ public class JavaPsiClassReferenceElement extends LookupItem<Object> 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<Object> 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<PsiClass>(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<Object> implements
}
}
if (substitutor == PsiSubstitutor.EMPTY && !diamond && psiClass.getTypeParameters().length > 0) {
tailText = "<" + StringUtil.join(psiClass.getTypeParameters(), new Function<PsiTypeParameter, String>() {
@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);
}