所以我用谷歌搜索了一下,但除了稀疏之外没有其他信息:
-Yrangepos Use range positions for syntax trees.
行。而且我知道如果我想在宏中捕获源片段,我需要使用它。
现在我的两个问题是:
- 为什么默认情况下不启用?
- 使用它是否有任何副作用(例如增加类文件大小)?
所以我用谷歌搜索了一下,但除了稀疏之外没有其他信息:
-Yrangepos Use range positions for syntax trees.
行。而且我知道如果我想在宏中捕获源片段,我需要使用它。
现在我的两个问题是:
当 makro 拼写为 Burmak(r)o 时引入-Yrangepos
的问题是由您的用例引起的。
A-X
选项表示永久性,而 a-Y
可能随时消失,这意味着它可能成为默认行为。
也许它没有因为错误和崩溃。
范围位置 [马丁]
尊重范围位置 - ide 中的衰减与类型器或解析器中的转换不尊重范围位置有关
- 每次签入更改 - 自动检查范围位置
- range position = 不仅仅是一个位置点,而是开始和结束,包含在树节点中(RangePosition 是 Position 的子类)
- CompilationUnit 中有 RangePositions 的地图
不变量:
- 子节点的范围位置包含在父节点的范围pos中
- 无重叠(透明范围位置除外)
- rangepos 覆盖整个程序
问题:
- 模板
- 为了
检查文件包含职位
rangeposition(start,point,end).focus == offsetposition(point) // 脱离非重叠不变式
2012年,PR验证-Yrangepos
频繁失败;它已修复,但变成了夜间验证以减少资源。
休伯特提供了这些笔记:
关于rangepos的一些事情:
- 如果您尝试使用 'scalac -Ybrowse:typer -Yrangepos FILE.scala' 运行任何代码,您会看到大多数树都有范围位置。
- 有些人没有,是的,这有点不幸,但我们正在努力改进这一点 - 实际上,每当你在 Yrangepos 模式下发现这样的情况时,它可能是一个错误。从 2.9 到 2.10.0-snapshots,情况有了显着改善。
- 句法树通常被分配偏移位置(这是你可能遇到的,但我必须看一个例子)
- 对于编译器,我们只关心范围位置是否对(包括)typer 有效。在那之后,我们不在乎。根据我所见,您在 refcheck 之后运行您的工具,这可能会干扰 refcheck 中发生的一些转换,这些转换可以操纵/分配范围或偏移位置。
切换到范围位置似乎很容易,因为基本数学,但仍然存在像这样的错误,表明在合成或重组树时分配位置涉及额外的劳动。
尽管表示编译器需要范围位置,但它们并不是批处理编译的关键路径。有了更多资源来提高稳健性,也许他们可以翻转开关。
我只能猜测scalac
默认情况下出于性能原因不使用范围位置。
在常规编译中,位置仅用于错误报告和将行号信息保存到类文件中。偏移位置足以做到这一点,所以没有必要做所有操作范围位置所需的工作。
我认为范围位置除了简单的编译速度之外不会产生任何其他成本。