Skip to content

Position#sourceCode throw StringIndexOutOfBoundsException #14785

Closed
@xuwei-k

Description

@xuwei-k

Compiler version

3.1.3-RC1-bin-20220325-6f3fe05-NIGHTLY

Minimized code

build.sbt

scalaVersion := "3.1.3-RC1-bin-20220325-6f3fe05-NIGHTLY"

libraryDependencies += "org.scala-lang" %% "scala3-tasty-inspector" % scalaVersion.value

run / fork := true

Main.scala

package example

import scala.quoted.*
import scala.tasty.inspector.Inspector
import scala.tasty.inspector.Tasty
import scala.tasty.inspector.TastyInspector

object Main {
  val inspector = new Inspector {
    def inspect(using Quotes)(tastys: List[Tasty[quotes.type]]): Unit = {
      import quotes.reflect.*
      val traverser = new TreeTraverser {
        override def traverseTree(tree: Tree)(owner: Symbol): Unit = {
          tree.pos.sourceCode
          super.traverseTree(tree)(owner)
        }
      }

      tastys.foreach { tasty =>
        val tree = tasty.ast
        traverser.traverseTree(tree)(tree.symbol)
      }
    }
  }

  def main(args: Array[String]): Unit = {
    val classpath = System.getProperty("java.class.path").split(':').toList
    val jar = classOf[dotty.tools.dotc.Compiler].getProtectionDomain.getCodeSource.getLocation.getPath
    TastyInspector.inspectAllTastyFiles(
      tastyFiles = Nil,
      jars = jar :: Nil,
      dependenciesClasspath = classpath
    )(inspector)
  }
}

Output

[info] java.lang.StringIndexOutOfBoundsException: String index out of range: 619 while compiling /Users/kenji/inspector-pos-sourceCode-StringIndexOutOfBoundsException/target/bg-jobs/sbt_e8347122/target/450d1dfe/c07e34d8/scala3-compiler_3-3.1.3-RC1-bin-20220325-6f3fe05-NIGHTLY.jar
[error] Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 619
[error] 	at java.lang.String.<init>(String.java:205)
[error] 	at scala.quoted.runtime.impl.QuotesImpl$reflect$PositionMethods$.sourceCode(QuotesImpl.scala:2820)
[error] 	at scala.quoted.runtime.impl.QuotesImpl$reflect$PositionMethods$.sourceCode(QuotesImpl.scala:2818)
[error] 	at example.Main$$anon$2.traverseTree(Main.scala:14)
[error] 	at example.Main$.example$Main$$anon$1$$_$inspect$$anonfun$1(Main.scala:21)
[error] 	at scala.runtime.function.JProcedure1.apply(JProcedure1.java:15)
[error] 	at scala.runtime.function.JProcedure1.apply(JProcedure1.java:10)
[error] 	at scala.collection.immutable.List.foreach(List.scala:333)
[error] 	at example.Main$$anon$1.inspect(Main.scala:21)
[error] 	at scala.tasty.inspector.TastyInspector$TastyInspectorPhase$1.runOnImpl(TastyInspector.scala:78)
[error] 	at scala.tasty.inspector.TastyInspector$TastyInspectorPhase$1.runOn(TastyInspector.scala:70)
[error] 	at dotty.tools.dotc.Run.runPhases$1$$anonfun$1(Run.scala:225)
[error] 	at scala.runtime.function.JProcedure1.apply(JProcedure1.java:15)
[error] 	at scala.runtime.function.JProcedure1.apply(JProcedure1.java:10)
[error] 	at scala.collection.ArrayOps$.foreach$extension(ArrayOps.scala:1328)
[error] 	at dotty.tools.dotc.Run.runPhases$1(Run.scala:236)
[error] 	at dotty.tools.dotc.Run.compileUnits$$anonfun$1(Run.scala:244)
[error] 	at dotty.tools.dotc.Run.compileUnits$$anonfun$adapted$1(Run.scala:253)
[error] 	at dotty.tools.dotc.util.Stats$.maybeMonitored(Stats.scala:68)
[error] 	at dotty.tools.dotc.Run.compileUnits(Run.scala:253)
[error] 	at dotty.tools.dotc.Run.compileUnits(Run.scala:192)
[error] 	at dotty.tools.dotc.fromtasty.TASTYRun.compile(TASTYRun.scala:14)
[error] 	at dotty.tools.dotc.Driver.doCompile(Driver.scala:35)
[error] 	at dotty.tools.dotc.Driver.process(Driver.scala:195)
[error] 	at dotty.tools.dotc.Driver.process(Driver.scala:163)
[error] 	at dotty.tools.dotc.Driver.process(Driver.scala:175)
[error] 	at scala.tasty.inspector.TastyInspector$.inspectFiles(TastyInspector.scala:117)
[error] 	at scala.tasty.inspector.TastyInspector$.inspectAllTastyFiles(TastyInspector.scala:59)
[error] 	at example.Main$.main(Main.scala:33)
[error] 	at example.Main.main(Main.scala)
[error] Nonzero exit code returned from runner: 1
[error] (Compile / run) Nonzero exit code returned from runner: 1

Expectation

return None

Note

https://github.com/lampepfl/dotty/blob/6f3fe057894de043b355661896bc35b815d9fd4c/compiler/src/scala/quoted/runtime/impl/QuotesImpl.scala#L2818-L2820

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions