/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.plugin.ij.lang.psi.impl.statements.typedef;
import com.intellij.psi.PsiClassType;
import com.intellij.psi.PsiElement;
import com.intellij.psi.StubBasedPsiElement;
import com.intellij.psi.stubs.IStubElementType;
import com.intellij.util.IncorrectOperationException;
import gw.lang.parser.IExpression;
import gw.plugin.ij.lang.parser.GosuCompositeElement;
import gw.plugin.ij.lang.psi.api.statements.typedef.IGosuReferenceList;
import gw.plugin.ij.lang.psi.api.types.IGosuCodeReferenceElement;
import gw.plugin.ij.lang.psi.impl.GosuBaseElementImpl;
import gw.plugin.ij.lang.psi.impl.GosuClassReferenceType;
import gw.plugin.ij.lang.psi.stubs.GosuReferenceListStub;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
public abstract class GosuReferenceListImpl extends GosuBaseElementImpl<IExpression, GosuReferenceListStub>
implements StubBasedPsiElement<GosuReferenceListStub>, IGosuReferenceList {
@Nullable
private PsiClassType[] cachedTypes;
public GosuReferenceListImpl(@NotNull GosuCompositeElement node) {
super(node);
}
public GosuReferenceListImpl(@NotNull final GosuReferenceListStub stub, @NotNull IStubElementType elementType) {
super(stub, elementType);
}
@NotNull
public IGosuCodeReferenceElement[] getReferenceElements() {
return findChildrenByClass(IGosuCodeReferenceElement.class);
}
@NotNull
public PsiClassType[] getReferenceTypes() {
final GosuReferenceListStub stub = getStub();
if (stub != null) {
return stub.getReferencedTypes();
}
if (cachedTypes == null || !isValid()) {
final ArrayList<PsiClassType> types = new ArrayList<>();
for (IGosuCodeReferenceElement ref : getReferenceElements()) {
types.add(new GosuClassReferenceType(ref));
}
cachedTypes = types.toArray(new PsiClassType[types.size()]);
}
return cachedTypes;
}
@Override
public void subtreeChanged() {
cachedTypes = null;
}
@NotNull
@Override
public PsiElement add(@NotNull PsiElement element) throws IncorrectOperationException {
throw new UnsupportedOperationException();
// if( element instanceof IGosuCodeReferenceElement && findChildByClass( IGosuCodeReferenceElement.class ) != null )
// {
// PsiElement lastChild = getLastChild();
// lastChild = PsiUtil.skipWhitespaces( lastChild, false );
// if( !lastChild.getNode().getElementType().equals( GosuTokenTypes.mCOMMA ) )
// {
// getNode().addLeaf( GosuTokenTypes.mCOMMA, ",", null );
// }
// return super.add( element );
// }
// else
// {
// return super.add( element );
// }
}
}