Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 8 additions & 8 deletions learning/kotlin/compiler-plugins.md
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
# Плагины компилятора

Компилятор Kotlin позволяет делать модификацию логики компиляции за счет подключения компиляторных
плагинов. На данный момент Kotlin/JVM и Kotlin/JS используют один вариант компиляторных плагинов, а
Kotlin/Native другой. Для подключения используется специальный gradle плагин, который сообщает
компилятору откуда и какие плагины компилятора нужно взять.
Компилятор Kotlin позволяет модифицировать логику компиляции за счёт подключения компиляторных
плагинов. Начиная с Kotlin 1.9+ / 2.0 JVM, JS и Native используют единую IR-инфраструктуру
для плагинов. Для подключения используется специальный Gradle-плагин, который сообщает
компилятору, откуда и какие плагины компилятора нужно взять.

## Примеры

- https://github.com/Foso/KotlinCompilerPluginExample
- https://github.com/Foso/MpApt
- https://github.com/icerockdev/moko-widgets/tree/master/plugin
- https://github.com/Foso/MpApt (архивирован, вместо него рекомендуется KSP)
- https://github.com/icerockdev/moko-widgets/tree/master/plugin (архивирован)
- https://github.com/AhmedMourad0/no-copy
- https://kotlinlang.org/docs/all-open-plugin.html

Expand All @@ -33,7 +33,7 @@ kotlin.daemon.jvm.options=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,

## Ссылки

- https://bnorm.medium.com/writing-your-second-kotlin-compiler-plugin-part-1-project-setup-7b05c7d93f6c (6 частей у статьи)
- https://blog.bnorm.dev/writing-your-second-compiler-plugin-part-1 (статья из 6 частей)
- https://medium.com/@heyitsmohit/writing-kotlin-compiler-plugin-with-arrow-meta-cf7b3689aa3e
- https://www.youtube.com/watch?v=w-GMlaziIyo
- https://www.youtube.com/watch?v=w-GMlaziIyo — KotlinConf 2018, Kevin Most «Writing Your First Kotlin Compiler Plugin»
- https://github.com/ShikaSD/kotlin-compiler-notes
12 changes: 6 additions & 6 deletions learning/kotlin/kotlin-init-cases.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

## Порядок инициализации при создании объекта класса

1. Объявление свойств, указанных в конструкторе класса и присвоение им значений;
1. Объявление свойств, указанных в конструкторе класса, и присвоение им значений;
2. Инициализация свойств в теле класса;
3. Выполнение кода в блоке init
*если свойств в теле класса и блоков init объявлено несколько, они инициализируются в том же порядке, в каком были объявлены*
Expand Down Expand Up @@ -32,7 +32,7 @@ class Person(val name: String) {

## Порядок инициализации вложенных и внутренних классов

Вложенные классы не имеют доступа к переменным внешнего класса. При создании экземпляра вложенного класса экземпляр внешнего класса (в котором объявлен вложенный), создан не будет.
Вложенные классы не имеют доступа к переменным внешнего класса. При создании экземпляра вложенного класса экземпляр внешнего класса (в котором объявлен вложенный) создан не будет.

Экземпляр внутреннего класса всегда хранит ссылку на экземпляр внешнего класса. Вначале создается экземпляр внешнего класса, а затем на его основе - экземпляр внутреннего класса

Expand Down Expand Up @@ -102,7 +102,7 @@ class Person {
Как и в предыдущем случае, компилятор не подсветит ошибку

````kotlin
object {
val obj = object {
val string: String

init {
Expand Down Expand Up @@ -180,7 +180,7 @@ Bounds(x = 1.0, y = 2.0, width = 0.0, height = 0.0)
Bounds(x = 1.0, y = 2.0, width = 3.0, height = 4.0)
````

При создании класса **Player** вначале происходит инициализация его класса-родителя GameObject, внутри которого создается объект класса **Bounds**. К моменту инициализации класса **Player** свойство **bounds** внутри класса-родителя уже проинициализировано значениями: x=1, y=2, которые были переданы в параметры конструктора **Player** и значениями ширины и высоты из родителя **GameObject** width=0.0, height=0.0
При создании класса **Player** вначале происходит инициализация его класса-родителя GameObject, внутри которого создается объект класса **Bounds**. К моменту инициализации класса **Player** свойство **bounds** внутри класса-родителя уже проинициализировано значениями: x=1, y=2, которые были переданы в параметры конструктора **Player**, и значениями ширины и высоты из родителя **GameObject** width=0.0, height=0.0

## Кейс, иллюстрирующий приоритет выполнения блока init перед вторичным конструктором

Expand Down Expand Up @@ -215,13 +215,13 @@ println(case.result)
Вернемся к иллюстрации:
[алгоритм](./init_algorhitm.png)

В процессе инициализации при создании экземпляра класса **ClassWithSecondaryConstructor** после вызова вторичного конструктора будет вызван основной конструктор класса + произойдет выполнение кода в его блоке *init* перед выполнением кода в теле вторичного конструктора. Такми образом, этот код
В процессе инициализации при создании экземпляра класса **ClassWithSecondaryConstructor** после вызова вторичного конструктора будет вызван основной конструктор класса + произойдет выполнение кода в его блоке *init* перед выполнением кода в теле вторичного конструктора. Таким образом, этот код

````kotlin
result += "not "
````

будет выполнен перед конкатенацией значений, переданных в параметры вторичного констуктора
будет выполнен перед конкатенацией значений, переданных в параметры вторичного конструктора

````kotlin
this.result += secondValue
Expand Down
Loading
Loading