1 package com
.intellij
.psi
.impl
.source
.tree
;
3 import com
.intellij
.lang
.ASTFactory
;
4 import com
.intellij
.lang
.ASTNode
;
5 import com
.intellij
.openapi
.diagnostic
.Logger
;
6 import com
.intellij
.psi
.*;
7 import com
.intellij
.psi
.impl
.GeneratedMarkerVisitor
;
8 import com
.intellij
.psi
.impl
.source
.PsiTypeElementImpl
;
9 import com
.intellij
.psi
.impl
.source
.SourceTreeToPsiMap
;
10 import com
.intellij
.psi
.tree
.IElementType
;
11 import com
.intellij
.util
.CharTable
;
12 import com
.intellij
.util
.IncorrectOperationException
;
14 public class JavaSharedImplUtil
{
15 private static final Logger LOG
= Logger
.getInstance("#com.intellij.psi.impl.source.tree.JavaSharedImplUtil");
17 private JavaSharedImplUtil() {
20 public static PsiType
getType(PsiVariable variable
) {
21 PsiTypeElement typeElement
= variable
.getTypeElement();
22 PsiIdentifier nameIdentifier
= variable
.getNameIdentifier();
23 return getType(typeElement
, nameIdentifier
, variable
);
26 //context == null means no detached type should be created
27 public static PsiType
getType(PsiTypeElement typeElement
, PsiElement anchor
, PsiElement context
) {
29 ASTNode name
= SourceTreeToPsiMap
.psiElementToTree(anchor
);
30 for (ASTNode child
= name
.getTreeNext(); child
!= null; child
= child
.getTreeNext()) {
31 IElementType i
= child
.getElementType();
32 if (i
== JavaTokenType
.LBRACKET
) {
35 else if (i
!= JavaTokenType
.RBRACKET
&& i
!= TokenType
.WHITE_SPACE
&&
36 i
!= JavaTokenType
.C_STYLE_COMMENT
&&
37 i
!= JavaDocElementType
.DOC_COMMENT
&&
38 i
!= JavaTokenType
.DOC_COMMENT
&&
39 i
!= JavaTokenType
.END_OF_LINE_COMMENT
) {
44 if (context
!= null && typeElement
instanceof PsiTypeElementImpl
) {
45 type
= ((PsiTypeElementImpl
)typeElement
).getDetachedType(context
);
48 type
= typeElement
.getType();
51 for (int i
= 0; i
< arrayCount
; i
++) {
52 type
= type
.createArrayType();
57 public static void normalizeBrackets(PsiVariable variable
) {
58 CompositeElement variableElement
= (CompositeElement
)SourceTreeToPsiMap
.psiElementToTree(variable
);
59 ASTNode type
= variableElement
.findChildByRole(ChildRole
.TYPE
);
60 LOG
.assertTrue(type
.getTreeParent() == variableElement
);
61 ASTNode name
= variableElement
.findChildByRole(ChildRole
.NAME
);
63 ASTNode firstBracket
= null;
64 ASTNode lastBracket
= null;
66 ASTNode element
= name
;
67 while (element
!= null) {
68 element
= TreeUtil
.skipElements(element
.getTreeNext(), StdTokenSets
.WHITE_SPACE_OR_COMMENT_BIT_SET
);
69 if (element
== null || element
.getElementType() != JavaTokenType
.LBRACKET
) break;
70 if (firstBracket
== null) firstBracket
= element
;
71 lastBracket
= element
;
74 element
= TreeUtil
.skipElements(element
.getTreeNext(), StdTokenSets
.WHITE_SPACE_OR_COMMENT_BIT_SET
);
75 if (element
== null || element
.getElementType() != JavaTokenType
.RBRACKET
) break;
76 lastBracket
= element
;
79 if (firstBracket
!= null) {
80 element
= firstBracket
;
82 ASTNode next
= element
.getTreeNext();
83 variableElement
.removeChild(element
);
84 if (element
== lastBracket
) break;
88 CompositeElement newType
= (CompositeElement
)type
.clone();
89 final CharTable treeCharTable
= SharedImplUtil
.findCharTableByTree(type
);
90 for (int i
= 0; i
< arrayCount
; i
++) {
91 CompositeElement newType1
= ASTFactory
.composite(JavaElementType
.TYPE
);
92 newType1
.rawAddChildren(newType
);
94 newType1
.rawAddChildren(ASTFactory
.leaf(JavaTokenType
.LBRACKET
, "["));
95 newType1
.rawAddChildren(ASTFactory
.leaf(JavaTokenType
.RBRACKET
, "]"));
97 newType
.acceptTree(new GeneratedMarkerVisitor());
99 newType
.putUserData(CharTable
.CHAR_TABLE_KEY
, SharedImplUtil
.findCharTableByTree(type
));
100 variableElement
.replaceChild(type
, newType
);
104 public static void setInitializer(PsiVariable variable
, final PsiExpression initializer
) throws IncorrectOperationException
{
105 PsiExpression oldInitializer
= variable
.getInitializer();
106 if (oldInitializer
!= null) {
107 oldInitializer
.delete();
109 if (initializer
== null) {
112 CompositeElement variableElement
= (CompositeElement
)variable
.getNode();
113 ASTNode eq
= variableElement
.findChildByRole(ChildRole
.INITIALIZER_EQ
);
115 final CharTable charTable
= SharedImplUtil
.findCharTableByTree(variableElement
);
116 eq
= Factory
.createSingleLeafElement(JavaTokenType
.EQ
, "=", 0, 1, charTable
, variable
.getManager());
117 variableElement
.addInternal((TreeElement
)eq
, eq
, variable
.getNameIdentifier().getNode(), Boolean
.FALSE
);
118 eq
= variableElement
.findChildByRole(ChildRole
.INITIALIZER_EQ
);
120 variable
.addAfter(initializer
, eq
.getPsi());