Scala 2.11, улучшенный с помощью самых масштабных MustMatchers и Await, вызывает ошибку компилятора «при попытке выполнить lub / glb typevar? F [? T,? B]» - PullRequest
0 голосов
/ 20 мая 2018

Я пытался использовать уточненный с самой высокой скоростью и получаю ошибки компилятора на этапе "typer": trying to do lub/glb of typevar ?F[?T, ?B]

Это моя лучшая попытка минималистического воспроизведенияпроблема с использованием автономного сценария аммонита:

import $ivy.`eu.timepit::refined:0.9.0`
import $ivy.`org.scalatestplus.play::scalatestplus-play:3.1.2`

import org.scalatest.{MustMatchers, WordSpec}

import scala.concurrent.duration._
import scala.concurrent.{Await, Future}

import eu.timepit.refined.auto.autoInfer

class RefinedSpec extends WordSpec with MustMatchers {
  val duration = 500.millis
  val fut = Future.successful("123")
  Await.result(fut, atMost = duration)
}

Если вы внесете одно из следующих изменений в приведенное выше, оно успешно скомпилируется:

  • delete: import eu.timepit.refined.auto.autoInfer
  • удалить: with MustMatchers из определения класса
  • удалить: Await.result(fut, atMost = duration)

Для пояснения, это ошибка компиляции, а не среда выполненияошибка.Первоначальная ошибка возникает в приложении воспроизведения (scala 2.11.11) при выполнении test:compile в sbt, но, вероятно, ее проще воспроизвести с помощью сценария аммонита.

Используемая мной версия аммонита дает версиюинформация:

Welcome to the Ammonite Repl 1.1.2                                                                                    
(Scala 2.11.12 Java 1.8.0_25)

Установлено с использованием:

sudo sh -c '(echo "#!/usr/bin/env sh" && curl -L https://github.com/lihaoyi/Ammonite/releases/download/1.1.2/2.11-1.1.2) > /usr/local/bin/amm && chmod +x /usr/local/bin/amm' && amm

Дополнительные сведения об ошибке из примера аммонита:

scala.reflect.internal.FatalError:
  trying to do lub/glb of typevar ?F[?T, ?B]
     while compiling: fail.sc
        during phase: typer
     library version: version 2.11.12
    compiler version: version 2.11.12
  reconstructed args: -nowarn -Yresolve-term-conflict:object

  last tree to typer: Ident(<argument>)
       tree position: line 15 of fail.sc
            tree tpe: String
              symbol: <none>
   symbol definition: <none> (a NoSymbol)
      symbol package: <none>
       symbol owners:
           call site: class RefinedSpec in object fail in package $file

Из игры SBT test:compile Iтакже получите такой вид вывода:

[error]   last tree to typer: Ident(<argument>)
[error]        tree position: line 13 of ...../RefinedSpec.scala
[error]             tree tpe: String
[error]               symbol: <none>
[error]    symbol definition: <none> (a NoSymbol)
[error]       symbol package: <none>
[error]        symbol owners: 
[error]            call site: class RefinedSpec in package foo in package foo
[error] 
[error] == Source file context for tree position ==
[error] 
[error]     10   val duration = 500.millis
[error]     11   val fut = Future.successful("123")
[error]     12   Await.result(fut, atMost = duration)
[error]     13 }

Это не является серьезной проблемой, так как я могу просто удалить импорт autoInfer, поскольку я на самом деле его не использую.Однако это запутает людей, потому что они склонны делать:

import eu.timepit.refined.auto._

, чтобы получить автоматическое преобразование констант времени компиляции в уточненные типы, когда они, вероятно, могут просто сойти с рук:

import eu.timepit.refined.auto.autoRefineV
...