【发布时间】:2013-12-02 15:20:09
【问题描述】:
我正在尝试让 Scala 解释器工作的代码完成。理想情况下,它的工作方式与 REPL (ILoop) 提供的相同。我使用文本文档作为源,所以我不想实例化 ILoop 而只是 IMain。
在以下示例中,补全仅适用于特殊情况:
import scala.tools.nsc.interpreter.{JLineCompletion, IMain}
import scala.tools.nsc.Settings
object CompletionTest extends App {
val settings = new Settings
settings.usejavacp.tryToSetFromPropertyValue("true")
val intp = new IMain(settings)
intp.initializeSynchronous()
assert(intp.isInitializeComplete)
val comp = new JLineCompletion(intp)
val completer = comp.completer()
val buffer = "val x = Indexe"
val choices = completer.complete(buffer, buffer.length)
println("----BEGIN COMPLETION----")
choices.candidates.foreach(println)
println("----END COMPLETION----")
intp.close()
}
预期的输出是IndexedSeq,但它是空的。如果我将缓冲区设置为 Indexe,它就可以工作。如果我将缓冲区设置为 Indexe(前导空格),则完成候选者再次为空。
因此在处理缓冲区或调用完成时必须涉及一个额外的步骤。在 REPL 中按下 <tab> 时究竟会发生什么?似乎几乎不可能弄清楚调用了哪些方法......
【问题讨论】:
-
我尝试改用
ILoop,出现同样的问题。所以一定是我调用完成者的方式是错误的或不充分的。
标签: scala autocomplete interpreter read-eval-print-loop