Skip to content

Commit c31bb19

Browse files
committed
Initial support for formatting module-info files
See #75 MOE_MIGRATED_REVID=166107644
1 parent 57eb2b7 commit c31bb19

File tree

5 files changed

+189
-1
lines changed

5 files changed

+189
-1
lines changed

core/src/main/java/com/google/googlejavaformat/java/JavaInputAstVisitor.java

+122-1
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@
7474
import java.util.List;
7575
import java.util.Map;
7676
import java.util.regex.Pattern;
77+
import javax.annotation.Nullable;
7778
import org.openjdk.javax.lang.model.element.Name;
7879
import org.openjdk.source.tree.AnnotatedTypeTree;
7980
import org.openjdk.source.tree.AnnotationTree;
@@ -91,9 +92,11 @@
9192
import org.openjdk.source.tree.CompoundAssignmentTree;
9293
import org.openjdk.source.tree.ConditionalExpressionTree;
9394
import org.openjdk.source.tree.ContinueTree;
95+
import org.openjdk.source.tree.DirectiveTree;
9496
import org.openjdk.source.tree.DoWhileLoopTree;
9597
import org.openjdk.source.tree.EmptyStatementTree;
9698
import org.openjdk.source.tree.EnhancedForLoopTree;
99+
import org.openjdk.source.tree.ExportsTree;
97100
import org.openjdk.source.tree.ExpressionStatementTree;
98101
import org.openjdk.source.tree.ExpressionTree;
99102
import org.openjdk.source.tree.ForLoopTree;
@@ -110,11 +113,15 @@
110113
import org.openjdk.source.tree.MethodInvocationTree;
111114
import org.openjdk.source.tree.MethodTree;
112115
import org.openjdk.source.tree.ModifiersTree;
116+
import org.openjdk.source.tree.ModuleTree;
113117
import org.openjdk.source.tree.NewArrayTree;
114118
import org.openjdk.source.tree.NewClassTree;
119+
import org.openjdk.source.tree.OpensTree;
115120
import org.openjdk.source.tree.ParameterizedTypeTree;
116121
import org.openjdk.source.tree.ParenthesizedTree;
117122
import org.openjdk.source.tree.PrimitiveTypeTree;
123+
import org.openjdk.source.tree.ProvidesTree;
124+
import org.openjdk.source.tree.RequiresTree;
118125
import org.openjdk.source.tree.ReturnTree;
119126
import org.openjdk.source.tree.StatementTree;
120127
import org.openjdk.source.tree.SwitchTree;
@@ -126,6 +133,7 @@
126133
import org.openjdk.source.tree.TypeParameterTree;
127134
import org.openjdk.source.tree.UnaryTree;
128135
import org.openjdk.source.tree.UnionTypeTree;
136+
import org.openjdk.source.tree.UsesTree;
129137
import org.openjdk.source.tree.VariableTree;
130138
import org.openjdk.source.tree.WhileLoopTree;
131139
import org.openjdk.source.tree.WildcardTree;
@@ -1478,7 +1486,7 @@ public Void visitLiteral(LiteralTree node, Void unused) {
14781486
String sourceForNode = getSourceForNode(node, getCurrentPath());
14791487
// A negative numeric literal -n is usually represented as unary minus on n,
14801488
// 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
14821490
// unary minus), but the lexer still expects two tokens.
14831491
if (sourceForNode.startsWith("-")) {
14841492
token("-");
@@ -2304,6 +2312,119 @@ public Void visitIdentifier(IdentifierTree node, Void unused) {
23042312
return null;
23052313
}
23062314

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+
23072428
/** Helper method for import declarations, names, and qualified names. */
23082429
private void visitName(Tree node) {
23092430
Deque<Name> stack = new ArrayDeque<>();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import a.A;
2+
import a.B;
3+
import com.google.Foo;
4+
5+
@A @B
6+
module com.google.m {
7+
requires com.google.r1;
8+
requires transitive com.google.r2;
9+
requires static com.google.r3;
10+
exports com.google.e1;
11+
exports com.google.e1 to com.google.e2;
12+
exports com.google.e1 to com.google.e2, com.google.e3;
13+
exports com.google.e1 to com.google.e2, com.google.e3, com.google.e4;
14+
opens com.google.o1;
15+
opens com.google.o1 to com.google.o2;
16+
opens com.google.o1 to com.google.o2, com.google.o3;
17+
opens com.google.o1 to com.google.o2, com.google.o3, com.googleoe4;
18+
uses Foo;
19+
uses com.google.Bar;
20+
provides com.google.Baz with Foo;
21+
provides com.google.Baz with Foo, com.google.Bar;
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import a.A;
2+
import a.B;
3+
import com.google.Foo;
4+
5+
@A
6+
@B
7+
module com.google.m {
8+
requires com.google.r1;
9+
requires transitive com.google.r2;
10+
requires static com.google.r3;
11+
12+
exports com.google.e1;
13+
exports com.google.e1 to
14+
com.google.e2;
15+
exports com.google.e1 to
16+
com.google.e2,
17+
com.google.e3;
18+
exports com.google.e1 to
19+
com.google.e2,
20+
com.google.e3,
21+
com.google.e4;
22+
23+
opens com.google.o1;
24+
opens com.google.o1 to
25+
com.google.o2;
26+
opens com.google.o1 to
27+
com.google.o2,
28+
com.google.o3;
29+
opens com.google.o1 to
30+
com.google.o2,
31+
com.google.o3,
32+
com.googleoe4;
33+
34+
uses Foo;
35+
uses com.google.Bar;
36+
37+
provides com.google.Baz with
38+
Foo;
39+
provides com.google.Baz with
40+
Foo,
41+
com.google.Bar;
42+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
open module com.google.m {
2+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
open module com.google.m {}

0 commit comments

Comments
 (0)