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
) {
32 public PsiReferenceList
createPsi(final PsiClassReferenceListStub stub
) {
33 if (isCompiled(stub
)) {
34 return new ClsReferenceListImpl(stub
);
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
) {
59 case EXTENDS_BOUNDS_LIST
:
60 return JavaStubElementTypes
.EXTENDS_BOUND_LIST
;
62 return JavaStubElementTypes
.EXTENDS_LIST
;
64 return JavaStubElementTypes
.IMPLEMENTS_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();
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
)
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
) {
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
;
112 throw new RuntimeException("Unknown role code: " + code
);
116 private static byte encodeRole(PsiReferenceList
.Role 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;
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
));