[java decompiler] separating `module-info` sections

GitOrigin-RevId: 63c315cd01502cbdd76a1ef2c86b3634ce6250fd
master
Roman Shevchenko 3 years ago committed by intellij-monorepo-bot
parent f40b96ebcf
commit 37bb6cf4d8
  1. 75
      src/org/jetbrains/java/decompiler/main/ClassWriter.java
  2. 4
      testData/results/module-info.dec

@ -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<String> exportToModules = exports.exportToModules;
if (exportToModules.size() > 0) {
buffer.append(" to").appendLineSeparator();
appendFQClassNames(buffer, exportToModules);
List<StructModuleAttribute.RequiresEntry> 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<String> opensToModules = opens.opensToModules;
if (opensToModules.size() > 0) {
buffer.append(" to").appendLineSeparator();
appendFQClassNames(buffer, opensToModules);
List<StructModuleAttribute.ExportsEntry> 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<String> exportToModules = exports.exportToModules;
if (exportToModules.size() > 0) {
buffer.append(" to").appendLineSeparator();
appendFQClassNames(buffer, exportToModules);
}
buffer.append(';').appendLineSeparator();
}
newLineNeeded = true;
}
buffer.append(';').appendLineSeparator();
List<StructModuleAttribute.OpensEntry> 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<String> 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<String> 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<String> javaNames =
provides.implementationNames.stream().map(ExprProcessor::buildJavaClassName).collect(Collectors.toList());
appendFQClassNames(buffer, javaNames);
buffer.append(';').appendLineSeparator();
List<StructModuleAttribute.ProvidesEntry> 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();
}
}
}

@ -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;
}

Loading…
Cancel
Save