diff --git a/plugins/IntentionPowerPak/src/com/siyeh/ipp/types/ReplaceMethodRefWithLambdaIntention.java b/plugins/IntentionPowerPak/src/com/siyeh/ipp/types/ReplaceMethodRefWithLambdaIntention.java index f0d54848106c..647b49f65d2f 100644 --- a/plugins/IntentionPowerPak/src/com/siyeh/ipp/types/ReplaceMethodRefWithLambdaIntention.java +++ b/plugins/IntentionPowerPak/src/com/siyeh/ipp/types/ReplaceMethodRefWithLambdaIntention.java @@ -82,15 +82,19 @@ public class ReplaceMethodRefWithLambdaIntention extends Intention { buf.append("{"); } final PsiElement qualifier = referenceExpression.getQualifier(); - boolean isReceiver = false; + PsiClass containingClass = null; if (resolveElement instanceof PsiMethod) { - final PsiClass containingClass = ((PsiMember)resolveElement).getContainingClass(); + containingClass = ((PsiMember)resolveElement).getContainingClass(); LOG.assertTrue(containingClass != null); - isReceiver = PsiMethodReferenceUtil.isReceiverType(functionalInterfaceType, containingClass, (PsiMethod)resolveElement); } else if (resolveElement instanceof PsiClass) { - isReceiver = PsiMethodReferenceUtil.isReceiverType(functionalInterfaceType, (PsiClass)resolveElement, (PsiMethod)null); + containingClass = (PsiClass)resolveElement; } + final boolean onArrayRef = + JavaPsiFacade.getElementFactory(element.getProject()).getArrayClass(PsiUtil.getLanguageLevel(element)) == containingClass; + boolean isReceiver = onArrayRef && resolveElement instanceof PsiMethod || + PsiMethodReferenceUtil.isReceiverType(functionalInterfaceType, containingClass, resolveElement instanceof PsiMethod ? (PsiMethod)resolveElement : null); + final PsiElement referenceNameElement = referenceExpression.getReferenceNameElement(); if (isReceiver){ buf.append(parameters[0].getName()).append("."); @@ -113,43 +117,52 @@ public class ReplaceMethodRefWithLambdaIntention extends Intention { if (referenceNameElement instanceof PsiKeyword) { //class name buf.append(" "); - buf.append(((PsiMember)resolveElement).getName()); - - final PsiSubstitutor substitutor = resolveResult.getSubstitutor(); - - PsiClass containingClass; - if (resolveElement instanceof PsiClass) { - containingClass = (PsiClass)resolveElement; - } else { - containingClass = ((PsiMember)resolveElement).getContainingClass(); - } - - LOG.assertTrue(containingClass != null); - if (containingClass.hasTypeParameters() && !PsiUtil.isRawSubstitutor(containingClass, substitutor)) { - buf.append("<").append(StringUtil.join(containingClass.getTypeParameters(), new Function() { - @Override - public String fun(PsiTypeParameter parameter) { - final PsiType psiType = substitutor.substitute(parameter); - LOG.assertTrue(psiType != null); - return psiType.getCanonicalText(); + if (onArrayRef) { + if (qualifier instanceof PsiTypeElement) { + final PsiType type = ((PsiTypeElement)qualifier).getType(); + int dim = type.getArrayDimensions(); + buf.append(type.getDeepComponentType().getCanonicalText()); + buf.append("["); + buf.append(parameters[0].getName()); + buf.append("]"); + while (--dim > 0) { + buf.append("[]"); } - }, ", ")).append(">"); + } + } else { + buf.append(((PsiMember)resolveElement).getName()); + + final PsiSubstitutor substitutor = resolveResult.getSubstitutor(); + + LOG.assertTrue(containingClass != null); + if (containingClass.hasTypeParameters() && !PsiUtil.isRawSubstitutor(containingClass, substitutor)) { + buf.append("<").append(StringUtil.join(containingClass.getTypeParameters(), new Function() { + @Override + public String fun(PsiTypeParameter parameter) { + final PsiType psiType = substitutor.substitute(parameter); + LOG.assertTrue(psiType != null); + return psiType.getCanonicalText(); + } + }, ", ")).append(">"); + } } } - //param list - buf.append("("); - boolean first = true; - for (int i = isReceiver ? 1 : 0; i < parameters.length; i++) { - PsiParameter parameter = parameters[i]; - if (!first) { - buf.append(", "); - } else { - first = false; + if (!onArrayRef || isReceiver) { + //param list + buf.append("("); + boolean first = true; + for (int i = isReceiver ? 1 : 0; i < parameters.length; i++) { + PsiParameter parameter = parameters[i]; + if (!first) { + buf.append(", "); + } else { + first = false; + } + buf.append(map.get(parameter)); } - buf.append(map.get(parameter)); + buf.append(")"); } - buf.append(")"); if (needBraces) { buf.append(";}"); diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/ArrayConstructorRef.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/ArrayConstructorRef.java new file mode 100644 index 000000000000..cd14ddf1f7f2 --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/ArrayConstructorRef.java @@ -0,0 +1,12 @@ +public class Foo { + static void foo() { + Ar a = String[]::new; + } + + interface Ar { + T[] jjj(int p); + } +} + + + diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/ArrayConstructorRef2Dim.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/ArrayConstructorRef2Dim.java new file mode 100644 index 000000000000..b4c1520b142d --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/ArrayConstructorRef2Dim.java @@ -0,0 +1,12 @@ +public class Foo { + static void foo() { + Ar a = String[][]::new; + } + + interface Ar { + T[][] jjj(int p); + } +} + + + diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/ArrayConstructorRef2Dim_after.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/ArrayConstructorRef2Dim_after.java new file mode 100644 index 000000000000..f12bd0757c40 --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/ArrayConstructorRef2Dim_after.java @@ -0,0 +1,12 @@ +public class Foo { + static void foo() { + Ar a = (p) -> new String[p][]; + } + + interface Ar { + T[][] jjj(int p); + } +} + + + diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/ArrayConstructorRef_after.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/ArrayConstructorRef_after.java new file mode 100644 index 000000000000..7d38741a60ab --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/ArrayConstructorRef_after.java @@ -0,0 +1,12 @@ +public class Foo { + static void foo() { + Ar a = (p) -> new String[p]; + } + + interface Ar { + T[] jjj(int p); + } +} + + + diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/ArrayMethodRef.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/ArrayMethodRef.java new file mode 100644 index 000000000000..a59bb6d2041c --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/ArrayMethodRef.java @@ -0,0 +1,9 @@ +public class Foo { + static void foo() { + Cln j = int[]::clone; + } + + interface Cln { + Object _(int[] p); + } +} \ No newline at end of file diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/ArrayMethodRef_after.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/ArrayMethodRef_after.java new file mode 100644 index 000000000000..65a55a55e8aa --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/ArrayMethodRef_after.java @@ -0,0 +1,9 @@ +public class Foo { + static void foo() { + Cln j = (p) -> p.clone(); + } + + interface Cln { + Object _(int[] p); + } +} \ No newline at end of file diff --git a/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/types/ReplaceMethodReferenceWithLambdaIntentionTest.java b/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/types/ReplaceMethodReferenceWithLambdaIntentionTest.java index 0a4dc30371f2..a8bbe45d51c0 100644 --- a/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/types/ReplaceMethodReferenceWithLambdaIntentionTest.java +++ b/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/types/ReplaceMethodReferenceWithLambdaIntentionTest.java @@ -89,4 +89,16 @@ public class ReplaceMethodReferenceWithLambdaIntentionTest extends IPPTestCase { public void testNewDefaultConstructor() throws Exception { doTest(); } + + public void testArrayConstructorRef() throws Exception { + doTest(); + } + + public void testArrayConstructorRef2Dim() throws Exception { + doTest(); + } + + public void testArrayMethodRef() throws Exception { + doTest(); + } }