Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Prohibit multiple 1-arg constructors in DataType annotated record #614

Merged
merged 1 commit into from
Oct 17, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion doma-core/src/main/java/org/seasar/doma/message/Message.java
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -314,18 +313,6 @@ List<String> getTypeParameterNames(List<? extends TypeParameterElement> 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"))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -251,10 +255,19 @@ private DomainInfo getDomainInfo(Domain domain) {
}

private DomainInfo getDomainInfo(TypeElement typeElement, DataType dataType) {
VariableElement param =
ctx.getMoreElements().getSingleParameterOfRecordConstructor(typeElement);
List<ExecutableElement> 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);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}

Expand Down Expand Up @@ -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<ExecutableElement> 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) {
Expand Down