Мне нужно преобразовать дерево в 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()) {
Потому что это попытка сделать этот бросок, который ошибается во всем.И я не могу изменить этот последний, потому что это код сонара, и я не могу его изменить.