将Tree转换为JavaTree转换为SonarQube规则

时间:2019-01-29 15:01:15

标签: java casting sonarqube

我需要将Tree转换为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变量中。我只有一棵树,但是我需要为该getApiJavadoc设置一个JavaTree,因为它会调用一些方法和类。我试图创建一个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()) {

因为这是在尝试进行演员表转换,所以会打扰所有内容。而且我无法更改最后一个,因为这是声纳代码,而且我也无法更改。

0 个答案:

没有答案