diff --git a/enigma/src/main/java/org/quiltmc/enigma/api/Enigma.java b/enigma/src/main/java/org/quiltmc/enigma/api/Enigma.java index 8f4abf36..60409bc5 100644 --- a/enigma/src/main/java/org/quiltmc/enigma/api/Enigma.java +++ b/enigma/src/main/java/org/quiltmc/enigma/api/Enigma.java @@ -20,7 +20,6 @@ import org.quiltmc.enigma.api.class_provider.ObfuscationFixClassProvider; import org.quiltmc.enigma.api.service.NameProposalService; import org.quiltmc.enigma.api.service.ReadWriteService; -import org.quiltmc.enigma.api.source.TokenType; import org.quiltmc.enigma.api.translation.mapping.EntryMapping; import org.quiltmc.enigma.api.translation.mapping.serde.FileType; import org.quiltmc.enigma.api.translation.mapping.tree.EntryTree; @@ -108,10 +107,7 @@ public EnigmaProject openJar(Path path, ClassProvider libraryClassProvider, Prog if (proposed != null) { for (var entry : proposed.entrySet()) { - if (!service.bypassValidation() && entry.getValue() != null && entry.getValue().tokenType() != TokenType.JAR_PROPOSED) { - throw new RuntimeException("Token type of mapping " + entry.getValue() + " for entry " + entry.getKey() + " was " + entry.getValue().tokenType() + ", but should be " + TokenType.JAR_PROPOSED + "!"); - } - + service.validateProposedMapping(entry.getKey(), entry.getValue()); proposedNames.insert(entry.getKey(), entry.getValue()); } } diff --git a/enigma/src/main/java/org/quiltmc/enigma/api/service/NameProposalService.java b/enigma/src/main/java/org/quiltmc/enigma/api/service/NameProposalService.java index 3190c7e0..0d396f7b 100644 --- a/enigma/src/main/java/org/quiltmc/enigma/api/service/NameProposalService.java +++ b/enigma/src/main/java/org/quiltmc/enigma/api/service/NameProposalService.java @@ -80,4 +80,16 @@ default EntryMapping createMapping(String name, TokenType tokenType) { return new EntryMapping(name, null, tokenType, this.getId()); } + /** + * Validates the provided mapping to ensure it is a valid proposal. + * Do not override this unless you know exactly what you're doing! + * + * @param entry the entry the mapping will be attached to + * @param mapping the mapping to be validated + */ + default void validateProposedMapping(@Nullable Entry entry, @Nullable EntryMapping mapping) { + if (!this.bypassValidation() && mapping != null && mapping.tokenType() != TokenType.JAR_PROPOSED) { + throw new RuntimeException("Token type of mapping " + mapping + " for entry " + entry + " (was " + mapping.tokenType() + ", but should be " + TokenType.JAR_PROPOSED + "!)"); + } + } } diff --git a/enigma/src/main/java/org/quiltmc/enigma/api/translation/mapping/EntryRemapper.java b/enigma/src/main/java/org/quiltmc/enigma/api/translation/mapping/EntryRemapper.java index 1df705b7..000966ce 100644 --- a/enigma/src/main/java/org/quiltmc/enigma/api/translation/mapping/EntryRemapper.java +++ b/enigma/src/main/java/org/quiltmc/enigma/api/translation/mapping/EntryRemapper.java @@ -149,6 +149,8 @@ public void insertDynamicallyProposedMappings(@Nullable Entry obfEntry, @Null // due to unchecked proposal, proposers are allowed to insert other token types // when deobfuscated, they must be put in the main tree proposedNames.forEach((entry, mapping) -> { + service.validateProposedMapping(entry, mapping); + if (mapping.tokenType() == TokenType.DEOBFUSCATED) { this.mappings.insert(entry, mapping); } else {