diff options
Diffstat (limited to 'java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java')
10 files changed, 191 insertions, 349 deletions
diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/AnnotationParamListElement.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/AnnotationParamListElement.java index 4953bd2d3804..e1ffc8b91766 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/AnnotationParamListElement.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/AnnotationParamListElement.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,8 +19,9 @@ import com.intellij.lang.ASTNode; import com.intellij.openapi.diagnostic.Logger; import com.intellij.psi.*; import com.intellij.psi.impl.source.tree.*; -import com.intellij.psi.tree.IElementType; import com.intellij.psi.tree.ChildRoleBase; +import com.intellij.psi.tree.IElementType; +import com.intellij.psi.tree.TokenSet; import com.intellij.util.CharTable; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; @@ -28,47 +29,29 @@ import org.jetbrains.annotations.NotNull; /** * @author ven */ -public class AnnotationParamListElement extends PsiCommaSeparatedListImpl implements PsiAnnotationParameterList { +public class AnnotationParamListElement extends CompositeElement { private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.source.tree.java.AnnotationParamListElement"); - private volatile PsiNameValuePair[] myCachedMembers = null; + private static final TokenSet NAME_VALUE_PAIR_BIT_SET = TokenSet.create(JavaElementType.NAME_VALUE_PAIR); public AnnotationParamListElement() { - super(ANNOTATION_PARAMETER_LIST, NAME_VALUE_PAIR_BIT_SET); - } - - @Override - public void clearCaches() { - super.clearCaches(); - myCachedMembers = null; - } - - @Override - @NotNull - public PsiNameValuePair[] getAttributes() { - PsiNameValuePair[] cachedMembers = myCachedMembers; - if (cachedMembers == null) { - myCachedMembers = cachedMembers = getChildrenAsPsiElements(NAME_VALUE_PAIR_BIT_SET, PsiNameValuePair.ARRAY_FACTORY); - } - - return cachedMembers; + super(JavaElementType.ANNOTATION_PARAMETER_LIST); } @Override public int getChildRole(ASTNode child) { IElementType i = child.getElementType(); - if (i == COMMA) { + if (i == JavaTokenType.COMMA) { return ChildRole.COMMA; } - else if (i == LPARENTH) { + else if (i == JavaTokenType.LPARENTH) { return ChildRole.LPARENTH; } - else if (i == RPARENTH) { + else if (i == JavaTokenType.RPARENTH) { return ChildRole.RPARENTH; } - else if (ANNOTATION_MEMBER_VALUE_BIT_SET.contains(child.getElementType()) - || (i == NAME_VALUE_PAIR && child.getFirstChildNode() != null - && child.getFirstChildNode().getElementType() == ANNOTATION_ARRAY_INITIALIZER)) - { + else if (ElementType.ANNOTATION_MEMBER_VALUE_BIT_SET.contains(i) || + (i == JavaElementType.NAME_VALUE_PAIR && child.getFirstChildNode() != null && + child.getFirstChildNode().getElementType() == JavaElementType.ANNOTATION_ARRAY_INITIALIZER)) { return ChildRole.ANNOTATION_VALUE; } else { @@ -83,65 +66,69 @@ public class AnnotationParamListElement extends PsiCommaSeparatedListImpl implem LOG.assertTrue(false); return null; case ChildRole.LPARENTH: - return findChildByType(LPARENTH); + return findChildByType(JavaTokenType.LPARENTH); case ChildRole.RPARENTH: - return findChildByType(RPARENTH); - } - } - - public String toString() { - return "PsiAnnotationParameterList"; - } - - @Override - public void accept(@NotNull PsiElementVisitor visitor) { - if (visitor instanceof JavaElementVisitor) { - ((JavaElementVisitor)visitor).visitAnnotationParameterList(this); - } - else { - visitor.visitElement(this); + return findChildByType(JavaTokenType.RPARENTH); } } @Override public TreeElement addInternal(TreeElement first, ASTNode last, ASTNode anchor, Boolean before) { - if (first.getElementType() == NAME_VALUE_PAIR && last.getElementType() == NAME_VALUE_PAIR) { - final CharTable treeCharTab = SharedImplUtil.findCharTableByTree(this); - ASTNode lparenth = findChildByRole(ChildRole.LPARENTH); + if (first.getElementType() == JavaElementType.NAME_VALUE_PAIR && last.getElementType() == JavaElementType.NAME_VALUE_PAIR) { + ASTNode lparenth = findChildByType(JavaTokenType.LPARENTH); if (lparenth == null) { - LeafElement created = Factory.createSingleLeafElement(LPARENTH, "(", 0, 1, treeCharTab, getManager()); + CharTable treeCharTab = SharedImplUtil.findCharTableByTree(this); + LeafElement created = Factory.createSingleLeafElement(JavaTokenType.LPARENTH, "(", 0, 1, treeCharTab, getManager()); super.addInternal(created, created, getFirstChildNode(), true); } - ASTNode rparenth = findChildByRole(ChildRole.RPARENTH); + + ASTNode rparenth = findChildByType(JavaTokenType.RPARENTH); if (rparenth == null) { - LeafElement created = Factory.createSingleLeafElement(RPARENTH, ")", 0, 1, treeCharTab, getManager()); + CharTable treeCharTab = SharedImplUtil.findCharTableByTree(this); + LeafElement created = Factory.createSingleLeafElement(JavaTokenType.RPARENTH, ")", 0, 1, treeCharTab, getManager()); super.addInternal(created, created, getLastChildNode(), false); } - final ASTNode[] nodes = getChildren(NAME_VALUE_PAIR_BIT_SET); + ASTNode[] nodes = getChildren(NAME_VALUE_PAIR_BIT_SET); if (nodes.length == 1) { - final ASTNode node = nodes[0]; + ASTNode node = nodes[0]; if (node instanceof PsiNameValuePair) { - final PsiNameValuePair pair = (PsiNameValuePair)node; + PsiNameValuePair pair = (PsiNameValuePair)node; if (pair.getName() == null) { - final String text = pair.getValue().getText(); - try { - final PsiAnnotation annotation = JavaPsiFacade.getInstance(getProject()).getElementFactory().createAnnotationFromText("@AAA(value = " + text + ")", null); - replaceChild(node, annotation.getParameterList().getAttributes()[0].getNode()); - } - catch (IncorrectOperationException e) { - LOG.error(e); + PsiAnnotationMemberValue value = pair.getValue(); + if (value != null) { + try { + PsiElementFactory factory = JavaPsiFacade.getInstance(getPsi().getProject()).getElementFactory(); + PsiAnnotation annotation = factory.createAnnotationFromText("@AAA(value = " + value.getText() + ")", null); + replaceChild(node, annotation.getParameterList().getAttributes()[0].getNode()); + } + catch (IncorrectOperationException e) { + LOG.error(e); + } } } } } if (anchor == null && before != null) { - anchor = findChildByRole(before.booleanValue() ? ChildRole.RPARENTH : ChildRole.LPARENTH); + anchor = findChildByType(before ? JavaTokenType.RPARENTH : JavaTokenType.LPARENTH); } + + TreeElement firstAdded = super.addInternal(first, last, anchor, before); + JavaSourceUtil.addSeparatingComma(this, first, NAME_VALUE_PAIR_BIT_SET); + return firstAdded; } return super.addInternal(first, last, anchor, before); } + + @Override + public void deleteChildInternal(@NotNull ASTNode child) { + if (child.getElementType() == JavaElementType.NAME_VALUE_PAIR) { + JavaSourceUtil.deleteSeparatingComma(this, child); + } + + super.deleteChildInternal(child); + } } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/ClassElement.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/ClassElement.java index 712b32ca6d5b..14d72a92da1c 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/ClassElement.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/ClassElement.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -34,6 +34,15 @@ import org.jetbrains.annotations.Nullable; public class ClassElement extends CompositeElement implements Constants { private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.source.tree.java.ClassElement"); + private static final TokenSet MODIFIERS_TO_REMOVE_IN_INTERFACE_BIT_SET = TokenSet.create( + PUBLIC_KEYWORD, ABSTRACT_KEYWORD, STATIC_KEYWORD, FINAL_KEYWORD, NATIVE_KEYWORD); + private static final TokenSet MODIFIERS_TO_REMOVE_IN_INTERFACE_BIT_SET_18_METHOD = TokenSet.create( + PUBLIC_KEYWORD, ABSTRACT_KEYWORD, FINAL_KEYWORD, NATIVE_KEYWORD); + private static final TokenSet MODIFIERS_TO_REMOVE_IN_ENUM_BIT_SET = TokenSet.create( + PUBLIC_KEYWORD, FINAL_KEYWORD); + private static final TokenSet ENUM_CONSTANT_LIST_ELEMENTS_BIT_SET = TokenSet.create( + ENUM_CONSTANT, COMMA, SEMICOLON); + public ClassElement(IElementType type) { super(type); } @@ -181,19 +190,8 @@ public class ClassElement extends CompositeElement implements Constants { @Override public void deleteChildInternal(@NotNull ASTNode child) { - if (isEnum()) { - if (child.getElementType() == ENUM_CONSTANT) { - ASTNode next = PsiImplUtil.skipWhitespaceAndComments(child.getTreeNext()); - if (next != null && next.getElementType() == COMMA) { - deleteChildInternal(next); - } - else { - ASTNode prev = PsiImplUtil.skipWhitespaceAndCommentsBack(child.getTreePrev()); - if (prev != null && prev.getElementType() == COMMA) { - deleteChildInternal(prev); - } - } - } + if (isEnum() && child.getElementType() == ENUM_CONSTANT) { + JavaSourceUtil.deleteSeparatingComma(this, child); } if (child.getElementType() == FIELD) { @@ -233,27 +231,6 @@ public class ClassElement extends CompositeElement implements Constants { return findChildByRole(ChildRole.AT) != null; } - private static final TokenSet MODIFIERS_TO_REMOVE_IN_INTERFACE_BIT_SET = TokenSet.create( - PUBLIC_KEYWORD, ABSTRACT_KEYWORD, - STATIC_KEYWORD, FINAL_KEYWORD, - NATIVE_KEYWORD - ); - - private static final TokenSet MODIFIERS_TO_REMOVE_IN_INTERFACE_BIT_SET_18_METHOD = TokenSet.create( - PUBLIC_KEYWORD, ABSTRACT_KEYWORD, - FINAL_KEYWORD, - NATIVE_KEYWORD - ); - - private static final TokenSet MODIFIERS_TO_REMOVE_IN_ENUM_BIT_SET = TokenSet.create( - PUBLIC_KEYWORD, FINAL_KEYWORD - ); - - private static final TokenSet ENUM_CONSTANT_LIST_ELEMENTS_BIT_SET = TokenSet.create( - ENUM_CONSTANT, COMMA, SEMICOLON - ); - - @Override public ASTNode findChildByRole(int role) { assert ChildRole.isUnique(role); @@ -266,10 +243,7 @@ public class ClassElement extends CompositeElement implements Constants { return PsiImplUtil.findDocComment(this); case ChildRole.ENUM_CONSTANT_LIST_DELIMITER: - if (!isEnum()) { - return null; - } - return findEnumConstantListDelimiter(); + return isEnum() ? findEnumConstantListDelimiter() : null; case ChildRole.MODIFIER_LIST: return findChildByType(MODIFIER_LIST); diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/ParameterListElement.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/ParameterListElement.java index a5e32e9ce95b..20d504d8dbae 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/ParameterListElement.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/ParameterListElement.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,18 +18,21 @@ package com.intellij.psi.impl.source.tree.java; import com.intellij.lang.ASTNode; import com.intellij.openapi.diagnostic.Logger; import com.intellij.psi.codeStyle.CodeStyleManager; -import com.intellij.psi.impl.PsiImplUtil; import com.intellij.psi.impl.source.Constants; -import com.intellij.psi.impl.source.tree.*; +import com.intellij.psi.impl.source.tree.ChildRole; +import com.intellij.psi.impl.source.tree.CompositeElement; +import com.intellij.psi.impl.source.tree.JavaSourceUtil; +import com.intellij.psi.impl.source.tree.TreeElement; import com.intellij.psi.tree.ChildRoleBase; import com.intellij.psi.tree.IElementType; -import com.intellij.util.CharTable; +import com.intellij.psi.tree.TokenSet; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public class ParameterListElement extends CompositeElement implements Constants { private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.source.tree.java.ParameterListElement"); + private static final TokenSet PARAMETER_SET = TokenSet.create(PARAMETER); public ParameterListElement() { super(PARAMETER_LIST); @@ -49,23 +52,7 @@ public class ParameterListElement extends CompositeElement implements Constants } TreeElement firstAdded = super.addInternal(first, last, anchor, before); if (first == last && first.getElementType() == PARAMETER) { - final CharTable treeCharTab = SharedImplUtil.findCharTableByTree(this); - for (ASTNode child = ((ASTNode)first).getTreeNext(); child != null; child = child.getTreeNext()) { - if (child.getElementType() == COMMA) break; - if (child.getElementType() == PARAMETER) { - TreeElement comma = Factory.createSingleLeafElement(COMMA, ",", 0, 1, treeCharTab, getManager()); - super.addInternal(comma, comma, first, Boolean.FALSE); - break; - } - } - for (ASTNode child = ((ASTNode)first).getTreePrev(); child != null; child = child.getTreePrev()) { - if (child.getElementType() == COMMA) break; - if (child.getElementType() == PARAMETER) { - TreeElement comma = Factory.createSingleLeafElement(COMMA, ",", 0, 1, treeCharTab, getManager()); - super.addInternal(comma, comma, child, Boolean.FALSE); - break; - } - } + JavaSourceUtil.addSeparatingComma(this, first, PARAMETER_SET); } //todo[max] hack? @@ -83,16 +70,7 @@ public class ParameterListElement extends CompositeElement implements Constants final TreeElement oldLastNodeInsideParens = getLastNodeInsideParens(); final TreeElement oldFirstNodeInsideParens = getFirstNodeInsideParens(); if (child.getElementType() == PARAMETER) { - ASTNode next = PsiImplUtil.skipWhitespaceAndComments(child.getTreeNext()); - if (next != null && next.getElementType() == COMMA) { - deleteChildInternal(next); - } - else { - ASTNode prev = PsiImplUtil.skipWhitespaceAndCommentsBack(child.getTreePrev()); - if (prev != null && prev.getElementType() == COMMA) { - deleteChildInternal(prev); - } - } + JavaSourceUtil.deleteSeparatingComma(this, child); } super.deleteChildInternal(child); @@ -135,20 +113,12 @@ public class ParameterListElement extends CompositeElement implements Constants return null; case ChildRole.LPARENTH: - if (getFirstChildNode().getElementType() == LPARENTH) { - return getFirstChildNode(); - } - else { - return null; - } + TreeElement firstNode = getFirstChildNode(); + return firstNode.getElementType() == LPARENTH ? firstNode : null; case ChildRole.RPARENTH: - if (getLastChildNode().getElementType() == RPARENTH) { - return getLastChildNode(); - } - else { - return null; - } + TreeElement lastNode = getLastChildNode(); + return lastNode.getElementType() == RPARENTH ? lastNode : null; } } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiAnnotationParamListImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiAnnotationParamListImpl.java index 5a3ccb23e420..0923d7cdd675 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiAnnotationParamListImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiAnnotationParamListImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,20 +16,20 @@ package com.intellij.psi.impl.source.tree.java; import com.intellij.lang.ASTNode; +import com.intellij.psi.JavaElementVisitor; import com.intellij.psi.PsiAnnotationParameterList; +import com.intellij.psi.PsiElementVisitor; import com.intellij.psi.PsiNameValuePair; import com.intellij.psi.impl.java.stubs.JavaStubElementTypes; import com.intellij.psi.impl.java.stubs.PsiAnnotationParameterListStub; import com.intellij.psi.impl.source.JavaStubPsiElement; -import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; /** * @author Dmitry Avdeev - * Date: 7/27/12 + * @since 27.07.2012 */ -public class PsiAnnotationParamListImpl extends JavaStubPsiElement<PsiAnnotationParameterListStub> implements - PsiAnnotationParameterList { +public class PsiAnnotationParamListImpl extends JavaStubPsiElement<PsiAnnotationParameterListStub> implements PsiAnnotationParameterList { public PsiAnnotationParamListImpl(@NotNull PsiAnnotationParameterListStub stub) { super(stub, JavaStubElementTypes.ANNOTATION_PARAMETER_LIST); } @@ -44,8 +44,18 @@ public class PsiAnnotationParamListImpl extends JavaStubPsiElement<PsiAnnotation return getStubOrPsiChildren(JavaStubElementTypes.NAME_VALUE_PAIR, PsiNameValuePair.ARRAY_FACTORY); } - @NonNls - public String toString(){ - return "PsiAnnotationParameterList:" + getText(); + @Override + public void accept(@NotNull PsiElementVisitor visitor) { + if (visitor instanceof JavaElementVisitor) { + ((JavaElementVisitor)visitor).visitAnnotationParameterList(this); + } + else { + visitor.visitElement(this); + } + } + + @Override + public String toString() { + return "PsiAnnotationParameterList"; } } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiArrayInitializerMemberValueImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiArrayInitializerMemberValueImpl.java index dd64ed7e41fb..b03766f54d55 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiArrayInitializerMemberValueImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiArrayInitializerMemberValueImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,68 +17,84 @@ package com.intellij.psi.impl.source.tree.java; import com.intellij.lang.ASTNode; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.psi.JavaElementVisitor; -import com.intellij.psi.PsiAnnotationMemberValue; -import com.intellij.psi.PsiArrayInitializerMemberValue; -import com.intellij.psi.PsiElementVisitor; -import com.intellij.psi.impl.source.tree.ChildRole; -import com.intellij.psi.tree.IElementType; +import com.intellij.psi.*; +import com.intellij.psi.impl.source.tree.*; import com.intellij.psi.tree.ChildRoleBase; +import com.intellij.psi.tree.IElementType; +import com.intellij.psi.tree.TokenSet; import org.jetbrains.annotations.NotNull; /** * @author ven */ -public class PsiArrayInitializerMemberValueImpl extends PsiCommaSeparatedListImpl implements PsiArrayInitializerMemberValue { - private static final Logger LOG = Logger.getInstance("com.intellij.psi.impl.source.tree.java.PsiArrayInitializerMemberValueImpl"); +public class PsiArrayInitializerMemberValueImpl extends CompositePsiElement implements PsiArrayInitializerMemberValue { + private static final Logger LOG = Logger.getInstance(PsiArrayInitializerMemberValueImpl.class); + private static final TokenSet MEMBER_SET = ElementType.ANNOTATION_MEMBER_VALUE_BIT_SET; + public PsiArrayInitializerMemberValueImpl() { - super(ANNOTATION_ARRAY_INITIALIZER, ANNOTATION_MEMBER_VALUE_BIT_SET); + super(JavaElementType.ANNOTATION_ARRAY_INITIALIZER); } @Override @NotNull public PsiAnnotationMemberValue[] getInitializers() { - return getChildrenAsPsiElements(ANNOTATION_MEMBER_VALUE_BIT_SET, PsiAnnotationMemberValue.ARRAY_FACTORY); + return getChildrenAsPsiElements(MEMBER_SET, PsiAnnotationMemberValue.ARRAY_FACTORY); } @Override public ASTNode findChildByRole(int role) { LOG.assertTrue(ChildRole.isUnique(role)); - switch(role){ + + switch (role) { default: return null; case ChildRole.LBRACE: - return findChildByType(LBRACE); + return findChildByType(JavaTokenType.LBRACE); case ChildRole.RBRACE: - return findChildByType(RBRACE); + return findChildByType(JavaTokenType.RBRACE); } } @Override public int getChildRole(ASTNode child) { LOG.assertTrue(child.getTreeParent() == this); + IElementType i = child.getElementType(); - if (i == COMMA) { + if (i == JavaTokenType.COMMA) { return ChildRole.COMMA; } - else if (i == LBRACE) { + else if (i == JavaTokenType.LBRACE) { return ChildRole.LBRACE; } - else if (i == RBRACE) { + else if (i == JavaTokenType.RBRACE) { return ChildRole.RBRACE; } - else { - if (ANNOTATION_MEMBER_VALUE_BIT_SET.contains(child.getElementType())) { - return ChildRole.ANNOTATION_VALUE; - } - return ChildRoleBase.NONE; + else if (MEMBER_SET.contains(child.getElementType())) { + return ChildRole.ANNOTATION_VALUE; } + return ChildRoleBase.NONE; } - public String toString(){ - return "PsiArrayInitializerMemberValue:" + getText(); + @Override + public TreeElement addInternal(TreeElement first, ASTNode last, ASTNode anchor, Boolean before) { + if (MEMBER_SET.contains(first.getElementType()) && MEMBER_SET.contains(last.getElementType())) { + TreeElement firstAdded = super.addInternal(first, last, anchor, before); + JavaSourceUtil.addSeparatingComma(this, first, MEMBER_SET); + return firstAdded; + } + + return super.addInternal(first, last, anchor, before); + } + + @Override + public void deleteChildInternal(@NotNull ASTNode child) { + if (MEMBER_SET.contains(child.getElementType())) { + JavaSourceUtil.deleteSeparatingComma(this, child); + } + + super.deleteChildInternal(child); } @Override @@ -90,4 +106,9 @@ public class PsiArrayInitializerMemberValueImpl extends PsiCommaSeparatedListImp visitor.visitElement(this); } } + + @Override + public String toString() { + return "PsiArrayInitializerMemberValue:" + getText(); + } } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiCommaSeparatedListImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiCommaSeparatedListImpl.java deleted file mode 100644 index 475542fdc868..000000000000 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiCommaSeparatedListImpl.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright 2000-2009 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.intellij.psi.impl.source.tree.java; - -import com.intellij.lang.ASTNode; -import com.intellij.psi.impl.PsiImplUtil; -import com.intellij.psi.impl.source.Constants; -import com.intellij.psi.impl.source.tree.*; -import com.intellij.psi.tree.IElementType; -import com.intellij.psi.tree.TokenSet; -import com.intellij.util.CharTable; -import org.jetbrains.annotations.NotNull; - -/** - * Adds or removes comma - * - * @author ven - */ -public abstract class PsiCommaSeparatedListImpl extends CompositePsiElement implements Constants { - private final TokenSet myTypesOfElements; - - protected PsiCommaSeparatedListImpl(IElementType type, final TokenSet typeOfElements) { - super(type); - myTypesOfElements = typeOfElements; - } - - @Override - public TreeElement addInternal(TreeElement first, ASTNode last, ASTNode anchor, Boolean before) { - if (myTypesOfElements.contains(first.getElementType()) && myTypesOfElements.contains(last.getElementType())) { - final CharTable treeCharTab = SharedImplUtil.findCharTableByTree(this); - final TreeElement firstAdded = super.addInternal(first, last, anchor, before); - for (ASTNode child = ((ASTNode)first).getTreeNext(); child != null; child = child.getTreeNext()) { - if (child.getElementType() == COMMA) break; - if (myTypesOfElements.contains(child.getElementType())) { - TreeElement comma = Factory.createSingleLeafElement(COMMA, ",", 0, 1, treeCharTab, getManager()); - super.addInternal(comma, comma, first, Boolean.FALSE); - break; - } - } - - for (ASTNode child = ((ASTNode)first).getTreePrev(); child != null; child = child.getTreePrev()) { - if (child.getElementType() == COMMA) break; - if (myTypesOfElements.contains(child.getElementType())) { - TreeElement comma = Factory.createSingleLeafElement(COMMA, ",", 0, 1, treeCharTab, getManager()); - super.addInternal(comma, comma, child, Boolean.FALSE); - break; - } - } - return firstAdded; - } - - return super.addInternal(first, last, anchor, before); - } - - @Override - public void deleteChildInternal(@NotNull ASTNode child) { - if (myTypesOfElements.contains(child.getElementType())) { - ASTNode next = PsiImplUtil.skipWhitespaceAndComments(child.getTreeNext()); - if (next != null && next.getElementType() == COMMA) { - deleteChildInternal(next); - } - else { - ASTNode prev = PsiImplUtil.skipWhitespaceAndCommentsBack(child.getTreePrev()); - if (prev != null && prev.getElementType() == COMMA) { - deleteChildInternal(prev); - } - } - } - super.deleteChildInternal(child); - } -} diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiExpressionListImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiExpressionListImpl.java index ae45273b57f1..98df0baa4134 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiExpressionListImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiExpressionListImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,6 @@ package com.intellij.psi.impl.source.tree.java; import com.intellij.lang.ASTNode; import com.intellij.openapi.diagnostic.Logger; import com.intellij.psi.*; -import com.intellij.psi.impl.PsiImplUtil; import com.intellij.psi.impl.source.tree.*; import com.intellij.psi.tree.ChildRoleBase; import com.intellij.psi.tree.IElementType; @@ -123,7 +122,8 @@ public class PsiExpressionListImpl extends CompositePsiElement implements PsiExp } TreeElement firstAdded = super.addInternal(first, last, anchor, before); if (ElementType.EXPRESSION_BIT_SET.contains(first.getElementType())) { - ASTNode element = first; + JavaSourceUtil.addSeparatingComma(this, first, ElementType.EXPRESSION_BIT_SET); + /*ASTNode element = first; for (ASTNode child = element.getTreeNext(); child != null; child = child.getTreeNext()) { if (child.getElementType() == JavaTokenType.COMMA) break; if (ElementType.EXPRESSION_BIT_SET.contains(child.getElementType())) { @@ -140,7 +140,7 @@ public class PsiExpressionListImpl extends CompositePsiElement implements PsiExp super.addInternal(comma, comma, child, Boolean.FALSE); break; } - } + }*/ } return firstAdded; } @@ -148,17 +148,9 @@ public class PsiExpressionListImpl extends CompositePsiElement implements PsiExp @Override public void deleteChildInternal(@NotNull ASTNode child) { if (ElementType.EXPRESSION_BIT_SET.contains(child.getElementType())) { - ASTNode next = PsiImplUtil.skipWhitespaceAndComments(child.getTreeNext()); - if (next != null && next.getElementType() == JavaTokenType.COMMA) { - deleteChildInternal(next); - } - else { - ASTNode prev = PsiImplUtil.skipWhitespaceAndCommentsBack(child.getTreePrev()); - if (prev != null && prev.getElementType() == JavaTokenType.COMMA) { - deleteChildInternal(prev); - } - } + JavaSourceUtil.deleteSeparatingComma(this, child); } + super.deleteChildInternal(child); } @@ -172,6 +164,7 @@ public class PsiExpressionListImpl extends CompositePsiElement implements PsiExp } } + @Override public String toString() { return "PsiExpressionList"; } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiMethodReferenceExpressionImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiMethodReferenceExpressionImpl.java index 95171ba30bc9..32ed1aac5c91 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiMethodReferenceExpressionImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiMethodReferenceExpressionImpl.java @@ -25,6 +25,7 @@ import com.intellij.psi.impl.PsiManagerEx; import com.intellij.psi.impl.source.resolve.ResolveCache; import com.intellij.psi.impl.source.resolve.graphInference.FunctionalInterfaceParameterizationUtil; import com.intellij.psi.impl.source.resolve.graphInference.InferenceSession; +import com.intellij.psi.impl.source.resolve.graphInference.PsiPolyExpressionUtil; import com.intellij.psi.impl.source.tree.ChildRole; import com.intellij.psi.impl.source.tree.FileElement; import com.intellij.psi.impl.source.tree.JavaElementType; @@ -39,13 +40,12 @@ import com.intellij.psi.scope.util.PsiScopesUtil; import com.intellij.psi.tree.IElementType; import com.intellij.psi.util.*; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; +import java.util.*; public class PsiMethodReferenceExpressionImpl extends PsiReferenceExpressionBase implements PsiMethodReferenceExpression { private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.source.tree.java.PsiMethodReferenceExpressionImpl"); @@ -153,7 +153,8 @@ public class PsiMethodReferenceExpressionImpl extends PsiReferenceExpressionBase if (arrayClass == containingClass) { final PsiType componentType = qualifierResolveResult.getSubstitutor().substitute(arrayClass.getTypeParameters()[0]); LOG.assertTrue(componentType != null, qualifierResolveResult.getSubstitutor()); - methods = new PsiMethod[] {factory.createMethodFromText("public " + componentType.createArrayType().getCanonicalText() + " __array__(int i) {return null;}", this)}; + //15.13.1 A method reference expression of the form ArrayType :: new is always exact. + return factory.createMethodFromText("public " + componentType.createArrayType().getCanonicalText() + " __array__(int i) {return null;}", this); } else { methods = containingClass.getConstructors(); } @@ -172,25 +173,38 @@ public class PsiMethodReferenceExpressionImpl extends PsiReferenceExpressionBase if (psiMethod.getTypeParameters().length > 0) { final PsiReferenceParameterList parameterList = getParameterList(); return parameterList != null && parameterList.getTypeParameterElements().length > 0 ? psiMethod : null; + } else { + final PsiSubstitutor classSubstitutor = TypeConversionUtil.getClassSubstitutor(psiMethod.getContainingClass(), containingClass, PsiSubstitutor.EMPTY); + final Set<PsiType> signature = new HashSet<PsiType>(Arrays.asList(psiMethod.getSignature(PsiSubstitutor.EMPTY).getParameterTypes())); + signature.add(psiMethod.getReturnType()); + boolean free = true; + for (PsiType type : signature) { + if (classSubstitutor != null) { + type = classSubstitutor.substitute(type); + } + if (type != null && PsiPolyExpressionUtil.mentionsTypeParameters(type, ContainerUtil.newHashSet(containingClass.getTypeParameters()))) { + free = false; + break; + } + } + if (free) return psiMethod; } } - if (containingClass.isPhysical() && containingClass.hasTypeParameters()) { + if (containingClass.hasTypeParameters()) { final PsiElement qualifier = getQualifier(); + PsiJavaCodeReferenceElement referenceElement = null; if (qualifier instanceof PsiTypeElement) { - final PsiJavaCodeReferenceElement referenceElement = ((PsiTypeElement)qualifier).getInnermostComponentReferenceElement(); - if (referenceElement != null) { - final PsiReferenceParameterList parameterList = referenceElement.getParameterList(); - if (parameterList == null || parameterList.getTypeParameterElements().length == 0) { - return null; - } - } + referenceElement = ((PsiTypeElement)qualifier).getInnermostComponentReferenceElement(); } else if (qualifier instanceof PsiReferenceExpression) { final PsiReferenceExpression expression = (PsiReferenceExpression)qualifier; if (qualifierResolveResult.isReferenceTypeQualified()) { - final PsiReferenceParameterList parameterList = expression.getParameterList(); - if (parameterList == null || parameterList.getTypeParameterElements().length == 0) { - return null; - } + referenceElement = expression; + } + } + if (referenceElement != null) { + final PsiReferenceParameterList parameterList = referenceElement.getParameterList(); + if (parameterList == null || parameterList.getTypeParameterElements().length == 0) { + return null; } } } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiReferenceParameterListImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiReferenceParameterListImpl.java index e85e81cb4bd8..743bd36abf5f 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiReferenceParameterListImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiReferenceParameterListImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,6 +22,7 @@ import com.intellij.psi.impl.PsiImplUtil; import com.intellij.psi.impl.source.tree.*; import com.intellij.psi.tree.ChildRoleBase; import com.intellij.psi.tree.IElementType; +import com.intellij.psi.tree.TokenSet; import com.intellij.util.CharTable; import org.jetbrains.annotations.NotNull; @@ -30,6 +31,7 @@ import org.jetbrains.annotations.NotNull; */ public class PsiReferenceParameterListImpl extends CompositePsiElement implements PsiReferenceParameterList { private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.source.tree.java.PsiReferenceParameterListImpl"); + private static final TokenSet TYPE_SET = TokenSet.create(JavaElementType.TYPE); public PsiReferenceParameterListImpl() { super(JavaElementType.REFERENCE_PARAMETER_LIST); @@ -124,23 +126,8 @@ public class PsiReferenceParameterListImpl extends CompositePsiElement implement final TreeElement firstAdded = super.addInternal(first, last, anchor, before); - if (first == last && first.getElementType() == JavaElementType.TYPE){ - for(ASTNode child = first.getTreeNext(); child != null; child = child.getTreeNext()){ - if (child.getElementType() == JavaTokenType.COMMA) break; - if (child.getElementType() == JavaElementType.TYPE){ - TreeElement comma = Factory.createSingleLeafElement(JavaTokenType.COMMA, ",", 0, 1, treeCharTab, getManager()); - super.addInternal(comma, comma, first, Boolean.FALSE); - break; - } - } - for(ASTNode child = first.getTreePrev(); child != null; child = child.getTreePrev()){ - if (child.getElementType() == JavaTokenType.COMMA) break; - if (child.getElementType() == JavaElementType.TYPE){ - TreeElement comma = Factory.createSingleLeafElement(JavaTokenType.COMMA, ",", 0, 1, treeCharTab, getManager()); - super.addInternal(comma, comma, child, Boolean.FALSE); - break; - } - } + if (first == last && first.getElementType() == JavaElementType.TYPE) { + JavaSourceUtil.addSeparatingComma(this, first, TYPE_SET); } return firstAdded; @@ -148,17 +135,8 @@ public class PsiReferenceParameterListImpl extends CompositePsiElement implement @Override public void deleteChildInternal(@NotNull ASTNode child) { - if (child.getElementType() == JavaElementType.TYPE){ - ASTNode next = PsiImplUtil.skipWhitespaceAndComments(child.getTreeNext()); - if (next != null && next.getElementType() == JavaTokenType.COMMA){ - deleteChildInternal(next); - } - else{ - ASTNode prev = PsiImplUtil.skipWhitespaceAndCommentsBack(child.getTreePrev()); - if (prev != null && prev.getElementType() == JavaTokenType.COMMA){ - deleteChildInternal(prev); - } - } + if (child.getElementType() == JavaElementType.TYPE) { + JavaSourceUtil.deleteSeparatingComma(this, child); } super.deleteChildInternal(child); @@ -186,6 +164,7 @@ public class PsiReferenceParameterListImpl extends CompositePsiElement implement } } + @Override public String toString() { return "PsiReferenceParameterList"; } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/TypeParameterListElement.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/TypeParameterListElement.java index 43d9d80c5742..2a3bdbaa2f4e 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/TypeParameterListElement.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/TypeParameterListElement.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,6 +22,7 @@ import com.intellij.psi.impl.PsiImplUtil; import com.intellij.psi.impl.source.tree.*; import com.intellij.psi.tree.ChildRoleBase; import com.intellij.psi.tree.IElementType; +import com.intellij.psi.tree.TokenSet; import com.intellij.util.CharTable; import org.jetbrains.annotations.NotNull; @@ -30,6 +31,7 @@ import org.jetbrains.annotations.NotNull; */ public class TypeParameterListElement extends CompositeElement { private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.source.tree.java.TypeParameterListElement"); + private static final TokenSet TYPE_PARAMETER_SET = TokenSet.create(JavaElementType.TYPE_PARAMETER); public TypeParameterListElement() { super(JavaElementType.TYPE_PARAMETER_LIST); @@ -82,25 +84,9 @@ public class TypeParameterListElement extends CompositeElement { } } - final TreeElement firstAdded = super.addInternal(first, last, anchor, before); - + TreeElement firstAdded = super.addInternal(first, last, anchor, before); if (first == last && first.getElementType() == JavaElementType.TYPE_PARAMETER) { - for(ASTNode child = first.getTreeNext(); child != null; child = child.getTreeNext()){ - if (child.getElementType() == JavaTokenType.COMMA) break; - if (child.getElementType() == JavaElementType.TYPE_PARAMETER){ - final TreeElement comma = Factory.createSingleLeafElement(JavaTokenType.COMMA, ",", 0, 1, treeCharTab, getManager()); - super.addInternal(comma, comma, first, Boolean.FALSE); - break; - } - } - for(ASTNode child = first.getTreePrev(); child != null; child = child.getTreePrev()){ - if (child.getElementType() == JavaTokenType.COMMA) break; - if (child.getElementType() == JavaElementType.TYPE_PARAMETER){ - final TreeElement comma = Factory.createSingleLeafElement(JavaTokenType.COMMA, ",", 0, 1, treeCharTab, getManager()); - super.addInternal(comma, comma, child, Boolean.FALSE); - break; - } - } + JavaSourceUtil.addSeparatingComma(this, first, TYPE_PARAMETER_SET); } return firstAdded; } @@ -108,18 +94,11 @@ public class TypeParameterListElement extends CompositeElement { @Override public void deleteChildInternal(@NotNull final ASTNode child) { if (child.getElementType() == JavaElementType.TYPE_PARAMETER){ - final ASTNode next = PsiImplUtil.skipWhitespaceAndComments(child.getTreeNext()); - if (next != null && next.getElementType() == JavaTokenType.COMMA){ - deleteChildInternal(next); - } - else{ - final ASTNode prev = PsiImplUtil.skipWhitespaceAndCommentsBack(child.getTreePrev()); - if (prev != null && prev.getElementType() == JavaTokenType.COMMA){ - deleteChildInternal(prev); - } - } + JavaSourceUtil.deleteSeparatingComma(this, child); } + super.deleteChildInternal(child); + if (child.getElementType() == JavaElementType.TYPE_PARAMETER) { final ASTNode lt = findChildByRole(ChildRole.LT_IN_TYPE_LIST); final ASTNode next = PsiImplUtil.skipWhitespaceAndComments(lt.getTreeNext()); |