Make mutating methods of TreeUtil/ChangeUtil be a member of data structures they...
[fedora-idea.git] / source / com / intellij / psi / impl / java / stubs / impl / PsiImportStatementStubImpl.java
blob869a4c5e8c472bf57093205a11b436cc1684d163
1 /*
2 * @author max
3 */
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);
40 myText = text;
41 myFlags = flags;
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() {
57 return myFlags;
60 public String getImportReferenceText() {
61 return StringRef.toString(myText);
64 @Nullable
65 public PsiJavaCodeReferenceElement getReference() {
66 PsiJavaCodeReferenceElement ref = myReference != null ? myReference.get() : null;
67 if (ref == null) {
68 ref = isStatic() ? getStaticReference() : getRegularReference();
69 myReference = new PatchedSoftReference<PsiJavaCodeReferenceElement>(ref);
71 return ref;
74 public static byte packFlags(boolean isOnDemand, boolean isStatic) {
75 byte flags = 0;
76 if (isOnDemand) {
77 flags |= ON_DEMAND;
79 if (isStatic) {
80 flags |= STATIC;
82 return flags;
86 @Nullable
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();
101 if (onDemand) {
102 holderElement.rawAddChildren((TreeElement)refElement);
103 ((PsiJavaCodeReferenceElementImpl)refElement).setKindWhenDummy(
104 PsiJavaCodeReferenceElementImpl.CLASS_FQ_NAME_KIND);
106 else {
107 refElement = (PsiImportStaticReferenceElement)context.getImportsTextParsing().convertToImportStaticReference(parsedRef);
108 holderElement.rawAddChildren((TreeElement)refElement);
110 return refElement;
113 @Nullable
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(
127 isOnDemand()
128 ? PsiJavaCodeReferenceElementImpl.CLASS_FQ_OR_PACKAGE_NAME_KIND
129 : PsiJavaCodeReferenceElementImpl.CLASS_FQ_NAME_KIND);
131 return refElement;
134 @Override
135 @SuppressWarnings({"HardCodedStringLiteral"})
136 public String toString() {
137 StringBuilder builder = new StringBuilder();
138 builder.append("PsiImportStatementStub[");
140 if (isStatic()) {
141 builder.append("static ");
144 builder.append(getImportReferenceText());
146 if (isOnDemand()) {
147 builder.append(".*");
150 builder.append("]");
151 return builder.toString();