diff --git a/src/org/jetbrains/java/decompiler/main/ClassWriter.java b/src/org/jetbrains/java/decompiler/main/ClassWriter.java index 3da67c6..05b93c9 100644 --- a/src/org/jetbrains/java/decompiler/main/ClassWriter.java +++ b/src/org/jetbrains/java/decompiler/main/ClassWriter.java @@ -286,44 +286,63 @@ public class ClassWriter { } private static void writeModuleInfoBody(TextBuffer buffer, StructModuleAttribute moduleAttribute) { - for (StructModuleAttribute.RequiresEntry requires : moduleAttribute.requires) { - buffer.appendIndent(1).append("requires ").append(requires.moduleName.replace('/', '.')).append(';').appendLineSeparator(); - } - - for (StructModuleAttribute.ExportsEntry exports : moduleAttribute.exports) { - buffer.appendIndent(1).append("exports ").append(exports.packageName.replace('/', '.')); + boolean newLineNeeded = false; - List exportToModules = exports.exportToModules; - if (exportToModules.size() > 0) { - buffer.append(" to").appendLineSeparator(); - appendFQClassNames(buffer, exportToModules); + List requiresEntries = moduleAttribute.requires; + if (!requiresEntries.isEmpty()) { + for (StructModuleAttribute.RequiresEntry requires : requiresEntries) { + buffer.appendIndent(1).append("requires ").append(requires.moduleName.replace('/', '.')).append(';').appendLineSeparator(); } - - buffer.append(';').appendLineSeparator(); + newLineNeeded = true; } - for (StructModuleAttribute.OpensEntry opens : moduleAttribute.opens) { - buffer.appendIndent(1).append("opens ").append(opens.packageName.replace('/', '.')); - - List opensToModules = opens.opensToModules; - if (opensToModules.size() > 0) { - buffer.append(" to").appendLineSeparator(); - appendFQClassNames(buffer, opensToModules); + List exportsEntries = moduleAttribute.exports; + if (!exportsEntries.isEmpty()) { + if (newLineNeeded) buffer.appendLineSeparator(); + for (StructModuleAttribute.ExportsEntry exports : exportsEntries) { + buffer.appendIndent(1).append("exports ").append(exports.packageName.replace('/', '.')); + List exportToModules = exports.exportToModules; + if (exportToModules.size() > 0) { + buffer.append(" to").appendLineSeparator(); + appendFQClassNames(buffer, exportToModules); + } + buffer.append(';').appendLineSeparator(); } + newLineNeeded = true; + } - buffer.append(';').appendLineSeparator(); + List opensEntries = moduleAttribute.opens; + if (!opensEntries.isEmpty()) { + if (newLineNeeded) buffer.appendLineSeparator(); + for (StructModuleAttribute.OpensEntry opens : opensEntries) { + buffer.appendIndent(1).append("opens ").append(opens.packageName.replace('/', '.')); + List opensToModules = opens.opensToModules; + if (opensToModules.size() > 0) { + buffer.append(" to").appendLineSeparator(); + appendFQClassNames(buffer, opensToModules); + } + buffer.append(';').appendLineSeparator(); + } + newLineNeeded = true; } - for (String uses : moduleAttribute.uses) { - buffer.appendIndent(1).append("uses ").append(ExprProcessor.buildJavaClassName(uses)).append(';').appendLineSeparator(); + List usesEntries = moduleAttribute.uses; + if (!usesEntries.isEmpty()) { + if (newLineNeeded) buffer.appendLineSeparator(); + for (String uses : usesEntries) { + buffer.appendIndent(1).append("uses ").append(ExprProcessor.buildJavaClassName(uses)).append(';').appendLineSeparator(); + } + newLineNeeded = true; } - for (StructModuleAttribute.ProvidesEntry provides : moduleAttribute.provides) { - buffer.appendIndent(1).append("provides ").append(ExprProcessor.buildJavaClassName(provides.interfaceName)).append(" with").appendLineSeparator(); - @SuppressWarnings({"SSBasedInspection", "RedundantSuppression"}) List javaNames = - provides.implementationNames.stream().map(ExprProcessor::buildJavaClassName).collect(Collectors.toList()); - appendFQClassNames(buffer, javaNames); - buffer.append(';').appendLineSeparator(); + List providesEntries = moduleAttribute.provides; + if (!providesEntries.isEmpty()) { + if (newLineNeeded) buffer.appendLineSeparator(); + for (StructModuleAttribute.ProvidesEntry provides : providesEntries) { + buffer.appendIndent(1).append("provides ").append(ExprProcessor.buildJavaClassName(provides.interfaceName)).append(" with").appendLineSeparator(); + appendFQClassNames(buffer, provides.implementationNames.stream().map(ExprProcessor::buildJavaClassName).collect(Collectors.toList())); + buffer.append(';').appendLineSeparator(); + } } } diff --git a/testData/results/module-info.dec b/testData/results/module-info.dec index 73de684..12d289d 100644 --- a/testData/results/module-info.dec +++ b/testData/results/module-info.dec @@ -1,13 +1,17 @@ @Deprecated module sample.module { requires java.base; + exports sample.pkg1; exports sample.pkg2 to java.base; + opens sample.pkg1; opens sample.pkg2 to java.base; + uses java.util.spi.ToolProvider; + provides sample.pkg1.TestService with sample.pkg1.TestServiceImpl; }