|
74 | 74 | import java.util.List;
|
75 | 75 | import java.util.Map;
|
76 | 76 | import java.util.regex.Pattern;
|
| 77 | +import javax.annotation.Nullable; |
77 | 78 | import org.openjdk.javax.lang.model.element.Name;
|
78 | 79 | import org.openjdk.source.tree.AnnotatedTypeTree;
|
79 | 80 | import org.openjdk.source.tree.AnnotationTree;
|
|
91 | 92 | import org.openjdk.source.tree.CompoundAssignmentTree;
|
92 | 93 | import org.openjdk.source.tree.ConditionalExpressionTree;
|
93 | 94 | import org.openjdk.source.tree.ContinueTree;
|
| 95 | +import org.openjdk.source.tree.DirectiveTree; |
94 | 96 | import org.openjdk.source.tree.DoWhileLoopTree;
|
95 | 97 | import org.openjdk.source.tree.EmptyStatementTree;
|
96 | 98 | import org.openjdk.source.tree.EnhancedForLoopTree;
|
| 99 | +import org.openjdk.source.tree.ExportsTree; |
97 | 100 | import org.openjdk.source.tree.ExpressionStatementTree;
|
98 | 101 | import org.openjdk.source.tree.ExpressionTree;
|
99 | 102 | import org.openjdk.source.tree.ForLoopTree;
|
|
110 | 113 | import org.openjdk.source.tree.MethodInvocationTree;
|
111 | 114 | import org.openjdk.source.tree.MethodTree;
|
112 | 115 | import org.openjdk.source.tree.ModifiersTree;
|
| 116 | +import org.openjdk.source.tree.ModuleTree; |
113 | 117 | import org.openjdk.source.tree.NewArrayTree;
|
114 | 118 | import org.openjdk.source.tree.NewClassTree;
|
| 119 | +import org.openjdk.source.tree.OpensTree; |
115 | 120 | import org.openjdk.source.tree.ParameterizedTypeTree;
|
116 | 121 | import org.openjdk.source.tree.ParenthesizedTree;
|
117 | 122 | import org.openjdk.source.tree.PrimitiveTypeTree;
|
| 123 | +import org.openjdk.source.tree.ProvidesTree; |
| 124 | +import org.openjdk.source.tree.RequiresTree; |
118 | 125 | import org.openjdk.source.tree.ReturnTree;
|
119 | 126 | import org.openjdk.source.tree.StatementTree;
|
120 | 127 | import org.openjdk.source.tree.SwitchTree;
|
|
126 | 133 | import org.openjdk.source.tree.TypeParameterTree;
|
127 | 134 | import org.openjdk.source.tree.UnaryTree;
|
128 | 135 | import org.openjdk.source.tree.UnionTypeTree;
|
| 136 | +import org.openjdk.source.tree.UsesTree; |
129 | 137 | import org.openjdk.source.tree.VariableTree;
|
130 | 138 | import org.openjdk.source.tree.WhileLoopTree;
|
131 | 139 | import org.openjdk.source.tree.WildcardTree;
|
@@ -1478,7 +1486,7 @@ public Void visitLiteral(LiteralTree node, Void unused) {
|
1478 | 1486 | String sourceForNode = getSourceForNode(node, getCurrentPath());
|
1479 | 1487 | // A negative numeric literal -n is usually represented as unary minus on n,
|
1480 | 1488 | // but that doesn't work for integer or long MIN_VALUE. The parser works
|
1481 |
| - // around that by representing it directly as a singed literal (with no |
| 1489 | + // around that by representing it directly as a signed literal (with no |
1482 | 1490 | // unary minus), but the lexer still expects two tokens.
|
1483 | 1491 | if (sourceForNode.startsWith("-")) {
|
1484 | 1492 | token("-");
|
@@ -2304,6 +2312,119 @@ public Void visitIdentifier(IdentifierTree node, Void unused) {
|
2304 | 2312 | return null;
|
2305 | 2313 | }
|
2306 | 2314 |
|
| 2315 | + @Override |
| 2316 | + public Void visitModule(ModuleTree node, Void unused) { |
| 2317 | + for (AnnotationTree annotation : node.getAnnotations()) { |
| 2318 | + scan(annotation, null); |
| 2319 | + builder.forcedBreak(); |
| 2320 | + } |
| 2321 | + if (node.getModuleType() == ModuleTree.ModuleKind.OPEN) { |
| 2322 | + token("open"); |
| 2323 | + builder.space(); |
| 2324 | + } |
| 2325 | + token("module"); |
| 2326 | + builder.space(); |
| 2327 | + scan(node.getName(), null); |
| 2328 | + builder.space(); |
| 2329 | + if (node.getDirectives().isEmpty()) { |
| 2330 | + tokenBreakTrailingComment("{", plusTwo); |
| 2331 | + builder.blankLineWanted(BlankLineWanted.NO); |
| 2332 | + token("}", plusTwo); |
| 2333 | + } else { |
| 2334 | + builder.open(plusTwo); |
| 2335 | + token("{"); |
| 2336 | + builder.forcedBreak(); |
| 2337 | + Optional<Tree.Kind> previousDirective = Optional.absent(); |
| 2338 | + for (DirectiveTree directiveTree : node.getDirectives()) { |
| 2339 | + markForPartialFormat(); |
| 2340 | + builder.blankLineWanted( |
| 2341 | + previousDirective.transform(k -> !k.equals(directiveTree.getKind())).or(false) |
| 2342 | + ? BlankLineWanted.YES |
| 2343 | + : BlankLineWanted.NO); |
| 2344 | + builder.forcedBreak(); |
| 2345 | + scan(directiveTree, null); |
| 2346 | + previousDirective = Optional.of(directiveTree.getKind()); |
| 2347 | + } |
| 2348 | + builder.close(); |
| 2349 | + builder.forcedBreak(); |
| 2350 | + token("}"); |
| 2351 | + } |
| 2352 | + return null; |
| 2353 | + } |
| 2354 | + |
| 2355 | + private void visitDirective( |
| 2356 | + String name, |
| 2357 | + String separator, |
| 2358 | + ExpressionTree nameExpression, |
| 2359 | + @Nullable List<? extends ExpressionTree> items) { |
| 2360 | + token(name); |
| 2361 | + builder.space(); |
| 2362 | + scan(nameExpression, null); |
| 2363 | + if (items != null) { |
| 2364 | + builder.open(plusFour); |
| 2365 | + builder.space(); |
| 2366 | + token(separator); |
| 2367 | + builder.forcedBreak(); |
| 2368 | + boolean first = true; |
| 2369 | + for (ExpressionTree item : items) { |
| 2370 | + if (!first) { |
| 2371 | + token(","); |
| 2372 | + builder.forcedBreak(); |
| 2373 | + } |
| 2374 | + scan(item, null); |
| 2375 | + first = false; |
| 2376 | + } |
| 2377 | + token(";"); |
| 2378 | + builder.close(); |
| 2379 | + } else { |
| 2380 | + token(";"); |
| 2381 | + } |
| 2382 | + } |
| 2383 | + |
| 2384 | + @Override |
| 2385 | + public Void visitExports(ExportsTree node, Void unused) { |
| 2386 | + visitDirective("exports", "to", node.getPackageName(), node.getModuleNames()); |
| 2387 | + return null; |
| 2388 | + } |
| 2389 | + |
| 2390 | + @Override |
| 2391 | + public Void visitOpens(OpensTree node, Void unused) { |
| 2392 | + visitDirective("opens", "to", node.getPackageName(), node.getModuleNames()); |
| 2393 | + return null; |
| 2394 | + } |
| 2395 | + |
| 2396 | + @Override |
| 2397 | + public Void visitProvides(ProvidesTree node, Void unused) { |
| 2398 | + visitDirective("provides", "with", node.getServiceName(), node.getImplementationNames()); |
| 2399 | + return null; |
| 2400 | + } |
| 2401 | + |
| 2402 | + @Override |
| 2403 | + public Void visitRequires(RequiresTree node, Void unused) { |
| 2404 | + token("requires"); |
| 2405 | + builder.space(); |
| 2406 | + if (builder.peekToken().equals(Optional.of("static"))) { |
| 2407 | + token("static"); |
| 2408 | + builder.space(); |
| 2409 | + } |
| 2410 | + if (builder.peekToken().equals(Optional.of("transitive"))) { |
| 2411 | + token("transitive"); |
| 2412 | + builder.space(); |
| 2413 | + } |
| 2414 | + scan(node.getModuleName(), null); |
| 2415 | + token(";"); |
| 2416 | + return null; |
| 2417 | + } |
| 2418 | + |
| 2419 | + @Override |
| 2420 | + public Void visitUses(UsesTree node, Void unused) { |
| 2421 | + token("uses"); |
| 2422 | + builder.space(); |
| 2423 | + scan(node.getServiceName(), null); |
| 2424 | + token(";"); |
| 2425 | + return null; |
| 2426 | + } |
| 2427 | + |
2307 | 2428 | /** Helper method for import declarations, names, and qualified names. */
|
2308 | 2429 | private void visitName(Tree node) {
|
2309 | 2430 | Deque<Name> stack = new ArrayDeque<>();
|
|
0 commit comments