Иконка ресурса

Вырезалка 2

1,109
47
425
JustAGod добавил(а) новый ресурс:

вырезалка 2 - тут будет описание

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

Что это такое
Вырезалка это плагин для градла. Она нужна для автоматического вырезания клиентского кода из серверных билдов.
Разграничение серверного кода и клиентского происходит через аннотации...

Узнать больше об этом ресурсе...
 
Инвокаторы - киллер фича относительно предыдущей версии вырезалки
Только если эта фича предназначена для килла самой вырезалки
Ведь это костыль, который к тому же заставляет писать бойлерплейт-код.
Почему нельзя сделать вырезание полей вместе с вырезанием usage, которые не вырезались обработкой других аннотаций?
 
Представь кейс
Java:
class SomeClass {
    String a = "";
    String b;
   
    SomeClass() {
        b = "";
    }
}
вот с точки зрения байт кода обе ти инициализации будут выглядеть одинаково
если просто вырезать PUTFIELD для всех таких случаев у вас сломается обфускации и иногда стэк мапы
+ внезапные приколы когда вызывается метод который как бы не виден

можно подумать над анализом стэка но тогда мне нужно будет уметь парсить абсолютно все опкоды жавы.
 
Форжевская SideOnly работает как-то, тоже байткод редачит. Проверил - не пашет. Кстати, интересное наблюдение: за 4 года написания модов ни разу не понадобилось вешать SideOnly на поле.

Может, стоит попробовать работать через парсинг исходников в синтаксическое дерево, вырезать поля и их usage на этом уровне, генерировать из этого дерева новый код и после отправлять его на обычную компиляцию?
 
ну если я начну ковырять исходники вместо байт кода, этот проект перестанет приносить мне удовольствие 👀

а если серьезно, разбирать каждый опкод проще чем парсить исходники
 
просто вырезать PUTFIELD
PUTFIELD ведь берет значение из стэка, может тогда заменять PUTFIELD вырезаемых полей на POP? Тогда стэк не поменяет своей структуры.
Это кст ты же мне советовал для одного кейса хуклибы
 
с точки зрения жавы это действительно будет валидным байт-кодом, но:
1) В хук либе действительно это нормальное решение потому что дальше рантайма оно не уходит, но в данном случае от этого сломаются как минимум 3 обфускатора. Так как я хочу потом вырезалку использовать в своих целях, это критично
2) в кейсе типа String a = function() функция будет вызываться. Что, я считаю, не инткутивно и не правильно.
 
В конфигурации сборки требуется указывать имя аннотации, влияющие на сторону поля и варианты сборки. Можно приведенный вариант настройки сделать дефолтным, а также сделать готовые дефолтные аннотации и интерфейсы инвокеров? Тогда сетап верезалки будет сводиться к минимуму: добавление репы и включение плагина.
Для большинства простых проектов этого будет хватить по идее
~~~
Или там проблема в том, что плагин не добавляет своего кода в проект? Можно аннотации и интерфейсы скомпилить в отдельную либу, а плагин будет подключать эту либу к проекту?
 
что такое дефолтные аннотации и интерфейсы инвокеров?
сказать плагину насильно подключать в компайл зависимость от репо с ними? если так, то мне не очень нравится.
Если просто сделать example project то да, это прямо щас и сделаю.
 
Или там проблема в том, что плагин не добавляет своего кода в проект? Можно аннотации и интерфейсы скомпилить в отдельную либу, а плагин будет подключать эту либу к проекту?
проблема в том что мне не нравится если плагин будет насильно чота пихать, особенно по дефолту
мне нравится идея настройки без конфига, но я скорее соглашусь на настройку одной строкой
типа cutter.initializeDefault()
кста звучит классно
 
Насколько я понял, аннотацию anno.SideOnly нужно создать самому. Но ведь случай разделения на клиент и сервер юзается в большинстве проектов, поэтому приведенную в примере аннотацию стоит добавить в сам плагин, чтобы для юза вырезалки нужно было только включить плагин и юзать аннотацию из плагина.
Интерфейсы инвокеров тоже по идее в большинстве случаев будут одинаковыми
 
проблема в том что мне не нравится если плагин будет насильно чота пихать, особенно по дефолту
мне нравится идея настройки без конфига, но я скорее соглашусь на настройку одной строкой
типа cutter.initializeDefault()
кста звучит классно
ну да собственно если возражений нет, я наверно вот так сделаю 👀
 
Ты имеешь ввиду, что строчкой cutter.initializeDefault() в билд-скрипте будет включаться добавление в проект дефолтных аннотации и интерфейсов?
 
да, отлично получится, опционально и не навязчиво
 
Назад
Сверху