From 29cad76528e70783d075821bffa0d10da1e24903 Mon Sep 17 00:00:00 2001 From: orekyuu Date: Mon, 4 Jan 2021 23:31:45 +0900 Subject: [PATCH 01/31] Add scope parameter to Metamodel. --- doma-core/src/main/java/org/seasar/doma/Metamodel.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doma-core/src/main/java/org/seasar/doma/Metamodel.java b/doma-core/src/main/java/org/seasar/doma/Metamodel.java index dd8019f31..dc0f2d9c2 100644 --- a/doma-core/src/main/java/org/seasar/doma/Metamodel.java +++ b/doma-core/src/main/java/org/seasar/doma/Metamodel.java @@ -31,4 +31,7 @@ /** @return the suffix for the metamodel class */ String suffix() default ""; + + /** @return the scope class array */ + Class[] scope() default {}; } From 2c7a4be227e5dd20cc69d8fae368c94489056383 Mon Sep 17 00:00:00 2001 From: orekyuu Date: Sat, 9 Jan 2021 23:47:35 +0900 Subject: [PATCH 02/31] =?UTF-8?q?Scope=E3=81=AE=E3=83=86=E3=82=B9=E3=83=88?= =?UTF-8?q?=E3=82=92=E7=94=A8=E6=84=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../doma/internal/apt/CompilerSupport.java | 15 ++++- .../apt/processor/metamodel/ScopeTest.java | 66 +++++++++++++++++++ .../apt/processor/entity/ScopedEntity.java | 26 ++++++++ 3 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest.java create mode 100644 doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/ScopedEntity.java diff --git a/doma-processor/src/test/java/org/seasar/doma/internal/apt/CompilerSupport.java b/doma-processor/src/test/java/org/seasar/doma/internal/apt/CompilerSupport.java index 740813631..75cde01de 100644 --- a/doma-processor/src/test/java/org/seasar/doma/internal/apt/CompilerSupport.java +++ b/doma-processor/src/test/java/org/seasar/doma/internal/apt/CompilerSupport.java @@ -1,8 +1,9 @@ package org.seasar.doma.internal.apt; -import java.io.IOException; +import java.io.*; import java.net.URL; import java.util.List; +import java.util.stream.Collectors; import javax.annotation.processing.Processor; import javax.tools.Diagnostic; import javax.tools.JavaFileObject; @@ -40,6 +41,18 @@ protected void addCompilationUnit(final Class clazz) { compiler.addCompilationUnit(clazz); } + protected void addResourceFileCompilationUnit(final String fqn) { + String fileName = fqn.replace(".", "/") + ".java"; + try ( + InputStream in = getClass().getClassLoader().getResourceAsStream(fileName); + BufferedReader reader = new BufferedReader(new InputStreamReader(in))) { + String source = reader.lines().collect(Collectors.joining("\n")); + compiler.addCompilationUnit(fqn, source); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + } + protected void compile() throws IOException { compiler.compile(); } diff --git a/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest.java b/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest.java new file mode 100644 index 000000000..abf704d69 --- /dev/null +++ b/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest.java @@ -0,0 +1,66 @@ +package org.seasar.doma.internal.apt.processor.metamodel; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.TestTemplate; +import org.junit.jupiter.api.extension.*; +import org.seasar.doma.internal.apt.CompilerSupport; +import org.seasar.doma.internal.apt.SimpleParameterResolver; +import org.seasar.doma.internal.apt.processor.EntityProcessor; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class ScopeTest extends CompilerSupport { + + @BeforeEach + void setup() { + addOption("-Adoma.test=true"); + addOption("-Adoma.metamodel.enabled=true"); + } + + @TestTemplate + @ExtendWith(ScopeTest.SuccessInvocationContextProvider.class) + void success(String fqn, String[] options) throws Exception { + addOption(options); + addProcessor(new EntityProcessor()); + addResourceFileCompilationUnit(fqn); + compile(); + assertTrue(getCompiledResult()); + } + + static class SuccessInvocationContextProvider implements TestTemplateInvocationContextProvider { + @Override + public boolean supportsTestTemplate(ExtensionContext context) { + return true; + } + + @Override + public Stream provideTestTemplateInvocationContexts( + ExtensionContext context) { + return Stream.of( + invocationContext("org.seasar.doma.internal.apt.processor.entity.ScopedEntity") + ); + } + + private TestTemplateInvocationContext invocationContext( + String classFqn, String... options) { + return new TestTemplateInvocationContext() { + @Override + public String getDisplayName(int invocationIndex) { + String[] split = classFqn.split("\\."); + return split[split.length - 1]; + } + + @Override + public List getAdditionalExtensions() { + return Arrays.asList( + new SimpleParameterResolver(classFqn), + new SimpleParameterResolver(options)); + } + }; + } + } +} diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/ScopedEntity.java b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/ScopedEntity.java new file mode 100644 index 000000000..7fa1f098b --- /dev/null +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/ScopedEntity.java @@ -0,0 +1,26 @@ +package org.seasar.doma.internal.apt.processor.entity; + +import org.seasar.doma.Entity; +import org.seasar.doma.Metamodel; + +@Entity(metamodel = @Metamodel(scope = {})) +class ScopedEntity { + Long id; + String name; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} \ No newline at end of file From fdcfc491b23d448a897f3790253d2dfe517ba814 Mon Sep 17 00:00:00 2001 From: orekyuu Date: Sun, 10 Jan 2021 14:19:26 +0900 Subject: [PATCH 03/31] =?UTF-8?q?ScopeClass=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apt/processor/metamodel/ScopeTest.java | 14 +++++++++----- .../internal/apt/processor/entity/ScopeClass.java | 4 ++++ .../apt/processor/entity/ScopedEntity.java | 2 +- 3 files changed, 14 insertions(+), 6 deletions(-) create mode 100644 doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/ScopeClass.java diff --git a/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest.java b/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest.java index abf704d69..2be748e64 100644 --- a/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest.java +++ b/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest.java @@ -23,9 +23,11 @@ void setup() { @TestTemplate @ExtendWith(ScopeTest.SuccessInvocationContextProvider.class) - void success(String fqn, String[] options) throws Exception { - addOption(options); + void success(String fqn, String[] otherClasses) throws Exception { addProcessor(new EntityProcessor()); + for (String otherClass : otherClasses) { + addResourceFileCompilationUnit(otherClass); + } addResourceFileCompilationUnit(fqn); compile(); assertTrue(getCompiledResult()); @@ -41,12 +43,14 @@ public boolean supportsTestTemplate(ExtensionContext context) { public Stream provideTestTemplateInvocationContexts( ExtensionContext context) { return Stream.of( - invocationContext("org.seasar.doma.internal.apt.processor.entity.ScopedEntity") + invocationContext( + "org.seasar.doma.internal.apt.processor.entity.ScopedEntity", + "org.seasar.doma.internal.apt.processor.entity.ScopeClass") ); } private TestTemplateInvocationContext invocationContext( - String classFqn, String... options) { + String classFqn, String... otherClasses) { return new TestTemplateInvocationContext() { @Override public String getDisplayName(int invocationIndex) { @@ -58,7 +62,7 @@ public String getDisplayName(int invocationIndex) { public List getAdditionalExtensions() { return Arrays.asList( new SimpleParameterResolver(classFqn), - new SimpleParameterResolver(options)); + new SimpleParameterResolver(otherClasses)); } }; } diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/ScopeClass.java b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/ScopeClass.java new file mode 100644 index 000000000..59c36547d --- /dev/null +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/ScopeClass.java @@ -0,0 +1,4 @@ +package org.seasar.doma.internal.apt.processor.entity; + +class ScopeClass { +} \ No newline at end of file diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/ScopedEntity.java b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/ScopedEntity.java index 7fa1f098b..ad27be964 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/ScopedEntity.java +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/ScopedEntity.java @@ -3,7 +3,7 @@ import org.seasar.doma.Entity; import org.seasar.doma.Metamodel; -@Entity(metamodel = @Metamodel(scope = {})) +@Entity(metamodel = @Metamodel(scope = {ScopeClass.class})) class ScopedEntity { Long id; String name; From 646de7186bddcd7aa5d22bdd0011e1b083c00478 Mon Sep 17 00:00:00 2001 From: orekyuu Date: Sun, 10 Jan 2021 14:24:47 +0900 Subject: [PATCH 04/31] =?UTF-8?q?ScopeClass=E3=81=ABscope=E3=83=A1?= =?UTF-8?q?=E3=82=BD=E3=83=83=E3=83=89=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../doma/internal/apt/processor/entity/ScopeClass.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/ScopeClass.java b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/ScopeClass.java index 59c36547d..becea090c 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/ScopeClass.java +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/ScopeClass.java @@ -1,4 +1,13 @@ package org.seasar.doma.internal.apt.processor.entity; +import org.seasar.doma.jdbc.criteria.declaration.WhereDeclaration; +import java.util.function.Consumer; + class ScopeClass { + + public Consumer searchByName(ScopedEntity_ e, String text) { + return w -> { + w.like(e.name, "%" + text + "%"); + }; + } } \ No newline at end of file From 2a4eed9f671561c114faac15a6189905932634f1 Mon Sep 17 00:00:00 2001 From: orekyuu Date: Sun, 10 Jan 2021 14:41:36 +0900 Subject: [PATCH 05/31] =?UTF-8?q?=E7=94=9F=E6=88=90=E3=81=95=E3=82=8C?= =?UTF-8?q?=E3=81=9Fmetamodel=E3=81=AE=E6=83=85=E5=A0=B1=E3=82=92=E3=83=86?= =?UTF-8?q?=E3=82=B9=E3=83=88=E3=81=A7=E3=81=8D=E3=82=8B=E3=82=88=E3=81=86?= =?UTF-8?q?=E3=81=AB=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apt/ResourceParameterResolver.java | 11 +++-- .../apt/processor/metamodel/ScopeTest.java | 13 ++++-- .../metamodel/ScopeTest_ScopedEntity.txt | 43 +++++++++++++++++++ 3 files changed, 61 insertions(+), 6 deletions(-) create mode 100644 doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest_ScopedEntity.txt diff --git a/doma-processor/src/test/java/org/seasar/doma/internal/apt/ResourceParameterResolver.java b/doma-processor/src/test/java/org/seasar/doma/internal/apt/ResourceParameterResolver.java index 228526b0b..41f86d57b 100644 --- a/doma-processor/src/test/java/org/seasar/doma/internal/apt/ResourceParameterResolver.java +++ b/doma-processor/src/test/java/org/seasar/doma/internal/apt/ResourceParameterResolver.java @@ -7,15 +7,20 @@ import org.junit.jupiter.api.extension.ParameterContext; import org.junit.jupiter.api.extension.ParameterResolutionException; import org.junit.jupiter.api.extension.ParameterResolver; +import org.seasar.doma.internal.ClassName; import org.seasar.doma.internal.util.ResourceUtil; public class ResourceParameterResolver implements ParameterResolver { - private final Class clazz; + private final String className; public ResourceParameterResolver(Class clazz) { + this(clazz.getSimpleName()); + } + + public ResourceParameterResolver(String clazz) { assertNotNull(clazz); - this.clazz = clazz; + this.className = new ClassName(clazz).getSimpleName(); } @Override @@ -31,7 +36,7 @@ public Object resolveParameter( throws ParameterResolutionException { Class testClass = extensionContext.getTestClass().orElseThrow(AssertionError::new); String prefix = testClass.getName().replace(".", "/"); - String path = String.format("%s_%s.txt", prefix, clazz.getSimpleName()); + String path = String.format("%s_%s.txt", prefix, className); return ResourceUtil.getResource(path); } } diff --git a/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest.java b/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest.java index 2be748e64..48a24d4d1 100644 --- a/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest.java +++ b/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest.java @@ -3,10 +3,14 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.TestTemplate; import org.junit.jupiter.api.extension.*; +import org.seasar.doma.internal.ClassName; +import org.seasar.doma.internal.ClassNames; import org.seasar.doma.internal.apt.CompilerSupport; +import org.seasar.doma.internal.apt.ResourceParameterResolver; import org.seasar.doma.internal.apt.SimpleParameterResolver; import org.seasar.doma.internal.apt.processor.EntityProcessor; +import java.net.URL; import java.util.Arrays; import java.util.List; import java.util.stream.Stream; @@ -23,13 +27,16 @@ void setup() { @TestTemplate @ExtendWith(ScopeTest.SuccessInvocationContextProvider.class) - void success(String fqn, String[] otherClasses) throws Exception { + void success(String fqn, String[] otherClasses, URL expected) throws Exception { addProcessor(new EntityProcessor()); for (String otherClass : otherClasses) { addResourceFileCompilationUnit(otherClass); } addResourceFileCompilationUnit(fqn); compile(); + String metamodel = ClassNames.newEntityMetamodelClassNameBuilder(fqn, "", "_") + .toString(); + assertEqualsGeneratedSourceWithResource(expected, metamodel); assertTrue(getCompiledResult()); } @@ -54,13 +61,13 @@ private TestTemplateInvocationContext invocationContext( return new TestTemplateInvocationContext() { @Override public String getDisplayName(int invocationIndex) { - String[] split = classFqn.split("\\."); - return split[split.length - 1]; + return new ClassName(classFqn).getSimpleName(); } @Override public List getAdditionalExtensions() { return Arrays.asList( + new ResourceParameterResolver(classFqn), new SimpleParameterResolver(classFqn), new SimpleParameterResolver(otherClasses)); } diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest_ScopedEntity.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest_ScopedEntity.txt new file mode 100644 index 000000000..293a0355a --- /dev/null +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest_ScopedEntity.txt @@ -0,0 +1,43 @@ +package org.seasar.doma.internal.apt.processor.entity; + +/** */ +@javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") +public final class ScopedEntity_ implements org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel { + + static { + org.seasar.doma.internal.Artifact.validateVersion("@VERSION@"); + } + + private final String __qualifiedTableName; + + private final org.seasar.doma.internal.apt.processor.entity._ScopedEntity __entityType = org.seasar.doma.internal.apt.processor.entity._ScopedEntity.getSingletonInternal(); + + private final java.util.List> __allPropertyMetamodels; + + public final org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel id = new org.seasar.doma.jdbc.criteria.metamodel.DefaultPropertyMetamodel(java.lang.Long.class, __entityType, "id"); + + public final org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel name = new org.seasar.doma.jdbc.criteria.metamodel.DefaultPropertyMetamodel(java.lang.String.class, __entityType, "name"); + + public ScopedEntity_() { + this(""); + } + + public ScopedEntity_(String qualifiedTableName) { + this.__qualifiedTableName = java.util.Objects.requireNonNull(qualifiedTableName); + java.util.ArrayList> __list = new java.util.ArrayList<>(2); + __list.add(id); + __list.add(name); + __allPropertyMetamodels = java.util.Collections.unmodifiableList(__list); + } + + @Override + public org.seasar.doma.jdbc.entity.EntityType asType() { + return __qualifiedTableName.isEmpty() ? __entityType : new org.seasar.doma.jdbc.criteria.metamodel.EntityTypeProxy<>(__entityType, __qualifiedTableName); + } + + @Override + public java.util.List> allPropertyMetamodels() { + return __allPropertyMetamodels; + } + +} From e662cf57ef7b92607b3db01de59c7f4dab6e2f7b Mon Sep 17 00:00:00 2001 From: orekyuu Date: Sun, 10 Jan 2021 16:53:20 +0900 Subject: [PATCH 06/31] =?UTF-8?q?scope=20field=E3=81=AE=E7=94=9F=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../internal/apt/annot/MetamodelAnnot.java | 28 ++++++++++++++++--- .../generator/EntityMetamodelGenerator.java | 22 +++++++++++---- .../internal/apt/meta/entity/EntityMeta.java | 24 +++++++++++----- .../apt/meta/entity/EntityMetaScope.java | 20 +++++++++++++ .../metamodel/ScopeTest_ScopedEntity.txt | 2 ++ 5 files changed, 80 insertions(+), 16 deletions(-) create mode 100644 doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityMetaScope.java diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/MetamodelAnnot.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/MetamodelAnnot.java index c85760f27..50b3c4d18 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/MetamodelAnnot.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/MetamodelAnnot.java @@ -1,12 +1,18 @@ package org.seasar.doma.internal.apt.annot; -import static org.seasar.doma.internal.util.AssertionUtil.assertNonNullValue; +import org.seasar.doma.internal.ClassName; +import org.seasar.doma.internal.ClassNames; +import org.seasar.doma.internal.apt.AptIllegalStateException; +import org.seasar.doma.internal.apt.util.AnnotationValueUtil; -import java.util.Map; import javax.lang.model.element.AnnotationMirror; import javax.lang.model.element.AnnotationValue; -import org.seasar.doma.internal.apt.AptIllegalStateException; -import org.seasar.doma.internal.apt.util.AnnotationValueUtil; +import javax.lang.model.type.TypeMirror; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import static org.seasar.doma.internal.util.AssertionUtil.assertNonNullValue; public class MetamodelAnnot extends AbstractAnnot { @@ -14,14 +20,19 @@ public class MetamodelAnnot extends AbstractAnnot { private static final String SUFFIX = "suffix"; + private static final String SCOPE = "scope"; + private final AnnotationValue prefix; private final AnnotationValue suffix; + private final AnnotationValue scopeClasses; + MetamodelAnnot(AnnotationMirror annotationMirror, Map values) { super(annotationMirror); this.prefix = assertNonNullValue(values, PREFIX); this.suffix = assertNonNullValue(values, SUFFIX); + this.scopeClasses = assertNonNullValue(values, SCOPE); } public AnnotationValue getPrefix() { @@ -47,4 +58,13 @@ public String getSuffixValue() { } return value; } + + public List getScopeValue() { + List type = AnnotationValueUtil.toTypeList(scopeClasses); + return type.stream() + .map(TypeMirror::toString) + .map(ClassNames::normalizeBinaryName) + .map(ClassName::new) + .collect(Collectors.toList()); + } } diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java index 6964b0bc2..2365a412c 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java @@ -1,16 +1,12 @@ package org.seasar.doma.internal.apt.generator; -import static org.seasar.doma.internal.util.AssertionUtil.assertNotNull; - -import javax.lang.model.element.Name; -import javax.lang.model.element.TypeElement; -import javax.lang.model.type.TypeMirror; import org.seasar.doma.internal.ClassName; import org.seasar.doma.internal.ClassNames; import org.seasar.doma.internal.apt.AptIllegalStateException; import org.seasar.doma.internal.apt.Context; import org.seasar.doma.internal.apt.cttype.CtType; import org.seasar.doma.internal.apt.meta.entity.EntityMeta; +import org.seasar.doma.internal.apt.meta.entity.EntityMetaScope; import org.seasar.doma.internal.apt.meta.entity.EntityPropertyMeta; import org.seasar.doma.internal.util.Pair; import org.seasar.doma.jdbc.criteria.metamodel.DefaultPropertyMetamodel; @@ -19,6 +15,13 @@ import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel; import org.seasar.doma.jdbc.entity.EntityType; +import javax.lang.model.element.Name; +import javax.lang.model.element.TypeElement; +import javax.lang.model.type.TypeMirror; +import java.util.List; + +import static org.seasar.doma.internal.util.AssertionUtil.assertNotNull; + public class EntityMetamodelGenerator extends AbstractGenerator { private final EntityMeta entityMeta; @@ -70,6 +73,7 @@ private void printFields() { printEntityTypeField(); printAllPropertyMetamodelsFields(); printPropertyMetamodelFields(); + printScopeField(); } private void printEntityTypeField() { @@ -89,6 +93,14 @@ private void printQualifiedTableNameField() { print("%n"); } + private void printScopeField() { + List scopes = entityMeta.getAllMetaScope(); + for (EntityMetaScope scope : scopes) { + iprint("private final %1$s %2$s = new %1$s();%n", scope.scopeClass(), scope.scopeField()); + } + print("%n"); + } + private void printConstructors() { printNoArgsConstructor(); printOneArgConstructor(); diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityMeta.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityMeta.java index b1f173375..64f7d435d 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityMeta.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityMeta.java @@ -1,18 +1,21 @@ package org.seasar.doma.internal.apt.meta.entity; -import static org.seasar.doma.internal.util.AssertionUtil.assertNotNull; - -import java.util.ArrayList; -import java.util.List; -import javax.lang.model.element.Modifier; -import javax.lang.model.element.TypeElement; -import javax.lang.model.type.TypeMirror; +import org.seasar.doma.internal.ClassName; import org.seasar.doma.internal.apt.annot.EntityAnnot; import org.seasar.doma.internal.apt.annot.TableAnnot; import org.seasar.doma.internal.apt.meta.TypeElementMeta; import org.seasar.doma.jdbc.entity.NamingType; import org.seasar.doma.jdbc.entity.NullEntityListener; +import javax.lang.model.element.Modifier; +import javax.lang.model.element.TypeElement; +import javax.lang.model.type.TypeMirror; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +import static org.seasar.doma.internal.util.AssertionUtil.assertNotNull; + public class EntityMeta implements TypeElementMeta { private final List allPropertyMetas = new ArrayList<>(); @@ -116,6 +119,13 @@ public List getIdPropertyMetas() { return idPropertyMetas; } + public List getAllMetaScope() { + List scopeClasses = getEntityAnnot().getMetamodelValue().getScopeValue(); + return scopeClasses.stream() + .map(EntityMetaScope::new) + .collect(Collectors.toList()); + } + public boolean hasVersionPropertyMeta() { return versionPropertyMeta != null; } diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityMetaScope.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityMetaScope.java new file mode 100644 index 000000000..45f26c96c --- /dev/null +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityMetaScope.java @@ -0,0 +1,20 @@ +package org.seasar.doma.internal.apt.meta.entity; + +import org.seasar.doma.internal.ClassName; + +public class EntityMetaScope { + final ClassName scopeClass; + + public EntityMetaScope(ClassName scopeClass) { + this.scopeClass = scopeClass; + } + + public ClassName scopeClass() { + return scopeClass; + } + + public String scopeField() { + String name = scopeClass.getSimpleName(); + return "_scope_" + name; + } +} diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest_ScopedEntity.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest_ScopedEntity.txt index 293a0355a..69be8bce2 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest_ScopedEntity.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest_ScopedEntity.txt @@ -18,6 +18,8 @@ public final class ScopedEntity_ implements org.seasar.doma.jdbc.criteria.metamo public final org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel name = new org.seasar.doma.jdbc.criteria.metamodel.DefaultPropertyMetamodel(java.lang.String.class, __entityType, "name"); + private final org.seasar.doma.internal.apt.processor.entity.ScopeClass _scope_ScopeClass = new org.seasar.doma.internal.apt.processor.entity.ScopeClass(); + public ScopedEntity_() { this(""); } From 5e701748940c8083a09a15d55b9c4f3e24b02582 Mon Sep 17 00:00:00 2001 From: orekyuu Date: Sun, 10 Jan 2021 23:36:57 +0900 Subject: [PATCH 07/31] =?UTF-8?q?scope=20method=E3=81=AE=E7=94=9F=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../internal/apt/annot/MetamodelAnnot.java | 8 +- .../doma/internal/apt/annot/ScopeClass.java | 28 +++++ .../internal/apt/decl/MethodDeclaration.java | 8 +- .../internal/apt/decl/TypeDeclaration.java | 101 +++++++++++------- .../generator/EntityMetamodelGenerator.java | 21 ++++ .../internal/apt/meta/entity/EntityMeta.java | 4 +- .../apt/meta/entity/EntityMetaScope.java | 10 +- .../apt/processor/entity/ScopeClass.java | 4 +- .../metamodel/ScopeTest_ScopedEntity.txt | 4 + 9 files changed, 133 insertions(+), 55 deletions(-) create mode 100644 doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/ScopeClass.java diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/MetamodelAnnot.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/MetamodelAnnot.java index 50b3c4d18..072e2ed4d 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/MetamodelAnnot.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/MetamodelAnnot.java @@ -1,7 +1,5 @@ package org.seasar.doma.internal.apt.annot; -import org.seasar.doma.internal.ClassName; -import org.seasar.doma.internal.ClassNames; import org.seasar.doma.internal.apt.AptIllegalStateException; import org.seasar.doma.internal.apt.util.AnnotationValueUtil; @@ -59,12 +57,10 @@ public String getSuffixValue() { return value; } - public List getScopeValue() { + public List getScopeValue() { List type = AnnotationValueUtil.toTypeList(scopeClasses); return type.stream() - .map(TypeMirror::toString) - .map(ClassNames::normalizeBinaryName) - .map(ClassName::new) + .map(ScopeClass::new) .collect(Collectors.toList()); } } diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/ScopeClass.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/ScopeClass.java new file mode 100644 index 000000000..a3905ff7d --- /dev/null +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/ScopeClass.java @@ -0,0 +1,28 @@ +package org.seasar.doma.internal.apt.annot; + +import org.seasar.doma.internal.ClassName; +import org.seasar.doma.internal.ClassNames; + +import javax.lang.model.type.TypeMirror; + +public class ScopeClass { + final TypeMirror type; + + public ScopeClass(TypeMirror type) { + this.type = type; + } + + public ClassName className() { + String binaryName = ClassNames.normalizeBinaryName(type.toString()); + return new ClassName(binaryName); + } + + public TypeMirror asType() { + return type; + } + + @Override + public String toString() { + return className().toString(); + } +} diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/MethodDeclaration.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/MethodDeclaration.java index 96d59f711..1896690aa 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/MethodDeclaration.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/MethodDeclaration.java @@ -1,10 +1,10 @@ package org.seasar.doma.internal.apt.decl; -import static org.seasar.doma.internal.util.AssertionUtil.*; - import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.Modifier; +import static org.seasar.doma.internal.util.AssertionUtil.assertNotNull; + public class MethodDeclaration { private final ExecutableElement element; @@ -28,4 +28,8 @@ public TypeDeclaration getReturnTypeDeclaration() { public boolean isStatic() { return element.getModifiers().contains(Modifier.STATIC); } + + public String name() { + return element.getSimpleName().toString(); + } } diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/TypeDeclaration.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/TypeDeclaration.java index a048dd57d..66cab7162 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/TypeDeclaration.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/TypeDeclaration.java @@ -1,33 +1,25 @@ package org.seasar.doma.internal.apt.decl; -import static java.util.stream.Collectors.toList; -import static javax.lang.model.util.ElementFilter.*; -import static org.seasar.doma.internal.util.AssertionUtil.assertNotNull; -import static org.seasar.doma.internal.util.AssertionUtil.assertTrue; - -import java.math.BigDecimal; -import java.math.BigInteger; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import javax.lang.model.element.*; -import javax.lang.model.type.TypeKind; -import javax.lang.model.type.TypeMirror; import org.seasar.doma.internal.apt.Context; import org.seasar.doma.internal.apt.MoreTypes; -import org.seasar.doma.internal.apt.cttype.ArrayCtType; -import org.seasar.doma.internal.apt.cttype.BasicCtType; -import org.seasar.doma.internal.apt.cttype.CtType; -import org.seasar.doma.internal.apt.cttype.DomainCtType; -import org.seasar.doma.internal.apt.cttype.IterableCtType; -import org.seasar.doma.internal.apt.cttype.SimpleCtTypeVisitor; +import org.seasar.doma.internal.apt.annot.ScopeClass; +import org.seasar.doma.internal.apt.cttype.*; import org.seasar.doma.internal.util.Pair; import org.seasar.doma.internal.util.Zip; +import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel; + +import javax.lang.model.element.*; +import javax.lang.model.type.TypeKind; +import javax.lang.model.type.TypeMirror; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.util.*; +import java.util.function.Predicate; + +import static java.util.stream.Collectors.toList; +import static javax.lang.model.util.ElementFilter.*; +import static org.seasar.doma.internal.util.AssertionUtil.assertNotNull; +import static org.seasar.doma.internal.util.AssertionUtil.assertTrue; public class TypeDeclaration { @@ -226,6 +218,35 @@ private void removeHiddenFieldDeclarations(List candidates) { } } + public List getScopeMethods(ScopeClass scopeClass) { + return getMethods(m -> isScopeMethod(m, scopeClass)); + } + + public boolean isScopeMethod(ExecutableElement m, ScopeClass scopeClass) { + if (m.getModifiers().contains(Modifier.STATIC)) { + return false; + } + + if (!m.getModifiers().contains(Modifier.PUBLIC)) { + return false; + } + + if (m.getReturnType().getKind() == TypeKind.VOID) { + return false; + } + + if (m.getParameters().size() < 1) { + return false; + } + + VariableElement firstParameter = m.getParameters().get(0); + if (!ctx.getMoreTypes().isAssignableWithErasure(firstParameter.asType(), EntityMetamodel.class)) { + return false; + } + + return true; + } + public Optional getMethodDeclaration( String name, List parameterTypeDeclarations) { return getMethodDeclarationInternal(name, parameterTypeDeclarations, false); @@ -247,21 +268,25 @@ private Optional getMethodDeclarationInternal( private List getCandidateMethodDeclarations( String name, List parameterTypeDeclarations, boolean statik) { + return getMethods(m -> (!statik || m.getModifiers().contains(Modifier.STATIC)) && + m.getModifiers().contains(Modifier.PUBLIC) && + m.getSimpleName().contentEquals(name) && + m.getReturnType().getKind() != TypeKind.VOID && + m.getParameters().size() == parameterTypeDeclarations.size() && + isAssignable(parameterTypeDeclarations, m.getParameters())); + } + + private List getMethods(Predicate predicate) { return typeParameterDeclarationsMap.entrySet().stream() - .map(e -> new Pair<>(e.getKey(), e.getValue())) - .map(p -> new Pair<>(ctx.getMoreElements().getTypeElement(p.fst), p.snd)) - .filter(p -> Objects.nonNull(p.fst)) - .flatMap( - p -> - methodsIn(p.fst.getEnclosedElements()).stream() - .filter(m -> !statik || m.getModifiers().contains(Modifier.STATIC)) - .filter(m -> m.getModifiers().contains(Modifier.PUBLIC)) - .filter(m -> m.getSimpleName().contentEquals(name)) - .filter(m -> m.getReturnType().getKind() != TypeKind.VOID) - .filter(m -> m.getParameters().size() == parameterTypeDeclarations.size()) - .filter(m -> isAssignable(parameterTypeDeclarations, m.getParameters())) - .map(m -> ctx.getDeclarations().newMethodDeclaration(m, p.snd))) - .collect(toList()); + .map(e -> new Pair<>(e.getKey(), e.getValue())) + .map(p -> new Pair<>(ctx.getMoreElements().getTypeElement(p.fst), p.snd)) + .filter(p -> Objects.nonNull(p.fst)) + .flatMap( + p -> + methodsIn(p.fst.getEnclosedElements()).stream() + .filter(predicate) + .map(m -> ctx.getDeclarations().newMethodDeclaration(m, p.snd))) + .collect(toList()); } private void removeOverriddenMethodDeclarations(List candidates) { diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java index 2365a412c..58fe3b943 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java @@ -5,6 +5,8 @@ import org.seasar.doma.internal.apt.AptIllegalStateException; import org.seasar.doma.internal.apt.Context; import org.seasar.doma.internal.apt.cttype.CtType; +import org.seasar.doma.internal.apt.decl.MethodDeclaration; +import org.seasar.doma.internal.apt.decl.TypeDeclaration; import org.seasar.doma.internal.apt.meta.entity.EntityMeta; import org.seasar.doma.internal.apt.meta.entity.EntityMetaScope; import org.seasar.doma.internal.apt.meta.entity.EntityPropertyMeta; @@ -169,6 +171,7 @@ private ClassName createEmbeddableTypeClassName(EntityPropertyMeta p) { private void printMethods() { printAsTypeMethod(); printAllPropertyMetamodelsMethod(); + printScopeMethods(); } private void printAsTypeMethod() { @@ -192,4 +195,22 @@ private void printAllPropertyMetamodelsMethod() { iprint("}%n"); print("%n"); } + + private void printScopeMethods() { + for (EntityMetaScope scope : entityMeta.getAllMetaScope()) { + TypeDeclaration declaration = ctx.getDeclarations().newTypeDeclaration(scope.scopeClass().asType()); + printScopeMethods(scope, declaration); + } + } + + private void printScopeMethods(EntityMetaScope scope, TypeDeclaration type) { + for (MethodDeclaration method : type.getScopeMethods(scope.scopeClass())) { + iprint("public %1$s %2$s() {%n", method.getReturnTypeDeclaration(), method.name()); + indent(); + iprint("return %1$s.%2$s(this);%n", scope.scopeField(), method.name()); + unindent(); + iprint("}%n"); + print("%n"); + } + } } diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityMeta.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityMeta.java index 64f7d435d..042be554d 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityMeta.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityMeta.java @@ -1,7 +1,7 @@ package org.seasar.doma.internal.apt.meta.entity; -import org.seasar.doma.internal.ClassName; import org.seasar.doma.internal.apt.annot.EntityAnnot; +import org.seasar.doma.internal.apt.annot.ScopeClass; import org.seasar.doma.internal.apt.annot.TableAnnot; import org.seasar.doma.internal.apt.meta.TypeElementMeta; import org.seasar.doma.jdbc.entity.NamingType; @@ -120,7 +120,7 @@ public List getIdPropertyMetas() { } public List getAllMetaScope() { - List scopeClasses = getEntityAnnot().getMetamodelValue().getScopeValue(); + List scopeClasses = getEntityAnnot().getMetamodelValue().getScopeValue(); return scopeClasses.stream() .map(EntityMetaScope::new) .collect(Collectors.toList()); diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityMetaScope.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityMetaScope.java index 45f26c96c..eea1b9ca4 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityMetaScope.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityMetaScope.java @@ -1,20 +1,20 @@ package org.seasar.doma.internal.apt.meta.entity; -import org.seasar.doma.internal.ClassName; +import org.seasar.doma.internal.apt.annot.ScopeClass; public class EntityMetaScope { - final ClassName scopeClass; + final ScopeClass scopeClass; - public EntityMetaScope(ClassName scopeClass) { + public EntityMetaScope(ScopeClass scopeClass) { this.scopeClass = scopeClass; } - public ClassName scopeClass() { + public ScopeClass scopeClass() { return scopeClass; } public String scopeField() { - String name = scopeClass.getSimpleName(); + String name = scopeClass().className().getSimpleName(); return "_scope_" + name; } } diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/ScopeClass.java b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/ScopeClass.java index becea090c..2914cf2ff 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/ScopeClass.java +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/ScopeClass.java @@ -5,9 +5,9 @@ class ScopeClass { - public Consumer searchByName(ScopedEntity_ e, String text) { + public Consumer startWithHoge(ScopedEntity_ e) { return w -> { - w.like(e.name, "%" + text + "%"); + w.like(e.name, "hoge%"); }; } } \ No newline at end of file diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest_ScopedEntity.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest_ScopedEntity.txt index 69be8bce2..0a516359a 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest_ScopedEntity.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest_ScopedEntity.txt @@ -42,4 +42,8 @@ public final class ScopedEntity_ implements org.seasar.doma.jdbc.criteria.metamo return __allPropertyMetamodels; } + public java.util.function.Consumer startWithHoge() { + return _scope_ScopeClass.startWithHoge(this); + } + } From 2ce2949d4ff3ebc9fc6ef5ef2f3d6c22754eed69 Mon Sep 17 00:00:00 2001 From: orekyuu Date: Mon, 11 Jan 2021 16:01:49 +0900 Subject: [PATCH 08/31] =?UTF-8?q?null=E3=83=81=E3=82=A7=E3=83=83=E3=82=AF?= =?UTF-8?q?=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../seasar/doma/internal/apt/meta/entity/EntityMeta.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityMeta.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityMeta.java index 042be554d..883f4bf93 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityMeta.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityMeta.java @@ -1,6 +1,7 @@ package org.seasar.doma.internal.apt.meta.entity; import org.seasar.doma.internal.apt.annot.EntityAnnot; +import org.seasar.doma.internal.apt.annot.MetamodelAnnot; import org.seasar.doma.internal.apt.annot.ScopeClass; import org.seasar.doma.internal.apt.annot.TableAnnot; import org.seasar.doma.internal.apt.meta.TypeElementMeta; @@ -11,6 +12,7 @@ import javax.lang.model.element.TypeElement; import javax.lang.model.type.TypeMirror; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @@ -120,7 +122,11 @@ public List getIdPropertyMetas() { } public List getAllMetaScope() { - List scopeClasses = getEntityAnnot().getMetamodelValue().getScopeValue(); + MetamodelAnnot metamodelValue = getEntityAnnot().getMetamodelValue(); + if (metamodelValue == null) { + return Collections.emptyList(); + } + List scopeClasses = metamodelValue.getScopeValue(); return scopeClasses.stream() .map(EntityMetaScope::new) .collect(Collectors.toList()); From c6259a3df151d47a56461faa4f1c14e0d912a7a8 Mon Sep 17 00:00:00 2001 From: orekyuu Date: Mon, 11 Jan 2021 16:02:19 +0900 Subject: [PATCH 09/31] =?UTF-8?q?=E6=94=B9=E8=A1=8C=E4=BD=8D=E7=BD=AE?= =?UTF-8?q?=E3=82=92=E5=A4=89=E3=81=88=E3=81=A6=E3=83=86=E3=82=B9=E3=83=88?= =?UTF-8?q?=E3=82=92=E8=90=BD=E3=81=A1=E3=81=AA=E3=81=8F=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../doma/internal/apt/generator/EntityMetamodelGenerator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java index 58fe3b943..4734e5a1d 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java @@ -99,8 +99,8 @@ private void printScopeField() { List scopes = entityMeta.getAllMetaScope(); for (EntityMetaScope scope : scopes) { iprint("private final %1$s %2$s = new %1$s();%n", scope.scopeClass(), scope.scopeField()); + print("%n"); } - print("%n"); } private void printConstructors() { From d226d7ee31c2b74b8f12a1c348b1684196ff222d Mon Sep 17 00:00:00 2001 From: orekyuu Date: Mon, 11 Jan 2021 19:52:25 +0900 Subject: [PATCH 10/31] =?UTF-8?q?=E5=BC=95=E6=95=B0=E3=81=82=E3=82=8Ascope?= =?UTF-8?q?=E3=83=A1=E3=82=BD=E3=83=83=E3=83=89=E3=81=AE=E3=83=86=E3=82=B9?= =?UTF-8?q?=E3=83=88=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../doma/internal/apt/processor/entity/ScopeClass.java | 9 +++++++++ .../apt/processor/metamodel/ScopeTest_ScopedEntity.txt | 4 ++++ 2 files changed, 13 insertions(+) diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/ScopeClass.java b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/ScopeClass.java index 2914cf2ff..b2d37e680 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/ScopeClass.java +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/ScopeClass.java @@ -1,7 +1,10 @@ package org.seasar.doma.internal.apt.processor.entity; import org.seasar.doma.jdbc.criteria.declaration.WhereDeclaration; + +import java.util.Arrays; import java.util.function.Consumer; +import java.util.stream.Collectors; class ScopeClass { @@ -10,4 +13,10 @@ public Consumer startWithHoge(ScopedEntity_ e) { w.like(e.name, "hoge%"); }; } + + public Consumer ids(ScopedEntity_ e, long[] ids) { + return w -> { + w.in(e.id, Arrays.stream(ids).boxed().collect(Collectors.toList())); + }; + } } \ No newline at end of file diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest_ScopedEntity.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest_ScopedEntity.txt index 0a516359a..13aa150b3 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest_ScopedEntity.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest_ScopedEntity.txt @@ -46,4 +46,8 @@ public final class ScopedEntity_ implements org.seasar.doma.jdbc.criteria.metamo return _scope_ScopeClass.startWithHoge(this); } + public java.util.function.Consumer ids(long[] ids) { + return _scope_ScopeClass.ids(this, ids); + } + } From d9ee7d37d5286bffec7adf2a66cfb5d52f9ce23b Mon Sep 17 00:00:00 2001 From: orekyuu Date: Mon, 11 Jan 2021 19:54:56 +0900 Subject: [PATCH 11/31] =?UTF-8?q?=E5=8F=AF=E5=A4=89=E9=95=B7=E5=BC=95?= =?UTF-8?q?=E6=95=B0=E3=81=AE=E3=83=86=E3=82=B9=E3=83=88=E3=82=92=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../doma/internal/apt/processor/entity/ScopeClass.java | 6 ++++++ .../apt/processor/metamodel/ScopeTest_ScopedEntity.txt | 3 +++ 2 files changed, 9 insertions(+) diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/ScopeClass.java b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/ScopeClass.java index b2d37e680..1aa5170e0 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/ScopeClass.java +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/ScopeClass.java @@ -19,4 +19,10 @@ public Consumer ids(ScopedEntity_ e, long[] ids) { w.in(e.id, Arrays.stream(ids).boxed().collect(Collectors.toList())); }; } + + public Consumer names(ScopedEntity_ e, String... names) { + return w -> { + w.in(e.name, Arrays.asList(names)); + }; + } } \ No newline at end of file diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest_ScopedEntity.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest_ScopedEntity.txt index 13aa150b3..a57f5f4e4 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest_ScopedEntity.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest_ScopedEntity.txt @@ -50,4 +50,7 @@ public final class ScopedEntity_ implements org.seasar.doma.jdbc.criteria.metamo return _scope_ScopeClass.ids(this, ids); } + public java.util.function.Consumer names(String... names) { + return _scope_ScopeClass.names(this, names); + } } From 3ec7dc7ee85dd0fe2ddead3c84bf6e462e2b83fb Mon Sep 17 00:00:00 2001 From: orekyuu Date: Mon, 11 Jan 2021 20:16:19 +0900 Subject: [PATCH 12/31] =?UTF-8?q?MethodDeclaration=E3=81=AB=E5=BC=95?= =?UTF-8?q?=E6=95=B0=E3=82=92=E8=BF=94=E3=81=99=E3=83=A1=E3=82=BD=E3=83=83?= =?UTF-8?q?=E3=83=89=E3=81=A8=E5=8F=AF=E5=A4=89=E9=95=B7=E5=BC=95=E6=95=B0?= =?UTF-8?q?=E3=81=8C=E3=81=82=E3=82=8B=E3=81=8B=E3=82=92=E8=BF=94=E3=81=99?= =?UTF-8?q?=E3=83=A1=E3=82=BD=E3=83=83=E3=83=89=E3=82=92=E7=94=A8=E6=84=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../internal/apt/decl/MethodDeclaration.java | 10 +++ .../apt/decl/TypeDeclarationTest.java | 70 ++++++++++++++++--- 2 files changed, 69 insertions(+), 11 deletions(-) diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/MethodDeclaration.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/MethodDeclaration.java index 1896690aa..175e42e70 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/MethodDeclaration.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/MethodDeclaration.java @@ -2,6 +2,8 @@ import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.Modifier; +import javax.lang.model.element.VariableElement; +import java.util.List; import static org.seasar.doma.internal.util.AssertionUtil.assertNotNull; @@ -32,4 +34,12 @@ public boolean isStatic() { public String name() { return element.getSimpleName().toString(); } + + public List parameters() { + return element.getParameters(); + } + + public boolean isVarArgs() { + return element.isVarArgs(); + } } diff --git a/doma-processor/src/test/java/org/seasar/doma/internal/apt/decl/TypeDeclarationTest.java b/doma-processor/src/test/java/org/seasar/doma/internal/apt/decl/TypeDeclarationTest.java index 8a3d06d07..2e0893bbe 100644 --- a/doma-processor/src/test/java/org/seasar/doma/internal/apt/decl/TypeDeclarationTest.java +++ b/doma-processor/src/test/java/org/seasar/doma/internal/apt/decl/TypeDeclarationTest.java @@ -1,22 +1,21 @@ package org.seasar.doma.internal.apt.decl; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertTrue; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.seasar.doma.internal.apt.CompilerSupport; +import org.seasar.doma.internal.apt.TestProcessor; +import javax.lang.model.element.VariableElement; +import javax.lang.model.type.TypeMirror; +import javax.lang.model.type.TypeVariable; import java.math.BigDecimal; import java.util.Collections; import java.util.List; import java.util.Optional; import java.util.function.Function; -import javax.lang.model.type.TypeMirror; -import javax.lang.model.type.TypeVariable; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.seasar.doma.internal.apt.CompilerSupport; -import org.seasar.doma.internal.apt.TestProcessor; + +import static org.junit.jupiter.api.Assertions.*; class TypeDeclarationTest extends CompilerSupport { @@ -37,6 +36,11 @@ public String myMethod(Integer integer) { return null; } + @SuppressWarnings("unused") + public String varArgs(String... args) { + return null; + } + @SuppressWarnings("unused") public static String myStaticMethod(Integer integer) { return null; @@ -430,6 +434,50 @@ protected void run() { }); } + @Test + void getMethodDeclarationParameters() { + Class testClass = getClass(); + addProcessor( + new TestProcessor() { + @Override + protected void run() { + TypeDeclaration typeDeclaration = ctx.getDeclarations().newTypeDeclaration(testClass); + TypeDeclaration parameterDeclaration = + ctx.getDeclarations().newTypeDeclaration(Integer.class); + Optional methodDeclaration = + typeDeclaration.getMethodDeclaration( + "myMethod", Collections.singletonList(parameterDeclaration)); + assertTrue(methodDeclaration.isPresent()); + MethodDeclaration declaration = methodDeclaration.get(); + List parameters = declaration.parameters(); + assertEquals(parameters.size(), 1); + VariableElement first = parameters.get(0); + assertEquals(first.getSimpleName().toString(), "integer"); + assertEquals(first.asType().toString(), "java.lang.Integer"); + assertFalse(declaration.isVarArgs()); + } + }, + new TestProcessor() { + @Override + protected void run() { + TypeDeclaration typeDeclaration = ctx.getDeclarations().newTypeDeclaration(testClass); + TypeDeclaration parameterDeclaration = + ctx.getDeclarations().newTypeDeclaration(String[].class); + Optional methodDeclaration = + typeDeclaration.getMethodDeclaration( + "varArgs", Collections.singletonList(parameterDeclaration)); + assertTrue(methodDeclaration.isPresent()); + MethodDeclaration declaration = methodDeclaration.get(); + List parameters = declaration.parameters(); + assertEquals(parameters.size(), 1); + VariableElement first = parameters.get(0); + assertEquals(first.getSimpleName().toString(), "args"); + assertEquals(first.asType().toString(), "java.lang.String[]"); + assertTrue(declaration.isVarArgs()); + } + }); + } + @Test void emulateConcatOperation() { addProcessor( From af8420d5255ecf64e0e118188aa628bdfeeb3fd4 Mon Sep 17 00:00:00 2001 From: orekyuu Date: Mon, 11 Jan 2021 20:31:04 +0900 Subject: [PATCH 13/31] =?UTF-8?q?=E5=BC=95=E6=95=B0=E4=BB=98=E3=81=8D?= =?UTF-8?q?=E3=83=A1=E3=82=BD=E3=83=83=E3=83=89=E3=82=92=E7=94=9F=E6=88=90?= =?UTF-8?q?=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../generator/EntityMetamodelGenerator.java | 35 +++++++++++++++++-- .../metamodel/ScopeTest_ScopedEntity.txt | 3 +- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java index 4734e5a1d..204271a72 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java @@ -19,8 +19,12 @@ import javax.lang.model.element.Name; import javax.lang.model.element.TypeElement; +import javax.lang.model.element.VariableElement; +import javax.lang.model.type.ArrayType; import javax.lang.model.type.TypeMirror; +import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; import static org.seasar.doma.internal.util.AssertionUtil.assertNotNull; @@ -205,12 +209,39 @@ private void printScopeMethods() { private void printScopeMethods(EntityMetaScope scope, TypeDeclaration type) { for (MethodDeclaration method : type.getScopeMethods(scope.scopeClass())) { - iprint("public %1$s %2$s() {%n", method.getReturnTypeDeclaration(), method.name()); + List parameters = new ArrayList<>(method.parameters()); + parameters.remove(0); + + iprint("public %1$s %2$s(%3$s) {%n", method.getReturnTypeDeclaration(), method.name(), generateParameterList(method, parameters)); indent(); - iprint("return %1$s.%2$s(this);%n", scope.scopeField(), method.name()); + + String params = parameters.stream().map(VariableElement::getSimpleName).collect(Collectors.joining(", ")); + if (!params.isEmpty()) { + params = ", " + params; + } + iprint("return %1$s.%2$s(this%3$s);%n", scope.scopeField(), method.name(), params); unindent(); iprint("}%n"); print("%n"); } } + + private String generateParameterList(MethodDeclaration method, List parameters) { + List params = new ArrayList<>(); + for (int i = 0; i < parameters.size(); i++) { + VariableElement variable = parameters.get(i); + boolean isLast = (parameters.size() - 1) == i; + String type = variable.asType().toString(); + + if (isLast && method.isVarArgs()) { + // build varargs parameter + ArrayType arrayType = (ArrayType) variable.asType(); + type = arrayType.getComponentType().toString() + "..."; + } + + params.add(type + " " + variable.getSimpleName()); + } + + return String.join(", ", params); + } } diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest_ScopedEntity.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest_ScopedEntity.txt index a57f5f4e4..ce50ed219 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest_ScopedEntity.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest_ScopedEntity.txt @@ -50,7 +50,8 @@ public final class ScopedEntity_ implements org.seasar.doma.jdbc.criteria.metamo return _scope_ScopeClass.ids(this, ids); } - public java.util.function.Consumer names(String... names) { + public java.util.function.Consumer names(java.lang.String... names) { return _scope_ScopeClass.names(this, names); } + } From b8e2feb9a83c1c0a5ba36e5beed0d868c635c74a Mon Sep 17 00:00:00 2001 From: orekyuu Date: Mon, 11 Jan 2021 20:39:10 +0900 Subject: [PATCH 14/31] =?UTF-8?q?=E4=B8=8D=E8=A6=81=E3=81=AA=E5=BC=95?= =?UTF-8?q?=E6=95=B0=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../doma/internal/apt/decl/TypeDeclaration.java | 13 ++++--------- .../apt/generator/EntityMetamodelGenerator.java | 4 ++-- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/TypeDeclaration.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/TypeDeclaration.java index 66cab7162..09543029d 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/TypeDeclaration.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/TypeDeclaration.java @@ -2,7 +2,6 @@ import org.seasar.doma.internal.apt.Context; import org.seasar.doma.internal.apt.MoreTypes; -import org.seasar.doma.internal.apt.annot.ScopeClass; import org.seasar.doma.internal.apt.cttype.*; import org.seasar.doma.internal.util.Pair; import org.seasar.doma.internal.util.Zip; @@ -218,11 +217,11 @@ private void removeHiddenFieldDeclarations(List candidates) { } } - public List getScopeMethods(ScopeClass scopeClass) { - return getMethods(m -> isScopeMethod(m, scopeClass)); + public List getScopeMethods() { + return getMethods(this::isScopeMethod); } - public boolean isScopeMethod(ExecutableElement m, ScopeClass scopeClass) { + public boolean isScopeMethod(ExecutableElement m) { if (m.getModifiers().contains(Modifier.STATIC)) { return false; } @@ -240,11 +239,7 @@ public boolean isScopeMethod(ExecutableElement m, ScopeClass scopeClass) { } VariableElement firstParameter = m.getParameters().get(0); - if (!ctx.getMoreTypes().isAssignableWithErasure(firstParameter.asType(), EntityMetamodel.class)) { - return false; - } - - return true; + return ctx.getMoreTypes().isAssignableWithErasure(firstParameter.asType(), EntityMetamodel.class); } public Optional getMethodDeclaration( diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java index 204271a72..73a3872a9 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java @@ -207,8 +207,8 @@ private void printScopeMethods() { } } - private void printScopeMethods(EntityMetaScope scope, TypeDeclaration type) { - for (MethodDeclaration method : type.getScopeMethods(scope.scopeClass())) { + private void printScopeMethods(EntityMetaScope scope, TypeDeclaration scopeDeclaration) { + for (MethodDeclaration method : scopeDeclaration.getScopeMethods()) { List parameters = new ArrayList<>(method.parameters()); parameters.remove(0); From 91b110704cf65d5c83f4e1ccb50bda6a2619eca0 Mon Sep 17 00:00:00 2001 From: orekyuu Date: Mon, 11 Jan 2021 20:55:34 +0900 Subject: [PATCH 15/31] =?UTF-8?q?scope=20method=E3=81=AE=E6=8A=BD=E5=87=BA?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E3=82=92=E3=81=8B=E3=81=88=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../doma/internal/apt/decl/TypeDeclaration.java | 11 ++++++----- .../apt/generator/EntityMetamodelGenerator.java | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/TypeDeclaration.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/TypeDeclaration.java index 09543029d..7b5fe1902 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/TypeDeclaration.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/TypeDeclaration.java @@ -1,11 +1,11 @@ package org.seasar.doma.internal.apt.decl; +import org.seasar.doma.internal.ClassName; import org.seasar.doma.internal.apt.Context; import org.seasar.doma.internal.apt.MoreTypes; import org.seasar.doma.internal.apt.cttype.*; import org.seasar.doma.internal.util.Pair; import org.seasar.doma.internal.util.Zip; -import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel; import javax.lang.model.element.*; import javax.lang.model.type.TypeKind; @@ -217,11 +217,11 @@ private void removeHiddenFieldDeclarations(List candidates) { } } - public List getScopeMethods() { - return getMethods(this::isScopeMethod); + public List getScopeMethods(ClassName metamodel) { + return getMethods(m -> isScopeMethod(m, metamodel)); } - public boolean isScopeMethod(ExecutableElement m) { + public boolean isScopeMethod(ExecutableElement m, ClassName metamodel) { if (m.getModifiers().contains(Modifier.STATIC)) { return false; } @@ -239,7 +239,8 @@ public boolean isScopeMethod(ExecutableElement m) { } VariableElement firstParameter = m.getParameters().get(0); - return ctx.getMoreTypes().isAssignableWithErasure(firstParameter.asType(), EntityMetamodel.class); + // TODO: この時点ではmetamodelが作られていないので代入可能かのチェックができない。SimpleNameの比較をしているが名前空間がちがえばすり抜けるため他の良い方法があれば + return firstParameter.asType().toString().equals(metamodel.getSimpleName()); } public Optional getMethodDeclaration( diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java index 73a3872a9..9a3c76150 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java @@ -208,7 +208,7 @@ private void printScopeMethods() { } private void printScopeMethods(EntityMetaScope scope, TypeDeclaration scopeDeclaration) { - for (MethodDeclaration method : scopeDeclaration.getScopeMethods()) { + for (MethodDeclaration method : scopeDeclaration.getScopeMethods(className)) { List parameters = new ArrayList<>(method.parameters()); parameters.remove(0); From f0f2a76e4c2801d809488d5c1e7668a957c7ecaa Mon Sep 17 00:00:00 2001 From: orekyuu Date: Mon, 11 Jan 2021 21:07:01 +0900 Subject: [PATCH 16/31] =?UTF-8?q?=E8=A4=87=E6=95=B0=E3=81=AE=E3=83=91?= =?UTF-8?q?=E3=83=A9=E3=83=A1=E3=83=BC=E3=82=BF=E3=82=92=E5=8F=97=E3=81=91?= =?UTF-8?q?=E4=BB=98=E3=81=91=E3=82=8B=E3=83=86=E3=82=B9=E3=83=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../doma/internal/apt/processor/entity/ScopeClass.java | 7 +++++++ .../apt/processor/metamodel/ScopeTest_ScopedEntity.txt | 4 ++++ 2 files changed, 11 insertions(+) diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/ScopeClass.java b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/ScopeClass.java index 1aa5170e0..b6ef2b7a5 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/ScopeClass.java +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/ScopeClass.java @@ -25,4 +25,11 @@ public Consumer names(ScopedEntity_ e, String... names) { w.in(e.name, Arrays.asList(names)); }; } + + public Consumer idAndName(ScopedEntity_ e, long id, String name) { + return w -> { + w.eq(e.id, id); + w.eq(e.name, name); + }; + } } \ No newline at end of file diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest_ScopedEntity.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest_ScopedEntity.txt index ce50ed219..c0d5b9f52 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest_ScopedEntity.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest_ScopedEntity.txt @@ -54,4 +54,8 @@ public final class ScopedEntity_ implements org.seasar.doma.jdbc.criteria.metamo return _scope_ScopeClass.names(this, names); } + public java.util.function.Consumer idAndName(long id, java.lang.String name) { + return _scope_ScopeClass.idAndName(this, id, name); + } + } From b742f259000d696e118e5e8fbd1b14a525a5b914 Mon Sep 17 00:00:00 2001 From: orekyuu Date: Mon, 11 Jan 2021 21:11:10 +0900 Subject: [PATCH 17/31] =?UTF-8?q?=E8=A4=87=E6=95=B0=E3=81=AEScope=E3=82=92?= =?UTF-8?q?=E5=8F=97=E3=81=91=E5=8F=96=E3=82=8B=E3=83=86=E3=82=B9=E3=83=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apt/processor/metamodel/ScopeTest.java | 5 +- .../apt/processor/entity/CreatedAtScope.java | 18 ++++++ .../processor/entity/MultiScopeEntity.java | 37 ++++++++++++ .../apt/processor/entity/NameScope.java | 13 +++++ .../metamodel/ScopeTest_MultiScopeEntity.txt | 58 +++++++++++++++++++ 5 files changed, 130 insertions(+), 1 deletion(-) create mode 100644 doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/CreatedAtScope.java create mode 100644 doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/MultiScopeEntity.java create mode 100644 doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/NameScope.java create mode 100644 doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest_MultiScopeEntity.txt diff --git a/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest.java b/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest.java index 48a24d4d1..ed1bf0cfd 100644 --- a/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest.java +++ b/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest.java @@ -52,7 +52,10 @@ public Stream provideTestTemplateInvocationContex return Stream.of( invocationContext( "org.seasar.doma.internal.apt.processor.entity.ScopedEntity", - "org.seasar.doma.internal.apt.processor.entity.ScopeClass") + "org.seasar.doma.internal.apt.processor.entity.ScopeClass"), + invocationContext( + "org.seasar.doma.internal.apt.processor.entity.MultiScopeEntity", + "org.seasar.doma.internal.apt.processor.entity.CreatedAtScope") ); } diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/CreatedAtScope.java b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/CreatedAtScope.java new file mode 100644 index 000000000..129945d6b --- /dev/null +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/CreatedAtScope.java @@ -0,0 +1,18 @@ +package org.seasar.doma.internal.apt.processor.entity; + +import org.seasar.doma.jdbc.criteria.declaration.WhereDeclaration; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.util.function.Consumer; + +class CreatedAtScope { + + public Consumer today(MultiScopeEntity_ e) { + LocalDate now = LocalDate.now(); + return w -> { + w.between(e.createdAt, now.atStartOfDay(), now.atTime(LocalTime.MAX)); + }; + } +} \ No newline at end of file diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/MultiScopeEntity.java b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/MultiScopeEntity.java new file mode 100644 index 000000000..aebf1359a --- /dev/null +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/MultiScopeEntity.java @@ -0,0 +1,37 @@ +package org.seasar.doma.internal.apt.processor.entity; + +import org.seasar.doma.Entity; +import org.seasar.doma.Metamodel; + +import java.time.LocalDateTime; + +@Entity(metamodel = @Metamodel(scope = {CreatedAtScope.class, NameScope.class})) +class MultiScopeEntity { + Long id; + String name; + LocalDateTime createdAt; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public LocalDateTime getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(LocalDateTime createdAt) { + this.createdAt = createdAt; + } + + public void setName(String name) { + this.name = name; + } +} \ No newline at end of file diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/NameScope.java b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/NameScope.java new file mode 100644 index 000000000..aee39790c --- /dev/null +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/NameScope.java @@ -0,0 +1,13 @@ +package org.seasar.doma.internal.apt.processor.entity; + +import org.seasar.doma.jdbc.criteria.declaration.WhereDeclaration; +import java.util.function.Consumer; + +class NameScope { + + public Consumer nameEq(MultiScopeEntity_ e, String name) { + return w -> { + w.eq(e.name, name); + }; + } +} \ No newline at end of file diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest_MultiScopeEntity.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest_MultiScopeEntity.txt new file mode 100644 index 000000000..662cbf520 --- /dev/null +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest_MultiScopeEntity.txt @@ -0,0 +1,58 @@ +package org.seasar.doma.internal.apt.processor.entity; + +/** */ +@javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") +public final class MultiScopeEntity_ implements org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel { + + static { + org.seasar.doma.internal.Artifact.validateVersion("@VERSION@"); + } + + private final String __qualifiedTableName; + + private final org.seasar.doma.internal.apt.processor.entity._MultiScopeEntity __entityType = org.seasar.doma.internal.apt.processor.entity._MultiScopeEntity.getSingletonInternal(); + + private final java.util.List> __allPropertyMetamodels; + + public final org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel id = new org.seasar.doma.jdbc.criteria.metamodel.DefaultPropertyMetamodel(java.lang.Long.class, __entityType, "id"); + + public final org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel name = new org.seasar.doma.jdbc.criteria.metamodel.DefaultPropertyMetamodel(java.lang.String.class, __entityType, "name"); + + public final org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel createdAt = new org.seasar.doma.jdbc.criteria.metamodel.DefaultPropertyMetamodel(java.time.LocalDateTime.class, __entityType, "createdAt"); + + private final org.seasar.doma.internal.apt.processor.entity.CreatedAtScope _scope_CreatedAtScope = new org.seasar.doma.internal.apt.processor.entity.CreatedAtScope(); + + private final org.seasar.doma.internal.apt.processor.entity.NameScope _scope_NameScope = new org.seasar.doma.internal.apt.processor.entity.NameScope(); + + public MultiScopeEntity_() { + this(""); + } + + public MultiScopeEntity_(String qualifiedTableName) { + this.__qualifiedTableName = java.util.Objects.requireNonNull(qualifiedTableName); + java.util.ArrayList> __list = new java.util.ArrayList<>(3); + __list.add(id); + __list.add(name); + __list.add(createdAt); + __allPropertyMetamodels = java.util.Collections.unmodifiableList(__list); + } + + @Override + public org.seasar.doma.jdbc.entity.EntityType asType() { + return __qualifiedTableName.isEmpty() ? __entityType : new org.seasar.doma.jdbc.criteria.metamodel.EntityTypeProxy<>(__entityType, __qualifiedTableName); + } + + @Override + public java.util.List> allPropertyMetamodels() { + return __allPropertyMetamodels; + } + + public java.util.function.Consumer today() { + return _scope_CreatedAtScope.today(this); + } + + public java.util.function.Consumer nameEq(java.lang.String name) { + return _scope_NameScope.nameEq(this, name); + } + +} From 7f6a85c92a23c401566e97592bf5d3e04c5c8a57 Mon Sep 17 00:00:00 2001 From: orekyuu Date: Mon, 11 Jan 2021 21:15:39 +0900 Subject: [PATCH 18/31] reformat --- .../internal/apt/annot/MetamodelAnnot.java | 4 +- .../internal/apt/decl/TypeDeclaration.java | 32 ++++--- .../generator/EntityMetamodelGenerator.java | 15 ++- .../internal/apt/meta/entity/EntityMeta.java | 4 +- .../doma/internal/apt/CompilerSupport.java | 16 ++-- .../apt/decl/TypeDeclarationTest.java | 76 +++++++-------- .../apt/processor/metamodel/ScopeTest.java | 94 +++++++++---------- 7 files changed, 122 insertions(+), 119 deletions(-) diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/MetamodelAnnot.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/MetamodelAnnot.java index 072e2ed4d..fa0997c94 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/MetamodelAnnot.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/MetamodelAnnot.java @@ -59,8 +59,6 @@ public String getSuffixValue() { public List getScopeValue() { List type = AnnotationValueUtil.toTypeList(scopeClasses); - return type.stream() - .map(ScopeClass::new) - .collect(Collectors.toList()); + return type.stream().map(ScopeClass::new).collect(Collectors.toList()); } } diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/TypeDeclaration.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/TypeDeclaration.java index 7b5fe1902..c4af0d8ac 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/TypeDeclaration.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/TypeDeclaration.java @@ -264,25 +264,27 @@ private Optional getMethodDeclarationInternal( private List getCandidateMethodDeclarations( String name, List parameterTypeDeclarations, boolean statik) { - return getMethods(m -> (!statik || m.getModifiers().contains(Modifier.STATIC)) && - m.getModifiers().contains(Modifier.PUBLIC) && - m.getSimpleName().contentEquals(name) && - m.getReturnType().getKind() != TypeKind.VOID && - m.getParameters().size() == parameterTypeDeclarations.size() && - isAssignable(parameterTypeDeclarations, m.getParameters())); + return getMethods( + m -> + (!statik || m.getModifiers().contains(Modifier.STATIC)) + && m.getModifiers().contains(Modifier.PUBLIC) + && m.getSimpleName().contentEquals(name) + && m.getReturnType().getKind() != TypeKind.VOID + && m.getParameters().size() == parameterTypeDeclarations.size() + && isAssignable(parameterTypeDeclarations, m.getParameters())); } private List getMethods(Predicate predicate) { return typeParameterDeclarationsMap.entrySet().stream() - .map(e -> new Pair<>(e.getKey(), e.getValue())) - .map(p -> new Pair<>(ctx.getMoreElements().getTypeElement(p.fst), p.snd)) - .filter(p -> Objects.nonNull(p.fst)) - .flatMap( - p -> - methodsIn(p.fst.getEnclosedElements()).stream() - .filter(predicate) - .map(m -> ctx.getDeclarations().newMethodDeclaration(m, p.snd))) - .collect(toList()); + .map(e -> new Pair<>(e.getKey(), e.getValue())) + .map(p -> new Pair<>(ctx.getMoreElements().getTypeElement(p.fst), p.snd)) + .filter(p -> Objects.nonNull(p.fst)) + .flatMap( + p -> + methodsIn(p.fst.getEnclosedElements()).stream() + .filter(predicate) + .map(m -> ctx.getDeclarations().newMethodDeclaration(m, p.snd))) + .collect(toList()); } private void removeOverriddenMethodDeclarations(List candidates) { diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java index 9a3c76150..37f537c75 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java @@ -202,7 +202,8 @@ private void printAllPropertyMetamodelsMethod() { private void printScopeMethods() { for (EntityMetaScope scope : entityMeta.getAllMetaScope()) { - TypeDeclaration declaration = ctx.getDeclarations().newTypeDeclaration(scope.scopeClass().asType()); + TypeDeclaration declaration = + ctx.getDeclarations().newTypeDeclaration(scope.scopeClass().asType()); printScopeMethods(scope, declaration); } } @@ -212,10 +213,15 @@ private void printScopeMethods(EntityMetaScope scope, TypeDeclaration scopeDecla List parameters = new ArrayList<>(method.parameters()); parameters.remove(0); - iprint("public %1$s %2$s(%3$s) {%n", method.getReturnTypeDeclaration(), method.name(), generateParameterList(method, parameters)); + iprint( + "public %1$s %2$s(%3$s) {%n", + method.getReturnTypeDeclaration(), + method.name(), + generateParameterList(method, parameters)); indent(); - String params = parameters.stream().map(VariableElement::getSimpleName).collect(Collectors.joining(", ")); + String params = + parameters.stream().map(VariableElement::getSimpleName).collect(Collectors.joining(", ")); if (!params.isEmpty()) { params = ", " + params; } @@ -226,7 +232,8 @@ private void printScopeMethods(EntityMetaScope scope, TypeDeclaration scopeDecla } } - private String generateParameterList(MethodDeclaration method, List parameters) { + private String generateParameterList( + MethodDeclaration method, List parameters) { List params = new ArrayList<>(); for (int i = 0; i < parameters.size(); i++) { VariableElement variable = parameters.get(i); diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityMeta.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityMeta.java index 883f4bf93..7cb4c6139 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityMeta.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityMeta.java @@ -127,9 +127,7 @@ public List getAllMetaScope() { return Collections.emptyList(); } List scopeClasses = metamodelValue.getScopeValue(); - return scopeClasses.stream() - .map(EntityMetaScope::new) - .collect(Collectors.toList()); + return scopeClasses.stream().map(EntityMetaScope::new).collect(Collectors.toList()); } public boolean hasVersionPropertyMeta() { diff --git a/doma-processor/src/test/java/org/seasar/doma/internal/apt/CompilerSupport.java b/doma-processor/src/test/java/org/seasar/doma/internal/apt/CompilerSupport.java index 75cde01de..7eaf70d43 100644 --- a/doma-processor/src/test/java/org/seasar/doma/internal/apt/CompilerSupport.java +++ b/doma-processor/src/test/java/org/seasar/doma/internal/apt/CompilerSupport.java @@ -1,14 +1,15 @@ package org.seasar.doma.internal.apt; +import org.junit.jupiter.api.extension.RegisterExtension; +import org.seasar.doma.message.Message; + +import javax.annotation.processing.Processor; +import javax.tools.Diagnostic; +import javax.tools.JavaFileObject; import java.io.*; import java.net.URL; import java.util.List; import java.util.stream.Collectors; -import javax.annotation.processing.Processor; -import javax.tools.Diagnostic; -import javax.tools.JavaFileObject; -import org.junit.jupiter.api.extension.RegisterExtension; -import org.seasar.doma.message.Message; public abstract class CompilerSupport { @@ -43,9 +44,8 @@ protected void addCompilationUnit(final Class clazz) { protected void addResourceFileCompilationUnit(final String fqn) { String fileName = fqn.replace(".", "/") + ".java"; - try ( - InputStream in = getClass().getClassLoader().getResourceAsStream(fileName); - BufferedReader reader = new BufferedReader(new InputStreamReader(in))) { + try (InputStream in = getClass().getClassLoader().getResourceAsStream(fileName); + BufferedReader reader = new BufferedReader(new InputStreamReader(in))) { String source = reader.lines().collect(Collectors.joining("\n")); compiler.addCompilationUnit(fqn, source); } catch (IOException e) { diff --git a/doma-processor/src/test/java/org/seasar/doma/internal/apt/decl/TypeDeclarationTest.java b/doma-processor/src/test/java/org/seasar/doma/internal/apt/decl/TypeDeclarationTest.java index 2e0893bbe..ff1b4bb62 100644 --- a/doma-processor/src/test/java/org/seasar/doma/internal/apt/decl/TypeDeclarationTest.java +++ b/doma-processor/src/test/java/org/seasar/doma/internal/apt/decl/TypeDeclarationTest.java @@ -438,44 +438,44 @@ protected void run() { void getMethodDeclarationParameters() { Class testClass = getClass(); addProcessor( - new TestProcessor() { - @Override - protected void run() { - TypeDeclaration typeDeclaration = ctx.getDeclarations().newTypeDeclaration(testClass); - TypeDeclaration parameterDeclaration = - ctx.getDeclarations().newTypeDeclaration(Integer.class); - Optional methodDeclaration = - typeDeclaration.getMethodDeclaration( - "myMethod", Collections.singletonList(parameterDeclaration)); - assertTrue(methodDeclaration.isPresent()); - MethodDeclaration declaration = methodDeclaration.get(); - List parameters = declaration.parameters(); - assertEquals(parameters.size(), 1); - VariableElement first = parameters.get(0); - assertEquals(first.getSimpleName().toString(), "integer"); - assertEquals(first.asType().toString(), "java.lang.Integer"); - assertFalse(declaration.isVarArgs()); - } - }, - new TestProcessor() { - @Override - protected void run() { - TypeDeclaration typeDeclaration = ctx.getDeclarations().newTypeDeclaration(testClass); - TypeDeclaration parameterDeclaration = - ctx.getDeclarations().newTypeDeclaration(String[].class); - Optional methodDeclaration = - typeDeclaration.getMethodDeclaration( - "varArgs", Collections.singletonList(parameterDeclaration)); - assertTrue(methodDeclaration.isPresent()); - MethodDeclaration declaration = methodDeclaration.get(); - List parameters = declaration.parameters(); - assertEquals(parameters.size(), 1); - VariableElement first = parameters.get(0); - assertEquals(first.getSimpleName().toString(), "args"); - assertEquals(first.asType().toString(), "java.lang.String[]"); - assertTrue(declaration.isVarArgs()); - } - }); + new TestProcessor() { + @Override + protected void run() { + TypeDeclaration typeDeclaration = ctx.getDeclarations().newTypeDeclaration(testClass); + TypeDeclaration parameterDeclaration = + ctx.getDeclarations().newTypeDeclaration(Integer.class); + Optional methodDeclaration = + typeDeclaration.getMethodDeclaration( + "myMethod", Collections.singletonList(parameterDeclaration)); + assertTrue(methodDeclaration.isPresent()); + MethodDeclaration declaration = methodDeclaration.get(); + List parameters = declaration.parameters(); + assertEquals(parameters.size(), 1); + VariableElement first = parameters.get(0); + assertEquals(first.getSimpleName().toString(), "integer"); + assertEquals(first.asType().toString(), "java.lang.Integer"); + assertFalse(declaration.isVarArgs()); + } + }, + new TestProcessor() { + @Override + protected void run() { + TypeDeclaration typeDeclaration = ctx.getDeclarations().newTypeDeclaration(testClass); + TypeDeclaration parameterDeclaration = + ctx.getDeclarations().newTypeDeclaration(String[].class); + Optional methodDeclaration = + typeDeclaration.getMethodDeclaration( + "varArgs", Collections.singletonList(parameterDeclaration)); + assertTrue(methodDeclaration.isPresent()); + MethodDeclaration declaration = methodDeclaration.get(); + List parameters = declaration.parameters(); + assertEquals(parameters.size(), 1); + VariableElement first = parameters.get(0); + assertEquals(first.getSimpleName().toString(), "args"); + assertEquals(first.asType().toString(), "java.lang.String[]"); + assertTrue(declaration.isVarArgs()); + } + }); } @Test diff --git a/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest.java b/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest.java index ed1bf0cfd..26eb7c3a3 100644 --- a/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest.java +++ b/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest.java @@ -19,62 +19,60 @@ public class ScopeTest extends CompilerSupport { - @BeforeEach - void setup() { - addOption("-Adoma.test=true"); - addOption("-Adoma.metamodel.enabled=true"); + @BeforeEach + void setup() { + addOption("-Adoma.test=true"); + addOption("-Adoma.metamodel.enabled=true"); + } + + @TestTemplate + @ExtendWith(ScopeTest.SuccessInvocationContextProvider.class) + void success(String fqn, String[] otherClasses, URL expected) throws Exception { + addProcessor(new EntityProcessor()); + for (String otherClass : otherClasses) { + addResourceFileCompilationUnit(otherClass); } + addResourceFileCompilationUnit(fqn); + compile(); + String metamodel = ClassNames.newEntityMetamodelClassNameBuilder(fqn, "", "_").toString(); + assertEqualsGeneratedSourceWithResource(expected, metamodel); + assertTrue(getCompiledResult()); + } - @TestTemplate - @ExtendWith(ScopeTest.SuccessInvocationContextProvider.class) - void success(String fqn, String[] otherClasses, URL expected) throws Exception { - addProcessor(new EntityProcessor()); - for (String otherClass : otherClasses) { - addResourceFileCompilationUnit(otherClass); - } - addResourceFileCompilationUnit(fqn); - compile(); - String metamodel = ClassNames.newEntityMetamodelClassNameBuilder(fqn, "", "_") - .toString(); - assertEqualsGeneratedSourceWithResource(expected, metamodel); - assertTrue(getCompiledResult()); + static class SuccessInvocationContextProvider implements TestTemplateInvocationContextProvider { + @Override + public boolean supportsTestTemplate(ExtensionContext context) { + return true; } - static class SuccessInvocationContextProvider implements TestTemplateInvocationContextProvider { - @Override - public boolean supportsTestTemplate(ExtensionContext context) { - return true; - } + @Override + public Stream provideTestTemplateInvocationContexts( + ExtensionContext context) { + return Stream.of( + invocationContext( + "org.seasar.doma.internal.apt.processor.entity.ScopedEntity", + "org.seasar.doma.internal.apt.processor.entity.ScopeClass"), + invocationContext( + "org.seasar.doma.internal.apt.processor.entity.MultiScopeEntity", + "org.seasar.doma.internal.apt.processor.entity.CreatedAtScope")); + } + private TestTemplateInvocationContext invocationContext( + String classFqn, String... otherClasses) { + return new TestTemplateInvocationContext() { @Override - public Stream provideTestTemplateInvocationContexts( - ExtensionContext context) { - return Stream.of( - invocationContext( - "org.seasar.doma.internal.apt.processor.entity.ScopedEntity", - "org.seasar.doma.internal.apt.processor.entity.ScopeClass"), - invocationContext( - "org.seasar.doma.internal.apt.processor.entity.MultiScopeEntity", - "org.seasar.doma.internal.apt.processor.entity.CreatedAtScope") - ); + public String getDisplayName(int invocationIndex) { + return new ClassName(classFqn).getSimpleName(); } - private TestTemplateInvocationContext invocationContext( - String classFqn, String... otherClasses) { - return new TestTemplateInvocationContext() { - @Override - public String getDisplayName(int invocationIndex) { - return new ClassName(classFqn).getSimpleName(); - } - - @Override - public List getAdditionalExtensions() { - return Arrays.asList( - new ResourceParameterResolver(classFqn), - new SimpleParameterResolver(classFqn), - new SimpleParameterResolver(otherClasses)); - } - }; + @Override + public List getAdditionalExtensions() { + return Arrays.asList( + new ResourceParameterResolver(classFqn), + new SimpleParameterResolver(classFqn), + new SimpleParameterResolver(otherClasses)); } + }; } + } } From eb3ff18d706d450f15d3839a29d4cfe8db72b35b Mon Sep 17 00:00:00 2001 From: orekyuu Date: Mon, 11 Jan 2021 21:44:04 +0900 Subject: [PATCH 19/31] reformat --- .../internal/apt/annot/MetamodelAnnot.java | 13 +++++----- .../doma/internal/apt/annot/ScopeClass.java | 3 +-- .../internal/apt/decl/MethodDeclaration.java | 6 ++--- .../internal/apt/decl/TypeDeclaration.java | 25 +++++++++---------- .../generator/EntityMetamodelGenerator.java | 21 ++++++++-------- .../internal/apt/meta/entity/EntityMeta.java | 19 +++++++------- .../doma/internal/apt/CompilerSupport.java | 11 ++++---- .../apt/decl/TypeDeclarationTest.java | 19 +++++++------- .../apt/processor/metamodel/ScopeTest.java | 13 +++++----- 9 files changed, 61 insertions(+), 69 deletions(-) diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/MetamodelAnnot.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/MetamodelAnnot.java index fa0997c94..d3990af00 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/MetamodelAnnot.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/MetamodelAnnot.java @@ -1,16 +1,15 @@ package org.seasar.doma.internal.apt.annot; -import org.seasar.doma.internal.apt.AptIllegalStateException; -import org.seasar.doma.internal.apt.util.AnnotationValueUtil; +import static org.seasar.doma.internal.util.AssertionUtil.assertNonNullValue; -import javax.lang.model.element.AnnotationMirror; -import javax.lang.model.element.AnnotationValue; -import javax.lang.model.type.TypeMirror; import java.util.List; import java.util.Map; import java.util.stream.Collectors; - -import static org.seasar.doma.internal.util.AssertionUtil.assertNonNullValue; +import javax.lang.model.element.AnnotationMirror; +import javax.lang.model.element.AnnotationValue; +import javax.lang.model.type.TypeMirror; +import org.seasar.doma.internal.apt.AptIllegalStateException; +import org.seasar.doma.internal.apt.util.AnnotationValueUtil; public class MetamodelAnnot extends AbstractAnnot { diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/ScopeClass.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/ScopeClass.java index a3905ff7d..87e3dd5b3 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/ScopeClass.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/ScopeClass.java @@ -1,10 +1,9 @@ package org.seasar.doma.internal.apt.annot; +import javax.lang.model.type.TypeMirror; import org.seasar.doma.internal.ClassName; import org.seasar.doma.internal.ClassNames; -import javax.lang.model.type.TypeMirror; - public class ScopeClass { final TypeMirror type; diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/MethodDeclaration.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/MethodDeclaration.java index 175e42e70..d94fe22f3 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/MethodDeclaration.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/MethodDeclaration.java @@ -1,11 +1,11 @@ package org.seasar.doma.internal.apt.decl; +import static org.seasar.doma.internal.util.AssertionUtil.assertNotNull; + +import java.util.List; import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.Modifier; import javax.lang.model.element.VariableElement; -import java.util.List; - -import static org.seasar.doma.internal.util.AssertionUtil.assertNotNull; public class MethodDeclaration { diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/TypeDeclaration.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/TypeDeclaration.java index c4af0d8ac..74ac4c885 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/TypeDeclaration.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/TypeDeclaration.java @@ -1,5 +1,17 @@ package org.seasar.doma.internal.apt.decl; +import static java.util.stream.Collectors.toList; +import static javax.lang.model.util.ElementFilter.*; +import static org.seasar.doma.internal.util.AssertionUtil.assertNotNull; +import static org.seasar.doma.internal.util.AssertionUtil.assertTrue; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.util.*; +import java.util.function.Predicate; +import javax.lang.model.element.*; +import javax.lang.model.type.TypeKind; +import javax.lang.model.type.TypeMirror; import org.seasar.doma.internal.ClassName; import org.seasar.doma.internal.apt.Context; import org.seasar.doma.internal.apt.MoreTypes; @@ -7,19 +19,6 @@ import org.seasar.doma.internal.util.Pair; import org.seasar.doma.internal.util.Zip; -import javax.lang.model.element.*; -import javax.lang.model.type.TypeKind; -import javax.lang.model.type.TypeMirror; -import java.math.BigDecimal; -import java.math.BigInteger; -import java.util.*; -import java.util.function.Predicate; - -import static java.util.stream.Collectors.toList; -import static javax.lang.model.util.ElementFilter.*; -import static org.seasar.doma.internal.util.AssertionUtil.assertNotNull; -import static org.seasar.doma.internal.util.AssertionUtil.assertTrue; - public class TypeDeclaration { private static final Map NUMBER_PRIORITY_MAP = new HashMap<>(); diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java index 37f537c75..4aaba0b75 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java @@ -1,5 +1,15 @@ package org.seasar.doma.internal.apt.generator; +import static org.seasar.doma.internal.util.AssertionUtil.assertNotNull; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; +import javax.lang.model.element.Name; +import javax.lang.model.element.TypeElement; +import javax.lang.model.element.VariableElement; +import javax.lang.model.type.ArrayType; +import javax.lang.model.type.TypeMirror; import org.seasar.doma.internal.ClassName; import org.seasar.doma.internal.ClassNames; import org.seasar.doma.internal.apt.AptIllegalStateException; @@ -17,17 +27,6 @@ import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel; import org.seasar.doma.jdbc.entity.EntityType; -import javax.lang.model.element.Name; -import javax.lang.model.element.TypeElement; -import javax.lang.model.element.VariableElement; -import javax.lang.model.type.ArrayType; -import javax.lang.model.type.TypeMirror; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; - -import static org.seasar.doma.internal.util.AssertionUtil.assertNotNull; - public class EntityMetamodelGenerator extends AbstractGenerator { private final EntityMeta entityMeta; diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityMeta.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityMeta.java index 7cb4c6139..3dc069ba1 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityMeta.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityMeta.java @@ -1,5 +1,14 @@ package org.seasar.doma.internal.apt.meta.entity; +import static org.seasar.doma.internal.util.AssertionUtil.assertNotNull; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; +import javax.lang.model.element.Modifier; +import javax.lang.model.element.TypeElement; +import javax.lang.model.type.TypeMirror; import org.seasar.doma.internal.apt.annot.EntityAnnot; import org.seasar.doma.internal.apt.annot.MetamodelAnnot; import org.seasar.doma.internal.apt.annot.ScopeClass; @@ -8,16 +17,6 @@ import org.seasar.doma.jdbc.entity.NamingType; import org.seasar.doma.jdbc.entity.NullEntityListener; -import javax.lang.model.element.Modifier; -import javax.lang.model.element.TypeElement; -import javax.lang.model.type.TypeMirror; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; - -import static org.seasar.doma.internal.util.AssertionUtil.assertNotNull; - public class EntityMeta implements TypeElementMeta { private final List allPropertyMetas = new ArrayList<>(); diff --git a/doma-processor/src/test/java/org/seasar/doma/internal/apt/CompilerSupport.java b/doma-processor/src/test/java/org/seasar/doma/internal/apt/CompilerSupport.java index 7eaf70d43..91b09d046 100644 --- a/doma-processor/src/test/java/org/seasar/doma/internal/apt/CompilerSupport.java +++ b/doma-processor/src/test/java/org/seasar/doma/internal/apt/CompilerSupport.java @@ -1,15 +1,14 @@ package org.seasar.doma.internal.apt; -import org.junit.jupiter.api.extension.RegisterExtension; -import org.seasar.doma.message.Message; - -import javax.annotation.processing.Processor; -import javax.tools.Diagnostic; -import javax.tools.JavaFileObject; import java.io.*; import java.net.URL; import java.util.List; import java.util.stream.Collectors; +import javax.annotation.processing.Processor; +import javax.tools.Diagnostic; +import javax.tools.JavaFileObject; +import org.junit.jupiter.api.extension.RegisterExtension; +import org.seasar.doma.message.Message; public abstract class CompilerSupport { diff --git a/doma-processor/src/test/java/org/seasar/doma/internal/apt/decl/TypeDeclarationTest.java b/doma-processor/src/test/java/org/seasar/doma/internal/apt/decl/TypeDeclarationTest.java index ff1b4bb62..bb9e58f8b 100644 --- a/doma-processor/src/test/java/org/seasar/doma/internal/apt/decl/TypeDeclarationTest.java +++ b/doma-processor/src/test/java/org/seasar/doma/internal/apt/decl/TypeDeclarationTest.java @@ -1,21 +1,20 @@ package org.seasar.doma.internal.apt.decl; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.seasar.doma.internal.apt.CompilerSupport; -import org.seasar.doma.internal.apt.TestProcessor; +import static org.junit.jupiter.api.Assertions.*; -import javax.lang.model.element.VariableElement; -import javax.lang.model.type.TypeMirror; -import javax.lang.model.type.TypeVariable; import java.math.BigDecimal; import java.util.Collections; import java.util.List; import java.util.Optional; import java.util.function.Function; - -import static org.junit.jupiter.api.Assertions.*; +import javax.lang.model.element.VariableElement; +import javax.lang.model.type.TypeMirror; +import javax.lang.model.type.TypeVariable; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.seasar.doma.internal.apt.CompilerSupport; +import org.seasar.doma.internal.apt.TestProcessor; class TypeDeclarationTest extends CompilerSupport { diff --git a/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest.java b/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest.java index 26eb7c3a3..00d83e52c 100644 --- a/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest.java +++ b/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest.java @@ -1,5 +1,11 @@ package org.seasar.doma.internal.apt.processor.metamodel; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.net.URL; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Stream; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.TestTemplate; import org.junit.jupiter.api.extension.*; @@ -10,13 +16,6 @@ import org.seasar.doma.internal.apt.SimpleParameterResolver; import org.seasar.doma.internal.apt.processor.EntityProcessor; -import java.net.URL; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Stream; - -import static org.junit.jupiter.api.Assertions.assertTrue; - public class ScopeTest extends CompilerSupport { @BeforeEach From e2a23ca6b5ddecb7d0d0f8226d639d1f6929a722 Mon Sep 17 00:00:00 2001 From: orekyuu Date: Tue, 12 Jan 2021 23:24:18 +0900 Subject: [PATCH 20/31] =?UTF-8?q?TODO=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88?= =?UTF-8?q?=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/seasar/doma/internal/apt/decl/TypeDeclaration.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/TypeDeclaration.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/TypeDeclaration.java index 74ac4c885..0df4b9472 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/TypeDeclaration.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/TypeDeclaration.java @@ -238,7 +238,7 @@ public boolean isScopeMethod(ExecutableElement m, ClassName metamodel) { } VariableElement firstParameter = m.getParameters().get(0); - // TODO: この時点ではmetamodelが作られていないので代入可能かのチェックができない。SimpleNameの比較をしているが名前空間がちがえばすり抜けるため他の良い方法があれば + // Note; Here, type checking cannot be performed correctly because it is before the Metamodel is generated. return firstParameter.asType().toString().equals(metamodel.getSimpleName()); } From 2df6008ba2bbc41df88a58ac24a839f37a578754 Mon Sep 17 00:00:00 2001 From: orekyuu Date: Tue, 19 Jan 2021 00:15:55 +0900 Subject: [PATCH 21/31] =?UTF-8?q?EntityMetaFactory=E3=81=A7ScopeClass?= =?UTF-8?q?=E3=82=92=E5=87=A6=E7=90=86=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../doma/internal/apt/annot/Annotations.java | 58 +++++--------- .../internal/apt/annot/MetamodelAnnot.java | 29 ++++--- .../doma/internal/apt/annot/ScopeClass.java | 21 ++++- .../generator/EntityMetamodelGenerator.java | 76 +++++++++---------- .../internal/apt/meta/entity/EntityMeta.java | 28 ++----- 5 files changed, 102 insertions(+), 110 deletions(-) diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/Annotations.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/Annotations.java index 2bca39a4e..2b2a0ea53 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/Annotations.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/Annotations.java @@ -1,47 +1,20 @@ package org.seasar.doma.internal.apt.annot; -import static org.seasar.doma.internal.util.AssertionUtil.assertNotNull; +import org.seasar.doma.*; +import org.seasar.doma.experimental.DataType; +import org.seasar.doma.internal.apt.Context; +import org.seasar.doma.internal.apt.decl.TypeDeclaration; +import org.seasar.doma.internal.apt.util.AnnotationValueUtil; +import javax.lang.model.element.*; +import javax.lang.model.type.TypeMirror; import java.util.ArrayList; +import java.util.List; import java.util.Map; import java.util.function.BiFunction; import java.util.function.Function; -import javax.lang.model.element.AnnotationMirror; -import javax.lang.model.element.AnnotationValue; -import javax.lang.model.element.Element; -import javax.lang.model.element.ExecutableElement; -import javax.lang.model.element.TypeElement; -import javax.lang.model.element.VariableElement; -import org.seasar.doma.AnnotateWith; -import org.seasar.doma.ArrayFactory; -import org.seasar.doma.BatchDelete; -import org.seasar.doma.BatchInsert; -import org.seasar.doma.BatchUpdate; -import org.seasar.doma.BlobFactory; -import org.seasar.doma.ClobFactory; -import org.seasar.doma.Column; -import org.seasar.doma.Dao; -import org.seasar.doma.Delete; -import org.seasar.doma.Domain; -import org.seasar.doma.DomainConverters; -import org.seasar.doma.Embeddable; -import org.seasar.doma.Entity; -import org.seasar.doma.Insert; -import org.seasar.doma.NClobFactory; -import org.seasar.doma.Procedure; -import org.seasar.doma.ResultSet; -import org.seasar.doma.SQLXMLFactory; -import org.seasar.doma.Script; -import org.seasar.doma.Select; -import org.seasar.doma.SequenceGenerator; -import org.seasar.doma.Sql; -import org.seasar.doma.SqlProcessor; -import org.seasar.doma.Table; -import org.seasar.doma.TableGenerator; -import org.seasar.doma.Update; -import org.seasar.doma.experimental.DataType; -import org.seasar.doma.internal.apt.Context; -import org.seasar.doma.internal.apt.util.AnnotationValueUtil; + +import static org.seasar.doma.internal.util.AssertionUtil.assertNotNull; public class Annotations { @@ -203,7 +176,16 @@ public InsertAnnot newInsertAnnot(ExecutableElement method) { public MetamodelAnnot newMetamodelAnnot(AnnotationMirror annotationMirror) { assertNotNull(annotationMirror); - return newInstance(annotationMirror, MetamodelAnnot::new); + MetamodelAnnot metamodelAnnot = newInstance(annotationMirror, MetamodelAnnot::new); + List types = AnnotationValueUtil.toTypeList(metamodelAnnot.getScope()); + types.stream() + .map(t -> { + TypeDeclaration scopeType = ctx.getDeclarations().newTypeDeclaration(t); + return new ScopeClass(scopeType); + }) + .forEach(metamodelAnnot::addScope); + + return metamodelAnnot; } public NClobFactoryAnnot newNClobFactoryAnnot(ExecutableElement method) { diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/MetamodelAnnot.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/MetamodelAnnot.java index d3990af00..ac5c92ba0 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/MetamodelAnnot.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/MetamodelAnnot.java @@ -1,15 +1,15 @@ package org.seasar.doma.internal.apt.annot; -import static org.seasar.doma.internal.util.AssertionUtil.assertNonNullValue; +import org.seasar.doma.internal.apt.AptIllegalStateException; +import org.seasar.doma.internal.apt.util.AnnotationValueUtil; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; import javax.lang.model.element.AnnotationMirror; import javax.lang.model.element.AnnotationValue; -import javax.lang.model.type.TypeMirror; -import org.seasar.doma.internal.apt.AptIllegalStateException; -import org.seasar.doma.internal.apt.util.AnnotationValueUtil; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import static org.seasar.doma.internal.util.AssertionUtil.assertNonNullValue; public class MetamodelAnnot extends AbstractAnnot { @@ -25,6 +25,8 @@ public class MetamodelAnnot extends AbstractAnnot { private final AnnotationValue scopeClasses; + private final List scopes = new ArrayList<>(); + MetamodelAnnot(AnnotationMirror annotationMirror, Map values) { super(annotationMirror); this.prefix = assertNonNullValue(values, PREFIX); @@ -40,6 +42,10 @@ public AnnotationValue getSuffix() { return suffix; } + public AnnotationValue getScope() { + return scopeClasses; + } + public String getPrefixValue() { String value = AnnotationValueUtil.toString(prefix); if (value == null) { @@ -56,8 +62,11 @@ public String getSuffixValue() { return value; } - public List getScopeValue() { - List type = AnnotationValueUtil.toTypeList(scopeClasses); - return type.stream().map(ScopeClass::new).collect(Collectors.toList()); + public void addScope(ScopeClass scopeClass) { + scopes.add(scopeClass); + } + + public List scopes() { + return scopes; } } diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/ScopeClass.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/ScopeClass.java index 87e3dd5b3..0d1b03010 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/ScopeClass.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/ScopeClass.java @@ -1,13 +1,17 @@ package org.seasar.doma.internal.apt.annot; -import javax.lang.model.type.TypeMirror; import org.seasar.doma.internal.ClassName; import org.seasar.doma.internal.ClassNames; +import org.seasar.doma.internal.apt.decl.MethodDeclaration; +import org.seasar.doma.internal.apt.decl.TypeDeclaration; + +import javax.lang.model.type.TypeMirror; +import java.util.List; public class ScopeClass { - final TypeMirror type; + final TypeDeclaration type; - public ScopeClass(TypeMirror type) { + public ScopeClass(TypeDeclaration type) { this.type = type; } @@ -17,7 +21,16 @@ public ClassName className() { } public TypeMirror asType() { - return type; + return type.getType(); + } + + public List scopeMethods(ClassName metamodelName) { + return type.getScopeMethods(metamodelName); + } + + public String scopeField() { + String name = className().getSimpleName(); + return "_scope_" + name; } @Override diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java index 4aaba0b75..01068fe6c 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java @@ -1,24 +1,14 @@ package org.seasar.doma.internal.apt.generator; -import static org.seasar.doma.internal.util.AssertionUtil.assertNotNull; - -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; -import javax.lang.model.element.Name; -import javax.lang.model.element.TypeElement; -import javax.lang.model.element.VariableElement; -import javax.lang.model.type.ArrayType; -import javax.lang.model.type.TypeMirror; import org.seasar.doma.internal.ClassName; import org.seasar.doma.internal.ClassNames; import org.seasar.doma.internal.apt.AptIllegalStateException; import org.seasar.doma.internal.apt.Context; +import org.seasar.doma.internal.apt.annot.MetamodelAnnot; +import org.seasar.doma.internal.apt.annot.ScopeClass; import org.seasar.doma.internal.apt.cttype.CtType; import org.seasar.doma.internal.apt.decl.MethodDeclaration; -import org.seasar.doma.internal.apt.decl.TypeDeclaration; import org.seasar.doma.internal.apt.meta.entity.EntityMeta; -import org.seasar.doma.internal.apt.meta.entity.EntityMetaScope; import org.seasar.doma.internal.apt.meta.entity.EntityPropertyMeta; import org.seasar.doma.internal.util.Pair; import org.seasar.doma.jdbc.criteria.metamodel.DefaultPropertyMetamodel; @@ -27,6 +17,17 @@ import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel; import org.seasar.doma.jdbc.entity.EntityType; +import javax.lang.model.element.Name; +import javax.lang.model.element.TypeElement; +import javax.lang.model.element.VariableElement; +import javax.lang.model.type.ArrayType; +import javax.lang.model.type.TypeMirror; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +import static org.seasar.doma.internal.util.AssertionUtil.assertNotNull; + public class EntityMetamodelGenerator extends AbstractGenerator { private final EntityMeta entityMeta; @@ -99,9 +100,9 @@ private void printQualifiedTableNameField() { } private void printScopeField() { - List scopes = entityMeta.getAllMetaScope(); - for (EntityMetaScope scope : scopes) { - iprint("private final %1$s %2$s = new %1$s();%n", scope.scopeClass(), scope.scopeField()); + MetamodelAnnot metamodelValue = entityMeta.getEntityAnnot().getMetamodelValue(); + for (ScopeClass scope : metamodelValue.scopes()) { + iprint("private final %1$s %2$s = new %1$s();%n", scope, scope.scopeField()); print("%n"); } } @@ -200,35 +201,34 @@ private void printAllPropertyMetamodelsMethod() { } private void printScopeMethods() { - for (EntityMetaScope scope : entityMeta.getAllMetaScope()) { - TypeDeclaration declaration = - ctx.getDeclarations().newTypeDeclaration(scope.scopeClass().asType()); - printScopeMethods(scope, declaration); + MetamodelAnnot metamodel = entityMeta.getEntityAnnot().getMetamodelValue(); + for (ScopeClass scopeClass : metamodel.scopes()) { + for (MethodDeclaration method : scopeClass.scopeMethods(className)) { + printScopeMethod(scopeClass, method); + } } } - private void printScopeMethods(EntityMetaScope scope, TypeDeclaration scopeDeclaration) { - for (MethodDeclaration method : scopeDeclaration.getScopeMethods(className)) { - List parameters = new ArrayList<>(method.parameters()); - parameters.remove(0); + private void printScopeMethod(ScopeClass scope, MethodDeclaration method) { + List parameters = new ArrayList<>(method.parameters()); + parameters.remove(0); - iprint( - "public %1$s %2$s(%3$s) {%n", - method.getReturnTypeDeclaration(), - method.name(), - generateParameterList(method, parameters)); - indent(); + iprint( + "public %1$s %2$s(%3$s) {%n", + method.getReturnTypeDeclaration(), + method.name(), + generateParameterList(method, parameters)); + indent(); - String params = - parameters.stream().map(VariableElement::getSimpleName).collect(Collectors.joining(", ")); - if (!params.isEmpty()) { - params = ", " + params; - } - iprint("return %1$s.%2$s(this%3$s);%n", scope.scopeField(), method.name(), params); - unindent(); - iprint("}%n"); - print("%n"); + String params = + parameters.stream().map(VariableElement::getSimpleName).collect(Collectors.joining(", ")); + if (!params.isEmpty()) { + params = ", " + params; } + iprint("return %1$s.%2$s(this%3$s);%n", scope.scopeField(), method.name(), params); + unindent(); + iprint("}%n"); + print("%n"); } private String generateParameterList( diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityMeta.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityMeta.java index 3dc069ba1..30c0f44b9 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityMeta.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityMeta.java @@ -1,22 +1,19 @@ package org.seasar.doma.internal.apt.meta.entity; -import static org.seasar.doma.internal.util.AssertionUtil.assertNotNull; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; -import javax.lang.model.element.Modifier; -import javax.lang.model.element.TypeElement; -import javax.lang.model.type.TypeMirror; import org.seasar.doma.internal.apt.annot.EntityAnnot; -import org.seasar.doma.internal.apt.annot.MetamodelAnnot; -import org.seasar.doma.internal.apt.annot.ScopeClass; import org.seasar.doma.internal.apt.annot.TableAnnot; import org.seasar.doma.internal.apt.meta.TypeElementMeta; import org.seasar.doma.jdbc.entity.NamingType; import org.seasar.doma.jdbc.entity.NullEntityListener; +import javax.lang.model.element.Modifier; +import javax.lang.model.element.TypeElement; +import javax.lang.model.type.TypeMirror; +import java.util.ArrayList; +import java.util.List; + +import static org.seasar.doma.internal.util.AssertionUtil.assertNotNull; + public class EntityMeta implements TypeElementMeta { private final List allPropertyMetas = new ArrayList<>(); @@ -120,15 +117,6 @@ public List getIdPropertyMetas() { return idPropertyMetas; } - public List getAllMetaScope() { - MetamodelAnnot metamodelValue = getEntityAnnot().getMetamodelValue(); - if (metamodelValue == null) { - return Collections.emptyList(); - } - List scopeClasses = metamodelValue.getScopeValue(); - return scopeClasses.stream().map(EntityMetaScope::new).collect(Collectors.toList()); - } - public boolean hasVersionPropertyMeta() { return versionPropertyMeta != null; } From 3ba142f2c8bd59341b0995befede133b28f9bc8f Mon Sep 17 00:00:00 2001 From: orekyuu Date: Tue, 19 Jan 2021 00:16:42 +0900 Subject: [PATCH 22/31] printScopeField -> printScopeFields --- .../doma/internal/apt/generator/EntityMetamodelGenerator.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java index 01068fe6c..d7ee89d9b 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java @@ -79,7 +79,7 @@ private void printFields() { printEntityTypeField(); printAllPropertyMetamodelsFields(); printPropertyMetamodelFields(); - printScopeField(); + printScopeFields(); } private void printEntityTypeField() { @@ -99,7 +99,7 @@ private void printQualifiedTableNameField() { print("%n"); } - private void printScopeField() { + private void printScopeFields() { MetamodelAnnot metamodelValue = entityMeta.getEntityAnnot().getMetamodelValue(); for (ScopeClass scope : metamodelValue.scopes()) { iprint("private final %1$s %2$s = new %1$s();%n", scope, scope.scopeField()); From 45f0ad27083e9c661be5c0093a6990a64bb96949 Mon Sep 17 00:00:00 2001 From: orekyuu Date: Tue, 19 Jan 2021 00:17:37 +0900 Subject: [PATCH 23/31] _scope_ -> __scope__ --- .../java/org/seasar/doma/internal/apt/annot/ScopeClass.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/ScopeClass.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/ScopeClass.java index 0d1b03010..68c5a981d 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/ScopeClass.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/ScopeClass.java @@ -30,7 +30,7 @@ public List scopeMethods(ClassName metamodelName) { public String scopeField() { String name = className().getSimpleName(); - return "_scope_" + name; + return "__scope__" + name; } @Override From 30a461e1b38aa72b1427a4f6ded996e4b4395dc9 Mon Sep 17 00:00:00 2001 From: orekyuu Date: Tue, 19 Jan 2021 00:18:08 +0900 Subject: [PATCH 24/31] =?UTF-8?q?=E4=B8=8D=E8=A6=81=E3=81=AB=E3=81=AA?= =?UTF-8?q?=E3=81=A3=E3=81=9F=E3=82=AF=E3=83=A9=E3=82=B9=E3=82=92=E5=89=8A?= =?UTF-8?q?=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apt/meta/entity/EntityMetaScope.java | 20 ------------------- 1 file changed, 20 deletions(-) delete mode 100644 doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityMetaScope.java diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityMetaScope.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityMetaScope.java deleted file mode 100644 index eea1b9ca4..000000000 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityMetaScope.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.seasar.doma.internal.apt.meta.entity; - -import org.seasar.doma.internal.apt.annot.ScopeClass; - -public class EntityMetaScope { - final ScopeClass scopeClass; - - public EntityMetaScope(ScopeClass scopeClass) { - this.scopeClass = scopeClass; - } - - public ScopeClass scopeClass() { - return scopeClass; - } - - public String scopeField() { - String name = scopeClass().className().getSimpleName(); - return "_scope_" + name; - } -} From 22e732d1c622d7691fe6d75b849110004c952379 Mon Sep 17 00:00:00 2001 From: orekyuu Date: Tue, 19 Jan 2021 00:21:48 +0900 Subject: [PATCH 25/31] =?UTF-8?q?scope=E3=81=AE=E3=83=95=E3=82=A3=E3=83=BC?= =?UTF-8?q?=E3=83=AB=E3=83=89=E5=90=8D=E3=82=92=E5=AE=8C=E5=85=A8=E4=BF=AE?= =?UTF-8?q?=E9=A3=BE=E5=90=8D=E3=81=AB=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/seasar/doma/internal/apt/annot/ScopeClass.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/ScopeClass.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/ScopeClass.java index 68c5a981d..b022bc39c 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/ScopeClass.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/ScopeClass.java @@ -29,7 +29,7 @@ public List scopeMethods(ClassName metamodelName) { } public String scopeField() { - String name = className().getSimpleName(); + String name = className().toString().replace(".", "_"); return "__scope__" + name; } From e77113193cab70cace8f75c44ad3ee78109f2063 Mon Sep 17 00:00:00 2001 From: orekyuu Date: Tue, 19 Jan 2021 00:23:20 +0900 Subject: [PATCH 26/31] =?UTF-8?q?=E6=96=B0=E3=81=97=E3=81=84Metamodel?= =?UTF-8?q?=E3=81=AE=E3=82=B3=E3=83=BC=E3=83=89=E3=81=AB=E8=BF=BD=E5=BE=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../metamodel/ScopeTest_MultiScopeEntity.txt | 10 +++++----- .../processor/metamodel/ScopeTest_ScopedEntity.txt | 12 ++++++------ 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest_MultiScopeEntity.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest_MultiScopeEntity.txt index 662cbf520..27936ea8a 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest_MultiScopeEntity.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest_MultiScopeEntity.txt @@ -20,9 +20,9 @@ public final class MultiScopeEntity_ implements org.seasar.doma.jdbc.criteria.me public final org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel createdAt = new org.seasar.doma.jdbc.criteria.metamodel.DefaultPropertyMetamodel(java.time.LocalDateTime.class, __entityType, "createdAt"); - private final org.seasar.doma.internal.apt.processor.entity.CreatedAtScope _scope_CreatedAtScope = new org.seasar.doma.internal.apt.processor.entity.CreatedAtScope(); + private final org.seasar.doma.internal.apt.processor.entity.CreatedAtScope __scope__org_seasar_doma_internal_apt_processor_entity_CreatedAtScope = new org.seasar.doma.internal.apt.processor.entity.CreatedAtScope(); - private final org.seasar.doma.internal.apt.processor.entity.NameScope _scope_NameScope = new org.seasar.doma.internal.apt.processor.entity.NameScope(); + private final org.seasar.doma.internal.apt.processor.entity.NameScope __scope__org_seasar_doma_internal_apt_processor_entity_NameScope = new org.seasar.doma.internal.apt.processor.entity.NameScope(); public MultiScopeEntity_() { this(""); @@ -48,11 +48,11 @@ public final class MultiScopeEntity_ implements org.seasar.doma.jdbc.criteria.me } public java.util.function.Consumer today() { - return _scope_CreatedAtScope.today(this); + return __scope__org_seasar_doma_internal_apt_processor_entity_CreatedAtScope.today(this); } public java.util.function.Consumer nameEq(java.lang.String name) { - return _scope_NameScope.nameEq(this, name); + return __scope__org_seasar_doma_internal_apt_processor_entity_NameScope.nameEq(this, name); } -} +} \ No newline at end of file diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest_ScopedEntity.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest_ScopedEntity.txt index c0d5b9f52..8a6a2efb2 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest_ScopedEntity.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/ScopeTest_ScopedEntity.txt @@ -18,7 +18,7 @@ public final class ScopedEntity_ implements org.seasar.doma.jdbc.criteria.metamo public final org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel name = new org.seasar.doma.jdbc.criteria.metamodel.DefaultPropertyMetamodel(java.lang.String.class, __entityType, "name"); - private final org.seasar.doma.internal.apt.processor.entity.ScopeClass _scope_ScopeClass = new org.seasar.doma.internal.apt.processor.entity.ScopeClass(); + private final org.seasar.doma.internal.apt.processor.entity.ScopeClass __scope__org_seasar_doma_internal_apt_processor_entity_ScopeClass = new org.seasar.doma.internal.apt.processor.entity.ScopeClass(); public ScopedEntity_() { this(""); @@ -43,19 +43,19 @@ public final class ScopedEntity_ implements org.seasar.doma.jdbc.criteria.metamo } public java.util.function.Consumer startWithHoge() { - return _scope_ScopeClass.startWithHoge(this); + return __scope__org_seasar_doma_internal_apt_processor_entity_ScopeClass.startWithHoge(this); } public java.util.function.Consumer ids(long[] ids) { - return _scope_ScopeClass.ids(this, ids); + return __scope__org_seasar_doma_internal_apt_processor_entity_ScopeClass.ids(this, ids); } public java.util.function.Consumer names(java.lang.String... names) { - return _scope_ScopeClass.names(this, names); + return __scope__org_seasar_doma_internal_apt_processor_entity_ScopeClass.names(this, names); } public java.util.function.Consumer idAndName(long id, java.lang.String name) { - return _scope_ScopeClass.idAndName(this, id, name); + return __scope__org_seasar_doma_internal_apt_processor_entity_ScopeClass.idAndName(this, id, name); } -} +} \ No newline at end of file From c581150e5b7518ce5cc00d490b66cbf7b4eae1f8 Mon Sep 17 00:00:00 2001 From: orekyuu Date: Tue, 19 Jan 2021 22:33:23 +0900 Subject: [PATCH 27/31] Reformat --- .../doma/internal/apt/annot/Annotations.java | 5 ++-- .../internal/apt/decl/TypeDeclaration.java | 28 ++++++++++--------- .../generator/EntityMetamodelGenerator.java | 21 +++++++------- .../internal/apt/meta/entity/EntityMeta.java | 15 +++++----- 4 files changed, 35 insertions(+), 34 deletions(-) diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/Annotations.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/Annotations.java index 2b2a0ea53..6d24b5d51 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/Annotations.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/Annotations.java @@ -179,11 +179,12 @@ public MetamodelAnnot newMetamodelAnnot(AnnotationMirror annotationMirror) { MetamodelAnnot metamodelAnnot = newInstance(annotationMirror, MetamodelAnnot::new); List types = AnnotationValueUtil.toTypeList(metamodelAnnot.getScope()); types.stream() - .map(t -> { + .map( + t -> { TypeDeclaration scopeType = ctx.getDeclarations().newTypeDeclaration(t); return new ScopeClass(scopeType); }) - .forEach(metamodelAnnot::addScope); + .forEach(metamodelAnnot::addScope); return metamodelAnnot; } diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/TypeDeclaration.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/TypeDeclaration.java index 0df4b9472..377453e2f 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/TypeDeclaration.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/TypeDeclaration.java @@ -1,17 +1,5 @@ package org.seasar.doma.internal.apt.decl; -import static java.util.stream.Collectors.toList; -import static javax.lang.model.util.ElementFilter.*; -import static org.seasar.doma.internal.util.AssertionUtil.assertNotNull; -import static org.seasar.doma.internal.util.AssertionUtil.assertTrue; - -import java.math.BigDecimal; -import java.math.BigInteger; -import java.util.*; -import java.util.function.Predicate; -import javax.lang.model.element.*; -import javax.lang.model.type.TypeKind; -import javax.lang.model.type.TypeMirror; import org.seasar.doma.internal.ClassName; import org.seasar.doma.internal.apt.Context; import org.seasar.doma.internal.apt.MoreTypes; @@ -19,6 +7,19 @@ import org.seasar.doma.internal.util.Pair; import org.seasar.doma.internal.util.Zip; +import javax.lang.model.element.*; +import javax.lang.model.type.TypeKind; +import javax.lang.model.type.TypeMirror; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.util.*; +import java.util.function.Predicate; + +import static java.util.stream.Collectors.toList; +import static javax.lang.model.util.ElementFilter.*; +import static org.seasar.doma.internal.util.AssertionUtil.assertNotNull; +import static org.seasar.doma.internal.util.AssertionUtil.assertTrue; + public class TypeDeclaration { private static final Map NUMBER_PRIORITY_MAP = new HashMap<>(); @@ -238,7 +239,8 @@ public boolean isScopeMethod(ExecutableElement m, ClassName metamodel) { } VariableElement firstParameter = m.getParameters().get(0); - // Note; Here, type checking cannot be performed correctly because it is before the Metamodel is generated. + // Note; Here, type checking cannot be performed correctly because it is before the Metamodel is + // generated. return firstParameter.asType().toString().equals(metamodel.getSimpleName()); } diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java index d7ee89d9b..7cce3459e 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java @@ -1,5 +1,15 @@ package org.seasar.doma.internal.apt.generator; +import static org.seasar.doma.internal.util.AssertionUtil.assertNotNull; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; +import javax.lang.model.element.Name; +import javax.lang.model.element.TypeElement; +import javax.lang.model.element.VariableElement; +import javax.lang.model.type.ArrayType; +import javax.lang.model.type.TypeMirror; import org.seasar.doma.internal.ClassName; import org.seasar.doma.internal.ClassNames; import org.seasar.doma.internal.apt.AptIllegalStateException; @@ -17,17 +27,6 @@ import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel; import org.seasar.doma.jdbc.entity.EntityType; -import javax.lang.model.element.Name; -import javax.lang.model.element.TypeElement; -import javax.lang.model.element.VariableElement; -import javax.lang.model.type.ArrayType; -import javax.lang.model.type.TypeMirror; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; - -import static org.seasar.doma.internal.util.AssertionUtil.assertNotNull; - public class EntityMetamodelGenerator extends AbstractGenerator { private final EntityMeta entityMeta; diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityMeta.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityMeta.java index 30c0f44b9..b1f173375 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityMeta.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityMeta.java @@ -1,19 +1,18 @@ package org.seasar.doma.internal.apt.meta.entity; +import static org.seasar.doma.internal.util.AssertionUtil.assertNotNull; + +import java.util.ArrayList; +import java.util.List; +import javax.lang.model.element.Modifier; +import javax.lang.model.element.TypeElement; +import javax.lang.model.type.TypeMirror; import org.seasar.doma.internal.apt.annot.EntityAnnot; import org.seasar.doma.internal.apt.annot.TableAnnot; import org.seasar.doma.internal.apt.meta.TypeElementMeta; import org.seasar.doma.jdbc.entity.NamingType; import org.seasar.doma.jdbc.entity.NullEntityListener; -import javax.lang.model.element.Modifier; -import javax.lang.model.element.TypeElement; -import javax.lang.model.type.TypeMirror; -import java.util.ArrayList; -import java.util.List; - -import static org.seasar.doma.internal.util.AssertionUtil.assertNotNull; - public class EntityMeta implements TypeElementMeta { private final List allPropertyMetas = new ArrayList<>(); From bbed38e34cb2edaed866bdb969dbb97a8df77aeb Mon Sep 17 00:00:00 2001 From: orekyuu Date: Tue, 19 Jan 2021 23:04:29 +0900 Subject: [PATCH 28/31] =?UTF-8?q?newMetamodelAnnot=E3=81=99=E3=82=8B?= =?UTF-8?q?=E3=81=A8=E3=81=8D=E3=81=ABMethod=E3=81=AE=E4=B8=80=E8=A6=A7?= =?UTF-8?q?=E3=82=92=E8=AA=BF=E3=81=B9=E3=81=A6=E3=81=8A=E3=81=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../doma/internal/apt/annot/Annotations.java | 20 ++++++--- .../doma/internal/apt/annot/ScopeClass.java | 36 +++++++++++++-- .../internal/apt/decl/MethodDeclaration.java | 14 ------ .../internal/apt/decl/TypeDeclaration.java | 27 ------------ .../generator/EntityMetamodelGenerator.java | 17 ++++--- .../apt/decl/TypeDeclarationTest.java | 44 ------------------- 6 files changed, 56 insertions(+), 102 deletions(-) diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/Annotations.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/Annotations.java index 6d24b5d51..b814678ab 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/Annotations.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/Annotations.java @@ -8,6 +8,7 @@ import javax.lang.model.element.*; import javax.lang.model.type.TypeMirror; +import javax.lang.model.util.ElementFilter; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -178,17 +179,22 @@ public MetamodelAnnot newMetamodelAnnot(AnnotationMirror annotationMirror) { assertNotNull(annotationMirror); MetamodelAnnot metamodelAnnot = newInstance(annotationMirror, MetamodelAnnot::new); List types = AnnotationValueUtil.toTypeList(metamodelAnnot.getScope()); - types.stream() - .map( - t -> { - TypeDeclaration scopeType = ctx.getDeclarations().newTypeDeclaration(t); - return new ScopeClass(scopeType); - }) - .forEach(metamodelAnnot::addScope); + for (TypeMirror t : types) { + ScopeClass scopeClass = newScopeClass(t); + metamodelAnnot.addScope(scopeClass); + } return metamodelAnnot; } + private ScopeClass newScopeClass(TypeMirror scopeType) { + TypeDeclaration type = ctx.getDeclarations().newTypeDeclaration(scopeType); + TypeElement typeElement = ctx.getMoreTypes().toTypeElement(scopeType); + List members = ctx.getMoreElements().getAllMembers(typeElement); + List methods = new ArrayList<>(ElementFilter.methodsIn(members)); + return new ScopeClass(type, methods); + } + public NClobFactoryAnnot newNClobFactoryAnnot(ExecutableElement method) { assertNotNull(method); return newInstance(method, NClobFactory.class, NClobFactoryAnnot::new); diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/ScopeClass.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/ScopeClass.java index b022bc39c..17de0441b 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/ScopeClass.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/ScopeClass.java @@ -5,14 +5,21 @@ import org.seasar.doma.internal.apt.decl.MethodDeclaration; import org.seasar.doma.internal.apt.decl.TypeDeclaration; +import javax.lang.model.element.ExecutableElement; +import javax.lang.model.element.Modifier; +import javax.lang.model.element.VariableElement; +import javax.lang.model.type.TypeKind; import javax.lang.model.type.TypeMirror; import java.util.List; +import java.util.stream.Collectors; public class ScopeClass { final TypeDeclaration type; + final List methods; - public ScopeClass(TypeDeclaration type) { + public ScopeClass(TypeDeclaration type, List methods) { this.type = type; + this.methods = methods; } public ClassName className() { @@ -24,8 +31,8 @@ public TypeMirror asType() { return type.getType(); } - public List scopeMethods(ClassName metamodelName) { - return type.getScopeMethods(metamodelName); + public List scopeMethods(ClassName metamodelName) { + return methods.stream().filter(m -> isScopeMethod(m, metamodelName)).collect(Collectors.toList()); } public String scopeField() { @@ -33,6 +40,29 @@ public String scopeField() { return "__scope__" + name; } + private boolean isScopeMethod(ExecutableElement m, ClassName metamodel) { + if (m.getModifiers().contains(Modifier.STATIC)) { + return false; + } + + if (!m.getModifiers().contains(Modifier.PUBLIC)) { + return false; + } + + if (m.getReturnType().getKind() == TypeKind.VOID) { + return false; + } + + if (m.getParameters().size() < 1) { + return false; + } + + VariableElement firstParameter = m.getParameters().get(0); + // Note; Here, type checking cannot be performed correctly because it is before the Metamodel is + // generated. + return firstParameter.asType().toString().equals(metamodel.getSimpleName()); + } + @Override public String toString() { return className().toString(); diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/MethodDeclaration.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/MethodDeclaration.java index d94fe22f3..8239725fd 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/MethodDeclaration.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/MethodDeclaration.java @@ -2,10 +2,8 @@ import static org.seasar.doma.internal.util.AssertionUtil.assertNotNull; -import java.util.List; import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.Modifier; -import javax.lang.model.element.VariableElement; public class MethodDeclaration { @@ -30,16 +28,4 @@ public TypeDeclaration getReturnTypeDeclaration() { public boolean isStatic() { return element.getModifiers().contains(Modifier.STATIC); } - - public String name() { - return element.getSimpleName().toString(); - } - - public List parameters() { - return element.getParameters(); - } - - public boolean isVarArgs() { - return element.isVarArgs(); - } } diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/TypeDeclaration.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/TypeDeclaration.java index 377453e2f..98de718ad 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/TypeDeclaration.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/TypeDeclaration.java @@ -217,33 +217,6 @@ private void removeHiddenFieldDeclarations(List candidates) { } } - public List getScopeMethods(ClassName metamodel) { - return getMethods(m -> isScopeMethod(m, metamodel)); - } - - public boolean isScopeMethod(ExecutableElement m, ClassName metamodel) { - if (m.getModifiers().contains(Modifier.STATIC)) { - return false; - } - - if (!m.getModifiers().contains(Modifier.PUBLIC)) { - return false; - } - - if (m.getReturnType().getKind() == TypeKind.VOID) { - return false; - } - - if (m.getParameters().size() < 1) { - return false; - } - - VariableElement firstParameter = m.getParameters().get(0); - // Note; Here, type checking cannot be performed correctly because it is before the Metamodel is - // generated. - return firstParameter.asType().toString().equals(metamodel.getSimpleName()); - } - public Optional getMethodDeclaration( String name, List parameterTypeDeclarations) { return getMethodDeclarationInternal(name, parameterTypeDeclarations, false); diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java index 7cce3459e..fffb60c2c 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java @@ -5,6 +5,7 @@ import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; +import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.Name; import javax.lang.model.element.TypeElement; import javax.lang.model.element.VariableElement; @@ -202,20 +203,22 @@ private void printAllPropertyMetamodelsMethod() { private void printScopeMethods() { MetamodelAnnot metamodel = entityMeta.getEntityAnnot().getMetamodelValue(); for (ScopeClass scopeClass : metamodel.scopes()) { - for (MethodDeclaration method : scopeClass.scopeMethods(className)) { + for (ExecutableElement method : scopeClass.scopeMethods(className)) { printScopeMethod(scopeClass, method); } } } - private void printScopeMethod(ScopeClass scope, MethodDeclaration method) { - List parameters = new ArrayList<>(method.parameters()); + private void printScopeMethod(ScopeClass scope, ExecutableElement method) { + List parameters = new ArrayList<>(method.getParameters()); + TypeMirror returnType = method.getReturnType(); + String methodName = method.getSimpleName().toString(); parameters.remove(0); iprint( "public %1$s %2$s(%3$s) {%n", - method.getReturnTypeDeclaration(), - method.name(), + returnType, + methodName, generateParameterList(method, parameters)); indent(); @@ -224,14 +227,14 @@ private void printScopeMethod(ScopeClass scope, MethodDeclaration method) { if (!params.isEmpty()) { params = ", " + params; } - iprint("return %1$s.%2$s(this%3$s);%n", scope.scopeField(), method.name(), params); + iprint("return %1$s.%2$s(this%3$s);%n", scope.scopeField(), method, params); unindent(); iprint("}%n"); print("%n"); } private String generateParameterList( - MethodDeclaration method, List parameters) { + ExecutableElement method, List parameters) { List params = new ArrayList<>(); for (int i = 0; i < parameters.size(); i++) { VariableElement variable = parameters.get(i); diff --git a/doma-processor/src/test/java/org/seasar/doma/internal/apt/decl/TypeDeclarationTest.java b/doma-processor/src/test/java/org/seasar/doma/internal/apt/decl/TypeDeclarationTest.java index bb9e58f8b..731d47ac0 100644 --- a/doma-processor/src/test/java/org/seasar/doma/internal/apt/decl/TypeDeclarationTest.java +++ b/doma-processor/src/test/java/org/seasar/doma/internal/apt/decl/TypeDeclarationTest.java @@ -433,50 +433,6 @@ protected void run() { }); } - @Test - void getMethodDeclarationParameters() { - Class testClass = getClass(); - addProcessor( - new TestProcessor() { - @Override - protected void run() { - TypeDeclaration typeDeclaration = ctx.getDeclarations().newTypeDeclaration(testClass); - TypeDeclaration parameterDeclaration = - ctx.getDeclarations().newTypeDeclaration(Integer.class); - Optional methodDeclaration = - typeDeclaration.getMethodDeclaration( - "myMethod", Collections.singletonList(parameterDeclaration)); - assertTrue(methodDeclaration.isPresent()); - MethodDeclaration declaration = methodDeclaration.get(); - List parameters = declaration.parameters(); - assertEquals(parameters.size(), 1); - VariableElement first = parameters.get(0); - assertEquals(first.getSimpleName().toString(), "integer"); - assertEquals(first.asType().toString(), "java.lang.Integer"); - assertFalse(declaration.isVarArgs()); - } - }, - new TestProcessor() { - @Override - protected void run() { - TypeDeclaration typeDeclaration = ctx.getDeclarations().newTypeDeclaration(testClass); - TypeDeclaration parameterDeclaration = - ctx.getDeclarations().newTypeDeclaration(String[].class); - Optional methodDeclaration = - typeDeclaration.getMethodDeclaration( - "varArgs", Collections.singletonList(parameterDeclaration)); - assertTrue(methodDeclaration.isPresent()); - MethodDeclaration declaration = methodDeclaration.get(); - List parameters = declaration.parameters(); - assertEquals(parameters.size(), 1); - VariableElement first = parameters.get(0); - assertEquals(first.getSimpleName().toString(), "args"); - assertEquals(first.asType().toString(), "java.lang.String[]"); - assertTrue(declaration.isVarArgs()); - } - }); - } - @Test void emulateConcatOperation() { addProcessor( From 2ae744b281405f21a428bf117a75043b6b90ca9e Mon Sep 17 00:00:00 2001 From: orekyuu Date: Tue, 19 Jan 2021 23:05:42 +0900 Subject: [PATCH 29/31] =?UTF-8?q?TypeDeclaration=E3=82=92=E3=82=82?= =?UTF-8?q?=E3=81=A8=E3=81=AB=E6=88=BB=E3=81=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../internal/apt/decl/TypeDeclaration.java | 189 +++++++++--------- 1 file changed, 96 insertions(+), 93 deletions(-) diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/TypeDeclaration.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/TypeDeclaration.java index 98de718ad..120482688 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/TypeDeclaration.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/TypeDeclaration.java @@ -1,25 +1,34 @@ package org.seasar.doma.internal.apt.decl; -import org.seasar.doma.internal.ClassName; -import org.seasar.doma.internal.apt.Context; -import org.seasar.doma.internal.apt.MoreTypes; -import org.seasar.doma.internal.apt.cttype.*; -import org.seasar.doma.internal.util.Pair; -import org.seasar.doma.internal.util.Zip; - -import javax.lang.model.element.*; -import javax.lang.model.type.TypeKind; -import javax.lang.model.type.TypeMirror; -import java.math.BigDecimal; -import java.math.BigInteger; -import java.util.*; -import java.util.function.Predicate; - import static java.util.stream.Collectors.toList; import static javax.lang.model.util.ElementFilter.*; import static org.seasar.doma.internal.util.AssertionUtil.assertNotNull; import static org.seasar.doma.internal.util.AssertionUtil.assertTrue; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import javax.lang.model.element.*; +import javax.lang.model.type.TypeKind; +import javax.lang.model.type.TypeMirror; +import org.seasar.doma.internal.apt.Context; +import org.seasar.doma.internal.apt.MoreTypes; +import org.seasar.doma.internal.apt.cttype.ArrayCtType; +import org.seasar.doma.internal.apt.cttype.BasicCtType; +import org.seasar.doma.internal.apt.cttype.CtType; +import org.seasar.doma.internal.apt.cttype.DomainCtType; +import org.seasar.doma.internal.apt.cttype.IterableCtType; +import org.seasar.doma.internal.apt.cttype.SimpleCtTypeVisitor; +import org.seasar.doma.internal.util.Pair; +import org.seasar.doma.internal.util.Zip; + public class TypeDeclaration { private static final Map NUMBER_PRIORITY_MAP = new HashMap<>(); @@ -54,11 +63,11 @@ public class TypeDeclaration { private final int numberPriority; protected TypeDeclaration( - Context ctx, - TypeMirror type, - CtType ctType, - TypeElement typeElement, - Map> typeParameterDeclarationsMap) { + Context ctx, + TypeMirror type, + CtType ctType, + TypeElement typeElement, + Map> typeParameterDeclarationsMap) { assertNotNull(ctx, type, ctType, typeParameterDeclarationsMap); this.ctx = ctx; this.type = type; @@ -89,13 +98,13 @@ public boolean isNullType() { public boolean isBooleanType() { return type.getKind() == TypeKind.BOOLEAN - || ctx.getMoreTypes().isSameTypeWithErasure(type, Boolean.class); + || ctx.getMoreTypes().isSameTypeWithErasure(type, Boolean.class); } public boolean isTextType() { return type.getKind() == TypeKind.CHAR - || ctx.getMoreTypes().isSameTypeWithErasure(type, String.class) - || ctx.getMoreTypes().isSameTypeWithErasure(type, Character.class); + || ctx.getMoreTypes().isSameTypeWithErasure(type, String.class) + || ctx.getMoreTypes().isSameTypeWithErasure(type, Character.class); } public boolean isNumberType() { @@ -126,54 +135,54 @@ public boolean isScalarType() { public boolean isScalarIterableType() { return ctType.accept( - new SimpleCtTypeVisitor() { + new SimpleCtTypeVisitor() { - @Override - protected Boolean defaultAction(CtType ctType, Void aVoid) { - return false; - } + @Override + protected Boolean defaultAction(CtType ctType, Void aVoid) { + return false; + } - @Override - public Boolean visitIterableCtType(IterableCtType ctType, Void aVoid) { - return ctType.getElementCtType().accept(new ScalarDetector(), aVoid); - } - }, - null); + @Override + public Boolean visitIterableCtType(IterableCtType ctType, Void aVoid) { + return ctType.getElementCtType().accept(new ScalarDetector(), aVoid); + } + }, + null); } public boolean isScalarArrayType() { return ctType.accept( - new SimpleCtTypeVisitor() { - @Override - protected Boolean defaultAction(CtType ctType, Void aVoid) { - return false; - } + new SimpleCtTypeVisitor() { + @Override + protected Boolean defaultAction(CtType ctType, Void aVoid) { + return false; + } - @Override - public Boolean visitArrayCtType(ArrayCtType ctType, Void aVoid) { - return ctType.getElementCtType().accept(new ScalarDetector(), aVoid); - } - }, - null); + @Override + public Boolean visitArrayCtType(ArrayCtType ctType, Void aVoid) { + return ctType.getElementCtType().accept(new ScalarDetector(), aVoid); + } + }, + null); } public List getTypeParameterDeclarations() { Optional> typeParameterDeclarations = - typeParameterDeclarationsMap.values().stream().findFirst(); + typeParameterDeclarationsMap.values().stream().findFirst(); return typeParameterDeclarations.orElse(Collections.emptyList()); } public Optional getConstructorDeclaration( - List parameterTypeDeclarations) { + List parameterTypeDeclarations) { if (typeElement == null) { return Optional.empty(); } return constructorsIn(typeElement.getEnclosedElements()).stream() - .filter(c -> c.getModifiers().contains(Modifier.PUBLIC)) - .filter(c -> c.getParameters().size() == parameterTypeDeclarations.size()) - .filter(c -> isAssignable(parameterTypeDeclarations, c.getParameters())) - .map(c -> ctx.getDeclarations().newConstructorDeclaration(c)) - .findAny(); + .filter(c -> c.getModifiers().contains(Modifier.PUBLIC)) + .filter(c -> c.getParameters().size() == parameterTypeDeclarations.size()) + .filter(c -> isAssignable(parameterTypeDeclarations, c.getParameters())) + .map(c -> ctx.getDeclarations().newConstructorDeclaration(c)) + .findAny(); } public Optional getFieldDeclaration(String name) { @@ -192,16 +201,16 @@ private Optional getFieldDeclarationInternal(String name, bool private List getCandidateFieldDeclarations(String name, boolean statik) { return typeParameterDeclarationsMap.entrySet().stream() - .map(e -> new Pair<>(e.getKey(), e.getValue())) - .map(p -> new Pair<>(ctx.getMoreElements().getTypeElement(p.fst), p.snd)) - .filter(p -> Objects.nonNull(p.fst)) - .flatMap( - p -> - fieldsIn(p.fst.getEnclosedElements()).stream() - .filter(f -> !statik || f.getModifiers().contains(Modifier.STATIC)) - .filter(f -> f.getSimpleName().contentEquals(name)) - .map(f -> ctx.getDeclarations().newFieldDeclaration(f, p.snd))) - .collect(toList()); + .map(e -> new Pair<>(e.getKey(), e.getValue())) + .map(p -> new Pair<>(ctx.getMoreElements().getTypeElement(p.fst), p.snd)) + .filter(p -> Objects.nonNull(p.fst)) + .flatMap( + p -> + fieldsIn(p.fst.getEnclosedElements()).stream() + .filter(f -> !statik || f.getModifiers().contains(Modifier.STATIC)) + .filter(f -> f.getSimpleName().contentEquals(name)) + .map(f -> ctx.getDeclarations().newFieldDeclaration(f, p.snd))) + .collect(toList()); } private void removeHiddenFieldDeclarations(List candidates) { @@ -218,47 +227,41 @@ private void removeHiddenFieldDeclarations(List candidates) { } public Optional getMethodDeclaration( - String name, List parameterTypeDeclarations) { + String name, List parameterTypeDeclarations) { return getMethodDeclarationInternal(name, parameterTypeDeclarations, false); } public Optional getStaticMethodDeclaration( - String name, List parameterTypeDeclarations) { + String name, List parameterTypeDeclarations) { return getMethodDeclarationInternal(name, parameterTypeDeclarations, true); } private Optional getMethodDeclarationInternal( - String name, List parameterTypeDeclarations, boolean statik) { + String name, List parameterTypeDeclarations, boolean statik) { List candidates = - getCandidateMethodDeclarations(name, parameterTypeDeclarations, statik); + getCandidateMethodDeclarations(name, parameterTypeDeclarations, statik); removeOverriddenMethodDeclarations(candidates); removeHiddenMethodDeclarations(candidates); return candidates.stream().findFirst(); } private List getCandidateMethodDeclarations( - String name, List parameterTypeDeclarations, boolean statik) { - return getMethods( - m -> - (!statik || m.getModifiers().contains(Modifier.STATIC)) - && m.getModifiers().contains(Modifier.PUBLIC) - && m.getSimpleName().contentEquals(name) - && m.getReturnType().getKind() != TypeKind.VOID - && m.getParameters().size() == parameterTypeDeclarations.size() - && isAssignable(parameterTypeDeclarations, m.getParameters())); - } - - private List getMethods(Predicate predicate) { + String name, List parameterTypeDeclarations, boolean statik) { return typeParameterDeclarationsMap.entrySet().stream() - .map(e -> new Pair<>(e.getKey(), e.getValue())) - .map(p -> new Pair<>(ctx.getMoreElements().getTypeElement(p.fst), p.snd)) - .filter(p -> Objects.nonNull(p.fst)) - .flatMap( - p -> - methodsIn(p.fst.getEnclosedElements()).stream() - .filter(predicate) - .map(m -> ctx.getDeclarations().newMethodDeclaration(m, p.snd))) - .collect(toList()); + .map(e -> new Pair<>(e.getKey(), e.getValue())) + .map(p -> new Pair<>(ctx.getMoreElements().getTypeElement(p.fst), p.snd)) + .filter(p -> Objects.nonNull(p.fst)) + .flatMap( + p -> + methodsIn(p.fst.getEnclosedElements()).stream() + .filter(m -> !statik || m.getModifiers().contains(Modifier.STATIC)) + .filter(m -> m.getModifiers().contains(Modifier.PUBLIC)) + .filter(m -> m.getSimpleName().contentEquals(name)) + .filter(m -> m.getReturnType().getKind() != TypeKind.VOID) + .filter(m -> m.getParameters().size() == parameterTypeDeclarations.size()) + .filter(m -> isAssignable(parameterTypeDeclarations, m.getParameters())) + .map(m -> ctx.getDeclarations().newMethodDeclaration(m, p.snd))) + .collect(toList()); } private void removeOverriddenMethodDeclarations(List candidates) { @@ -267,12 +270,12 @@ private void removeOverriddenMethodDeclarations(List candidat MethodDeclaration overridden = it.next(); for (MethodDeclaration overrider : overriders) { TypeElement overriderTypeElement = - ctx.getMoreElements().toTypeElement(overrider.getElement().getEnclosingElement()); + ctx.getMoreElements().toTypeElement(overrider.getElement().getEnclosingElement()); if (overriderTypeElement == null) { continue; } if (ctx.getMoreElements() - .overrides(overrider.getElement(), overridden.getElement(), overriderTypeElement)) { + .overrides(overrider.getElement(), overridden.getElement(), overriderTypeElement)) { it.remove(); break; } @@ -346,12 +349,12 @@ private static int determineNumberPriority(TypeElement typeElement, TypeMirror t } private boolean isAssignable( - List parameterTypeDeclarations, List parameters) { + List parameterTypeDeclarations, List parameters) { MoreTypes types = ctx.getMoreTypes(); return Zip.stream(parameterTypeDeclarations, parameters) - .map(p -> p.map(TypeDeclaration::getType, Element::asType)) - .map(p -> p.map(types::boxIfPrimitive, types::boxIfPrimitive)) - .allMatch(p -> types.isAssignableWithErasure(p.fst, p.snd)); + .map(p -> p.map(TypeDeclaration::getType, Element::asType)) + .map(p -> p.map(types::boxIfPrimitive, types::boxIfPrimitive)) + .allMatch(p -> types.isAssignableWithErasure(p.fst, p.snd)); } private static class ScalarDetector extends SimpleCtTypeVisitor { From e5f9b92cfe6a170bb3fed4b4c03a48749504203f Mon Sep 17 00:00:00 2001 From: orekyuu Date: Tue, 19 Jan 2021 23:16:56 +0900 Subject: [PATCH 30/31] spotlessApply --- .../doma/internal/apt/annot/Annotations.java | 19 ++- .../internal/apt/annot/MetamodelAnnot.java | 11 +- .../doma/internal/apt/annot/ScopeClass.java | 16 +- .../internal/apt/decl/TypeDeclaration.java | 144 +++++++++--------- .../generator/EntityMetamodelGenerator.java | 7 +- .../apt/decl/TypeDeclarationTest.java | 1 - 6 files changed, 96 insertions(+), 102 deletions(-) diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/Annotations.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/Annotations.java index b814678ab..cc5a68f77 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/Annotations.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/Annotations.java @@ -1,21 +1,20 @@ package org.seasar.doma.internal.apt.annot; -import org.seasar.doma.*; -import org.seasar.doma.experimental.DataType; -import org.seasar.doma.internal.apt.Context; -import org.seasar.doma.internal.apt.decl.TypeDeclaration; -import org.seasar.doma.internal.apt.util.AnnotationValueUtil; +import static org.seasar.doma.internal.util.AssertionUtil.assertNotNull; -import javax.lang.model.element.*; -import javax.lang.model.type.TypeMirror; -import javax.lang.model.util.ElementFilter; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.function.BiFunction; import java.util.function.Function; - -import static org.seasar.doma.internal.util.AssertionUtil.assertNotNull; +import javax.lang.model.element.*; +import javax.lang.model.type.TypeMirror; +import javax.lang.model.util.ElementFilter; +import org.seasar.doma.*; +import org.seasar.doma.experimental.DataType; +import org.seasar.doma.internal.apt.Context; +import org.seasar.doma.internal.apt.decl.TypeDeclaration; +import org.seasar.doma.internal.apt.util.AnnotationValueUtil; public class Annotations { diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/MetamodelAnnot.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/MetamodelAnnot.java index ac5c92ba0..c27ae33cc 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/MetamodelAnnot.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/MetamodelAnnot.java @@ -1,15 +1,14 @@ package org.seasar.doma.internal.apt.annot; -import org.seasar.doma.internal.apt.AptIllegalStateException; -import org.seasar.doma.internal.apt.util.AnnotationValueUtil; +import static org.seasar.doma.internal.util.AssertionUtil.assertNonNullValue; -import javax.lang.model.element.AnnotationMirror; -import javax.lang.model.element.AnnotationValue; import java.util.ArrayList; import java.util.List; import java.util.Map; - -import static org.seasar.doma.internal.util.AssertionUtil.assertNonNullValue; +import javax.lang.model.element.AnnotationMirror; +import javax.lang.model.element.AnnotationValue; +import org.seasar.doma.internal.apt.AptIllegalStateException; +import org.seasar.doma.internal.apt.util.AnnotationValueUtil; public class MetamodelAnnot extends AbstractAnnot { diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/ScopeClass.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/ScopeClass.java index 17de0441b..26cfec0cb 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/ScopeClass.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/ScopeClass.java @@ -1,17 +1,15 @@ package org.seasar.doma.internal.apt.annot; -import org.seasar.doma.internal.ClassName; -import org.seasar.doma.internal.ClassNames; -import org.seasar.doma.internal.apt.decl.MethodDeclaration; -import org.seasar.doma.internal.apt.decl.TypeDeclaration; - +import java.util.List; +import java.util.stream.Collectors; import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.Modifier; import javax.lang.model.element.VariableElement; import javax.lang.model.type.TypeKind; import javax.lang.model.type.TypeMirror; -import java.util.List; -import java.util.stream.Collectors; +import org.seasar.doma.internal.ClassName; +import org.seasar.doma.internal.ClassNames; +import org.seasar.doma.internal.apt.decl.TypeDeclaration; public class ScopeClass { final TypeDeclaration type; @@ -32,7 +30,9 @@ public TypeMirror asType() { } public List scopeMethods(ClassName metamodelName) { - return methods.stream().filter(m -> isScopeMethod(m, metamodelName)).collect(Collectors.toList()); + return methods.stream() + .filter(m -> isScopeMethod(m, metamodelName)) + .collect(Collectors.toList()); } public String scopeField() { diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/TypeDeclaration.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/TypeDeclaration.java index 120482688..a048dd57d 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/TypeDeclaration.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/decl/TypeDeclaration.java @@ -63,11 +63,11 @@ public class TypeDeclaration { private final int numberPriority; protected TypeDeclaration( - Context ctx, - TypeMirror type, - CtType ctType, - TypeElement typeElement, - Map> typeParameterDeclarationsMap) { + Context ctx, + TypeMirror type, + CtType ctType, + TypeElement typeElement, + Map> typeParameterDeclarationsMap) { assertNotNull(ctx, type, ctType, typeParameterDeclarationsMap); this.ctx = ctx; this.type = type; @@ -98,13 +98,13 @@ public boolean isNullType() { public boolean isBooleanType() { return type.getKind() == TypeKind.BOOLEAN - || ctx.getMoreTypes().isSameTypeWithErasure(type, Boolean.class); + || ctx.getMoreTypes().isSameTypeWithErasure(type, Boolean.class); } public boolean isTextType() { return type.getKind() == TypeKind.CHAR - || ctx.getMoreTypes().isSameTypeWithErasure(type, String.class) - || ctx.getMoreTypes().isSameTypeWithErasure(type, Character.class); + || ctx.getMoreTypes().isSameTypeWithErasure(type, String.class) + || ctx.getMoreTypes().isSameTypeWithErasure(type, Character.class); } public boolean isNumberType() { @@ -135,54 +135,54 @@ public boolean isScalarType() { public boolean isScalarIterableType() { return ctType.accept( - new SimpleCtTypeVisitor() { + new SimpleCtTypeVisitor() { - @Override - protected Boolean defaultAction(CtType ctType, Void aVoid) { - return false; - } + @Override + protected Boolean defaultAction(CtType ctType, Void aVoid) { + return false; + } - @Override - public Boolean visitIterableCtType(IterableCtType ctType, Void aVoid) { - return ctType.getElementCtType().accept(new ScalarDetector(), aVoid); - } - }, - null); + @Override + public Boolean visitIterableCtType(IterableCtType ctType, Void aVoid) { + return ctType.getElementCtType().accept(new ScalarDetector(), aVoid); + } + }, + null); } public boolean isScalarArrayType() { return ctType.accept( - new SimpleCtTypeVisitor() { - @Override - protected Boolean defaultAction(CtType ctType, Void aVoid) { - return false; - } + new SimpleCtTypeVisitor() { + @Override + protected Boolean defaultAction(CtType ctType, Void aVoid) { + return false; + } - @Override - public Boolean visitArrayCtType(ArrayCtType ctType, Void aVoid) { - return ctType.getElementCtType().accept(new ScalarDetector(), aVoid); - } - }, - null); + @Override + public Boolean visitArrayCtType(ArrayCtType ctType, Void aVoid) { + return ctType.getElementCtType().accept(new ScalarDetector(), aVoid); + } + }, + null); } public List getTypeParameterDeclarations() { Optional> typeParameterDeclarations = - typeParameterDeclarationsMap.values().stream().findFirst(); + typeParameterDeclarationsMap.values().stream().findFirst(); return typeParameterDeclarations.orElse(Collections.emptyList()); } public Optional getConstructorDeclaration( - List parameterTypeDeclarations) { + List parameterTypeDeclarations) { if (typeElement == null) { return Optional.empty(); } return constructorsIn(typeElement.getEnclosedElements()).stream() - .filter(c -> c.getModifiers().contains(Modifier.PUBLIC)) - .filter(c -> c.getParameters().size() == parameterTypeDeclarations.size()) - .filter(c -> isAssignable(parameterTypeDeclarations, c.getParameters())) - .map(c -> ctx.getDeclarations().newConstructorDeclaration(c)) - .findAny(); + .filter(c -> c.getModifiers().contains(Modifier.PUBLIC)) + .filter(c -> c.getParameters().size() == parameterTypeDeclarations.size()) + .filter(c -> isAssignable(parameterTypeDeclarations, c.getParameters())) + .map(c -> ctx.getDeclarations().newConstructorDeclaration(c)) + .findAny(); } public Optional getFieldDeclaration(String name) { @@ -201,16 +201,16 @@ private Optional getFieldDeclarationInternal(String name, bool private List getCandidateFieldDeclarations(String name, boolean statik) { return typeParameterDeclarationsMap.entrySet().stream() - .map(e -> new Pair<>(e.getKey(), e.getValue())) - .map(p -> new Pair<>(ctx.getMoreElements().getTypeElement(p.fst), p.snd)) - .filter(p -> Objects.nonNull(p.fst)) - .flatMap( - p -> - fieldsIn(p.fst.getEnclosedElements()).stream() - .filter(f -> !statik || f.getModifiers().contains(Modifier.STATIC)) - .filter(f -> f.getSimpleName().contentEquals(name)) - .map(f -> ctx.getDeclarations().newFieldDeclaration(f, p.snd))) - .collect(toList()); + .map(e -> new Pair<>(e.getKey(), e.getValue())) + .map(p -> new Pair<>(ctx.getMoreElements().getTypeElement(p.fst), p.snd)) + .filter(p -> Objects.nonNull(p.fst)) + .flatMap( + p -> + fieldsIn(p.fst.getEnclosedElements()).stream() + .filter(f -> !statik || f.getModifiers().contains(Modifier.STATIC)) + .filter(f -> f.getSimpleName().contentEquals(name)) + .map(f -> ctx.getDeclarations().newFieldDeclaration(f, p.snd))) + .collect(toList()); } private void removeHiddenFieldDeclarations(List candidates) { @@ -227,41 +227,41 @@ private void removeHiddenFieldDeclarations(List candidates) { } public Optional getMethodDeclaration( - String name, List parameterTypeDeclarations) { + String name, List parameterTypeDeclarations) { return getMethodDeclarationInternal(name, parameterTypeDeclarations, false); } public Optional getStaticMethodDeclaration( - String name, List parameterTypeDeclarations) { + String name, List parameterTypeDeclarations) { return getMethodDeclarationInternal(name, parameterTypeDeclarations, true); } private Optional getMethodDeclarationInternal( - String name, List parameterTypeDeclarations, boolean statik) { + String name, List parameterTypeDeclarations, boolean statik) { List candidates = - getCandidateMethodDeclarations(name, parameterTypeDeclarations, statik); + getCandidateMethodDeclarations(name, parameterTypeDeclarations, statik); removeOverriddenMethodDeclarations(candidates); removeHiddenMethodDeclarations(candidates); return candidates.stream().findFirst(); } private List getCandidateMethodDeclarations( - String name, List parameterTypeDeclarations, boolean statik) { + String name, List parameterTypeDeclarations, boolean statik) { return typeParameterDeclarationsMap.entrySet().stream() - .map(e -> new Pair<>(e.getKey(), e.getValue())) - .map(p -> new Pair<>(ctx.getMoreElements().getTypeElement(p.fst), p.snd)) - .filter(p -> Objects.nonNull(p.fst)) - .flatMap( - p -> - methodsIn(p.fst.getEnclosedElements()).stream() - .filter(m -> !statik || m.getModifiers().contains(Modifier.STATIC)) - .filter(m -> m.getModifiers().contains(Modifier.PUBLIC)) - .filter(m -> m.getSimpleName().contentEquals(name)) - .filter(m -> m.getReturnType().getKind() != TypeKind.VOID) - .filter(m -> m.getParameters().size() == parameterTypeDeclarations.size()) - .filter(m -> isAssignable(parameterTypeDeclarations, m.getParameters())) - .map(m -> ctx.getDeclarations().newMethodDeclaration(m, p.snd))) - .collect(toList()); + .map(e -> new Pair<>(e.getKey(), e.getValue())) + .map(p -> new Pair<>(ctx.getMoreElements().getTypeElement(p.fst), p.snd)) + .filter(p -> Objects.nonNull(p.fst)) + .flatMap( + p -> + methodsIn(p.fst.getEnclosedElements()).stream() + .filter(m -> !statik || m.getModifiers().contains(Modifier.STATIC)) + .filter(m -> m.getModifiers().contains(Modifier.PUBLIC)) + .filter(m -> m.getSimpleName().contentEquals(name)) + .filter(m -> m.getReturnType().getKind() != TypeKind.VOID) + .filter(m -> m.getParameters().size() == parameterTypeDeclarations.size()) + .filter(m -> isAssignable(parameterTypeDeclarations, m.getParameters())) + .map(m -> ctx.getDeclarations().newMethodDeclaration(m, p.snd))) + .collect(toList()); } private void removeOverriddenMethodDeclarations(List candidates) { @@ -270,12 +270,12 @@ private void removeOverriddenMethodDeclarations(List candidat MethodDeclaration overridden = it.next(); for (MethodDeclaration overrider : overriders) { TypeElement overriderTypeElement = - ctx.getMoreElements().toTypeElement(overrider.getElement().getEnclosingElement()); + ctx.getMoreElements().toTypeElement(overrider.getElement().getEnclosingElement()); if (overriderTypeElement == null) { continue; } if (ctx.getMoreElements() - .overrides(overrider.getElement(), overridden.getElement(), overriderTypeElement)) { + .overrides(overrider.getElement(), overridden.getElement(), overriderTypeElement)) { it.remove(); break; } @@ -349,12 +349,12 @@ private static int determineNumberPriority(TypeElement typeElement, TypeMirror t } private boolean isAssignable( - List parameterTypeDeclarations, List parameters) { + List parameterTypeDeclarations, List parameters) { MoreTypes types = ctx.getMoreTypes(); return Zip.stream(parameterTypeDeclarations, parameters) - .map(p -> p.map(TypeDeclaration::getType, Element::asType)) - .map(p -> p.map(types::boxIfPrimitive, types::boxIfPrimitive)) - .allMatch(p -> types.isAssignableWithErasure(p.fst, p.snd)); + .map(p -> p.map(TypeDeclaration::getType, Element::asType)) + .map(p -> p.map(types::boxIfPrimitive, types::boxIfPrimitive)) + .allMatch(p -> types.isAssignableWithErasure(p.fst, p.snd)); } private static class ScalarDetector extends SimpleCtTypeVisitor { diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java index fffb60c2c..663603203 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java @@ -18,7 +18,6 @@ import org.seasar.doma.internal.apt.annot.MetamodelAnnot; import org.seasar.doma.internal.apt.annot.ScopeClass; import org.seasar.doma.internal.apt.cttype.CtType; -import org.seasar.doma.internal.apt.decl.MethodDeclaration; import org.seasar.doma.internal.apt.meta.entity.EntityMeta; import org.seasar.doma.internal.apt.meta.entity.EntityPropertyMeta; import org.seasar.doma.internal.util.Pair; @@ -217,9 +216,7 @@ private void printScopeMethod(ScopeClass scope, ExecutableElement method) { iprint( "public %1$s %2$s(%3$s) {%n", - returnType, - methodName, - generateParameterList(method, parameters)); + returnType, methodName, generateParameterList(method, parameters)); indent(); String params = @@ -234,7 +231,7 @@ private void printScopeMethod(ScopeClass scope, ExecutableElement method) { } private String generateParameterList( - ExecutableElement method, List parameters) { + ExecutableElement method, List parameters) { List params = new ArrayList<>(); for (int i = 0; i < parameters.size(); i++) { VariableElement variable = parameters.get(i); diff --git a/doma-processor/src/test/java/org/seasar/doma/internal/apt/decl/TypeDeclarationTest.java b/doma-processor/src/test/java/org/seasar/doma/internal/apt/decl/TypeDeclarationTest.java index 731d47ac0..49b07078d 100644 --- a/doma-processor/src/test/java/org/seasar/doma/internal/apt/decl/TypeDeclarationTest.java +++ b/doma-processor/src/test/java/org/seasar/doma/internal/apt/decl/TypeDeclarationTest.java @@ -7,7 +7,6 @@ import java.util.List; import java.util.Optional; import java.util.function.Function; -import javax.lang.model.element.VariableElement; import javax.lang.model.type.TypeMirror; import javax.lang.model.type.TypeVariable; import org.junit.jupiter.api.AfterEach; From 616995e1c70af741bb756d352ace434db5fa917e Mon Sep 17 00:00:00 2001 From: orekyuu Date: Tue, 19 Jan 2021 23:42:19 +0900 Subject: [PATCH 31/31] =?UTF-8?q?null=E3=83=81=E3=82=A7=E3=83=83=E3=82=AF?= =?UTF-8?q?=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../internal/apt/generator/EntityMetamodelGenerator.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java index 663603203..c4684ef6c 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java @@ -100,6 +100,9 @@ private void printQualifiedTableNameField() { private void printScopeFields() { MetamodelAnnot metamodelValue = entityMeta.getEntityAnnot().getMetamodelValue(); + if (metamodelValue == null) { + return; + } for (ScopeClass scope : metamodelValue.scopes()) { iprint("private final %1$s %2$s = new %1$s();%n", scope, scope.scopeField()); print("%n"); @@ -201,6 +204,9 @@ private void printAllPropertyMetamodelsMethod() { private void printScopeMethods() { MetamodelAnnot metamodel = entityMeta.getEntityAnnot().getMetamodelValue(); + if (metamodel == null) { + return; + } for (ScopeClass scopeClass : metamodel.scopes()) { for (ExecutableElement method : scopeClass.scopeMethods(className)) { printScopeMethod(scopeClass, method);