Вопрос

Учитывая номер строки исходного кода определенного класса (Java/C#) – есть ли простой способ получить имя метода, в который он входит?(Если он попадает в одну категорию) (Предположительно, с использованием абстрактного синтаксического дерева)

(Это было бы полезно для ограничения вывода checkstyle только затронутым методом).

Я предполагаю, что вам придется использовать абстрактное синтаксическое дерево для выполнения Line#->MethodName.

Это было полезно?

Решение

(специфично для Java)

Если файл класса был скомпилирован с отладочной информацией, таблица номеров строк будет содержать сопоставление кода<->номер строки.Я не думаю, что существует встроенный API для выполнения этого во время выполнения, хотя я уверен, что вы, вероятно, сможете обойтись некоторыми библиотеками для разработки байт-кода, такими как ASM или BCEL.

Другие советы

Я не знаю о Java, но в сборках .NET номера строк не хранятся в их таблицах метаданных - для такой информации вам понадобится файл PDB (база данных программ).

Да, как вы сказали, используя правильный вид AST. Инструментарий реинжиниринга программного обеспечения DMS может создавать AST для Java и для C #. Каждый узел AST украшен данными номера строки. Каждый узел AST соответствует правилу грамматики.

Таким образом, проблема определения имени метода для номера строки довольно проста: найдите в AST узел с соответствующим номером строки и поднимайтесь по дереву, пока не будет найден узел AST, представляющий объявление метода; найти поддерево имени метода из этого узла и распечатать его.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top