Компиляция: предупреждения, прагмы
Предупреждения
По умолчанию выдаются предупреждения:
-
Использование устаревших конструкций, которые будут удалены в ближайшее время.
-
Использование (определение) неизвестной прагмы.
-
Использование (определение) прагмы, которая ощутимо влияет на ход компиляции:
_pragma_jvm_export,_pragma_jvm_forced_compilation,_pragma_strict_unfold. -
Помощь, которая выдаётся при использовании (определении) прагмы
_pragma_info.
Текущие предупреждения:
Несколько as в одном шаге:
def main = {
1.3 as a as b.println(a + " " + b)
}
Возможное исправление:
def main = {
1.3 as a.println(a + " " + a)
}
Использование $ в правой части от = в case или else:
def main = {
123.{
case x = println(s"value is #{$}")
else = $
}
}
Это ошибка в коде, $ в правой части всегда unit, а не контекст всего case-блока (не 123, как можно было бы ожидать).
Прагмы-структуры
Это структуры, которые определяются в любом месте приложения-программы. Имена прагма-структур начинаются с _pragma_ (нужно использовать обратные кавычки вокруг имени). Прагма-структура не должна содержать поля.
Пример:
struct `_pragma_all_warnings` // в обратных кавычках
def test(a: Int) = 123 // неиспользуемая a
def main = {}
Далее рассмотрены прагма-структуры, добавляющие предупреждения.
_pragma_cardinality_warning
_pragma_compare_warning
Предупреждение об ошибочных сравнениях (разные типы или множественные значения).
struct `_pragma_compare_warning`
def main = {
println: 1 < "abc"
println: 1 < (1, 2)
}
Исправление зависит от решаемой задачи. Может быть и ошибочный код.
_pragma_context_this_unit_warning
Предупреждение об использовании this или unit после точки.
struct `_pragma_context_this_unit_warning`
def Int test = {
println: 1..3.this
}
def main = {
777.test
println: 1..3.unit
}
Возможное исправление:
struct `_pragma_context_this_unit_warning`
def Int test = {
println: 1..3.{ this }
}
def main = {
777.test
println: 1..3.{ unit }
}
_pragma_context_warning
_pragma_contextless_warning
Предупреждение о вызове методов без контекста, но справа от точки
struct `_pragma_contextless_warning`
def test = 123
trait Test
struct Str(string: String)
def main = {
println: unit.test
println: unit.Test(123)
println: unit.Str("abc")
}
Возможное исправление:
struct `_pragma_contextless_warning`
def test = 123
trait Test
struct Str(string: String)
def main = {
println: unit.{ test }
println: unit.{ Test(123) }
println: unit.{ Str("abc") }
}
_pragma_dynamic_warning
Предупреждение о динамическом преобразовании, которое никогда не произойдет.
struct `_pragma_dynamic_warning`
def main = {
fix a: Int = 123
println: a.*{
case str: String = str // предупреждение
else = "?"
}
println: a.*dyn[String] // предупреждение
}
Исправление зависит от решаемой задачи. Возможна и ошибка кода.
_pragma_empty_step_warning
Предупреждение об использование шага обработки пустоты.
struct `_pragma_empty_step_warning`
def main = {
fix i1: Int? = 123
println: i1.?(-1).($ + 777)
fix i2: Int? = ()
println: i2.?(-1).($ + 777)
}
Возможное исправление:
struct `_pragma_empty_step_warning`
def main = {
fix i1: Int? = 123
println: i1.*onEmpty(-1): #(x){x + 777}
fix i2: Int? = ()
println: i2.*onEmpty(-1): #(x){x + 777}
}
_pragma_lambda
_pragma_method_0_call
_pragma_old_dyn_warning
Предупреждение о dyn без полного типа.
struct `_pragma_old_dyn_warning`
def main = {
fix a: Any* = 123
println: a.*dyn(#!)
println: a.*dyn(#+)
}
Возможное исправление:
struct `_pragma_old_dyn_warning`
def main = {
fix a: Any* = 123
println: a.*dyn(#~)
println: a.*dyn(#~+)
}
Но ещё лучше так:
struct `_pragma_old_dyn_warning`
def main = {
fix a: Any* = 123
println: a.*dyn[Int]
println: a.*dyn[Int+]
}
_pragma_!_call
Использование устаревших вызовов ! без точки.
Все перечисленные прагма-структуры автоматически активируются при включении прагмы всех предупреждений:
_pragma_info
Выдаётся предупреждение, которое содержит список всех прагм, поддерживаемых компилятором.
struct `_pragma_info`
def main: () = {
println("Hello, world!")
}
_pragma_all_warnings
Прагма работает как все включенные прагмы предупреждений
Прагма-структура, которая влияет на процесс компиляции:
_pragma_strict_unfold
_pragma_jvm_forced_compilation
Принудительное преобразование всей программы в байт-код при компиляции (для отлова Method too large)
struct `_pragma_jvm_forced_compilation`
def v = (1,2,3)
def main = ()
def test = {
v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v
v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v
v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v
v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v
v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v
v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v
v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v
v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v
v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v
v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v
v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v
v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v
v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v
v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v
v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v
v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v
v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v
v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v
v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v
v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v
v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v
v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v
v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v
v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v
v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v
v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v
v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v
v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v
v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v
v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v
v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v
v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v
v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v
v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v
}
С указанной прагмой будет ошибка компиляции Method too large [method _default/test defined as libretto/Any _default/test].
Прагмы-методы
Это методы, которые определяются в любом месте приложения-программы, имя которых начинаются с _pragma_ (нужно использовать обратные кавычки).
_pragma_jvm_export
Тело метода _pragma_jvm_export должно быть литералом строки, которая задает каталог для экспорта класс-файлов во время компиляции.
def `_pragma_jvm_export` =
<<d:\123>> // путь должен быть до реального каталога
def main = {
}