Можно ли использовать PMD для получения информации IntelliSense? - PullRequest
0 голосов
/ 12 октября 2018

(Это нишевый технический вопрос, но конечный результат может представлять более широкий интерес, поэтому я спрашиваю здесь, но с удовольствием перенесу обсуждение на электронную почту, если оно не стоит ТАКОГО обмена.)

Справочная информация: В настоящее время я использую PMD для проверки стилей на представленных домашними работами моих учеников.Это комбинация PMD и CheckStyle и вывод в произвольном формате, поэтому я уже использую PMD программно, а не из командной строки.После запуска средств проверки стиля я отображаю вывод в веб-приложении, которое мы используем для управления курсом и оценки домашних заданий.

Я бы хотел улучшить свое веб-приложение, чтобы разрешать виды взаимодействий с переходом на определение,как IDE делает.Для этого мне нужен более точный вывод, чем, например, производит ctags .Поскольку PMD уже выполняет синтаксический анализ Java и разрешение типов, представляется вероятным, что PMD можно использовать для идентификации всех имен в файле и определения их сайтов связывания.

Подход на данный момент: IМы нашли способ запуска синтаксического анализатора, фасада NameResolution, фасада Symbol, фасада DataFlow, фасада TypeResolution и фасада Multifile, как в логике SourceCodeProcessor.(Я не знаю, нужно ли мне все это, но я полагаю, что запускать их не повредит ...) Я попытался определить своего собственного посетителя AST, основная логика которого

  • посещение ASTName узлов
  • получение их NameDeclaration s
  • записи исходного местоположения объявлений и исходного местоположения узлов, как пары def-> use

Проблемы / Вопросы:

  1. Несмотря на то, что auxClasspath включает правильные банки, разрешение имен иногда не удается разрешить, например, от assertEquals до org.junit.Assert.assertEquals, илидругой статический импорт.Я проследил выполнение до ClassTypeResolver, и, похоже, он находит класс org.junit.Assert, но когда мой посетитель запускается, соответствующие узлы ASTName имеют нулевой NameDeclaration и нулевой тип.
  2. Я не понимаю, как обеспечить надежное обнаружение символов из других файлов.Я думаю, что это что-то вроде «установи правильный путь к классам и убедись, что файлы все скомпилированы», но я не могу полностью объяснить ошибки, которые я иногда вижу.
  3. Почему ASTName s иногда состоят из точечных путей доступа, например, someObject.someMethod рассматривается как один ASTName?Как я могу получить разрешение имен для этих двух частей независимо?
  4. Есть ли какие-либо другие посетители, которых мне нужно запустить, прежде чем пытаться получить достоверную информацию о имени и типе?
  5. (Запрос функции) Будет лиэто может быть чем-то, что PMD стоит сделать как встроенную функциональность?

Спасибо!

1 Ответ

0 голосов
/ 14 октября 2018

Определенно немного выходит за рамки, так что, возможно, было бы лучше обратиться к списку рассылки PMD devel или просто написать нам письмо напрямую сопровождающим.

Тем не менее, поскольку никто, похоже, не имел проблем сНа данный момент я отвечу настолько полно, насколько смогу.

  1. код разрешения типа пытается пометить тип каждого узла.Для вызовов метода foo(bar, baz) это означает поиск любого типа возврата foo (не того типа, который определяет foo).Для Assert.assertEquals тип возврата - void, поэтому в идеале это то, что вы должны увидеть.Тем не менее, есть некоторые предостережения.Эта конкретная область разрешения типов PMD все еще не завершена (мы просто прекрасно решаем простые сценарии, но боремся с трудными сценариями, где вывод типа вступает в игру).Любые сообщения об ошибках / PR в этой области приветствуются.
  2. Символы из таблицы символов или типы?Помните, что таблица символов по-прежнему однофайловая.Типы нет, но именно поэтому нам нужно, чтобы собственные скомпилированные классы проекта тоже были в auxclasspath.
  3. Legacy… У нас есть планы изменить его так или иначе (см. # 497), но это - серьезное изменение в построении AST, что, в свою очередь, означает, что все правила, использующие ASTName (как внутри PMD, так и созданные пользователями), скорее всего, вообще перестанут работать ... пожалуйста, перейдите слюбые отзывы или идеи.
  4. Нет, на самом деле вы работаете больше, чем вам нужно.Имея только таблицу символов и разрешение типов, вы должны быть хороши (в таком порядке!)
  5. Может быть ... вы могли бы написать черновой вариант RFC по PMD, чтобы лучше обсудить возможные варианты использования ... Тем не менее, кроме того, разоблачаем ли мыкаким-то образом таблица символов, большинство других вещей, которые вы пытаетесь сделать, это то, о чем мы заботимся.
...