package org.jetbrains.plugins.clojure.psi.stubs.elements.ns; 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.io.StringRef; import com.intellij.openapi.util.text.StringUtil; import org.jetbrains.plugins.clojure.psi.ClStubElementType; import org.jetbrains.plugins.clojure.psi.api.ns.ClNs; import org.jetbrains.plugins.clojure.psi.stubs.api.ClNsStub; import org.jetbrains.plugins.clojure.psi.stubs.index.ClojureNsNameIndex; import java.io.IOException; import java.util.List; /** * @author ilyas */ public abstract class ClNsElementTypeBase extends ClStubElementType<ClNsStub, ClNs> { public ClNsElementTypeBase(String dName) { super(dName); } public void serialize(ClNsStub stub, StubOutputStream dataStream) throws IOException { dataStream.writeName(stub.getName()); dataStream.writeInt(stub.getTextOffset()); } public ClNsStub deserialize(StubInputStream dataStream, StubElement parentStub) throws IOException { StringRef ref = dataStream.readName(); int textOffset = dataStream.readInt(); return new ClNsStub(parentStub, ref, this, textOffset); } @Override public void indexStub(ClNsStub stub, IndexSink sink) { final String name = stub.getName(); if (name != null && name.trim().length() > 0) { final List<String> parcels = StringUtil.split(name, "."); final StringBuffer buffer = new StringBuffer(); buffer.append(parcels.remove(0)); sink.occurrence(ClojureNsNameIndex.KEY, buffer.toString()); for (String parcel : parcels) { buffer.append(".").append(parcel); sink.occurrence(ClojureNsNameIndex.KEY, buffer.toString()); } } } }