Commit 089d8d450cff863e530fbeaf43fb8aeca1cf4238

Authored by Mumfrey
1 parent a2a91d21

Catch and report mixin registration errors as critical errors in the GUI

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&lt;File&gt;
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&lt;File&gt;
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&lt;L&gt; extends Loadable&lt;L&gt;, 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 }
... ...