Skip to content

Commit 7e3d55f

Browse files
authored
Prohibit multiple 1-arg constructors in DataType annotated record (#614)
1 parent 086bda7 commit 7e3d55f

File tree

4 files changed

+38
-22
lines changed

4 files changed

+38
-22
lines changed

doma-core/src/main/java/org/seasar/doma/message/Message.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -914,9 +914,10 @@ public enum Message implements MessageResource {
914914
DOMA4452(
915915
"The type \"{0}\" is a local or anonymous class. "
916916
+ "The data type and its enclosing type must be a top level or member class."),
917-
DOMA4453("The public constructor whose parameter size is one is not found."),
917+
DOMA4453("The non-private 1-arg constructor is required."),
918918
DOMA4454("The parameter type \"{0}\" is not supported as a persistent type."),
919919
DOMA4455("The combination of the prefix=\"{0}\" and the suffix=\"\" is not allowed."),
920+
DOMA4456("The non-private 1-arg constructor must be only one, but more than one found."),
920921

921922
// other
922923
DOMA5001(

doma-processor/src/main/java/org/seasar/doma/internal/apt/MoreElements.java

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
import javax.lang.model.util.SimpleElementVisitor8;
3636
import org.seasar.doma.ParameterName;
3737
import org.seasar.doma.internal.apt.def.TypeParametersDef;
38-
import org.seasar.doma.internal.apt.util.ElementKindUtil;
3938
import org.seasar.doma.internal.util.Pair;
4039
import org.seasar.doma.internal.util.Zip;
4140

@@ -314,18 +313,6 @@ List<String> getTypeParameterNames(List<? extends TypeParameterElement> typePara
314313
return ctx.getMoreTypes().getTypeParameterNames(typeMirrors);
315314
}
316315

317-
public VariableElement getSingleParameterOfRecordConstructor(TypeElement record) {
318-
if (!ElementKindUtil.isRecord(record.getKind())) {
319-
throw new AptIllegalStateException(record.getQualifiedName() + " must be a record type.");
320-
}
321-
return ElementFilter.constructorsIn(record.getEnclosedElements()).stream()
322-
.filter(c -> c.getModifiers().contains(Modifier.PUBLIC))
323-
.filter(c -> c.getParameters().size() == 1)
324-
.flatMap(c -> c.getParameters().stream())
325-
.findFirst()
326-
.orElse(null);
327-
}
328-
329316
public boolean isVirtualDefaultMethod(TypeElement typeElement, ExecutableElement methodElement) {
330317
return ElementFilter.typesIn(typeElement.getEnclosedElements()).stream()
331318
.filter(t -> t.getSimpleName().contentEquals("DefaultImpls"))

doma-processor/src/main/java/org/seasar/doma/internal/apt/cttype/CtTypes.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,11 @@
3131
import java.util.function.BiFunction;
3232
import java.util.function.Function;
3333
import java.util.stream.Collector;
34+
import java.util.stream.Collectors;
3435
import java.util.stream.Stream;
3536
import javax.lang.model.element.ElementKind;
37+
import javax.lang.model.element.ExecutableElement;
38+
import javax.lang.model.element.Modifier;
3639
import javax.lang.model.element.Name;
3740
import javax.lang.model.element.TypeElement;
3841
import javax.lang.model.element.VariableElement;
@@ -42,6 +45,7 @@
4245
import javax.lang.model.type.PrimitiveType;
4346
import javax.lang.model.type.TypeKind;
4447
import javax.lang.model.type.TypeMirror;
48+
import javax.lang.model.util.ElementFilter;
4549
import javax.lang.model.util.SimpleTypeVisitor8;
4650
import org.seasar.doma.Domain;
4751
import org.seasar.doma.Embeddable;
@@ -251,10 +255,19 @@ private DomainInfo getDomainInfo(Domain domain) {
251255
}
252256

253257
private DomainInfo getDomainInfo(TypeElement typeElement, DataType dataType) {
254-
VariableElement param =
255-
ctx.getMoreElements().getSingleParameterOfRecordConstructor(typeElement);
258+
List<ExecutableElement> constructors =
259+
ElementFilter.constructorsIn(typeElement.getEnclosedElements()).stream()
260+
.filter(c -> !c.getModifiers().contains(Modifier.PRIVATE))
261+
.filter(c -> c.getParameters().size() == 1)
262+
.collect(Collectors.toList());
263+
if (constructors.size() != 1) {
264+
throw new AptIllegalStateException(
265+
String.format("%s : %d", typeElement.getQualifiedName(), constructors.size()));
266+
}
267+
ExecutableElement constructor = constructors.iterator().next();
268+
VariableElement param = constructor.getParameters().iterator().next();
256269
if (param == null) {
257-
throw new AptIllegalStateException(typeElement.getQualifiedName().toString());
270+
throw new AptIllegalStateException("param is null");
258271
}
259272
return new DomainInfo(param.asType(), false);
260273
}

doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/domain/DataTypeMetaFactory.java

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,17 @@
33
import static org.seasar.doma.internal.util.AssertionUtil.assertNotNull;
44

55
import java.util.Arrays;
6+
import java.util.List;
67
import java.util.Set;
8+
import java.util.stream.Collectors;
79
import javax.lang.model.element.Element;
10+
import javax.lang.model.element.ExecutableElement;
811
import javax.lang.model.element.Modifier;
912
import javax.lang.model.element.NestingKind;
1013
import javax.lang.model.element.TypeElement;
1114
import javax.lang.model.element.VariableElement;
1215
import javax.lang.model.type.TypeMirror;
16+
import javax.lang.model.util.ElementFilter;
1317
import org.seasar.doma.internal.Constants;
1418
import org.seasar.doma.internal.apt.AptException;
1519
import org.seasar.doma.internal.apt.AptIllegalStateException;
@@ -40,7 +44,7 @@ public DataTypeMeta createTypeElementMeta(TypeElement typeElement) {
4044
DataTypeMeta dataTypeMeta = new DataTypeMeta(typeElement, typeElement.asType(), dataTypeAnnot);
4145
validateTypeElement(typeElement, dataTypeMeta);
4246
doTypeParameters(typeElement, dataTypeMeta);
43-
doValueType(typeElement, dataTypeMeta);
47+
doConstructor(typeElement, dataTypeMeta);
4448
return dataTypeMeta;
4549
}
4650

@@ -87,12 +91,23 @@ public void doTypeParameters(TypeElement typeElement, DataTypeMeta dataTypeMeta)
8791
dataTypeMeta.setTypeParametersDef(typeParametersDef);
8892
}
8993

90-
private void doValueType(TypeElement typeElement, DataTypeMeta dataTypeMeta) {
91-
VariableElement param =
92-
ctx.getMoreElements().getSingleParameterOfRecordConstructor(typeElement);
93-
if (param == null) {
94+
private void doConstructor(TypeElement typeElement, DataTypeMeta dataTypeMeta) {
95+
List<ExecutableElement> constructors =
96+
ElementFilter.constructorsIn(typeElement.getEnclosedElements()).stream()
97+
.filter(c -> !c.getModifiers().contains(Modifier.PRIVATE))
98+
.filter(c -> c.getParameters().size() == 1)
99+
.collect(Collectors.toList());
100+
if (constructors.isEmpty()) {
94101
throw new AptException(Message.DOMA4453, typeElement, new Object[] {});
95102
}
103+
if (constructors.size() > 1) {
104+
throw new AptException(Message.DOMA4456, typeElement, new Object[] {});
105+
}
106+
ExecutableElement constructor = constructors.iterator().next();
107+
VariableElement param = constructor.getParameters().iterator().next();
108+
if (param == null) {
109+
throw new AptIllegalStateException("param is null");
110+
}
96111
TypeMirror type = param.asType();
97112
BasicCtType basicCtType = ctx.getCtTypes().newBasicCtType(type);
98113
if (basicCtType == null) {

0 commit comments

Comments
 (0)