Stub for enum entry

This commit is contained in:
Nikolay Krasko
2012-06-25 11:41:34 +04:00
parent 429c2f307e
commit 7499ba0255
8 changed files with 77 additions and 25 deletions
@@ -38,7 +38,7 @@ public interface JetNodeTypes {
JetNodeType CLASS_OBJECT = new JetNodeType("CLASS_OBJECT", JetClassObject.class); JetNodeType CLASS_OBJECT = new JetNodeType("CLASS_OBJECT", JetClassObject.class);
JetNodeType CONSTRUCTOR = new JetNodeType("CONSTRUCTOR", JetSecondaryConstructor.class); JetNodeType CONSTRUCTOR = new JetNodeType("CONSTRUCTOR", JetSecondaryConstructor.class);
JetNodeType ENUM_ENTRY = new JetNodeType("ENUM_ENTRY", JetEnumEntry.class); IElementType ENUM_ENTRY = JetStubElementTypes.ENUM_ENTRY;
JetNodeType ANONYMOUS_INITIALIZER = new JetNodeType("ANONYMOUS_INITIALIZER", JetClassInitializer.class); JetNodeType ANONYMOUS_INITIALIZER = new JetNodeType("ANONYMOUS_INITIALIZER", JetClassInitializer.class);
IElementType TYPE_PARAMETER_LIST = JetStubElementTypes.TYPE_PARAMETER_LIST; IElementType TYPE_PARAMETER_LIST = JetStubElementTypes.TYPE_PARAMETER_LIST;
@@ -18,10 +18,13 @@ package org.jetbrains.jet.lang.psi;
import com.intellij.lang.ASTNode; import com.intellij.lang.ASTNode;
import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElement;
import com.intellij.psi.stubs.IStubElementType;
import com.intellij.util.IncorrectOperationException; import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.JetNodeTypes; import org.jetbrains.jet.JetNodeTypes;
import org.jetbrains.jet.lang.psi.stubs.PsiJetClassStub;
import org.jetbrains.jet.lang.psi.stubs.elements.JetStubElementTypes;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
@@ -34,8 +37,17 @@ public class JetEnumEntry extends JetClass {
super(node); super(node);
} }
public JetEnumEntry(@NotNull PsiJetClassStub stub) {
super(stub);
}
@Override @Override
public String getName() { public String getName() {
PsiJetClassStub classStub = getStub();
if (classStub != null) {
return classStub.getName();
}
JetObjectDeclarationName nameAsDeclaration = getNameAsDeclaration(); JetObjectDeclarationName nameAsDeclaration = getNameAsDeclaration();
return nameAsDeclaration == null ? "<Anonymous>" : nameAsDeclaration.getName(); return nameAsDeclaration == null ? "<Anonymous>" : nameAsDeclaration.getName();
} }
@@ -46,6 +58,12 @@ public class JetEnumEntry extends JetClass {
return nameAsDeclaration == null ? null : nameAsDeclaration.getNameIdentifier(); return nameAsDeclaration == null ? null : nameAsDeclaration.getNameIdentifier();
} }
@NotNull
@Override
public IStubElementType getElementType() {
return JetStubElementTypes.ENUM_ENTRY;
}
@Override @Override
public PsiElement setName(@NonNls @NotNull String name) throws IncorrectOperationException { public PsiElement setName(@NonNls @NotNull String name) throws IncorrectOperationException {
JetObjectDeclarationName nameAsDeclaration = getNameAsDeclaration(); JetObjectDeclarationName nameAsDeclaration = getNameAsDeclaration();
@@ -34,6 +34,8 @@ public interface PsiJetClassStub extends NamedStub<JetClass> {
boolean isTrait(); boolean isTrait();
boolean isEnumEntry();
@NotNull @NotNull
List<String> getSuperNames(); List<String> getSuperNames();
} }
@@ -25,6 +25,7 @@ import com.intellij.util.io.StringRef;
import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.psi.JetClass; import org.jetbrains.jet.lang.psi.JetClass;
import org.jetbrains.jet.lang.psi.JetEnumEntry;
import org.jetbrains.jet.lang.psi.JetPsiUtil; import org.jetbrains.jet.lang.psi.JetPsiUtil;
import org.jetbrains.jet.lang.psi.stubs.PsiJetClassStub; import org.jetbrains.jet.lang.psi.stubs.PsiJetClassStub;
import org.jetbrains.jet.lang.psi.stubs.impl.PsiJetClassStubImpl; import org.jetbrains.jet.lang.psi.stubs.impl.PsiJetClassStubImpl;
@@ -44,19 +45,20 @@ public class JetClassElementType extends JetStubElementType<PsiJetClassStub, Jet
@Override @Override
public JetClass createPsi(@NotNull PsiJetClassStub stub) { public JetClass createPsi(@NotNull PsiJetClassStub stub) {
return new JetClass(stub); return !stub.isEnumEntry() ? new JetClass(stub) : new JetEnumEntry(stub);
} }
@Override @Override
public JetClass createPsiFromAst(@NotNull ASTNode node) { public JetClass createPsiFromAst(@NotNull ASTNode node) {
return new JetClass(node); return node.getElementType() != JetStubElementTypes.ENUM_ENTRY ? new JetClass(node) : new JetEnumEntry(node);
} }
@Override @Override
public PsiJetClassStub createStub(@NotNull JetClass psi, StubElement parentStub) { public PsiJetClassStub createStub(@NotNull JetClass psi, StubElement parentStub) {
FqName fqName = JetPsiUtil.getFQName(psi); FqName fqName = JetPsiUtil.getFQName(psi);
return new PsiJetClassStubImpl(JetStubElementTypes.CLASS, parentStub, fqName != null ? fqName.getFqName() : null, psi.getName(), boolean isEnumEntry = psi instanceof JetEnumEntry;
psi.getSuperNames(), psi.isTrait()); return new PsiJetClassStubImpl(getStubType(isEnumEntry), parentStub, fqName != null ? fqName.getFqName() : null, psi.getName(),
psi.getSuperNames(), psi.isTrait(), isEnumEntry);
} }
@Override @Override
@@ -64,6 +66,7 @@ public class JetClassElementType extends JetStubElementType<PsiJetClassStub, Jet
dataStream.writeName(stub.getName()); dataStream.writeName(stub.getName());
dataStream.writeName(stub.getQualifiedName()); dataStream.writeName(stub.getQualifiedName());
dataStream.writeBoolean(stub.isTrait()); dataStream.writeBoolean(stub.isTrait());
dataStream.writeBoolean(stub.isEnumEntry());
List<String> superNames = stub.getSuperNames(); List<String> superNames = stub.getSuperNames();
dataStream.writeVarInt(superNames.size()); dataStream.writeVarInt(superNames.size());
@@ -77,6 +80,7 @@ public class JetClassElementType extends JetStubElementType<PsiJetClassStub, Jet
StringRef name = dataStream.readName(); StringRef name = dataStream.readName();
StringRef qualifiedName = dataStream.readName(); StringRef qualifiedName = dataStream.readName();
boolean isTrait = dataStream.readBoolean(); boolean isTrait = dataStream.readBoolean();
boolean isEnumEntry = dataStream.readBoolean();
int superCount = dataStream.readVarInt(); int superCount = dataStream.readVarInt();
StringRef[] superNames = StringRef.createArray(superCount); StringRef[] superNames = StringRef.createArray(superCount);
@@ -84,11 +88,15 @@ public class JetClassElementType extends JetStubElementType<PsiJetClassStub, Jet
superNames[i] = dataStream.readName(); superNames[i] = dataStream.readName();
} }
return new PsiJetClassStubImpl(JetStubElementTypes.CLASS, parentStub, qualifiedName, name, superNames, isTrait); return new PsiJetClassStubImpl(getStubType(isEnumEntry), parentStub, qualifiedName, name, superNames, isTrait, isEnumEntry);
} }
@Override @Override
public void indexStub(PsiJetClassStub stub, IndexSink sink) { public void indexStub(PsiJetClassStub stub, IndexSink sink) {
StubIndexServiceFactory.getInstance().indexClass(stub, sink); StubIndexServiceFactory.getInstance().indexClass(stub, sink);
} }
private static JetClassElementType getStubType(boolean isEnumEntry) {
return isEnumEntry ? JetStubElementTypes.ENUM_ENTRY : JetStubElementTypes.CLASS;
}
} }
@@ -38,7 +38,7 @@ import java.io.IOException;
* @author Nikolay Krasko * @author Nikolay Krasko
*/ */
public class JetFileElementType extends IStubFileElementType<PsiJetFileStub> { public class JetFileElementType extends IStubFileElementType<PsiJetFileStub> {
public static final int STUB_VERSION = 13; public static final int STUB_VERSION = 14;
public JetFileElementType() { public JetFileElementType() {
super("jet.FILE", JetLanguage.INSTANCE); super("jet.FILE", JetLanguage.INSTANCE);
@@ -25,6 +25,7 @@ public interface JetStubElementTypes {
JetClassElementType CLASS = new JetClassElementType("CLASS"); JetClassElementType CLASS = new JetClassElementType("CLASS");
JetFunctionElementType FUNCTION = new JetFunctionElementType("FUN"); JetFunctionElementType FUNCTION = new JetFunctionElementType("FUN");
JetPropertyElementType PROPERTY = new JetPropertyElementType("PROPERTY"); JetPropertyElementType PROPERTY = new JetPropertyElementType("PROPERTY");
JetClassElementType ENUM_ENTRY = new JetClassElementType("ENUM_ENTRY");
JetParameterElementType VALUE_PARAMETER = new JetParameterElementType("VALUE_PARAMETER"); JetParameterElementType VALUE_PARAMETER = new JetParameterElementType("VALUE_PARAMETER");
JetParameterListElementType VALUE_PARAMETER_LIST = new JetParameterListElementType("VALUE_PARAMETER_LIST"); JetParameterListElementType VALUE_PARAMETER_LIST = new JetParameterListElementType("VALUE_PARAMETER_LIST");
@@ -34,11 +34,11 @@ import java.util.List;
* @author Nikolay Krasko * @author Nikolay Krasko
*/ */
public class PsiJetClassStubImpl extends StubBase<JetClass> implements PsiJetClassStub { public class PsiJetClassStubImpl extends StubBase<JetClass> implements PsiJetClassStub {
private final StringRef qualifiedName; private final StringRef qualifiedName;
private final StringRef name; private final StringRef name;
private final StringRef[] superNames; private final StringRef[] superNames;
private final boolean isTrait; private final boolean isTrait;
private final boolean isEnumEntry;
public PsiJetClassStubImpl( public PsiJetClassStubImpl(
JetClassElementType type, JetClassElementType type,
@@ -46,8 +46,25 @@ public class PsiJetClassStubImpl extends StubBase<JetClass> implements PsiJetCla
@Nullable final String qualifiedName, @Nullable final String qualifiedName,
String name, String name,
List<String> superNames, List<String> superNames,
boolean isTrait) { boolean isTrait, boolean isEnumEntry) {
this(type, parent, StringRef.fromString(qualifiedName), StringRef.fromString(name), wrapStrings(superNames), isTrait); this(type, parent, StringRef.fromString(qualifiedName), StringRef.fromString(name), wrapStrings(superNames),
isTrait, isEnumEntry);
}
public PsiJetClassStubImpl(
JetClassElementType type,
StubElement parent,
StringRef qualifiedName,
StringRef name,
StringRef[] superNames,
boolean isTrait, boolean isEnumEntry
) {
super(parent, type);
this.qualifiedName = qualifiedName;
this.name = name;
this.superNames = superNames;
this.isTrait = isTrait;
this.isEnumEntry = isEnumEntry;
} }
private static StringRef[] wrapStrings(List<String> names) { private static StringRef[] wrapStrings(List<String> names) {
@@ -58,21 +75,6 @@ public class PsiJetClassStubImpl extends StubBase<JetClass> implements PsiJetCla
return refs; return refs;
} }
public PsiJetClassStubImpl(
JetClassElementType type,
StubElement parent,
StringRef qualifiedName,
StringRef name,
StringRef[] superNames,
boolean isTrait) {
super(parent, type);
this.qualifiedName = qualifiedName;
this.name = name;
this.superNames = superNames;
this.isTrait = isTrait;
}
@Override @Override
public String getQualifiedName() { public String getQualifiedName() {
return StringRef.toString(qualifiedName); return StringRef.toString(qualifiedName);
@@ -83,6 +85,11 @@ public class PsiJetClassStubImpl extends StubBase<JetClass> implements PsiJetCla
return isTrait; return isTrait;
} }
@Override
public boolean isEnumEntry() {
return isEnumEntry;
}
@Override @Override
public String getName() { public String getName() {
return StringRef.toString(name); return StringRef.toString(name);
@@ -103,6 +110,10 @@ public class PsiJetClassStubImpl extends StubBase<JetClass> implements PsiJetCla
StringBuilder builder = new StringBuilder(); StringBuilder builder = new StringBuilder();
builder.append("PsiJetClassStubImpl["); builder.append("PsiJetClassStubImpl[");
if (isEnumEntry()) {
builder.append("enumEntry ");
}
if (isTrait()) { if (isTrait()) {
builder.append("trait "); builder.append("trait ");
} }
@@ -91,6 +91,18 @@ public class JetStubsTest extends LightCodeInsightFixtureTestCase {
" VALUE_PARAMETER_LIST:PsiJetParameterListStubImpl\n"); " VALUE_PARAMETER_LIST:PsiJetParameterListStubImpl\n");
} }
public void testSimpleEnumBuild() {
doBuildTest("enum class Test { First\n Second\n }",
"PsiJetFileStubImpl[package=]\n" +
" CLASS:PsiJetClassStubImpl[name=Test fqn=Test superNames=[]]\n" +
" TYPE_PARAMETER_LIST:PsiJetTypeParameterListStubImpl\n" +
" ENUM_ENTRY:PsiJetClassStubImpl[enumEntry name=First fqn=Test.First superNames=[]]\n" +
" TYPE_PARAMETER_LIST:PsiJetTypeParameterListStubImpl\n" +
" ENUM_ENTRY:PsiJetClassStubImpl[enumEntry name=Second fqn=Test.Second superNames=[]]\n" +
" TYPE_PARAMETER_LIST:PsiJetTypeParameterListStubImpl\n"
);
}
private void doBuildTest(@NonNls final String source, @NonNls @NotNull final String tree) { private void doBuildTest(@NonNls final String source, @NonNls @NotNull final String tree) {
final JetFile file = (JetFile) createLightFile(JetFileType.INSTANCE, source); final JetFile file = (JetFile) createLightFile(JetFileType.INSTANCE, source);
final FileASTNode fileNode = file.getNode(); final FileASTNode fileNode = file.getNode();