Подтвердить что ты не робот

Каков эффект -Yrangepos, отличный от того, чтобы указывать исходные местоположения в макросах

Итак, я немного искал, но никакой информации, кроме редкой:

-Yrangepos                     Use range positions for syntax trees.

Ok. И я знаю, что мне нужно использовать его, если я хочу захватить исходные фрагменты в макросе.

Теперь мои два вопроса:

  • Почему это не включено по умолчанию?
  • Есть ли побочные эффекты для его использования (например, увеличение размера файла класса)?
4b9b3361

Ответ 1

Проблема введение -Yrangepos назад, когда была написана макро Burmak (r) o мотивирована вашим прецедентом.

Опция

A -X указывает на постоянство, в то время как a -Y может исчезнуть в любое время, что означает, что он может стать поведением по умолчанию.

Возможно, это не из-за ошибок и сбоев.

В собрание команды, написанное маврами:

Позиции диапазона [martin]

Уважение позиций диапазона - распад в идее, который имеет отношение к факт, что преобразования в typer или parser не учитывают диапазон позиции

  • каждый проверенный в изменении - автоматически проверяет позиции позиций
  • позиции диапазона = не только позиция позиции, но начало и конец, содержащиеся в узлах дерева (RangePosition - подкласс позиции)
  • есть карта RangePositions в CompilationUnit

инварианты:

  • Диапазоны позиций дочерних узлов содержатся в диапазоне pos родительских узлов
  • нет перекрытия (кроме прозрачных позиций диапазона)
  • rangepos охватывает всю программу

проблемы:

  • Шаблоны
  • для

проверить файлы содержат позиции

rangeposition (начало, точка, конец).фокус == offsetposition (point)// выход из инварианта без перекрытия

В 2012 году валидация PR с помощью -Yrangepos часто не выполнялась; он был исправлен, но превратился в ночную проверку, чтобы уменьшить ресурсы.

Hubert предложил следующие примечания:

Несколько вещей о rangepos:

  • Если вы попытаетесь запустить любой код с помощью "scalac -Ybrowse: typer -Yrangepos FILE.scala", вы увидите, что большинство деревьев имеют позиции дальности.
  • некоторые из них не так, да, это немного неудачно, но мы пытаемся улучшить это - фактически всякий раз, когда вы находите такое в режиме Yrangepos, возможно, что это ошибка. Ситуация резко улучшилась из 2.9 до 2.10.0-моментальных снимков.
  • Синтаксические деревья часто назначаются офсетными позициями (это то, что вы могли бы испытывать, но мне нужно было бы увидеть пример)
  • для компилятора нам все равно, если позиции диапазона действительны вплоть до (и включая) typer. после этого нам все равно. Вы управляете своим инструмент после рефлексов из того, что я вижу, это может помешать пара преобразований, которые происходят в refchecks, которые могут манипулировать/назначать позиции диапазона или смещения.

Казалось бы, легко переключиться на позиции диапазона, потому что основная математика, но все еще есть ошибки как этот, которые демонстрируют дополнительный труд при назначении позиций при синтезе или реструктуризации дерева.

Хотя для представления компилятора необходимы позиции диапазона, они не находятся в критическом пути для пакетной компиляции. С большим количеством ресурсов для повышения надежности, возможно, они могут перевернуть переключатель.

Ответ 2

Я могу только предположить, что scalac по умолчанию не использует позиции диапазона по соображениям производительности.

В регулярной компиляции позиции используются только для сообщения об ошибках и сохранения информации о номере линии в файлах классов. Смещение позиций достаточно для этого, поэтому нет смысла выполнять всю работу, необходимую для управления позициями диапазона.

Я не думаю, что позиции диапазона несут какую-либо другую стоимость, кроме простой скорости компиляции.