Можем ли мы создавать собственные синтетические расширения Kotlin в Android?

Меня интересуют синтетические расширения Kotlin для Android, и я подумал, можем ли мы сделать то же самое для пользовательских файлов, таких как необработанные XML-файлы, которые мы храним в проекте. Например, рассмотрим синтетические представления в Kotlin.

import kotlinx.android.synthetic.main.fragment_profile_management.*

textview_shop_name.text = merchant.establishmentName

Генерируемый код выглядит следующим образом:

TextView textView = (TextView) _$_findCachedViewById(com.goharsha.testapp.R.id.textview_shop_name);
Intrinsics.checkExpressionValueIsNotNull(textView, "textview_shop_name");
Merchant merchant3 = this.merchant;

if (merchant3 == null) {
    Intrinsics.throwUninitializedPropertyAccessException("merchant");
}

textView.setText(merchant3.getEstablishmentName());

И метод _$_findCachedViewById также создается в том же классе следующим образом:

private HashMap _$_findViewCache;

public View _$_findCachedViewById(int i) {
    if (this._$_findViewCache == null) {
        this._$_findViewCache = new HashMap();
    }

    View view = (View) this._$_findViewCache.get(Integer.valueOf(i));

    if (view != null) {
        return view;
    }

    View view2 = getView();

    if (view2 == null) {
        return null;
    }

    View findViewById = view2.findViewById(i);
    this._$_findViewCache.put(Integer.valueOf(i), findViewById);

    return findViewById;
}

Поскольку это специфично для Android, я предположил, что это можно сделать в Kotlin, и, возможно, я могу расширить это для пользовательских необработанных XML-файлов, таких как, например, файлы конфигурации, и может быть интересно преобразовать их в объект.

Однако я не мог найти, как это можно сделать. Я знал о функциях расширения в Kotlin, но здесь на основе импорта синтетически генерируется целый файл. Существует также эта магия, что этот импорт Kotlin не был найден, когда я декомпилировал приложение.

Я также пытался просмотреть библиотеки core-ktx и view-ktx, но пока безуспешно. Любая идея, как это можно сделать?


person Sri Harsha Chilakapati    schedule 16.10.2020    source источник
comment
Вы можете написать задачу Gradle или плагин для этого. Вы можете использовать плагин File Watchers в Android Studio для запуска задачи при обнаружении изменений в файле.   -  person Tenfour04    schedule 16.10.2020
comment
@Tenfour04 Tenfour04 Я знаю о подходе плагина Gradle, но тогда мне нужно создать новые источники. Это подход, используемый плагином Gradle для безопасных аргументов навигации. Что меня здесь зацепило, так это то, что здесь наши исходники модифицируются перед компиляцией. Новый код добавляется в тот же класс, который является синтетическим по своей природе.   -  person Sri Harsha Chilakapati    schedule 16.10.2020


Ответы (1)


Да, это возможно, и для этого вам нужно сделать три вещи.

  1. Написать плагин Gradle
  2. Напишите плагин компилятора Kotlin (API недокументирован, так что приготовьтесь к настоящим испытаниям)
  3. Напишите подключаемый модуль IntelliJ (для таких функций, как переход к синтетическому полю для перехода к XML-файлу)

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

person Sri Harsha Chilakapati    schedule 17.10.2020