Just replace property functions with their return type in ExpressionVisitor::visitCall().
This only works for getter-only properties - if there's a setter function for the property (which idiomatically has the same name), visitCall() finds that declaration instead and gives the wrong return type.
Still, it's useful in a good proportion of cases.
To make this work properly, I think we need a specific declaration type for properties, and to update that when visiting the getter/setter instead of creating the function declarations directly in the class?