From 9cd86f9640b0ca04cc6781f160cd36c5eace43d1 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Fri, 12 Feb 2021 21:43:25 +0100 Subject: [PATCH] [java decompiler] skipping generated `module-info` statements GitOrigin-RevId: c2f9cfd88f57e7d59cca54ec090f67f29377ff23 --- .../java/decompiler/main/ClassWriter.java | 44 +++++++++++------- .../struct/attr/StructModuleAttribute.java | 24 +++++----- testData/classes/java9/module-info.class | Bin 417 -> 443 bytes testData/results/module-info.dec | 4 +- .../java9/sample.module/TestModuleAnno.java | 2 +- .../src/java9/sample.module/module-info.java | 4 +- 6 files changed, 44 insertions(+), 34 deletions(-) diff --git a/src/org/jetbrains/java/decompiler/main/ClassWriter.java b/src/org/jetbrains/java/decompiler/main/ClassWriter.java index 3f111a6..2d57c02 100644 --- a/src/org/jetbrains/java/decompiler/main/ClassWriter.java +++ b/src/org/jetbrains/java/decompiler/main/ClassWriter.java @@ -308,39 +308,45 @@ public class ClassWriter { List requiresEntries = moduleAttribute.requires; if (!requiresEntries.isEmpty()) { for (StructModuleAttribute.RequiresEntry requires : requiresEntries) { - buffer.appendIndent(1).append("requires ").append(requires.moduleName.replace('/', '.')).append(';').appendLineSeparator(); + if (!isGenerated(requires.flags)) { + buffer.appendIndent(1).append("requires ").append(requires.moduleName.replace('/', '.')).append(';').appendLineSeparator(); + newLineNeeded = true; + } } - newLineNeeded = true; } 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); + if (!isGenerated(exports.flags)) { + 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(); } - newLineNeeded = true; } 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); + if (!isGenerated(opens.flags)) { + 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; } - buffer.append(';').appendLineSeparator(); } - newLineNeeded = true; } List usesEntries = moduleAttribute.uses; @@ -363,6 +369,10 @@ public class ClassWriter { } } + private static boolean isGenerated(int flags) { + return (flags & (CodeConstants.ACC_SYNTHETIC | CodeConstants.ACC_MANDATED)) != 0; + } + private static void addTracer(StructClass cls, StructMethod method, BytecodeMappingTracer tracer) { StructLineNumberTableAttribute table = method.getAttribute(StructGeneralAttribute.ATTRIBUTE_LINE_NUMBER_TABLE); tracer.setLineNumberTable(table); @@ -1266,4 +1276,4 @@ public class ClassWriter { } } } -} +} \ No newline at end of file diff --git a/src/org/jetbrains/java/decompiler/struct/attr/StructModuleAttribute.java b/src/org/jetbrains/java/decompiler/struct/attr/StructModuleAttribute.java index ba2005b..9fd6f89 100644 --- a/src/org/jetbrains/java/decompiler/struct/attr/StructModuleAttribute.java +++ b/src/org/jetbrains/java/decompiler/struct/attr/StructModuleAttribute.java @@ -45,11 +45,11 @@ public class StructModuleAttribute extends StructGeneralAttribute { List requires = new ArrayList<>(requiresCount); for (int i = 0; i < requiresCount; i++) { int moduleNameIndex = data.readUnsignedShort(); - int moduleFlags = data.readUnsignedShort(); + int requiresFlags = data.readUnsignedShort(); int versionIndex = data.readUnsignedShort(); String moduleName = pool.getPrimitiveConstant(moduleNameIndex).getString(); String version = versionIndex == 0 ? null : pool.getPrimitiveConstant(versionIndex).getString(); - requires.add(new RequiresEntry(moduleName, moduleFlags, version)); + requires.add(new RequiresEntry(moduleName, requiresFlags, version)); } return requires; } @@ -119,36 +119,36 @@ public class StructModuleAttribute extends StructGeneralAttribute { public static final class RequiresEntry { public final String moduleName; - public final int moduleFlags; + public final int flags; public final String moduleVersion; - public RequiresEntry(String moduleName, int moduleFlags, String moduleVersion) { + public RequiresEntry(String moduleName, int flags, String moduleVersion) { this.moduleName = moduleName; - this.moduleFlags = moduleFlags; + this.flags = flags; this.moduleVersion = moduleVersion; } } public static final class ExportsEntry { public final String packageName; - public final int exportsFlags; + public final int flags; public final List exportToModules; - public ExportsEntry(String packageName, int exportsFlags, List exportToModules) { + public ExportsEntry(String packageName, int flags, List exportToModules) { this.packageName = packageName; - this.exportsFlags = exportsFlags; + this.flags = flags; this.exportToModules = exportToModules; } } public static final class OpensEntry { public final String packageName; - public final int opensFlags; + public final int flags; public final List opensToModules; - public OpensEntry(String packageName, int exportsFlags, List exportToModules) { + public OpensEntry(String packageName, int flags, List exportToModules) { this.packageName = packageName; - this.opensFlags = exportsFlags; + this.flags = flags; this.opensToModules = exportToModules; } } @@ -162,4 +162,4 @@ public class StructModuleAttribute extends StructGeneralAttribute { this.implementationNames = implementationNames; } } -} +} \ No newline at end of file diff --git a/testData/classes/java9/module-info.class b/testData/classes/java9/module-info.class index 0380f41b55f6e340258f1b1a449435fa1567fe77..cc01403116c0dfe7a50deef5fa4835416f0b31ae 100644 GIT binary patch delta 157 zcmZ3;yqlT#)W2Q(7#JAL8Kl`6geLMj@W}WSC*~I9r0N%Br%w#mQWO?u5MgBCFf`ON z(6iJt6lM?=VGt8x5NBtQU}unIXONmWUx$|`E3qt5FD11&yClD0;>o#=4h)m1Sj%3a7paIhKqD9!7#X;LBsT*S0}q(b3l&4>Gcxc2 J)$#+e0060R5w`#U diff --git a/testData/results/module-info.dec b/testData/results/module-info.dec index ec5e268..a2018a5 100644 --- a/testData/results/module-info.dec +++ b/testData/results/module-info.dec @@ -1,8 +1,8 @@ -import pkg.test1.TestModuleAnno; +import sample.pkg1.TestModuleAnno; @TestModuleAnno("...") module sample.module { - requires java.base; + requires java.desktop; exports sample.pkg1; exports sample.pkg2 to diff --git a/testData/src/java9/sample.module/TestModuleAnno.java b/testData/src/java9/sample.module/TestModuleAnno.java index fb28aca..192ee2b 100644 --- a/testData/src/java9/sample.module/TestModuleAnno.java +++ b/testData/src/java9/sample.module/TestModuleAnno.java @@ -1,4 +1,4 @@ -package pkg.test1; +package sample.pkg1; import java.lang.annotation.*; diff --git a/testData/src/java9/sample.module/module-info.java b/testData/src/java9/sample.module/module-info.java index f301ac5..9f42e18 100644 --- a/testData/src/java9/sample.module/module-info.java +++ b/testData/src/java9/sample.module/module-info.java @@ -1,8 +1,8 @@ -import pkg.test1.TestModuleAnno; +import sample.pkg1.TestModuleAnno; @TestModuleAnno("...") module sample.module { - requires java.base; + requires java.desktop; uses java.util.spi.ToolProvider;