Заметки по проекту декомпилятора для Kotlin IR

ВОПРОСЫ

  • FAKE_OVERRIDE если из наследника залезаем в пропертю из родительского Primary конструктора
  • Как получить имя класса/инстанса, ссылку на метод которого используем через ::
  • Когда нам нужно протаскивать информацию о data в глубину визитора (например, return для лямбды)

TODO-лист

LATER

  • when с множественным условием через запятую

  • расстановка скобок для логических операторов !, &&, ||

  • использовать abbrevation при выводе типа для typealias

  • override fun - проверять overridenSymbols (если visibility и modality не отличаются от родительских, то не пишем их)

  • когда у проперти нет BackingField

  • как обращаться к исключению в теле catch

DONE

  • локальные классы
  • return when (varName) - block с WHEN в origin
  • companion object, именованный object, top-level object
  • inner, nested классы.
  • nullable типы
  • enum
  • break, continue
  • package
  • аргументы по-умолчанию в методах, именованые вызовы с перестановкой аргументов
  • data class + destructing declarations
  • varargs
  • аргументы по-умолчанию в конструкторах, именованые вызовы с перестановкой аргументов
  • рефакторинг
  • секции инициализации
  • super и instance вызовы в конструкторе/методе
  • primary конструкторы
  • наследование (при наследовании отрисовать вызов primary конструктора родителя)
  • реализация интерфейсов (в т.ч множественная)
  • extension properties
  • оператор is, !is в ветке when
  • создание экземпляров класса через вызовы конструкторов
  • получение свойства экземпляра, инициализированной в конструкторе
  • try/catch
  • typealias
  • интерполяция строк для getValue и костант (надо придумать как унифицировать, а не через when)

В интерфейсах можно не обрабатывать modality return try - ветка finally без явного return не возвращается IrDelegatingConstructorCall

  • у primary - только отличный от Any родитель (запись : ParentClass())
  • secondary конструктор по цепочке должен доделегироваться до primary
  • secondary - если нет primary, то для return when(...) использовать return run{...}