4 package com
.intellij
.psi
.impl
.java
.stubs
.impl
;
6 import com
.intellij
.psi
.PsiImportStatementBase
;
7 import com
.intellij
.psi
.PsiImportStaticReferenceElement
;
8 import com
.intellij
.psi
.PsiJavaCodeReferenceElement
;
9 import com
.intellij
.psi
.PsiManager
;
10 import com
.intellij
.psi
.impl
.java
.stubs
.JavaStubElementTypes
;
11 import com
.intellij
.psi
.impl
.java
.stubs
.PsiImportStatementStub
;
12 import com
.intellij
.psi
.impl
.source
.DummyHolderFactory
;
13 import com
.intellij
.psi
.impl
.source
.PsiJavaCodeReferenceElementImpl
;
14 import com
.intellij
.psi
.impl
.source
.parsing
.JavaParsingContext
;
15 import com
.intellij
.psi
.impl
.source
.parsing
.Parsing
;
16 import com
.intellij
.psi
.impl
.source
.tree
.CompositeElement
;
17 import com
.intellij
.psi
.impl
.source
.tree
.FileElement
;
18 import com
.intellij
.psi
.impl
.source
.tree
.TreeElement
;
19 import com
.intellij
.psi
.stubs
.StubBase
;
20 import com
.intellij
.psi
.stubs
.StubElement
;
21 import com
.intellij
.psi
.util
.PsiUtil
;
22 import com
.intellij
.util
.PatchedSoftReference
;
23 import com
.intellij
.util
.io
.StringRef
;
24 import org
.jetbrains
.annotations
.Nullable
;
26 public class PsiImportStatementStubImpl
extends StubBase
<PsiImportStatementBase
> implements PsiImportStatementStub
{
27 private final byte myFlags
;
28 private final StringRef myText
;
29 private PatchedSoftReference
<PsiJavaCodeReferenceElement
> myReference
= null;
31 private final static int ON_DEMAND
= 0x01;
32 private final static int STATIC
= 0x02;
34 public PsiImportStatementStubImpl(final StubElement parent
, final String text
, final byte flags
) {
35 this(parent
, StringRef
.fromString(text
), flags
);
38 public PsiImportStatementStubImpl(final StubElement parent
, final StringRef text
, final byte flags
) {
39 super(parent
, isStatic(flags
) ? JavaStubElementTypes
.IMPORT_STATIC_STATEMENT
: JavaStubElementTypes
.IMPORT_STATEMENT
);
44 public boolean isStatic() {
45 return isStatic(myFlags
);
48 private static boolean isStatic(final byte flags
) {
49 return (flags
& STATIC
) != 0;
52 public boolean isOnDemand() {
53 return (myFlags
& ON_DEMAND
) != 0;
56 public byte getFlags() {
60 public String
getImportReferenceText() {
61 return StringRef
.toString(myText
);
65 public PsiJavaCodeReferenceElement
getReference() {
66 PsiJavaCodeReferenceElement ref
= myReference
!= null ? myReference
.get() : null;
68 ref
= isStatic() ?
getStaticReference() : getRegularReference();
69 myReference
= new PatchedSoftReference
<PsiJavaCodeReferenceElement
>(ref
);
74 public static byte packFlags(boolean isOnDemand
, boolean isStatic
) {
87 public PsiJavaCodeReferenceElement
getStaticReference() {
88 PsiJavaCodeReferenceElement refElement
;
90 PsiManager manager
= PsiManager
.getInstance(getProject());
91 final FileElement holderElement
= DummyHolderFactory
.createHolder(manager
, getPsi()).getTreeElement();
92 final JavaParsingContext context
= new JavaParsingContext(holderElement
.getCharTable(), PsiUtil
.getLanguageLevel(getPsi()));
93 final String refText
= getImportReferenceText();
94 if (refText
== null) return null;
96 CompositeElement parsedRef
= Parsing
.parseJavaCodeReferenceText(manager
, refText
, context
.getCharTable());
97 refElement
= (PsiJavaCodeReferenceElement
)parsedRef
;
98 if(refElement
== null) return null;
100 final boolean onDemand
= isOnDemand();
102 holderElement
.rawAddChildren((TreeElement
)refElement
);
103 ((PsiJavaCodeReferenceElementImpl
)refElement
).setKindWhenDummy(
104 PsiJavaCodeReferenceElementImpl
.CLASS_FQ_NAME_KIND
);
107 refElement
= (PsiImportStaticReferenceElement
)context
.getImportsTextParsing().convertToImportStaticReference(parsedRef
);
108 holderElement
.rawAddChildren((TreeElement
)refElement
);
114 public PsiJavaCodeReferenceElement
getRegularReference() {
115 PsiJavaCodeReferenceElementImpl refElement
;
116 PsiManager manager
= PsiManager
.getInstance(getProject());
118 final FileElement holderElement
= DummyHolderFactory
.createHolder(manager
, getPsi()).getTreeElement();
119 final String refText
= getImportReferenceText();
120 if (refText
== null) return null;
122 refElement
= (PsiJavaCodeReferenceElementImpl
) Parsing
.parseJavaCodeReferenceText(manager
, refText
, holderElement
.getCharTable());
123 if(refElement
== null) return null;
125 holderElement
.rawAddChildren(refElement
);
126 refElement
.setKindWhenDummy(
128 ? PsiJavaCodeReferenceElementImpl
.CLASS_FQ_OR_PACKAGE_NAME_KIND
129 : PsiJavaCodeReferenceElementImpl
.CLASS_FQ_NAME_KIND
);
135 @SuppressWarnings({"HardCodedStringLiteral"})
136 public String
toString() {
137 StringBuilder builder
= new StringBuilder();
138 builder
.append("PsiImportStatementStub[");
141 builder
.append("static ");
144 builder
.append(getImportReferenceText());
147 builder
.append(".*");
151 return builder
.toString();