/* * 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.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.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.statements.IGosuField; import gw.plugin.ij.lang.psi.impl.statements.GosuFieldImpl; 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 gw.plugin.ij.lang.psi.stubs.index.GosuAnnotatedMemberIndex; import gw.plugin.ij.lang.psi.stubs.index.GosuFieldNameIndex; import org.jetbrains.annotations.NotNull; import java.io.IOException; public class GosuFieldElementType extends GosuStubElementType<GosuFieldStub, IGosuField> { public GosuFieldElementType() { super("field", IVarStatement.class); } @NotNull public PsiElement createElement(ASTNode node) { return new GosuFieldImpl((GosuCompositeElement) node); } @NotNull public IGosuField createPsi(@NotNull GosuFieldStub stub) { return new GosuFieldImpl(stub); } @NotNull public GosuFieldStub createStub(@NotNull IGosuField psi, StubElement parentStub) { String[] annNames = GosuTypeDefinitionElementType.getAnnotationNames(psi); String[] namedParametersArray = ArrayUtil.EMPTY_STRING_ARRAY; //## todo: // if( psi instanceof GosuFieldImpl ) // { // namedParametersArray = psi.getNamedParametersArray(); // } return new GosuFieldStubImpl(parentStub, StringRef.fromString(psi.getName()), annNames, namedParametersArray, psi.getElementType(), GosuFieldStubImpl.buildFlags(psi)); } public void serialize(@NotNull GosuFieldStub stub, @NotNull StubOutputStream dataStream) throws IOException { serializeFieldStub(stub, dataStream); } @NotNull public GosuFieldStub deserialize(@NotNull StubInputStream dataStream, StubElement parentStub) throws IOException { return deserializeFieldStub(dataStream, parentStub); } public void indexStub(@NotNull GosuFieldStub stub, @NotNull IndexSink sink) { indexFieldStub(stub, sink); } /* * **************************************************************************************************************** */ static void serializeFieldStub(@NotNull GosuFieldStub stub, @NotNull StubOutputStream dataStream) throws IOException { dataStream.writeName(stub.getName()); final String[] annotations = stub.getAnnotations(); dataStream.writeByte(annotations.length); for (String s : annotations) { dataStream.writeName(s); } final String[] namedParameters = stub.getNamedParameters(); GosuStubUtils.writeStringArray(dataStream, namedParameters); dataStream.writeByte(stub.getFlags()); } @NotNull static GosuFieldStub deserializeFieldStub(@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.FIELD, flags); } static void indexFieldStub(@NotNull GosuFieldStub stub, @NotNull IndexSink sink) { String name = stub.getName(); if (name != null) { sink.occurrence(GosuFieldNameIndex.KEY, name); } for (String annName : stub.getAnnotations()) { if (annName != null) { sink.occurrence(GosuAnnotatedMemberIndex.KEY, annName); } } } }