Skip to content

Commit 0f12d01

Browse files
authored
fix capacity for option names, deprecate parser constructor (#37)
1 parent 476368d commit 0f12d01

48 files changed

Lines changed: 101 additions & 169 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

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

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package net.jbock.writing;
22

33
import io.jbock.javapoet.ClassName;
4-
import io.jbock.javapoet.FieldSpec;
54
import net.jbock.annotated.Option;
65
import net.jbock.annotated.Parameter;
76
import net.jbock.annotated.VarargsParameter;
@@ -13,18 +12,10 @@
1312
import java.util.Optional;
1413
import java.util.function.Supplier;
1514

16-
import static javax.lang.model.element.Modifier.FINAL;
17-
import static javax.lang.model.element.Modifier.PRIVATE;
18-
import static net.jbock.common.Constants.STRING;
19-
import static net.jbock.common.Constants.mapOf;
2015
import static net.jbock.common.Suppliers.memoize;
2116

2217
public final class CommandRepresentation {
2318

24-
private final Supplier<FieldSpec> optionNames = memoize(() -> FieldSpec.builder(
25-
mapOf(STRING, optType()), "optionNames")
26-
.addModifiers(PRIVATE, FINAL).build());
27-
2819
private final Supplier<ClassName> optType = memoize(() -> namedOptions().isEmpty() ?
2920
ClassName.get(Void.class) : // javapoet #739
3021
sourceElement().optionEnumType());
@@ -70,10 +61,6 @@ List<Mapping<Option>> namedOptions() {
7061
return namedOptions;
7162
}
7263

73-
FieldSpec optionNames() {
74-
return optionNames.get();
75-
}
76-
7764
/** Returns the type of the option enum. */
7865
ClassName optType() {
7966
return optType.get();

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import net.jbock.model.Multiplicity;
1010
import net.jbock.model.Parameter;
1111

12+
import javax.lang.model.element.Modifier;
1213
import java.util.ArrayList;
1314
import java.util.List;
1415
import java.util.function.Supplier;
@@ -48,6 +49,7 @@ final class CreateModelMethod extends HasCommandRepresentation {
4849
.addStatement(joinByNewline(code))
4950
.returns(CommandModel.class)
5051
.addModifiers(sourceElement().accessModifiers())
52+
.addModifiers(Modifier.STATIC)
5153
.build();
5254
});
5355

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

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package net.jbock.writing;
22

33
import io.jbock.javapoet.ClassName;
4-
import io.jbock.javapoet.FieldSpec;
54
import net.jbock.annotated.Option;
65
import net.jbock.annotated.Parameter;
76
import net.jbock.annotated.VarargsParameter;
@@ -31,10 +30,6 @@ final ClassName optType() {
3130
return commandRepresentation.optType();
3231
}
3332

34-
final FieldSpec optionNames() {
35-
return commandRepresentation.optionNames();
36-
}
37-
3833
final List<Mapping<Parameter>> positionalParameters() {
3934
return commandRepresentation.positionalParameters();
4035
}

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313

1414
import static javax.lang.model.element.Modifier.PRIVATE;
1515
import static javax.lang.model.element.Modifier.STATIC;
16+
import static net.jbock.common.Constants.STRING;
17+
import static net.jbock.common.Constants.mapOf;
1618
import static net.jbock.common.Suppliers.memoize;
1719

1820
final class OptionNamesMethod extends HasCommandRepresentation {
@@ -25,15 +27,16 @@ final class OptionNamesMethod extends HasCommandRepresentation {
2527

2628
private final Supplier<MethodSpec> define = memoize(() -> {
2729
ParameterSpec result = ParameterSpec.builder(
28-
optionNames().type, "result").build();
30+
mapOf(STRING, optType()), "result").build();
2931
long mapSize = namedOptions().stream()
3032
.map(Mapping::item)
3133
.map(Option::names)
3234
.map(List::size)
3335
.mapToLong(i -> i)
3436
.sum();
3537
CodeBlock.Builder code = CodeBlock.builder();
36-
code.addStatement("$T $N = new $T<>($L)", result.type, result, HashMap.class, mapSize);
38+
int capacity = (int) (1 + Math.max(mapSize * 1.35, 15));
39+
code.addStatement("$T $N = new $T<>($L)", result.type, result, HashMap.class, capacity);
3740
for (Mapping<Option> namedOption : namedOptions()) {
3841
for (String dashedName : namedOption.item().names()) {
3942
code.addStatement("$N.put($S, $T.$L)",

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import java.util.function.Supplier;
1818

1919
import static javax.lang.model.element.Modifier.PRIVATE;
20+
import static javax.lang.model.element.Modifier.STATIC;
2021
import static net.jbock.common.Constants.mapOf;
2122
import static net.jbock.common.Suppliers.memoize;
2223

@@ -45,7 +46,7 @@ result, sourceElement().optionEnumType(),
4546
return MethodSpec.methodBuilder("optionStates")
4647
.addCode(code.build())
4748
.returns(result.type)
48-
.addModifiers(PRIVATE)
49+
.addModifiers(PRIVATE, STATIC)
4950
.build();
5051
});
5152

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import io.jbock.simple.Inject;
77
import net.jbock.util.ExFailure;
88

9+
import javax.lang.model.element.Modifier;
910
import java.util.function.Supplier;
1011

1112
import static io.jbock.javapoet.ParameterSpec.builder;
@@ -57,6 +58,7 @@ EITHER, e, createModelMethod().get())
5758
.returns(generatedTypes().parseResultType())
5859
.addCode(code.build())
5960
.addModifiers(sourceElement().accessModifiers())
61+
.addModifiers(Modifier.STATIC)
6062
.build();
6163
});
6264

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import net.jbock.util.AtFileError;
1010
import net.jbock.util.ParseRequest;
1111

12+
import javax.lang.model.element.Modifier;
1213
import java.util.List;
1314

1415
import static io.jbock.javapoet.MethodSpec.methodBuilder;
@@ -77,6 +78,7 @@ MethodSpec define() {
7778
return methodBuilder("parseOrExit").addParameter(args)
7879
.addModifiers(sourceElement().accessModifiers())
7980
.returns(generatedTypes.sourceElement().typeName())
81+
.addModifiers(Modifier.STATIC)
8082
.addCode(code.build())
8183
.build();
8284
}

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package net.jbock.writing;
22

3+
import io.jbock.javapoet.AnnotationSpec;
4+
import io.jbock.javapoet.MethodSpec;
35
import io.jbock.javapoet.TypeSpec;
46
import io.jbock.simple.Inject;
57

@@ -53,17 +55,20 @@ TypeSpec define() {
5355
spec.addMethod(parseOrExitMethod.define());
5456
}
5557
if (!namedOptions().isEmpty()) {
56-
spec.addField(optionNames().toBuilder()
57-
.initializer("$N()", optionNamesMethod.get()).build());
5858
spec.addMethod(optionNamesMethod.get());
5959
spec.addMethod(optionStatesMethod.get());
6060
spec.addType(optionEnum.define());
6161
}
6262

6363
spec.addMethod(createModelMethod.get());
64+
Modifier[] modifiers = sourceElement().accessModifiers().toArray(new Modifier[0]);
65+
spec.addMethod(MethodSpec.constructorBuilder().addModifiers(modifiers)
66+
.addJavadoc("Constructor is deprecated, use the static methods instead.")
67+
.addAnnotation(AnnotationSpec.builder(Deprecated.class).addMember("forRemoval", "true").build())
68+
.build());
6469

6570
return spec.addOriginatingElement(sourceElement().element())
66-
.addModifiers(sourceElement().accessModifiers().toArray(new Modifier[0]))
71+
.addModifiers(modifiers)
6772
.addModifiers(Modifier.FINAL)
6873
.addType(implClass.define())
6974
.addAnnotation(generatedAnnotation.define()).build();

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,22 @@
1616
final class ParserTypeFactory extends HasCommandRepresentation {
1717

1818
private final OptionStatesMethod optionStatesMethod;
19+
private final OptionNamesMethod optionNamesMethod;
1920

2021
@Inject
2122
ParserTypeFactory(
2223
CommandRepresentation commandRepresentation,
23-
OptionStatesMethod optionStatesMethod) {
24+
OptionStatesMethod optionStatesMethod,
25+
OptionNamesMethod optionNamesMethod) {
2426
super(commandRepresentation);
2527
this.optionStatesMethod = optionStatesMethod;
28+
this.optionNamesMethod = optionNamesMethod;
2629
}
2730

2831
private final Supplier<ParserType> parserType = memoize(() -> {
2932
CodeBlock optionNames = namedOptions().isEmpty() ?
3033
CodeBlock.of("$T.of()", Map.class) :
31-
CodeBlock.of("$N", optionNames());
34+
CodeBlock.of("$N()", optionNamesMethod().get());
3235
CodeBlock optionStates = namedOptions().isEmpty() ?
3336
CodeBlock.of("$T.of()", Map.class) :
3437
CodeBlock.of("$N()", optionStatesMethod().get());
@@ -61,4 +64,8 @@ ParserType get() {
6164
private OptionStatesMethod optionStatesMethod() {
6265
return optionStatesMethod;
6366
}
67+
68+
private OptionNamesMethod optionNamesMethod() {
69+
return optionNamesMethod;
70+
}
6471
}

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ void testBasicGenerated() {
4444
" comments = \"https://github.com/jbock-java/jbock\"",
4545
")",
4646
"final class ArgumentsParser {",
47-
" Either<ParsingFailed, Arguments> parse(List<String> tokens) {",
47+
" static Either<ParsingFailed, Arguments> parse(List<String> tokens) {",
4848
" VarargsParameterParser<Void> parser = VarargsParameterParser.create(Map.of(), Map.of(), 0);",
4949
" try {",
5050
" parser.parse(tokens);",
@@ -54,7 +54,7 @@ void testBasicGenerated() {
5454
" }",
5555
" }",
5656
"",
57-
" CommandModel createModel() {",
57+
" static CommandModel createModel() {",
5858
" return CommandModel.builder()",
5959
" .withProgramName(\"arguments\")",
6060
" .addParameter(Parameter.builder(Multiplicity.REPEATABLE)",
@@ -118,7 +118,7 @@ void testPublicParser() {
118118
" comments = \"https://github.com/jbock-java/jbock\"",
119119
")",
120120
"public final class ArgumentsParser {",
121-
" public Either<ParsingFailed, Arguments> parse(List<String> tokens) {",
121+
" public static Either<ParsingFailed, Arguments> parse(List<String> tokens) {",
122122
" VarargsParameterParser<Void> parser = VarargsParameterParser.create(Map.of(), Map.of(), 0);",
123123
" try {",
124124
" parser.parse(tokens);",
@@ -128,7 +128,7 @@ void testPublicParser() {
128128
" }",
129129
" }",
130130
"",
131-
" public CommandModel createModel() {",
131+
" public static CommandModel createModel() {",
132132
" return CommandModel.builder()",
133133
" .withProgramName(\"arguments\")",
134134
" .addParameter(Parameter.builder(Multiplicity.REPEATABLE)",

0 commit comments

Comments
 (0)