2 * Copyright 2000-2009 JetBrains s.r.o.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 package com
.intellij
.psi
.impl
.source
.tree
.java
;
18 import com
.intellij
.lang
.ASTNode
;
19 import com
.intellij
.openapi
.diagnostic
.Logger
;
20 import com
.intellij
.psi
.JavaTokenType
;
21 import com
.intellij
.psi
.PsiKeyword
;
22 import com
.intellij
.psi
.impl
.source
.Constants
;
23 import com
.intellij
.psi
.impl
.source
.tree
.*;
24 import com
.intellij
.psi
.tree
.ChildRoleBase
;
25 import com
.intellij
.psi
.tree
.IElementType
;
26 import com
.intellij
.util
.CharTable
;
27 import org
.jetbrains
.annotations
.NotNull
;
32 public class TypeParameterExtendsBoundsListElement
extends CompositeElement
implements Constants
{
33 private static final Logger LOG
= Logger
.getInstance("#com.intellij.psi.impl.source.tree.java.TypeParameterExtendsBoundsListElement");
35 public TypeParameterExtendsBoundsListElement() {
36 super(JavaElementType
.EXTENDS_BOUND_LIST
);
39 public TreeElement
addInternal(TreeElement first
, ASTNode last
, ASTNode anchor
, Boolean before
) {
40 if (first
== last
&& first
.getElementType() == JAVA_CODE_REFERENCE
){
41 if (getLastChildNode() != null && getLastChildNode().getElementType() == ERROR_ELEMENT
){
42 super.deleteChildInternal(getLastChildNode());
46 final TreeElement firstAdded
= super.addInternal(first
, last
, anchor
, before
);
47 final CharTable treeCharTab
= SharedImplUtil
.findCharTableByTree(this);
48 if (first
== last
&& first
.getElementType() == JAVA_CODE_REFERENCE
){
49 ASTNode element
= first
;
50 for(ASTNode child
= element
.getTreeNext(); child
!= null; child
= child
.getTreeNext()){
51 if (child
.getElementType() == AND
) break;
52 if (child
.getElementType() == JAVA_CODE_REFERENCE
){
53 TreeElement comma
= Factory
.createSingleLeafElement(AND
, "&", 0, 1, treeCharTab
, getManager());
54 super.addInternal(comma
, comma
, element
, Boolean
.FALSE
);
58 for(ASTNode child
= element
.getTreePrev(); child
!= null; child
= child
.getTreePrev()){
59 if (child
.getElementType() == AND
) break;
60 if (child
.getElementType() == JAVA_CODE_REFERENCE
){
61 TreeElement comma
= Factory
.createSingleLeafElement(AND
, "&", 0, 1, treeCharTab
, getManager());
62 super.addInternal(comma
, comma
, child
, Boolean
.FALSE
);
68 final IElementType keywordType
= JavaTokenType
.EXTENDS_KEYWORD
;
69 final String keywordText
= PsiKeyword
.EXTENDS
;
70 if (findChildByType(keywordType
) == null && findChildByType(JAVA_CODE_REFERENCE
) != null){
71 LeafElement keyword
= Factory
.createSingleLeafElement(keywordType
, keywordText
, treeCharTab
, getManager());
72 super.addInternal(keyword
, keyword
, getFirstChildNode(), Boolean
.TRUE
);
77 public void deleteChildInternal(@NotNull ASTNode child
) {
78 if (child
.getElementType() == JAVA_CODE_REFERENCE
){
79 ASTNode next
= TreeUtil
.skipElements(child
.getTreeNext(), StdTokenSets
.WHITE_SPACE_OR_COMMENT_BIT_SET
);
80 if (next
!= null && next
.getElementType() == AND
){
81 deleteChildInternal(next
);
84 ASTNode prev
= TreeUtil
.skipElementsBack(child
.getTreePrev(), StdTokenSets
.WHITE_SPACE_OR_COMMENT_BIT_SET
);
86 if (prev
.getElementType() == AND
|| prev
.getElementType() == EXTENDS_KEYWORD
){
87 deleteChildInternal(prev
);
92 super.deleteChildInternal(child
);
95 public int getChildRole(final ASTNode child
) {
96 LOG
.assertTrue(child
.getTreeParent() == this);
98 final IElementType elType
= child
.getElementType();
100 return ChildRole
.AMPERSAND_IN_BOUNDS_LIST
;
102 else if (elType
== ElementType
.JAVA_CODE_REFERENCE
) {
103 return ChildRole
.BASE_CLASS_REFERENCE
;
105 else if (elType
== JavaTokenType
.EXTENDS_KEYWORD
) {
106 return ChildRole
.EXTENDS_KEYWORD
;
109 return ChildRoleBase
.NONE
;