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--- 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 +- 80 files changed, 347 insertions(+), 311 deletions(-) (limited to 'enigma') diff --git a/enigma/build.gradle b/enigma/build.gradle index 17ea805..6bbb200 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 01967bb..b98d71f 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 1bcbaa9..f0a8ab0 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 1051f45..79df2fb 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 bbdc684..3681209 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 306451a..d0d8644 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 dfb2af8..bbad239 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 c76dca7..f312efb 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 3043577..e9dcc66 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 d5a34cd..57767af 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 fc58c6d..6e2b90c 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 4a98c56..adb48ba 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 9e65fc3..f12bfb8 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 9841aa6..2b29edc 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 a2ba029..b2d6b73 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 dc399e5..d31addd 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 2a1643e..f2c77a8 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 ce6b23f..6ec7c91 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 f18be67..f4bbb1d 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 28a9392..9318813 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 069e0a8..a299c1d 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 b035cee..19a7d65 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 1b20b8f..7270817 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 5dec5be..391d43a 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 543ce48..b68eaf1 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 9475d74..4f78e9c 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 b31dcc4..9b3fa30 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 e9d928e..a38c6f5 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 6461d20..e970d3a 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 2d9784b..5cd1104 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 950f518..d90d7bd 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 cf6c52f..e5db78a 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 3ba112f..76b6b48 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 12dca73..493499f 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 c48aba5..4155da3 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 56fd0b9..485fc3f 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 833ea29..4cf161c 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 33a38fe..301cc80 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 9966014..d6c6142 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 ed58197..5688990 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 4cd79b9..ad7c33a 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 b398d41..fa5e1d8 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 72a8fd4..5a1b806 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 ed5dba5..12ed7b1 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 39e6825..2274c6e 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 f9a1060..fb8ab63 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 8dc5659..dde634c 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 21c78cf..325af95 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 c193828..dbde4b3 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 197abce..ec36d47 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 d4e79e1..766202a 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 d5570e9..08d0e57 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 24867b6..266668d 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 df65b3c..26a29bf 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 5addcad..4237237 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 1575f46..ae00300 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 972d180..67582be 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 959d2d8..d85ed6e 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 b943cc8..ef746c4 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 e1c8e8d..3fe535f 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 254b331..ab249df 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 2902373..a026eb6 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 3ddaf81..c65bd40 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 571488c..bfd77d0 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 fd53522..c714fd5 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 eb3ea42..3cbd0c9 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 0e179d7..23c4f4f 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 71425e0..568d01c 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 492d72e..45ef31c 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 aaa0798..745485f 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 ac36a48..9eda3a9 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 9d0bbed..b188fb5 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 c6a4ab7..4392953 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 5ccb908..3390bc5 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 ff5ffa3..e8e6f30 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 9551202..fff7352 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 a1926a8..8b692b5 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 416e8a0..0cb9b81 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 5f510a4..3a4c24a 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 bd1ec20..5f3e47c 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