mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
lock-free stub.getPsi
This commit is contained in:
@@ -28,6 +28,7 @@ import com.intellij.util.ArrayFactory;
|
||||
import com.intellij.util.ArrayUtil;
|
||||
import com.intellij.util.ObjectUtils;
|
||||
import com.intellij.util.SmartList;
|
||||
import com.intellij.util.concurrency.AtomicFieldUpdater;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
@@ -39,6 +40,9 @@ public abstract class StubBase<T extends PsiElement> extends ObjectStubBase<Stub
|
||||
private final IStubElementType myElementType;
|
||||
private volatile T myPsi;
|
||||
|
||||
private static final AtomicFieldUpdater<StubBase, PsiElement> ourPsiUpdater =
|
||||
AtomicFieldUpdater.forFieldOfType(StubBase.class, PsiElement.class);
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
protected StubBase(final StubElement parent, final IStubElementType elementType) {
|
||||
super(parent);
|
||||
@@ -82,26 +86,15 @@ public abstract class StubBase<T extends PsiElement> extends ObjectStubBase<Stub
|
||||
myPsi = psi;
|
||||
}
|
||||
|
||||
public T getCachedPsi() {
|
||||
return myPsi;
|
||||
}
|
||||
|
||||
@Override
|
||||
public T getPsi() {
|
||||
T psi = myPsi;
|
||||
if (psi != null) return psi;
|
||||
|
||||
synchronized (PsiLock.LOCK) {
|
||||
psi = myPsi;
|
||||
if (psi != null) return psi;
|
||||
//noinspection unchecked
|
||||
myPsi = psi = (T)getStubType().createPsi(this);
|
||||
}
|
||||
|
||||
return psi;
|
||||
psi = (T)getStubType().createPsi(this);
|
||||
return ourPsiUpdater.compareAndSet(this, null, psi) ? psi : ObjectUtils.assertNotNull(myPsi);
|
||||
}
|
||||
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public <E extends PsiElement> E[] getChildrenByType(@NotNull final IElementType elementType, E[] array) {
|
||||
|
||||
Reference in New Issue
Block a user