加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala演示编译器 – 最小示例

发布时间:2020-12-16 09:47:37 所属栏目:安全 来源:网络整理
导读:有人可以提供使用当前scala演示编译器(即scala.tools.nsc.interactive.Global)的一个最小示例,它完成以下任务? 编译单个虚拟源文件(即不在文件系统中,但例如String) 从编译器检索所有阶段的结果信息 将源文件中的更改传播到编译器 可能异步地接收进一步的
有人可以提供使用当前scala演示编译器(即scala.tools.nsc.interactive.Global)的一个最小示例,它完成以下任务?

>编译单个虚拟源文件(即不在文件系统中,但例如String)
>从编译器检索所有阶段的结果信息
>将源文件中的更改传播到编译器
>可能异步地接收进一步的信息

似乎有很多波动的nsc和我找不到最新的小例子。所以我非常感谢您的帮助。

解决方法

好吧,一个星期的100赏金,仍然没有答案,所以我会尝试它自己…编辑是非常非常欢迎!

演示编译器的关键类是scala.tools.nsc.interactive.Global。所以开始,我们需要创建一个编译器的实例。

import scala.tools.nsc.interactive.Global
class PresentationCompiler { // we want the compiler output to be virtual val target = new VirtualDirectory("",None)
// need to be adjusted in order to work with // sbt. See 07000. val settings = new Settings() // output to virtual target settings.outputDirs.setSingleOutput(target)
// can be replaced by a custom instance // of AbstractReporter to gain control. val reporter = new ConsoleReporter(settings)
val compiler = new Global(settings,reporter)
... }

对于设置the link provided by Abhishek是非常有价值的。

但现在有趣的部分:

1.编译单个虚拟源文件

要编译String,可以使用底层的VirtualFile创建一个BatchSourceFile。 api在这里被标记为实验,似乎不完整。

def compile(code: String) {
  val source = new BatchSourceFile("<virtual>",code)
  val response = new Response[Unit]
  compiler.askReload(List(source),response)    
  response.get.left.foreach { _ =>
    // success
  }
}

2.从编译器检索所有阶段的结果信息

这是棘手的部分。由于编译器的多线程性质以及标志在不同阶段被重用为具有不同含义的事实,因此不可能一次获得所有内容。基本上你将不得不诉诸于在API中记录的askSomething种方法。例如:

val tcompletion = new Response[List[global.Member]]      
val pos = compiler.ask(() => new OffsetPosition(source,p))
global.askTypeCompletion(pos,tcompletion)
tcompletion.get(5000).get match {
  case Left(members) => // do something with members
  case Right(e) =>
    e.printStackTrace
}

3.将源文件中的更改传播到编译器

这是有趣的部分,我想知道这个问题。我真的不会得到这个,因为BatchSourceFile被描述为一个文件,内容不随时间改变。所以一个自定义的实现SourceFile将需要提供?为什么不在交互式包中。我相信我只是没有抓到什么东西。

所以我的解决方案现在是再次调用compile方法。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读