Пользовательское правило SonarQube - получение класса владельца параметра метода - PullRequest
0 голосов
/ 21 сентября 2018

В настоящее время я работаю над исправлением пользовательского правила сонара.

private void reportMethodParametersClassContainingInternalAnnotation(MethodTree methodTree) {
    if (!methodTree.parameters().isEmpty()) {
        for (int i = 0; i < methodTree.parameters().size(); i++) {
            if (!isParameterWrapperType(methodTree, i) && parameterClassContainsInternalAnnotation(methodTree, i)) {
                reportIssue(methodTree.parameters().get(i),
                        methodTree.parameters().get(i).type().symbolType().fullyQualifiedName()
                                + " class must be annotated @CanInvoke or must be standart java class");
            }
        }
    }
}

private static final ArrayList<String> WRAPPER_TYPES = new ArrayList<String>(Arrays.asList("Boolean", "Character",
        "Byte", "Short", "Integer", "Long", "Float", "Double", "void", "String", "int"));

private static boolean isParameterWrapperType(MethodTree tree, int i) {
    return WRAPPER_TYPES.contains(tree.parameters().get(i).type().symbolType().name());
}

private boolean parameterClassContainsInternalAnnotation(MethodTree tree, int i) {
    return tree.parameters().get(i).type().symbolType().symbol().metadata()
            .isAnnotatedWith(Constants.INTERNAL_ANNOTATION_PATH);
}

Это метод, который ищет параметры в методе.После получения одного за другим метод должен проверить, имеет ли класс параметра аннотацию @Internal (пользовательская аннотация из моей компании).Если он есть, метод сообщает о проблеме.Пока что работает нормально работает.Но когда он находит параметр, который является Массивом определенного класса, последний метод пытается проверить не этот класс, а Массив (который, очевидно, не имеет @Internal).

Чтобы быть более понятным, это пример:

Когда параметр метода подобен этому:

public void hello(SimpleClass simpleClass) {

}

последний метод возвращает:

true

и это:

tree.parameters().get(i).type().symbolType().symbol().name();

возвращает это:

SimpleClass

Но когда параметр метода выглядит следующим образом:

public void hello(SimpleClass... simpleClass) {

}

последний метод возвращает:

false

и это:

tree.parameters().get(i).type().symbolType().symbol().name();

возвращаетthis:

Array

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

1 Ответ

0 голосов
/ 23 сентября 2018

Когда у вас есть тип параметра, вы должны проверить, является ли он массивом, а затем вы можете привести к Type.ArrayType, у которого есть метод elementType(), возвращающий тип элемента массива.

ЗдесьНебольшой пример, как это сделать

MethodTree methodTree = (MethodTree) tree;
  for (VariableTree parameter : methodTree.parameters()) {
    Type parameterType = parameter.type().symbolType();
    if (parameterType.isArray()) {
      Type.ArrayType arrayType = (Type.ArrayType) parameterType;
      if (arrayType.elementType().symbol().metadata().isAnnotatedWith("MyAnnotation")) {
        // do something
      }
    }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...