Получить аннотированные методы из Gradle плагин - PullRequest
0 голосов
/ 27 мая 2018

Я разрабатываю плагин gradle для проектов Android в kotlin, и мне нужно отсканировать исходные файлы проекта, чтобы получить имена всех тестов.Я реализовал сканер каталогов и получил Arraylist<File> со всеми тестовыми классами.

Я пытался применить отражение к этим файлам, но всегда получал исключение, когда класс не найден.Я полагаю, что подключаемый модуль Gradle пытается найти класс внутри того же подключаемого модуля Gradle, а не проекта Android, в котором используется этот модуль.

Есть ли способ проверить каждый объект File в моем ArrayList и получить все методы с аннотацией @test?

1 Ответ

0 голосов
/ 04 июня 2018

Поскольку у вас есть список всех исходных файлов в вашем проекте, вам нужно будет перебирать их, открывая каждый по очереди и читая их (как текст), чтобы найти любое имя методаэто следует за аннотацией @Test.

В зависимости от того, насколько сильны ваши стандарты кодирования и насколько хорошо они соблюдаются, это может быть почти тривиально или довольно сложно.В нашей базе кода вы можете просто найти строки, соответствующие ^\s+@Test, а затем сопоставить следующую строку с ^\s+\w+\s+\w+\s+(\w+)\(, чтобы получить имя метода.(Или токенизируйте его, если хотите). Это в значительной степени ваш самый простой случай;если ваша база кода использует @Ignore для отключения тестов или кто-то помещает тест в многострочный блок комментариев (/* ... */), или если может быть странное форматирование, отсутствующие модификаторы доступа и т. д., тогда ваша работа будет сложнее.

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

...