Чтобы ответить на ваш последний вопрос, API SonarJava не предоставляет никакого способа фильтрации дочерних элементов непосредственно из AST по их древовидному виду.Это должно быть сделано во время посещения.
Теперь, возможно, есть несколько способов достичь того, что вы пытаетесь сделать, но вам наверняка потребуется работать как с синтаксисом, так и с семантическим API.Обратите внимание, что это правило может потребовать много работы, чтобы охватить все случаи.
Я бы посоветовал вам взглянуть на дерево methodSelect
MethodInvocationTree
и оттудапроверьте, если сначала это MemberSelectExpressionTree
, получите идентификатор, а затем снова MethodInvocationTree
от выбранного члена.Зацикливаясь на нем, пока вы не достигнете чего-то, что не является вызовом метода или напрямую идентификатором, вы должны собрать все вызовы метода.Теперь возникает вопрос, как убедиться, что это метод из java.util.stream.Stream
.
После сбора для каждого вызова метода в цепочке вы можете использовать семантический API для доступа к symbol()
соответствует вызванному методу.Если методы правильно разрешены семантическим механизмом (для анализа предоставлен байт-код, правильное вычисление механизма вывода, символ не помечен как unknown
), вы сможете проверить тип владелец метода.Для всех этих методов владельцем должно быть java.util.stream.Stream
.