boolean (PsiReference reference, PsiMethod method) { if (reference == null) return false; PsiElement element = reference.getElement(); if (!(element instanceof PsiJavaCodeReferenceElement)) return false; PsiNewExpression expression = tryCast(element.getParent(), PsiNewExpression.class); if (expression == null) return false; PsiMethodCallExpression call = ExpressionUtils.getCallForQualifier(expression); if (call == null) return false; if (CommonJavaRefactoringUtil.getParentStatement(call, true) == null) return false; PsiMethod nextMethod = call.resolveMethod(); if (nextMethod == null) return false; PsiElement nav = nextMethod.getNavigationElement(); if (nav instanceof PsiMethod) { nextMethod = (PsiMethod)nav; } PsiClass aClass = method.getContainingClass(); if (aClass == null) return false; if (aClass.getContainingClass() != null && !aClass.hasModifierProperty(PsiModifier.STATIC)) return false; PsiClassType[] supers = aClass.getExtendsListTypes(); if (supers.length > 1) return false; if (supers.length == 1 && !isStatelessSuperClass(supers[0], new HashSet<>())) return false; for (PsiField field : aClass.getFields()) { if (!field.hasModifierProperty(PsiModifier.STATIC)) { PsiExpression initializer = field.getInitializer(); if (initializer != null && mayLeakThis(initializer)) return false; } } for (PsiClassInitializer initializer : aClass.getInitializers()) { if (!initializer.hasModifierProperty(PsiModifier.STATIC)) { return false; } } return !mayLeakThis(method) && !mayLeakThis(nextMethod); }