package net.minecraft.commands; import com.mojang.brigadier.ParseResults; import com.mojang.brigadier.context.CommandContextBuilder; import com.mojang.brigadier.context.ParsedArgument; import com.mojang.brigadier.context.ParsedCommandNode; import com.mojang.brigadier.tree.ArgumentCommandNode; import java.util.Map; import org.jspecify.annotations.Nullable; public class ArgumentVisitor { public static void visitArguments(final ParseResults command, final ArgumentVisitor.Output output, final boolean rejectRootRedirects) { CommandContextBuilder rootContext = command.getContext(); CommandContextBuilder context = rootContext; visitNodeArguments(rootContext, output); CommandContextBuilder child; while ((child = context.getChild()) != null && (!rejectRootRedirects || child.getRootNode() != rootContext.getRootNode())) { visitNodeArguments(child, output); context = child; } } private static void visitNodeArguments(final CommandContextBuilder context, final ArgumentVisitor.Output output) { Map> values = context.getArguments(); for (ParsedCommandNode node : context.getNodes()) { if (node.getNode() instanceof ArgumentCommandNode argument) { ParsedArgument value = (ParsedArgument)values.get(argument.getName()); callVisitor(context, output, argument, value); } } } private static void callVisitor( final CommandContextBuilder context, final ArgumentVisitor.Output output, final ArgumentCommandNode argument, @Nullable final ParsedArgument value ) { output.accept(context, argument, (ParsedArgument)value); } @FunctionalInterface public interface Output { void accept(CommandContextBuilder context, ArgumentCommandNode argument, @Nullable final ParsedArgument value); } }