Javaparser собирает множественные потерянные и не прикрепленные комментарии из внутреннего / вложенного определения класса - PullRequest
0 голосов
/ 03 апреля 2020

Я пишу инструмент для сбора комментариев класса, и я хотел бы собрать все комментарии, которые логически привязаны к классу разработчиками:

public abstract class A {

  private Integer d;



   // comment line
   /**
   * javadoc comment
   */
   class B {
     int c;
   }
 }

или (обратный порядок комментариев)

public abstract class A {
   /**
   * javadoc comment
   */
   // comment line
   class B {
     int c;
   }
 }

моя текущая реализация рекурсивно проходит от CompilationUnit к каждому дочернему узлу (Node) и проверяет, является ли она объявлением класса (или интерфейса). Затем комментарий извлекается из узла через node.getComment(). Проблема в том, что другой комментарий, расположенный сверху первого, не имеет родителя и поэтому не учитывается.

Есть ли способ как-нибудь собрать их всех? (давайте рассмотрим, что они расположены рядом друг с другом, без пропусков новой строки)

1 Ответ

1 голос
/ 10 апреля 2020

Вот решение. Благодарность принадлежит Уэйлону Хуану, который написал этот код .

  /**
   * This is stolen from JavaParser's PrettyPrintVisitor.printOrphanCommentsBeforeThisChildNode,
   * with light modifications.
   *
   * @param node the node whose orphan comments to collect
   * @param result the list to add orphan comments to. Is side-effected by this method. The
   *     implementation uses this to minimize the diffs against upstream.
   */
  @SuppressWarnings({
    "JdkObsolete", // for LinkedList
    "ReferenceEquality"
  })
  private static void getOrphanCommentsBeforeThisChildNode(final Node node, List<Comment> result) {
    if (node instanceof Comment) {
      return;
    }

    Node parent = node.getParentNode().orElse(null);
    if (parent == null) {
      return;
    }
    List<Node> everything = new LinkedList<>(parent.getChildNodes());
    sortByBeginPosition(everything);
    int positionOfTheChild = -1;
    for (int i = 0; i < everything.size(); i++) {
      if (everything.get(i) == node) positionOfTheChild = i;
    }
    if (positionOfTheChild == -1) {
      throw new AssertionError("I am not a child of my parent.");
    }
    int positionOfPreviousChild = -1;
    for (int i = positionOfTheChild - 1; i >= 0 && positionOfPreviousChild == -1; i--) {
      if (!(everything.get(i) instanceof Comment)) positionOfPreviousChild = i;
    }
    for (int i = positionOfPreviousChild + 1; i < positionOfTheChild; i++) {
      Node nodeToPrint = everything.get(i);
      if (!(nodeToPrint instanceof Comment))
        throw new RuntimeException(
            "Expected comment, instead "
                + nodeToPrint.getClass()
                + ". Position of previous child: "
                + positionOfPreviousChild
                + ", position of child "
                + positionOfTheChild);
      result.add((Comment) nodeToPrint);
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...