Synthetic Migrate Plugin

Overview

Synthetic Migrate Plugin

Описание

Плагин для Android Studio/Intelij IDEA с помощью которого можно мигрировать кодовую базу с котлиновской синтетики на view-binding. Поддерживает Android Studio 4.1+ и Intelij IDEA 2020.1+

Установка

  1. Скачать jar из последнего релиза
  2. Preferences -> Plugins -> Settings -> Install Plugin From Disk
  3. Выбрать jar
  4. Перезагрузить студию

Снимок экрана 2022-04-15 в 16 16 27

Описание интерфейса

Первый таб - Миграция

Снимок экрана 2022-04-15 в 16 34 13

Описание

В первом табе происходит настройка миграции, указание сущности которая будет мигрировать, то как будет инициализироваться view binding, где будет инициализироваться, указание доп импортов и т.д.

Чекбокс "Локальная переменная" - если он установлен, то binding переменная будет создана в методе указанном в поле "Метод инициализации", так что после того как чекбокс становиться активным поле "Метод инициализиации" становиться обязательным

Поле "Родительский класс" - это обязательное поле, которое заполняется именем родительского класса сущности которую нужно перевести на view binding. Например нам нужно перевести все сущности которые наследуются от Fragment, значит пишем там Fragment.

Поле "Название базового класса" - поле в которе вводится название базового класса сущности. Например нужно перевести все фрагменты на view binding, и есть базовый абстрактный класс BaseFragment, в котором переменная binding установленная абстрактной, следовательно нужно в каждом наследнике BaseFragment переопределять эту переменную. Значит указываем в Поле "Родительский класс" Fragment, в этом поле BaseFragment. И плагин везде где родитель BaseFragment - переопределит binding переменную(добавит override), а где только Fragment - создаст новую.

Поле "Название binding переменной" - то как будет называться генерируемая переменная. По умолчания binding

Поле "Метод инициализации" - поле которое нужно заполнить если необходимо инициализировать view binding переменную в каком то методе. Она используется как в связке с Чекбоксом "Локальная переменная", так и без него.

  1. Если выбран чекбокс и заполнено это поле, то переменная будет создана исключительно в в том методе, который указан в поле
  2. Чекбокс не выбран и заполнено поле, будет создана глобальная переменная с lateinit и инициализирована в методе который указан в этом поле

Поле "Шаблон инициализации" - поле в котором прописывается то как будет инициализирована переменная. Т.к. инициализация сопрежена с обращения к, сгенерированным view binding плагином, классами, то в этом поле можно указать , где это сгенерированный view binding класс, для обрабатываемого класса. Например есть делегат, с помощью которого нужно инициализировать во всех фрагментах binding. Для Фрагмента с лэйаутом R.layout.fragment_search эта инициализация должно выглядеть так val binding by fragmentBindingDelegate(FragmentSearchViewBinding::bind). Значит нужно вписать в это поле by fragmentBindingDelegate(::bind). И тогда в каждом фрагменте, где плагин сможет найти лэйаут будет подставлен класс сгенеренный на основе этого лэйаута.

Поле "Необходимы импорты" - плагин по умолчанию удаляет все импорты с синтетикой и добавляет импорты с view binding. На иногда необходимы еще некоторые импорты, например когда используешь тот же делегат для инициализации. Например: ru.rabota.app2.delegate.viewbinding и тогда в списке импортов у каждого обработанного файла появится import ru.rabota.app2.delegate.viewbinding. Это поле так же имеет правило: один импорт - одна строка

Кнопка "Мигрировать" - запускает процесс генерации переменной и замены импортов. После нажатия все повиснет и это нормально. После выполнения миграции появится диалог о завершении

Кнопка "Сбросить" - сбрасывает все настройки и очищает поля в этом табе

Кнопка "Отмена" - закрывает диалог

Второй таб - Замена родительского класса

Снимок экрана 2022-04-15 в 16 38 02

Описание

Второй таб позволяет заменять родительские классы. Это необходимо если во время переезда на view-binding в родительском классе добавился новый generic и чтобы во всех наследуемых классах руками его не добавлять может пригодится эта фича.

Поле "Что заменяем" - в этом поле указывается класс от которого наследуются и который изменился/заменился. Например у был класс BaseFragment и стал BaseFragment и везде нужно подставить этот ViewBinding. Значит в этом поле указывается имя такого класса который необходимо заменить т.е. BaseFragment

Поле "На что заменяем" - в этом поле указывается выражение на которое заменяется класс указанный выше. Это поле имеет 2 особенности:

  1. Когда заменяем BaseFragment на BaseFragment, нужно добавить view binding класс и сохранить имеющуюся уже там viewmodel класс. И тут нам на помощь приходит & , где type аналогичен type из шаблона инициализации, а , где index это индекс generic'а, начиная с 0. В этом примере в поле будет записано BaseFragment<, <0>>. Где <0> - это ViewModel
  2. Так же много где есть аргументы в первичном конструкторе, для того что бы они не исчезли при замене указывается [index] - где index это индекс аргумента, начиная с 0. Например есть BaseItem(abs, test), заменить на SuperItemBase(abs, test). Значит в этом поле нужно указать SuperItemBase<>([0],[1])

Поле "Необходимый импорт" - импорт который добавляется в процессе замены в каждый обработанный файл. Например: ru.rabota.app2.delegate.viewbinding и тогда в списке импортов у каждого обработанного файла появится import ru.rabota.app2.delegate.viewbinding

Кнопка "Заменить" - запускает процесс замены

Кнопка "Очистить" - очищает поля

Примеры использования

Миграция фрагментов

Снимок экрана 2022-04-15 в 16 43 29

Здесь во всех фрагментах сгенерится переменная с именем binding, а в тех кто наследовался от BaseFragment переменная биндинг будет override. Инициализация будет такая binding by someDelegate(NameViewBinding::bind). И в каждый обработанный файл добавиться импорт ru.rabota.app2.delegate.someDelegate. И у всех вьюшек в каждом классе вначале появится binding.

Миграция итемов списка

Снимок экрана 2022-04-15 в 16 45 19

На данном скриншоте приведен пример миграции итема списка. Т.е. во всех классах с родителем Item, в методе onBind будет сгенерирована переменная с названием itemBinding и инициализирована так: itemBinding = NameViewBinding.bind(viewHolder.itemView)

Добавления во всех наследованиях нового дженерика

Снимок экрана 2022-04-15 в 16 47 13

В этом примере во все наследования от BaseFragment будет добавлен generic c типом биндинга который был найден в классе. Например: было MainFragment: BaseFragment() станет MainFragment: BaseFragment() И так же во всех классах которые наследуются от BaseFragment, первый дженерик сохранится за счет того что было прописано <0>, и добавится новый с типом биндинга за счет добавления

Добавления во всех наследованиях нового аргумента

Снимок экрана 2022-04-15 в 16 51 49

В этом примере происходит замена наследования с добавлением нового аргумента и сохранением старого. Например: было MainItem(orientation: Int, data: Int): BaseItem(orientation) станет MainItem(orientation: Int, data: Int): BaseItem(orientation, data) И так же во всех классах которые наследуются от BaseItem, первый аргумент сохранится за счет того что было прописано [0], и добавится новый за счет добавления data
You might also like...
Gradle plugin which allows to use typed DSL for generating kubernetes/openshift YAML files

gr8s Gradle plugin which allows using typed DSL for generating kubernetes/openshift YAML files. Based on kuberig Usage import io.github.guai.gr8s.Gene

🪟 Pluggable Ktor plugin to implement Sentry for error handling and request contexts

🪟 Ktor Plugin for Sentry Pluggable Ktor plugin to implement Sentry for error handling and request contexts. What is this library? This basically impl

A Gradle plugin providing various utility methods and common code required to set up multi-version Minecraft mods.

Essential Gradle Toolkit A Gradle plugin providing various utility methods and common code required to set up multi-version Minecraft mods via archite

A project that helps us generate the test project to test the Gradle plugin.

Ktlint Gradle Provides the function to generate a Gradle project for us to test your Gradle plugin Latest plugin version: [1.0.0] Table of content How

Custom plugin for private minecraft server

Custom Plugin Custom plugin for private minecraft server. Requirements Java 1.17 PaperMC 1.18 (Minecraft 1.18) Features Cancels Creeper griefing Build

Intellij plugin to decode base64 encoded values in yaml file.

yaml-base64-decoder Plugin Description Extension Adds Decode Base64 Values to editor popup menu when yaml file is opened Adds a keyboard shortcut ⌥ ⇧

Static code analysis plugin for Android project. (Checkstyle, PMD)

Android Check Static code analysis plugin for Android project. Usage Modifications in project_dir/build.gradle: buildscript { repositories { jce

Kotlin compiler plugin for converting suspend functions to platform-compatible functions

Kotlin suspend transform compiler plugin Summary Kotlin compiler plugin for generating platform-compatible functions for suspend functions. JVM class

Migrate - custom ROM migration tool
Migrate - custom ROM migration tool

Migrate - custom ROM migration tool Branch version Version: 5.0 (Apollo) Compilation guide. Clone the three repositories. git clone https://github.com

HH Synthetic -- plugin for automated migration from Kotlin synthetics to View Binding.
HH Synthetic -- plugin for automated migration from Kotlin synthetics to View Binding.

HH Synthetic -- plugin for automated migration from Kotlin synthetics to View Binding.

Kotlin compiler plugin generates support synthetic methods for use SaveStateHandle without constants and string variables.
Kotlin compiler plugin generates support synthetic methods for use SaveStateHandle without constants and string variables.

SavedState Compiler Plugin Kotlin compiler plugin generates support methods for use SaveStateHandle without constants and string variables. Example If

Support extension to use Android ViewBinding quickly and smooth transform from kotlin-synthetic-extension.

ViewBinding Delegate Extension Support extension to use Android ViewBinding quickly and smooth transform from kotlin-synthetic-extension. Binding inst

gradle-android-scala-plugin adds scala language support to official gradle android plugin

gradle-android-scala-plugin gradle-android-scala-plugin adds scala language support to official gradle android plugin. See also sample projects at htt

eventbus-intellij-plugin 3.8 0.0 L1 Java Plugin to navigate between events posted by EventBus.
eventbus-intellij-plugin 3.8 0.0 L1 Java Plugin to navigate between events posted by EventBus.

eventbus-intellij-plugin Plugin to navigate between events posted by EventBus. Post to onEvent and onEvent to Post Install There are two ways. Prefere

A simple plugin to patch the memory leak in Kotlin Gradle Plugin 1.5.0

kgp-150-leak-patcher A simple plugin to automatically patch the memory leak in Kotlin Gradle Plugin 1.5.0 in https://youtrack.jetbrains.com/issue/KT-4

IntelliJ Idea Astor Plugin is a plugin that integrates Astor in Intellij Idea

IntelliJ Idea Astor Plugin IntelliJ Idea Astor Plugin is a plugin that integrates Astor in Intellij Idea. It communicates with a local/remote program

Gradle Plugin that allows you to decompile bytecode compiled with Jetpack Compose Compiler Plugin into Java and check it

decomposer Gradle Plugin that allows you to decompile bytecode compiled with Jetpack Compose Compiler Plugin into Java and check it How to use Run bui

Gradle plugin to ease Kotlin IR plugin development and usage in multimodule gradle projects

Gradle plugin to ease Kotlin IR plugin development and usage in multimodule gradle projects. Former: kotlin-ir-plugin-adapter-gradle

Intellij-platform-plugin-template - IntelliJ Platform Plugin Template
Intellij-platform-plugin-template - IntelliJ Platform Plugin Template

IntelliJ Platform Plugin Template TL;DR: Click the Use this template button and

Owner
Rabota.ru
Rabota.Ru - Open Source Projects
Rabota.ru
Plugin and Desktop app for parsing layout xml into Composable code

composed-xml Inspired by - Recompose composed-xml is a tool for parsing Android layouts into Jetpack Compose code. It can work as both Desktop app or

Bacho Kurtanidze 9 Dec 26, 2022
A simple starter project for Minecraft Spigot Plugin using KotlinBukkitAPI.

KBAPI-StarterProject A simple starter project for Minecraft Spigot Plugin using KotlinBukkitAPI. The starter comes with the following KotlinBukkitAPI

null 0 Nov 2, 2021
KSP extension for the kotlin-maven-plugin

kotlin-maven-symbol-processing Extension for the kotlin-maven-plugin to support Kotlin Symbol Processing (KSP). Usage To use this extension, add the d

Dyescape 19 Dec 18, 2022
Firebase Authentication plugin for Ktor framework.

Firebase Authentication is a Ktor plugin which verifies requests authorized by a Firebase Auth Id Token.

Manav Tamboli 2 Jul 16, 2022
Gradle plugin to manage tests which should only run nightly and not every time a CI/CD pipeline builds.

NightlyTestsPlugin Gradle Plugin to configure which (j)Unit tests should only be run nightly and not everytime a CI/CD pipeline is triggered. Usage To

VISUS Health IT GmbH 0 Dec 7, 2021
Gradle plugin for Hugo static site generator

gradle-hugo-plugin Wrapper for Hugo static site generator. The plugin provides a declarative approach for the Hugo binary used to build the static sit

François Staudt 10 Jun 28, 2022
Event State Processor Generator plugin is compatible with IntelliJ and Android Studio.

Event State Processor Generator plugin is compatible with IntelliJ and Android Studio. It provides source code generation for the EventStateProcessor Library to increase code productivity in Flutter apps development.

Extreme Vietnam Public 2 Dec 7, 2021
Plugin to integrate EventStoreDB into Ktor-Server!

Ktor Plugin EventStoreDB EventStoreDB is an open-source database technology that stores your critical data in streams of immutable events. It was buil

null 7 Sep 1, 2022
Kotlin compiler plugin that allows class delegation to be dynamic like property delegations

kotlin-dynamic-delegation Kotlin compiler plugin that allows class delegation to be dynamic like property delegations. The plugin is working in progre

Him188 14 Sep 8, 2022
A multiversion gradle scala plugin

WIP Work in Progress: Learning how to write a gradle plugin. A Scala multiversion plugin Inspired by: https://github.com/ADTRAN/gradle-scala-multivers

Ross Lawley 1 Dec 8, 2021