indexStub not being called and index is empty
I've been following http://www.jetbrains.org/intellij/sdk/docs/basics/indexing_and_psi_stubs/stub_indexes.html while looking at https://github.com/ignatov/intellij-erlang/commit/87ad1f4d8ddeba7f7d5f21b1a8e85cd24cd03628# for a real world example of building a stub index. I have an index:
package org.elixir_lang.psi.stub.index;
import com.intellij.psi.stubs.StringStubIndexExtension;
import com.intellij.psi.stubs.StubIndexKey;
import org.elixir_lang.psi.NamedElement;
import org.jetbrains.annotations.NotNull;
public class AllName extends StringStubIndexExtension<NamedElement> {
public static final StubIndexKey<String, NamedElement> KEY = StubIndexKey.createIndexKey("elixir.all.name");
public static final int VERSION = 0;
@Override
public int getVersion() {
return super.getVersion() + VERSION;
}
@NotNull
@Override
public StubIndexKey<String, NamedElement> getKey() {
return KEY;
}
}
That I register in plugin.xml<idea-plugin version="2">package org.elixir_lang.psi.stub;
import com.intellij.psi.stubs.IStubElementType;
import com.intellij.psi.stubs.NamedStubBase;
import com.intellij.psi.stubs.StubElement;
import com.intellij.util.io.StringRef;
import org.elixir_lang.psi.ElixirAlias;
import org.jetbrains.annotations.Nullable;
public class Alias extends NamedStubBase<ElixirAlias> {
public Alias(StubElement parent, IStubElementType elementType, @Nullable String name) {
super(parent, elementType, name);
}
public Alias(StubElement parent, IStubElementType elementType, StringRef nameRef) {
super(parent, elementType, nameRef);
}
}
Stub type:package org.elixir_lang.psi.stub.type;
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 org.elixir_lang.psi.ElixirAlias;
import org.elixir_lang.psi.impl.ElixirAliasImpl;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import java.io.IOException;
public class Alias extends Named<org.elixir_lang.psi.stub.Alias, ElixirAlias> {
/*
* Constructors
*/
public Alias(@NonNls @NotNull String debugName) {
super(debugName);
}
/*
* Instance Methods
*/
@NotNull
@Override
public org.elixir_lang.psi.stub.Alias deserialize(@NotNull StubInputStream dataStream, StubElement parentStub) throws IOException {
return new org.elixir_lang.psi.stub.Alias(parentStub, this, dataStream.readName());
}
@Override
public ElixirAlias createPsi(@NotNull org.elixir_lang.psi.stub.Alias stub) {
return new ElixirAliasImpl(stub, this);
}
@Override
public org.elixir_lang.psi.stub.Alias createStub(ElixirAlias psi, StubElement parentStub) {
return new org.elixir_lang.psi.stub.Alias(parentStub, this, psi.getName());
}
@Override
public void indexStub(@NotNull final org.elixir_lang.psi.stub.Alias stub, @NotNull final IndexSink sink) {
int a = 1; // THIS IS NOT RUN
}
@Override
public void serialize(final @NotNull org.elixir_lang.psi.stub.Alias stub, @NotNull StubOutputStream dataStream) throws IOException {
dataStream.writeName(stub.getName());
}
}
Just for context, Aliases are the Camel.Case.Dotted.Names in Elixir, so I want them indexed as they are used for Module names, whic would map to class names in Java. If there's a better way to index "class names" that I missed let me know.
Why isn't indexStub being called and the AllName index being populated?
请先登录再写评论。
Check your StubBuilder is really producing stub node that you want to index.
createStub is being called when I place a breakpoint in its body. (I assume by one of the built-in StubBuilder implementations.) My understanding of http://www.jetbrains.org/intellij/sdk/docs/basics/indexing_and_psi_stubs/stub_indexes.html was that I didn't have to write my own StubBuilder, just implement the createStub method as I have. Is that not correct?
Sorry, I just realized I did setup a StubBuilder, but as an anonymous subclass inside of the ElementType for my File. I didn't remember it because I was copy and modifying from intellij-erlang, so I didn't actualy type StubBuilder:
So far I've only written the stubs for the File and the Alias, but an Alias in a `defmodule` call isn't a direct child of a File node. Does this matter? The docs said I could leave elements out of the stub, but do I need all the elements along a hierarcyh from the file to the element I want indexed to have stubs?
It looks like my stub.type.File was just incomplete because I missed copying some of the method overrides. With this version of the class, I get a built index:
No, you don't. You can skip elements you don't care about.