Don't pass five parameters to LeafElement's constuctor to initialize single myText...
[fedora-idea.git] / source / com / intellij / psi / impl / source / tree / JavaSharedImplUtil.java
blob041423b42eec8c3a54f58f7652060ac45c7a97f5
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) {
28 int arrayCount = 0;
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) {
33 arrayCount++;
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) {
40 break;
43 PsiType type;
44 if (context != null && typeElement instanceof PsiTypeElementImpl) {
45 type = ((PsiTypeElementImpl)typeElement).getDetachedType(context);
47 else {
48 type = typeElement.getType();
51 for (int i = 0; i < arrayCount; i++) {
52 type = type.createArrayType();
54 return type;
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;
65 int arrayCount = 0;
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;
72 arrayCount++;
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;
81 while (true) {
82 ASTNode next = element.getTreeNext();
83 variableElement.removeChild(element);
84 if (element == lastBracket) break;
85 element = next;
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, "]"));
96 newType = newType1;
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) {
110 return;
112 CompositeElement variableElement = (CompositeElement)variable.getNode();
113 ASTNode eq = variableElement.findChildByRole(ChildRole.INITIALIZER_EQ);
114 if (eq == null) {
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());