CHICAGO -- Andrew Heaney began the season on the disabled list with an elbow injury. Now, the 27-year-old left-hander is on the verge of finishing with a slew of career bests.
Yoan Moncada had two hits for the White Sox, who have dropped five straight.
Heaney is 2-1 with a 1.89 ERA and 23 strikeouts in his last three starts. He has set career highs in wins, starts (27), innings pitched (165) and strikeouts (161) this season.
"That's a terrific game from Andrew," Angels manager Mike Scioscia said. "As we continue to see him get his stamina as this year's progressed, he's finished strong and might have some more left in him."
After giving up a hit to Tim Anderson leading off the first, Heaney retired 11 straight. The streak was broken when Matt Davidson struck out swinging leading off the fifth but reached as the ball got by catcher Jose Briceno for a wild pitch. Only one Chicago runner reached second base against Heaney.
"I was throwing some backdoor breaking balls better than I normally do, so I kind of leaned on that more and then threw the changeup after that," he said. "I was able to put some guys away with heaters late."
Chicago starter Reynaldo Lopez threw six scoreless innings. He gave up two hits, struck out 10 and walked three before being lifted after 105 pitches.
The 24-year-old right-hander has allowed just two runs over 20 innings in his last three starts.
"I'm feeling good. I feel strong," Lopez said through a translator. "My mindset in every outing is go at least six. If I can go more, that's even better. Go at least six and try to finish strong."
The Angels took advantage of Lopez's departure by pushing across a run in the seventh. Jose Fernandez led off with a single against Ian Hamilton (0-1) and advanced on a groundout. With two outs, Caleb Frare came in to face Calhoun in a lefty-lefty matchup. The move didn't work out as Calhoun singled to right to score Fernandez.
The White Sox threatened in the ninth.
Pinch-hitter Yolmer Sanchez led off with a single and moved to second on a wild pitch with one out. Parker then hit Davidson, and a flyout put runners at the corners.
Alvarez was brought in to face pinch-hitter Nicky Delmonico and struck him out to end the game.
Justin Upton struck out in all four of his at-bats, but contributed with a sliding catch in left on a liner by Anderson to end the eighth. Moncada was on second and would have scored the tying run if the ball dropped in.
"When the ball was hit off the bat, we thought it was a base hit," Scioscia said. "Justin got a great jump, came right in and made a terrific catch."
Angels: OF/P Shohei Ohtani (bruised right thigh) started at DH on Sunday and went 1 for 3 with a walk. He was injured Saturday night when he collided with Chicago pitcher Thyago Vieira while sliding into home plate.
White Sox: 1B Jose Abreu (testicular surgery) took ground balls and ran sprints on Sunday. Manager Rick Renteria said Abreu may return to the lineup Monday night at Kansas City.
More AP MLB: https://apnews.com/tag/MLB and https://twitter.com/AP-Sports
Manfred: MLB could use pitch clock on Opening Day
Rob Manfred explains MLB's decision to test a pitch clock in spring training and discusses the fractured relationship between the league and MLBPA.
Pujols: 'My goal is to be ready for March 29th'
Albert Pujols says he knows exactly what he needs to do to be healthy and help the Angels win a championship.
Robinson Cano says he feels 25, not 36, as he reports to Mets
New York Mets infielder Robinson Cano had a youthful perspective after reporting to spring training with the New York Mets.
Madison Bumgarner says he was joking over opener refusal
Madison Bumgarner was joking when he told manager Bruce Bochy he absolutely refuses to pitch behind an opener.
Ryan Zimmerman not surprised Bryce Harper, Manny Machado unsigned
Ryan Zimmerman finds it odd that so many teams now feel the need to announce they are trying to win.
Reliever Aaron Loup agrees to 1-year, $1.4M deal with Padres
Left-hander Aaron Loup and the San Diego Padres have agreed to a one-year contract that guarantees $1.4 million, a deal that includes a team option for 2020.