package org.jetbrains.plugins.clojure.psi.stubs.elements;
import com.intellij.psi.StubBuilder;
import com.intellij.psi.stubs.*;
import com.intellij.psi.tree.IStubFileElementType;
import com.intellij.util.io.StringRef;
import org.jetbrains.plugins.clojure.file.ClojureFileType;
import org.jetbrains.plugins.clojure.psi.stubs.ClojureFileStubBuilder;
import org.jetbrains.plugins.clojure.psi.stubs.api.ClFileStub;
import org.jetbrains.plugins.clojure.psi.stubs.impl.ClFileStubImpl;
import org.jetbrains.plugins.clojure.psi.stubs.index.ClojureClassNameIndex;
import org.jetbrains.plugins.clojure.psi.stubs.index.ClojureFullScriptNameIndex;
import java.io.IOException;
/**
* @author ilyas
*/
public class ClStubFileElementType extends IStubFileElementType<ClFileStub> {
private static final int CACHES_VERSION = 14;
public ClStubFileElementType() {
super(ClojureFileType.CLOJURE_LANGUAGE);
}
public StubBuilder getBuilder() {
return new ClojureFileStubBuilder();
}
@Override
public int getStubVersion() {
return super.getStubVersion() + CACHES_VERSION;
}
public String getExternalId() {
return "clojure.FILE";
}
@Override
public void indexStub(PsiFileStub stub, IndexSink sink) {
super.indexStub(stub, sink);
}
@Override
public void serialize(final ClFileStub stub, final StubOutputStream dataStream) throws IOException {
dataStream.writeName(stub.getPackageName().toString());
dataStream.writeName(stub.getClassName().toString());
dataStream.writeBoolean(stub.isClassDefinition());
}
@Override
public ClFileStub deserialize(final StubInputStream dataStream, final StubElement parentStub) throws IOException {
StringRef packName = dataStream.readName();
StringRef name = dataStream.readName();
boolean isScript = dataStream.readBoolean();
return new ClFileStubImpl(packName, name, isScript);
}
public void indexStub(ClFileStub stub, IndexSink sink) {
String name = stub.getClassName().toString();
if (stub.isClassDefinition() && name != null) {
sink.occurrence(ClojureClassNameIndex.KEY, name);
final String pName = stub.getPackageName().toString();
final String fqn = pName == null || pName.length() == 0 ? name : pName + "." + name;
sink.occurrence(ClojureFullScriptNameIndex.KEY, fqn.hashCode());
}
}
}