Преобразование дерева в JavaTree в правило SonarQube - PullRequest
0 голосов
/ 29 января 2019

Мне нужно преобразовать дерево в JavaTree.Но я получаю ClassCastException, очевидно.

public Javadoc(Tree tree) {
    if (tree.is(METHOD_KINDS)) {
        elementParameters = ((MethodTree) tree).parameters().stream().map(VariableTree::simpleName)
                .map(IdentifierTree::name).collect(Collectors.toList());
        elementExceptionNames = ((MethodTree) tree).throwsClauses().stream().map(Javadoc::exceptionName)
                .filter(Objects::nonNull).collect(Collectors.toList());
    } else if (tree.is(CLASS_KINDS)) {
        elementParameters = ((ClassTree) tree).typeParameters().stream().map(TypeParameterTree::identifier)
                .map(IdentifierTree::name).map(name -> "<" + name + ">").collect(Collectors.toList());
        elementExceptionNames = Collections.emptyList();
    } else {
        elementParameters = Collections.emptyList();
        elementExceptionNames = Collections.emptyList();
    }



    List<String> javadocLines = cleanLines(PublicApiChecker.getApiJavadoc((JavaTree)tree));
    mainDescription = getDescription(javadocLines, -1, "");
    blockTagDescriptions = extractBlockTags(javadocLines, Arrays.asList(BlockTag.values()));
    undocumentedNamedTags = new EnumMap<>(BlockTag.class);
}

Это происходит в переменной jadocLines.У меня есть только дерево, но мне нужно установить JavaTree для этого getApiJavadoc из-за некоторых методов и классов, которые он вызывает вперед.Я попытался создать объект javatree и передать ему данные моего дерева.Но я не мог, потому что класс JavaTree абстрактный.У класса JavaTree есть другие классы внутри, но я не получаю это.Может ли кто-нибудь помочь мне в этой части?

Редактировать 1: Спасибо за ответы, но я не могу создать еще один такой простой класс, потому что мне нужно дать некоторые аргументы для класса, который мне нужен, которого у меня нет (потому что это даже не существует).Класс, который мне нужен для создания экземпляра:

public static class ImportTreeImpl extends JavaTree implements ImportTree {
    private final boolean isStatic;
    private final Tree qualifiedIdentifier;
    private final SyntaxToken semicolonToken;
    private final SyntaxToken importToken;
    private final SyntaxToken staticToken;

    public ImportTreeImpl(InternalSyntaxToken importToken, @Nullable InternalSyntaxToken staticToken,
                          Tree qualifiedIdentifier, InternalSyntaxToken semiColonToken) {
      super(Kind.IMPORT);
      this.importToken = importToken;
      this.staticToken = staticToken;
      this.qualifiedIdentifier = qualifiedIdentifier;
      this.semicolonToken = semiColonToken;
      isStatic = staticToken != null;
    }

Этот класс находится внутри класса JavaTree, и мне нужно его установить, но у меня нет никакого SyntaxToken, и я не могу создать нулевой объект, который можно поместить здесь только для создания экземпляра.Это.Можете ли вы помочь с этой частью?

OBS1: Это приведение JavaTree неправильно, я знаю, это был просто тест.Но спасибо!

EDIT2: я знаю, что getApiChecker нужно дерево, но проблема не в getApiChecker, а в некоторых методах, которые вызываются после.Посмотрите:

List<String> javadocLines = cleanLines(PublicApiChecker.getApiJavadoc(tree));

Звонки:

 @Nullable
  public static String getApiJavadoc(Tree tree) {
    if (!tree.is(API_KINDS)) {
      return null;
    }
    ModifiersTree modifiersTree = getModifierTrees(tree);
    // FIXME token should be retrieved in a much simpler way.
    if (modifiersTree != null && !(modifiersTree.modifiers().isEmpty() && modifiersTree.annotations().isEmpty())) {
      return getCommentFromTree(modifiersTree);
    }
    if (tree.is(Tree.Kind.METHOD)) {
      MethodTree methodTree = (MethodTree) tree;
      return getCommentFromMethod(methodTree);
    }
    return getCommentFromTree(tree);
  }

Звонки:

private static String getCommentFromTree(Tree tokenTree) {
    return getCommentFromSyntaxToken(FirstSyntaxTokenFinder.firstSyntaxToken(tokenTree));
  }

Звонки:

@Nullable
  public static SyntaxToken firstSyntaxToken(@Nullable Tree tree) {
    if (tree == null || tree.is(Tree.Kind.INFERED_TYPE)) {
      return null;
    } else if (tree.is(Tree.Kind.TOKEN)) {
      return (SyntaxToken) tree;
    }
    for (Tree next : ((JavaTree) tree).children()) {
      SyntaxToken syntaxToken = firstSyntaxToken(next);
      if (syntaxToken != null) {
        return syntaxToken;
      }
    }
    return null;
  }

И моя проблема:

for (Tree next : ((JavaTree) tree).children()) {

Потому что это попытка сделать этот бросок, который ошибается во всем.И я не могу изменить этот последний, потому что это код сонара, и я не могу его изменить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...