From 3c0149acada9503afa28c304c7892f2e0c6a0dbc Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 30 Nov 2015 19:38:53 +0100 Subject: [PATCH] extract diamond check for new expression --- .../ChangeClassSignatureProcessor.java | 9 ++-- .../intellij/refactoring/util/InlineUtil.java | 54 +++++++++---------- .../intellij/psi/impl/PsiDiamondTypeUtil.java | 21 ++++++++ .../graphInference/InferenceSession.java | 14 ++--- .../graphInference/PsiPolyExpressionUtil.java | 30 +++-------- 5 files changed, 58 insertions(+), 70 deletions(-) diff --git a/java/java-impl/src/com/intellij/refactoring/changeClassSignature/ChangeClassSignatureProcessor.java b/java/java-impl/src/com/intellij/refactoring/changeClassSignature/ChangeClassSignatureProcessor.java index c319bafeb53b..8df4e09b81ce 100644 --- a/java/java-impl/src/com/intellij/refactoring/changeClassSignature/ChangeClassSignatureProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/changeClassSignature/ChangeClassSignatureProcessor.java @@ -22,6 +22,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Ref; import com.intellij.psi.*; import com.intellij.psi.codeStyle.JavaCodeStyleManager; +import com.intellij.psi.impl.PsiDiamondTypeUtil; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.psi.util.PsiUtil; @@ -96,12 +97,8 @@ public class ChangeClassSignatureProcessor extends BaseRefactoringProcessor { PsiJavaCodeReferenceElement referenceElement = (PsiJavaCodeReferenceElement)reference.getElement(); PsiElement parent = referenceElement.getParent(); if (parent instanceof PsiTypeElement && parent.getParent() instanceof PsiInstanceOfExpression) continue; - if (parent instanceof PsiNewExpression && PsiUtil.isLanguageLevel7OrHigher(parent)) { - final PsiReferenceParameterList parameterList = referenceElement.getParameterList(); - if (parameterList != null) { - final PsiTypeElement[] parameterElements = parameterList.getTypeParameterElements(); - if (parameterElements.length == 1 && parameterElements[0].getType() instanceof PsiDiamondType) continue; - } + if (parent instanceof PsiNewExpression && PsiDiamondTypeUtil.hasDiamond((PsiNewExpression)parent)) { + continue; } if (parent instanceof PsiTypeElement || parent instanceof PsiNewExpression || parent instanceof PsiAnonymousClass || parent instanceof PsiReferenceList) { diff --git a/java/java-impl/src/com/intellij/refactoring/util/InlineUtil.java b/java/java-impl/src/com/intellij/refactoring/util/InlineUtil.java index b4d5edc47178..140ef8353238 100644 --- a/java/java-impl/src/com/intellij/refactoring/util/InlineUtil.java +++ b/java/java-impl/src/com/intellij/refactoring/util/InlineUtil.java @@ -23,6 +23,7 @@ import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.codeStyle.JavaCodeStyleManager; +import com.intellij.psi.impl.PsiDiamondTypeUtil; import com.intellij.psi.search.LocalSearchScope; import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.psi.tree.IElementType; @@ -384,36 +385,29 @@ public class InlineUtil { private static PsiElement replaceDiamondWithInferredTypesIfNeeded(PsiExpression initializer, PsiElement ref) { if (initializer instanceof PsiNewExpression) { - final PsiJavaCodeReferenceElement classReference = ((PsiNewExpression)initializer).getClassOrAnonymousClassReference(); - if (classReference != null) { - final PsiReferenceParameterList parameterList = classReference.getParameterList(); - if (parameterList != null) { - final PsiTypeElement[] typeParameterElements = parameterList.getTypeParameterElements(); - if (typeParameterElements.length == 1) { - final PsiType type = typeParameterElements[0].getType(); - if (type instanceof PsiDiamondType) { - final PsiDiamondType.DiamondInferenceResult inferenceResult = ((PsiDiamondType)type).resolveInferredTypes(); - if (inferenceResult.getErrorMessage() == null) { - final PsiElement copy = ref.copy(); - final PsiElement parent = ref.replace(initializer); - final PsiDiamondType.DiamondInferenceResult result = PsiDiamondTypeImpl.resolveInferredTypes((PsiNewExpression)initializer, parent); - ref = parent.replace(copy); - if (!result.equals(inferenceResult)) { - final String inferredTypeText = StringUtil.join(inferenceResult.getTypes(), - new Function() { - @Override - public String fun(PsiType psiType) { - return psiType.getCanonicalText(); - } - }, ", "); - final PsiExpressionList argumentList = ((PsiNewExpression)initializer).getArgumentList(); - if (argumentList != null) { - final PsiExpression expression = JavaPsiFacade.getElementFactory(initializer.getProject()) - .createExpressionFromText("new " + classReference.getReferenceName() + "<" + inferredTypeText + ">" + argumentList.getText(), initializer); - return ref.replace(expression); - } - } - } + final PsiDiamondType diamondType = PsiDiamondTypeUtil.getDiamondType((PsiNewExpression)initializer); + if (diamondType != null) { + final PsiDiamondType.DiamondInferenceResult inferenceResult = diamondType.resolveInferredTypes(); + if (inferenceResult.getErrorMessage() == null) { + final PsiElement copy = ref.copy(); + final PsiElement parent = ref.replace(initializer); + final PsiDiamondType.DiamondInferenceResult result = PsiDiamondTypeImpl.resolveInferredTypes((PsiNewExpression)initializer, parent); + ref = parent.replace(copy); + if (!result.equals(inferenceResult)) { + final String inferredTypeText = StringUtil.join(inferenceResult.getTypes(), + new Function() { + @Override + public String fun(PsiType psiType) { + return psiType.getCanonicalText(); + } + }, ", "); + final PsiExpressionList argumentList = ((PsiNewExpression)initializer).getArgumentList(); + if (argumentList != null) { + final PsiJavaCodeReferenceElement classReference = ((PsiNewExpression)initializer).getClassOrAnonymousClassReference(); + LOG.assertTrue(classReference != null); + final PsiExpression expression = JavaPsiFacade.getElementFactory(initializer.getProject()) + .createExpressionFromText("new " + classReference.getReferenceName() + "<" + inferredTypeText + ">" + argumentList.getText(), initializer); + return ref.replace(expression); } } } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/PsiDiamondTypeUtil.java b/java/java-psi-impl/src/com/intellij/psi/impl/PsiDiamondTypeUtil.java index 2909317e370c..c21c70078b26 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/PsiDiamondTypeUtil.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/PsiDiamondTypeUtil.java @@ -162,4 +162,25 @@ public class PsiDiamondTypeUtil { } return typeText; } + + public static boolean hasDiamond(PsiNewExpression expression) { + return getDiamondType(expression) != null; + } + + public static PsiDiamondType getDiamondType(PsiNewExpression expression) { + if (PsiUtil.isLanguageLevel7OrHigher(expression)) { + final PsiJavaCodeReferenceElement classReference = expression.getClassOrAnonymousClassReference(); + if (classReference != null) { + final PsiReferenceParameterList parameterList = classReference.getParameterList(); + if (parameterList != null) { + final PsiTypeElement[] parameterElements = parameterList.getTypeParameterElements(); + if (parameterElements.length == 1) { + final PsiType type = parameterElements[0].getType(); + return type instanceof PsiDiamondType ? (PsiDiamondType)type : null; + } + } + } + } + return null; + } } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java index ccca8a6d7d00..01ce6a8aa6ce 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java @@ -22,6 +22,7 @@ import com.intellij.openapi.util.Key; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; +import com.intellij.psi.impl.PsiDiamondTypeUtil; import com.intellij.psi.impl.PsiImplUtil; import com.intellij.psi.impl.source.resolve.graphInference.constraints.*; import com.intellij.psi.infos.MethodCandidateInfo; @@ -257,17 +258,8 @@ public class InferenceSession { } else if (method.isConstructor() && gParent instanceof PsiNewExpression) { final PsiClass containingClass = method.getContainingClass(); - if (containingClass != null && containingClass.hasTypeParameters()) { - final PsiJavaCodeReferenceElement classReference = ((PsiNewExpression)gParent).getClassOrAnonymousClassReference(); - if (classReference != null) { - final PsiReferenceParameterList parameterList = classReference.getParameterList(); - if (parameterList != null) { - final PsiTypeElement[] typeElements = parameterList.getTypeParameterElements(); - if (typeElements.length == 1 && typeElements[0].getType() instanceof PsiDiamondType) { - owner = containingClass; - } - } - } + if (containingClass != null && containingClass.hasTypeParameters() && PsiDiamondTypeUtil.hasDiamond((PsiNewExpression)gParent)) { + owner = containingClass; } } return owner; diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/PsiPolyExpressionUtil.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/PsiPolyExpressionUtil.java index 837115cc186d..21a817506181 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/PsiPolyExpressionUtil.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/PsiPolyExpressionUtil.java @@ -16,6 +16,7 @@ package com.intellij.psi.impl.source.resolve.graphInference; import com.intellij.psi.*; +import com.intellij.psi.impl.PsiDiamondTypeUtil; import com.intellij.psi.infos.MethodCandidateInfo; import com.intellij.psi.util.PsiUtil; import com.intellij.psi.util.TypeConversionUtil; @@ -46,18 +47,10 @@ public class PsiPolyExpressionUtil { else if (expression instanceof PsiParenthesizedExpression) { return isPolyExpression(((PsiParenthesizedExpression)expression).getExpression()); } - else if (expression instanceof PsiNewExpression) { - final PsiJavaCodeReferenceElement classReference = ((PsiNewExpression)expression).getClassOrAnonymousClassReference(); - if (classReference != null) { - final PsiReferenceParameterList parameterList = classReference.getParameterList(); - if (parameterList != null) { - final PsiTypeElement[] typeElements = parameterList.getTypeParameterElements(); - if (typeElements.length == 1 && typeElements[0].getType() instanceof PsiDiamondType) { - return isInAssignmentOrInvocationContext(expression); - } - } - } - } else if (expression instanceof PsiMethodCallExpression) { + else if (expression instanceof PsiNewExpression && PsiDiamondTypeUtil.hasDiamond((PsiNewExpression)expression)) { + return isInAssignmentOrInvocationContext(expression); + } + else if (expression instanceof PsiMethodCallExpression) { final MethodCandidateInfo.CurrentCandidateProperties candidateProperties = MethodCandidateInfo.getCurrentMethod(((PsiMethodCallExpression)expression).getArgumentList()); return isMethodCallPolyExpression(expression, candidateProperties != null ? candidateProperties.getMethod() : ((PsiMethodCallExpression)expression).resolveMethod()); } @@ -80,17 +73,8 @@ public class PsiPolyExpressionUtil { return mentionsTypeParameters(returnType, typeParameters); } } - else if (method.isConstructor() && expression instanceof PsiNewExpression) { - final PsiJavaCodeReferenceElement classReference = ((PsiNewExpression)expression).getClassOrAnonymousClassReference(); - if (classReference != null) { - final PsiReferenceParameterList parameterList = classReference.getParameterList(); - if (parameterList != null) { - final PsiTypeElement[] parameterElements = parameterList.getTypeParameterElements(); - if (parameterElements.length == 1 && parameterElements[0].getType() instanceof PsiDiamondType) { - return true; - } - } - } + else if (method.isConstructor() && expression instanceof PsiNewExpression && PsiDiamondTypeUtil.hasDiamond((PsiNewExpression)expression)) { + return true; } } else { return true;