Skip to content

Commit 7655e95

Browse files
committed
remove SuperResult
1 parent 72195d0 commit 7655e95

22 files changed

Lines changed: 149 additions & 194 deletions

compiler/src/main/java/net/jbock/annotated/ItemsFactory.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ private Optional<List<ValidationFailure>> validateAtLeastOneParameterInSuperComm
3535
!items.positionalParameters().isEmpty()) {
3636
return Optional.empty();
3737
}
38-
String message = "at least one positional parameter must be defined" +
39-
" when the superCommand attribute is set";
38+
String message = "At least one @Parameter must be defined" +
39+
" in a @SuperCommand";
4040
return Optional.of(List.of(sourceElement.fail(message)));
4141
}
4242
}

compiler/src/main/java/net/jbock/common/TypeTool.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,23 @@ public boolean isSameType(TypeMirror mirror, Class<?> cl) {
8181
return isSameType(mirror, cl.getCanonicalName());
8282
}
8383

84+
public boolean isListOfString(TypeMirror mirror) {
85+
Optional<DeclaredType> visit = AS_DECLARED.visit(mirror);
86+
if (visit.isEmpty()) {
87+
return false;
88+
}
89+
DeclaredType declaredType = visit.orElseThrow();
90+
if (declaredType.getTypeArguments().isEmpty()) {
91+
return false;
92+
}
93+
if (elements.getTypeElement("java.util.List")
94+
.filter(list -> list.equals(declaredType.asElement()))
95+
.isEmpty()) {
96+
return false;
97+
}
98+
return isSameType(declaredType.getTypeArguments().get(0), String.class);
99+
}
100+
84101
/**
85102
* Works for classes with no type parameters.
86103
*/

compiler/src/main/java/net/jbock/validate/VarargsParameterValidator.java

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import io.jbock.util.Either;
55
import net.jbock.annotated.Items;
66
import net.jbock.annotated.VarargsParameter;
7+
import net.jbock.common.TypeTool;
78
import net.jbock.common.ValidationFailure;
89
import net.jbock.convert.Mapping;
910
import net.jbock.convert.MappingFinder;
@@ -20,19 +21,22 @@ final class VarargsParameterValidator {
2021

2122
private final MappingFinder mappingFinder;
2223
private final SourceElement sourceElement;
24+
private final TypeTool tool;
2325

2426
@Inject
2527
VarargsParameterValidator(
2628
MappingFinder mappingFinder,
27-
SourceElement sourceElement) {
29+
SourceElement sourceElement,
30+
TypeTool tool) {
2831
this.mappingFinder = mappingFinder;
2932
this.sourceElement = sourceElement;
33+
this.tool = tool;
3034
}
3135

3236
Either<List<ValidationFailure>, Optional<Mapping<VarargsParameter>>> wrapVarargsParameters(
3337
Items items) {
3438
return validateDuplicateParametersAnnotation(items.varargsParameters())
35-
.filter(this::validateNoRepeatableParameterInSuperCommand)
39+
.filter(this::validateVarargsParameterInSuperCommand)
3640
.flatMap(parameters -> parameters.stream()
3741
.map(mappingFinder::findMapping)
3842
.collect(allFailures()))
@@ -51,14 +55,19 @@ private Either<List<ValidationFailure>, List<VarargsParameter>> validateDuplicat
5155

5256
/* Left-Optional
5357
*/
54-
private Optional<List<ValidationFailure>> validateNoRepeatableParameterInSuperCommand(
58+
private Optional<List<ValidationFailure>> validateVarargsParameterInSuperCommand(
5559
List<VarargsParameter> parameters) {
5660
if (!sourceElement.isSuperCommand()) {
5761
return Optional.empty();
5862
}
59-
return parameters.stream()
60-
.map(param -> param.fail("@" + net.jbock.VarargsParameter.class.getSimpleName() +
61-
" cannot be used when superCommand=true"))
62-
.collect(toOptionalList());
63+
if (parameters.isEmpty()) {
64+
return Optional.of(List.of(sourceElement.fail("At least one @VarargsParameter must be defined" +
65+
" in a @SuperCommand")));
66+
}
67+
if (!tool.isListOfString(parameters.get(0).returnType())) {
68+
return Optional.of(List.of(sourceElement.fail("The @VarargsParameter" +
69+
" in a @SuperCommand must return List<String>")));
70+
}
71+
return Optional.empty();
6372
}
6473
}

compiler/src/main/java/net/jbock/writing/GeneratedTypes.java

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,6 @@
55
import io.jbock.javapoet.TypeName;
66
import io.jbock.simple.Inject;
77
import net.jbock.util.ParsingFailed;
8-
import net.jbock.util.SuperResult;
9-
10-
import java.util.Optional;
118

129
import static net.jbock.common.Constants.EITHER;
1310

@@ -18,20 +15,6 @@ final class GeneratedTypes extends HasCommandRepresentation {
1815
super(commandRepresentation);
1916
}
2017

21-
TypeName parseSuccessType() {
22-
return superResultType().orElse(sourceElement().typeName());
23-
}
24-
25-
Optional<TypeName> superResultType() {
26-
if (!isSuperCommand()) {
27-
return Optional.empty();
28-
}
29-
ParameterizedTypeName type = ParameterizedTypeName.get(
30-
ClassName.get(SuperResult.class),
31-
sourceElement().typeName());
32-
return Optional.of(type);
33-
}
34-
3518
ClassName implType() {
3619
return sourceElement().generatedClass().nestedClass(sourceElement().element().getSimpleName() + "_Impl");
3720
}
@@ -40,6 +23,6 @@ TypeName parseResultType() {
4023
return ParameterizedTypeName.get(
4124
EITHER,
4225
ClassName.get(ParsingFailed.class),
43-
parseSuccessType());
26+
sourceElement().typeName());
4427
}
4528
}

compiler/src/main/java/net/jbock/writing/ParseMethod.java

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import net.jbock.util.ExFailure;
88

99
import java.util.function.Supplier;
10-
import java.util.stream.Collectors;
1110

1211
import static io.jbock.javapoet.ParameterSpec.builder;
1312
import static net.jbock.common.Constants.EITHER;
@@ -45,19 +44,9 @@ final class ParseMethod extends HasCommandRepresentation {
4544
code.addStatement("$T $N = $L", parserType.type(), parser, parserType.init());
4645
code.add("try {\n").indent()
4746
.addStatement("$N.parse($N)", parser, tokens);
48-
generatedTypes().superResultType().ifPresentOrElse(parseResultWithRestType -> {
49-
ParameterSpec restArgs = ParameterSpec.builder(sourceElement().typeName(), "rest").build();
50-
ParameterSpec impl = ParameterSpec.builder(generatedTypes().implType(), "impl").build();
51-
code.addStatement("$T $N = new $T($N)", impl.type, impl, impl.type, parser);
52-
code.addStatement("$T $N = $N.rest().collect($T.toList())", LIST_OF_STRING, restArgs,
53-
parser, Collectors.class);
54-
code.addStatement("return $T.right(new $T($N, $N))", EITHER, parseResultWithRestType,
55-
impl, restArgs);
56-
}, () -> {
57-
ParameterSpec impl = ParameterSpec.builder(generatedTypes().implType(), "impl").build();
58-
code.addStatement("return $T.right(new $T($N))", EITHER,
59-
impl.type, parser);
60-
});
47+
ParameterSpec impl = ParameterSpec.builder(generatedTypes().implType(), "impl").build();
48+
code.addStatement("return $T.right(new $T($N))", EITHER,
49+
impl.type, parser);
6150
code.unindent().add("} catch ($T $N) {\n", ExFailure.class, e).indent()
6251
.addStatement("return $T.left($N.toError($N()))",
6352
EITHER, e, createModelMethod().get())

compiler/src/main/java/net/jbock/writing/ParseOrExitMethod.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ MethodSpec define() {
5555
.addStatement("})").unindent();
5656
return methodBuilder("parseOrExit").addParameter(args)
5757
.addModifiers(sourceElement().accessModifiers())
58-
.returns(generatedTypes.parseSuccessType())
58+
.returns(generatedTypes.sourceElement().typeName())
5959
.addCode(code.build())
6060
.build();
6161
}

compiler/src/main/java/net/jbock/writing/ParserTypeFactory.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ final class ParserTypeFactory extends HasCommandRepresentation {
2525
this.optionStatesMethod = optionStatesMethod;
2626
}
2727

28-
private final Supplier<ParserType> define = memoize(() -> {
28+
private final Supplier<ParserType> parserType = memoize(() -> {
2929
CodeBlock optionNames = namedOptions().isEmpty() ?
3030
CodeBlock.of("$T.of()", Map.class) :
3131
CodeBlock.of("$N", optionNames());
@@ -55,7 +55,7 @@ final class ParserTypeFactory extends HasCommandRepresentation {
5555
});
5656

5757
ParserType get() {
58-
return define.get();
58+
return parserType.get();
5959
}
6060

6161
private OptionStatesMethod optionStatesMethod() {

compiler/src/test/java/net/jbock/processor/PositionalTest.java

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,16 @@ void superSimpleOptional() {
3333
"",
3434
" @Parameter(index = 0, description = \"x\", descriptionKey = \"x\", paramLabel = \"x\")",
3535
" abstract Optional<String> a();",
36+
"",
37+
" @VarargsParameter",
38+
" abstract List<String> rest();",
3639
"}");
3740
assertAbout(javaSources()).that(singletonList(javaFile))
3841
.processedWith(Processor.testInstance())
3942
.compilesWithoutError();
4043
}
4144

45+
// TODO move this to SuperCommandTest
4246
@Test
4347
void superComplexOptional() {
4448
JavaFileObject javaFile = fromSource(
@@ -50,30 +54,33 @@ void superComplexOptional() {
5054
"",
5155
" @Option(names = \"--b\")",
5256
" abstract Optional<String> b();",
57+
"",
58+
" @VarargsParameter",
59+
" abstract List<String> rest();",
5360
"}");
5461
assertAbout(javaSources()).that(singletonList(javaFile))
5562
.processedWith(Processor.testInstance())
5663
.compilesWithoutError();
5764
}
5865

66+
// TODO move this to SuperCommandTest
5967
@Test
60-
void repeatableSuperCommand() {
68+
void missingVarargsParameterInSuperCommand() {
6169
JavaFileObject javaFile = fromSource(
6270
"@SuperCommand",
6371
"abstract class Arguments {",
6472
"",
6573
" @Parameter(index = 0)",
6674
" abstract String p();",
67-
"",
68-
" @VarargsParameter",
69-
" abstract List<String> a();",
7075
"}");
7176
assertAbout(javaSources()).that(singletonList(javaFile))
7277
.processedWith(Processor.testInstance())
7378
.failsToCompile()
74-
.withErrorContaining("@VarargsParameter cannot be used when superCommand=true");
79+
.withErrorContaining("At least one @VarargsParameter must be defined" +
80+
" in a @SuperCommand");
7581
}
7682

83+
// TODO move this to SuperCommandTest
7784
@Test
7885
void missingParamSuperCommand() {
7986
JavaFileObject javaFile = fromSource(
@@ -82,12 +89,15 @@ void missingParamSuperCommand() {
8289
"",
8390
" @Option(names = \"--a\")",
8491
" abstract String a();",
92+
"",
93+
" @VarargsParameter",
94+
" abstract List<String> rest();",
8595
"}");
8696
assertAbout(javaSources()).that(singletonList(javaFile))
8797
.processedWith(Processor.testInstance())
8898
.failsToCompile()
89-
.withErrorContaining("at least one positional parameter must be defined" +
90-
" when the superCommand attribute is set");
99+
.withErrorContaining("At least one @Parameter must be defined" +
100+
" in a @SuperCommand");
91101
}
92102

93103
@Test

compiler/src/test/java/net/jbock/processor/SuperCommandTest.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,22 @@ void cannotCombineCommandAndSuperCommand() {
2626
.failsToCompile()
2727
.withErrorContaining("not both");
2828
}
29+
30+
@Test
31+
void varargsParameterNotListOfStringInSuperCommand() {
32+
JavaFileObject javaFile = fromSource(
33+
"@SuperCommand",
34+
"abstract class Arguments {",
35+
"",
36+
" @Parameter(index = 0)",
37+
" abstract String a();",
38+
"",
39+
" @VarargsParameter",
40+
" abstract List<Integer> rest();",
41+
"}");
42+
assertAbout(javaSources()).that(singletonList(javaFile))
43+
.processedWith(Processor.testInstance())
44+
.failsToCompile()
45+
.withErrorContaining("The @VarargsParameter in a @SuperCommand must return List<String>");
46+
}
2947
}

examples/src/main/java/net/jbock/examples/GitCommand.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,8 @@ interface AddCommand {
2525
@Parameter(index = 0)
2626
String command();
2727

28+
@VarargsParameter
29+
List<String> rest();
30+
2831
// more options...
2932
}

0 commit comments

Comments
 (0)