mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
use smart pointers in java class name completion items (EA-77885 - PIEAE: StubBasedPsiElementBase.getContainingFile)
This commit is contained in:
+7
-35
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user