我目前无法在最低限度的工作示例中重现这一点,但我正在努力。
在死代码中添加一行会导致运行时崩溃。 以下是相关的代码片段,首先来自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
并使用fastOptJS
和scalatest
进行编译。
你能告诉我在我的代码中要改变什么,以便编译正确吗?这是一个已知的错误吗?