Commit 089d8d450cff863e530fbeaf43fb8aeca1cf4238
1 parent
a2a91d21
Catch and report mixin registration errors as critical errors in the GUI
Showing
5 changed files
with
91 additions
and
18 deletions
src/client/java/com/mumfrey/liteloader/client/gui/GuiPanelLiteLoaderLog.java
| ... | ... | @@ -290,6 +290,9 @@ class GuiPanelLiteLoaderLog extends GuiPanel implements ScrollPanelContent |
| 290 | 290 | if (logLine.startsWith("tweakClass '")) return 0x5555FF; |
| 291 | 291 | if (logLine.startsWith("baking listener list")) return 0x00AAAA; |
| 292 | 292 | if (logLine.startsWith("generating new event handler")) return 0xFFFF55; |
| 293 | + if (logLine.startsWith("resolving mods")) return 0xFFAA00; | |
| 294 | + if (logLine.startsWith("resolved artefact")) return 0x00AA00; | |
| 295 | + if (logLine.startsWith("evicting")) return 0xFFAA00; | |
| 293 | 296 | |
| 294 | 297 | return 0xCCCCCC; |
| 295 | 298 | } | ... | ... |
src/main/java/com/mumfrey/liteloader/core/LiteLoaderEnumerator.java
| ... | ... | @@ -121,7 +121,7 @@ public class LiteLoaderEnumerator implements LoaderEnumerator |
| 121 | 121 | private final FastIterableDeque<EnumerationObserver> observers = new HandlerList<EnumerationObserver>(EnumerationObserver.class); |
| 122 | 122 | |
| 123 | 123 | protected EnumeratorState state = EnumeratorState.INIT; |
| 124 | - | |
| 124 | + | |
| 125 | 125 | /** |
| 126 | 126 | * @param environment |
| 127 | 127 | * @param properties |
| ... | ... | @@ -143,7 +143,7 @@ public class LiteLoaderEnumerator implements LoaderEnumerator |
| 143 | 143 | // Initialise the shared mod list if we haven't already |
| 144 | 144 | this.getSharedModList(); |
| 145 | 145 | } |
| 146 | - | |
| 146 | + | |
| 147 | 147 | /** |
| 148 | 148 | * @param environment |
| 149 | 149 | */ |
| ... | ... | @@ -664,7 +664,15 @@ public class LiteLoaderEnumerator implements LoaderEnumerator |
| 664 | 664 | if (config.endsWith(".json")) |
| 665 | 665 | { |
| 666 | 666 | LiteLoaderLogger.info(Verbosity.REDUCED, "Registering mixin config %s for %s", config, container.getName()); |
| 667 | - Mixins.addConfiguration(config); | |
| 667 | + try | |
| 668 | + { | |
| 669 | + Mixins.addConfiguration(config); | |
| 670 | + } | |
| 671 | + catch (Throwable th) | |
| 672 | + { | |
| 673 | + LiteLoaderLogger.severe(th, "Error registering mixin config %s for %s", config, container); | |
| 674 | + container.registerMixinError(th); | |
| 675 | + } | |
| 668 | 676 | } |
| 669 | 677 | else if (config.contains(".json@")) |
| 670 | 678 | { | ... | ... |
src/main/java/com/mumfrey/liteloader/core/LiteLoaderMods.java
| ... | ... | @@ -24,6 +24,7 @@ import com.mumfrey.liteloader.interfaces.FastIterableDeque; |
| 24 | 24 | import com.mumfrey.liteloader.interfaces.Loadable; |
| 25 | 25 | import com.mumfrey.liteloader.interfaces.LoadableMod; |
| 26 | 26 | import com.mumfrey.liteloader.interfaces.LoaderEnumerator; |
| 27 | +import com.mumfrey.liteloader.interfaces.MixinContainer; | |
| 27 | 28 | import com.mumfrey.liteloader.interfaces.TweakContainer; |
| 28 | 29 | import com.mumfrey.liteloader.launch.ClassTransformerManager; |
| 29 | 30 | import com.mumfrey.liteloader.launch.LoaderEnvironment; |
| ... | ... | @@ -444,6 +445,12 @@ public class LiteLoaderMods |
| 444 | 445 | String identifier = mod.getIdentifier(); |
| 445 | 446 | if (identifier == null || this.environment.getEnabledModsList().isEnabled(this.environment.getProfile(), identifier)) |
| 446 | 447 | { |
| 448 | + if (!this.validateMixins(mod, container)) | |
| 449 | + { | |
| 450 | + this.onModLoadFailed(container, identifier, "mixins for the specified mod encountered a startup error", null); | |
| 451 | + continue; | |
| 452 | + } | |
| 453 | + | |
| 447 | 454 | if (!this.enumerator.checkDependencies(container)) |
| 448 | 455 | { |
| 449 | 456 | this.onModLoadFailed(container, identifier, "the mod was missing a required dependency", null); |
| ... | ... | @@ -474,6 +481,23 @@ public class LiteLoaderMods |
| 474 | 481 | this.observers.all().onPostModLoaded(mod); |
| 475 | 482 | } |
| 476 | 483 | } |
| 484 | + | |
| 485 | + private boolean validateMixins(ModInfo<?> mod, LoadableMod<?> container) | |
| 486 | + { | |
| 487 | + if (container instanceof MixinContainer) | |
| 488 | + { | |
| 489 | + @SuppressWarnings("unchecked") | |
| 490 | + Collection<Throwable> errors = ((MixinContainer<File>)container).getMixinErrors(); | |
| 491 | + for (Throwable error : errors) | |
| 492 | + { | |
| 493 | + this.registerModStartupError(mod, error, true); | |
| 494 | + } | |
| 495 | + | |
| 496 | + return errors.size() == 0; | |
| 497 | + } | |
| 498 | + | |
| 499 | + return true; | |
| 500 | + } | |
| 477 | 501 | |
| 478 | 502 | /** |
| 479 | 503 | * @param identifier |
| ... | ... | @@ -697,26 +721,28 @@ public class LiteLoaderMods |
| 697 | 721 | |
| 698 | 722 | for (Mod mod : this.loadedMods) |
| 699 | 723 | { |
| 700 | - if (mod.hasClassTransformers()) | |
| 724 | + if (!mod.hasClassTransformers()) | |
| 701 | 725 | { |
| 702 | - List<String> modTransformers = ((TweakContainer<?>)mod.getContainer()).getClassTransformerClassNames(); | |
| 703 | - for (String modTransformer : modTransformers) | |
| 726 | + continue; | |
| 727 | + } | |
| 728 | + | |
| 729 | + List<String> modTransformers = ((TweakContainer<?>)mod.getContainer()).getClassTransformerClassNames(); | |
| 730 | + for (String modTransformer : modTransformers) | |
| 731 | + { | |
| 732 | + if (!injectedTransformers.contains(modTransformer)) | |
| 704 | 733 | { |
| 705 | - if (!injectedTransformers.contains(modTransformer)) | |
| 734 | + List<Throwable> throwables = transformerManager.getTransformerStartupErrors(modTransformer); | |
| 735 | + if (throwables != null) | |
| 706 | 736 | { |
| 707 | - List<Throwable> throwables = transformerManager.getTransformerStartupErrors(modTransformer); | |
| 708 | - if (throwables != null) | |
| 737 | + for (Throwable th : throwables) | |
| 709 | 738 | { |
| 710 | - for (Throwable th : throwables) | |
| 711 | - { | |
| 712 | - this.registerModStartupError(mod, th, true); | |
| 713 | - } | |
| 714 | - } | |
| 715 | - else | |
| 716 | - { | |
| 717 | - this.registerModStartupError(mod, new RuntimeException("Missing class transformer " + modTransformer), true); | |
| 739 | + this.registerModStartupError(mod, th, true); | |
| 718 | 740 | } |
| 719 | 741 | } |
| 742 | + else | |
| 743 | + { | |
| 744 | + this.registerModStartupError(mod, new RuntimeException("Missing class transformer " + modTransformer), true); | |
| 745 | + } | |
| 720 | 746 | } |
| 721 | 747 | } |
| 722 | 748 | } |
| ... | ... | @@ -765,7 +791,11 @@ public class LiteLoaderMods |
| 765 | 791 | private void registerModStartupError(ModInfo<?> mod, Throwable th, boolean critical) |
| 766 | 792 | { |
| 767 | 793 | this.startupErrorCount++; |
| 768 | - if (critical) this.criticalErrorCount++; | |
| 794 | + if (critical) | |
| 795 | + { | |
| 796 | + this.criticalErrorCount++; | |
| 797 | + } | |
| 798 | + | |
| 769 | 799 | mod.registerStartupError(th); |
| 770 | 800 | |
| 771 | 801 | if (!this.loadedMods.contains(mod) && !this.disabledMods.contains(mod)) | ... | ... |
src/main/java/com/mumfrey/liteloader/interfaces/LoadableFile.java
| ... | ... | @@ -10,6 +10,8 @@ import java.io.IOException; |
| 10 | 10 | import java.net.MalformedURLException; |
| 11 | 11 | import java.net.URL; |
| 12 | 12 | import java.nio.charset.Charset; |
| 13 | +import java.util.ArrayList; | |
| 14 | +import java.util.Collection; | |
| 13 | 15 | import java.util.Collections; |
| 14 | 16 | import java.util.HashSet; |
| 15 | 17 | import java.util.List; |
| ... | ... | @@ -97,6 +99,11 @@ public class LoadableFile extends File implements TweakContainer<File> |
| 97 | 99 | * Mixin config resource names |
| 98 | 100 | */ |
| 99 | 101 | protected Set<String> mixinConfigs = new HashSet<String>(); |
| 102 | + | |
| 103 | + /** | |
| 104 | + * Mixin errors | |
| 105 | + */ | |
| 106 | + protected List<Throwable> mixinErrors = new ArrayList<Throwable>(); | |
| 100 | 107 | |
| 101 | 108 | /** |
| 102 | 109 | * Create a new tweak container wrapping the specified file |
| ... | ... | @@ -344,6 +351,18 @@ public class LoadableFile extends File implements TweakContainer<File> |
| 344 | 351 | { |
| 345 | 352 | return this.mixinConfigs; |
| 346 | 353 | } |
| 354 | + | |
| 355 | + @Override | |
| 356 | + public void registerMixinError(Throwable th) | |
| 357 | + { | |
| 358 | + this.mixinErrors.add(th); | |
| 359 | + } | |
| 360 | + | |
| 361 | + @Override | |
| 362 | + public Collection<Throwable> getMixinErrors() | |
| 363 | + { | |
| 364 | + return this.mixinErrors; | |
| 365 | + } | |
| 347 | 366 | |
| 348 | 367 | @Override |
| 349 | 368 | public boolean hasEventTransformers() | ... | ... |
src/main/java/com/mumfrey/liteloader/interfaces/MixinContainer.java
| ... | ... | @@ -5,6 +5,7 @@ |
| 5 | 5 | */ |
| 6 | 6 | package com.mumfrey.liteloader.interfaces; |
| 7 | 7 | |
| 8 | +import java.util.Collection; | |
| 8 | 9 | import java.util.Set; |
| 9 | 10 | |
| 10 | 11 | public interface MixinContainer<L> extends Loadable<L>, Injectable |
| ... | ... | @@ -19,5 +20,17 @@ public interface MixinContainer<L> extends Loadable<L>, Injectable |
| 19 | 20 | * Get this mod's list of mixin configs |
| 20 | 21 | */ |
| 21 | 22 | public abstract Set<String> getMixinConfigs(); |
| 23 | + | |
| 24 | + /** | |
| 25 | + * Register a mixin error with the container | |
| 26 | + * | |
| 27 | + * @param th caught throwable | |
| 28 | + */ | |
| 29 | + public abstract void registerMixinError(Throwable th); | |
| 30 | + | |
| 31 | + /** | |
| 32 | + * @return mixin errors | |
| 33 | + */ | |
| 34 | + public abstract Collection<Throwable> getMixinErrors(); | |
| 22 | 35 | |
| 23 | 36 | } | ... | ... |