@Nullable
 private PyType replaceSelf(
     @Nullable PyType returnType,
     @Nullable PyExpression receiver,
     @NotNull TypeEvalContext context) {
   if (receiver != null) {
     // TODO: Currently we substitute only simple subclass types, but we could handle union and
     // collection types as well
     if (returnType instanceof PyClassType) {
       final PyClassType returnClassType = (PyClassType) returnType;
       if (returnClassType.getPyClass() == getContainingClass()) {
         final PyType receiverType = context.getType(receiver);
         if (receiverType instanceof PyClassType
             && PyTypeChecker.match(returnType, receiverType, context)) {
           return returnClassType.isDefinition()
               ? receiverType
               : ((PyClassType) receiverType).toInstance();
         }
       }
     }
   }
   return returnType;
 }