diff --git a/doma-core/src/main/java/org/seasar/doma/message/Message.java b/doma-core/src/main/java/org/seasar/doma/message/Message.java index 3a94f2c51..3f8035743 100644 --- a/doma-core/src/main/java/org/seasar/doma/message/Message.java +++ b/doma-core/src/main/java/org/seasar/doma/message/Message.java @@ -914,9 +914,10 @@ public enum Message implements MessageResource { DOMA4452( "The type \"{0}\" is a local or anonymous class. " + "The data type and its enclosing type must be a top level or member class."), - DOMA4453("The public constructor whose parameter size is one is not found."), + DOMA4453("The non-private 1-arg constructor is required."), DOMA4454("The parameter type \"{0}\" is not supported as a persistent type."), DOMA4455("The combination of the prefix=\"{0}\" and the suffix=\"\" is not allowed."), + DOMA4456("The non-private 1-arg constructor must be only one, but more than one found."), // other DOMA5001( diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/MoreElements.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/MoreElements.java index f766c80ea..8198aa053 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/MoreElements.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/MoreElements.java @@ -35,7 +35,6 @@ import javax.lang.model.util.SimpleElementVisitor8; import org.seasar.doma.ParameterName; import org.seasar.doma.internal.apt.def.TypeParametersDef; -import org.seasar.doma.internal.apt.util.ElementKindUtil; import org.seasar.doma.internal.util.Pair; import org.seasar.doma.internal.util.Zip; @@ -314,18 +313,6 @@ List getTypeParameterNames(List typePara return ctx.getMoreTypes().getTypeParameterNames(typeMirrors); } - public VariableElement getSingleParameterOfRecordConstructor(TypeElement record) { - if (!ElementKindUtil.isRecord(record.getKind())) { - throw new AptIllegalStateException(record.getQualifiedName() + " must be a record type."); - } - return ElementFilter.constructorsIn(record.getEnclosedElements()).stream() - .filter(c -> c.getModifiers().contains(Modifier.PUBLIC)) - .filter(c -> c.getParameters().size() == 1) - .flatMap(c -> c.getParameters().stream()) - .findFirst() - .orElse(null); - } - public boolean isVirtualDefaultMethod(TypeElement typeElement, ExecutableElement methodElement) { return ElementFilter.typesIn(typeElement.getEnclosedElements()).stream() .filter(t -> t.getSimpleName().contentEquals("DefaultImpls")) diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/cttype/CtTypes.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/cttype/CtTypes.java index 39ea2389c..84b28f07f 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/cttype/CtTypes.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/cttype/CtTypes.java @@ -31,8 +31,11 @@ import java.util.function.BiFunction; import java.util.function.Function; import java.util.stream.Collector; +import java.util.stream.Collectors; import java.util.stream.Stream; import javax.lang.model.element.ElementKind; +import javax.lang.model.element.ExecutableElement; +import javax.lang.model.element.Modifier; import javax.lang.model.element.Name; import javax.lang.model.element.TypeElement; import javax.lang.model.element.VariableElement; @@ -42,6 +45,7 @@ import javax.lang.model.type.PrimitiveType; import javax.lang.model.type.TypeKind; import javax.lang.model.type.TypeMirror; +import javax.lang.model.util.ElementFilter; import javax.lang.model.util.SimpleTypeVisitor8; import org.seasar.doma.Domain; import org.seasar.doma.Embeddable; @@ -251,10 +255,19 @@ private DomainInfo getDomainInfo(Domain domain) { } private DomainInfo getDomainInfo(TypeElement typeElement, DataType dataType) { - VariableElement param = - ctx.getMoreElements().getSingleParameterOfRecordConstructor(typeElement); + List constructors = + ElementFilter.constructorsIn(typeElement.getEnclosedElements()).stream() + .filter(c -> !c.getModifiers().contains(Modifier.PRIVATE)) + .filter(c -> c.getParameters().size() == 1) + .collect(Collectors.toList()); + if (constructors.size() != 1) { + throw new AptIllegalStateException( + String.format("%s : %d", typeElement.getQualifiedName(), constructors.size())); + } + ExecutableElement constructor = constructors.iterator().next(); + VariableElement param = constructor.getParameters().iterator().next(); if (param == null) { - throw new AptIllegalStateException(typeElement.getQualifiedName().toString()); + throw new AptIllegalStateException("param is null"); } return new DomainInfo(param.asType(), false); } diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/domain/DataTypeMetaFactory.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/domain/DataTypeMetaFactory.java index 8a7e0939a..681e423fa 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/domain/DataTypeMetaFactory.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/domain/DataTypeMetaFactory.java @@ -3,13 +3,17 @@ import static org.seasar.doma.internal.util.AssertionUtil.assertNotNull; import java.util.Arrays; +import java.util.List; import java.util.Set; +import java.util.stream.Collectors; import javax.lang.model.element.Element; +import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.Modifier; import javax.lang.model.element.NestingKind; import javax.lang.model.element.TypeElement; import javax.lang.model.element.VariableElement; import javax.lang.model.type.TypeMirror; +import javax.lang.model.util.ElementFilter; import org.seasar.doma.internal.Constants; import org.seasar.doma.internal.apt.AptException; import org.seasar.doma.internal.apt.AptIllegalStateException; @@ -40,7 +44,7 @@ public DataTypeMeta createTypeElementMeta(TypeElement typeElement) { DataTypeMeta dataTypeMeta = new DataTypeMeta(typeElement, typeElement.asType(), dataTypeAnnot); validateTypeElement(typeElement, dataTypeMeta); doTypeParameters(typeElement, dataTypeMeta); - doValueType(typeElement, dataTypeMeta); + doConstructor(typeElement, dataTypeMeta); return dataTypeMeta; } @@ -87,12 +91,23 @@ public void doTypeParameters(TypeElement typeElement, DataTypeMeta dataTypeMeta) dataTypeMeta.setTypeParametersDef(typeParametersDef); } - private void doValueType(TypeElement typeElement, DataTypeMeta dataTypeMeta) { - VariableElement param = - ctx.getMoreElements().getSingleParameterOfRecordConstructor(typeElement); - if (param == null) { + private void doConstructor(TypeElement typeElement, DataTypeMeta dataTypeMeta) { + List constructors = + ElementFilter.constructorsIn(typeElement.getEnclosedElements()).stream() + .filter(c -> !c.getModifiers().contains(Modifier.PRIVATE)) + .filter(c -> c.getParameters().size() == 1) + .collect(Collectors.toList()); + if (constructors.isEmpty()) { throw new AptException(Message.DOMA4453, typeElement, new Object[] {}); } + if (constructors.size() > 1) { + throw new AptException(Message.DOMA4456, typeElement, new Object[] {}); + } + ExecutableElement constructor = constructors.iterator().next(); + VariableElement param = constructor.getParameters().iterator().next(); + if (param == null) { + throw new AptIllegalStateException("param is null"); + } TypeMirror type = param.asType(); BasicCtType basicCtType = ctx.getCtTypes().newBasicCtType(type); if (basicCtType == null) {