Skip to content

Commit 67f5bf9

Browse files
committed
feat: improve parameters system by allowing special parameters to be declared anywhere
1 parent 346b84c commit 67f5bf9

File tree

32 files changed

+541
-198
lines changed

32 files changed

+541
-198
lines changed

processor-common/src/main/java/module-info.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
requires transitive net.strokkur.commands.common;
88
requires static transitive org.jetbrains.annotations;
99
requires static transitive org.jspecify;
10+
requires jdk.sctp;
11+
requires java.xml;
1012

1113
exports net.strokkur.commands.internal;
1214
exports net.strokkur.commands.internal.abstraction;
@@ -20,4 +22,5 @@
2022
exports net.strokkur.commands.internal.parsing;
2123
exports net.strokkur.commands.internal.printer;
2224
exports net.strokkur.commands.internal.util;
25+
exports net.strokkur.commands.internal.intermediate.executable;
2326
}

processor-common/src/main/java/net/strokkur/commands/internal/NodeUtils.java

Lines changed: 26 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -21,28 +21,25 @@
2121
import net.strokkur.commands.UnsetExecutorWrapper;
2222
import net.strokkur.commands.internal.abstraction.AnnotationsHolder;
2323
import net.strokkur.commands.internal.abstraction.SourceClass;
24-
import net.strokkur.commands.internal.abstraction.SourceElement;
2524
import net.strokkur.commands.internal.abstraction.SourceVariable;
2625
import net.strokkur.commands.internal.arguments.BrigadierArgumentConverter;
2726
import net.strokkur.commands.internal.arguments.BrigadierArgumentType;
28-
import net.strokkur.commands.internal.arguments.CommandArgument;
2927
import net.strokkur.commands.internal.arguments.LiteralCommandArgument;
3028
import net.strokkur.commands.internal.arguments.MultiLiteralCommandArgument;
3129
import net.strokkur.commands.internal.arguments.RequiredCommandArgument;
3230
import net.strokkur.commands.internal.arguments.RequiredCommandArgumentImpl;
3331
import net.strokkur.commands.internal.exceptions.ConversionException;
3432
import net.strokkur.commands.internal.intermediate.attributes.Attributable;
3533
import net.strokkur.commands.internal.intermediate.attributes.AttributeKey;
34+
import net.strokkur.commands.internal.intermediate.executable.ParameterType;
35+
import net.strokkur.commands.internal.intermediate.executable.SourceParameterType;
3636
import net.strokkur.commands.internal.intermediate.registrable.ExecutorWrapperRegistry;
3737
import net.strokkur.commands.internal.intermediate.registrable.RegistrableRegistry;
3838
import net.strokkur.commands.internal.intermediate.registrable.RequirementRegistry;
3939
import net.strokkur.commands.internal.intermediate.registrable.SuggestionsRegistry;
40-
import net.strokkur.commands.internal.intermediate.tree.CommandNode;
4140
import net.strokkur.commands.internal.util.ForwardingMessagerWrapper;
4241
import net.strokkur.commands.internal.util.MessagerWrapper;
4342

44-
import java.util.ArrayList;
45-
import java.util.List;
4643
import java.util.Optional;
4744
import java.util.Set;
4845

@@ -70,40 +67,36 @@ public void applyExecutorTransform(final Attributable node, final AnnotationsHol
7067
);
7168
}
7269

73-
public List<CommandArgument> parseArguments(final List<? extends SourceVariable> variables) {
74-
final List<CommandArgument> arguments = new ArrayList<>(variables.size());
70+
public ParameterType parseParameter(final SourceVariable parameter) {
71+
debug("| Parsing parameter: " + parameter.getName());
7572

76-
for (final SourceVariable parameter : variables) {
77-
debug("| Parsing parameter: " + parameter.getName());
78-
79-
final Literal literal = parameter.getAnnotation(Literal.class);
80-
if (literal != null) {
81-
final String[] declared = literal.value();
82-
if (declared.length == 0) {
83-
arguments.add(LiteralCommandArgument.literal(parameter.getName(), parameter));
84-
} else if (declared.length == 1) {
85-
arguments.add(LiteralCommandArgument.literal(declared[0], parameter));
86-
} else {
87-
arguments.add(MultiLiteralCommandArgument.multiLiteral(Set.of(declared), parameter));
88-
}
89-
continue;
90-
}
73+
if (!platformUtils().mayParameterBeArgument(parameter)) {
74+
return new SourceParameterType(parameter);
75+
}
9176

92-
final BrigadierArgumentType argumentType;
93-
try {
94-
argumentType = converter.getAsArgumentType(parameter);
95-
} catch (ConversionException e) {
96-
errorSource(e.getMessage(), parameter);
97-
continue;
77+
final Literal literal = parameter.getAnnotation(Literal.class);
78+
if (literal != null) {
79+
final String[] declared = literal.value();
80+
if (declared.length == 0) {
81+
return LiteralCommandArgument.literal(parameter.getName(), parameter);
82+
} else if (declared.length == 1) {
83+
return LiteralCommandArgument.literal(declared[0], parameter);
84+
} else {
85+
return MultiLiteralCommandArgument.multiLiteral(Set.of(declared), parameter);
9886
}
87+
}
9988

100-
debug(" | Successfully found Brigadier type: {}", argumentType);
101-
final RequiredCommandArgument commandArgument = new RequiredCommandArgumentImpl(argumentType, parameter.getName(), parameter);
102-
applyRegistrableProvider(commandArgument, parameter, this.suggestionsRegistry, AttributeKey.SUGGESTION_PROVIDER, "suggestion");
103-
arguments.add(commandArgument);
89+
final BrigadierArgumentType argumentType;
90+
try {
91+
argumentType = converter.getAsArgumentType(parameter);
92+
} catch (ConversionException e) {
93+
return new SourceParameterType(parameter);
10494
}
10595

106-
return arguments;
96+
debug(" | Successfully found Brigadier type: {}", argumentType);
97+
final RequiredCommandArgument commandArgument = new RequiredCommandArgumentImpl(argumentType, parameter.getName(), parameter);
98+
applyRegistrableProvider(commandArgument, parameter, this.suggestionsRegistry, AttributeKey.SUGGESTION_PROVIDER, "suggestion");
99+
return commandArgument;
107100
}
108101

109102
public <T> void applyRegistrableProvider(

processor-common/src/main/java/net/strokkur/commands/internal/PlatformUtils.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,22 @@
1818
package net.strokkur.commands.internal;
1919

2020
import net.strokkur.commands.internal.abstraction.AnnotationsHolder;
21-
import net.strokkur.commands.internal.abstraction.SourceParameter;
21+
import net.strokkur.commands.internal.abstraction.SourceVariable;
2222
import net.strokkur.commands.internal.exceptions.UnknownSenderException;
23-
import net.strokkur.commands.internal.intermediate.attributes.Executable;
23+
import net.strokkur.commands.internal.intermediate.executable.Executable;
24+
import net.strokkur.commands.internal.intermediate.executable.ParameterType;
2425
import net.strokkur.commands.internal.intermediate.tree.CommandNode;
2526

2627
import java.util.List;
2728

2829
public interface PlatformUtils {
29-
default int executableFirstIndexToParse(final List<SourceParameter> parameters) {
30-
return 1;
30+
default void populateExecutesNode(final Executable executable, final CommandNode node, final List<ParameterType> parameters) throws UnknownSenderException {
31+
// noop
3132
}
3233

33-
void populateExecutesNode(final Executable executable, final CommandNode node, final List<SourceParameter> parameters) throws UnknownSenderException;
34+
default boolean mayParameterBeArgument(final SourceVariable param) {
35+
return true;
36+
}
3437

3538
default String getNodeReturnType() {
3639
return "LiteralArgumentBuilder";

processor-common/src/main/java/net/strokkur/commands/internal/arguments/CommandArgument.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,9 @@
1818
package net.strokkur.commands.internal.arguments;
1919

2020
import net.strokkur.commands.internal.abstraction.SourceElement;
21+
import net.strokkur.commands.internal.intermediate.executable.ParameterType;
2122

22-
public interface CommandArgument {
23+
public non-sealed interface CommandArgument extends ParameterType {
2324

2425
String argumentName();
2526

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/*
2+
* StrokkCommands - A super simple annotation based zero-shade Paper command API library.
3+
* Copyright (C) 2025 Strokkur24
4+
*
5+
* This library is free software; you can redistribute it and/or
6+
* modify it under the terms of the GNU Lesser General Public
7+
* License as published by the Free Software Foundation; either
8+
* version 2.1 of the License, or (at your option) any later version.
9+
*
10+
* This library is distributed in the hope that it will be useful,
11+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13+
* Lesser General Public License for more details.
14+
*
15+
* You should have received a copy of the GNU Lesser General Public
16+
* License along with this library; if not, see <https://www.gnu.org/licenses/>.
17+
*/
18+
package net.strokkur.commands.internal.exceptions;
19+
20+
public class AnnotationException extends RuntimeException {
21+
public AnnotationException(String message) {
22+
super(message);
23+
}
24+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/*
2+
* StrokkCommands - A super simple annotation based zero-shade Paper command API library.
3+
* Copyright (C) 2025 Strokkur24
4+
*
5+
* This library is free software; you can redistribute it and/or
6+
* modify it under the terms of the GNU Lesser General Public
7+
* License as published by the Free Software Foundation; either
8+
* version 2.1 of the License, or (at your option) any later version.
9+
*
10+
* This library is distributed in the hope that it will be useful,
11+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13+
* Lesser General Public License for more details.
14+
*
15+
* You should have received a copy of the GNU Lesser General Public
16+
* License along with this library; if not, see <https://www.gnu.org/licenses/>.
17+
*/
18+
package net.strokkur.commands.internal.exceptions;
19+
20+
import net.strokkur.commands.internal.abstraction.SourceType;
21+
22+
public class IllegalReturnTypeException extends Exception {
23+
public IllegalReturnTypeException(SourceType illegalType) {
24+
super("Illegal return type: " + illegalType.getName());
25+
}
26+
}

processor-common/src/main/java/net/strokkur/commands/internal/intermediate/attributes/Executable.java renamed to processor-common/src/main/java/net/strokkur/commands/internal/exceptions/PrinterException.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,12 @@
1515
* You should have received a copy of the GNU Lesser General Public
1616
* License along with this library; if not, see <https://www.gnu.org/licenses/>.
1717
*/
18-
package net.strokkur.commands.internal.intermediate.attributes;
18+
package net.strokkur.commands.internal.exceptions;
1919

20-
import net.strokkur.commands.internal.abstraction.SourceMethod;
20+
import java.io.IOException;
2121

22-
public interface Executable extends Parameterizable, Attributable {
23-
SourceMethod executesMethod();
22+
public class PrinterException extends IOException {
23+
public PrinterException(String message) {
24+
super(message);
25+
}
2426
}

processor-common/src/main/java/net/strokkur/commands/internal/intermediate/CommonTreePostProcessor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
package net.strokkur.commands.internal.intermediate;
1919

2020
import net.strokkur.commands.internal.intermediate.attributes.AttributeKey;
21-
import net.strokkur.commands.internal.intermediate.attributes.DefaultExecutable;
21+
import net.strokkur.commands.internal.intermediate.executable.DefaultExecutable;
2222
import net.strokkur.commands.internal.intermediate.tree.CommandNode;
2323
import net.strokkur.commands.internal.util.MessagerWrapper;
2424

processor-common/src/main/java/net/strokkur/commands/internal/intermediate/attributes/AttributeKey.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@
1818
package net.strokkur.commands.internal.intermediate.attributes;
1919

2020
import net.strokkur.commands.internal.intermediate.access.ExecuteAccess;
21+
import net.strokkur.commands.internal.intermediate.executable.DefaultExecutable;
22+
import net.strokkur.commands.internal.intermediate.executable.Executable;
23+
import net.strokkur.commands.internal.intermediate.executable.Parameterizable;
2124
import net.strokkur.commands.internal.intermediate.registrable.ExecutorWrapperProvider;
2225
import net.strokkur.commands.internal.intermediate.registrable.RequirementProvider;
2326
import net.strokkur.commands.internal.intermediate.registrable.SuggestionProvider;

processor-common/src/main/java/net/strokkur/commands/internal/intermediate/attributes/DefaultExecutable.java renamed to processor-common/src/main/java/net/strokkur/commands/internal/intermediate/executable/DefaultExecutable.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,17 @@
1515
* You should have received a copy of the GNU Lesser General Public
1616
* License along with this library; if not, see <https://www.gnu.org/licenses/>.
1717
*/
18-
package net.strokkur.commands.internal.intermediate.attributes;
18+
package net.strokkur.commands.internal.intermediate.executable;
1919

2020
import net.strokkur.commands.internal.abstraction.SourceVariable;
21+
import net.strokkur.commands.internal.intermediate.attributes.Attributable;
2122
import net.strokkur.commands.internal.util.Classes;
23+
import org.jetbrains.annotations.Contract;
2224
import org.jspecify.annotations.Nullable;
2325

2426
import java.util.Set;
2527

2628
public interface DefaultExecutable extends Executable, Attributable {
27-
Type defaultExecutableArgumentTypes();
2829

2930
enum Type {
3031
NONE(null, Set.of()),

0 commit comments

Comments
 (0)