Skip to content

Commit 1102ed5

Browse files
Write message if not all commments are written
1 parent c52636e commit 1102ed5

File tree

3 files changed

+111
-22
lines changed

3 files changed

+111
-22
lines changed

modules/nf-lang/src/main/java/nextflow/script/formatter/Formatter.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
import org.codehaus.groovy.ast.stmt.TryCatchStatement;
6464
import org.codehaus.groovy.runtime.DefaultGroovyMethods;
6565
import org.codehaus.groovy.syntax.Types;
66+
import org.stringtemplate.v4.compiler.STParser.compoundElement_return;
6667

6768
import static nextflow.script.ast.ASTUtils.*;
6869

@@ -91,6 +92,10 @@ public Formatter(FormattingOptions options, CommentWriter commentWriter) {
9192
this.commentWriter = commentWriter;
9293
}
9394

95+
public boolean exit() {
96+
return commentWriter.verifyAllWritten();
97+
}
98+
9499
public void append(char c) {
95100
builder.append(c);
96101
}

modules/nf-lang/src/main/java/nextflow/script/formatter/ScriptFormattingVisitor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ else if( decl instanceof WorkflowNode wn )
144144
visitWorkflow(wn);
145145
}
146146
fmt.appendBlanks(1);
147-
System.out.print(commentWriter.toNFComments());
147+
fmt.exit();
148148
}
149149

150150
public String toString() {

modules/nf-lang/src/main/java/nextflow/script/parser/CommentWriter.java

Lines changed: 105 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public class CommentWriter {
2626
private final List<TokenInfo> tokensWithInfo;
2727
private final Set<Comment> pendingComments = new HashSet<>();
2828
private final Map<ASTNode, List<Comment>> attachedComments = new HashMap<>();
29+
private final Map<ASTNode, Set<Comment>> writtenComments = new HashMap<>();
2930

3031
private final Map<ASTNode, List<Comment>> leadingComments = new HashMap<>();
3132
private final Map<ASTNode, Map<String, List<Comment>>> withinComments = new HashMap<>();
@@ -73,11 +74,10 @@ public String toString() {
7374
}
7475
}
7576

77+
String indent = " ";
7678

77-
public String toNFComments() {
78-
var header = "// CommentWriter with " + commentTokens.size() + " comment tokens";
79-
var unattachedHeader = "// Unattached comments:";
80-
var indent = " ";
79+
public String writeUnattached() {
80+
var unattachedHeader = "Unattached comments:";
8181
var unattachedText = unattachedComments.stream()
8282
.map(t -> {
8383
var line = t.getToken().getLine();
@@ -88,27 +88,35 @@ public String toNFComments() {
8888
var attachedTo = t.getAttachedTo();
8989
var attachedToText = attachedTo != null ? attachedTo.getText() : "null";
9090
return (
91-
"// " + indent + line + ":" + column + "{\n" +
92-
"// " + indent + indent + "content: " + text + "\n" +
93-
"// " + indent + indent + "attach: " + attachedToText + "\n" +
94-
"// " + indent + "}\n"
91+
indent + line + ":" + column + "{\n" +
92+
indent + indent + "content: " + text + "\n" +
93+
indent + indent + "attach: " + attachedToText + "\n" +
94+
indent + "}\n"
9595
);
9696
})
9797
.collect(Collectors.joining("\n"));
98-
var pendingHeader = "// Pending comments:";
98+
return unattachedHeader + unattachedText;
99+
}
100+
101+
public String writePending() {
102+
var pendingHeader = "Pending comments:";
99103
var pendingText = pendingComments.stream()
100104
.map(t -> {
101105
var line = t.getToken().getLine();
102106
var column = t.getToken().getCharPositionInLine();
103107
var text = t.getToken().getText().replaceAll("\n", "\\n");
104108
return (
105-
"// " + indent + line + ":" + column + "{\n" +
106-
"// " + indent + indent + "content: " + text + "\n" +
107-
"// " + indent + "}\n"
109+
indent + line + ":" + column + "{\n" +
110+
indent + indent + "content: " + text + "\n" +
111+
indent + "}\n"
108112
);
109113
})
110114
.collect(Collectors.joining("\n"));
111-
var attachedHeader = "// Attached comments:";
115+
return pendingHeader + pendingText;
116+
}
117+
118+
public String writeAttached() {
119+
var attachedHeader = "Attached comments:";
112120
var attachedText = attachedComments.values()
113121
.stream()
114122
.flatMap(List::stream)
@@ -129,17 +137,63 @@ public String toNFComments() {
129137
(t.isTrailing() ? "trailing " : "")
130138
);
131139
return (
132-
"// " + indent + line + ":" + column + "{\n" +
133-
"// " + indent + indent + "content : " + text + "\n" +
134-
"// " + indent + indent + "attached to: " + attachedToText + "\n" +
135-
"// " + indent + indent + "token : " + t.getPositionInfo() + "\n" +
136-
"// " + indent + indent + "written : " + t.isWritten() + "\n" +
137-
"// " + indent + indent + "rel. pos. : " + relPos + "\n" +
138-
"// " + indent + "}\n"
140+
indent + line + ":" + column + "{\n" +
141+
indent + indent + "content : " + text + "\n" +
142+
indent + indent + "attached to: " + attachedToText + "\n" +
143+
indent + indent + "token : " + t.getPositionInfo() + "\n" +
144+
indent + indent + "written : " + t.isWritten() + "\n" +
145+
indent + indent + "rel. pos. : " + relPos + "\n" +
146+
indent + "}\n"
147+
);
148+
})
149+
.collect(Collectors.joining("\n"));
150+
return attachedHeader + attachedText;
151+
}
152+
153+
public String writeWritten() {
154+
var writtenHeader = "Written comments:";
155+
var writtenText = writtenComments.values()
156+
.stream()
157+
.flatMap(Set::stream)
158+
.map(t -> {
159+
var line = t.getToken().getLine();
160+
var column = t.getToken().getCharPositionInLine();
161+
var text = t.getToken().getText().replaceAll("\n", "\\n");
162+
var isLeading = t.isLeading();
163+
var isTrailing = t.isTrailing();
164+
ASTNode attachedTo = t.getAttachedTo();
165+
var simpleName = attachedTo != null ? attachedTo.getClass().getSimpleName() : null;
166+
var maybeText = attachedTo != null ? attachedTo.getText(): null;
167+
var attachToCode = maybeText != null ? maybeText.replaceAll("\n", "\\n") : "null";
168+
var attachedToText = attachedTo != null ? simpleName + " " + attachToCode : "null";
169+
var relPos = (
170+
(t.isWithin() ? "within " : "")+
171+
(t.isLeading() ? "leading " : "") +
172+
(t.isTrailing() ? "trailing " : "")
173+
);
174+
return (
175+
indent + line + ":" + column + "{\n" +
176+
indent + indent + "content : " + text + "\n" +
177+
indent + indent + "attached to: " + attachedToText + "\n" +
178+
indent + indent + "token : " + t.getPositionInfo() + "\n" +
179+
indent + indent + "written : " + t.isWritten() + "\n" +
180+
indent + indent + "rel. pos. : " + relPos + "\n" +
181+
indent + "}\n"
139182
);
140183
})
141184
.collect(Collectors.joining("\n"));
142-
return header + "\n" + unattachedHeader + "\n" + unattachedText + "\n" + pendingHeader + "\n" + pendingText + "\n" + attachedHeader + "\n" + attachedText;
185+
return writtenHeader + writtenText;
186+
}
187+
188+
189+
public String writeUnWritten() {
190+
var header = "CommentWriter with " + commentTokens.size() + " comment tokens";
191+
return header + "\n" + writeUnattached() + "\n" + writePending() + "\n"+ writeAttached() + "\n";
192+
}
193+
194+
public String writeAll() {
195+
var header = "CommentWriter with " + commentTokens.size() + " comment tokens";
196+
return header + "\n" + writeUnattached() + "\n" + writePending() + "\n"+ writeUnattached() + "\n" + writeWritten();
143197
}
144198

145199
public Map<String, List<Comment>> getAttachedComments(ASTNode node) {
@@ -300,6 +354,23 @@ public Map<String, List<Comment>> getTrailingComments(ASTNode node) {
300354
return trailingComments.getOrDefault(node, new HashMap<>());
301355
}
302356

357+
public boolean verifyAllWritten() {
358+
if (
359+
!(
360+
unattachedComments.size() == 0 &&
361+
pendingComments.size() == 0 &&
362+
attachedComments.size() == 0
363+
)
364+
) {
365+
// Likely replace this error message with an exception
366+
System.err.println("The following comments are left to be written");
367+
System.err.println(writeUnWritten());
368+
return false;
369+
} else {
370+
return true;
371+
}
372+
}
373+
303374
public class Comment {
304375
private final Token token;
305376
private boolean isLeading = false;
@@ -417,6 +488,19 @@ public Tuple2<String, Boolean> write() {
417488
throw new IllegalStateException(this + " already written");
418489
}
419490
isWritten = true;
491+
492+
writtenComments.computeIfAbsent(attachedTo, k -> new HashSet<>()).add(this);
493+
var attachedNodeComments = attachedComments.get(attachedTo);
494+
if (attachedNodeComments.contains(this)) {
495+
if (attachedNodeComments.size() == 1) {
496+
attachedComments.remove(attachedTo);
497+
} else {
498+
attachedNodeComments.remove(this);
499+
}
500+
} else {
501+
throw new IllegalStateException(this + " was not attached to " + attachedTo);
502+
}
503+
420504
return new Tuple2<>(token.getText(), token.getType() == ScriptLexer.SL_COMMENT);
421505
}
422506

0 commit comments

Comments
 (0)