ListBuffer<CommentInfo> javadocs = ListBuffer.lb();
for (CommentInfo commentInfo : comments) {
if (commentInfo.isJavadoc()) javadocs.append(commentInfo);
}
Node result = getResult();
if (javadocs.isEmpty()) return result;
val nodePositions = new TreeMap<Integer, Node>();
result.accept(new ForwardingAstVisitor() {
private void addToMap(Node positionNode, Node linked) {
if (positionNode == null) return;
int start = positionNode.getPosition().getStart();
if (start == -1) return;
if (linked instanceof JavadocContainer || !nodePositions.containsKey(start)) {
nodePositions.put(start, linked);
}
}
private void addToMap(StrictListAccessor<?, ?> nodes, Node linked) {
if (nodes == null) return;
for (Node node : nodes) {
addToMap(node, linked);
}
}
@Override public boolean visitNode(Node node) {
int start = node.getPosition().getStart();
addToMap(node, node);
try {
if (node instanceof VariableDeclaration) {
addToMap(((VariableDeclaration)node).astDefinition().astModifiers(), node);
addToMap(((VariableDeclaration)node).astDefinition().astModifiers().astAnnotations(), node);
addToMap(((VariableDeclaration)node).astDefinition().astTypeReference(), node);
addToMap(((VariableDeclaration)node).astDefinition().astVariables().first().astName(), node);
} else if (node instanceof TypeDeclaration) {
addToMap(((TypeDeclaration)node).astModifiers(), node);
addToMap(((TypeDeclaration)node).astModifiers().astAnnotations(), node);
} else if (node instanceof MethodDeclaration) {
addToMap(((MethodDeclaration)node).astModifiers(), node);
addToMap(((MethodDeclaration)node).astModifiers().astAnnotations(), node);
addToMap(((MethodDeclaration)node).astTypeVariables().first(), node);
addToMap(((MethodDeclaration)node).astReturnTypeReference(), node);
addToMap(((MethodDeclaration)node).astMethodName(), node);
} else if (node instanceof ConstructorDeclaration) {
addToMap(((ConstructorDeclaration)node).astModifiers(), node);
addToMap(((ConstructorDeclaration)node).astModifiers().astAnnotations(), node);
addToMap(((ConstructorDeclaration)node).astTypeVariables().first(), node);
addToMap(((ConstructorDeclaration)node).astTypeName(), node);
} else if (node instanceof EnumConstant) {
addToMap(((EnumConstant)node).astName(), node);
addToMap(((EnumConstant)node).astAnnotations(), node);
} else if (node instanceof AnnotationMethodDeclaration) {
addToMap(((AnnotationMethodDeclaration)node).astModifiers(), node);
addToMap(((AnnotationMethodDeclaration)node).astModifiers().astAnnotations(), node);
addToMap(((AnnotationMethodDeclaration)node).astReturnTypeReference(), node);
addToMap(((AnnotationMethodDeclaration)node).astMethodName(), node);
} else if (node instanceof PackageDeclaration) {
addToMap(((PackageDeclaration)node).astAnnotations(), node);
}
} catch (NullPointerException e) {
// Syntax errors in file - javadoc won't get linked up correctly.
}
if (node instanceof JavadocContainer || !nodePositions.containsKey(start)) {
nodePositions.put(start, node);
}
return false;
}
});
for (CommentInfo javadoc : javadocs) {
try {
Integer key = nodePositions.tailMap(javadoc.endPos).firstKey();
Node node = nodePositions.get(key);
if (node instanceof JavadocContainer) {
attachJavadocToNode(javadoc, (JavadocContainer) node);
}
} catch (NoSuchElementException e) {
// Then the javadoc obviously is 'floating', as its the last thing in the file.