From cf45c6b6014f32e553e04443686dcb44bbe4cd8c Mon Sep 17 00:00:00 2001 From: Joe Date: Fri, 12 Sep 2025 18:45:33 +0100 Subject: Provide access to the jar index in the API --- .../src/main/java/cuchaz/enigma/EnigmaProject.java | 1 + .../cuchaz/enigma/analysis/index/EntryIndex.java | 42 +++++++++++++++++++++- .../enigma/analysis/index/InheritanceIndex.java | 14 +++++++- .../cuchaz/enigma/analysis/index/JarIndex.java | 6 +++- .../enigma/analysis/index/ReferenceIndex.java | 37 ++++++++++++++++++- .../enigma/api/service/JarIndexerService.java | 4 +-- .../java/cuchaz/enigma/api/view/ProjectView.java | 3 ++ .../enigma/api/view/index/EntryIndexView.java | 14 ++++++++ .../api/view/index/InheritanceIndexView.java | 10 ++++++ .../cuchaz/enigma/api/view/index/JarIndexView.java | 7 ++++ .../enigma/api/view/index/ReferenceIndexView.java | 17 +++++++++ 11 files changed, 149 insertions(+), 6 deletions(-) create mode 100644 enigma/src/main/java/cuchaz/enigma/api/view/index/EntryIndexView.java create mode 100644 enigma/src/main/java/cuchaz/enigma/api/view/index/InheritanceIndexView.java create mode 100644 enigma/src/main/java/cuchaz/enigma/api/view/index/JarIndexView.java create mode 100644 enigma/src/main/java/cuchaz/enigma/api/view/index/ReferenceIndexView.java (limited to 'enigma/src') diff --git a/enigma/src/main/java/cuchaz/enigma/EnigmaProject.java b/enigma/src/main/java/cuchaz/enigma/EnigmaProject.java index ab0ce30..9495565 100644 --- a/enigma/src/main/java/cuchaz/enigma/EnigmaProject.java +++ b/enigma/src/main/java/cuchaz/enigma/EnigmaProject.java @@ -119,6 +119,7 @@ public class EnigmaProject implements ProjectView { return classProvider; } + @Override public JarIndex getJarIndex() { return jarIndex; } 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 f12bfb8..ba75b03 100644 --- a/enigma/src/main/java/cuchaz/enigma/analysis/index/EntryIndex.java +++ b/enigma/src/main/java/cuchaz/enigma/analysis/index/EntryIndex.java @@ -6,6 +6,10 @@ import java.util.concurrent.ConcurrentMap; import org.jetbrains.annotations.Nullable; +import cuchaz.enigma.api.view.entry.ClassDefEntryView; +import cuchaz.enigma.api.view.entry.ClassEntryView; +import cuchaz.enigma.api.view.entry.EntryView; +import cuchaz.enigma.api.view.index.EntryIndexView; import cuchaz.enigma.translation.representation.AccessFlags; import cuchaz.enigma.translation.representation.entry.ClassDefEntry; import cuchaz.enigma.translation.representation.entry.ClassEntry; @@ -16,7 +20,7 @@ import cuchaz.enigma.translation.representation.entry.LocalVariableEntry; import cuchaz.enigma.translation.representation.entry.MethodDefEntry; import cuchaz.enigma.translation.representation.entry.MethodEntry; -public class EntryIndex implements JarIndexer { +public class EntryIndex implements JarIndexer, EntryIndexView { private final ConcurrentMap classes = new ConcurrentHashMap<>(); private final ConcurrentMap fields = new ConcurrentHashMap<>(); private final ConcurrentMap methods = new ConcurrentHashMap<>(); @@ -96,6 +100,7 @@ public class EntryIndex implements JarIndexer { return definitions.get(entry); } + @Override public Collection getClasses() { return classes.keySet(); } @@ -107,4 +112,39 @@ public class EntryIndex implements JarIndexer { public Collection getFields() { return fields.keySet(); } + + @Override + public boolean hasEntry(EntryView entry) { + if (entry instanceof ClassEntry) { + return classes.containsKey(entry); + } else if (entry instanceof FieldEntry) { + return fields.containsKey(entry); + } else if (entry instanceof MethodEntry) { + return methods.containsKey(entry); + } else { + return false; + } + } + + @Override + public int getAccess(EntryView entry) { + AccessFlags access; + + if (entry instanceof ClassEntry classEntry) { + access = getClassAccess(classEntry); + } else if (entry instanceof FieldEntry fieldEntry) { + access = getFieldAccess(fieldEntry); + } else if (entry instanceof MethodEntry methodEntry) { + access = getMethodAccess(methodEntry); + } else { + return 0; + } + + return access == null ? 0 : access.getFlags(); + } + + @Override + public ClassDefEntryView getDefinition(ClassEntryView entry) { + return getDefinition((ClassEntry) entry); + } } 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 2b29edc..abf66e6 100644 --- a/enigma/src/main/java/cuchaz/enigma/analysis/index/InheritanceIndex.java +++ b/enigma/src/main/java/cuchaz/enigma/analysis/index/InheritanceIndex.java @@ -21,10 +21,12 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; +import cuchaz.enigma.api.view.entry.ClassEntryView; +import cuchaz.enigma.api.view.index.InheritanceIndexView; import cuchaz.enigma.translation.representation.entry.ClassDefEntry; import cuchaz.enigma.translation.representation.entry.ClassEntry; -public class InheritanceIndex implements JarIndexer { +public class InheritanceIndex implements JarIndexer, InheritanceIndexView { private final EntryIndex entryIndex; private final ConcurrentMap> classParents = new ConcurrentHashMap<>(); @@ -62,10 +64,20 @@ public class InheritanceIndex implements JarIndexer { return classParents.getOrDefault(classEntry, Collections.emptyList()); } + @Override + public Collection getParents(ClassEntryView entry) { + return getParents((ClassEntry) entry); + } + public Collection getChildren(ClassEntry classEntry) { return classChildren.getOrDefault(classEntry, Collections.emptyList()); } + @Override + public Collection getChildren(ClassEntryView entry) { + return getChildren((ClassEntry) entry); + } + public Collection getDescendants(ClassEntry classEntry) { Collection descendants = new HashSet<>(); diff --git a/enigma/src/main/java/cuchaz/enigma/analysis/index/JarIndex.java b/enigma/src/main/java/cuchaz/enigma/analysis/index/JarIndex.java index cfa177e..5c5e2c3 100644 --- a/enigma/src/main/java/cuchaz/enigma/analysis/index/JarIndex.java +++ b/enigma/src/main/java/cuchaz/enigma/analysis/index/JarIndex.java @@ -23,6 +23,7 @@ import java.util.concurrent.ConcurrentMap; import cuchaz.enigma.Enigma; import cuchaz.enigma.ProgressListener; import cuchaz.enigma.analysis.ReferenceTargetType; +import cuchaz.enigma.api.view.index.JarIndexView; import cuchaz.enigma.classprovider.AddFramesIfNecessaryClassProvider; import cuchaz.enigma.classprovider.CachingClassProvider; import cuchaz.enigma.classprovider.ClassProvider; @@ -38,7 +39,7 @@ import cuchaz.enigma.translation.representation.entry.MethodEntry; import cuchaz.enigma.translation.representation.entry.ParentedEntry; import cuchaz.enigma.utils.I18n; -public class JarIndex implements JarIndexer { +public class JarIndex implements JarIndexer, JarIndexView { private final Set indexedClasses = new HashSet<>(); private final EntryIndex entryIndex; private final InheritanceIndex inheritanceIndex; @@ -188,14 +189,17 @@ public class JarIndex implements JarIndexer { indexers.forEach(indexer -> indexer.indexLambda(callerEntry, lambda, targetType)); } + @Override public EntryIndex getEntryIndex() { return entryIndex; } + @Override public InheritanceIndex getInheritanceIndex() { return this.inheritanceIndex; } + @Override public ReferenceIndex getReferenceIndex() { return referenceIndex; } diff --git a/enigma/src/main/java/cuchaz/enigma/analysis/index/ReferenceIndex.java b/enigma/src/main/java/cuchaz/enigma/analysis/index/ReferenceIndex.java index 1a406cb..f88b8e3 100644 --- a/enigma/src/main/java/cuchaz/enigma/analysis/index/ReferenceIndex.java +++ b/enigma/src/main/java/cuchaz/enigma/analysis/index/ReferenceIndex.java @@ -8,6 +8,11 @@ import java.util.concurrent.ConcurrentMap; import cuchaz.enigma.analysis.EntryReference; import cuchaz.enigma.analysis.ReferenceTargetType; +import cuchaz.enigma.api.view.entry.ClassEntryView; +import cuchaz.enigma.api.view.entry.EntryReferenceView; +import cuchaz.enigma.api.view.entry.FieldEntryView; +import cuchaz.enigma.api.view.entry.MethodEntryView; +import cuchaz.enigma.api.view.index.ReferenceIndexView; import cuchaz.enigma.translation.mapping.ResolutionStrategy; import cuchaz.enigma.translation.representation.Lambda; import cuchaz.enigma.translation.representation.MethodDescriptor; @@ -19,7 +24,7 @@ import cuchaz.enigma.translation.representation.entry.FieldEntry; import cuchaz.enigma.translation.representation.entry.MethodDefEntry; import cuchaz.enigma.translation.representation.entry.MethodEntry; -public class ReferenceIndex implements JarIndexer { +public class ReferenceIndex implements JarIndexer, ReferenceIndexView { private ConcurrentMap> methodReferences = new ConcurrentHashMap<>(); private ConcurrentMap>> referencesToMethods = new ConcurrentHashMap<>(); @@ -144,23 +149,53 @@ public class ReferenceIndex implements JarIndexer { return methodReferences.getOrDefault(entry, Collections.emptyList()); } + @Override + public Collection getMethodsReferencedBy(MethodEntryView entry) { + return getMethodsReferencedBy((MethodEntry) entry); + } + public Collection> getReferencesToField(FieldEntry entry) { return referencesToFields.getOrDefault(entry, Collections.emptyList()); } + @Override + public Collection getReferencesToField(FieldEntryView entry) { + return getReferencesToField((FieldEntry) entry); + } + public Collection> getReferencesToClass(ClassEntry entry) { return referencesToClasses.getOrDefault(entry, Collections.emptyList()); } + @Override + public Collection getReferencesToClass(ClassEntryView entry) { + return getReferencesToClass((ClassEntry) entry); + } + public Collection> getReferencesToMethod(MethodEntry entry) { return referencesToMethods.getOrDefault(entry, Collections.emptyList()); } + @Override + public Collection getReferencesToMethod(MethodEntryView entry) { + return getReferencesToMethod((MethodEntry) entry); + } + public Collection> getFieldTypeReferencesToClass(ClassEntry entry) { return fieldTypeReferences.getOrDefault(entry, Collections.emptyList()); } + @Override + public Collection getFieldTypeReferencesToClass(ClassEntryView entry) { + return getFieldTypeReferencesToClass((ClassEntry) entry); + } + public Collection> getMethodTypeReferencesToClass(ClassEntry entry) { return methodTypeReferences.getOrDefault(entry, Collections.emptyList()); } + + @Override + public Collection getMethodTypeReferencesToClass(ClassEntryView entry) { + return getMethodTypeReferencesToClass((ClassEntry) entry); + } } diff --git a/enigma/src/main/java/cuchaz/enigma/api/service/JarIndexerService.java b/enigma/src/main/java/cuchaz/enigma/api/service/JarIndexerService.java index 91c79c6..81a7ebf 100644 --- a/enigma/src/main/java/cuchaz/enigma/api/service/JarIndexerService.java +++ b/enigma/src/main/java/cuchaz/enigma/api/service/JarIndexerService.java @@ -8,13 +8,13 @@ import java.util.function.Supplier; import org.objectweb.asm.ClassVisitor; -import cuchaz.enigma.analysis.index.JarIndex; +import cuchaz.enigma.api.view.index.JarIndexView; import cuchaz.enigma.classprovider.ClassProvider; public interface JarIndexerService extends EnigmaService { EnigmaServiceType TYPE = EnigmaServiceType.create("jar_indexer"); - void acceptJar(Set scope, ClassProvider classProvider, JarIndex jarIndex); + void acceptJar(Set scope, ClassProvider classProvider, JarIndexView jarIndex); static JarIndexerService fromVisitor(ClassVisitor visitor) { return (scope, classProvider, jarIndex) -> { diff --git a/enigma/src/main/java/cuchaz/enigma/api/view/ProjectView.java b/enigma/src/main/java/cuchaz/enigma/api/view/ProjectView.java index 8f53d11..b72e1c3 100644 --- a/enigma/src/main/java/cuchaz/enigma/api/view/ProjectView.java +++ b/enigma/src/main/java/cuchaz/enigma/api/view/ProjectView.java @@ -9,6 +9,7 @@ import org.objectweb.asm.tree.ClassNode; import cuchaz.enigma.api.DataInvalidationEvent; import cuchaz.enigma.api.DataInvalidationListener; import cuchaz.enigma.api.view.entry.EntryView; +import cuchaz.enigma.api.view.index.JarIndexView; public interface ProjectView { T deobfuscate(T entry); @@ -20,6 +21,8 @@ public interface ProjectView { void registerForInverseMappings(); + JarIndexView getJarIndex(); + Collection getProjectClasses(); @Nullable diff --git a/enigma/src/main/java/cuchaz/enigma/api/view/index/EntryIndexView.java b/enigma/src/main/java/cuchaz/enigma/api/view/index/EntryIndexView.java new file mode 100644 index 0000000..56bf70e --- /dev/null +++ b/enigma/src/main/java/cuchaz/enigma/api/view/index/EntryIndexView.java @@ -0,0 +1,14 @@ +package cuchaz.enigma.api.view.index; + +import java.util.Collection; + +import cuchaz.enigma.api.view.entry.ClassDefEntryView; +import cuchaz.enigma.api.view.entry.ClassEntryView; +import cuchaz.enigma.api.view.entry.EntryView; + +public interface EntryIndexView { + boolean hasEntry(EntryView entry); + int getAccess(EntryView entry); + ClassDefEntryView getDefinition(ClassEntryView entry); + Collection getClasses(); +} diff --git a/enigma/src/main/java/cuchaz/enigma/api/view/index/InheritanceIndexView.java b/enigma/src/main/java/cuchaz/enigma/api/view/index/InheritanceIndexView.java new file mode 100644 index 0000000..a016d11 --- /dev/null +++ b/enigma/src/main/java/cuchaz/enigma/api/view/index/InheritanceIndexView.java @@ -0,0 +1,10 @@ +package cuchaz.enigma.api.view.index; + +import java.util.Collection; + +import cuchaz.enigma.api.view.entry.ClassEntryView; + +public interface InheritanceIndexView { + Collection getParents(ClassEntryView entry); + Collection getChildren(ClassEntryView entry); +} diff --git a/enigma/src/main/java/cuchaz/enigma/api/view/index/JarIndexView.java b/enigma/src/main/java/cuchaz/enigma/api/view/index/JarIndexView.java new file mode 100644 index 0000000..069b115 --- /dev/null +++ b/enigma/src/main/java/cuchaz/enigma/api/view/index/JarIndexView.java @@ -0,0 +1,7 @@ +package cuchaz.enigma.api.view.index; + +public interface JarIndexView { + EntryIndexView getEntryIndex(); + InheritanceIndexView getInheritanceIndex(); + ReferenceIndexView getReferenceIndex(); +} diff --git a/enigma/src/main/java/cuchaz/enigma/api/view/index/ReferenceIndexView.java b/enigma/src/main/java/cuchaz/enigma/api/view/index/ReferenceIndexView.java new file mode 100644 index 0000000..00ab84e --- /dev/null +++ b/enigma/src/main/java/cuchaz/enigma/api/view/index/ReferenceIndexView.java @@ -0,0 +1,17 @@ +package cuchaz.enigma.api.view.index; + +import java.util.Collection; + +import cuchaz.enigma.api.view.entry.ClassEntryView; +import cuchaz.enigma.api.view.entry.EntryReferenceView; +import cuchaz.enigma.api.view.entry.FieldEntryView; +import cuchaz.enigma.api.view.entry.MethodEntryView; + +public interface ReferenceIndexView { + Collection getMethodsReferencedBy(MethodEntryView entry); + Collection getReferencesToClass(ClassEntryView entry); + Collection getReferencesToField(FieldEntryView entry); + Collection getReferencesToMethod(MethodEntryView entry); + Collection getFieldTypeReferencesToClass(ClassEntryView entry); + Collection getMethodTypeReferencesToClass(ClassEntryView entry); +} -- cgit v1.2.3