Skip to content

Commit 4a1a27c

Browse files
committed
graaaah
1 parent 6c3842f commit 4a1a27c

File tree

16 files changed

+139
-86
lines changed

16 files changed

+139
-86
lines changed

enigma/src/main/java/org/quiltmc/enigma/api/Enigma.java

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import org.quiltmc.enigma.api.analysis.index.jar.LibrariesJarIndex;
66
import org.quiltmc.enigma.api.analysis.index.jar.MainJarIndex;
77
import org.quiltmc.enigma.api.analysis.index.mapping.MappingsIndex;
8+
import org.quiltmc.enigma.api.class_provider.ProjectClassProvider;
89
import org.quiltmc.enigma.impl.analysis.ClassLoaderClassProvider;
910
import org.quiltmc.enigma.api.service.EnigmaService;
1011
import org.quiltmc.enigma.api.service.EnigmaServiceContext;
@@ -43,13 +44,11 @@
4344
import java.sql.DriverManager;
4445
import java.util.ArrayList;
4546
import java.util.Collections;
46-
import java.util.HashSet;
4747
import java.util.List;
4848
import java.util.Map;
4949
import java.util.Optional;
5050
import java.util.Properties;
5151
import java.util.ServiceLoader;
52-
import java.util.Set;
5352
import java.util.concurrent.atomic.AtomicReference;
5453

5554
public class Enigma {
@@ -85,14 +84,10 @@ public EnigmaProject openJar(Path path, ClassProvider libraryClassProvider, Prog
8584
ClassLoaderClassProvider jreProvider = new ClassLoaderClassProvider(DriverManager.class.getClassLoader());
8685
CombiningClassProvider librariesProvider = new CombiningClassProvider(jreProvider, libraryClassProvider);
8786
ClassProvider mainProjectProvider = new ObfuscationFixClassProvider(new CachingClassProvider(jarClassProvider), index);
88-
89-
Set<String> mainScope = new HashSet<>(mainProjectProvider.getClassNames());
90-
Set<String> librariesScope = new HashSet<>(librariesProvider.getClassNames());
87+
ProjectClassProvider projectClassProvider = new ProjectClassProvider(mainProjectProvider, librariesProvider);
9188

9289
// main index
93-
this.index(index, mainProjectProvider, mainScope, progress, false);
94-
// lib index
95-
this.index(libIndex, librariesProvider, librariesScope, progress, true);
90+
this.index(index, projectClassProvider, progress);
9691

9792
// name proposal
9893
var nameProposalServices = this.getNameProposalServices();
@@ -124,22 +119,19 @@ public EnigmaProject openJar(Path path, ClassProvider libraryClassProvider, Prog
124119
return new EnigmaProject(this, path, mainProjectProvider, index, libIndex, mappingsIndex, proposedNames, Utils.zipSha1(path));
125120
}
126121

127-
private void index(JarIndex index, ClassProvider classProvider, Set<String> scope, ProgressListener progress, boolean libraries) {
128-
String progressKey = libraries ? "libs" : "jar";
129-
index.indexJar(scope, classProvider, progress);
122+
private void index(JarIndex index, ProjectClassProvider classProvider, ProgressListener progress) {
123+
index.indexJar(classProvider, progress);
130124

131125
List<JarIndexerService> indexers = this.services.get(JarIndexerService.TYPE);
132-
progress.init(indexers.size(), I18n.translate("progress." + progressKey + ".custom_indexing"));
126+
progress.init(indexers.size(), I18n.translate("progress.jar.custom_indexing"));
133127

134128
int i = 1;
135129
for (var service : indexers) {
136-
if (!(libraries && !service.shouldIndexLibraries())) {
137-
progress.step(i++, I18n.translateFormatted("progress." + progressKey + ".custom_indexing.indexer", service.getId()));
138-
service.acceptJar(scope, classProvider, index);
139-
}
130+
progress.step(i++, I18n.translateFormatted("progress.jar.custom_indexing.indexer", service.getId()));
131+
service.acceptJar(classProvider, index);
140132
}
141133

142-
progress.step(i, I18n.translate("progress." + progressKey + ".custom_indexing.finished"));
134+
progress.step(i, I18n.translate("progress.jar.custom_indexing.finished"));
143135
}
144136

145137
public EnigmaProfile getProfile() {

enigma/src/main/java/org/quiltmc/enigma/api/analysis/index/jar/JarIndex.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,11 @@
22

33
import com.google.common.collect.ListMultimap;
44
import org.quiltmc.enigma.api.ProgressListener;
5-
import org.quiltmc.enigma.api.class_provider.ClassProvider;
5+
import org.quiltmc.enigma.api.class_provider.ProjectClassProvider;
66
import org.quiltmc.enigma.api.translation.mapping.EntryResolver;
77
import org.quiltmc.enigma.api.translation.representation.entry.ClassEntry;
88
import org.quiltmc.enigma.api.translation.representation.entry.ParentedEntry;
99

10-
import java.util.Set;
11-
1210
public interface JarIndex extends JarIndexer {
1311
/**
1412
* Gets the index associated with the provided class.
@@ -19,11 +17,10 @@ public interface JarIndex extends JarIndexer {
1917

2018
/**
2119
* Runs every configured indexer over the provided jar.
22-
* @param classNames the obfuscated names of each class in the jar
23-
* @param classProvider a class provider containing all classes in the jar
20+
* @param classProvider a class provider containing all classes in the jar and libraries
2421
* @param progress a progress listener to track index completion
2522
*/
26-
void indexJar(Set<String> classNames, ClassProvider classProvider, ProgressListener progress);
23+
void indexJar(ProjectClassProvider classProvider, ProgressListener progress);
2724

2825
/**
2926
* {@return an entry resolver with this index's contents as context}

enigma/src/main/java/org/quiltmc/enigma/api/analysis/index/jar/LibrariesJarIndex.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package org.quiltmc.enigma.api.analysis.index.jar;
22

3+
import org.quiltmc.enigma.api.ProgressListener;
4+
import org.quiltmc.enigma.api.class_provider.ProjectClassProvider;
35
import org.quiltmc.enigma.impl.analysis.index.AbstractJarIndex;
46

57
public class LibrariesJarIndex extends AbstractJarIndex {
@@ -22,4 +24,9 @@ public static JarIndex empty() {
2224
public String getTranslationKey() {
2325
return "progress.jar.indexing.libraries";
2426
}
27+
28+
@Override
29+
public void indexJar(ProjectClassProvider classProvider, ProgressListener progress) {
30+
this.indexJar(classProvider.getLibraryClassNames(), classProvider, progress);
31+
}
2532
}

enigma/src/main/java/org/quiltmc/enigma/api/analysis/index/jar/MainJarIndex.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package org.quiltmc.enigma.api.analysis.index.jar;
22

3+
import org.quiltmc.enigma.api.ProgressListener;
4+
import org.quiltmc.enigma.api.class_provider.ProjectClassProvider;
35
import org.quiltmc.enigma.impl.analysis.index.AbstractJarIndex;
46

57
public class MainJarIndex extends AbstractJarIndex {
@@ -26,4 +28,9 @@ public static JarIndex empty() {
2628
public String getTranslationKey() {
2729
return "progress.jar.indexing.jar";
2830
}
31+
32+
@Override
33+
public void indexJar(ProjectClassProvider classProvider, ProgressListener progress) {
34+
this.indexJar(classProvider.getMainClassNames(), classProvider, progress);
35+
}
2936
}

enigma/src/main/java/org/quiltmc/enigma/api/class_provider/ObfuscationFixClassProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public ObfuscationFixClassProvider(ClassProvider classProvider, JarIndex jarInde
4545
public ClassNode get(String name) {
4646
ClassNode node = this.classProvider.get(name);
4747

48-
if (!this.jarIndex.isIndexed(name)) {
48+
if (!this.jarIndex.isIndexed(name) || node == null) {
4949
return node;
5050
}
5151

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package org.quiltmc.enigma.api.class_provider;
2+
3+
import org.objectweb.asm.tree.ClassNode;
4+
5+
import javax.annotation.Nullable;
6+
import java.security.InvalidParameterException;
7+
import java.util.ArrayList;
8+
import java.util.Collection;
9+
import java.util.HashSet;
10+
11+
public class ProjectClassProvider implements ClassProvider {
12+
@Nullable
13+
private final ClassProvider main;
14+
@Nullable
15+
private final ClassProvider libraries;
16+
private final Collection<String> classNames;
17+
18+
public ProjectClassProvider(@Nullable ClassProvider main, @Nullable ClassProvider libraries) {
19+
if (main == null && libraries == null) {
20+
throw new InvalidParameterException("cannot create a project class provider with both main and library providers as null!");
21+
}
22+
23+
this.main = main;
24+
this.libraries = libraries;
25+
this.classNames = new ArrayList<>();
26+
if (main != null) {
27+
this.classNames.addAll(main.getClassNames());
28+
}
29+
30+
if (libraries != null) {
31+
this.classNames.addAll(libraries.getClassNames());
32+
}
33+
}
34+
35+
@Nullable
36+
@Override
37+
public ClassNode get(String name) {
38+
// i hate working with nullability and am a bad programmer. btw
39+
ClassNode mainNode;
40+
if (this.main != null) {
41+
mainNode = this.main.get(name);
42+
if (mainNode != null) {
43+
return mainNode;
44+
}
45+
}
46+
47+
if (this.libraries != null) {
48+
return this.libraries.get(name);
49+
}
50+
51+
return null;
52+
}
53+
54+
/**
55+
* Gets the {@linkplain ClassNode} for a class in the main JAR file. The class provider may return a cached result,
56+
* so it's important to not mutate it.
57+
*
58+
* @param name the internal name of the class
59+
* @return the {@linkplain ClassNode} for that class, or {@code null} if it was not found
60+
*/
61+
public ClassNode getMainClass(String name) {
62+
return this.main != null ? this.main.get(name) : null;
63+
}
64+
65+
/**
66+
* Gets the {@linkplain ClassNode} for a class in the provided libraries. The class provider may return a cached result,
67+
* so it's important to not mutate it.
68+
*
69+
* @param name the internal name of the class
70+
* @return the {@linkplain ClassNode} for that class, or {@code null} if it was not found
71+
*/
72+
public ClassNode getLibraryClass(String name) {
73+
return this.libraries != null ? this.libraries.get(name) : null;
74+
}
75+
76+
@Override
77+
public Collection<String> getClassNames() {
78+
return this.classNames;
79+
}
80+
81+
public Collection<String> getMainClassNames() {
82+
return this.main != null ? this.main.getClassNames() : new HashSet<>();
83+
}
84+
85+
public Collection<String> getLibraryClassNames() {
86+
return this.libraries != null ? this.libraries.getClassNames() : new HashSet<>();
87+
}
88+
}

enigma/src/main/java/org/quiltmc/enigma/api/service/JarIndexerService.java

Lines changed: 5 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,8 @@
22

33
import org.objectweb.asm.tree.ClassNode;
44
import org.quiltmc.enigma.api.analysis.index.jar.JarIndex;
5-
import org.quiltmc.enigma.api.class_provider.ClassProvider;
65
import org.objectweb.asm.ClassVisitor;
7-
8-
import javax.annotation.Nullable;
9-
import java.util.Set;
6+
import org.quiltmc.enigma.api.class_provider.ProjectClassProvider;
107

118
/**
129
* Jar indexer services analyse jar files as they're opened to collect information about their contents.
@@ -16,35 +13,12 @@
1613
public interface JarIndexerService extends EnigmaService {
1714
EnigmaServiceType<JarIndexerService> TYPE = EnigmaServiceType.create("jar_indexer");
1815

19-
/**
20-
* Checks the {@code index_libraries} argument in the context to determine if libraries should be indexed.
21-
* @param context the context for this service
22-
* @return whether libraries should be indexed
23-
*/
24-
static boolean shouldIndexLibraries(@Nullable EnigmaServiceContext<JarIndexerService> context) {
25-
if (context == null) {
26-
return false;
27-
}
28-
29-
return context.getSingleArgument("index_libraries").map(Boolean::parseBoolean).orElse(false);
30-
}
31-
3216
/**
3317
* Indexes a collection of classes.
34-
* @param scope a list of class names to be indexed
35-
* @param classProvider a provider to translate class names into {@link ClassNode class nodes}
18+
* @param classProvider a provider to translate class names into {@link ClassNode class nodes}.
3619
* @param jarIndex the current jar index
3720
*/
38-
void acceptJar(Set<String> scope, ClassProvider classProvider, JarIndex jarIndex);
39-
40-
/**
41-
* Whether this indexer should be run on libraries in addition to the main project being indexed.
42-
* @implNote implementations should use {@link #shouldIndexLibraries(EnigmaServiceContext)} to allow changing this setting via the {@link org.quiltmc.enigma.api.EnigmaProfile profile}
43-
* @return whether this indexer should target libraries
44-
*/
45-
default boolean shouldIndexLibraries() {
46-
return false;
47-
}
21+
void acceptJar(ProjectClassProvider classProvider, JarIndex jarIndex);
4822

4923
/**
5024
* Creates an indexer service that runs all {@link ClassNode class nodes} through the provided {@link ClassVisitor visitor}.
@@ -53,24 +27,10 @@ default boolean shouldIndexLibraries() {
5327
* @return the indexer service
5428
*/
5529
static JarIndexerService fromVisitor(ClassVisitor visitor, String id) {
56-
return fromVisitor(null, visitor, id);
57-
}
58-
59-
/**
60-
* Creates an indexer service that runs all {@link ClassNode class nodes} through the provided {@link ClassVisitor visitor}.
61-
* Overrides {@link #shouldIndexLibraries()} according to the profile argument described in {@link #shouldIndexLibraries(EnigmaServiceContext)}.
62-
* @param context the profile context for the service
63-
* @param visitor the visitor to pass classes through
64-
* @param id the service's ID
65-
* @return the indexer service
66-
*/
67-
static JarIndexerService fromVisitor(@Nullable EnigmaServiceContext<JarIndexerService> context, ClassVisitor visitor, String id) {
68-
boolean indexLibs = shouldIndexLibraries(context);
69-
7030
return new JarIndexerService() {
7131
@Override
72-
public void acceptJar(Set<String> scope, ClassProvider classProvider, JarIndex jarIndex) {
73-
for (String className : scope) {
32+
public void acceptJar(ProjectClassProvider classProvider, JarIndex jarIndex) {
33+
for (String className : classProvider.getClassNames()) {
7434
ClassNode node = classProvider.get(className);
7535
if (node != null) {
7636
node.accept(visitor);
@@ -82,11 +42,6 @@ public void acceptJar(Set<String> scope, ClassProvider classProvider, JarIndex j
8242
public String getId() {
8343
return id;
8444
}
85-
86-
@Override
87-
public boolean shouldIndexLibraries() {
88-
return indexLibs;
89-
}
9045
};
9146
}
9247
}

enigma/src/main/java/org/quiltmc/enigma/impl/analysis/index/AbstractJarIndex.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.quiltmc.enigma.api.translation.representation.entry.ParentedEntry;
2626
import org.quiltmc.enigma.util.I18n;
2727

28+
import java.util.Collection;
2829
import java.util.HashSet;
2930
import java.util.LinkedHashMap;
3031
import java.util.Map;
@@ -72,11 +73,10 @@ public <T extends JarIndexer> T getIndex(Class<T> clazz) {
7273

7374
/**
7475
* Runs every configured indexer over the provided jar.
75-
* @param classNames the obfuscated names of each class in the jar
7676
* @param classProvider a class provider containing all classes in the jar
7777
* @param progress a progress listener to track index completion
7878
*/
79-
public void indexJar(Set<String> classNames, ClassProvider classProvider, ProgressListener progress) {
79+
public void indexJar(Collection<String> classNames, ClassProvider classProvider, ProgressListener progress) {
8080
// for use in processIndex
8181
this.progress = progress;
8282

enigma/src/main/java/org/quiltmc/enigma/impl/plugin/BuiltinPlugin.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ private static void registerEnumNamingService(EnigmaPluginContext ctx) {
3434
final Map<Entry<?>, String> names = new HashMap<>();
3535
final EnumFieldNameFindingVisitor visitor = new EnumFieldNameFindingVisitor(names);
3636

37-
ctx.registerService(JarIndexerService.TYPE, ctx1 -> JarIndexerService.fromVisitor(ctx1, visitor, "enigma:enum_initializer_indexer"));
37+
ctx.registerService(JarIndexerService.TYPE, ctx1 -> JarIndexerService.fromVisitor(visitor, "enigma:enum_initializer_indexer"));
3838

3939
ctx.registerService(NameProposalService.TYPE, ctx1 -> new NameProposalService() {
4040
@Override
@@ -66,7 +66,7 @@ private static void registerRecordNamingService(EnigmaPluginContext ctx) {
6666
final Map<FieldEntry, MethodEntry> fieldToGetter = new HashMap<>();
6767
final RecordGetterFindingVisitor visitor = new RecordGetterFindingVisitor(fieldToGetter);
6868

69-
ctx.registerService(JarIndexerService.TYPE, ctx1 -> JarIndexerService.fromVisitor(ctx1, visitor, "enigma:record_component_indexer"));
69+
ctx.registerService(JarIndexerService.TYPE, ctx1 -> JarIndexerService.fromVisitor(visitor, "enigma:record_component_indexer"));
7070
ctx.registerService(NameProposalService.TYPE, ctx1 -> new RecordComponentProposalService(fieldToGetter));
7171
}
7272

enigma/src/test/java/org/quiltmc/enigma/PackageVisibilityIndexTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
import org.quiltmc.enigma.api.analysis.index.jar.MainJarIndex;
55
import org.quiltmc.enigma.api.analysis.index.jar.PackageVisibilityIndex;
66
import org.quiltmc.enigma.api.ProgressListener;
7+
import org.quiltmc.enigma.api.class_provider.CachingClassProvider;
78
import org.quiltmc.enigma.api.class_provider.JarClassProvider;
9+
import org.quiltmc.enigma.api.class_provider.ProjectClassProvider;
810
import org.quiltmc.enigma.api.translation.representation.entry.ClassEntry;
911
import org.junit.jupiter.api.Test;
1012

@@ -27,7 +29,7 @@ public class PackageVisibilityIndexTest {
2729
public PackageVisibilityIndexTest() throws Exception {
2830
JarClassProvider jcp = new JarClassProvider(JAR);
2931
this.jarIndex = MainJarIndex.empty();
30-
this.jarIndex.indexJar(jcp.getClassNames(), jcp, ProgressListener.createEmpty());
32+
this.jarIndex.indexJar(new ProjectClassProvider(new CachingClassProvider(jcp), null), ProgressListener.createEmpty());
3133
}
3234

3335
@Test

0 commit comments

Comments
 (0)