From 36b2da5c5e1d7309da0df849c132aa73189d4785 Mon Sep 17 00:00:00 2001 From: anna Date: Tue, 6 Sep 2011 12:35:08 +0200 Subject: [PATCH] replace diamonds with explicit type params (IDEA-73932 ) --- java/java-tests/java-tests.iml | 2 + .../src/com/intellij/psi/PsiDiamondType.java | 7 ++- ...ondWithExplicitTypeArgumentsIntention.java | 7 ++- .../diamond2explicit/AnonymousClass.java | 7 +++ .../AnonymousClass_after.java | 7 +++ .../diamond2explicit/ApplicableDiamond.java | 7 +++ .../ApplicableDiamond_after.java | 7 +++ .../diamond2explicit/ExplicitTypeArgs.java | 9 ++++ .../ExplicitTypeArgs_after.java | 9 ++++ ...eDiamondWithExplicitTypeIntentionTest.java | 43 +++++++++++++++++++ 10 files changed, 102 insertions(+), 3 deletions(-) create mode 100644 plugins/IntentionPowerPak/test/com/siyeh/ipp/types/diamond2explicit/AnonymousClass.java create mode 100644 plugins/IntentionPowerPak/test/com/siyeh/ipp/types/diamond2explicit/AnonymousClass_after.java create mode 100644 plugins/IntentionPowerPak/test/com/siyeh/ipp/types/diamond2explicit/ApplicableDiamond.java create mode 100644 plugins/IntentionPowerPak/test/com/siyeh/ipp/types/diamond2explicit/ApplicableDiamond_after.java create mode 100644 plugins/IntentionPowerPak/test/com/siyeh/ipp/types/diamond2explicit/ExplicitTypeArgs.java create mode 100644 plugins/IntentionPowerPak/test/com/siyeh/ipp/types/diamond2explicit/ExplicitTypeArgs_after.java create mode 100644 plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/types/ReplaceDiamondWithExplicitTypeIntentionTest.java diff --git a/java/java-tests/java-tests.iml b/java/java-tests/java-tests.iml index e2708d77ad84..faf2fc05a870 100644 --- a/java/java-tests/java-tests.iml +++ b/java/java-tests/java-tests.iml @@ -26,6 +26,8 @@ + + diff --git a/java/openapi/src/com/intellij/psi/PsiDiamondType.java b/java/openapi/src/com/intellij/psi/PsiDiamondType.java index 64ef616d2e50..0b2e3087b4a5 100644 --- a/java/openapi/src/com/intellij/psi/PsiDiamondType.java +++ b/java/openapi/src/com/intellij/psi/PsiDiamondType.java @@ -114,6 +114,10 @@ public class PsiDiamondType extends PsiType { return DiamondInferenceResult.EXPLICIT_CONSTRUCTOR_TYPE_ARGS; } + return resolveInferredTypesNoCheck(newExpression, context); + } + + public static DiamondInferenceResult resolveInferredTypesNoCheck(PsiNewExpression newExpression, PsiElement context) { final PsiClass psiClass = findClass(newExpression); if (psiClass == null) return DiamondInferenceResult.NULL_RESULT; final PsiExpressionList argumentList = newExpression.getArgumentList(); @@ -129,7 +133,8 @@ public class PsiDiamondType extends PsiType { final PsiTypeParameter[] classParameters = psiClass.getTypeParameters(); final PsiJavaCodeReferenceElement classOrAnonymousClassReference = newExpression.getClassOrAnonymousClassReference(); LOG.assertTrue(classOrAnonymousClassReference != null); - final DiamondInferenceResult result = new DiamondInferenceResult(classOrAnonymousClassReference.getReferenceName() + "<>", newExpression.getProject()); + final DiamondInferenceResult + result = new DiamondInferenceResult(classOrAnonymousClassReference.getReferenceName() + "<>", newExpression.getProject()); for (PsiTypeParameter parameter : parameters) { for (PsiTypeParameter classParameter : classParameters) { if (Comparing.strEqual(classParameter.getName(), parameter.getName())) { diff --git a/plugins/IntentionPowerPak/src/com/siyeh/ipp/types/ReplaceDiamondWithExplicitTypeArgumentsIntention.java b/plugins/IntentionPowerPak/src/com/siyeh/ipp/types/ReplaceDiamondWithExplicitTypeArgumentsIntention.java index c99213a881e3..9823e94505d7 100644 --- a/plugins/IntentionPowerPak/src/com/siyeh/ipp/types/ReplaceDiamondWithExplicitTypeArgumentsIntention.java +++ b/plugins/IntentionPowerPak/src/com/siyeh/ipp/types/ReplaceDiamondWithExplicitTypeArgumentsIntention.java @@ -16,6 +16,7 @@ package com.siyeh.ipp.types; import com.intellij.psi.*; +import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.IncorrectOperationException; import com.siyeh.ipp.base.Intention; import com.siyeh.ipp.base.PsiElementPredicate; @@ -45,9 +46,11 @@ public class ReplaceDiamondWithExplicitTypeArgumentsIntention extends Intention final StringBuilder text = new StringBuilder(); text.append(javaCodeReferenceElement.getQualifiedName()); text.append('<'); - final PsiType[] typeArguments = referenceParameterList.getTypeArguments(); + final PsiTypeElement[] typeElements = referenceParameterList.getTypeParameterElements(); + final PsiNewExpression newExpression = PsiTreeUtil.getParentOfType(typeElements[0], PsiNewExpression.class); + final PsiDiamondType.DiamondInferenceResult result = PsiDiamondType.resolveInferredTypesNoCheck(newExpression, newExpression); boolean first = true; - for (PsiType typeArgument : typeArguments) { + for (PsiType typeArgument : result.getInferredTypes()) { if (first) { first = false; } else { diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/diamond2explicit/AnonymousClass.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/diamond2explicit/AnonymousClass.java new file mode 100644 index 000000000000..7baa48df8d01 --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/diamond2explicit/AnonymousClass.java @@ -0,0 +1,7 @@ +public interface Anonymous {} + +class Test { + public static void main(String[] args) { + Anonymous anon = new Anonymous<>() {}; + } +} \ No newline at end of file diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/diamond2explicit/AnonymousClass_after.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/diamond2explicit/AnonymousClass_after.java new file mode 100644 index 000000000000..7218c605ba07 --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/diamond2explicit/AnonymousClass_after.java @@ -0,0 +1,7 @@ +public interface Anonymous {} + +class Test { + public static void main(String[] args) { + Anonymous anon = new Anonymous() {}; + } +} \ No newline at end of file diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/diamond2explicit/ApplicableDiamond.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/diamond2explicit/ApplicableDiamond.java new file mode 100644 index 000000000000..09b88455d476 --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/diamond2explicit/ApplicableDiamond.java @@ -0,0 +1,7 @@ +public class MyClass {} + +class Test { + public static void main(String[] args) { + MyClass anon = new MyClass<>(); + } +} \ No newline at end of file diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/diamond2explicit/ApplicableDiamond_after.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/diamond2explicit/ApplicableDiamond_after.java new file mode 100644 index 000000000000..4e230dcf5553 --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/diamond2explicit/ApplicableDiamond_after.java @@ -0,0 +1,7 @@ +public class MyClass {} + +class Test { + public static void main(String[] args) { + MyClass anon = new MyClass(); + } +} \ No newline at end of file diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/diamond2explicit/ExplicitTypeArgs.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/diamond2explicit/ExplicitTypeArgs.java new file mode 100644 index 000000000000..08b91cee6a6c --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/diamond2explicit/ExplicitTypeArgs.java @@ -0,0 +1,9 @@ +class Foo { + Foo(T t) {} +} + +class Test { + public static void main(String[] args) { + Foo c = new Foo<>(""); + } +} \ No newline at end of file diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/diamond2explicit/ExplicitTypeArgs_after.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/diamond2explicit/ExplicitTypeArgs_after.java new file mode 100644 index 000000000000..0e1b659ed60d --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/diamond2explicit/ExplicitTypeArgs_after.java @@ -0,0 +1,9 @@ +class Foo { + Foo(T t) {} +} + +class Test { + public static void main(String[] args) { + Foo c = new Foo(""); + } +} \ No newline at end of file diff --git a/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/types/ReplaceDiamondWithExplicitTypeIntentionTest.java b/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/types/ReplaceDiamondWithExplicitTypeIntentionTest.java new file mode 100644 index 000000000000..e51a00b0667e --- /dev/null +++ b/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/types/ReplaceDiamondWithExplicitTypeIntentionTest.java @@ -0,0 +1,43 @@ +/* + * Copyright 2000-2011 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.siyeh.ipp.types; + +import com.siyeh.IntentionPowerPackBundle; +import com.siyeh.ipp.IPPTestCase; + +public class ReplaceDiamondWithExplicitTypeIntentionTest extends IPPTestCase { + public void testAnonymousClass() { + doTest(); + } + + public void testApplicableDiamond() { + doTest(); + } + + public void testExplicitTypeArgs() { + doTest(); + } + + @Override + protected String getIntentionName() { + return IntentionPowerPackBundle.message("replace.diamond.with.explicit.type.arguments.intention.name"); + } + + @Override + protected String getRelativePath() { + return "types/diamond2explicit"; + } +}