package org.elixir_lang.beam.psi.stubs;
import com.intellij.lang.ASTNode;
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 org.elixir_lang.beam.psi.CallDefinition;
import org.elixir_lang.beam.psi.CallDefinitionElement;
import org.elixir_lang.beam.psi.Module;
import org.elixir_lang.beam.psi.ModuleElement;
import org.elixir_lang.beam.psi.impl.CallDefinitionImpl;
import org.elixir_lang.beam.psi.impl.CallDefinitionStubImpl;
import org.elixir_lang.beam.psi.impl.ModuleImpl;
import org.elixir_lang.beam.psi.impl.ModuleStubImpl;
import org.jetbrains.annotations.NotNull;
import java.io.IOException;
import java.util.Set;
import static org.elixir_lang.psi.stub.type.call.Stub.readNameSet;
// See com.intellij.psi.impl.java.stubs.JavaStubElementTypes
public interface ModuleStubElementTypes {
ModuleElementType CALL_DEFINITION = new ModuleElementType<CallDefinitionStub, CallDefinition>("CallDefinition") {
@NotNull
@Override
public ASTNode createCompositeNode() {
return new CallDefinitionElement(this);
}
@Override
public CallDefinition createPsi(@NotNull CallDefinitionStub stub) {
return new CallDefinitionImpl<CallDefinitionStub>(stub);
}
@NotNull
@Override
public CallDefinitionStub deserialize(@NotNull StubInputStream dataStream, StubElement parentStub) throws IOException {
assert dataStream.readName().toString().equals(CallDefinitionStubImpl.RESOLVED_MODULE_NAME);
String macro = dataStream.readName().toString();
assert dataStream.readInt() == CallDefinitionStubImpl.RESOLVED_FINAL_ARITY;
assert dataStream.readBoolean() == CallDefinitionStubImpl.HAS_DO_BLOCK_OR_KEYWORD;
StringRef nameRef = dataStream.readName();
String name = nameRef.toString();
Set<StringRef> canonicalNameRefSet = readNameSet(dataStream);
assert canonicalNameRefSet.size() == 1;
assert canonicalNameRefSet.iterator().next().toString().equals(name);
int callDefinitionClauseArity = dataStream.readInt();
return new CallDefinitionStubImpl((ModuleStub) parentStub, macro, name, callDefinitionClauseArity);
}
@Override
public void serialize(@NotNull CallDefinitionStub stub, @NotNull StubOutputStream dataStream) throws IOException {
super.serialize(stub, dataStream);
dataStream.writeInt(stub.callDefinitionClauseHeadArity());
}
};
/**
* See {@link com.intellij.psi.impl.java.stubs.JavaStubElementTypes#CLASS}
*/
ModuleElementType MODULE = new ModuleElementType<ModuleStub, Module>("Module") {
@NotNull
@Override
public ASTNode createCompositeNode() {
return new ModuleElement(this);
}
@Override
public Module createPsi(@NotNull ModuleStub stub) {
return new ModuleImpl<ModuleStub>(stub);
}
@NotNull
@Override
public ModuleStub deserialize(@NotNull StubInputStream dataStream,
@NotNull StubElement parentStub) throws IOException {
assert dataStream.readName().toString().equals(ModuleStubImpl.RESOLVED_MODULE_NAME);
assert dataStream.readName().toString().equals(ModuleStubImpl.RESOLVED_FUNCTION_NAME);
assert dataStream.readInt() == ModuleStubImpl.RESOLVED_FINAL_ARITY;
assert dataStream.readBoolean() == ModuleStubImpl.HAS_DO_BLOCK_OR_KEYWORD;
StringRef nameRef = dataStream.readName();
String name = nameRef.toString();
Set<StringRef> canonicalNameRefSet = readNameSet(dataStream);
assert canonicalNameRefSet.size() == 1;
assert canonicalNameRefSet.iterator().next().toString().equals(name);
return new ModuleStubImpl(parentStub, name);
}
};
}