--- old/src/jdk.compiler/share/classes/com/sun/tools/javac/processing/PrintingProcessor.java 2017-03-09 17:16:13.098441101 -0800 +++ new/src/jdk.compiler/share/classes/com/sun/tools/javac/processing/PrintingProcessor.java 2017-03-09 17:16:12.870441111 -0800 @@ -323,72 +323,77 @@ private void printDirective(ModuleElement.Directive directive) { indent(); - switch (directive.getKind()) { - case EXPORTS: // "exports package-name [to module-name-list]" - { - ExportsDirective exportsDirective = (ExportsDirective) directive; - writer.print("exports "); - writer.print(exportsDirective.getPackage().getQualifiedName()); - printModuleList(exportsDirective.getTargetModules()); - } - break; + (new PrintDirective(writer)).visit(directive); + writer.println(";"); + } - case OPENS: // opens package-name [to module-name-list] - { - OpensDirective opensDirective = (OpensDirective) directive; - writer.print("opens "); - writer.print(opensDirective.getPackage().getQualifiedName()); - printModuleList(opensDirective.getTargetModules()); - } - break; + private static class PrintDirective implements ModuleElement.DirectiveVisitor { + private final PrintWriter writer; - case PROVIDES: // provides service-name with implementation-name - { - ProvidesDirective providesDirective = (ProvidesDirective) directive; - writer.print("provides "); - writer.print(providesDirective.getService().getQualifiedName()); - writer.print(" with "); - printNameableList(providesDirective.getImplementations()); - } - break; + PrintDirective(PrintWriter writer) { + this.writer = writer; + } - case REQUIRES: // requires (static|transitive)* module-name - { - RequiresDirective requiresDirective = (RequiresDirective) directive; - writer.print("requires "); - if (requiresDirective.isStatic()) - writer.print("static "); - if (requiresDirective.isTransitive()) - writer.print("transitive "); - writer.print(requiresDirective.getDependency().getQualifiedName()); - } - break; + @Override + public Void visitExports(ExportsDirective d, Void p) { + // "exports package-name [to module-name-list]" + writer.print("exports "); + writer.print(d.getPackage().getQualifiedName()); + printModuleList(d.getTargetModules()); + return null; + } - case USES: // uses service-name - { - UsesDirective usesDirective = (UsesDirective) directive; - writer.print("uses "); - writer.print(usesDirective.getService().getQualifiedName()); - } - break; + @Override + public Void visitOpens(OpensDirective d, Void p) { + // opens package-name [to module-name-list] + writer.print("opens "); + writer.print(d.getPackage().getQualifiedName()); + printModuleList(d.getTargetModules()); + return null; + } - default: - throw new UnsupportedOperationException("unknown directive " + directive); + @Override + public Void visitProvides(ProvidesDirective d, Void p) { + // provides service-name with implementation-name + writer.print("provides "); + writer.print(d.getService().getQualifiedName()); + writer.print(" with "); + printNameableList(d.getImplementations()); + return null; } - writer.println(";"); - } - private void printModuleList(List modules) { - if (modules != null) { - writer.print(" to "); - printNameableList(modules); + @Override + public Void visitRequires(RequiresDirective d, Void p) { + // requires (static|transitive)* module-name + writer.print("requires "); + if (d.isStatic()) + writer.print("static "); + if (d.isTransitive()) + writer.print("transitive "); + writer.print(d.getDependency().getQualifiedName()); + return null; + } + + @Override + public Void visitUses(UsesDirective d, Void p) { + // uses service-name + writer.print("uses "); + writer.print(d.getService().getQualifiedName()); + return null; } - } - private void printNameableList(List nameables) { + private void printModuleList(List modules) { + if (modules != null) { + writer.print(" to "); + printNameableList(modules); + } + } + + private void printNameableList(List nameables) { writer.print(nameables.stream(). map(QualifiedNameable::getQualifiedName). collect(Collectors.joining(", "))); + } } public void flush() {