From f5e99d5cb1ef3530facc7e81874936b94f2ab64e Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 28 May 2020 14:42:01 -0400 Subject: [PATCH] plugin manager: chain child injectors for plugin dependencies Instead of combining the modules of the plugin and all of it dependencies, create a new child injector for the plugin from a child injector comprised of the parent module(s) --- .../client/plugins/PluginManager.java | 34 ++++++++++++++----- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/PluginManager.java b/runelite-client/src/main/java/net/runelite/client/plugins/PluginManager.java index 5dd3c6b231..8b31d4a201 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/PluginManager.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/PluginManager.java @@ -478,21 +478,39 @@ public class PluginManager try { - Module pluginModule = (Binder binder) -> + Injector parent = RuneLite.getInjector(); + + if (deps.size() > 1) { - binder.bind(clazz).toInstance(plugin); - binder.install(plugin); + List modules = new ArrayList<>(deps.size()); for (Plugin p : deps) { - Module p2 = (Binder binder2) -> + // Create a module for each dependency + Module module = (Binder binder) -> { - binder2.bind((Class) p.getClass()).toInstance(p); - binder2.install(p); + binder.bind((Class) p.getClass()).toInstance(p); + binder.install(p); }; - binder.install(p2); + modules.add(module); } + + // Create a parent injector containing all of the dependencies + parent = parent.createChildInjector(modules); + } + else if (!deps.isEmpty()) + { + // With only one dependency we can simply use its injector + parent = deps.get(0).injector; + } + + // Create injector for the module + Module pluginModule = (Binder binder) -> + { + // Since the plugin itself is a module, it won't bind itself, so we'll bind it here + binder.bind(clazz).toInstance(plugin); + binder.install(plugin); }; - Injector pluginInjector = RuneLite.getInjector().createChildInjector(pluginModule); + Injector pluginInjector = parent.createChildInjector(pluginModule); pluginInjector.injectMembers(plugin); plugin.injector = pluginInjector; }