diff --git a/akka-actor-tests/src/test/scala/akka/util/LineNumberSpec.scala b/akka-actor-tests/src/test/scala/akka/util/LineNumberSpec.scala index 6bbfae40b3..f7ccade54e 100644 --- a/akka-actor-tests/src/test/scala/akka/util/LineNumberSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/util/LineNumberSpec.scala @@ -40,6 +40,10 @@ class LineNumberSpec extends AkkaSpec { LineNumbers(partial) should ===(SourceFileLines("LineNumberSpecCodeForScala.scala", 19, 21)) } + "work for `def`" in { + LineNumbers(method("foo")) should ===(SourceFileLines("LineNumberSpecCodeForScala.scala", 24, 26)) + } + } "writing Java" must { @@ -47,12 +51,12 @@ class LineNumberSpec extends AkkaSpec { "work for small functions" in { // because how java Lambdas are implemented/designed - LineNumbers(l.f1()) should ===(NoSourceInfo) + LineNumbers(l.f1()) should ===(SourceFileLines("LineNumberSpecCodeForJava.java", 19, 19)) } "work for larger functions" in { // because how java Lambdas are implemented/designed - LineNumbers(l.f2()) should ===(NoSourceInfo) + LineNumbers(l.f2()) should ===(SourceFileLines("LineNumberSpecCodeForJava.java", 24, 25)) } "work for anonymous classes" in { diff --git a/akka-actor-tests/src/test/scala/akka/util/LineNumberSpecCodeForScala.scala b/akka-actor-tests/src/test/scala/akka/util/LineNumberSpecCodeForScala.scala index 4958e125d2..699a1075b5 100644 --- a/akka-actor-tests/src/test/scala/akka/util/LineNumberSpecCodeForScala.scala +++ b/akka-actor-tests/src/test/scala/akka/util/LineNumberSpecCodeForScala.scala @@ -20,4 +20,9 @@ object LineNumberSpecCodeForScala { case "a" ⇒ case "b" ⇒ } + + def method(s: String) = () ⇒ { + println(s) + Integer.parseInt(s) + } } diff --git a/akka-actor/src/main/scala/akka/util/LineNumbers.scala b/akka-actor/src/main/scala/akka/util/LineNumbers.scala index a2dd2c8e25..6faea43c88 100644 --- a/akka-actor/src/main/scala/akka/util/LineNumbers.scala +++ b/akka-actor/src/main/scala/akka/util/LineNumbers.scala @@ -3,10 +3,11 @@ */ package akka.util -import java.io.DataInputStream -import scala.annotation.{ switch } +import java.io.{ DataInputStream, InputStream } +import java.lang.invoke.SerializedLambda + +import scala.annotation.switch import scala.util.control.NonFatal -import java.io.InputStream /** * This is a minimized byte-code parser that concentrates exclusively on line @@ -196,10 +197,10 @@ object LineNumbers { val writeReplace = c.getDeclaredMethod("writeReplace") writeReplace.setAccessible(true) writeReplace.invoke(l) match { - // case serialized: SerializedLambda ⇒ - // if (debug) println(s"LNB: found Lambda implemented in ${serialized.getImplClass}:${serialized.getImplMethodName}") - // Option(c.getClassLoader.getResourceAsStream(serialized.getImplClass + ".class")) - // .map(_ -> Some(serialized.getImplMethodName)) + case serialized: SerializedLambda ⇒ + if (debug) println(s"LNB: found Lambda implemented in ${serialized.getImplClass}:${serialized.getImplMethodName}") + Option(c.getClassLoader.getResourceAsStream(serialized.getImplClass + ".class")) + .map(_ -> Some(serialized.getImplMethodName)) case _ ⇒ None } } catch {