.class literal usage shall mark all constructors used, not just default one.

This commit is contained in:
Maxim Shafirov
2012-04-17 17:26:18 +04:00
parent 2a3e8d3825
commit 7ad10deaa4
4 changed files with 44 additions and 8 deletions
@@ -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{
}
}
}
}
}
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<problems/>
@@ -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!");
}
}
@@ -184,4 +184,8 @@ public class UnusedDeclarationTest extends InspectionTestCase {
public void testAbstractClassWithSerializableSubclasses() throws Exception {
doTest();
}
public void testclassLiteralRef() throws Exception {
doTest();
}
}