summaryrefslogtreecommitdiff
path: root/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java
diff options
context:
space:
mode:
Diffstat (limited to 'java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java')
-rw-r--r--java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/AnnotationParamListElement.java111
-rw-r--r--java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/ClassElement.java52
-rw-r--r--java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/ParameterListElement.java56
-rw-r--r--java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiAnnotationParamListImpl.java26
-rw-r--r--java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiArrayInitializerMemberValueImpl.java69
-rw-r--r--java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiCommaSeparatedListImpl.java85
-rw-r--r--java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiExpressionListImpl.java21
-rw-r--r--java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiMethodReferenceExpressionImpl.java46
-rw-r--r--java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiReferenceParameterListImpl.java37
-rw-r--r--java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/TypeParameterListElement.java37
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());