Logically, there is no reason to restrict this processing to the case of "child.getChild(0) instanceof AbstractJoinPlanNode". 
"Push limits below projections" is currently a universally applicable optimization that also applies to projections whose child is a scan or aggregate or anything else.