Автоматическое создание импортов

Jul 17, 2020 19:43

Поставили задачу. Есть файл с исходным кодом Groovy класса. В коде не хватает импортов, их надо автоматически создать ( Read more... )

Leave a comment

yatur July 17 2020, 18:44:59 UTC
Я не настоящий сварщик, Груви не занимаюсь, но вот некоторые идеи:

1. Поискать в Интернете, нет ли уже чего-нибудь готового, что можно применить.
2. Самый лучший парсер кода - это компилятор Джавы. Ничего не парсить самому, а напускать компилятор и парсить список ошибок на "undefined identifier" или как он там ругается.

Сколько времени просить - 3 дня (целых, с 9 до 5) на исследование и проверку существующих опций, 2-3 недели (целых) на написание первой версии своей приблуды (но это уже зависит от скорости, с которой Вы пишите). Первую версию запускаем в бету, смотрим, все ли она ловит. Еще месяц-другой (календарных) займет довести ее до приемлемого качества, чтобы она не слишком часто падала на реальном коде. Чистого времени на починку тут будет ну, может, неделя, остальное - ожидание багов и ответов пользователей :)

Reply

m_f July 17 2020, 19:01:02 UTC
Жумал про компилятор. Но, во-первых, все нужные импорты должны быть добавлены с первой итерации, во-вторых, я вот чего не понимаю: выругается groovy интерпретатор на класс, ногде его искать-то? Какой импорт добавлять?
Спасибо за совет.

Reply

moonwalker72 July 17 2020, 22:09:29 UTC
С очевидностью нужны таблицы имен. И так же очевидно, что дополняемый исходник не висит в воздухе, а является частью проекта. Из проектных библиотек надо вытянуть все пространства имен и наборы классов внутри.

Если же в задаче нет проектных библиотек, то их всё равно надо добавлять. Ну потому что откуда еще можно взять имена? И, кстати, существует ли гарантия, что исходник синтаксически корректен - в том смысле, что имена классов верны (без очепяток)?

Reply

m_f July 17 2020, 22:54:45 UTC
Классы проекта я добавлю, не вопрос, тем более, их ограниченное количество и они разложены по пакетам, то есть, можно просто написать import my.cool.packet.*.
Беда в том, что там может быть любой грувишный или джавский стандартный класс. Вот как это победить? Забить все стандарьные пакеты джавы? Их там дофигищи!

Reply

moonwalker72 July 18 2020, 07:55:13 UTC
Ну вообще-то да, надо подготовить большие таблицы имен из "внешних" пакетов - не только стандартных джавы, но и третьесторонних, если они есть в проекте - вытянуть оттуда рефлексией. В принципе нужно сделать кэширование, может быть даже что-то вроде SQLite-базы добавить, куда единовременно вытянуть все полные имена классов из стандартных библиотек.

Reply

m_f July 17 2020, 22:56:25 UTC
Если имена классов не верны, это не мои проблемы. Мое дело - чтобы корректный код исполнялся после добавления импортов.

Reply

m_f July 17 2020, 22:58:11 UTC
Но в целом про таблицы хорошая идея. По меньшей мере, не буду париться с забиванием тмен пакетов.

Reply

yatur July 19 2020, 03:58:48 UTC
> все нужные импорты должны быть добавлены с первой итерации

Это совершенно неочевидное требование :) Что лучше - программа, которая добавляет импорты за несколько итераций, или которая вообще их не добавляет? Плюс, почему несколько итераций? Я думаю, компилятор будет ругаться на все сразу.

> выругается groovy интерпретатор на класс, ногде его искать-то? Какой импорт добавлять?"

На этот вопрос нет однозначного ответа - это, по сути, часть технрического задания. Спектр ответов может быть от "только в текущем проекте" до "лезть на Гитхаб и скачивать отттуда" :) На деле, я полагаю, брать из тикущего проекта и из JRE. Естественно, надо заранее составить их список. Самая главная проблема будет определить, что делать, если два пакета имеют классы с одинаковыми именами.

Вы смотрели вот на это: https://github.com/serv-inc/javimp?

Reply


Leave a comment

Up