sbt在编译时抛出AssertionError,并出现无法识别的错误消息

问题描述

在对代码进行一些小的更改之后,尝试重新编译sbt项目时,我收到了这些奇怪的错误消息。有时,根据所编辑的代码,在清理sbt项目后该错误会消失,但其他时候该错误仍然存​​在。

错误显示方式(但不会持续存在)的一个示例

将此方法添加到Terrain类并进行编译会产生一条错误消息,该消息在清理项目并重新编译后消失:

def genChunkInputData(p: Vector3i): FloatBuffer = {
    val inputData = MemoryUtil.memAllocFloat(4 * (Chunk.SIZE+ 1) * (Chunk.SIZE+ 1) * (Chunk.SIZE+ 1))
    val r = (0 to Chunk.SIZE + 1)
    for (i <- r; j <- r; k <- r) {
        inputData.put(0.1F + 0.5F*min(i,Chunk.SIZE - i).toFloat/ Chunk.SIZE). //RED
                  put(0.1F + 0.5F*min(j,Chunk.SIZE - j).toFloat/ Chunk.SIZE). //GREEN
                  put(0.1F + 0.5F*min(k,Chunk.SIZE - k).toFloat/ Chunk.SIZE).//BLUE
                  put(isovalue((i + p(2)*Chunk.SIZE).todouble,(j + p(1)*Chunk.SIZE).todouble,(k + p(0)*Chunk.SIZE).todouble)) //ISovalUE
    }
    inputData.flip()
    inputData
}

以下是错误消息中的一些摘要

[error] ## Exception when compiling 21 sources to D:\Computer science\Scala\Meandering Depths\target\scala-2.13\classes
    [error] java.lang.AssertionError: assertion Failed:
    [error]   List(method apply$mcI$sp,method apply$mcI$sp)
    [error]      while compiling: D:\Computer science\Scala\Meandering Depths\src\main\scala\game\Terrain.scala
    [error]         during phase: globalPhase=specialize,enteringPhase=explicitouter
    [error]      library version: version 2.13.3
    [error]     compiler version: version 2.13.3
    [error]   reconstructed args: 

[error]
[error]   last tree to typer: Select(Ident(r),foreach$mVc$sp)

[error]        tree position: line 77 of D:\Computer science\Scala\Meandering Depths\src\main\scala\game\Terrain.scala
[error]             tree tpe: (f: Int => Unit): Unit
[error]               symbol: (final override) method foreach$mVc$sp in class Range
[error]    symbol deFinition: final override def foreach$mVc$sp(f: Int => Unit): Unit (a MethodSymbol)
[error]       symbol package: scala.collection.immutable
[error]        symbol owners: method foreach$mVc$sp -> class Range
[error]            call site: method $anonfun$genChunkInputData in package game
[error]
[error] == Source file context for tree position ==
[error]
[error]     74     def genChunkInputData(p: Vector3i): FloatBuffer = {
[error]     75         val inputData = MemoryUtil.memAllocFloat(4 * (Chunk.SIZE+ 1) * (Chunk.SIZE+ 1) * (Chunk.SIZE+ 1))
[error]     76         val r = (0 to Chunk.SIZE)
[error]     77         for (i <- r; j <- r; k <- r) {
[error]     78                     inputData.put(0.1F + 0.5F*min(i,Chunk.SIZE - i).toFloat/ Chunk.SIZE). //RED
[error]     79                               put(0.1F + 0.5F*min(j,Chunk.SIZE - j).toFloat/ Chunk.SIZE). //GREEN
[error]     80                               put(0.1F + 0.5F*min(k,Chunk.SIZE - k).toFloat/ Chunk.SIZE).//BLUE
[error] scala.reflect.internal.SymbolTable.throwAssertionError(SymbolTable.scala:170)
[error] scala.reflect.internal.Symbols$Symbol.suchThat(Symbols.scala:2024)[error] scala.tools.nsc.transform.SpecializeTypes$SpecializationTransformer.matchingSymbolInPrefix$1(SpecializeTypes.scala:1573)

但是,在按照以下步骤操作之后,如果您选择从Terrain类中删除方法,它将再次引发类似的错误,但是这一次,源似乎已更改(更改为其他方法,该方法没有问题)之前工作正常)。同样,通过清理构建并重新编译,错误消失了。

以下是错误消息的更改:

[error]   last tree to typer: Function(value $anonfun)
[error]        tree position: line 150 of D:\Computer science\Scala\Meandering Depths\src\main\scala\game\Terrain.scala
[error]             tree tpe: Int => Unit
[error]               symbol: value $anonfun
[error] == Source file context for tree position ==
[error]
[error]    147

[error]    148     private def isovalue(x: Double,y: Double,z: Double): Float = {
[error]    149         var res = -0.1F
[error]    150         for (i <- 0 until 4)
[error]    151             res += amp(i) * noise(i).noise3_XYBeforeZ(freq(i) * x,freqY(i) * y,freq(i) * z).toFloat
[error]    152         res
[error]    153     }

奇怪的是,有时在执行以下步骤之后,添加了一些代码,编译并获得错误,清理构建并重新编译而没有错误,然后删除了所述代码并进行编译以获取新的错误消息,这显然是新的错误可能来自完全不同的类,在此之前,它的表现还不错。

更重要的是,这实际上是我真正的问题,尽管清洁了构建,有时代码更改仍导致错误持续存在。

错误消息告诉我的信息也很多,这也无济于事,令人困惑的是,有时它似乎指向了错误的来源。但是,我必须承认,我不太了解sbt的工作原理,我只是用它来导入一些库,但是以前没有任何问题。

编辑:显然,它是由scala编译器引起的,而不是sbt本身。错误消息似乎与此类似:https://github.com/scala/bug/issues/9578

我已经测试了该链接中的代码,它确实给出了与我的代码相同的错误类型(错误消息中显示的源再次与该错误无关)。我在项目中使用了微风,所以这似乎是问题的根源。我将尝试将其从项目中删除,看看是否仍然出现错误

解决方法

我设法找到了问题的根源,正如预期的那样,它与sbt无关,但与Breeze无关。问题恰恰是此公开问题中的一个:https://github.com/scala/bug/issues/9578

我的解决方法是停止使用DenseVector [Int](现在我正在使用DenseVector [Float],但可能很快会切换到其他线性代数库)。