blob: 23451c172554ca22d4cdf8c46dc031f225227e8c [file] [log] [blame] [view] [edit]
# Заметки по проекту декомпилятора для Kotlin IR
## ВОПРОСЫ
- FAKE_OVERRIDE если из наследника залезаем в пропертю из родительского Primary конструктора
- Как получить имя класса/инстанса, ссылку на метод которого используем через ::
- Когда нам нужно протаскивать информацию о data в глубину визитора (например, return для лямбды)
## TODO-лист
- функции высших порядков и лямбды (https://kotlinlang.org/docs/reference/lambdas.html): **надо больше тестов**
- Работа со scope functions - https://kotlinlang.org/docs/reference/scope-functions.html **надо больше тестов**
- cast операторы as, as?
- делегирование (https://kotlinlang.org/docs/reference/delegation.html, https://kotlinlang.org/docs/reference/delegated-properties.html)
- typealias со стрелкой (для функций высших порядков)
- кастомные геттер и сеттер
- продолжить дженерики (https://kotlinlang.org/docs/reference/generics.htm l)
- обход дерева и сбор импортов через full qualified names
## 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{...}