private PsiMethod createPsiMethod(@NotNull FieldDescriptor descriptor, FieldAccessType accessType) {
PsiClass outerClass = getOuterClass();
PsiClass containingClass = descriptor.field.getContainingClass();
- String returnType = PsiReflectionAccessUtil.getAccessibleReturnType(descriptor.field.getType());
String className = containingClass == null ? null : ClassUtil.getJVMClassName(containingClass);
String fieldName = descriptor.field.getName();
if (className == null || fieldName == null) {
LOG.warn("Code is incomplete. Class name or field name not found");
return null;
}
- if (returnType == null) {
- LOG.warn("Could not resolve return type");
- return null;
- }
String methodName = PsiReflectionAccessUtil.getUniqueMethodName(outerClass, "accessToField" + StringUtil.capitalize(fieldName));
ReflectionAccessMethodBuilder methodBuilder = new ReflectionAccessMethodBuilder(methodName);
if (FieldAccessType.GET.equals(accessType)) {
+ String returnType = PsiReflectionAccessUtil.getAccessibleReturnType(resolveFieldType(descriptor));
+ if (returnType == null) {
+ LOG.warn("Could not resolve field type");
+ return null;
+ }
methodBuilder.accessedField(className, fieldName)
.setReturnType(returnType);
}
!PsiReflectionAccessUtil.isQualifierAccessible(expression.getQualifierExpression());
}
+ @NotNull
+ private static PsiType resolveFieldType(@NotNull FieldDescriptor descriptor) {
+ PsiType rawType = descriptor.field.getType();
+ return descriptor.expression.advancedResolve(false).getSubstitutor().substitute(rawType);
+ }
+
@Nullable
private static String qualify(@NotNull FieldDescriptor descriptor) {
String qualifier = PsiReflectionAccessUtil.extractQualifier(descriptor.expression);
@Override
protected void grantAccess(@NotNull MethodCallDescriptor descriptor) {
PsiClass outerClass = getOuterClass();
- String returnType = PsiReflectionAccessUtil.getAccessibleReturnType(descriptor.method.getReturnType());
+ String returnType = PsiReflectionAccessUtil.getAccessibleReturnType(resolveMethodReturnType(descriptor));
PsiClass containingClass = descriptor.method.getContainingClass();
String containingClassName = containingClass == null ? null : ClassUtil.getJVMClassName(containingClass);
String name = descriptor.method.getName();
!PsiReflectionAccessUtil.isQualifierAccessible(referenceExpression.getQualifierExpression());
}
+ @Nullable
+ private static PsiType resolveMethodReturnType(@NotNull MethodCallDescriptor descriptor) {
+ PsiSubstitutor substitutor = descriptor.callExpression.resolveMethodGenerics().getSubstitutor();
+ return substitutor.substitute(descriptor.method.getReturnType());
+ }
+
@Nullable
private static String qualify(@NotNull MethodCallDescriptor descriptor) {
String qualifier = PsiReflectionAccessUtil.extractQualifier(descriptor.callExpression.getMethodExpression());
import com.intellij.psi.*;
import com.intellij.psi.util.ClassUtil;
import com.intellij.psi.util.PsiUtil;
+import com.intellij.psi.util.TypeConversionUtil;
import com.intellij.refactoring.extractMethodObject.PsiReflectionAccessUtil;
import com.intellij.util.SmartList;
import one.util.streamex.StreamEx;
for (int i = 0; i < parameters.length; i++) {
PsiParameter parameter = parameters[i];
String name = parameter.getName();
- PsiType type = parameter.getType();
+ PsiType type = TypeConversionUtil.erasure(parameter.getType());
myParameters.add(new ParameterInfo(type.getCanonicalText(), name == null ? "arg" + i : name, extractJvmType(type)));
}