From ddb827e5b201296d176ee3b87c16605fb4a8eb6d Mon Sep 17 00:00:00 2001 From: chickeneer Date: Sat, 12 Apr 2025 10:09:44 -0500 Subject: [PATCH] Rework subclass unusable constructor logging #428 Users should only need to know information about unusable constructors if the subclass subcommand doesn't successfully register. Theory being that the constructor could exist for other purposes --- core/src/main/java/co/aikar/commands/BaseCommand.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/co/aikar/commands/BaseCommand.java b/core/src/main/java/co/aikar/commands/BaseCommand.java index 720097d8..33e6d185 100644 --- a/core/src/main/java/co/aikar/commands/BaseCommand.java +++ b/core/src/main/java/co/aikar/commands/BaseCommand.java @@ -283,14 +283,15 @@ public abstract class BaseCommand { try { BaseCommand subScope = null; Constructor[] declaredConstructors = clazz.getDeclaredConstructors(); + List unusableConstructorsInfo = new ArrayList<>(); for (Constructor declaredConstructor : declaredConstructors) { - declaredConstructor.setAccessible(true); Parameter[] parameters = declaredConstructor.getParameters(); if (parameters.length == 1 && parameters[0].getType().isAssignableFrom(this.getClass())) { subScope = (BaseCommand) declaredConstructor.newInstance(this); } else { - manager.log(LogLevel.INFO, "Found unusable constructor: " + declaredConstructor.getName() + "(" + Stream.of(parameters).map(p -> p.getType().getSimpleName() + " " + p.getName()).collect(Collectors.joining(", ")) + ")"); + // Unusable constructor information is only relevant if a valid subScope is not found + unusableConstructorsInfo.add("Found unusable constructor: " + declaredConstructor.getName() + "(" + Stream.of(parameters).map(p -> p.getType().getSimpleName() + " " + p.getName()).collect(Collectors.joining(", ")) + ")"); } } if (subScope != null) { @@ -301,6 +302,9 @@ public abstract class BaseCommand { this.registeredCommands.putAll(subScope.registeredCommands); } else { this.manager.log(LogLevel.ERROR, "Could not find a subcommand ctor for " + clazz.getName()); + for (String constructorInfo : unusableConstructorsInfo) { + this.manager.log(LogLevel.INFO, constructorInfo); + } } } catch (InstantiationException | IllegalAccessException | InvocationTargetException e) { this.manager.log(LogLevel.ERROR, "Error registering subclass", e);