lock-free stub.getPsi

This commit is contained in:
peter
2016-12-21 09:09:52 +01:00
parent 694f75290e
commit 74cfca2ac8
@@ -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) {