diff --git a/java/java-impl/src/com/intellij/codeInspection/reference/RefJavaUtilImpl.java b/java/java-impl/src/com/intellij/codeInspection/reference/RefJavaUtilImpl.java index d5c2ea5ded2d..63c25f321f39 100644 --- a/java/java-impl/src/com/intellij/codeInspection/reference/RefJavaUtilImpl.java +++ b/java/java-impl/src/com/intellij/codeInspection/reference/RefJavaUtilImpl.java @@ -75,7 +75,7 @@ public class RefJavaUtilImpl extends RefJavaUtil{ if (refConstructor == null) { // No explicit constructor referenced. Should use default one. PsiType newType = newExpr.getType(); if (newType instanceof PsiClassType) { - processClassReference(PsiUtil.resolveClassInType(newType), refFrom, psiFrom); + processClassReference(PsiUtil.resolveClassInType(newType), refFrom, psiFrom, true); } } } @@ -124,22 +124,38 @@ public class RefJavaUtilImpl extends RefJavaUtil{ final PsiTypeElement operand = expression.getOperand(); final PsiType type = operand.getType(); if (type instanceof PsiClassType) { - processClassReference(((PsiClassType)type).resolve(), refFrom, psiFrom); + processClassReference(((PsiClassType)type).resolve(), refFrom, psiFrom, false); } } - private void processClassReference(final PsiClass psiClass, final RefJavaElementImpl refFrom, final PsiModifierListOwner psiFrom) { + private void processClassReference(final PsiClass psiClass, + final RefJavaElementImpl refFrom, + final PsiModifierListOwner psiFrom, + boolean defaultConstructorOnly) { if (psiClass != null) { RefClassImpl refClass = (RefClassImpl)refFrom.getRefManager().getReference(psiClass); if (refClass != null) { - RefMethodImpl refDefaultConstructor = (RefMethodImpl)refClass.getDefaultConstructor(); + boolean hasConstructorsMarked = false; - if (refDefaultConstructor != null && !(refDefaultConstructor instanceof RefImplicitConstructor)) { - refDefaultConstructor.addInReference(refFrom); - refFrom.addOutReference(refDefaultConstructor); + if (defaultConstructorOnly) { + RefMethodImpl refDefaultConstructor = (RefMethodImpl)refClass.getDefaultConstructor(); + if (refDefaultConstructor != null && !(refDefaultConstructor instanceof RefImplicitConstructor)) { + refDefaultConstructor.addInReference(refFrom); + refFrom.addOutReference(refDefaultConstructor); + hasConstructorsMarked = true; + } } else { + for (RefMethod cons : refClass.getConstructors()) { + if (cons instanceof RefImplicitConstructor) continue; + ((RefMethodImpl)cons).addInReference(refFrom); + refFrom.addOutReference(cons); + hasConstructorsMarked = true; + } + } + + if (!hasConstructorsMarked) { refFrom.addReference(refClass, psiClass, psiFrom, false, true, null); } } @@ -385,4 +401,4 @@ public class RefJavaUtilImpl extends RefJavaUtil{ } } } -} \ No newline at end of file +} diff --git a/java/java-tests/testData/inspection/deadCode/classLiteralRef/expected.xml b/java/java-tests/testData/inspection/deadCode/classLiteralRef/expected.xml new file mode 100644 index 000000000000..bdafc52f107c --- /dev/null +++ b/java/java-tests/testData/inspection/deadCode/classLiteralRef/expected.xml @@ -0,0 +1,4 @@ + + + + diff --git a/java/java-tests/testData/inspection/deadCode/classLiteralRef/src/Test.java b/java/java-tests/testData/inspection/deadCode/classLiteralRef/src/Test.java new file mode 100644 index 000000000000..13500191cfe2 --- /dev/null +++ b/java/java-tests/testData/inspection/deadCode/classLiteralRef/src/Test.java @@ -0,0 +1,12 @@ +import java.lang.Class; +import java.lang.String; + +public class Test { + public static void main(String[] args) { + Test.class.getDeclaredConstructor(String.class).newInstance("Foo"); + } + + public Test(String param) { + System.out.println("This is used!"); + } +} diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/UnusedDeclarationTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/UnusedDeclarationTest.java index 5dcd702f8835..aa8049be425e 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/UnusedDeclarationTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/UnusedDeclarationTest.java @@ -184,4 +184,8 @@ public class UnusedDeclarationTest extends InspectionTestCase { public void testAbstractClassWithSerializableSubclasses() throws Exception { doTest(); } + + public void testclassLiteralRef() throws Exception { + doTest(); + } }