编译模式匹配时Scalajs中的错误?

时间:2017-10-03 16:14:48

标签: compilation scala.js

我目前无法在最低限度的工作示例中重现这一点,但我正在努力。

在死代码中添加一行会导致运行时崩溃。 以下是相关的代码片段,首先来自scala文件:

// We are inside an object. Expr is a trait with many case classes.
case class Problem(in: Expr, out: Expr)
type RepairOutput = Either[String, Stream[Expr]]

private sealed trait RepairFinalTransform
...
private sealed trait TransformExtend extends RepairFinalTransform {
  def continuation(repair: Problem => RepairOutput)
    : Expr => RepairOutput
}
private case class TransformSolutionAndContinue(f: Expr => (Problem, Expr => Expr)) extends TransformExtend {
  def continuation(repair: Problem => RepairOutput): Expr => RepairOutput = (x: Expr) => f(x) match {
    case (p, rewriter) => repair(p) andMap rewriter
  }
}
private case class TransformAndContinue(f: Expr => RepairOutput) extends TransformExtend {
  def continuation(repair: Problem => RepairOutput): Expr => RepairOutput = f
}

以下代码段

case c: TransformExtend =>
        r = r andThen c.continuation(_repair)

,工作时编译为:

if ($is_Lexample_LambdaCalculus$TransformExtend(x1)) {
    var x5 = $as_Lexample_LambdaCalculus$TransformExtend(x1);
    var e$1 = r;
    r = new $c_Lexample_LambdaCalculus$Retransformer().init___s_util_Either(e$1).andThen__F1__s_util_Either(x5.continuation__F1__F1(new $c_sjsr_AnonFunction1().init___sjs_js_Function1((function($this) {
      return (function(original_problem$2) {
        var original_problem = $as_Lexample_LambdaCalculus$Problem(original_problem$2);
        return $m_Lexample_LambdaCalculus$().$$undrepair__Lexample_LambdaCalculus$Problem__s_util_Either(original_problem)
      })
    })(this))))
  }

但是,只要我在当前从未执行过的地方添加一次TransformAndContinue(???)(我以前没有任何东西),上面的代码就会变成:

if ($is_Lexample_LambdaCalculus$TransformExtend(x1)) {
    var x5 = $as_Lexample_LambdaCalculus$TransformExtend(x1);
    var e$1 = r;
    r = new $c_Lexample_LambdaCalculus$Retransformer().init___s_util_Either(e$1).andThen__F1__s_util_Either(x5.f$1)
}

请注意,x5应该是TransformExtend的类型转换,其中没有字段f,只有continue方法。由于f存在于两个类中,因此其返回类型不同。此外,案例类TransformSolutionAndContinue曾用于其他许多地方,因此没有理由将其调用f而不是continue。 因此,对Javascript的转换似乎是错误的(实际上,错误在这一点上失败)。我使用scalajs 0.6.19并使用fastOptJSscalatest进行编译。

你能告诉我在我的代码中要改变什么,以便编译正确吗?这是一个已知的错误吗?

0 个答案:

没有答案