(Это нишевый технический вопрос, но конечный результат может представлять более широкий интерес, поэтому я спрашиваю здесь, но с удовольствием перенесу обсуждение на электронную почту, если оно не стоит ТАКОГО обмена.)
Справочная информация: В настоящее время я использую PMD для проверки стилей на представленных домашними работами моих учеников.Это комбинация PMD и CheckStyle и вывод в произвольном формате, поэтому я уже использую PMD программно, а не из командной строки.После запуска средств проверки стиля я отображаю вывод в веб-приложении, которое мы используем для управления курсом и оценки домашних заданий.
Я бы хотел улучшить свое веб-приложение, чтобы разрешать виды взаимодействий с переходом на определение,как IDE делает.Для этого мне нужен более точный вывод, чем, например, производит ctags .Поскольку PMD уже выполняет синтаксический анализ Java и разрешение типов, представляется вероятным, что PMD можно использовать для идентификации всех имен в файле и определения их сайтов связывания.
Подход на данный момент: IМы нашли способ запуска синтаксического анализатора, фасада NameResolution
, фасада Symbol
, фасада DataFlow
, фасада TypeResolution
и фасада Multifile
, как в логике SourceCodeProcessor
.(Я не знаю, нужно ли мне все это, но я полагаю, что запускать их не повредит ...) Я попытался определить своего собственного посетителя AST, основная логика которого
- посещение
ASTName
узлов - получение их
NameDeclaration
s - записи исходного местоположения объявлений и исходного местоположения узлов, как пары def-> use
Проблемы / Вопросы:
- Несмотря на то, что auxClasspath включает правильные банки, разрешение имен иногда не удается разрешить, например, от
assertEquals
до org.junit.Assert.assertEquals
, илидругой статический импорт.Я проследил выполнение до ClassTypeResolver
, и, похоже, он находит класс org.junit.Assert
, но когда мой посетитель запускается, соответствующие узлы ASTName
имеют нулевой NameDeclaration и нулевой тип. - Я не понимаю, как обеспечить надежное обнаружение символов из других файлов.Я думаю, что это что-то вроде «установи правильный путь к классам и убедись, что файлы все скомпилированы», но я не могу полностью объяснить ошибки, которые я иногда вижу.
- Почему
ASTName
s иногда состоят из точечных путей доступа, например, someObject.someMethod
рассматривается как один ASTName
?Как я могу получить разрешение имен для этих двух частей независимо? - Есть ли какие-либо другие посетители, которых мне нужно запустить, прежде чем пытаться получить достоверную информацию о имени и типе?
- (Запрос функции) Будет лиэто может быть чем-то, что PMD стоит сделать как встроенную функциональность?
Спасибо!