我需要将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()) {
因为这是在尝试进行演员表转换,所以会打扰所有内容。而且我无法更改最后一个,因为这是声纳代码,而且我也无法更改。