From 12f978413865df178cec40c9b272aae2a81cd86a Mon Sep 17 00:00:00 2001 From: Sanny Sanoff Date: Sat, 9 Jul 2016 20:14:40 +0300 Subject: [PATCH] this fixes long standing issues with stepping through and setting breakpoints in the scala/async async code. bug happens because NamePattern.forElement(elem) returns nothing for async psi elements, and as a result method returns zero candidate classes for given SourcePosition. nothing in NamePattern.forElement(elem) is returned because it doesn't know that async methods generate classes (in our case, classes generated are named Basename$statemachine$...). I think the logic that filters out our case in NamePattern.forElement(elem) should be improved but I don't know how. but creating NamePattern directly helps. Although filter is more loose and may falsely accept more cases, hasLocations(refType: ReferenceType, position: SourcePosition) seems to be strict enough to filter out the only one correct class from generated statemachine. --- .../plugins/scala/debugger/ScalaPositionManager.scala | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/org/jetbrains/plugins/scala/debugger/ScalaPositionManager.scala b/src/org/jetbrains/plugins/scala/debugger/ScalaPositionManager.scala index 11bcc39566d..e020aa6c90d 100644 --- a/src/org/jetbrains/plugins/scala/debugger/ScalaPositionManager.scala +++ b/src/org/jetbrains/plugins/scala/debugger/ScalaPositionManager.scala @@ -125,8 +125,7 @@ class ScalaPositionManager(val debugProcess: DebugProcess) extends PositionManag val delayedBodyName = if (isDelayedInit(td)) Seq(s"$qName$delayedInitBody") else Nil (qName +: delayedBodyName).foreach(addExactClasses) case elem => - val namePattern = NamePattern.forElement(elem) - namePatterns ++= Option(namePattern) + namePatterns ++= Option(NamePattern.forElement(elem)).orElse(Some(new NamePattern(elem))) } } val packageName: Option[String] = Option(inReadAction(file.asInstanceOf[ScalaFile].getPackageName))