mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-01-05 01:50:56 +07:00
IDEA-172425 Fix bug when default constructor is inaccessible
This commit is contained in:
@@ -87,8 +87,9 @@ public class ConstructorReflectionAccessor extends ReflectionAccessorBase<Constr
|
||||
}
|
||||
else {
|
||||
PsiJavaCodeReferenceElement classReference = expression.getClassReference();
|
||||
if (classReference instanceof PsiClass && !PsiReflectionAccessUtil.isAccessible((PsiClass)classReference)) {
|
||||
return new ConstructorDescriptor(expression, null, (PsiClass)classReference);
|
||||
PsiElement referent = classReference != null ? classReference.resolve() : null;
|
||||
if (referent instanceof PsiClass && !PsiReflectionAccessUtil.isAccessible((PsiClass)referent)) {
|
||||
return new ConstructorDescriptor(expression, null, (PsiClass)referent);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -25,4 +25,7 @@ public class WithReflectionAccess {
|
||||
public static void apply(Runnable runnable) {
|
||||
runnable.run();
|
||||
}
|
||||
|
||||
private static class Inner {
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
call text: Inner result = Test.invoke();
|
||||
class:
|
||||
static class Test {
|
||||
static Inner invoke() {
|
||||
return newWithReflectionAccess$Inner1();
|
||||
}
|
||||
|
||||
public static Object newWithReflectionAccess$Inner1() {
|
||||
try {
|
||||
Class<?> klass = Class.forName("WithReflectionAccess$Inner");
|
||||
java.lang.reflect.Constructor<?> member = null;
|
||||
int interfaceNumber = -1;
|
||||
Class<?>[] interfaces = null;
|
||||
while (member == null) {
|
||||
try {
|
||||
member = klass.getDeclaredConstructor();
|
||||
} catch (ReflectiveOperationException e) {
|
||||
if (interfaceNumber == -1) {
|
||||
interfaces = klass.getInterfaces();
|
||||
interfaceNumber = 0;
|
||||
}
|
||||
if (interfaceNumber < interfaces.length) {
|
||||
klass = interfaces[interfaceNumber];
|
||||
interfaceNumber += 1;
|
||||
} else {
|
||||
klass = klass.getSuperclass();
|
||||
if (klass == null) throw e;
|
||||
interfaceNumber = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
member.setAccessible(true);
|
||||
return (Object) member.newInstance();
|
||||
} catch (ReflectiveOperationException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -46,6 +46,10 @@ public class ExtractMethodObject4DebuggerReflectionTest extends LightRefactoring
|
||||
doTest("instance.method(42)");
|
||||
}
|
||||
|
||||
public void testCallDefaultConstructor() throws PrepareFailedException {
|
||||
doTest("new Inner()");
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
protected String getTestDataPath() {
|
||||
|
||||
Reference in New Issue
Block a user