// ---- FooTypes.java ----------------- //header.txt package test; import com.intellij.psi.tree.IElementType; import com.intellij.psi.PsiElement; import com.intellij.lang.ASTNode; import test.stub.FooParserDefinition; import test.psi.impl.*; public interface FooTypes { IElementType ELEMENT_1 = FooParserDefinition.createType("ELEMENT_1"); IElementType ELEMENT_2 = FooParserDefinition.createType("ELEMENT_2"); IElementType ELEMENT_3 = FooParserDefinition.createType("ELEMENT_3"); IElementType ELEMENT_4 = FooParserDefinition.createType("ELEMENT_4"); IElementType ELEMENT_5 = FooParserDefinition.createType("ELEMENT_5"); IElementType INTERFACE_TYPE = FooParserDefinition.createType("INTERFACE_TYPE"); IElementType STRUCT_TYPE = FooParserDefinition.createType("STRUCT_TYPE"); IElementType TYPE = FooParserDefinition.createType("TYPE"); class Factory { public static PsiElement createElement(ASTNode node) { IElementType type = node.getElementType(); if (type == ELEMENT_1) { return new Element1Impl(node); } else if (type == ELEMENT_2) { return new Element2Impl(node); } else if (type == ELEMENT_3) { return new Element3Impl(node); } else if (type == ELEMENT_4) { return new Element4Impl(node); } else if (type == ELEMENT_5) { return new Element5Impl(node); } else if (type == INTERFACE_TYPE) { return new InterfaceTypeImpl(node); } else if (type == STRUCT_TYPE) { return new StructTypeImpl(node); } throw new AssertionError("Unknown element type: " + type); } } } // ---- Element1.java ----------------- //header.txt package test.psi; import java.util.List; import org.jetbrains.annotations.*; import com.intellij.psi.PsiElement; import com.intellij.psi.StubBasedPsiElement; import test.stub.Element1Stub; public interface Element1 extends PsiElement, StubBasedPsiElement<Element1Stub> { @NotNull Element5 getElement5(); } // ---- Element2.java ----------------- //header.txt package test.psi; import java.util.List; import org.jetbrains.annotations.*; import com.intellij.psi.PsiElement; import com.intellij.psi.StubBasedPsiElement; import test.stub.Element2Stub; public interface Element2 extends PsiElement, StubBasedPsiElement<Element2Stub> { @NotNull List<Element4> getElement4List(); } // ---- Element3.java ----------------- //header.txt package test.psi; import java.util.List; import org.jetbrains.annotations.*; import com.intellij.psi.PsiElement; import com.intellij.psi.StubBasedPsiElement; import test.stub.Element3Stub; public interface Element3 extends PsiElement, StubBasedPsiElement<Element3Stub> { @NotNull Element4 getElement4(); } // ---- Element4.java ----------------- //header.txt package test.psi; import java.util.List; import org.jetbrains.annotations.*; import com.intellij.psi.PsiElement; import com.intellij.psi.StubBasedPsiElement; import test.stub.Element4Stub; public interface Element4 extends PsiElement, StubBasedPsiElement<Element4Stub> { @Nullable Element2 getElement2(); } // ---- Element5.java ----------------- //header.txt package test.psi; import java.util.List; import org.jetbrains.annotations.*; import com.intellij.psi.PsiElement; public interface Element5 extends PsiElement { } // ---- InterfaceType.java ----------------- //header.txt package test.psi; import java.util.List; import org.jetbrains.annotations.*; import com.intellij.psi.PsiElement; public interface InterfaceType extends Type { } // ---- Missing.java ----------------- //header.txt package test.psi; import java.util.List; import org.jetbrains.annotations.*; import com.intellij.psi.PsiElement; import com.intellij.psi.StubBasedPsiElement; import test.stub.MissingStub; public interface Missing extends PsiElement, StubBasedPsiElement<MissingStub> { } // ---- Simple.java ----------------- //header.txt package test.psi; import java.util.List; import org.jetbrains.annotations.*; import com.intellij.psi.PsiElement; import com.intellij.psi.StubBasedPsiElement; import org.intellij.grammar.test.StubTest.SimpleStub; public interface Simple extends PsiElement, StubBasedPsiElement<SimpleStub> { } // ---- StructType.java ----------------- //header.txt package test.psi; import java.util.List; import org.jetbrains.annotations.*; import com.intellij.psi.PsiElement; public interface StructType extends Type { } // ---- Type.java ----------------- //header.txt package test.psi; import java.util.List; import org.jetbrains.annotations.*; import com.intellij.psi.PsiElement; import com.intellij.psi.StubBasedPsiElement; import test.stub.TypeStub; public interface Type extends PsiElement, StubBasedPsiElement<TypeStub> { } // ---- Element1Impl.java ----------------- //header.txt package test.psi.impl; import java.util.List; import org.jetbrains.annotations.*; import com.intellij.lang.ASTNode; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElementVisitor; import test.psi.MyPsiTreeUtil; import static test.FooTypes.*; import org.intellij.grammar.test.StubTest.GenericBase; import test.stub.Element1Stub; import test.psi.*; import com.intellij.psi.stubs.IStubElementType; import com.intellij.psi.tree.IElementType; public class Element1Impl extends GenericBase<Element1Stub> implements Element1 { public Element1Impl(Element1Stub stub, IStubElementType type) { super(stub, type); } public Element1Impl(ASTNode node) { super(node); } public Element1Impl(Element1Stub stub, IElementType type, ASTNode node) { super(stub, type, node); } public void accept(@NotNull Visitor visitor) { visitor.visitElement1(this); } public void accept(@NotNull PsiElementVisitor visitor) { if (visitor instanceof Visitor) accept((Visitor)visitor); else super.accept(visitor); } @Override @NotNull public Element5 getElement5() { return notNullChild(MyPsiTreeUtil.getChildOfType(this, Element5.class)); } } // ---- Element2Impl.java ----------------- //header.txt package test.psi.impl; import java.util.List; import org.jetbrains.annotations.*; import com.intellij.lang.ASTNode; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElementVisitor; import test.psi.MyPsiTreeUtil; import static test.FooTypes.*; import com.intellij.extapi.psi.StubBasedPsiElementBase; import test.stub.Element2Stub; import test.psi.*; import com.intellij.psi.stubs.IStubElementType; import com.intellij.psi.tree.IElementType; public class Element2Impl extends StubBasedPsiElementBase<Element2Stub> implements Element2 { public Element2Impl(Element2Stub stub, IStubElementType type) { super(stub, type); } public Element2Impl(ASTNode node) { super(node); } public Element2Impl(Element2Stub stub, IElementType type, ASTNode node) { super(stub, type, node); } public void accept(@NotNull Visitor visitor) { visitor.visitElement2(this); } public void accept(@NotNull PsiElementVisitor visitor) { if (visitor instanceof Visitor) accept((Visitor)visitor); else super.accept(visitor); } @Override @NotNull public List<Element4> getElement4List() { return MyPsiTreeUtil.getStubChildrenOfTypeAsList(this, Element4.class); } } // ---- Element3Impl.java ----------------- //header.txt package test.psi.impl; import java.util.List; import org.jetbrains.annotations.*; import com.intellij.lang.ASTNode; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElementVisitor; import test.psi.MyPsiTreeUtil; import static test.FooTypes.*; import com.intellij.extapi.psi.StubBasedPsiElementBase; import test.stub.Element3Stub; import test.psi.*; import com.intellij.psi.stubs.IStubElementType; import com.intellij.psi.tree.IElementType; public class Element3Impl extends StubBasedPsiElementBase<Element3Stub> implements Element3 { public Element3Impl(Element3Stub stub, IStubElementType type) { super(stub, type); } public Element3Impl(ASTNode node) { super(node); } public Element3Impl(Element3Stub stub, IElementType type, ASTNode node) { super(stub, type, node); } public void accept(@NotNull Visitor visitor) { visitor.visitElement3(this); } public void accept(@NotNull PsiElementVisitor visitor) { if (visitor instanceof Visitor) accept((Visitor)visitor); else super.accept(visitor); } @Override @NotNull public Element4 getElement4() { return notNullChild(MyPsiTreeUtil.getStubChildOfType(this, Element4.class)); } } // ---- Element4Impl.java ----------------- //header.txt package test.psi.impl; import java.util.List; import org.jetbrains.annotations.*; import com.intellij.lang.ASTNode; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElementVisitor; import test.psi.MyPsiTreeUtil; import static test.FooTypes.*; import com.intellij.extapi.psi.StubBasedPsiElementBase; import test.stub.Element4Stub; import test.psi.*; import com.intellij.psi.stubs.IStubElementType; import com.intellij.psi.tree.IElementType; public class Element4Impl extends StubBasedPsiElementBase<Element4Stub> implements Element4 { public Element4Impl(Element4Stub stub, IStubElementType type) { super(stub, type); } public Element4Impl(ASTNode node) { super(node); } public Element4Impl(Element4Stub stub, IElementType type, ASTNode node) { super(stub, type, node); } public void accept(@NotNull Visitor visitor) { visitor.visitElement4(this); } public void accept(@NotNull PsiElementVisitor visitor) { if (visitor instanceof Visitor) accept((Visitor)visitor); else super.accept(visitor); } @Override @Nullable public Element2 getElement2() { return MyPsiTreeUtil.getStubChildOfType(this, Element2.class); } } // ---- Element5Impl.java ----------------- //header.txt package test.psi.impl; import java.util.List; import org.jetbrains.annotations.*; import com.intellij.lang.ASTNode; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElementVisitor; import test.psi.MyPsiTreeUtil; import static test.FooTypes.*; import com.intellij.extapi.psi.ASTWrapperPsiElement; import test.psi.*; public class Element5Impl extends ASTWrapperPsiElement implements Element5 { public Element5Impl(ASTNode node) { super(node); } public void accept(@NotNull Visitor visitor) { visitor.visitElement5(this); } public void accept(@NotNull PsiElementVisitor visitor) { if (visitor instanceof Visitor) accept((Visitor)visitor); else super.accept(visitor); } } // ---- InterfaceTypeImpl.java ----------------- //header.txt package test.psi.impl; import java.util.List; import org.jetbrains.annotations.*; import com.intellij.lang.ASTNode; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElementVisitor; import test.psi.MyPsiTreeUtil; import static test.FooTypes.*; import test.psi.*; import com.intellij.psi.stubs.IStubElementType; import com.intellij.psi.tree.IElementType; import test.stub.TypeStub; public class InterfaceTypeImpl extends TypeImpl implements InterfaceType { public InterfaceTypeImpl(TypeStub stub, IStubElementType type) { super(stub, type); } public InterfaceTypeImpl(ASTNode node) { super(node); } public InterfaceTypeImpl(TypeStub stub, IElementType type, ASTNode node) { super(stub, type, node); } public void accept(@NotNull Visitor visitor) { visitor.visitInterfaceType(this); } public void accept(@NotNull PsiElementVisitor visitor) { if (visitor instanceof Visitor) accept((Visitor)visitor); else super.accept(visitor); } } // ---- MissingImpl.java ----------------- //header.txt package test.psi.impl; import java.util.List; import org.jetbrains.annotations.*; import com.intellij.lang.ASTNode; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElementVisitor; import test.psi.MyPsiTreeUtil; import static test.FooTypes.*; import test.stub.MissingBase; import test.psi.*; import com.intellij.psi.stubs.IStubElementType; import test.stub.MissingStub; public class MissingImpl extends MissingBase implements Missing { public MissingImpl(ASTNode node) { super(node); } public MissingImpl(MissingStub stub, IStubElementType stubType) { super(stub, stubType); } public void accept(@NotNull Visitor visitor) { visitor.visitMissing(this); } public void accept(@NotNull PsiElementVisitor visitor) { if (visitor instanceof Visitor) accept((Visitor)visitor); else super.accept(visitor); } } // ---- SimpleImpl.java ----------------- //header.txt package test.psi.impl; import java.util.List; import org.jetbrains.annotations.*; import com.intellij.lang.ASTNode; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElementVisitor; import test.psi.MyPsiTreeUtil; import static test.FooTypes.*; import org.intellij.grammar.test.StubTest.SimpleBase; import test.psi.*; import org.intellij.grammar.test.StubTest.SimpleStub; import com.intellij.psi.stubs.IStubElementType; public class SimpleImpl extends SimpleBase implements Simple { public SimpleImpl(SimpleStub stub, IStubElementType type) { super(stub, type); } public SimpleImpl(ASTNode node) { super(node); } public void accept(@NotNull Visitor visitor) { visitor.visitSimple(this); } public void accept(@NotNull PsiElementVisitor visitor) { if (visitor instanceof Visitor) accept((Visitor)visitor); else super.accept(visitor); } } // ---- StructTypeImpl.java ----------------- //header.txt package test.psi.impl; import java.util.List; import org.jetbrains.annotations.*; import com.intellij.lang.ASTNode; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElementVisitor; import test.psi.MyPsiTreeUtil; import static test.FooTypes.*; import test.psi.*; import com.intellij.psi.stubs.IStubElementType; import com.intellij.psi.tree.IElementType; import test.stub.TypeStub; public class StructTypeImpl extends TypeImpl implements StructType { public StructTypeImpl(TypeStub stub, IStubElementType type) { super(stub, type); } public StructTypeImpl(ASTNode node) { super(node); } public StructTypeImpl(TypeStub stub, IElementType type, ASTNode node) { super(stub, type, node); } public void accept(@NotNull Visitor visitor) { visitor.visitStructType(this); } public void accept(@NotNull PsiElementVisitor visitor) { if (visitor instanceof Visitor) accept((Visitor)visitor); else super.accept(visitor); } } // ---- TypeImpl.java ----------------- //header.txt package test.psi.impl; import java.util.List; import org.jetbrains.annotations.*; import com.intellij.lang.ASTNode; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElementVisitor; import test.psi.MyPsiTreeUtil; import static test.FooTypes.*; import org.intellij.grammar.test.StubTest.GenericBase; import test.stub.TypeStub; import test.psi.*; import com.intellij.psi.stubs.IStubElementType; import com.intellij.psi.tree.IElementType; public abstract class TypeImpl extends GenericBase<TypeStub> implements Type { public TypeImpl(TypeStub stub, IStubElementType type) { super(stub, type); } public TypeImpl(ASTNode node) { super(node); } public TypeImpl(TypeStub stub, IElementType type, ASTNode node) { super(stub, type, node); } public void accept(@NotNull Visitor visitor) { visitor.visitType(this); } public void accept(@NotNull PsiElementVisitor visitor) { if (visitor instanceof Visitor) accept((Visitor)visitor); else super.accept(visitor); } } // ---- Visitor.java ----------------- //header.txt package test.psi; import org.jetbrains.annotations.*; import com.intellij.psi.PsiElementVisitor; import com.intellij.psi.PsiElement; public class Visitor extends PsiElementVisitor { public void visitElement1(@NotNull Element1 o) { visitPsiElement(o); } public void visitElement2(@NotNull Element2 o) { visitPsiElement(o); } public void visitElement3(@NotNull Element3 o) { visitPsiElement(o); } public void visitElement4(@NotNull Element4 o) { visitPsiElement(o); } public void visitElement5(@NotNull Element5 o) { visitPsiElement(o); } public void visitInterfaceType(@NotNull InterfaceType o) { visitType(o); } public void visitMissing(@NotNull Missing o) { visitPsiElement(o); } public void visitSimple(@NotNull Simple o) { visitPsiElement(o); } public void visitStructType(@NotNull StructType o) { visitType(o); } public void visitType(@NotNull Type o) { visitPsiElement(o); } public void visitPsiElement(@NotNull PsiElement o) { visitElement(o); } }