23
23
import java .awt .Component ;
24
24
import java .io .File ;
25
25
import java .io .IOException ;
26
- import java .lang .invoke .MethodHandles ;
27
- import java .lang .invoke .VarHandle ;
28
26
import java .lang .reflect .Field ;
29
27
import java .util .ArrayList ;
30
28
import java .util .Arrays ;
@@ -102,11 +100,15 @@ public static <CommandSource> String getRawArgumentInput(CommandContext<CommandS
102
100
final ParsedArgument <?, ?> parsedArgument = commandContextArguments .get (cmdCtx ).get (key );
103
101
104
102
// TODO: Issue #310: Parsing this argument via /execute run <blah> doesn't have the value in
105
- // the arguments for this command context (most likely because it's a redirected command).
106
- // We need to figure out how to handle this case.
107
- if (parsedArgument != null ) {
103
+ // the arguments for this command context (most likely because it's a redirected command).
104
+ // We need to figure out how to handle this case.
105
+ if (parsedArgument != null ) {
106
+ // Sanity check: See https://github.com/JorelAli/CommandAPI/wiki/Implementation-details#chatcomponentargument-raw-arguments
108
107
StringRange range = parsedArgument .getRange ();
109
- return cmdCtx .getInput ().substring (range .getStart (), range .getEnd ());
108
+ if (range .getEnd () > cmdCtx .getInput ().length ()) {
109
+ range = StringRange .between (range .getStart (), cmdCtx .getInput ().length ());
110
+ }
111
+ return range .get (cmdCtx .getInput ());
110
112
} else {
111
113
return "" ;
112
114
}
@@ -223,7 +225,7 @@ public AbstractCommandSender<? extends CommandSender> senderWrapper() {
223
225
224
226
@ Override
225
227
public CommandArguments args () {
226
- return new CommandArguments (result , new LinkedHashMap <>(), "/" + cmdCtx .getInput ());
228
+ return new CommandArguments (result , new LinkedHashMap <>(), result , new LinkedHashMap <>(), "/" + cmdCtx .getInput ());
227
229
}
228
230
};
229
231
@@ -274,16 +276,30 @@ CommandArguments argsToCommandArgs(CommandContext<Source> cmdCtx, Argument[] arg
274
276
// LinkedHashMap for arguments for executor
275
277
Map <String , Object > argsMap = new LinkedHashMap <>();
276
278
279
+ // List for raw arguments
280
+ List <String > rawArguments = new ArrayList <>();
281
+
282
+ // LinkedHashMap for raw arguments
283
+ Map <String , String > rawArgumentsMap = new LinkedHashMap <>();
284
+
277
285
// Populate array
278
286
for (Argument argument : args ) {
279
287
if (argument .isListed ()) {
280
- Object parsedArgument = parseArgument (cmdCtx , argument .getNodeName (), argument , new CommandArguments (argList .toArray (), argsMap , "/" + cmdCtx .getInput ()));
288
+ Object parsedArgument = parseArgument (cmdCtx , argument .getNodeName (), argument , new CommandArguments (argList .toArray (), argsMap , rawArguments .toArray (new String [0 ]), rawArgumentsMap , "/" + cmdCtx .getInput ()));
289
+
290
+ // Add the parsed argument
281
291
argList .add (parsedArgument );
282
292
argsMap .put (argument .getNodeName (), parsedArgument );
293
+
294
+ // Add the raw argument
295
+ String rawArgumentString = getRawArgumentInput (cmdCtx , argument .getNodeName ());
296
+
297
+ rawArguments .add (rawArgumentString );
298
+ rawArgumentsMap .put (argument .getNodeName (), rawArgumentString );
283
299
}
284
300
}
285
301
286
- return new CommandArguments (argList .toArray (), argsMap , "/" + cmdCtx .getInput ());
302
+ return new CommandArguments (argList .toArray (), argsMap , rawArguments . toArray ( new String [ 0 ]), rawArgumentsMap , "/" + cmdCtx .getInput ());
287
303
}
288
304
289
305
/**
@@ -809,14 +825,20 @@ CommandArguments generatePreviousArguments(CommandContext<Source> context, Argum
809
825
// LinkedHashMap for arguments
810
826
Map <String , Object > argsMap = new LinkedHashMap <>();
811
827
828
+ // List for raw arguments
829
+ List <String > rawArguments = new ArrayList <>();
830
+
831
+ // LinkedHashMap for raw arguments
832
+ Map <String , String > rawArgumentsMap = new LinkedHashMap <>();
833
+
812
834
for (Argument arg : args ) {
813
835
if (arg .getNodeName ().equals (nodeName ) && !(arg instanceof Literal )) {
814
836
break ;
815
837
}
816
838
817
839
Object result ;
818
840
try {
819
- result = parseArgument (context , arg .getNodeName (), arg , new CommandArguments (previousArguments .toArray (), argsMap , "/" + context .getInput ()));
841
+ result = parseArgument (context , arg .getNodeName (), arg , new CommandArguments (previousArguments .toArray (), argsMap , rawArguments . toArray ( new String [ 0 ]), rawArgumentsMap , "/" + context .getInput ()));
820
842
} catch (IllegalArgumentException e ) {
821
843
/*
822
844
* Redirected commands don't parse previous arguments properly. Simplest way to
@@ -829,11 +851,18 @@ CommandArguments generatePreviousArguments(CommandContext<Source> context, Argum
829
851
result = null ;
830
852
}
831
853
if (arg .isListed ()) {
854
+ // Add the parsed argument
832
855
previousArguments .add (result );
833
856
argsMap .put (arg .getNodeName (), result );
857
+
858
+ // Add the raw argument
859
+ String rawArgumentString = getRawArgumentInput (context , arg .getNodeName ());
860
+
861
+ rawArguments .add (rawArgumentString );
862
+ rawArgumentsMap .put (arg .getNodeName (), rawArgumentString );
834
863
}
835
864
}
836
- return new CommandArguments (previousArguments .toArray (), argsMap , "/" + context .getInput ());
865
+ return new CommandArguments (previousArguments .toArray (), argsMap , rawArguments . toArray ( new String [ 0 ]), rawArgumentsMap , "/" + context .getInput ());
837
866
}
838
867
839
868
SuggestionProvider <Source > toSuggestions (Argument theArgument , Argument [] args ,
0 commit comments