From 2791e065d9f09f79e18d374e47e6445e4b5f594b Mon Sep 17 00:00:00 2001 From: Peter Donovan Date: Thu, 27 Jul 2023 18:27:14 -0700 Subject: [PATCH 1/2] Fix vscode-lingua-franca#133. --- core/src/main/java/org/lflang/ast/ToLf.java | 38 +++++++++++++++------ 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/core/src/main/java/org/lflang/ast/ToLf.java b/core/src/main/java/org/lflang/ast/ToLf.java index 3cb9b375f5..929dbf6d54 100644 --- a/core/src/main/java/org/lflang/ast/ToLf.java +++ b/core/src/main/java/org/lflang/ast/ToLf.java @@ -2,7 +2,6 @@ import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; import java.util.Comparator; import java.util.HashSet; import java.util.List; @@ -117,14 +116,19 @@ public MalleableString doSwitch(EObject eObject) { Predicate doesNotBelongToPrevious = doesNotBelongToAncestor.and( previous == null ? n -> true : ASTUtils.sameLine(previous).negate()); - Stream precedingComments = - ASTUtils.getPrecedingComments(node, doesNotBelongToPrevious).map(String::strip); - Collection allComments = new ArrayList<>(); - precedingComments.forEachOrdered(allComments::add); - getContainedComments(node).stream() - .filter(doesNotBelongToAncestor) - .map(INode::getText) - .forEachOrdered(allComments::add); + var allComments = new ArrayList(); + if (eObject.eContents().isEmpty() && !(eObject instanceof Code)) { + getContainedComments(node).stream() + .filter(doesNotBelongToAncestor) + .filter(doesNotBelongToPrevious) + .map(INode::getText) + .forEach(allComments::add); + } else { + Stream precedingComments = + ASTUtils.getPrecedingComments(node, doesNotBelongToPrevious).map(String::strip); + precedingComments.forEachOrdered(allComments::add); + getContainedCodeComments(node).stream().map(INode::getText).forEach(allComments::add); + } allComments.addAll(followingComments); if (allComments.stream().anyMatch(s -> KEEP_FORMAT_COMMENT.matcher(s).matches())) { return MalleableString.anyOf(StringUtil.trimCodeBlock(node.getText(), 0)) @@ -140,7 +144,7 @@ static Set getAncestorComments(INode node) { for (ICompositeNode ancestor = node.getParent(); ancestor != null; ancestor = ancestor.getParent()) { - ancestorComments.addAll(getContainedComments(ancestor)); + ancestorComments.addAll(getContainedCodeComments(ancestor)); ASTUtils.getPrecedingCommentNodes(ancestor, u -> true).forEachOrdered(ancestorComments::add); } return ancestorComments; @@ -192,7 +196,7 @@ private static Stream getFollowingComments( * Return comments contained by {@code node} that logically belong to this node (and not to any of * its children). */ - private static List getContainedComments(INode node) { + private static List getContainedCodeComments(INode node) { ArrayList ret = new ArrayList<>(); boolean inSemanticallyInsignificantLeadingRubbish = true; for (INode child : node.getAsTreeIterable()) { @@ -212,6 +216,18 @@ private static List getContainedComments(INode node) { return ret; } + /** + * Return all comments that are part of {@code node}, regardless of where they appear relative to + * the main content of the node. + */ + private static List getContainedComments(INode node) { + var ret = new ArrayList(); + for (INode child : node.getAsTreeIterable()) { + if (ASTUtils.isComment(child)) ret.add(child); + } + return ret; + } + @Override public MalleableString caseCodeExpr(CodeExpr object) { return caseCode(object.getCode()); From 0c0171c9b53e40481e68ec8042b5c204168e95d1 Mon Sep 17 00:00:00 2001 From: Peter Donovan Date: Mon, 31 Jul 2023 11:43:26 -0700 Subject: [PATCH 2/2] Fix comment duplication bug. The change on line 130 (filter out ancestor comments) is the relevant one. This is just a matter of accidentally deleting one tiny bit of code that was in master. --- core/src/main/java/org/lflang/ast/ToLf.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/org/lflang/ast/ToLf.java b/core/src/main/java/org/lflang/ast/ToLf.java index 929dbf6d54..9646bea79c 100644 --- a/core/src/main/java/org/lflang/ast/ToLf.java +++ b/core/src/main/java/org/lflang/ast/ToLf.java @@ -125,9 +125,13 @@ public MalleableString doSwitch(EObject eObject) { .forEach(allComments::add); } else { Stream precedingComments = - ASTUtils.getPrecedingComments(node, doesNotBelongToPrevious).map(String::strip); + ASTUtils.getPrecedingComments(node, doesNotBelongToPrevious.and(doesNotBelongToAncestor)) + .map(String::strip); precedingComments.forEachOrdered(allComments::add); - getContainedCodeComments(node).stream().map(INode::getText).forEach(allComments::add); + getContainedCodeComments(node).stream() + .filter(doesNotBelongToAncestor) + .map(INode::getText) + .forEach(allComments::add); } allComments.addAll(followingComments); if (allComments.stream().anyMatch(s -> KEEP_FORMAT_COMMENT.matcher(s).matches())) { @@ -146,6 +150,7 @@ static Set getAncestorComments(INode node) { ancestor = ancestor.getParent()) { ancestorComments.addAll(getContainedCodeComments(ancestor)); ASTUtils.getPrecedingCommentNodes(ancestor, u -> true).forEachOrdered(ancestorComments::add); + ancestorComments.addAll(getContainedCodeComments(ancestor)); } return ancestorComments; }