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

Вырезалка 2

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

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

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

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

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

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

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

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