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";
+ }
+}