/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.plugin.ij.lang.psi.stubs.elements;
import com.intellij.lang.ASTNode;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiJavaCodeReferenceElement;
import com.intellij.psi.stubs.IndexSink;
import com.intellij.psi.stubs.StubElement;
import com.intellij.psi.stubs.StubInputStream;
import com.intellij.psi.stubs.StubOutputStream;
import com.intellij.util.ArrayUtil;
import com.intellij.util.Function;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.io.StringRef;
import gw.lang.parser.expressions.IVarStatement;
import gw.plugin.ij.lang.parser.GosuCompositeElement;
import gw.plugin.ij.lang.parser.GosuElementTypes;
import gw.plugin.ij.lang.psi.GosuStubElementType;
import gw.plugin.ij.lang.psi.api.auxilary.IGosuModifierList;
import gw.plugin.ij.lang.psi.api.auxilary.annotation.IGosuAnnotation;
import gw.plugin.ij.lang.psi.api.statements.typedef.IGosuEnumConstant;
import gw.plugin.ij.lang.psi.impl.statements.typedef.GosuEnumConstantImpl;
import gw.plugin.ij.lang.psi.stubs.GosuFieldStub;
import gw.plugin.ij.lang.psi.stubs.GosuStubUtils;
import gw.plugin.ij.lang.psi.stubs.impl.GosuFieldStubImpl;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.IOException;
public class GosuEnumConstantElementType extends GosuStubElementType<GosuFieldStub, IGosuEnumConstant> {
public GosuEnumConstantElementType() {
super("Enumeration constant", IVarStatement.class);
}
@NotNull
public PsiElement createElement(ASTNode node) {
return new GosuEnumConstantImpl((GosuCompositeElement) node);
}
@NotNull
public IGosuEnumConstant createPsi(@NotNull GosuFieldStub stub) {
return new GosuEnumConstantImpl(stub);
}
@NotNull
@Override
public GosuFieldStub createStub(@NotNull IGosuEnumConstant psi, StubElement parentStub) {
return new GosuFieldStubImpl(
parentStub, StringRef.fromString(psi.getName()), ArrayUtil.EMPTY_STRING_ARRAY, ArrayUtil.EMPTY_STRING_ARRAY,
GosuElementTypes.ENUM_CONSTANT, GosuFieldStubImpl.buildFlags(psi));
}
public void serialize(GosuFieldStub stub, StubOutputStream dataStream) throws IOException {
GosuFieldElementType.serializeFieldStub(stub, dataStream);
}
@NotNull
public GosuFieldStub deserialize(@NotNull StubInputStream dataStream, StubElement parentStub) throws IOException {
StringRef ref = dataStream.readName();
final byte b = dataStream.readByte();
final String[] annNames = new String[b];
for (int i = 0; i < b; i++) {
annNames[i] = dataStream.readName().toString();
}
final String[] namedParameters = GosuStubUtils.readStringArray(dataStream);
byte flags = dataStream.readByte();
return new GosuFieldStubImpl(parentStub, ref, annNames, namedParameters, GosuElementTypes.ENUM_CONSTANT, flags);
}
public void indexStub(GosuFieldStub stub, IndexSink sink) {
GosuFieldElementType.indexFieldStub(stub, sink);
}
}