Nadal raced into a 3-0 lead during the first set after an early scare where his serve was almost broken by the Swiss.
The second set was closer until Nadal broke Federer’s serve twice to extend his lead in the contest on Court Philippe Chartrier.
Federer, who was playing in the tournament for the first time in four years, was broken twice more during the third set as Nadal imperiously strode towards the final.
Nadal has now beaten Federer on every occasion they’ve played at the French Open.
Nadal will either play Novak Djokovic or Dominic Thiem in Sunday’s final.
Speaking after the match, Nadal says: “It means a lot to me to be able to play like this in the final stretch of the clay-court season because I’ve gone through difficult moments,” Nadal told Eurosport.
“I want to congratulate Roger, it’s incredible that he’s maintained this level at 37 years old. He’s probably the best player in history, it’s always a pleasure to play against him.”