less garbage
[fedora-idea.git] / source / com / intellij / psi / impl / java / stubs / JavaClassReferenceListElementType.java
blobd262c9eb54e77c626ceb32f2c24974ce5fe4f8f1
1 /*
2 * @author max
3 */
4 package com.intellij.psi.impl.java.stubs;
6 import com.intellij.lang.ASTNode;
7 import com.intellij.psi.PsiCompiledElement;
8 import com.intellij.psi.PsiJavaCodeReferenceElement;
9 import com.intellij.psi.PsiNameHelper;
10 import com.intellij.psi.PsiReferenceList;
11 import com.intellij.psi.impl.compiled.ClsReferenceListImpl;
12 import com.intellij.psi.impl.java.stubs.impl.PsiClassReferenceListStubImpl;
13 import com.intellij.psi.impl.java.stubs.index.JavaSuperClassNameOccurenceIndex;
14 import com.intellij.psi.impl.source.PsiReferenceListImpl;
15 import com.intellij.psi.impl.source.tree.java.PsiTypeParameterExtendsBoundsListImpl;
16 import com.intellij.psi.stubs.IndexSink;
17 import com.intellij.psi.stubs.StubElement;
18 import com.intellij.psi.stubs.StubInputStream;
19 import com.intellij.psi.stubs.StubOutputStream;
20 import com.intellij.util.ArrayUtil;
21 import com.intellij.util.io.StringRef;
22 import org.jetbrains.annotations.NonNls;
23 import org.jetbrains.annotations.NotNull;
25 import java.io.IOException;
27 public class JavaClassReferenceListElementType extends JavaStubElementType<PsiClassReferenceListStub, PsiReferenceList> {
28 public JavaClassReferenceListElementType(@NotNull @NonNls String id) {
29 super(id);
32 public PsiReferenceList createPsi(final PsiClassReferenceListStub stub) {
33 if (isCompiled(stub)) {
34 return new ClsReferenceListImpl(stub);
36 else {
37 if (stub.getRole() == PsiReferenceList.Role.EXTENDS_BOUNDS_LIST) {
38 return new PsiTypeParameterExtendsBoundsListImpl(stub, JavaStubElementTypes.EXTENDS_BOUND_LIST);
41 return new PsiReferenceListImpl(stub, stub.getStubType());
45 public PsiReferenceList createPsi(final ASTNode node) {
46 if (node.getElementType() == JavaStubElementTypes.EXTENDS_BOUND_LIST) {
47 return new PsiTypeParameterExtendsBoundsListImpl(node);
50 return new PsiReferenceListImpl(node);
53 public PsiClassReferenceListStub createStub(final PsiReferenceList psi, final StubElement parentStub) {
54 return new PsiClassReferenceListStubImpl(roleToElementType(psi.getRole()), parentStub, getTexts(psi), psi.getRole());
57 private static JavaClassReferenceListElementType roleToElementType(final PsiReferenceList.Role role) {
58 switch (role) {
59 case EXTENDS_BOUNDS_LIST:
60 return JavaStubElementTypes.EXTENDS_BOUND_LIST;
61 case EXTENDS_LIST:
62 return JavaStubElementTypes.EXTENDS_LIST;
63 case IMPLEMENTS_LIST:
64 return JavaStubElementTypes.IMPLEMENTS_LIST;
65 case THROWS_LIST:
66 return JavaStubElementTypes.THROWS_LIST;
69 throw new RuntimeException("Unknown role: " + role);
72 private static String[] getTexts(PsiReferenceList psi) {
73 final PsiJavaCodeReferenceElement[] refs = psi.getReferenceElements();
74 String[] texts = ArrayUtil.newStringArray(refs.length);
75 for (int i = 0; i < refs.length; i++) {
76 PsiJavaCodeReferenceElement ref = refs[i];
77 texts[i] = ref instanceof PsiCompiledElement ? ref.getCanonicalText() : ref.getText();
79 return texts;
82 public void serialize(final PsiClassReferenceListStub stub, final StubOutputStream dataStream) throws IOException {
83 dataStream.writeByte(encodeRole(stub.getRole()));
84 final String[] names = stub.getReferencedNames();
85 dataStream.writeVarInt(names.length);
86 for (String name : names) {
87 dataStream.writeName(name);
91 public PsiClassReferenceListStub deserialize(final StubInputStream dataStream, final StubElement parentStub)
92 throws IOException {
93 byte role = dataStream.readByte();
94 int len = dataStream.readVarInt();
95 StringRef[] names = StringRef.createArray(len);
96 for (int i = 0; i < names.length; i++) {
97 names[i] = dataStream.readName();
100 final PsiReferenceList.Role decodedRole = decodeRole(role);
101 return new PsiClassReferenceListStubImpl(roleToElementType(decodedRole), parentStub, names, decodedRole);
104 private static PsiReferenceList.Role decodeRole(int code) {
105 switch (code) {
106 case 0: return PsiReferenceList.Role.EXTENDS_LIST;
107 case 1: return PsiReferenceList.Role.IMPLEMENTS_LIST;
108 case 2: return PsiReferenceList.Role.THROWS_LIST;
109 case 3: return PsiReferenceList.Role.EXTENDS_BOUNDS_LIST;
111 default:
112 throw new RuntimeException("Unknown role code: " + code);
116 private static byte encodeRole(PsiReferenceList.Role role) {
117 switch (role) {
118 case EXTENDS_LIST: return 0;
119 case IMPLEMENTS_LIST: return 1;
120 case THROWS_LIST: return 2;
121 case EXTENDS_BOUNDS_LIST: return 3;
123 default:
124 throw new RuntimeException("Unknown role code: " + role);
128 public void indexStub(final PsiClassReferenceListStub stub, final IndexSink sink) {
129 final PsiReferenceList.Role role = stub.getRole();
130 if (role == PsiReferenceList.Role.EXTENDS_LIST || role == PsiReferenceList.Role.IMPLEMENTS_LIST) {
131 final String[] names = stub.getReferencedNames();
132 for (String name : names) {
133 sink.occurrence(JavaSuperClassNameOccurenceIndex.KEY, PsiNameHelper.getShortClassName(name));