2016-08-15 6 views
2

Мы стремимся реализовать пользовательское правило, которое предполагает необходимость навигации по дереву синтаксиса в разных файлах. Что-то вроде:Sonarqube: обычное java-правило для перекрестных ссылок?

ClassA -> частного поля ClassB -> ClassB -> частного поля ClassC -> ClassC ...

Однако, я не уверен, если есть возможность сделать это , Я посмотрел на репозиторий примера, а также на существующие звуковые проверки, которые написаны, но большинство (если не все), по-видимому, ограничены областью файлов. Мне было интересно, есть ли способ приблизиться к этому?

В настоящее время я пытался извлечения объявления переменной от типа символа класса, например, так:

public void visitNode(final Tree tree) { 
    final ClassTree clazz = (ClassTree) tree; 

    final VariableTree memberField = tree.members().get(0); 
    final JavaSymbol memberClassSymbol = (JavaSymbol) memberField.symbol().type().symbol(); 
    final ClassTree memberClass = memberClassSymbol.declaration(); 
} 

Однако, это поле пустым. Кажется, в каждом случае я пробовал. Есть ли другой способ приблизиться к этой задаче с помощью специального расширения сонара?

Спасибо.

+0

Вы может захотеть точно определить, что вы хотите обнаружить, потому что семантический API может помочь вам здесь. – benzonico

+0

@benzonico Спасибо за ответ. В нашем случае мы пытаемся внедрить правило, помогающее с сериализованными классами, которые помечены как сериализуемые (и, следовательно, не отображаются как предупреждения в IDE или как существующие правила) в сериализуемых классах, которые на самом деле не сериализуемы по другим причинам , Так, например, в ClassA мы имеем два поля: ClassB и MyBean. MyBean содержит ClassD. В нашем случае мы хотим иметь возможность сканировать classA и флаг classB с этим правилом, а затем продолжить сканирование других полей (MyBean) для других, которые будут нарушать его. В этом случае ClassD будет помечен. –

+0

не это правило, покрывающее вашу потребность? https://sonarqube.com/coding_rules#rule_key=squid%3AS1948 – benzonico

ответ

0

Это невозможно на синтаксис уровень: анализ выполняется по файлу.

После анализа файла дерево синтаксиса отбрасывается и анализ переходит к следующему файлу. Поскольку нет гарантии относительно порядка, в котором анализируются файлы, вы также не можете хранить некоторые узлы синтаксиса для последующего использования.

Однако, используя семантический анализ, анализ байткод, в зависимости от того, что вы хотите достичь вы можете полагаться на семантическом API и обнаружить, что класс B имеет поле типа С (с помощью символов и типов) и т.д.

+0

После повторной проверки этой проблемы я вижу, что вы подразумеваете под семантическим анализом - у нас нет доступа к деревьям, но мы можем использовать symbolScope() и т. Д., Чтобы «пересечь» дерево по тому, что нам нужно. Благодарю. –

+0

, пожалуйста, воздержитесь, если это было полезно, спасибо. – benzonico

+0

Записано, но не отображается, как я никогда раньше не писал :(К сожалению, ха-ха. –

Смежные вопросы