Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Компиляция: предупреждения, прагмы

Предупреждения

По умолчанию выдаются предупреждения:

  1. Использование устаревших конструкций, которые будут удалены в ближайшее время.

  2. Использование (определение) неизвестной прагмы.

  3. Использование (определение) прагмы, которая ощутимо влияет на ход компиляции: _pragma_jvm_export, _pragma_jvm_forced_compilation, _pragma_strict_unfold.

  4. Помощь, которая выдаётся при использовании (определении) прагмы _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 = {
}