From 6d43730a762ed4a54321d14c8a4b5c3af2b80e23 Mon Sep 17 00:00:00 2001 From: J. Fronny Date: Thu, 21 Aug 2025 20:11:13 +0200 Subject: Get rid of Guava (#555) * Get rid of Guava * Fix NPE * Apply suggestions from review * Checkstyle * Add braces to precondition checks * Forbid space--- README.md | 1 - build.gradle | 1 - .../main/java/cuchaz/enigma/command/Command.java | 3 +- .../enigma/network/DedicatedEnigmaServer.java | 3 +- .../java/cuchaz/enigma/network/ServerAddress.java | 4 +- .../main/java/cuchaz/enigma/gui/EditableType.java | 2 +- .../src/main/java/cuchaz/enigma/gui/Gui.java | 3 +- .../main/java/cuchaz/enigma/gui/GuiController.java | 6 +- .../src/main/java/cuchaz/enigma/gui/Main.java | 3 +- .../enigma/gui/config/OldConfigImporter.java | 3 +- .../main/java/cuchaz/enigma/gui/config/Themes.java | 13 ++-- .../cuchaz/enigma/gui/config/legacy/Config.java | 18 +++--- .../cuchaz/enigma/gui/dialog/JavadocDialog.java | 5 +- .../gui/elements/AbstractInheritanceTree.java | 3 +- .../enigma/gui/elements/EditorTabbedPane.java | 9 +-- .../enigma/gui/elements/ImplementationsTree.java | 3 +- .../enigma/gui/elements/InheritanceTree.java | 3 +- .../cuchaz/enigma/gui/elements/ValidatableUi.java | 2 +- .../enigma/gui/panels/ClosableTabTitlePane.java | 3 +- .../java/cuchaz/enigma/gui/panels/EditorPanel.java | 2 +- .../main/java/cuchaz/enigma/gui/util/GuiUtil.java | 4 +- .../main/java/cuchaz/enigma/gui/util/History.java | 7 +-- enigma/build.gradle | 17 ++++-- enigma/src/main/java/cuchaz/enigma/Enigma.java | 19 +++--- .../src/main/java/cuchaz/enigma/EnigmaProfile.java | 3 +- .../src/main/java/cuchaz/enigma/EnigmaProject.java | 10 ++-- .../main/java/cuchaz/enigma/EnigmaServices.java | 9 ++- .../analysis/ClassImplementationsTreeNode.java | 5 +- .../enigma/analysis/ClassInheritanceTreeNode.java | 5 +- .../enigma/analysis/ClassReferenceTreeNode.java | 5 +- .../cuchaz/enigma/analysis/IndexTreeBuilder.java | 7 +-- .../analysis/MethodImplementationsTreeNode.java | 5 +- .../enigma/analysis/MethodReferenceTreeNode.java | 5 +- .../enigma/analysis/index/BridgeMethodIndex.java | 2 +- .../cuchaz/enigma/analysis/index/EntryIndex.java | 2 +- .../enigma/analysis/index/InheritanceIndex.java | 4 +- .../analysis/index/PackageVisibilityIndex.java | 14 ++--- .../translators/LocalVariableFixVisitor.java | 3 +- .../cuchaz/enigma/classhandle/ClassHandle.java | 2 +- .../enigma/classhandle/ClassHandleError.java | 2 +- .../enigma/classhandle/ClassHandleProvider.java | 2 +- .../enigma/classprovider/CachingClassProvider.java | 69 ++++++++++++++++++---- .../cuchaz/enigma/classprovider/ClassProvider.java | 3 +- .../classprovider/ClasspathClassProvider.java | 3 +- .../classprovider/CombiningClassProvider.java | 3 +- .../enigma/classprovider/JarClassProvider.java | 27 +++++---- .../classprovider/ObfuscationFixClassProvider.java | 3 +- .../enigma/source/DecompiledClassSource.java | 2 +- .../main/java/cuchaz/enigma/source/Decompiler.java | 2 +- .../java/cuchaz/enigma/source/SourceIndex.java | 38 ++++++------ .../enigma/source/bytecode/BytecodeDecompiler.java | 2 +- .../cuchaz/enigma/source/cfr/CfrDecompiler.java | 2 +- .../java/cuchaz/enigma/source/cfr/CfrDumper.java | 2 +- .../java/cuchaz/enigma/source/cfr/CfrSource.java | 2 +- .../enigma/source/procyon/ProcyonDecompiler.java | 2 +- .../procyon/index/SourceIndexMethodVisitor.java | 14 +++-- .../transformers/AddJavadocsAstTransform.java | 9 ++- .../source/vineflower/VineflowerDecompiler.java | 2 +- .../enigma/translation/MappingTranslator.java | 2 +- .../enigma/translation/ProposingTranslator.java | 2 +- .../enigma/translation/SignatureUpdater.java | 5 +- .../java/cuchaz/enigma/translation/Translator.java | 15 +++-- .../enigma/translation/mapping/EntryChange.java | 2 +- .../enigma/translation/mapping/EntryMap.java | 2 +- .../enigma/translation/mapping/EntryMapping.java | 6 +- .../enigma/translation/mapping/EntryRemapper.java | 10 ++-- .../enigma/translation/mapping/EntryResolver.java | 15 ++++- .../enigma/translation/mapping/EntryUtil.java | 4 +- .../translation/mapping/IndexEntryResolver.java | 2 +- .../enigma/translation/mapping/MappingPair.java | 2 +- .../translation/mapping/MappingValidator.java | 2 +- .../translation/mapping/serde/MappingFormat.java | 3 +- .../mapping/serde/MappingIoConverter.java | 3 +- .../mapping/serde/enigma/EnigmaMappingsReader.java | 7 +-- .../mapping/serde/enigma/EnigmaMappingsWriter.java | 11 ++-- .../mapping/serde/recaf/RecafMappingsWriter.java | 5 +- .../mapping/serde/srg/SrgMappingsWriter.java | 8 +-- .../mapping/serde/tiny/TinyMappingsReader.java | 5 +- .../mapping/serde/tiny/TinyMappingsWriter.java | 9 +-- .../mapping/serde/tinyv2/TinyV2Writer.java | 4 +- .../mapping/tree/DeltaTrackingTree.java | 10 +++- .../enigma/translation/mapping/tree/EntryTree.java | 4 +- .../translation/mapping/tree/EntryTreeNode.java | 12 +++- .../translation/mapping/tree/HashEntryTree.java | 14 +++-- .../translation/mapping/tree/HashTreeNode.java | 6 +- .../representation/MethodDescriptor.java | 7 +-- .../translation/representation/TypeDescriptor.java | 9 ++- .../representation/entry/ClassDefEntry.java | 15 ++--- .../representation/entry/ClassEntry.java | 8 +-- .../translation/representation/entry/Entry.java | 2 +- .../representation/entry/FieldDefEntry.java | 12 ++-- .../representation/entry/FieldEntry.java | 13 ++-- .../entry/LocalVariableDefEntry.java | 9 ++- .../representation/entry/LocalVariableEntry.java | 13 ++-- .../representation/entry/MethodDefEntry.java | 12 ++-- .../representation/entry/MethodEntry.java | 13 ++-- .../representation/entry/ParentedEntry.java | 14 ++--- enigma/src/main/java/cuchaz/enigma/utils/I18n.java | 34 +++++------ .../src/main/java/cuchaz/enigma/utils/Utils.java | 11 ++-- .../enigma/utils/validation/ValidationContext.java | 2 +- .../src/test/java/cuchaz/enigma/TokenChecker.java | 5 +- .../translation/mapping/serde/recaf/TestRecaf.java | 3 +- 102 files changed, 399 insertions(+), 360 deletions(-) diff --git a/README.md b/README.md index 08cc0c92..0327da11 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,6 @@ Enigma includes the following open-source libraries: - [Vineflower](https://github.com/Vineflower/vineflower) (Apache-2.0) - A [modified version](https://github.com/FabricMC/cfr) of [CFR](https://github.com/leibnitz27/cfr) (MIT) - A [modified version](https://github.com/FabricMC/procyon) of [Procyon](https://bitbucket.org/mstrobel/procyon) (Apache-2.0) -- [Guava](https://github.com/google/guava) (Apache-2.0) - [SyntaxPane](https://github.com/Sciss/SyntaxPane) (Apache-2.0) - [FlatLaf](https://github.com/JFormDesigner/FlatLaf) (Apache-2.0) - [jopt-simple](https://github.com/jopt-simple/jopt-simple) (MIT) diff --git a/build.gradle b/build.gradle index 4453ab93..9f311844 100644 --- a/build.gradle +++ b/build.gradle @@ -17,7 +17,6 @@ subprojects { } dependencies { - implementation 'com.google.guava:guava:32.1.2-jre' implementation 'com.google.code.gson:gson:2.10.1' implementation 'net.fabricmc:mapping-io:0.7.1' diff --git a/enigma-cli/src/main/java/cuchaz/enigma/command/Command.java b/enigma-cli/src/main/java/cuchaz/enigma/command/Command.java index de06fa6e..06c49162 100644 --- a/enigma-cli/src/main/java/cuchaz/enigma/command/Command.java +++ b/enigma-cli/src/main/java/cuchaz/enigma/command/Command.java @@ -6,7 +6,6 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import com.google.common.io.MoreFiles; import net.fabricmc.mappingio.MappingReader; import net.fabricmc.mappingio.tree.MemoryMappingTree; import net.fabricmc.mappingio.tree.VisitableMappingTree; @@ -57,7 +56,7 @@ public abstract class Command { protected static EntryTree readMappings(Path path, ProgressListener progress, MappingSaveParameters saveParameters) throws IOException, MappingParseException { // Legacy - if ("zip".equalsIgnoreCase(MoreFiles.getFileExtension(path))) { + if (path.getFileName().toString().toLowerCase().endsWith(".zip")) { return MappingFormat.ENIGMA_ZIP.read(path, progress, saveParameters, null); } diff --git a/enigma-server/src/main/java/cuchaz/enigma/network/DedicatedEnigmaServer.java b/enigma-server/src/main/java/cuchaz/enigma/network/DedicatedEnigmaServer.java index f20a9d29..af5e34b3 100644 --- a/enigma-server/src/main/java/cuchaz/enigma/network/DedicatedEnigmaServer.java +++ b/enigma-server/src/main/java/cuchaz/enigma/network/DedicatedEnigmaServer.java @@ -11,7 +11,6 @@ import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingDeque; import java.util.concurrent.TimeUnit; -import com.google.common.io.MoreFiles; import joptsimple.OptionParser; import joptsimple.OptionSet; import joptsimple.OptionSpec; @@ -103,7 +102,7 @@ public class DedicatedEnigmaServer extends EnigmaServer { if (Files.isDirectory(mappingsFile)) { mappingFormat = MappingFormat.ENIGMA_DIRECTORY; - } else if ("zip".equalsIgnoreCase(MoreFiles.getFileExtension(mappingsFile))) { + } else if (mappingsFile.getFileName().toString().toLowerCase().endsWith(".zip")) { mappingFormat = MappingFormat.ENIGMA_ZIP; } else { mappingFormat = MappingFormat.ENIGMA_FILE; diff --git a/enigma-server/src/main/java/cuchaz/enigma/network/ServerAddress.java b/enigma-server/src/main/java/cuchaz/enigma/network/ServerAddress.java index a8a10296..09a13ccb 100644 --- a/enigma-server/src/main/java/cuchaz/enigma/network/ServerAddress.java +++ b/enigma-server/src/main/java/cuchaz/enigma/network/ServerAddress.java @@ -2,7 +2,7 @@ package cuchaz.enigma.network; import java.util.Objects; -import javax.annotation.Nullable; +import org.jetbrains.annotations.Nullable; public class ServerAddress { public final String address; @@ -23,7 +23,7 @@ public class ServerAddress { return null; } - if (address.equals("")) { + if (address.isEmpty()) { return null; } diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/EditableType.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/EditableType.java index 6028609f..a70c9b57 100644 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/EditableType.java +++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/EditableType.java @@ -1,6 +1,6 @@ package cuchaz.enigma.gui; -import javax.annotation.Nullable; +import org.jetbrains.annotations.Nullable; import cuchaz.enigma.translation.representation.entry.ClassEntry; import cuchaz.enigma.translation.representation.entry.Entry; diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/Gui.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/Gui.java index 21120b8a..c85c4044 100644 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/Gui.java +++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/Gui.java @@ -23,7 +23,6 @@ import java.util.concurrent.CompletableFuture; import java.util.function.Consumer; import java.util.function.Function; -import javax.annotation.Nullable; import javax.swing.AbstractAction; import javax.swing.DefaultListModel; import javax.swing.JButton; @@ -42,6 +41,8 @@ import javax.swing.SwingUtilities; import javax.swing.WindowConstants; import javax.swing.tree.DefaultMutableTreeNode; +import org.jetbrains.annotations.Nullable; + import cuchaz.enigma.Enigma; import cuchaz.enigma.EnigmaProfile; import cuchaz.enigma.analysis.EntryReference; diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/GuiController.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/GuiController.java index ece11b00..e8e4dbde 100644 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/GuiController.java +++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/GuiController.java @@ -17,6 +17,7 @@ import java.io.FileWriter; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Path; +import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Objects; @@ -29,7 +30,6 @@ import java.util.stream.Stream; import javax.swing.JOptionPane; import javax.swing.SwingUtilities; -import com.google.common.collect.Lists; import org.jetbrains.annotations.ApiStatus; import cuchaz.enigma.Enigma; @@ -414,8 +414,8 @@ public class GuiController implements ClientPacketHandler { return; } - List obfClasses = Lists.newArrayList(); - List deobfClasses = Lists.newArrayList(); + List obfClasses = new ArrayList<>(); + List deobfClasses = new ArrayList<>(); this.addSeparatedClasses(obfClasses, deobfClasses); this.gui.setObfClasses(obfClasses); this.gui.setDeobfClasses(deobfClasses); diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/Main.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/Main.java index 43b16cd9..dc58464c 100644 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/Main.java +++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/Main.java @@ -20,7 +20,6 @@ import java.util.EnumSet; import java.util.List; import java.util.Set; -import com.google.common.io.MoreFiles; import joptsimple.OptionException; import joptsimple.OptionParser; import joptsimple.OptionSet; @@ -144,7 +143,7 @@ public class Main { if (Files.isDirectory(mappingsPath)) { controller.openMappings(MappingFormat.ENIGMA_DIRECTORY, mappingsPath); - } else if ("zip".equalsIgnoreCase(MoreFiles.getFileExtension(mappingsPath))) { + } else if (mappingsPath.getFileName().toString().toLowerCase().endsWith(".zip")) { controller.openMappings(MappingFormat.ENIGMA_ZIP, mappingsPath); } else { controller.openMappings(MappingFormat.ENIGMA_FILE, mappingsPath); diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/config/OldConfigImporter.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/config/OldConfigImporter.java index 2e84991b..181b2866 100644 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/config/OldConfigImporter.java +++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/config/OldConfigImporter.java @@ -1,6 +1,7 @@ package cuchaz.enigma.gui.config; import java.awt.Font; +import java.nio.file.Files; import cuchaz.enigma.gui.config.legacy.Config; @@ -10,7 +11,7 @@ public final class OldConfigImporter { @SuppressWarnings("deprecation") public static void doImport() { - if (Config.CONFIG_FILE.exists()) { + if (Files.exists(Config.CONFIG_FILE)) { Config config = new Config(); if (config.editorFont != null) { diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/config/Themes.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/config/Themes.java index e2db9682..d2a6608c 100644 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/config/Themes.java +++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/config/Themes.java @@ -2,11 +2,11 @@ package cuchaz.enigma.gui.config; import java.awt.Font; import java.util.HashSet; +import java.util.Map; import java.util.Set; import javax.swing.UIManager; -import com.google.common.collect.ImmutableMap; import de.sciss.syntaxpane.DefaultSyntaxKit; import cuchaz.enigma.gui.EnigmaSyntaxKit; @@ -30,7 +30,7 @@ public class Themes { EnigmaSyntaxKit.invalidate(); DefaultSyntaxKit.initKit(); DefaultSyntaxKit.registerContentType("text/enigma-sources", EnigmaSyntaxKit.class.getName()); - ImmutableMap boxHighlightPainters = getBoxHighlightPainters(); + Map boxHighlightPainters = getBoxHighlightPainters(); listeners.forEach(l -> l.onThemeChanged(laf, boxHighlightPainters)); ScaleUtil.applyScaling(); UiConfig.save(); @@ -85,9 +85,12 @@ public class Themes { } } - public static ImmutableMap getBoxHighlightPainters() { - return ImmutableMap.of(RenamableTokenType.OBFUSCATED, BoxHighlightPainter.create(UiConfig.getObfuscatedColor(), UiConfig.getObfuscatedOutlineColor()), RenamableTokenType.PROPOSED, BoxHighlightPainter.create(UiConfig.getProposedColor(), UiConfig.getProposedOutlineColor()), - RenamableTokenType.DEOBFUSCATED, BoxHighlightPainter.create(UiConfig.getDeobfuscatedColor(), UiConfig.getDeobfuscatedOutlineColor())); + public static Map getBoxHighlightPainters() { + return Map.of( + RenamableTokenType.OBFUSCATED, BoxHighlightPainter.create(UiConfig.getObfuscatedColor(), UiConfig.getObfuscatedOutlineColor()), + RenamableTokenType.PROPOSED, BoxHighlightPainter.create(UiConfig.getProposedColor(), UiConfig.getProposedOutlineColor()), + RenamableTokenType.DEOBFUSCATED, BoxHighlightPainter.create(UiConfig.getDeobfuscatedColor(), UiConfig.getDeobfuscatedOutlineColor()) + ); } public static void addListener(ThemeChangeListener listener) { diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/config/legacy/Config.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/config/legacy/Config.java index 2f7cf19b..9955a6b0 100644 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/config/legacy/Config.java +++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/config/legacy/Config.java @@ -1,11 +1,11 @@ package cuchaz.enigma.gui.config.legacy; import java.awt.Color; -import java.io.File; +import java.io.BufferedReader; import java.lang.reflect.Type; -import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Path; -import com.google.common.io.Files; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.InstanceCreator; @@ -40,9 +40,9 @@ public class Config { } } - private static final File DIR_HOME = new File(System.getProperty("user.home")); - private static final File ENIGMA_DIR = new File(DIR_HOME, ".enigma"); - public static final File CONFIG_FILE = new File(ENIGMA_DIR, "config.json"); + private static final Path DIR_HOME = Path.of(System.getProperty("user.home")); + private static final Path ENIGMA_DIR = DIR_HOME.resolve(".enigma"); + public static final Path CONFIG_FILE = ENIGMA_DIR.resolve("config.json"); private final transient Gson gson; // transient to exclude it from being exposed @@ -86,9 +86,9 @@ public class Config { } public void loadConfig() { - if (CONFIG_FILE.exists()) { - try { - gson.fromJson(Files.asCharSource(CONFIG_FILE, Charset.defaultCharset()).read(), Config.class); + if (Files.exists(CONFIG_FILE)) { + try (BufferedReader reader = Files.newBufferedReader(CONFIG_FILE)) { + gson.fromJson(reader, Config.class); } catch (Exception e) { e.printStackTrace(); } diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/dialog/JavadocDialog.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/dialog/JavadocDialog.java index 0ecec6c0..05b7dfbe 100644 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/dialog/JavadocDialog.java +++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/dialog/JavadocDialog.java @@ -17,6 +17,7 @@ import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; +import java.util.Objects; import javax.swing.JButton; import javax.swing.JComboBox; @@ -29,8 +30,6 @@ import javax.swing.JScrollPane; import javax.swing.WindowConstants; import javax.swing.text.html.HTML; -import com.google.common.base.Strings; - import cuchaz.enigma.analysis.EntryReference; import cuchaz.enigma.gui.GuiController; import cuchaz.enigma.gui.config.UiConfig; @@ -198,7 +197,7 @@ public class JavadocDialog { public static void show(JFrame parent, GuiController controller, EntryReference, Entry> entry) { // Get the existing text through the mapping as it works for all entries, including constructors. EntryMapping mapping = controller.project.getMapper().getDeobfMapping(entry.entry); - String text = Strings.nullToEmpty(mapping.javadoc()); + String text = Objects.requireNonNullElse(mapping.javadoc(), ""); // Note: entry.entry is used instead of getNameableEntry() to include constructors, // which can be documented. diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/elements/AbstractInheritanceTree.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/elements/AbstractInheritanceTree.java index 8acfcfe6..6194aa56 100644 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/elements/AbstractInheritanceTree.java +++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/elements/AbstractInheritanceTree.java @@ -3,7 +3,6 @@ package cuchaz.enigma.gui.elements; import java.awt.BorderLayout; import java.awt.event.MouseEvent; -import javax.annotation.Nullable; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTree; @@ -13,6 +12,8 @@ import javax.swing.tree.TreeCellRenderer; import javax.swing.tree.TreeNode; import javax.swing.tree.TreePath; +import org.jetbrains.annotations.Nullable; + import cuchaz.enigma.analysis.ClassTreeNode; import cuchaz.enigma.analysis.MethodInheritanceTreeNode; import cuchaz.enigma.analysis.MethodTreeNode; diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/elements/EditorTabbedPane.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/elements/EditorTabbedPane.java index 7a6290ea..65b57af3 100644 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/elements/EditorTabbedPane.java +++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/elements/EditorTabbedPane.java @@ -4,13 +4,14 @@ import java.awt.Component; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; +import java.util.HashMap; import java.util.Iterator; +import java.util.Map; -import javax.annotation.Nullable; import javax.swing.JTabbedPane; import javax.swing.SwingUtilities; -import com.google.common.collect.HashBiMap; +import org.jetbrains.annotations.Nullable; import cuchaz.enigma.analysis.EntryReference; import cuchaz.enigma.classhandle.ClassHandle; @@ -24,7 +25,7 @@ import cuchaz.enigma.translation.representation.entry.Entry; public class EditorTabbedPane { private final JTabbedPane openFiles = new JTabbedPane(JTabbedPane.TOP, JTabbedPane.SCROLL_TAB_LAYOUT); - private final HashBiMap editors = HashBiMap.create(); + private final Map editors = new HashMap<>(); private final EditorTabPopupMenu editorTabPopupMenu; private final Gui gui; @@ -95,7 +96,7 @@ public class EditorTabbedPane { public void closeEditor(EditorPanel ed) { this.openFiles.remove(ed.getUi()); - this.editors.inverse().remove(ed); + this.editors.values().remove(ed); this.gui.showStructure(this.getActiveEditor()); ed.destroy(); } diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/elements/ImplementationsTree.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/elements/ImplementationsTree.java index 962cf273..2500ec8d 100644 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/elements/ImplementationsTree.java +++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/elements/ImplementationsTree.java @@ -1,8 +1,9 @@ package cuchaz.enigma.gui.elements; -import javax.annotation.Nullable; import javax.swing.tree.DefaultMutableTreeNode; +import org.jetbrains.annotations.Nullable; + import cuchaz.enigma.gui.Gui; import cuchaz.enigma.gui.renderer.ImplementationsTreeCellRenderer; import cuchaz.enigma.translation.representation.entry.ClassEntry; diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/elements/InheritanceTree.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/elements/InheritanceTree.java index aeb173ba..513fa1b9 100644 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/elements/InheritanceTree.java +++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/elements/InheritanceTree.java @@ -1,8 +1,9 @@ package cuchaz.enigma.gui.elements; -import javax.annotation.Nullable; import javax.swing.tree.DefaultMutableTreeNode; +import org.jetbrains.annotations.Nullable; + import cuchaz.enigma.gui.Gui; import cuchaz.enigma.gui.renderer.InheritanceTreeCellRenderer; import cuchaz.enigma.translation.representation.entry.ClassEntry; diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/elements/ValidatableUi.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/elements/ValidatableUi.java index b8b8431b..6ef5fbe9 100644 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/elements/ValidatableUi.java +++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/elements/ValidatableUi.java @@ -7,7 +7,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import javax.annotation.Nullable; +import org.jetbrains.annotations.Nullable; import cuchaz.enigma.gui.util.ScaleUtil; import cuchaz.enigma.utils.validation.ParameterizedMessage; diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/panels/ClosableTabTitlePane.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/panels/ClosableTabTitlePane.java index dca714dd..24ec233d 100644 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/panels/ClosableTabTitlePane.java +++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/panels/ClosableTabTitlePane.java @@ -8,7 +8,6 @@ import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.accessibility.AccessibleContext; -import javax.annotation.Nullable; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JLabel; @@ -19,6 +18,8 @@ import javax.swing.UIManager; import javax.swing.border.EmptyBorder; import javax.swing.event.ChangeListener; +import org.jetbrains.annotations.Nullable; + public class ClosableTabTitlePane { private final JPanel ui; private final JButton closeButton; diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/panels/EditorPanel.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/panels/EditorPanel.java index e0a299f5..fb30f87a 100644 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/panels/EditorPanel.java +++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/panels/EditorPanel.java @@ -18,7 +18,6 @@ import java.util.Collection; import java.util.List; import java.util.Map; -import javax.annotation.Nullable; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JEditorPane; @@ -36,6 +35,7 @@ import javax.swing.text.Highlighter.HighlightPainter; import de.sciss.syntaxpane.DefaultSyntaxKit; import de.sciss.syntaxpane.SyntaxDocument; +import org.jetbrains.annotations.Nullable; import cuchaz.enigma.EnigmaProject; import cuchaz.enigma.analysis.EntryReference; diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/util/GuiUtil.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/util/GuiUtil.java index da1a2474..7cc0bfe1 100644 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/util/GuiUtil.java +++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/util/GuiUtil.java @@ -18,6 +18,7 @@ import java.awt.font.TextAttribute; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; +import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; @@ -36,7 +37,6 @@ import javax.swing.tree.TreeNode; import javax.swing.tree.TreePath; import com.formdev.flatlaf.extras.FlatSVGIcon; -import com.google.common.collect.Lists; import cuchaz.enigma.analysis.index.EntryIndex; import cuchaz.enigma.gui.Gui; @@ -172,7 +172,7 @@ public class GuiUtil { } public static TreePath getPathToRoot(TreeNode node) { - List nodes = Lists.newArrayList(); + List nodes = new ArrayList<>(); TreeNode n = node; do { diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/util/History.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/util/History.java index f1a8a7a9..6ce8c831 100644 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/util/History.java +++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/util/History.java @@ -1,12 +1,11 @@ package cuchaz.enigma.gui.util; +import java.util.ArrayDeque; import java.util.Deque; -import com.google.common.collect.Queues; - public class History { - private final Deque previous = Queues.newArrayDeque(); - private final Deque next = Queues.newArrayDeque(); + private final Deque previous = new ArrayDeque<>(); + private final Deque next = new ArrayDeque<>(); private T current; public History(T initial) { diff --git a/enigma/build.gradle b/enigma/build.gradle index 17ea805c..6bbb200f 100644 --- a/enigma/build.gradle +++ b/enigma/build.gradle @@ -21,15 +21,22 @@ dependencies { ext.genOutputDir = file("$buildDir/generated-resources") -task generateVersionFile { - ext.outputFile = file("$genOutputDir/version.txt") - outputs.file(outputFile) +task generateResources { + ext.versionFile = file("$genOutputDir/version.txt") + ext.langsFile = file("$genOutputDir/lang/index.txt") + outputs.files(versionFile, langsFile) doLast { - outputFile.text = "${project.version}" + versionFile.text = "${project.version}" + langsFile.text = file("$projectDir/src/main/resources/lang") + .listFiles() + .collect { it.name } + .findAll { it.endsWith(".json") } + .collect { it.substring(0, it.length() - 5) } + .join("\n") } } -sourceSets.main.output.dir genOutputDir, builtBy: generateVersionFile +sourceSets.main.output.dir genOutputDir, builtBy: generateResources // Generate obfuscated JARs for tests diff --git a/enigma/src/main/java/cuchaz/enigma/Enigma.java b/enigma/src/main/java/cuchaz/enigma/Enigma.java index 01967bb6..b98d71fd 100644 --- a/enigma/src/main/java/cuchaz/enigma/Enigma.java +++ b/enigma/src/main/java/cuchaz/enigma/Enigma.java @@ -13,17 +13,19 @@ package cuchaz.enigma; import java.io.IOException; import java.nio.file.Path; +import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.ServiceLoader; import java.util.Set; +import java.util.stream.Collectors; -import com.google.common.base.Preconditions; -import com.google.common.collect.ImmutableListMultimap; import org.objectweb.asm.Opcodes; import cuchaz.enigma.analysis.index.JarIndex; @@ -108,8 +110,7 @@ public class Enigma { } public Builder setProfile(EnigmaProfile profile) { - Preconditions.checkNotNull(profile, "profile cannot be null"); - this.profile = profile; + this.profile = Objects.requireNonNull(profile, "profile cannot be null"); return this; } @@ -142,17 +143,21 @@ public class Enigma { } EnigmaServices buildServices() { - ImmutableListMultimap.Builder, EnigmaService> services = ImmutableListMultimap.builder(); + Map, List> services = new LinkedHashMap<>(); pendingServices.forEach((serviceType, pending) -> { pending.orderings.keySet().removeAll(pending.disabled); List orderedServices = OrderingImpl.sort(serviceType.key, pending.orderings); orderedServices.forEach(serviceId -> { - services.put(serviceType, pending.factories.get(serviceId).create()); + services.computeIfAbsent(serviceType, key -> new ArrayList<>()) + .add(pending.factories.get(serviceId).create()); }); }); - return new EnigmaServices(services.build()); + return new EnigmaServices(services.entrySet().stream().collect(Collectors.toUnmodifiableMap( + Map.Entry::getKey, + entry -> Collections.unmodifiableList(entry.getValue()) + ))); } private record PendingServices( diff --git a/enigma/src/main/java/cuchaz/enigma/EnigmaProfile.java b/enigma/src/main/java/cuchaz/enigma/EnigmaProfile.java index 1bcbaa95..f0a8ab0e 100644 --- a/enigma/src/main/java/cuchaz/enigma/EnigmaProfile.java +++ b/enigma/src/main/java/cuchaz/enigma/EnigmaProfile.java @@ -7,10 +7,9 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.Set; -import javax.annotation.Nullable; - import com.google.gson.Gson; import com.google.gson.annotations.SerializedName; +import org.jetbrains.annotations.Nullable; import cuchaz.enigma.translation.mapping.serde.MappingFileNameFormat; import cuchaz.enigma.translation.mapping.serde.MappingSaveParameters; diff --git a/enigma/src/main/java/cuchaz/enigma/EnigmaProject.java b/enigma/src/main/java/cuchaz/enigma/EnigmaProject.java index 1051f452..79df2fb7 100644 --- a/enigma/src/main/java/cuchaz/enigma/EnigmaProject.java +++ b/enigma/src/main/java/cuchaz/enigma/EnigmaProject.java @@ -11,13 +11,12 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Function; import java.util.jar.JarEntry; import java.util.jar.JarOutputStream; import java.util.stream.Collectors; import java.util.stream.Stream; -import com.google.common.base.Functions; -import com.google.common.base.Preconditions; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.tree.ClassNode; @@ -56,7 +55,10 @@ public class EnigmaProject { private EntryRemapper mapper; public EnigmaProject(Enigma enigma, List jarPaths, ClassProvider classProvider, JarIndex jarIndex, byte[] jarChecksum) { - Preconditions.checkArgument(jarChecksum.length == 20); + if (jarChecksum.length != 20) { + throw new IllegalArgumentException(); + } + this.enigma = enigma; this.jarPaths = List.copyOf(jarPaths); this.classProvider = classProvider; @@ -228,7 +230,7 @@ public class EnigmaProject { } return null; - }).filter(Objects::nonNull).collect(Collectors.toMap(n -> n.name, Functions.identity())); + }).filter(Objects::nonNull).collect(Collectors.toMap(n -> n.name, Function.identity())); return new JarExport(mapper, compiled); } diff --git a/enigma/src/main/java/cuchaz/enigma/EnigmaServices.java b/enigma/src/main/java/cuchaz/enigma/EnigmaServices.java index bbdc6846..3681209a 100644 --- a/enigma/src/main/java/cuchaz/enigma/EnigmaServices.java +++ b/enigma/src/main/java/cuchaz/enigma/EnigmaServices.java @@ -1,21 +1,20 @@ package cuchaz.enigma; import java.util.List; - -import com.google.common.collect.ImmutableListMultimap; +import java.util.Map; import cuchaz.enigma.api.service.EnigmaService; import cuchaz.enigma.api.service.EnigmaServiceType; public final class EnigmaServices { - private final ImmutableListMultimap, EnigmaService> services; + private final Map, List> services; - EnigmaServices(ImmutableListMultimap, EnigmaService> services) { + EnigmaServices(Map, List> services) { this.services = services; } @SuppressWarnings("unchecked") public List get(EnigmaServiceType type) { - return (List) services.get(type); + return (List) services.getOrDefault(type, List.of()); } } diff --git a/enigma/src/main/java/cuchaz/enigma/analysis/ClassImplementationsTreeNode.java b/enigma/src/main/java/cuchaz/enigma/analysis/ClassImplementationsTreeNode.java index 306451a0..d0d86443 100644 --- a/enigma/src/main/java/cuchaz/enigma/analysis/ClassImplementationsTreeNode.java +++ b/enigma/src/main/java/cuchaz/enigma/analysis/ClassImplementationsTreeNode.java @@ -11,11 +11,10 @@ package cuchaz.enigma.analysis; +import java.util.ArrayList; import java.util.Collection; import java.util.List; -import com.google.common.collect.Lists; - import cuchaz.enigma.analysis.index.InheritanceIndex; import cuchaz.enigma.analysis.index.JarIndex; import cuchaz.enigma.translation.Translator; @@ -52,7 +51,7 @@ public class ClassImplementationsTreeNode extends ClassTreeNode { public void load(JarIndex index) { // get all method implementations - List nodes = Lists.newArrayList(); + List nodes = new ArrayList<>(); InheritanceIndex inheritanceIndex = index.getInheritanceIndex(); Collection inheritors = inheritanceIndex.getChildren(this.getClassEntry()); diff --git a/enigma/src/main/java/cuchaz/enigma/analysis/ClassInheritanceTreeNode.java b/enigma/src/main/java/cuchaz/enigma/analysis/ClassInheritanceTreeNode.java index dfb2af85..bbad239b 100644 --- a/enigma/src/main/java/cuchaz/enigma/analysis/ClassInheritanceTreeNode.java +++ b/enigma/src/main/java/cuchaz/enigma/analysis/ClassInheritanceTreeNode.java @@ -11,10 +11,9 @@ package cuchaz.enigma.analysis; +import java.util.ArrayList; import java.util.List; -import com.google.common.collect.Lists; - import cuchaz.enigma.analysis.index.InheritanceIndex; import cuchaz.enigma.translation.Translator; import cuchaz.enigma.translation.representation.entry.ClassEntry; @@ -53,7 +52,7 @@ public class ClassInheritanceTreeNode extends ClassTreeNode { public void load(InheritanceIndex ancestries, boolean recurse) { // get all the child nodes - List nodes = Lists.newArrayList(); + List nodes = new ArrayList<>(); for (ClassEntry inheritor : ancestries.getChildren(this.getClassEntry())) { nodes.add(new ClassInheritanceTreeNode(translator, inheritor.getFullName())); diff --git a/enigma/src/main/java/cuchaz/enigma/analysis/ClassReferenceTreeNode.java b/enigma/src/main/java/cuchaz/enigma/analysis/ClassReferenceTreeNode.java index c76dca7b..f312efbb 100644 --- a/enigma/src/main/java/cuchaz/enigma/analysis/ClassReferenceTreeNode.java +++ b/enigma/src/main/java/cuchaz/enigma/analysis/ClassReferenceTreeNode.java @@ -11,13 +11,12 @@ package cuchaz.enigma.analysis; +import java.util.HashSet; import java.util.Set; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreeNode; -import com.google.common.collect.Sets; - import cuchaz.enigma.analysis.index.JarIndex; import cuchaz.enigma.analysis.index.ReferenceIndex; import cuchaz.enigma.translation.Translator; @@ -73,7 +72,7 @@ public class ClassReferenceTreeNode extends DefaultMutableTreeNode implements Re for (Object child : this.children) { if (child instanceof ClassReferenceTreeNode node) { // don't recurse into ancestor - Set> ancestors = Sets.newHashSet(); + Set> ancestors = new HashSet<>(); TreeNode n = node; while (n.getParent() != null) { diff --git a/enigma/src/main/java/cuchaz/enigma/analysis/IndexTreeBuilder.java b/enigma/src/main/java/cuchaz/enigma/analysis/IndexTreeBuilder.java index 3043577b..e9dcc666 100644 --- a/enigma/src/main/java/cuchaz/enigma/analysis/IndexTreeBuilder.java +++ b/enigma/src/main/java/cuchaz/enigma/analysis/IndexTreeBuilder.java @@ -1,10 +1,9 @@ package cuchaz.enigma.analysis; +import java.util.ArrayList; import java.util.Collection; import java.util.List; -import com.google.common.collect.Lists; - import cuchaz.enigma.analysis.index.JarIndex; import cuchaz.enigma.translation.Translator; import cuchaz.enigma.translation.mapping.EntryResolver; @@ -21,7 +20,7 @@ public class IndexTreeBuilder { public ClassInheritanceTreeNode buildClassInheritance(Translator translator, ClassEntry obfClassEntry) { // get the root node - List ancestry = Lists.newArrayList(); + List ancestry = new ArrayList<>(); ancestry.add(obfClassEntry.getFullName()); for (ClassEntry classEntry : index.getInheritanceIndex().getAncestors(obfClassEntry)) { @@ -62,7 +61,7 @@ public class IndexTreeBuilder { EntryResolver resolver = index.getEntryResolver(); Collection resolvedEntries = resolver.resolveEntry(obfMethodEntry, ResolutionStrategy.RESOLVE_ROOT); - List nodes = Lists.newArrayList(); + List nodes = new ArrayList<>(); for (MethodEntry resolvedEntry : resolvedEntries) { MethodImplementationsTreeNode node = new MethodImplementationsTreeNode(translator, resolvedEntry); diff --git a/enigma/src/main/java/cuchaz/enigma/analysis/MethodImplementationsTreeNode.java b/enigma/src/main/java/cuchaz/enigma/analysis/MethodImplementationsTreeNode.java index d5a34cd2..57767af4 100644 --- a/enigma/src/main/java/cuchaz/enigma/analysis/MethodImplementationsTreeNode.java +++ b/enigma/src/main/java/cuchaz/enigma/analysis/MethodImplementationsTreeNode.java @@ -11,11 +11,10 @@ package cuchaz.enigma.analysis; +import java.util.ArrayList; import java.util.Collection; import java.util.List; -import com.google.common.collect.Lists; - import cuchaz.enigma.analysis.index.EntryIndex; import cuchaz.enigma.analysis.index.InheritanceIndex; import cuchaz.enigma.analysis.index.JarIndex; @@ -59,7 +58,7 @@ public class MethodImplementationsTreeNode extends MethodTreeNode { public void load(JarIndex index) { // get all method implementations - List nodes = Lists.newArrayList(); + List nodes = new ArrayList<>(); EntryIndex entryIndex = index.getEntryIndex(); InheritanceIndex inheritanceIndex = index.getInheritanceIndex(); diff --git a/enigma/src/main/java/cuchaz/enigma/analysis/MethodReferenceTreeNode.java b/enigma/src/main/java/cuchaz/enigma/analysis/MethodReferenceTreeNode.java index fc58c6d0..6e2b90c6 100644 --- a/enigma/src/main/java/cuchaz/enigma/analysis/MethodReferenceTreeNode.java +++ b/enigma/src/main/java/cuchaz/enigma/analysis/MethodReferenceTreeNode.java @@ -13,13 +13,12 @@ package cuchaz.enigma.analysis; import java.util.ArrayList; import java.util.Collection; +import java.util.HashSet; import java.util.Set; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreeNode; -import com.google.common.collect.Sets; - import cuchaz.enigma.analysis.index.JarIndex; import cuchaz.enigma.analysis.index.ReferenceIndex; import cuchaz.enigma.translation.Translator; @@ -76,7 +75,7 @@ public class MethodReferenceTreeNode extends DefaultMutableTreeNode implements R for (Object child : this.children) { if (child instanceof MethodReferenceTreeNode node) { // don't recurse into ancestor - Set> ancestors = Sets.newHashSet(); + Set> ancestors = new HashSet<>(); TreeNode n = node; while (n.getParent() != null) { diff --git a/enigma/src/main/java/cuchaz/enigma/analysis/index/BridgeMethodIndex.java b/enigma/src/main/java/cuchaz/enigma/analysis/index/BridgeMethodIndex.java index 4a98c566..adb48bab 100644 --- a/enigma/src/main/java/cuchaz/enigma/analysis/index/BridgeMethodIndex.java +++ b/enigma/src/main/java/cuchaz/enigma/analysis/index/BridgeMethodIndex.java @@ -8,7 +8,7 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; -import javax.annotation.Nullable; +import org.jetbrains.annotations.Nullable; import cuchaz.enigma.translation.representation.AccessFlags; import cuchaz.enigma.translation.representation.MethodDescriptor; diff --git a/enigma/src/main/java/cuchaz/enigma/analysis/index/EntryIndex.java b/enigma/src/main/java/cuchaz/enigma/analysis/index/EntryIndex.java index 9e65fc30..f12bfb81 100644 --- a/enigma/src/main/java/cuchaz/enigma/analysis/index/EntryIndex.java +++ b/enigma/src/main/java/cuchaz/enigma/analysis/index/EntryIndex.java @@ -4,7 +4,7 @@ import java.util.Collection; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; -import javax.annotation.Nullable; +import org.jetbrains.annotations.Nullable; import cuchaz.enigma.translation.representation.AccessFlags; import cuchaz.enigma.translation.representation.entry.ClassDefEntry; diff --git a/enigma/src/main/java/cuchaz/enigma/analysis/index/InheritanceIndex.java b/enigma/src/main/java/cuchaz/enigma/analysis/index/InheritanceIndex.java index 9841aa69..2b29edc9 100644 --- a/enigma/src/main/java/cuchaz/enigma/analysis/index/InheritanceIndex.java +++ b/enigma/src/main/java/cuchaz/enigma/analysis/index/InheritanceIndex.java @@ -21,8 +21,6 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; -import com.google.common.collect.Sets; - import cuchaz.enigma.translation.representation.entry.ClassDefEntry; import cuchaz.enigma.translation.representation.entry.ClassEntry; @@ -86,7 +84,7 @@ public class InheritanceIndex implements JarIndexer { } public Set getAncestors(ClassEntry classEntry) { - Set ancestors = Sets.newHashSet(); + Set ancestors = new HashSet<>(); LinkedList ancestorQueue = new LinkedList<>(); ancestorQueue.push(classEntry); diff --git a/enigma/src/main/java/cuchaz/enigma/analysis/index/PackageVisibilityIndex.java b/enigma/src/main/java/cuchaz/enigma/analysis/index/PackageVisibilityIndex.java index a2ba0298..b2d6b73d 100644 --- a/enigma/src/main/java/cuchaz/enigma/analysis/index/PackageVisibilityIndex.java +++ b/enigma/src/main/java/cuchaz/enigma/analysis/index/PackageVisibilityIndex.java @@ -1,6 +1,8 @@ package cuchaz.enigma.analysis.index; +import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; @@ -9,10 +11,6 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; - import cuchaz.enigma.analysis.EntryReference; import cuchaz.enigma.analysis.ReferenceTargetType; import cuchaz.enigma.translation.representation.AccessFlags; @@ -48,8 +46,8 @@ public class PackageVisibilityIndex implements JarIndexer { } private final ConcurrentMap> connections = new ConcurrentHashMap<>(); - private final List> partitions = Lists.newArrayList(); - private final Map> classPartitions = Maps.newHashMap(); + private final List> partitions = new ArrayList<>(); + private final Map> classPartitions = new HashMap<>(); private void addConnection(ClassEntry classA, ClassEntry classB) { if (classA != classB) { @@ -132,14 +130,14 @@ public class PackageVisibilityIndex implements JarIndexer { } private void addPartitions(EntryIndex entryIndex) { - Set unassignedClasses = Sets.newHashSet(entryIndex.getClasses()); + Set unassignedClasses = new HashSet<>(entryIndex.getClasses()); while (!unassignedClasses.isEmpty()) { Iterator iterator = unassignedClasses.iterator(); ClassEntry initialEntry = iterator.next(); iterator.remove(); - HashSet partition = Sets.newHashSet(); + HashSet partition = new HashSet<>(); partition.add(initialEntry); buildPartition(unassignedClasses, partition, initialEntry); partitions.add(partition); diff --git a/enigma/src/main/java/cuchaz/enigma/bytecode/translators/LocalVariableFixVisitor.java b/enigma/src/main/java/cuchaz/enigma/bytecode/translators/LocalVariableFixVisitor.java index dc399e53..d31adddc 100644 --- a/enigma/src/main/java/cuchaz/enigma/bytecode/translators/LocalVariableFixVisitor.java +++ b/enigma/src/main/java/cuchaz/enigma/bytecode/translators/LocalVariableFixVisitor.java @@ -4,7 +4,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import com.google.common.base.CharMatcher; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.Label; import org.objectweb.asm.MethodVisitor; @@ -76,7 +75,7 @@ public class LocalVariableFixVisitor extends ClassVisitor { } private boolean isInvalidName(String name) { - return name == null || name.isEmpty() || !CharMatcher.ascii().matchesAllOf(name); + return name == null || name.isEmpty() || name.chars().anyMatch(ch -> ch < 0x21 || ch > 0x7E); } @Override diff --git a/enigma/src/main/java/cuchaz/enigma/classhandle/ClassHandle.java b/enigma/src/main/java/cuchaz/enigma/classhandle/ClassHandle.java index 2a1643e9..f2c77a89 100644 --- a/enigma/src/main/java/cuchaz/enigma/classhandle/ClassHandle.java +++ b/enigma/src/main/java/cuchaz/enigma/classhandle/ClassHandle.java @@ -2,7 +2,7 @@ package cuchaz.enigma.classhandle; import java.util.concurrent.CompletableFuture; -import javax.annotation.Nullable; +import org.jetbrains.annotations.Nullable; import cuchaz.enigma.events.ClassHandleListener; import cuchaz.enigma.source.DecompiledClassSource; diff --git a/enigma/src/main/java/cuchaz/enigma/classhandle/ClassHandleError.java b/enigma/src/main/java/cuchaz/enigma/classhandle/ClassHandleError.java index ce6b23f8..6ec7c914 100644 --- a/enigma/src/main/java/cuchaz/enigma/classhandle/ClassHandleError.java +++ b/enigma/src/main/java/cuchaz/enigma/classhandle/ClassHandleError.java @@ -3,7 +3,7 @@ package cuchaz.enigma.classhandle; import java.io.ByteArrayOutputStream; import java.io.PrintStream; -import javax.annotation.Nullable; +import org.jetbrains.annotations.Nullable; public final class ClassHandleError { public final Type type; diff --git a/enigma/src/main/java/cuchaz/enigma/classhandle/ClassHandleProvider.java b/enigma/src/main/java/cuchaz/enigma/classhandle/ClassHandleProvider.java index f18be672..f4bbb1da 100644 --- a/enigma/src/main/java/cuchaz/enigma/classhandle/ClassHandleProvider.java +++ b/enigma/src/main/java/cuchaz/enigma/classhandle/ClassHandleProvider.java @@ -18,7 +18,7 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; -import javax.annotation.Nullable; +import org.jetbrains.annotations.Nullable; import cuchaz.enigma.EnigmaProject; import cuchaz.enigma.classprovider.CachingClassProvider; diff --git a/enigma/src/main/java/cuchaz/enigma/classprovider/CachingClassProvider.java b/enigma/src/main/java/cuchaz/enigma/classprovider/CachingClassProvider.java index 28a93927..9318813d 100644 --- a/enigma/src/main/java/cuchaz/enigma/classprovider/CachingClassProvider.java +++ b/enigma/src/main/java/cuchaz/enigma/classprovider/CachingClassProvider.java @@ -1,22 +1,23 @@ package cuchaz.enigma.classprovider; import java.util.Collection; -import java.util.Optional; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; +import java.util.Iterator; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.ConcurrentHashMap; -import javax.annotation.Nullable; - -import com.google.common.cache.Cache; -import com.google.common.cache.CacheBuilder; +import org.jetbrains.annotations.Nullable; import org.objectweb.asm.tree.ClassNode; /** * Wraps a ClassProvider to provide caching and synchronization. */ public class CachingClassProvider implements ClassProvider { + private static final long EXPIRE_AFTER = 1 * 60 * 1000; // one minute + private static final long MAX_SIZE = 128; private final ClassProvider classProvider; - private final Cache> cache = CacheBuilder.newBuilder().maximumSize(128).expireAfterAccess(1, TimeUnit.MINUTES).concurrencyLevel(1).build(); + private long lastPruneTime = 0; + private final ConcurrentHashMap cache = new ConcurrentHashMap<>(); public CachingClassProvider(ClassProvider classProvider) { this.classProvider = classProvider; @@ -30,10 +31,54 @@ public class CachingClassProvider implements ClassProvider { @Override @Nullable public ClassNode get(String name) { - try { - return cache.get(name, () -> Optional.ofNullable(classProvider.get(name))).orElse(null); - } catch (ExecutionException e) { - throw new RuntimeException(e); + final long time = System.currentTimeMillis(); + boolean prune = false; + + if (lastPruneTime + 2 * EXPIRE_AFTER < time) { + synchronized (cache) { + if (lastPruneTime + 2 * EXPIRE_AFTER < time) { + lastPruneTime = time; + prune = true; + } + } + } + + if (prune) { + cache.values().removeIf(value -> value.addTime + EXPIRE_AFTER < time); + } + + if (cache.size() > MAX_SIZE) { + synchronized (cache) { + if (cache.size() > MAX_SIZE) { + Iterator> iterator = cache.entrySet().iterator(); + iterator.next(); + iterator.remove(); + } + } + } + + CacheEntry entry = cache.computeIfAbsent(name, key -> new CacheEntry(time, classProvider.get(key))); + entry.addTime = time; + return entry.classNode; + } + + private static final class CacheEntry { + private long addTime; + private final @Nullable ClassNode classNode; + + private CacheEntry(long addTime, @Nullable ClassNode classNode) { + this.addTime = addTime; + this.classNode = classNode; + } + + @Override + public boolean equals(Object obj) { + return obj instanceof CacheEntry ce && Objects.equals(classNode, ce.classNode); + } + + @Override + public int hashCode() { + return Objects.hash(addTime, classNode); } } } diff --git a/enigma/src/main/java/cuchaz/enigma/classprovider/ClassProvider.java b/enigma/src/main/java/cuchaz/enigma/classprovider/ClassProvider.java index 069e0a86..a299c1d3 100644 --- a/enigma/src/main/java/cuchaz/enigma/classprovider/ClassProvider.java +++ b/enigma/src/main/java/cuchaz/enigma/classprovider/ClassProvider.java @@ -2,8 +2,7 @@ package cuchaz.enigma.classprovider; import java.util.Collection; -import javax.annotation.Nullable; - +import org.jetbrains.annotations.Nullable; import org.objectweb.asm.tree.ClassNode; public interface ClassProvider { diff --git a/enigma/src/main/java/cuchaz/enigma/classprovider/ClasspathClassProvider.java b/enigma/src/main/java/cuchaz/enigma/classprovider/ClasspathClassProvider.java index b035cee5..19a7d656 100644 --- a/enigma/src/main/java/cuchaz/enigma/classprovider/ClasspathClassProvider.java +++ b/enigma/src/main/java/cuchaz/enigma/classprovider/ClasspathClassProvider.java @@ -5,8 +5,7 @@ import java.io.InputStream; import java.util.Collection; import java.util.Collections; -import javax.annotation.Nullable; - +import org.jetbrains.annotations.Nullable; import org.objectweb.asm.ClassReader; import org.objectweb.asm.tree.ClassNode; diff --git a/enigma/src/main/java/cuchaz/enigma/classprovider/CombiningClassProvider.java b/enigma/src/main/java/cuchaz/enigma/classprovider/CombiningClassProvider.java index 1b20b8f0..72708176 100644 --- a/enigma/src/main/java/cuchaz/enigma/classprovider/CombiningClassProvider.java +++ b/enigma/src/main/java/cuchaz/enigma/classprovider/CombiningClassProvider.java @@ -4,8 +4,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.stream.Collectors; -import javax.annotation.Nullable; - +import org.jetbrains.annotations.Nullable; import org.objectweb.asm.tree.ClassNode; /** diff --git a/enigma/src/main/java/cuchaz/enigma/classprovider/JarClassProvider.java b/enigma/src/main/java/cuchaz/enigma/classprovider/JarClassProvider.java index 5dec5beb..391d43a9 100644 --- a/enigma/src/main/java/cuchaz/enigma/classprovider/JarClassProvider.java +++ b/enigma/src/main/java/cuchaz/enigma/classprovider/JarClassProvider.java @@ -5,11 +5,12 @@ import java.nio.file.FileSystem; import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.Path; +import java.util.Collections; +import java.util.HashSet; import java.util.Set; +import java.util.stream.Stream; -import javax.annotation.Nullable; - -import com.google.common.collect.ImmutableSet; +import org.jetbrains.annotations.Nullable; import org.objectweb.asm.tree.ClassNode; import cuchaz.enigma.utils.AsmUtil; @@ -26,19 +27,21 @@ public class JarClassProvider implements AutoCloseable, ClassProvider { this.classNames = collectClassNames(fileSystem); } - private static ImmutableSet collectClassNames(FileSystem fileSystem) throws IOException { - ImmutableSet.Builder classNames = ImmutableSet.builder(); + private static Set collectClassNames(FileSystem fileSystem) throws IOException { + Set classNames = new HashSet<>(); for (Path root : fileSystem.getRootDirectories()) { - Files.walk(root).map(Path::toString).forEach(path -> { - if (path.endsWith(".class")) { - String name = path.substring(1, path.length() - ".class".length()); - classNames.add(name); - } - }); + try (Stream stream = Files.walk(root)) { + stream.map(Path::toString).forEach(path -> { + if (path.endsWith(".class")) { + String name = path.substring(1, path.length() - ".class".length()); + classNames.add(name); + } + }); + } } - return classNames.build(); + return Collections.unmodifiableSet(classNames); } @Override diff --git a/enigma/src/main/java/cuchaz/enigma/classprovider/ObfuscationFixClassProvider.java b/enigma/src/main/java/cuchaz/enigma/classprovider/ObfuscationFixClassProvider.java index 543ce48c..b68eaf11 100644 --- a/enigma/src/main/java/cuchaz/enigma/classprovider/ObfuscationFixClassProvider.java +++ b/enigma/src/main/java/cuchaz/enigma/classprovider/ObfuscationFixClassProvider.java @@ -2,8 +2,7 @@ package cuchaz.enigma.classprovider; import java.util.Collection; -import javax.annotation.Nullable; - +import org.jetbrains.annotations.Nullable; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.Opcodes; import org.objectweb.asm.tree.AbstractInsnNode; diff --git a/enigma/src/main/java/cuchaz/enigma/source/DecompiledClassSource.java b/enigma/src/main/java/cuchaz/enigma/source/DecompiledClassSource.java index 9475d743..4f78e9ce 100644 --- a/enigma/src/main/java/cuchaz/enigma/source/DecompiledClassSource.java +++ b/enigma/src/main/java/cuchaz/enigma/source/DecompiledClassSource.java @@ -6,7 +6,7 @@ import java.util.List; import java.util.Map; import java.util.Optional; -import javax.annotation.Nullable; +import org.jetbrains.annotations.Nullable; import cuchaz.enigma.EnigmaProject; import cuchaz.enigma.EnigmaServices; diff --git a/enigma/src/main/java/cuchaz/enigma/source/Decompiler.java b/enigma/src/main/java/cuchaz/enigma/source/Decompiler.java index b31dcc43..9b3fa303 100644 --- a/enigma/src/main/java/cuchaz/enigma/source/Decompiler.java +++ b/enigma/src/main/java/cuchaz/enigma/source/Decompiler.java @@ -1,6 +1,6 @@ package cuchaz.enigma.source; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jetbrains.annotations.Nullable; import cuchaz.enigma.translation.mapping.EntryRemapper; diff --git a/enigma/src/main/java/cuchaz/enigma/source/SourceIndex.java b/enigma/src/main/java/cuchaz/enigma/source/SourceIndex.java index e9d928e9..a38c6f55 100644 --- a/enigma/src/main/java/cuchaz/enigma/source/SourceIndex.java +++ b/enigma/src/main/java/cuchaz/enigma/source/SourceIndex.java @@ -1,15 +1,12 @@ package cuchaz.enigma.source; +import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.TreeMap; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import com.google.common.collect.Multimap; - import cuchaz.enigma.analysis.EntryReference; import cuchaz.enigma.translation.mapping.EntryResolver; import cuchaz.enigma.translation.mapping.ResolutionStrategy; @@ -19,13 +16,13 @@ public class SourceIndex { private String source; private List lineOffsets; private final TreeMap, Entry>> tokenToReference; - private final Multimap, Entry>, Token> referenceToTokens; + private final Map, Entry>, Collection> referenceToTokens; private final Map, Token> declarationToToken; public SourceIndex() { tokenToReference = new TreeMap<>(); - referenceToTokens = HashMultimap.create(); - declarationToToken = Maps.newHashMap(); + referenceToTokens = new HashMap<>(); + declarationToToken = new HashMap<>(); } public SourceIndex(String source) { @@ -35,7 +32,7 @@ public class SourceIndex { public void setSource(String source) { this.source = source; - lineOffsets = Lists.newArrayList(); + lineOffsets = new ArrayList<>(); lineOffsets.add(0); for (int i = 0; i < this.source.length(); i++) { @@ -87,8 +84,10 @@ public class SourceIndex { if (token != null) { EntryReference, Entry> reference = new EntryReference<>(deobfEntry, token.text); tokenToReference.put(token, reference); - referenceToTokens.put(reference, token); - referenceToTokens.put(EntryReference.declaration(deobfEntry, token.text), token); + referenceToTokens.computeIfAbsent(reference, key -> new ArrayList<>()) + .add(token); + referenceToTokens.computeIfAbsent(EntryReference.declaration(deobfEntry, token.text), key -> new ArrayList<>()) + .add(token); declarationToToken.put(deobfEntry, token); } } @@ -120,28 +119,30 @@ public class SourceIndex { } public Collection getReferenceTokens(EntryReference, Entry> deobfReference) { - return referenceToTokens.get(deobfReference); + return referenceToTokens.getOrDefault(deobfReference, List.of()); } public void addReference(Token token, Entry deobfEntry, Entry deobfContext) { if (token != null) { EntryReference, Entry> deobfReference = new EntryReference<>(deobfEntry, token.text, deobfContext); tokenToReference.put(token, deobfReference); - referenceToTokens.put(deobfReference, token); + referenceToTokens.computeIfAbsent(deobfReference, key -> new ArrayList<>()) + .add(token); } } public void resolveReferences(EntryResolver resolver) { // resolve all the classes in the source references - for (Token token : Lists.newArrayList(referenceToTokens.values())) { + for (Token token : referenceToTokens.values().stream().flatMap(Collection::stream).toList()) { EntryReference, Entry> reference = tokenToReference.get(token); EntryReference, Entry> resolvedReference = resolver.resolveFirstReference(reference, ResolutionStrategy.RESOLVE_CLOSEST); // replace the reference tokenToReference.replace(token, resolvedReference); - Collection tokens = referenceToTokens.removeAll(reference); - referenceToTokens.putAll(resolvedReference, tokens); + Collection tokens = referenceToTokens.remove(reference); + referenceToTokens.computeIfAbsent(resolvedReference, key -> new ArrayList<>()) + .addAll(tokens); } } @@ -152,13 +153,14 @@ public class SourceIndex { remapped.declarationToToken.put(entry.getKey(), result.getRemappedToken(entry.getValue())); } - for (Map.Entry, Entry>, Collection> entry : referenceToTokens.asMap().entrySet()) { + for (Map.Entry, Entry>, Collection> entry : referenceToTokens.entrySet()) { EntryReference, Entry> reference = entry.getKey(); Collection oldTokens = entry.getValue(); Collection newTokens = oldTokens.stream().map(result::getRemappedToken).toList(); - remapped.referenceToTokens.putAll(reference, newTokens); + remapped.referenceToTokens.computeIfAbsent(reference, key -> new ArrayList<>()) + .addAll(newTokens); } for (Map.Entry, Entry>> entry : tokenToReference.entrySet()) { diff --git a/enigma/src/main/java/cuchaz/enigma/source/bytecode/BytecodeDecompiler.java b/enigma/src/main/java/cuchaz/enigma/source/bytecode/BytecodeDecompiler.java index 6461d20e..e970d3ae 100644 --- a/enigma/src/main/java/cuchaz/enigma/source/bytecode/BytecodeDecompiler.java +++ b/enigma/src/main/java/cuchaz/enigma/source/bytecode/BytecodeDecompiler.java @@ -1,6 +1,6 @@ package cuchaz.enigma.source.bytecode; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jetbrains.annotations.Nullable; import cuchaz.enigma.classprovider.ClassProvider; import cuchaz.enigma.source.Decompiler; diff --git a/enigma/src/main/java/cuchaz/enigma/source/cfr/CfrDecompiler.java b/enigma/src/main/java/cuchaz/enigma/source/cfr/CfrDecompiler.java index 2d9784b5..5cd11046 100644 --- a/enigma/src/main/java/cuchaz/enigma/source/cfr/CfrDecompiler.java +++ b/enigma/src/main/java/cuchaz/enigma/source/cfr/CfrDecompiler.java @@ -9,7 +9,7 @@ import org.benf.cfr.reader.bytecode.analysis.parse.utils.Pair; import org.benf.cfr.reader.util.AnalysisType; import org.benf.cfr.reader.util.getopt.Options; import org.benf.cfr.reader.util.getopt.OptionsImpl; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jetbrains.annotations.Nullable; import org.objectweb.asm.tree.ClassNode; import cuchaz.enigma.classprovider.ClassProvider; diff --git a/enigma/src/main/java/cuchaz/enigma/source/cfr/CfrDumper.java b/enigma/src/main/java/cuchaz/enigma/source/cfr/CfrDumper.java index 950f518b..d90d7bd6 100644 --- a/enigma/src/main/java/cuchaz/enigma/source/cfr/CfrDumper.java +++ b/enigma/src/main/java/cuchaz/enigma/source/cfr/CfrDumper.java @@ -25,7 +25,7 @@ import org.benf.cfr.reader.util.output.IllegalIdentifierDump; import org.benf.cfr.reader.util.output.MovableDumperContext; import org.benf.cfr.reader.util.output.StringStreamDumper; import org.benf.cfr.reader.util.output.TypeContext; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jetbrains.annotations.Nullable; import cuchaz.enigma.source.SourceIndex; import cuchaz.enigma.source.SourceSettings; diff --git a/enigma/src/main/java/cuchaz/enigma/source/cfr/CfrSource.java b/enigma/src/main/java/cuchaz/enigma/source/cfr/CfrSource.java index cf6c52fd..e5db78a6 100644 --- a/enigma/src/main/java/cuchaz/enigma/source/cfr/CfrSource.java +++ b/enigma/src/main/java/cuchaz/enigma/source/cfr/CfrSource.java @@ -11,7 +11,7 @@ import org.benf.cfr.reader.util.CannotLoadClassException; import org.benf.cfr.reader.util.collections.ListFactory; import org.benf.cfr.reader.util.getopt.Options; import org.benf.cfr.reader.util.getopt.OptionsImpl; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jetbrains.annotations.Nullable; import cuchaz.enigma.source.Source; import cuchaz.enigma.source.SourceIndex; diff --git a/enigma/src/main/java/cuchaz/enigma/source/procyon/ProcyonDecompiler.java b/enigma/src/main/java/cuchaz/enigma/source/procyon/ProcyonDecompiler.java index 3ba112ff..76b6b488 100644 --- a/enigma/src/main/java/cuchaz/enigma/source/procyon/ProcyonDecompiler.java +++ b/enigma/src/main/java/cuchaz/enigma/source/procyon/ProcyonDecompiler.java @@ -11,7 +11,7 @@ import com.strobel.decompiler.languages.java.JavaFormattingOptions; import com.strobel.decompiler.languages.java.ast.AstBuilder; import com.strobel.decompiler.languages.java.ast.CompilationUnit; import com.strobel.decompiler.languages.java.ast.InsertParenthesesVisitor; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jetbrains.annotations.Nullable; import org.objectweb.asm.tree.ClassNode; import cuchaz.enigma.classprovider.ClassProvider; diff --git a/enigma/src/main/java/cuchaz/enigma/source/procyon/index/SourceIndexMethodVisitor.java b/enigma/src/main/java/cuchaz/enigma/source/procyon/index/SourceIndexMethodVisitor.java index 12dca73e..493499ff 100644 --- a/enigma/src/main/java/cuchaz/enigma/source/procyon/index/SourceIndexMethodVisitor.java +++ b/enigma/src/main/java/cuchaz/enigma/source/procyon/index/SourceIndexMethodVisitor.java @@ -11,11 +11,12 @@ package cuchaz.enigma.source.procyon.index; +import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; +import java.util.List; import java.util.Map; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; import com.strobel.assembler.metadata.FieldReference; import com.strobel.assembler.metadata.MemberReference; import com.strobel.assembler.metadata.MethodDefinition; @@ -55,7 +56,7 @@ import cuchaz.enigma.translation.representation.entry.MethodEntry; public class SourceIndexMethodVisitor extends SourceIndexVisitor { private final MethodDefEntry methodEntry; - private Multimap unmatchedIdentifier = HashMultimap.create(); + private Map> unmatchedIdentifier = new HashMap<>(); private Map> identifierEntryCache = new HashMap<>(); public SourceIndexMethodVisitor(MethodDefEntry methodEntry) { @@ -173,7 +174,8 @@ public class SourceIndexMethodVisitor extends SourceIndexVisitor { // If it's in the argument cache, create a token! index.addDeclaration(TokenFactory.createToken(index, node.getIdentifierToken()), identifierEntryCache.get(node.getIdentifier())); } else { - unmatchedIdentifier.put(node.getIdentifier(), node.getIdentifierToken()); // Not matched actually, put it! + unmatchedIdentifier.computeIfAbsent(node.getIdentifier(), key -> new ArrayList<>()) + .add(node.getIdentifierToken()); // Not matched actually, put it! } } @@ -185,11 +187,11 @@ public class SourceIndexMethodVisitor extends SourceIndexVisitor { return; } - for (Identifier identifier : unmatchedIdentifier.get(key)) { + for (Identifier identifier : unmatchedIdentifier.getOrDefault(key, List.of())) { index.addDeclaration(TokenFactory.createToken(index, identifier), entry); } - unmatchedIdentifier.removeAll(key); + unmatchedIdentifier.remove(key); } @Override diff --git a/enigma/src/main/java/cuchaz/enigma/source/procyon/transformers/AddJavadocsAstTransform.java b/enigma/src/main/java/cuchaz/enigma/source/procyon/transformers/AddJavadocsAstTransform.java index c48aba5b..4155da35 100644 --- a/enigma/src/main/java/cuchaz/enigma/source/procyon/transformers/AddJavadocsAstTransform.java +++ b/enigma/src/main/java/cuchaz/enigma/source/procyon/transformers/AddJavadocsAstTransform.java @@ -4,10 +4,9 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Objects; +import java.util.function.Function; import java.util.stream.Stream; -import com.google.common.base.Function; -import com.google.common.base.Strings; import com.strobel.assembler.metadata.ParameterDefinition; import com.strobel.decompiler.languages.java.ast.AstNode; import com.strobel.decompiler.languages.java.ast.Comment; @@ -60,8 +59,8 @@ public final class AddJavadocsAstTransform implements IAstTransform { private Comment[] getComments(T node, Function> retriever) { final EntryMapping mapping = remapper.getDeobfMapping(retriever.apply(node)); - final String docs = Strings.emptyToNull(mapping.javadoc()); - return docs == null ? null : Stream.of(docs.split("\\R")).map(st -> new Comment(st, CommentType.Documentation)).toArray(Comment[]::new); + final String docs = mapping.javadoc(); + return docs == null || docs.isEmpty() ? null : Stream.of(docs.split("\\R")).map(st -> new Comment(st, CommentType.Documentation)).toArray(Comment[]::new); } private Comment[] getParameterComments(ParameterDeclaration node, Function> retriever) { @@ -71,7 +70,7 @@ public final class AddJavadocsAstTransform implements IAstTransform { if (ret != null) { final String paramPrefix = "@param " + (mapping.targetName() != null ? mapping.targetName() : entry.getName()) + " "; - final String indent = Strings.repeat(" ", paramPrefix.length()); + final String indent = " ".repeat(paramPrefix.length()); ret[0].setContent(paramPrefix + ret[0].getContent()); for (int i = 1; i < ret.length; i++) { diff --git a/enigma/src/main/java/cuchaz/enigma/source/vineflower/VineflowerDecompiler.java b/enigma/src/main/java/cuchaz/enigma/source/vineflower/VineflowerDecompiler.java index 56fd0b91..485fc3fc 100644 --- a/enigma/src/main/java/cuchaz/enigma/source/vineflower/VineflowerDecompiler.java +++ b/enigma/src/main/java/cuchaz/enigma/source/vineflower/VineflowerDecompiler.java @@ -1,6 +1,6 @@ package cuchaz.enigma.source.vineflower; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jetbrains.annotations.Nullable; import cuchaz.enigma.classprovider.ClassProvider; import cuchaz.enigma.source.Decompiler; diff --git a/enigma/src/main/java/cuchaz/enigma/translation/MappingTranslator.java b/enigma/src/main/java/cuchaz/enigma/translation/MappingTranslator.java index 833ea294..4cf161c4 100644 --- a/enigma/src/main/java/cuchaz/enigma/translation/MappingTranslator.java +++ b/enigma/src/main/java/cuchaz/enigma/translation/MappingTranslator.java @@ -1,6 +1,6 @@ package cuchaz.enigma.translation; -import javax.annotation.Nullable; +import org.jetbrains.annotations.Nullable; import cuchaz.enigma.translation.mapping.EntryMap; import cuchaz.enigma.translation.mapping.EntryMapping; diff --git a/enigma/src/main/java/cuchaz/enigma/translation/ProposingTranslator.java b/enigma/src/main/java/cuchaz/enigma/translation/ProposingTranslator.java index 33a38fee..301cc809 100644 --- a/enigma/src/main/java/cuchaz/enigma/translation/ProposingTranslator.java +++ b/enigma/src/main/java/cuchaz/enigma/translation/ProposingTranslator.java @@ -3,7 +3,7 @@ package cuchaz.enigma.translation; import java.util.Arrays; import java.util.Optional; -import javax.annotation.Nullable; +import org.jetbrains.annotations.Nullable; import cuchaz.enigma.api.service.NameProposalService; import cuchaz.enigma.translation.mapping.EntryRemapper; diff --git a/enigma/src/main/java/cuchaz/enigma/translation/SignatureUpdater.java b/enigma/src/main/java/cuchaz/enigma/translation/SignatureUpdater.java index 99660141..d6c6142a 100644 --- a/enigma/src/main/java/cuchaz/enigma/translation/SignatureUpdater.java +++ b/enigma/src/main/java/cuchaz/enigma/translation/SignatureUpdater.java @@ -13,10 +13,9 @@ package cuchaz.enigma.translation; import java.io.IOException; import java.io.StringReader; +import java.util.ArrayList; import java.util.List; -import com.google.common.collect.Lists; - public class SignatureUpdater { public static String update(String signature, ClassNameUpdater updater) { try { @@ -81,7 +80,7 @@ public class SignatureUpdater { } public static List getClasses(String signature) { - final List classNames = Lists.newArrayList(); + final List classNames = new ArrayList<>(); update(signature, className -> { classNames.add(className); return className; diff --git a/enigma/src/main/java/cuchaz/enigma/translation/Translator.java b/enigma/src/main/java/cuchaz/enigma/translation/Translator.java index ed581972..56889908 100644 --- a/enigma/src/main/java/cuchaz/enigma/translation/Translator.java +++ b/enigma/src/main/java/cuchaz/enigma/translation/Translator.java @@ -11,16 +11,14 @@ package cuchaz.enigma.translation; +import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; -import javax.annotation.Nullable; - -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; +import org.jetbrains.annotations.Nullable; public interface Translator { @Nullable @@ -61,11 +59,12 @@ public interface Translator { return result; } - default Multimap translate(Multimap translatable) { - Multimap result = HashMultimap.create(translatable.size(), 1); + default Map> translateMulti(Map> translatable) { + Map> result = new HashMap<>(translatable.size()); - for (Map.Entry> entry : translatable.asMap().entrySet()) { - result.putAll(translate(entry.getKey()), translate(entry.getValue())); + for (Map.Entry> entry : translatable.entrySet()) { + result.computeIfAbsent(entry.getKey(), key -> new ArrayList<>()) + .addAll(translate(entry.getValue())); } return result; diff --git a/enigma/src/main/java/cuchaz/enigma/translation/mapping/EntryChange.java b/enigma/src/main/java/cuchaz/enigma/translation/mapping/EntryChange.java index 4cd79b94..ad7c33a4 100644 --- a/enigma/src/main/java/cuchaz/enigma/translation/mapping/EntryChange.java +++ b/enigma/src/main/java/cuchaz/enigma/translation/mapping/EntryChange.java @@ -3,7 +3,7 @@ package cuchaz.enigma.translation.mapping; import java.util.Objects; import java.util.Optional; -import javax.annotation.Nullable; +import org.jetbrains.annotations.Nullable; import cuchaz.enigma.EnigmaProject; import cuchaz.enigma.source.DecompiledClassSource; diff --git a/enigma/src/main/java/cuchaz/enigma/translation/mapping/EntryMap.java b/enigma/src/main/java/cuchaz/enigma/translation/mapping/EntryMap.java index b398d412..fa5e1d8a 100644 --- a/enigma/src/main/java/cuchaz/enigma/translation/mapping/EntryMap.java +++ b/enigma/src/main/java/cuchaz/enigma/translation/mapping/EntryMap.java @@ -2,7 +2,7 @@ package cuchaz.enigma.translation.mapping; import java.util.stream.Stream; -import javax.annotation.Nullable; +import org.jetbrains.annotations.Nullable; import cuchaz.enigma.translation.representation.entry.Entry; diff --git a/enigma/src/main/java/cuchaz/enigma/translation/mapping/EntryMapping.java b/enigma/src/main/java/cuchaz/enigma/translation/mapping/EntryMapping.java index 72a8fd48..5a1b806c 100644 --- a/enigma/src/main/java/cuchaz/enigma/translation/mapping/EntryMapping.java +++ b/enigma/src/main/java/cuchaz/enigma/translation/mapping/EntryMapping.java @@ -2,10 +2,10 @@ package cuchaz.enigma.translation.mapping; import java.util.Arrays; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; -public record EntryMapping(@Nullable String targetName, @Nonnull AccessModifier accessModifier, @Nullable String javadoc) { +public record EntryMapping(@Nullable String targetName, @NotNull AccessModifier accessModifier, @Nullable String javadoc) { public static final EntryMapping DEFAULT = new EntryMapping(null, AccessModifier.UNCHANGED, null); public EntryMapping { diff --git a/enigma/src/main/java/cuchaz/enigma/translation/mapping/EntryRemapper.java b/enigma/src/main/java/cuchaz/enigma/translation/mapping/EntryRemapper.java index ed5dba59..12ed7b1d 100644 --- a/enigma/src/main/java/cuchaz/enigma/translation/mapping/EntryRemapper.java +++ b/enigma/src/main/java/cuchaz/enigma/translation/mapping/EntryRemapper.java @@ -5,7 +5,7 @@ import java.util.List; import java.util.Objects; import java.util.stream.Stream; -import javax.annotation.Nonnull; +import org.jetbrains.annotations.NotNull; import cuchaz.enigma.analysis.index.JarIndex; import cuchaz.enigma.translation.MappingTranslator; @@ -50,15 +50,15 @@ public class EntryRemapper { return new EntryRemapper(index, new HashEntryTree<>()); } - public void validatePutMapping(ValidationContext vc, Entry obfuscatedEntry, @Nonnull EntryMapping deobfMapping) { + public void validatePutMapping(ValidationContext vc, Entry obfuscatedEntry, @NotNull EntryMapping deobfMapping) { doPutMapping(vc, obfuscatedEntry, deobfMapping, true); } - public void putMapping(ValidationContext vc, Entry obfuscatedEntry, @Nonnull EntryMapping deobfMapping) { + public void putMapping(ValidationContext vc, Entry obfuscatedEntry, @NotNull EntryMapping deobfMapping) { doPutMapping(vc, obfuscatedEntry, deobfMapping, false); } - private void doPutMapping(ValidationContext vc, Entry obfuscatedEntry, @Nonnull EntryMapping deobfMapping, boolean validateOnly) { + private void doPutMapping(ValidationContext vc, Entry obfuscatedEntry, @NotNull EntryMapping deobfMapping, boolean validateOnly) { if (obfuscatedEntry instanceof FieldEntry) { FieldEntry fieldEntry = (FieldEntry) obfuscatedEntry; ClassEntry classEntry = fieldEntry.getParent(); @@ -117,7 +117,7 @@ public class EntryRemapper { doPutMapping(vc, methodEntry, new EntryMapping(fieldMapping.targetName()), false); } - @Nonnull + @NotNull public EntryMapping getDeobfMapping(Entry entry) { EntryMapping entryMapping = obfToDeobf.get(entry); return entryMapping == null ? EntryMapping.DEFAULT : entryMapping; diff --git a/enigma/src/main/java/cuchaz/enigma/translation/mapping/EntryResolver.java b/enigma/src/main/java/cuchaz/enigma/translation/mapping/EntryResolver.java index 39e68259..2274c6e8 100644 --- a/enigma/src/main/java/cuchaz/enigma/translation/mapping/EntryResolver.java +++ b/enigma/src/main/java/cuchaz/enigma/translation/mapping/EntryResolver.java @@ -1,10 +1,11 @@ package cuchaz.enigma.translation.mapping; +import java.util.ArrayList; import java.util.Collection; +import java.util.Iterator; +import java.util.List; import java.util.Set; -import com.google.common.collect.Streams; - import cuchaz.enigma.analysis.EntryReference; import cuchaz.enigma.translation.representation.entry.Entry; import cuchaz.enigma.translation.representation.entry.MethodEntry; @@ -21,7 +22,15 @@ public interface EntryResolver { if (reference.context != null) { Collection context = resolveEntry(reference.context, strategy); - return Streams.zip(entry.stream(), context.stream(), (e, c) -> new EntryReference<>(e, c, reference)).toList(); + List> result = new ArrayList<>(entry.size()); + Iterator entryIterator = entry.iterator(); + Iterator contextIterator = context.iterator(); + + while (entryIterator.hasNext() && contextIterator.hasNext()) { + result.add(new EntryReference<>(entryIterator.next(), contextIterator.next(), reference)); + } + + return result; } else { return entry.stream().map(e -> new EntryReference<>(e, null, reference)).toList(); } diff --git a/enigma/src/main/java/cuchaz/enigma/translation/mapping/EntryUtil.java b/enigma/src/main/java/cuchaz/enigma/translation/mapping/EntryUtil.java index f9a10600..fb8ab631 100644 --- a/enigma/src/main/java/cuchaz/enigma/translation/mapping/EntryUtil.java +++ b/enigma/src/main/java/cuchaz/enigma/translation/mapping/EntryUtil.java @@ -1,6 +1,6 @@ package cuchaz.enigma.translation.mapping; -import javax.annotation.Nonnull; +import org.jetbrains.annotations.NotNull; import cuchaz.enigma.translation.representation.entry.Entry; import cuchaz.enigma.utils.validation.ValidationContext; @@ -16,7 +16,7 @@ public class EntryUtil { return mapping; } - public static EntryMapping applyChange(@Nonnull EntryMapping self, EntryChange change) { + public static EntryMapping applyChange(@NotNull EntryMapping self, EntryChange change) { if (change.getDeobfName().isSet()) { self = self.withName(change.getDeobfName().getNewValue()); } else if (change.getDeobfName().isReset()) { diff --git a/enigma/src/main/java/cuchaz/enigma/translation/mapping/IndexEntryResolver.java b/enigma/src/main/java/cuchaz/enigma/translation/mapping/IndexEntryResolver.java index 8dc56599..dde634c0 100644 --- a/enigma/src/main/java/cuchaz/enigma/translation/mapping/IndexEntryResolver.java +++ b/enigma/src/main/java/cuchaz/enigma/translation/mapping/IndexEntryResolver.java @@ -6,7 +6,7 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import javax.annotation.Nullable; +import org.jetbrains.annotations.Nullable; import cuchaz.enigma.analysis.IndexTreeBuilder; import cuchaz.enigma.analysis.MethodImplementationsTreeNode; diff --git a/enigma/src/main/java/cuchaz/enigma/translation/mapping/MappingPair.java b/enigma/src/main/java/cuchaz/enigma/translation/mapping/MappingPair.java index 21c78cfd..325af950 100644 --- a/enigma/src/main/java/cuchaz/enigma/translation/mapping/MappingPair.java +++ b/enigma/src/main/java/cuchaz/enigma/translation/mapping/MappingPair.java @@ -1,6 +1,6 @@ package cuchaz.enigma.translation.mapping; -import javax.annotation.Nullable; +import org.jetbrains.annotations.Nullable; import cuchaz.enigma.translation.representation.entry.Entry; diff --git a/enigma/src/main/java/cuchaz/enigma/translation/mapping/MappingValidator.java b/enigma/src/main/java/cuchaz/enigma/translation/mapping/MappingValidator.java index c193828d..dbde4b3a 100644 --- a/enigma/src/main/java/cuchaz/enigma/translation/mapping/MappingValidator.java +++ b/enigma/src/main/java/cuchaz/enigma/translation/mapping/MappingValidator.java @@ -4,7 +4,7 @@ import java.util.Collection; import java.util.HashSet; import java.util.List; -import javax.annotation.Nullable; +import org.jetbrains.annotations.Nullable; import cuchaz.enigma.analysis.index.InheritanceIndex; import cuchaz.enigma.analysis.index.JarIndex; diff --git a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/MappingFormat.java b/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/MappingFormat.java index 197abce1..ec36d47d 100644 --- a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/MappingFormat.java +++ b/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/MappingFormat.java @@ -6,14 +6,13 @@ import java.nio.file.Path; import java.util.Arrays; import java.util.List; -import javax.annotation.Nullable; - import net.fabricmc.mappingio.MappingReader; import net.fabricmc.mappingio.MappingWriter; import net.fabricmc.mappingio.tree.MemoryMappingTree; import net.fabricmc.mappingio.tree.VisitOrder; import net.fabricmc.mappingio.tree.VisitableMappingTree; import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.Nullable; import cuchaz.enigma.ProgressListener; import cuchaz.enigma.analysis.index.JarIndex; diff --git a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/MappingIoConverter.java b/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/MappingIoConverter.java index d4e79e18..766202a5 100644 --- a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/MappingIoConverter.java +++ b/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/MappingIoConverter.java @@ -7,8 +7,6 @@ import java.util.LinkedList; import java.util.List; import java.util.stream.StreamSupport; -import javax.annotation.Nullable; - import net.fabricmc.mappingio.MappedElementKind; import net.fabricmc.mappingio.tree.MappingTree.ClassMapping; import net.fabricmc.mappingio.tree.MappingTree.FieldMapping; @@ -18,6 +16,7 @@ import net.fabricmc.mappingio.tree.MappingTree.MethodVarMapping; import net.fabricmc.mappingio.tree.MemoryMappingTree; import net.fabricmc.mappingio.tree.VisitableMappingTree; import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.Nullable; import cuchaz.enigma.ProgressListener; import cuchaz.enigma.analysis.index.JarIndex; diff --git a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/enigma/EnigmaMappingsReader.java b/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/enigma/EnigmaMappingsReader.java index d5570e98..08d0e575 100644 --- a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/enigma/EnigmaMappingsReader.java +++ b/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/enigma/EnigmaMappingsReader.java @@ -1,6 +1,7 @@ package cuchaz.enigma.translation.mapping.serde.enigma; import java.io.IOException; +import java.nio.charset.StandardCharsets; import java.nio.file.FileSystem; import java.nio.file.FileSystems; import java.nio.file.Files; @@ -12,9 +13,7 @@ import java.util.Deque; import java.util.List; import java.util.Locale; -import javax.annotation.Nullable; - -import com.google.common.base.Charsets; +import org.jetbrains.annotations.Nullable; import cuchaz.enigma.ProgressListener; import cuchaz.enigma.translation.mapping.AccessModifier; @@ -114,7 +113,7 @@ public enum EnigmaMappingsReader implements MappingsReader { } private static void readFile(Path path, EntryTree mappings) throws IOException, MappingParseException { - List lines = Files.readAllLines(path, Charsets.UTF_8); + List lines = Files.readAllLines(path, StandardCharsets.UTF_8); Deque> mappingStack = new ArrayDeque<>(); for (int lineNumber = 0; lineNumber < lines.size(); lineNumber++) { diff --git a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/enigma/EnigmaMappingsWriter.java b/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/enigma/EnigmaMappingsWriter.java index 24867b69..266668dd 100644 --- a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/enigma/EnigmaMappingsWriter.java +++ b/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/enigma/EnigmaMappingsWriter.java @@ -31,13 +31,12 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; import java.util.stream.Stream; -import javax.annotation.Nonnull; - import net.fabricmc.mappingio.MappingWriter; import net.fabricmc.mappingio.format.MappingFormat; import net.fabricmc.mappingio.tree.VisitOrder; import net.fabricmc.mappingio.tree.VisitableMappingTree; import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; import cuchaz.enigma.ProgressListener; import cuchaz.enigma.translation.MappingTranslator; @@ -298,7 +297,7 @@ public enum EnigmaMappingsWriter implements MappingsWriter { return result; } - protected String writeClass(ClassEntry entry, @Nonnull EntryMapping mapping) { + protected String writeClass(ClassEntry entry, @NotNull EntryMapping mapping) { StringBuilder builder = new StringBuilder(EnigmaFormat.CLASS + " "); builder.append(entry.getName()).append(' '); writeMapping(builder, mapping); @@ -306,7 +305,7 @@ public enum EnigmaMappingsWriter implements MappingsWriter { return builder.toString(); } - protected String writeMethod(MethodEntry entry, @Nonnull EntryMapping mapping) { + protected String writeMethod(MethodEntry entry, @NotNull EntryMapping mapping) { StringBuilder builder = new StringBuilder(EnigmaFormat.METHOD + " "); builder.append(entry.getName()).append(' '); writeMapping(builder, mapping); @@ -316,7 +315,7 @@ public enum EnigmaMappingsWriter implements MappingsWriter { return builder.toString(); } - protected String writeField(FieldEntry entry, @Nonnull EntryMapping mapping) { + protected String writeField(FieldEntry entry, @NotNull EntryMapping mapping) { StringBuilder builder = new StringBuilder(EnigmaFormat.FIELD + " "); builder.append(entry.getName()).append(' '); writeMapping(builder, mapping); @@ -326,7 +325,7 @@ public enum EnigmaMappingsWriter implements MappingsWriter { return builder.toString(); } - protected String writeArgument(LocalVariableEntry entry, @Nonnull EntryMapping mapping) { + protected String writeArgument(LocalVariableEntry entry, @NotNull EntryMapping mapping) { return EnigmaFormat.PARAMETER + " " + entry.getIndex() + ' ' + mapping.targetName(); } diff --git a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/recaf/RecafMappingsWriter.java b/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/recaf/RecafMappingsWriter.java index df65b3c8..26a29bf1 100644 --- a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/recaf/RecafMappingsWriter.java +++ b/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/recaf/RecafMappingsWriter.java @@ -5,8 +5,7 @@ import java.io.IOException; import java.io.Writer; import java.nio.file.Files; import java.nio.file.Path; - -import com.google.common.collect.Lists; +import java.util.ArrayList; import cuchaz.enigma.ProgressListener; import cuchaz.enigma.translation.mapping.EntryMapping; @@ -33,7 +32,7 @@ public class RecafMappingsWriter implements MappingsWriter { } try (BufferedWriter writer = Files.newBufferedWriter(path)) { - Lists.newArrayList(mappings).stream().map(EntryTreeNode::getEntry).forEach(entry -> writeEntry(writer, mappings, entry)); + new ArrayList<>(mappings).stream().map(EntryTreeNode::getEntry).forEach(entry -> writeEntry(writer, mappings, entry)); } catch (IOException e) { e.printStackTrace(); } diff --git a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/srg/SrgMappingsWriter.java b/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/srg/SrgMappingsWriter.java index 5addcade..42372373 100644 --- a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/srg/SrgMappingsWriter.java +++ b/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/srg/SrgMappingsWriter.java @@ -9,8 +9,6 @@ import java.util.Collection; import java.util.Comparator; import java.util.List; -import com.google.common.collect.Lists; - import cuchaz.enigma.ProgressListener; import cuchaz.enigma.translation.MappingTranslator; import cuchaz.enigma.translation.Translator; @@ -44,7 +42,7 @@ public enum SrgMappingsWriter implements MappingsWriter { List fieldLines = new ArrayList<>(); List methodLines = new ArrayList<>(); - List> rootEntries = Lists.newArrayList(mappings).stream().map(EntryTreeNode::getEntry).toList(); + List> rootEntries = new ArrayList<>(mappings).stream().map(EntryTreeNode::getEntry).toList(); progress.init(rootEntries.size(), I18n.translate("progress.mappings.converting")); int steps = 0; @@ -113,8 +111,8 @@ public enum SrgMappingsWriter implements MappingsWriter { return entry.getParent().getFullName() + "/" + entry.getName(); } - private Collection> sorted(Iterable> iterable) { - ArrayList> sorted = Lists.newArrayList(iterable); + private Collection> sorted(Collection> collection) { + ArrayList> sorted = new ArrayList<>(collection); sorted.sort(Comparator.comparing(Entry::getName)); return sorted; } diff --git a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/tiny/TinyMappingsReader.java b/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/tiny/TinyMappingsReader.java index 1575f468..ae003003 100644 --- a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/tiny/TinyMappingsReader.java +++ b/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/tiny/TinyMappingsReader.java @@ -1,12 +1,11 @@ package cuchaz.enigma.translation.mapping.serde.tiny; import java.io.IOException; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.util.List; -import com.google.common.base.Charsets; - import cuchaz.enigma.ProgressListener; import cuchaz.enigma.translation.mapping.EntryMapping; import cuchaz.enigma.translation.mapping.MappingPair; @@ -28,7 +27,7 @@ public enum TinyMappingsReader implements MappingsReader { @Override public EntryTree read(Path path, ProgressListener progress, MappingSaveParameters saveParameters) throws IOException, MappingParseException { - return read(path, Files.readAllLines(path, Charsets.UTF_8), progress); + return read(path, Files.readAllLines(path, StandardCharsets.UTF_8), progress); } private EntryTree read(Path path, List lines, ProgressListener progress) throws MappingParseException { diff --git a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/tiny/TinyMappingsWriter.java b/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/tiny/TinyMappingsWriter.java index 972d1807..67582be0 100644 --- a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/tiny/TinyMappingsWriter.java +++ b/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/tiny/TinyMappingsWriter.java @@ -6,13 +6,11 @@ import java.io.Writer; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; +import java.util.ArrayList; import java.util.Comparator; import java.util.HashSet; import java.util.Set; -import com.google.common.base.Joiner; -import com.google.common.collect.Lists; - import cuchaz.enigma.ProgressListener; import cuchaz.enigma.translation.MappingTranslator; import cuchaz.enigma.translation.Translator; @@ -30,7 +28,6 @@ import cuchaz.enigma.translation.representation.entry.MethodEntry; public class TinyMappingsWriter implements MappingsWriter { private static final String VERSION_CONSTANT = "v1"; - private static final Joiner TAB_JOINER = Joiner.on('\t'); //Possibly add a gui or a way to select the namespaces when exporting from the gui public static final TinyMappingsWriter INSTANCE = new TinyMappingsWriter("intermediary", "named"); @@ -57,7 +54,7 @@ public class TinyMappingsWriter implements MappingsWriter { try (BufferedWriter writer = Files.newBufferedWriter(path, StandardCharsets.UTF_8)) { writeLine(writer, new String[]{VERSION_CONSTANT, nameObf, nameDeobf}); - Lists.newArrayList(mappings).stream().map(EntryTreeNode::getEntry).sorted(Comparator.comparing(Object::toString)).forEach(entry -> writeEntry(writer, mappings, entry)); + new ArrayList<>(mappings).stream().map(EntryTreeNode::getEntry).sorted(Comparator.comparing(Object::toString)).forEach(entry -> writeEntry(writer, mappings, entry)); } catch (IOException e) { e.printStackTrace(); } @@ -107,7 +104,7 @@ public class TinyMappingsWriter implements MappingsWriter { private void writeLine(Writer writer, String[] data) { try { - String line = TAB_JOINER.join(data) + "\n"; + String line = String.join("\t", data) + "\n"; if (writtenLines.add(line)) { writer.write(line); diff --git a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/tinyv2/TinyV2Writer.java b/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/tinyv2/TinyV2Writer.java index 959d2d8f..d85ed6e5 100644 --- a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/tinyv2/TinyV2Writer.java +++ b/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/tinyv2/TinyV2Writer.java @@ -9,8 +9,6 @@ import java.util.LinkedList; import java.util.List; import java.util.stream.StreamSupport; -import com.google.common.base.Strings; - import cuchaz.enigma.ProgressListener; import cuchaz.enigma.translation.mapping.EntryMap; import cuchaz.enigma.translation.mapping.EntryMapping; @@ -184,6 +182,6 @@ public final class TinyV2Writer implements MappingsWriter { } private String indent(int level) { - return Strings.repeat("\t", level); + return "\t".repeat(level); } } diff --git a/enigma/src/main/java/cuchaz/enigma/translation/mapping/tree/DeltaTrackingTree.java b/enigma/src/main/java/cuchaz/enigma/translation/mapping/tree/DeltaTrackingTree.java index b943cc84..ef746c4d 100644 --- a/enigma/src/main/java/cuchaz/enigma/translation/mapping/tree/DeltaTrackingTree.java +++ b/enigma/src/main/java/cuchaz/enigma/translation/mapping/tree/DeltaTrackingTree.java @@ -1,10 +1,11 @@ package cuchaz.enigma.translation.mapping.tree; +import java.util.AbstractCollection; import java.util.Collection; import java.util.Iterator; import java.util.stream.Stream; -import javax.annotation.Nullable; +import org.jetbrains.annotations.Nullable; import cuchaz.enigma.translation.Translator; import cuchaz.enigma.translation.mapping.EntryMap; @@ -13,7 +14,7 @@ import cuchaz.enigma.translation.mapping.EntryResolver; import cuchaz.enigma.translation.mapping.MappingDelta; import cuchaz.enigma.translation.representation.entry.Entry; -public class DeltaTrackingTree implements EntryTree { +public class DeltaTrackingTree extends AbstractCollection> implements EntryTree { private final EntryTree delegate; private EntryTree deltaReference; @@ -94,6 +95,11 @@ public class DeltaTrackingTree implements EntryTree { return delegate.iterator(); } + @Override + public int size() { + return delegate.size(); + } + public MappingDelta takeDelta() { MappingDelta delta = new MappingDelta<>(deltaReference, changes); resetDelta(); diff --git a/enigma/src/main/java/cuchaz/enigma/translation/mapping/tree/EntryTree.java b/enigma/src/main/java/cuchaz/enigma/translation/mapping/tree/EntryTree.java index e1c8e8d6..3fe535f7 100644 --- a/enigma/src/main/java/cuchaz/enigma/translation/mapping/tree/EntryTree.java +++ b/enigma/src/main/java/cuchaz/enigma/translation/mapping/tree/EntryTree.java @@ -3,7 +3,7 @@ package cuchaz.enigma.translation.mapping.tree; import java.util.Collection; import java.util.stream.Stream; -import javax.annotation.Nullable; +import org.jetbrains.annotations.Nullable; import cuchaz.enigma.translation.Translatable; import cuchaz.enigma.translation.TranslateResult; @@ -13,7 +13,7 @@ import cuchaz.enigma.translation.mapping.EntryMapping; import cuchaz.enigma.translation.mapping.EntryResolver; import cuchaz.enigma.translation.representation.entry.Entry; -public interface EntryTree extends EntryMap, Iterable>, Translatable { +public interface EntryTree extends EntryMap, Collection>, Translatable { Collection> getChildren(Entry entry); Collection> getSiblings(Entry entry); diff --git a/enigma/src/main/java/cuchaz/enigma/translation/mapping/tree/EntryTreeNode.java b/enigma/src/main/java/cuchaz/enigma/translation/mapping/tree/EntryTreeNode.java index 254b3318..ab249dfd 100644 --- a/enigma/src/main/java/cuchaz/enigma/translation/mapping/tree/EntryTreeNode.java +++ b/enigma/src/main/java/cuchaz/enigma/translation/mapping/tree/EntryTreeNode.java @@ -4,7 +4,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; -import javax.annotation.Nullable; +import org.jetbrains.annotations.Nullable; import cuchaz.enigma.translation.representation.entry.Entry; @@ -31,6 +31,16 @@ public interface EntryTreeNode { return nodes; } + default int sizeRecursively() { + int size = 1; + + for (EntryTreeNode node : getChildNodes()) { + size += node.sizeRecursively(); + } + + return size; + } + default List> getChildrenRecursively() { return getNodesRecursively().stream().map(EntryTreeNode::getEntry).toList(); } diff --git a/enigma/src/main/java/cuchaz/enigma/translation/mapping/tree/HashEntryTree.java b/enigma/src/main/java/cuchaz/enigma/translation/mapping/tree/HashEntryTree.java index 2902373d..a026eb61 100644 --- a/enigma/src/main/java/cuchaz/enigma/translation/mapping/tree/HashEntryTree.java +++ b/enigma/src/main/java/cuchaz/enigma/translation/mapping/tree/HashEntryTree.java @@ -1,5 +1,6 @@ package cuchaz.enigma.translation.mapping.tree; +import java.util.AbstractCollection; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -13,8 +14,8 @@ import java.util.function.Function; import java.util.stream.Stream; import java.util.stream.StreamSupport; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import cuchaz.enigma.translation.Translator; import cuchaz.enigma.translation.mapping.EntryMap; @@ -22,7 +23,7 @@ import cuchaz.enigma.translation.mapping.EntryMapping; import cuchaz.enigma.translation.mapping.EntryResolver; import cuchaz.enigma.translation.representation.entry.Entry; -public class HashEntryTree implements EntryTree { +public class HashEntryTree extends AbstractCollection> implements EntryTree { private final Map, HashTreeNode> root = new HashMap<>(); public HashEntryTree() { @@ -177,7 +178,7 @@ public class HashEntryTree implements EntryTree { } @Override - @Nonnull + @NotNull public Iterator> iterator() { Collection> nodes = new ArrayList<>(); @@ -188,6 +189,11 @@ public class HashEntryTree implements EntryTree { return nodes.iterator(); } + @Override + public int size() { + return root.values().stream().mapToInt(EntryTreeNode::sizeRecursively).sum(); + } + @Override public Stream> getAllEntries() { return StreamSupport.stream(spliterator(), false).filter(EntryTreeNode::hasValue).map(EntryTreeNode::getEntry); diff --git a/enigma/src/main/java/cuchaz/enigma/translation/mapping/tree/HashTreeNode.java b/enigma/src/main/java/cuchaz/enigma/translation/mapping/tree/HashTreeNode.java index 3ddaf81f..c65bd408 100644 --- a/enigma/src/main/java/cuchaz/enigma/translation/mapping/tree/HashTreeNode.java +++ b/enigma/src/main/java/cuchaz/enigma/translation/mapping/tree/HashTreeNode.java @@ -5,8 +5,8 @@ import java.util.HashMap; import java.util.Iterator; import java.util.Map; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import cuchaz.enigma.translation.representation.entry.Entry; @@ -34,7 +34,7 @@ public class HashTreeNode implements EntryTreeNode, Iterable computeChild(Entry entry) { return children.computeIfAbsent(entry, HashTreeNode::new); } diff --git a/enigma/src/main/java/cuchaz/enigma/translation/representation/MethodDescriptor.java b/enigma/src/main/java/cuchaz/enigma/translation/representation/MethodDescriptor.java index 571488cc..bfd77d0f 100644 --- a/enigma/src/main/java/cuchaz/enigma/translation/representation/MethodDescriptor.java +++ b/enigma/src/main/java/cuchaz/enigma/translation/representation/MethodDescriptor.java @@ -16,8 +16,6 @@ import java.util.List; import java.util.Objects; import java.util.function.Function; -import com.google.common.collect.Lists; - import cuchaz.enigma.translation.Translatable; import cuchaz.enigma.translation.TranslateResult; import cuchaz.enigma.translation.Translator; @@ -32,7 +30,7 @@ public class MethodDescriptor implements Translatable { public MethodDescriptor(String desc) { try { - this.argumentDescs = Lists.newArrayList(); + this.argumentDescs = new ArrayList<>(); int i = 0; while (i < desc.length()) { @@ -86,8 +84,7 @@ public class MethodDescriptor implements Translatable { } public Iterable types() { - List descs = Lists.newArrayList(); - descs.addAll(this.argumentDescs); + List descs = new ArrayList<>(this.argumentDescs); descs.add(this.returnDesc); return descs; } diff --git a/enigma/src/main/java/cuchaz/enigma/translation/representation/TypeDescriptor.java b/enigma/src/main/java/cuchaz/enigma/translation/representation/TypeDescriptor.java index fd53522d..c714fd51 100644 --- a/enigma/src/main/java/cuchaz/enigma/translation/representation/TypeDescriptor.java +++ b/enigma/src/main/java/cuchaz/enigma/translation/representation/TypeDescriptor.java @@ -12,11 +12,10 @@ package cuchaz.enigma.translation.representation; import java.util.Map; +import java.util.Objects; +import java.util.TreeMap; import java.util.function.Function; -import com.google.common.base.Preconditions; -import com.google.common.collect.Maps; - import cuchaz.enigma.translation.Translatable; import cuchaz.enigma.translation.TranslateResult; import cuchaz.enigma.translation.Translator; @@ -29,7 +28,7 @@ public class TypeDescriptor implements Translatable { protected final String desc; public TypeDescriptor(String desc) { - Preconditions.checkNotNull(desc, "Desc cannot be null"); + Objects.requireNonNull(desc, "Desc cannot be null"); // don't deal with generics // this is just for raw jvm types @@ -260,7 +259,7 @@ public class TypeDescriptor implements Translatable { private static final Map lookup; static { - lookup = Maps.newTreeMap(); + lookup = new TreeMap<>(); for (Primitive val : values()) { lookup.put(val.getCode(), val); diff --git a/enigma/src/main/java/cuchaz/enigma/translation/representation/entry/ClassDefEntry.java b/enigma/src/main/java/cuchaz/enigma/translation/representation/entry/ClassDefEntry.java index eb3ea42a..3cbd0c9a 100644 --- a/enigma/src/main/java/cuchaz/enigma/translation/representation/entry/ClassDefEntry.java +++ b/enigma/src/main/java/cuchaz/enigma/translation/representation/entry/ClassDefEntry.java @@ -12,11 +12,10 @@ package cuchaz.enigma.translation.representation.entry; import java.util.Arrays; +import java.util.Objects; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import com.google.common.base.Preconditions; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import cuchaz.enigma.source.RenamableTokenType; import cuchaz.enigma.translation.TranslateResult; @@ -41,11 +40,9 @@ public class ClassDefEntry extends ClassEntry implements DefEntry { public ClassDefEntry(ClassEntry parent, String className, Signature signature, AccessFlags access, @Nullable ClassEntry superClass, ClassEntry[] interfaces, String javadocs) { super(parent, className, javadocs); - Preconditions.checkNotNull(signature, "Class signature cannot be null"); - Preconditions.checkNotNull(access, "Class access cannot be null"); - this.signature = signature; - this.access = access; + this.signature = Objects.requireNonNull(signature, "Class signature cannot be null"); + this.access = Objects.requireNonNull(access, "Class access cannot be null"); this.superClass = superClass; this.interfaces = interfaces != null ? interfaces : new ClassEntry[0]; } @@ -79,7 +76,7 @@ public class ClassDefEntry extends ClassEntry implements DefEntry { } @Override - public TranslateResult extendedTranslate(Translator translator, @Nonnull EntryMapping mapping) { + public TranslateResult extendedTranslate(Translator translator, @NotNull EntryMapping mapping) { Signature translatedSignature = translator.translate(signature); String translatedName = mapping.targetName() != null ? mapping.targetName() : name; AccessFlags translatedAccess = mapping.accessModifier().transform(access); diff --git a/enigma/src/main/java/cuchaz/enigma/translation/representation/entry/ClassEntry.java b/enigma/src/main/java/cuchaz/enigma/translation/representation/entry/ClassEntry.java index 0e179d7f..23c4f4f9 100644 --- a/enigma/src/main/java/cuchaz/enigma/translation/representation/entry/ClassEntry.java +++ b/enigma/src/main/java/cuchaz/enigma/translation/representation/entry/ClassEntry.java @@ -14,8 +14,8 @@ package cuchaz.enigma.translation.representation.entry; import java.util.List; import java.util.Objects; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import cuchaz.enigma.source.RenamableTokenType; import cuchaz.enigma.translation.TranslateResult; @@ -90,7 +90,7 @@ public class ClassEntry extends ParentedEntry implements Comparable< } @Override - public TranslateResult extendedTranslate(Translator translator, @Nonnull EntryMapping mapping) { + public TranslateResult extendedTranslate(Translator translator, @NotNull EntryMapping mapping) { if (name.charAt(0) == '[') { TranslateResult translatedName = translator.extendedTranslate(new TypeDescriptor(name)); return translatedName.map(desc -> new ClassEntry(parent, desc.toString())); @@ -166,7 +166,7 @@ public class ClassEntry extends ParentedEntry implements Comparable< return parent; } - @Nonnull + @NotNull public ClassEntry getOutermostClass() { if (parent == null) { return this; diff --git a/enigma/src/main/java/cuchaz/enigma/translation/representation/entry/Entry.java b/enigma/src/main/java/cuchaz/enigma/translation/representation/entry/Entry.java index 71425e0f..568d01c9 100644 --- a/enigma/src/main/java/cuchaz/enigma/translation/representation/entry/Entry.java +++ b/enigma/src/main/java/cuchaz/enigma/translation/representation/entry/Entry.java @@ -15,7 +15,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Objects; -import javax.annotation.Nullable; +import org.jetbrains.annotations.Nullable; import cuchaz.enigma.translation.Translatable; import cuchaz.enigma.translation.mapping.IdentifierValidation; diff --git a/enigma/src/main/java/cuchaz/enigma/translation/representation/entry/FieldDefEntry.java b/enigma/src/main/java/cuchaz/enigma/translation/representation/entry/FieldDefEntry.java index 492d72e7..45ef31c5 100644 --- a/enigma/src/main/java/cuchaz/enigma/translation/representation/entry/FieldDefEntry.java +++ b/enigma/src/main/java/cuchaz/enigma/translation/representation/entry/FieldDefEntry.java @@ -11,9 +11,9 @@ package cuchaz.enigma.translation.representation.entry; -import javax.annotation.Nonnull; +import java.util.Objects; -import com.google.common.base.Preconditions; +import org.jetbrains.annotations.NotNull; import cuchaz.enigma.source.RenamableTokenType; import cuchaz.enigma.translation.TranslateResult; @@ -33,10 +33,8 @@ public class FieldDefEntry extends FieldEntry implements DefEntry { public FieldDefEntry(ClassEntry owner, String name, TypeDescriptor desc, Signature signature, AccessFlags access, String javadocs) { super(owner, name, desc, javadocs); - Preconditions.checkNotNull(access, "Field access cannot be null"); - Preconditions.checkNotNull(signature, "Field signature cannot be null"); - this.access = access; - this.signature = signature; + this.access = Objects.requireNonNull(access, "Field access cannot be null"); + this.signature = Objects.requireNonNull(signature, "Field signature cannot be null"); } public static FieldDefEntry parse(ClassEntry owner, int access, String name, String desc, String signature) { @@ -53,7 +51,7 @@ public class FieldDefEntry extends FieldEntry implements DefEntry { } @Override - protected TranslateResult extendedTranslate(Translator translator, @Nonnull EntryMapping mapping) { + protected TranslateResult extendedTranslate(Translator translator, @NotNull EntryMapping mapping) { TypeDescriptor translatedDesc = translator.translate(desc); Signature translatedSignature = translator.translate(signature); String translatedName = mapping.targetName() != null ? mapping.targetName() : name; diff --git a/enigma/src/main/java/cuchaz/enigma/translation/representation/entry/FieldEntry.java b/enigma/src/main/java/cuchaz/enigma/translation/representation/entry/FieldEntry.java index aaa0798c..745485f0 100644 --- a/enigma/src/main/java/cuchaz/enigma/translation/representation/entry/FieldEntry.java +++ b/enigma/src/main/java/cuchaz/enigma/translation/representation/entry/FieldEntry.java @@ -13,9 +13,7 @@ package cuchaz.enigma.translation.representation.entry; import java.util.Objects; -import javax.annotation.Nonnull; - -import com.google.common.base.Preconditions; +import org.jetbrains.annotations.NotNull; import cuchaz.enigma.source.RenamableTokenType; import cuchaz.enigma.translation.TranslateResult; @@ -31,12 +29,9 @@ public class FieldEntry extends ParentedEntry implements Comparable< } public FieldEntry(ClassEntry parent, String name, TypeDescriptor desc, String javadocs) { - super(parent, name, javadocs); - - Preconditions.checkNotNull(parent, "Owner cannot be null"); - Preconditions.checkNotNull(desc, "Field descriptor cannot be null"); + super(Objects.requireNonNull(parent, "Owner cannot be null"), name, javadocs); - this.desc = desc; + this.desc = Objects.requireNonNull(desc, "Field descriptor cannot be null"); } public static FieldEntry parse(String owner, String name, String desc) { @@ -63,7 +58,7 @@ public class FieldEntry extends ParentedEntry implements Comparable< } @Override - protected TranslateResult extendedTranslate(Translator translator, @Nonnull EntryMapping mapping) { + protected TranslateResult extendedTranslate(Translator translator, @NotNull EntryMapping mapping) { String translatedName = mapping.targetName() != null ? mapping.targetName() : name; String docs = mapping.javadoc(); return TranslateResult.of(mapping.targetName() == null ? RenamableTokenType.OBFUSCATED : RenamableTokenType.DEOBFUSCATED, new FieldEntry(parent, translatedName, translator.translate(desc), docs)); diff --git a/enigma/src/main/java/cuchaz/enigma/translation/representation/entry/LocalVariableDefEntry.java b/enigma/src/main/java/cuchaz/enigma/translation/representation/entry/LocalVariableDefEntry.java index ac36a483..9eda3a9e 100644 --- a/enigma/src/main/java/cuchaz/enigma/translation/representation/entry/LocalVariableDefEntry.java +++ b/enigma/src/main/java/cuchaz/enigma/translation/representation/entry/LocalVariableDefEntry.java @@ -1,8 +1,8 @@ package cuchaz.enigma.translation.representation.entry; -import javax.annotation.Nonnull; +import java.util.Objects; -import com.google.common.base.Preconditions; +import org.jetbrains.annotations.NotNull; import cuchaz.enigma.source.RenamableTokenType; import cuchaz.enigma.translation.TranslateResult; @@ -20,9 +20,8 @@ public class LocalVariableDefEntry extends LocalVariableEntry { public LocalVariableDefEntry(MethodEntry ownerEntry, int index, String name, boolean parameter, TypeDescriptor desc, String javadoc) { super(ownerEntry, index, name, parameter, javadoc); - Preconditions.checkNotNull(desc, "Variable desc cannot be null"); - this.desc = desc; + this.desc = Objects.requireNonNull(desc, "Variable desc cannot be null"); } public TypeDescriptor getDesc() { @@ -30,7 +29,7 @@ public class LocalVariableDefEntry extends LocalVariableEntry { } @Override - protected TranslateResult extendedTranslate(Translator translator, @Nonnull EntryMapping mapping) { + protected TranslateResult extendedTranslate(Translator translator, @NotNull EntryMapping mapping) { TypeDescriptor translatedDesc = translator.translate(desc); String translatedName = mapping.targetName() != null ? mapping.targetName() : name; String javadoc = mapping.javadoc(); diff --git a/enigma/src/main/java/cuchaz/enigma/translation/representation/entry/LocalVariableEntry.java b/enigma/src/main/java/cuchaz/enigma/translation/representation/entry/LocalVariableEntry.java index 9d0bbedd..b188fb5b 100644 --- a/enigma/src/main/java/cuchaz/enigma/translation/representation/entry/LocalVariableEntry.java +++ b/enigma/src/main/java/cuchaz/enigma/translation/representation/entry/LocalVariableEntry.java @@ -2,9 +2,7 @@ package cuchaz.enigma.translation.representation.entry; import java.util.Objects; -import javax.annotation.Nonnull; - -import com.google.common.base.Preconditions; +import org.jetbrains.annotations.NotNull; import cuchaz.enigma.source.RenamableTokenType; import cuchaz.enigma.translation.TranslateResult; @@ -21,10 +19,11 @@ public class LocalVariableEntry extends ParentedEntry implements Co protected final boolean parameter; public LocalVariableEntry(MethodEntry parent, int index, String name, boolean parameter, String javadoc) { - super(parent, name, javadoc); + super(Objects.requireNonNull(parent, "Variable owner cannot be null"), name, javadoc); - Preconditions.checkNotNull(parent, "Variable owner cannot be null"); - Preconditions.checkArgument(index >= 0, "Index must be positive"); + if (index < 0) { + throw new IllegalArgumentException("Index must be positive"); + } this.index = index; this.parameter = parameter; @@ -49,7 +48,7 @@ public class LocalVariableEntry extends ParentedEntry implements Co } @Override - protected TranslateResult extendedTranslate(Translator translator, @Nonnull EntryMapping mapping) { + protected TranslateResult extendedTranslate(Translator translator, @NotNull EntryMapping mapping) { String translatedName = mapping.targetName() != null ? mapping.targetName() : name; String javadoc = mapping.javadoc(); return TranslateResult.of(mapping.targetName() == null ? RenamableTokenType.OBFUSCATED : RenamableTokenType.DEOBFUSCATED, new LocalVariableEntry(parent, index, translatedName, parameter, javadoc)); diff --git a/enigma/src/main/java/cuchaz/enigma/translation/representation/entry/MethodDefEntry.java b/enigma/src/main/java/cuchaz/enigma/translation/representation/entry/MethodDefEntry.java index c6a4ab73..4392953e 100644 --- a/enigma/src/main/java/cuchaz/enigma/translation/representation/entry/MethodDefEntry.java +++ b/enigma/src/main/java/cuchaz/enigma/translation/representation/entry/MethodDefEntry.java @@ -11,9 +11,9 @@ package cuchaz.enigma.translation.representation.entry; -import javax.annotation.Nonnull; +import java.util.Objects; -import com.google.common.base.Preconditions; +import org.jetbrains.annotations.NotNull; import cuchaz.enigma.source.RenamableTokenType; import cuchaz.enigma.translation.TranslateResult; @@ -33,10 +33,8 @@ public class MethodDefEntry extends MethodEntry implements DefEntry public MethodDefEntry(ClassEntry owner, String name, MethodDescriptor descriptor, Signature signature, AccessFlags access, String docs) { super(owner, name, descriptor, docs); - Preconditions.checkNotNull(access, "Method access cannot be null"); - Preconditions.checkNotNull(signature, "Method signature cannot be null"); - this.access = access; - this.signature = signature; + this.access = Objects.requireNonNull(access, "Method access cannot be null"); + this.signature = Objects.requireNonNull(signature, "Method signature cannot be null"); } public static MethodDefEntry parse(ClassEntry owner, int access, String name, String desc, String signature) { @@ -53,7 +51,7 @@ public class MethodDefEntry extends MethodEntry implements DefEntry } @Override - protected TranslateResult extendedTranslate(Translator translator, @Nonnull EntryMapping mapping) { + protected TranslateResult extendedTranslate(Translator translator, @NotNull EntryMapping mapping) { MethodDescriptor translatedDesc = translator.translate(descriptor); Signature translatedSignature = translator.translate(signature); String translatedName = mapping.targetName() != null ? mapping.targetName() : name; diff --git a/enigma/src/main/java/cuchaz/enigma/translation/representation/entry/MethodEntry.java b/enigma/src/main/java/cuchaz/enigma/translation/representation/entry/MethodEntry.java index 5ccb9081..3390bc57 100644 --- a/enigma/src/main/java/cuchaz/enigma/translation/representation/entry/MethodEntry.java +++ b/enigma/src/main/java/cuchaz/enigma/translation/representation/entry/MethodEntry.java @@ -13,9 +13,7 @@ package cuchaz.enigma.translation.representation.entry; import java.util.Objects; -import javax.annotation.Nonnull; - -import com.google.common.base.Preconditions; +import org.jetbrains.annotations.NotNull; import cuchaz.enigma.source.RenamableTokenType; import cuchaz.enigma.translation.TranslateResult; @@ -31,12 +29,9 @@ public class MethodEntry extends ParentedEntry implements Comparable } public MethodEntry(ClassEntry parent, String name, MethodDescriptor descriptor, String javadocs) { - super(parent, name, javadocs); - - Preconditions.checkNotNull(parent, "Parent cannot be null"); - Preconditions.checkNotNull(descriptor, "Method descriptor cannot be null"); + super(Objects.requireNonNull(parent, "Parent cannot be null"), name, javadocs); - this.descriptor = descriptor; + this.descriptor = Objects.requireNonNull(descriptor, "Method descriptor cannot be null"); } public static MethodEntry parse(String owner, String name, String desc) { @@ -57,7 +52,7 @@ public class MethodEntry extends ParentedEntry implements Comparable } @Override - protected TranslateResult extendedTranslate(Translator translator, @Nonnull EntryMapping mapping) { + protected TranslateResult extendedTranslate(Translator translator, @NotNull EntryMapping mapping) { String translatedName = mapping.targetName() != null ? mapping.targetName() : name; String docs = mapping.javadoc(); return TranslateResult.of(mapping.targetName() == null ? RenamableTokenType.OBFUSCATED : RenamableTokenType.DEOBFUSCATED, new MethodEntry(parent, translatedName, translator.translate(descriptor), docs)); diff --git a/enigma/src/main/java/cuchaz/enigma/translation/representation/entry/ParentedEntry.java b/enigma/src/main/java/cuchaz/enigma/translation/representation/entry/ParentedEntry.java index ff5ffa39..e8e6f30d 100644 --- a/enigma/src/main/java/cuchaz/enigma/translation/representation/entry/ParentedEntry.java +++ b/enigma/src/main/java/cuchaz/enigma/translation/representation/entry/ParentedEntry.java @@ -11,10 +11,10 @@ package cuchaz.enigma.translation.representation.entry; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; +import java.util.Objects; -import com.google.common.base.Preconditions; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import cuchaz.enigma.translation.TranslateResult; import cuchaz.enigma.translation.Translator; @@ -28,12 +28,10 @@ public abstract class ParentedEntry

> implements Entry

{ protected final String name; protected final @Nullable String javadocs; - protected ParentedEntry(P parent, String name, String javadocs) { + protected ParentedEntry(P parent, String name, @Nullable String javadocs) { this.parent = parent; - this.name = name; + this.name = Objects.requireNonNull(name, "Name cannot be null"); this.javadocs = javadocs; - - Preconditions.checkNotNull(name, "Name cannot be null"); } @Override @@ -42,7 +40,7 @@ public abstract class ParentedEntry

> implements Entry

{ @Override public abstract ParentedEntry

withName(String name); - protected abstract TranslateResult> extendedTranslate(Translator translator, @Nonnull EntryMapping mapping); + protected abstract TranslateResult> extendedTranslate(Translator translator, @NotNull EntryMapping mapping); @Override public String getName() { diff --git a/enigma/src/main/java/cuchaz/enigma/utils/I18n.java b/enigma/src/main/java/cuchaz/enigma/utils/I18n.java index 95512026..fff73526 100644 --- a/enigma/src/main/java/cuchaz/enigma/utils/I18n.java +++ b/enigma/src/main/java/cuchaz/enigma/utils/I18n.java @@ -8,15 +8,12 @@ import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; -import java.util.stream.Stream; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Maps; -import com.google.common.reflect.ClassPath; -import com.google.common.reflect.ClassPath.ResourceInfo; import com.google.gson.Gson; public class I18n { @@ -24,7 +21,7 @@ public class I18n { private static final Gson GSON = new Gson(); private static Map defaultTranslations = load(DEFAULT_LANGUAGE); private static Map translations = defaultTranslations; - private static Map languageNames = Maps.newHashMap(); + private static Map languageNames = new HashMap<>(); @SuppressWarnings("unchecked") public static Map load(String language) { @@ -87,19 +84,22 @@ public class I18n { } public static ArrayList getAvailableLanguages() { - ArrayList list = new ArrayList(); + ArrayList list = new ArrayList<>(); try { - ImmutableList resources = ClassPath.from(Thread.currentThread().getContextClassLoader()).getResources().asList(); - Stream dirStream = resources.stream(); - dirStream.forEach(context -> { - String file = context.getResourceName(); - - if (file.startsWith("lang/") && file.endsWith(".json")) { - String fileName = file.substring(5, file.length() - 5); - list.add(fileName); - loadLanguageName(fileName); - } + ClassLoader cl = Thread.currentThread().getContextClassLoader(); + List availableTranslations; + + try (InputStream is = cl.getResourceAsStream("lang/index.txt")) { + availableTranslations = Arrays.asList( + new String(is.readAllBytes(), StandardCharsets.UTF_8) + .split("\n") + ); + } + + availableTranslations.forEach(fileName -> { + list.add(fileName); + loadLanguageName(fileName); }); } catch (IOException e) { e.printStackTrace(); diff --git a/enigma/src/main/java/cuchaz/enigma/utils/Utils.java b/enigma/src/main/java/cuchaz/enigma/utils/Utils.java index a1926a8b..8b692b52 100644 --- a/enigma/src/main/java/cuchaz/enigma/utils/Utils.java +++ b/enigma/src/main/java/cuchaz/enigma/utils/Utils.java @@ -13,7 +13,6 @@ package cuchaz.enigma.utils; import java.io.IOException; import java.io.InputStream; -import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; @@ -28,12 +27,9 @@ import java.util.function.Supplier; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; -import com.google.common.base.Preconditions; -import com.google.common.io.CharStreams; - public class Utils { public static String readStreamToString(InputStream in) throws IOException { - return CharStreams.toString(new InputStreamReader(in, StandardCharsets.UTF_8)); + return new String(in.readAllBytes(), StandardCharsets.UTF_8); } public static String readResourceToString(String path) throws IOException { @@ -55,7 +51,10 @@ public class Utils { } public static byte[] zipSha1(Path... paths) throws IOException { - Preconditions.checkArgument(paths.length >= 1, "Must provide at least one zip"); + if (paths.length == 0) { + throw new IllegalArgumentException("Must provide at least one zip"); + } + MessageDigest digest; try { diff --git a/enigma/src/main/java/cuchaz/enigma/utils/validation/ValidationContext.java b/enigma/src/main/java/cuchaz/enigma/utils/validation/ValidationContext.java index 416e8a05..0cb9b816 100644 --- a/enigma/src/main/java/cuchaz/enigma/utils/validation/ValidationContext.java +++ b/enigma/src/main/java/cuchaz/enigma/utils/validation/ValidationContext.java @@ -6,7 +6,7 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import javax.annotation.Nullable; +import org.jetbrains.annotations.Nullable; import cuchaz.enigma.utils.validation.Message.Type; diff --git a/enigma/src/test/java/cuchaz/enigma/TokenChecker.java b/enigma/src/test/java/cuchaz/enigma/TokenChecker.java index 5f510a42..3a4c24ac 100644 --- a/enigma/src/test/java/cuchaz/enigma/TokenChecker.java +++ b/enigma/src/test/java/cuchaz/enigma/TokenChecker.java @@ -13,11 +13,10 @@ package cuchaz.enigma; import java.io.IOException; import java.nio.file.Path; +import java.util.ArrayList; import java.util.Collection; import java.util.List; -import com.google.common.collect.Lists; - import cuchaz.enigma.analysis.EntryReference; import cuchaz.enigma.classprovider.CachingClassProvider; import cuchaz.enigma.classprovider.JarClassProvider; @@ -63,7 +62,7 @@ public class TokenChecker { SourceIndex index = source.index(); // get the token values - List values = Lists.newArrayList(); + List values = new ArrayList<>(); for (Token token : index.getReferenceTokens((EntryReference, Entry>) reference)) { values.add(string.substring(token.start, token.end)); diff --git a/enigma/src/test/java/cuchaz/enigma/translation/mapping/serde/recaf/TestRecaf.java b/enigma/src/test/java/cuchaz/enigma/translation/mapping/serde/recaf/TestRecaf.java index bd1ec20a..5f3e47c0 100644 --- a/enigma/src/test/java/cuchaz/enigma/translation/mapping/serde/recaf/TestRecaf.java +++ b/enigma/src/test/java/cuchaz/enigma/translation/mapping/serde/recaf/TestRecaf.java @@ -10,7 +10,6 @@ import java.nio.file.Path; import java.util.HashSet; import java.util.Set; -import com.google.common.collect.Sets; import com.google.common.jimfs.Jimfs; import org.junit.Test; @@ -24,7 +23,7 @@ public class TestRecaf { Set contents; try (InputStream in = getClass().getResourceAsStream("/recaf.mappings")) { - contents = Sets.newHashSet(new String(in.readAllBytes(), StandardCharsets.UTF_8).split("\\R")); + contents = Set.of(new String(in.readAllBytes(), StandardCharsets.UTF_8).split("\\R")); } try (FileSystem fs = Jimfs.newFileSystem()) { -- cgit v1.2.3