diff --git a/compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala b/compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala index b053b0ea777f..f7b56c246b8c 100644 --- a/compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala +++ b/compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala @@ -1399,7 +1399,7 @@ class TreeUnpickler(reader: TastyReader, if (path.nonEmpty) { val sourceFile = ctx.getSource(path) posUnpicklerOpt match - case Some(posUnpickler) => + case Some(posUnpickler) if !sourceFile.initizlized => sourceFile.setLineIndicesFromLineSizes(posUnpickler.lineSizes) case _ => pickling.println(i"source change at $addr: $path") diff --git a/compiler/src/dotty/tools/dotc/util/SourceFile.scala b/compiler/src/dotty/tools/dotc/util/SourceFile.scala index 73fd53289a9b..c1977f99e5c9 100644 --- a/compiler/src/dotty/tools/dotc/util/SourceFile.scala +++ b/compiler/src/dotty/tools/dotc/util/SourceFile.scala @@ -144,6 +144,9 @@ class SourceFile(val file: AbstractFile, computeContent: => Array[Char]) extends if lineIndicesCache eq null then lineIndicesCache = calculateLineIndicesFromContents() lineIndicesCache + + def initizlized = lineIndicesCache != null + def setLineIndicesFromLineSizes(sizes: Array[Int]): Unit = val lines = sizes.length val indices = new Array[Int](lines + 1) diff --git a/scaladoc/test-source-links/dotty/tools/scaladoc/source-links/RemoteLinksTest.scala b/scaladoc/test-source-links/dotty/tools/scaladoc/source-links/RemoteLinksTest.scala index 1a9831ec8bad..1e8a1227235d 100644 --- a/scaladoc/test-source-links/dotty/tools/scaladoc/source-links/RemoteLinksTest.scala +++ b/scaladoc/test-source-links/dotty/tools/scaladoc/source-links/RemoteLinksTest.scala @@ -38,8 +38,9 @@ class RemoteLinksTest: def runTest = assertTrue(mtslAll.nonEmpty) val mtsl = randomGenerator.shuffle(mtslAll).take(80) // take 80 random entries - val pageToMtsl: Map[String, List[(String, String)]] = mtsl.groupMap(_._2.split("#L").head)(v => (v._1, v._2.split("#L").last)) - pageToMtsl.foreach { case (link, members) => + val pageToMtsl: Map[String, List[(String, Int)]] = + mtsl.groupMap(_._2.split("#L").head)(v => (v._1, v._2.split("#L").last.toInt)) + pageToMtsl.toSeq.sortBy(_._1).foreach { case (link, members) => try val doc = getDocumentFromUrl(link) println(s"Checking $link") @@ -47,7 +48,7 @@ class RemoteLinksTest: if !member.startsWith("given_") then // TODO: handle synthetic givens, for now we disable them from testing val toLine = expectedLine + 3 val memberToMatch = member.replace("`", "") - val lineCorrectlyDefined = (expectedLine.toInt until toLine.toInt).exists{ line => + val lineCorrectlyDefined = (expectedLine until toLine).exists{ line => val loc = doc.select(s"#LC$line").text loc.contains(memberToMatch)