除了在宏

时间:2017-09-01 20:41:27

标签: scala scala-compiler

所以我googl'ed了一点,但除了稀疏之外没有其他信息:

-Yrangepos                     Use range positions for syntax trees.

确定。而且我知道如果我想在宏中捕获源片段,我需要使用它。

现在我的两个问题是:

  • 为什么默认情况下不启用?
  • 使用它有任何副作用(例如增加类文件大小)?

2 个答案:

答案 0 :(得分:4)

当makro拼写为Burmak(r)o时,问题introducing -Yrangepos会被您的用例所激励。

-X选项表示持久性,而-Y可能随时消失,这意味着它可能成为默认行为。

也许因为bugs and crashes而没有。

a team meeting written up by Moors

  

范围位置[马丁]

     

尊重范围位置 - 与ide有关的ide衰变   事实上,typer或parser中的转换不符合范围   位置

     
      
  • 每次检查更改 - 自动检查范围位置
  •   
  • 范围位置=不仅仅是一个位置点,而是开始和结束,包含在树节点中(RangePosition是Position的子类)
  •   
  • CompilationUnit中有RangePositions的地图
  •   
     

不变量:

     
      
  • 子节点的范围位置包含在父节点的范围pos
  • 中   
  • 无重叠(透明范围位置除外)
  •   
  • rangepos cover整个程序
  •   
     

问题:

     
      
  • 模板
  •   
  •   
     

检查文件包含位置

     

rangeposition(start,point,end).focus == offsetposition(point)//   从非重叠不变量中逃脱

2012年,-Yrangepos的PR验证频繁失败;它已修复,但turned into a nightly validation可以减少资源。

Hubert offered these notes

  

关于rangepos的一些事情:

     
      
  • 如果您尝试使用&scalac -Ybrowse运行任何代码:typer -Yrangepos FILE.scala'你会看到大多数树木都有射程。
  •   
  • 有些人不,是的,这有点不幸,但我们正在努力改进 - 实际上每当你在Yrangepos模式中找到它时   可能是一个bug。情况有了很大改善   从   2.9到2.10.0-snapshots。
  •   
  • 语法树通常被赋予偏移位置(这是你可能正在经历的东西,但我必须看到一个   例如)
  •   
  • 对于编译器,我们只关心范围位置是否有效(包括)typer。在那之后,我们不在乎。你正在运行你的   从我所看到的内容重新检查之后的工具,这可能会干扰一个   可以在重新检查中发生的一些转换   操纵/指定范围或偏移位置。
  •   

切换到范围位置似乎很容易,因为基本数学,但在合成或重构树时,仍有错误like this one在分配位置时显示the extra labor involved

虽然演示编译器需要范围位置,但它们不在批处理编译的关键路径中。有了更多的资源来提高稳健性,也许他们可以翻转开关。

答案 1 :(得分:1)

我只能猜测默认情况下scalac出于性能原因不使用范围位置。

在常规编译中,职位仅用于错误报告并将行号信息保存到类文件中。偏移位置足以做到这一点,因此完成操纵范围位置所需的所有工作毫无意义。

我认为范围位置不会产生任何其他成本,而不是简单的编译速度。