From e467f9ffe3e4b1fbeb23e2841e26e47e6703026a Mon Sep 17 00:00:00 2001 From: JonasG Date: Wed, 20 Mar 2024 20:41:17 +0100 Subject: [PATCH] move away from multi-module project --- README.md | 20 ++- bob/pom.xml | 58 ------ compiler/pom.xml | 43 ----- .../definitions/ConstructorDefinition.java | 24 --- .../src/test/java/io/jonasg/bob/BobTests.java | 41 ----- .../bob/definitions/TypeDefinitionMother.java | 5 - core/pom.xml | 11 -- .../java/io/jonasg/bob/AbstractBuilder.java | 40 ----- core/src/main/java/io/jonasg/bob/Builder.java | 8 - pom.xml | 168 ++++++++--------- .../main/java/io/jonasg/bob/Buildable.java | 0 .../io/jonasg/bob/BuildableConstructor.java | 11 ++ .../io/jonasg/bob/BuildableProcessor.java | 8 +- .../java/io/jonasg/bob/BuilderGenerator.java | 0 .../main/java/io/jonasg/bob/Formatter.java | 0 .../java/io/jonasg/bob/TypeSpecFactory.java | 23 ++- .../main/java/io/jonasg/bob/TypeWriter.java | 0 .../definitions/ConstructorDefinition.java | 37 ++++ .../bob/definitions/FieldDefinition.java | 20 --- .../GenericParameterDefinition.java | 0 .../bob/definitions/MethodDefinition.java | 0 .../bob/definitions/ParameterDefinition.java | 0 .../bob/definitions/SimpleTypeDefinition.java | 0 .../bob/definitions/TypeDefinition.java | 0 .../definitions/TypeDefinitionFactory.java | 8 +- .../javax.annotation.processing.Processor | 0 .../java/io/jonasg/bob/BobFeaturesTests.java | 169 ++++++++++++++++++ ...uildableConstructorAnnotationsPresent.java | 41 +++++ .../AllConstructorParamsAreBuildable.java | 0 ...cted_AllConstructorParamsAreBuildable.java | 0 ...ramsAreBuildableIfHavingMatchingField.java | 0 ...ramsAreBuildableIfHavingMatchingField.java | 0 ...tValuesForParamsWithNoneMatchingField.java | 0 ...tValuesForParamsWithNoneMatchingField.java | 0 .../Expected_OverrideDefaultPackage.java | 48 +++++ .../OverrideDefaultPackage.java | 24 +++ .../Expected_SetterWithCustomPrefix.java | 0 .../SetterWithCustomPrefix.java | 0 ...ctorAnnotatedWithBuildableConstructor.java | 27 +++ ...ctorAnnotatedWithBuildableConstructor.java | 40 +++++ ...ctorWithTheGreatestNumberOfParameters.java | 0 ...ctorWithTheGreatestNumberOfParameters.java | 0 42 files changed, 529 insertions(+), 345 deletions(-) delete mode 100644 bob/pom.xml delete mode 100644 compiler/pom.xml delete mode 100644 compiler/src/main/java/io/jonasg/bob/definitions/ConstructorDefinition.java delete mode 100644 compiler/src/test/java/io/jonasg/bob/BobTests.java delete mode 100644 compiler/src/test/java/io/jonasg/bob/definitions/TypeDefinitionMother.java delete mode 100644 core/pom.xml delete mode 100644 core/src/main/java/io/jonasg/bob/AbstractBuilder.java delete mode 100644 core/src/main/java/io/jonasg/bob/Builder.java rename {compiler/src => src}/main/java/io/jonasg/bob/Buildable.java (100%) create mode 100644 src/main/java/io/jonasg/bob/BuildableConstructor.java rename {compiler/src => src}/main/java/io/jonasg/bob/BuildableProcessor.java (84%) rename {compiler/src => src}/main/java/io/jonasg/bob/BuilderGenerator.java (100%) rename {compiler/src => src}/main/java/io/jonasg/bob/Formatter.java (100%) rename {compiler/src => src}/main/java/io/jonasg/bob/TypeSpecFactory.java (93%) rename {compiler/src => src}/main/java/io/jonasg/bob/TypeWriter.java (100%) create mode 100644 src/main/java/io/jonasg/bob/definitions/ConstructorDefinition.java rename {compiler/src => src}/main/java/io/jonasg/bob/definitions/FieldDefinition.java (56%) rename {compiler/src => src}/main/java/io/jonasg/bob/definitions/GenericParameterDefinition.java (100%) rename {compiler/src => src}/main/java/io/jonasg/bob/definitions/MethodDefinition.java (100%) rename {compiler/src => src}/main/java/io/jonasg/bob/definitions/ParameterDefinition.java (100%) rename {compiler/src => src}/main/java/io/jonasg/bob/definitions/SimpleTypeDefinition.java (100%) rename {compiler/src => src}/main/java/io/jonasg/bob/definitions/TypeDefinition.java (100%) rename {compiler/src => src}/main/java/io/jonasg/bob/definitions/TypeDefinitionFactory.java (97%) rename {compiler/src => src}/main/resources/META-INF/services/javax.annotation.processing.Processor (100%) create mode 100644 src/test/java/io/jonasg/bob/BobFeaturesTests.java create mode 100644 src/test/resources/tests/failing-compilation/MultipleBuildableConstructorAnnotationsPresent/MultipleBuildableConstructorAnnotationsPresent.java rename {compiler/src/test/resources/tests => src/test/resources/tests/successful-compilation}/AllConstructorParamsAreBuildable/AllConstructorParamsAreBuildable.java (100%) rename {compiler/src/test/resources/tests => src/test/resources/tests/successful-compilation}/AllConstructorParamsAreBuildable/Expected_AllConstructorParamsAreBuildable.java (100%) rename {compiler/src/test/resources/tests => src/test/resources/tests/successful-compilation}/AllConstructorParamsAreBuildableIfHavingMatchingField/AllConstructorParamsAreBuildableIfHavingMatchingField.java (100%) rename {compiler/src/test/resources/tests => src/test/resources/tests/successful-compilation}/AllConstructorParamsAreBuildableIfHavingMatchingField/Expected_AllConstructorParamsAreBuildableIfHavingMatchingField.java (100%) rename {compiler/src/test/resources/tests => src/test/resources/tests/successful-compilation}/DefaultValuesForParamsWithNoneMatchingField/DefaultValuesForParamsWithNoneMatchingField.java (100%) rename {compiler/src/test/resources/tests => src/test/resources/tests/successful-compilation}/DefaultValuesForParamsWithNoneMatchingField/Expected_DefaultValuesForParamsWithNoneMatchingField.java (100%) create mode 100644 src/test/resources/tests/successful-compilation/OverrideDefaultPackage/Expected_OverrideDefaultPackage.java create mode 100644 src/test/resources/tests/successful-compilation/OverrideDefaultPackage/OverrideDefaultPackage.java rename {compiler/src/test/resources/tests => src/test/resources/tests/successful-compilation}/SetterWithCustomPrefix/Expected_SetterWithCustomPrefix.java (100%) rename {compiler/src/test/resources/tests => src/test/resources/tests/successful-compilation}/SetterWithCustomPrefix/SetterWithCustomPrefix.java (100%) create mode 100644 src/test/resources/tests/successful-compilation/UseConstructorAnnotatedWithBuildableConstructor/Expected_UseConstructorAnnotatedWithBuildableConstructor.java create mode 100644 src/test/resources/tests/successful-compilation/UseConstructorAnnotatedWithBuildableConstructor/UseConstructorAnnotatedWithBuildableConstructor.java rename {compiler/src/test/resources/tests => src/test/resources/tests/successful-compilation}/UseConstructorWithTheGreatestNumberOfParameters/Expected_UseConstructorWithTheGreatestNumberOfParameters.java (100%) rename {compiler/src/test/resources/tests => src/test/resources/tests/successful-compilation}/UseConstructorWithTheGreatestNumberOfParameters/UseConstructorWithTheGreatestNumberOfParameters.java (100%) diff --git a/README.md b/README.md index dbea18c..8ca6ac2 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,23 @@ -# Bob +# 👷‍ Bob Lightweight Builder generator for Java ## Why Bob? -Bob serves as a lightweight alternative to Lombok's `@Builder` annotation. +Bob serves as a lightweight alternative to Lombok's @Builder annotation. Its retention policy is SOURCE, ensuring it won't clutter your bytecode. Bob generates a builder in the form of a pure Java source code file, which the Java compiler can pick up as a regular source file. + +## Installation + +```xml + + io.jonasg + bob + ${bob.version} + +``` ## Getting Started -Annotate the class you which to build with `@Buildable` +Annotate the class you which to be able to build with `@Buildable` ```java package my.garage; @@ -63,6 +73,10 @@ The car will be instantiated with the following constructor call: new Car(null, 0, "red", BigDecimal.ZERO); ``` +### Different constructor + +⚠️ NOT IMPLEMENTED YET + If you want to use a different constructor instead of the default selected one, annotated it with `@BuildableConstructor` ### Package diff --git a/bob/pom.xml b/bob/pom.xml deleted file mode 100644 index 50f2a92..0000000 --- a/bob/pom.xml +++ /dev/null @@ -1,58 +0,0 @@ - - - 4.0.0 - - io.jonasg - bob-project - 0.1.0-SNAPSHOT - - - bob - pom - - - 17 - 17 - UTF-8 - - - - - io.jonasg - bob-compiler - ${project.version} - - - io.jonasg - bob-core - ${project.version} - - - - - - - maven-assembly-plugin - ${maven-aseembly-plugin.version} - - - jar-with-dependencies - - bob - - - - make-assembly - package - - single - - - - - - - - diff --git a/compiler/pom.xml b/compiler/pom.xml deleted file mode 100644 index a44fe58..0000000 --- a/compiler/pom.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - 4.0.0 - - - bob-project - io.jonasg - 0.1.0-SNAPSHOT - - jar - - bob-compiler - - - - ${project.groupId} - bob-core - ${project.version} - - - com.squareup - javapoet - - - org.mockito - mockito-core - - - org.junit.jupiter - junit-jupiter - test - - - org.assertj - assertj-core - - - io.toolisticon.cute - cute - - - - diff --git a/compiler/src/main/java/io/jonasg/bob/definitions/ConstructorDefinition.java b/compiler/src/main/java/io/jonasg/bob/definitions/ConstructorDefinition.java deleted file mode 100644 index 2d0e173..0000000 --- a/compiler/src/main/java/io/jonasg/bob/definitions/ConstructorDefinition.java +++ /dev/null @@ -1,24 +0,0 @@ -package io.jonasg.bob.definitions; - -import javax.lang.model.element.Modifier; -import java.util.List; -import java.util.Set; - -public class ConstructorDefinition { - - private List parameters; - private Set modifiers; - - public ConstructorDefinition(List parameters, Set modifiers) { - this.parameters = parameters; - this.modifiers = modifiers; - } - - public boolean isPrivate() { - return modifiers.contains(Modifier.PRIVATE); - } - - public List parameters() { - return parameters; - } -} diff --git a/compiler/src/test/java/io/jonasg/bob/BobTests.java b/compiler/src/test/java/io/jonasg/bob/BobTests.java deleted file mode 100644 index 05f548c..0000000 --- a/compiler/src/test/java/io/jonasg/bob/BobTests.java +++ /dev/null @@ -1,41 +0,0 @@ -package io.jonasg.bob; - -import io.toolisticon.cute.Cute; -import io.toolisticon.cute.CuteApi; -import io.toolisticon.cute.JavaFileObjectUtils; - -import java.io.File; -import java.util.Arrays; - -import org.junit.jupiter.api.Test; -import org.junit.platform.commons.logging.Logger; -import org.junit.platform.commons.logging.LoggerFactory; - -public class BobTests { - - private static final Logger LOG = LoggerFactory.getLogger(BobTests.class); - - @Test - void runAllTests() { - var testsFolder = new File("src/test/resources/tests"); - Arrays.stream(testsFolder.listFiles(File::isDirectory)) - .forEach(this::runTest); - } - - private void runTest(File testFolder) { - LOG.info(() -> "Running " + testFolder.getName() + " test"); - Cute.blackBoxTest() - .given() - .processors(BuildableProcessor.class) - .andSourceFiles("/tests/%s/%1$s.java".formatted(testFolder.getName())) - .whenCompiled() - .thenExpectThat() - .compilationSucceeds() - .andThat() - .generatedSourceFile("io.jonasg.bob.test.builder.%sBuilder".formatted(testFolder.getName())) - .matches( - CuteApi.ExpectedFileObjectMatcherKind.BINARY, - JavaFileObjectUtils.readFromResource("/tests/%s/Expected_%1$s.java".formatted(testFolder.getName()))) - .executeTest(); - } -} diff --git a/compiler/src/test/java/io/jonasg/bob/definitions/TypeDefinitionMother.java b/compiler/src/test/java/io/jonasg/bob/definitions/TypeDefinitionMother.java deleted file mode 100644 index 76558d1..0000000 --- a/compiler/src/test/java/io/jonasg/bob/definitions/TypeDefinitionMother.java +++ /dev/null @@ -1,5 +0,0 @@ -package io.jonasg.bob.definitions; - -class TypeDefinitionMother { - -} diff --git a/core/pom.xml b/core/pom.xml deleted file mode 100644 index 48e4a70..0000000 --- a/core/pom.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - bob-project - io.jonasg - 0.1.0-SNAPSHOT - - jar - 4.0.0 - bob-core - diff --git a/core/src/main/java/io/jonasg/bob/AbstractBuilder.java b/core/src/main/java/io/jonasg/bob/AbstractBuilder.java deleted file mode 100644 index 72643ec..0000000 --- a/core/src/main/java/io/jonasg/bob/AbstractBuilder.java +++ /dev/null @@ -1,40 +0,0 @@ -package io.jonasg.bob; - -import java.lang.reflect.Field; - -@SuppressWarnings("unused") -public abstract class AbstractBuilder implements Builder { - - protected T instance; - - public AbstractBuilder() { - } - - abstract public T build(); - - protected void setField(String name, Object value) { - try { - Field field = instance.getClass(). - getDeclaredField(name); - field.setAccessible(true); - field.set(instance, value); - field.setAccessible(false); - } catch (NoSuchFieldException | IllegalAccessException e) { - throw new RuntimeException(e); - } - } - - protected void setField(Object instance, String name, Object value) { - try { - Field field = instance.getClass(). - getDeclaredField(name); - field.setAccessible(true); - field.set(instance, value); - field.setAccessible(false); - } catch (NoSuchFieldException | IllegalAccessException e) { - throw new RuntimeException(e); - } - } - - -} diff --git a/core/src/main/java/io/jonasg/bob/Builder.java b/core/src/main/java/io/jonasg/bob/Builder.java deleted file mode 100644 index 553a6e1..0000000 --- a/core/src/main/java/io/jonasg/bob/Builder.java +++ /dev/null @@ -1,8 +0,0 @@ -package io.jonasg.bob; - -@SuppressWarnings("unused") -public interface Builder { - - T build(); - -} diff --git a/pom.xml b/pom.xml index 6375699..bd8683d 100644 --- a/pom.xml +++ b/pom.xml @@ -1,18 +1,20 @@ - - 4.0.0 + + 4.0.0 - bob - Builder generator for Java - https://github.com/jonas-grgt/bob - io.jonasg + bob + Builder generator for Java + https://github.com/jonas-grgt/bob + io.jonasg - - - Jonas Geiregat - jonas.grgt@gmail.com - - + + + Jonas Geiregat + jonas.grgt@gmail.com + + @@ -21,18 +23,13 @@ - bob-project - pom - 0.1.0-SNAPSHOT - - core - compiler - bob - + bob + jar + 0.1.0-SNAPSHOT - - UTF-8 - UTF-8 + + UTF-8 + UTF-8 3.12.1 3.6.0 @@ -42,25 +39,21 @@ 17 1.9.0 + 1.13.0 5.10.1 3.23.1 5.11.0 - 1.0.0 - + 1.2.0 + - - https://github.com/jonasg-grgt/bob - scm:git:https://github.com/jonasg-grgt/bob - HEAD - + + https://github.com/jonasg-grgt/bob + scm:git:https://github.com/jonasg-grgt/bob + HEAD + - - com.squareup - javapoet - 1.13.0 - org.junit junit-bom @@ -68,43 +61,58 @@ pom import - - org.assertj - assertj-core - ${assertj-core.version} - test - - - org.mockito - mockito-core - ${mockito-core.version} - test - - - io.toolisticon.cute - cute - ${cute.version} - test - - - - - org.apache.maven.plugins - maven-compiler-plugin + + + ${project.groupId} + bob-core + ${project.version} + + + com.squareup + javapoet + ${java-poet.version} + + + org.mockito + mockito-core + ${mockito-core.version} + + + org.junit.jupiter + junit-jupiter + + + org.assertj + assertj-core + ${assertj-core.version} + + + io.toolisticon.cute + cute + ${cute.version} + test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin ${maven-compiler-plugin.version} - - ${maven.compiler.source} - ${maven.compiler.target} - -Xlint:all - true - true - - -proc:none - - + + ${maven.compiler.source} + ${maven.compiler.target} + -Xlint:all + true + true + + -proc:none + + org.apache.maven.plugins maven-source-plugin @@ -121,18 +129,18 @@ - - + + - - - snapshots - https://oss.sonatype.org/content/repositories/snapshots - - - release - https://oss.sonatype.org/service/local/staging/deploy/maven2/ - - + + + snapshots + https://oss.sonatype.org/content/repositories/snapshots + + + release + https://oss.sonatype.org/service/local/staging/deploy/maven2/ + + diff --git a/compiler/src/main/java/io/jonasg/bob/Buildable.java b/src/main/java/io/jonasg/bob/Buildable.java similarity index 100% rename from compiler/src/main/java/io/jonasg/bob/Buildable.java rename to src/main/java/io/jonasg/bob/Buildable.java diff --git a/src/main/java/io/jonasg/bob/BuildableConstructor.java b/src/main/java/io/jonasg/bob/BuildableConstructor.java new file mode 100644 index 0000000..6901653 --- /dev/null +++ b/src/main/java/io/jonasg/bob/BuildableConstructor.java @@ -0,0 +1,11 @@ +package io.jonasg.bob; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.SOURCE) +@Target(ElementType.CONSTRUCTOR) +public @interface BuildableConstructor { +} diff --git a/compiler/src/main/java/io/jonasg/bob/BuildableProcessor.java b/src/main/java/io/jonasg/bob/BuildableProcessor.java similarity index 84% rename from compiler/src/main/java/io/jonasg/bob/BuildableProcessor.java rename to src/main/java/io/jonasg/bob/BuildableProcessor.java index 0ef20dc..289bd3f 100644 --- a/compiler/src/main/java/io/jonasg/bob/BuildableProcessor.java +++ b/src/main/java/io/jonasg/bob/BuildableProcessor.java @@ -10,6 +10,7 @@ import javax.lang.model.SourceVersion; import javax.lang.model.element.TypeElement; import javax.lang.model.util.Elements; +import javax.tools.Diagnostic; import io.jonasg.bob.definitions.TypeDefinition; import io.jonasg.bob.definitions.TypeDefinitionFactory; @@ -29,7 +30,12 @@ public boolean process(Set annotations, RoundEnvironment .forEach(element -> { Buildable buildable = element.getAnnotation(Buildable.class); TypeDefinition sourceDefinition = typeDefinitionFactory.typeDefinitionForElement(element); - builderGenerator.generate(sourceDefinition, buildable); + try { + builderGenerator.generate(sourceDefinition, buildable); + } + catch (Exception e) { + processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, e.getMessage(), element); + } }); return true; } diff --git a/compiler/src/main/java/io/jonasg/bob/BuilderGenerator.java b/src/main/java/io/jonasg/bob/BuilderGenerator.java similarity index 100% rename from compiler/src/main/java/io/jonasg/bob/BuilderGenerator.java rename to src/main/java/io/jonasg/bob/BuilderGenerator.java diff --git a/compiler/src/main/java/io/jonasg/bob/Formatter.java b/src/main/java/io/jonasg/bob/Formatter.java similarity index 100% rename from compiler/src/main/java/io/jonasg/bob/Formatter.java rename to src/main/java/io/jonasg/bob/Formatter.java diff --git a/compiler/src/main/java/io/jonasg/bob/TypeSpecFactory.java b/src/main/java/io/jonasg/bob/TypeSpecFactory.java similarity index 93% rename from compiler/src/main/java/io/jonasg/bob/TypeSpecFactory.java rename to src/main/java/io/jonasg/bob/TypeSpecFactory.java index b8ff272..78a6c19 100644 --- a/compiler/src/main/java/io/jonasg/bob/TypeSpecFactory.java +++ b/src/main/java/io/jonasg/bob/TypeSpecFactory.java @@ -41,9 +41,21 @@ private String builderTypeName(TypeDefinition source) { private TypeSpecFactory(TypeDefinition typeDefinition, Buildable buildable) { this.typeDefinition = typeDefinition; this.buildable = buildable; - this.constructorDefinition = typeDefinition.constructors().stream() - .max(Comparator.comparingInt(c -> c.parameters().size())).orElseThrow(); - List fieldNames = typeDefinition.fields().stream() + + var buildableConstructors = typeDefinition.constructors().stream() + .filter(c -> c.isAnnotatedWith(BuildableConstructor.class)) + .toList(); + if (buildableConstructors.size() > 1) { + throw new IllegalArgumentException("Only one constructor can be annotated with @BuildableConstructor"); + } + if (buildableConstructors.isEmpty()) { + this.constructorDefinition = typeDefinition.constructors().stream() + .max(Comparator.comparingInt(c -> c.parameters().size())).orElseThrow(); + } else { + this.constructorDefinition = buildableConstructors.get(0); + } + + var fieldNames = typeDefinition.fields().stream() .map(FieldDefinition::name) .toList(); this.eligibleConstructorParams = this.constructorDefinition.parameters() @@ -109,15 +121,10 @@ private MethodSpec buildMethod() { private String defaultForType(TypeMirror type) { return switch (type.toString()) { case "int" -> "0"; - case "java.lang.Integer" -> "null"; case "long" -> "0L"; - case "java.lang.Long" -> "null"; case "float" -> "0.0f"; - case "java.lang.Float" -> "null"; case "double" -> "0.0d"; - case "java.lang.Double" -> "null"; case "boolean" -> "false"; - case "java.lang.Boolean" -> "null"; default -> "null"; }; } diff --git a/compiler/src/main/java/io/jonasg/bob/TypeWriter.java b/src/main/java/io/jonasg/bob/TypeWriter.java similarity index 100% rename from compiler/src/main/java/io/jonasg/bob/TypeWriter.java rename to src/main/java/io/jonasg/bob/TypeWriter.java diff --git a/src/main/java/io/jonasg/bob/definitions/ConstructorDefinition.java b/src/main/java/io/jonasg/bob/definitions/ConstructorDefinition.java new file mode 100644 index 0000000..0a873aa --- /dev/null +++ b/src/main/java/io/jonasg/bob/definitions/ConstructorDefinition.java @@ -0,0 +1,37 @@ +package io.jonasg.bob.definitions; + +import java.util.List; +import java.util.Set; + +import javax.lang.model.element.AnnotationMirror; +import javax.lang.model.element.Modifier; + +public final class ConstructorDefinition { + + private final List parameters; + + private final Set modifiers; + + private final List annotations; + + public ConstructorDefinition(List parameters, + Set modifiers, + List annotations) { + this.parameters = parameters; + this.modifiers = modifiers; + this.annotations = annotations; + } + + public boolean isPrivate() { + return modifiers.contains(Modifier.PRIVATE); + } + + public List parameters() { + return parameters; + } + + public boolean isAnnotatedWith(Class type) { + return annotations.stream() + .anyMatch(a -> a.getAnnotationType().toString().equals(type.getName())); + } +} diff --git a/compiler/src/main/java/io/jonasg/bob/definitions/FieldDefinition.java b/src/main/java/io/jonasg/bob/definitions/FieldDefinition.java similarity index 56% rename from compiler/src/main/java/io/jonasg/bob/definitions/FieldDefinition.java rename to src/main/java/io/jonasg/bob/definitions/FieldDefinition.java index f763802..9943f82 100644 --- a/compiler/src/main/java/io/jonasg/bob/definitions/FieldDefinition.java +++ b/src/main/java/io/jonasg/bob/definitions/FieldDefinition.java @@ -23,24 +23,4 @@ public String name() { public TypeMirror type() { return type; } - - public boolean isPrivate() { - return modifiers.contains(Modifier.PRIVATE); - } - - public boolean isProtected() { - return modifiers.contains(Modifier.PROTECTED); - } - - public boolean isFinal() { - return modifiers.contains(Modifier.FINAL); - } - - public boolean isPublic() { - return modifiers.contains(Modifier.PUBLIC); - } - - public boolean isPackageLocal() { - return modifiers.isEmpty(); - } } diff --git a/compiler/src/main/java/io/jonasg/bob/definitions/GenericParameterDefinition.java b/src/main/java/io/jonasg/bob/definitions/GenericParameterDefinition.java similarity index 100% rename from compiler/src/main/java/io/jonasg/bob/definitions/GenericParameterDefinition.java rename to src/main/java/io/jonasg/bob/definitions/GenericParameterDefinition.java diff --git a/compiler/src/main/java/io/jonasg/bob/definitions/MethodDefinition.java b/src/main/java/io/jonasg/bob/definitions/MethodDefinition.java similarity index 100% rename from compiler/src/main/java/io/jonasg/bob/definitions/MethodDefinition.java rename to src/main/java/io/jonasg/bob/definitions/MethodDefinition.java diff --git a/compiler/src/main/java/io/jonasg/bob/definitions/ParameterDefinition.java b/src/main/java/io/jonasg/bob/definitions/ParameterDefinition.java similarity index 100% rename from compiler/src/main/java/io/jonasg/bob/definitions/ParameterDefinition.java rename to src/main/java/io/jonasg/bob/definitions/ParameterDefinition.java diff --git a/compiler/src/main/java/io/jonasg/bob/definitions/SimpleTypeDefinition.java b/src/main/java/io/jonasg/bob/definitions/SimpleTypeDefinition.java similarity index 100% rename from compiler/src/main/java/io/jonasg/bob/definitions/SimpleTypeDefinition.java rename to src/main/java/io/jonasg/bob/definitions/SimpleTypeDefinition.java diff --git a/compiler/src/main/java/io/jonasg/bob/definitions/TypeDefinition.java b/src/main/java/io/jonasg/bob/definitions/TypeDefinition.java similarity index 100% rename from compiler/src/main/java/io/jonasg/bob/definitions/TypeDefinition.java rename to src/main/java/io/jonasg/bob/definitions/TypeDefinition.java diff --git a/compiler/src/main/java/io/jonasg/bob/definitions/TypeDefinitionFactory.java b/src/main/java/io/jonasg/bob/definitions/TypeDefinitionFactory.java similarity index 97% rename from compiler/src/main/java/io/jonasg/bob/definitions/TypeDefinitionFactory.java rename to src/main/java/io/jonasg/bob/definitions/TypeDefinitionFactory.java index 840f8df..88db265 100644 --- a/compiler/src/main/java/io/jonasg/bob/definitions/TypeDefinitionFactory.java +++ b/src/main/java/io/jonasg/bob/definitions/TypeDefinitionFactory.java @@ -54,9 +54,11 @@ public TypeDefinition typeDefinitionForElement(Element element) { private List generics(Element element) { List parameters = new ArrayList<>(); - if (ElementKind.CLASS.equals(element.getKind())) - for (TypeParameterElement param : ((TypeElement) element).getTypeParameters()) + if (ElementKind.CLASS.equals(element.getKind())) { + for (TypeParameterElement param : ((TypeElement) element).getTypeParameters()) { parameters.add(new GenericParameterDefinition(param.asType(), param.getSimpleName().toString(), toTypeDefinitions(param.getBounds()))); + } + } return parameters; } @@ -100,7 +102,7 @@ private List constructors(Element element) { for (VariableElement param : constructor.getParameters()) { constructorParams.add(new ParameterDefinition(param.asType(), param.getSimpleName().toString())); } - definitions.add(new ConstructorDefinition(constructorParams, constructor.getModifiers())); + definitions.add(new ConstructorDefinition(constructorParams, constructor.getModifiers(), constructor.getAnnotationMirrors())); } return definitions; } diff --git a/compiler/src/main/resources/META-INF/services/javax.annotation.processing.Processor b/src/main/resources/META-INF/services/javax.annotation.processing.Processor similarity index 100% rename from compiler/src/main/resources/META-INF/services/javax.annotation.processing.Processor rename to src/main/resources/META-INF/services/javax.annotation.processing.Processor diff --git a/src/test/java/io/jonasg/bob/BobFeaturesTests.java b/src/test/java/io/jonasg/bob/BobFeaturesTests.java new file mode 100644 index 0000000..d204e83 --- /dev/null +++ b/src/test/java/io/jonasg/bob/BobFeaturesTests.java @@ -0,0 +1,169 @@ +package io.jonasg.bob; + +import java.io.File; + +import org.junit.jupiter.api.Test; +import org.junit.platform.commons.logging.Logger; +import org.junit.platform.commons.logging.LoggerFactory; + +import io.toolisticon.cute.Cute; +import io.toolisticon.cute.CuteApi; +import io.toolisticon.cute.JavaFileObjectUtils; + +public class BobFeaturesTests { + + private static final Logger LOG = LoggerFactory.getLogger(BobFeaturesTests.class); + + @Test + void failWhenMultipleConstructorAreAnnotatedWithBuildableConstructor() { + Cute.blackBoxTest() + .given() + .processors(BuildableProcessor.class) + .andSourceFiles("/tests/failing-compilation/MultipleBuildableConstructorAnnotationsPresent/MultipleBuildableConstructorAnnotationsPresent.java") + .whenCompiled() + .thenExpectThat() + .compilationFails() + .andThat() + .compilerMessage() + .ofKindError() + .contains("Only one constructor can be annotated with @BuildableConstructor") + .executeTest(); + } + + private void runTest(File testFolder) { + LOG.info(() -> "Running " + testFolder.getName() + " test"); + Cute.blackBoxTest() + .given() + .processors(BuildableProcessor.class) + .andSourceFiles("/tests/successful-compilation/%s/%1$s.java".formatted(testFolder.getName())) + .whenCompiled() + .thenExpectThat() + .compilationSucceeds() + .andThat() + .generatedSourceFile("io.jonasg.bob.test.builder.%sBuilder".formatted(testFolder.getName())) + .matches( + CuteApi.ExpectedFileObjectMatcherKind.BINARY, + JavaFileObjectUtils.readFromResource("/tests/successful-compilation/%s/Expected_%1$s.java".formatted(testFolder.getName()))) + .executeTest(); + } + + @Test + void allConstructorParamsAreBuildable() { + Cute.blackBoxTest() + .given() + .processors(BuildableProcessor.class) + .andSourceFiles("/tests/successful-compilation/AllConstructorParamsAreBuildable/AllConstructorParamsAreBuildable.java") + .whenCompiled() + .thenExpectThat() + .compilationSucceeds() + .andThat() + .generatedSourceFile("io.jonasg.bob.test.builder.AllConstructorParamsAreBuildableBuilder") + .matches( + CuteApi.ExpectedFileObjectMatcherKind.BINARY, + JavaFileObjectUtils.readFromResource("/tests/successful-compilation/AllConstructorParamsAreBuildable/Expected_AllConstructorParamsAreBuildable.java")) + .executeTest(); + } + + @Test + void allConstructorParamsAreBuildableIfHavingMatchingField() { + Cute.blackBoxTest() + .given() + .processors(BuildableProcessor.class) + .andSourceFiles("/tests/successful-compilation/AllConstructorParamsAreBuildableIfHavingMatchingField/AllConstructorParamsAreBuildableIfHavingMatchingField.java") + .whenCompiled() + .thenExpectThat() + .compilationSucceeds() + .andThat() + .generatedSourceFile("io.jonasg.bob.test.builder.AllConstructorParamsAreBuildableIfHavingMatchingFieldBuilder") + .matches( + CuteApi.ExpectedFileObjectMatcherKind.BINARY, + JavaFileObjectUtils.readFromResource("/tests/successful-compilation/AllConstructorParamsAreBuildableIfHavingMatchingField/Expected_AllConstructorParamsAreBuildableIfHavingMatchingField.java")) + .executeTest(); + } + + @Test + void defaultValuesForParamsWithNoneMatchingField() { + Cute.blackBoxTest() + .given() + .processors(BuildableProcessor.class) + .andSourceFiles("/tests/successful-compilation/AllConstructorParamsAreBuildableIfHavingMatchingField/AllConstructorParamsAreBuildableIfHavingMatchingField.java") + .whenCompiled() + .thenExpectThat() + .compilationSucceeds() + .andThat() + .generatedSourceFile("io.jonasg.bob.test.builder.AllConstructorParamsAreBuildableIfHavingMatchingFieldBuilder") + .matches( + CuteApi.ExpectedFileObjectMatcherKind.BINARY, + JavaFileObjectUtils.readFromResource("/tests/successful-compilation/AllConstructorParamsAreBuildableIfHavingMatchingField/Expected_AllConstructorParamsAreBuildableIfHavingMatchingField.java")) + .executeTest(); + } + + @Test + void overrideDefaultPackage() { + Cute.blackBoxTest() + .given() + .processors(BuildableProcessor.class) + .andSourceFiles("/tests/successful-compilation/OverrideDefaultPackage/OverrideDefaultPackage.java") + .whenCompiled() + .thenExpectThat() + .compilationSucceeds() + .andThat() + .generatedSourceFile("io.jonasg.bob.test.other.OverrideDefaultPackageBuilder") + .matches( + CuteApi.ExpectedFileObjectMatcherKind.BINARY, + JavaFileObjectUtils.readFromResource("/tests/successful-compilation/OverrideDefaultPackage/Expected_OverrideDefaultPackage.java")) + .executeTest(); + } + + @Test + void setterWithCustomPrefix() { + Cute.blackBoxTest() + .given() + .processors(BuildableProcessor.class) + .andSourceFiles("/tests/successful-compilation/SetterWithCustomPrefix/SetterWithCustomPrefix.java") + .whenCompiled() + .thenExpectThat() + .compilationSucceeds() + .andThat() + .generatedSourceFile("io.jonasg.bob.test.builder.SetterWithCustomPrefixBuilder") + .matches( + CuteApi.ExpectedFileObjectMatcherKind.BINARY, + JavaFileObjectUtils.readFromResource("/tests/successful-compilation/SetterWithCustomPrefix/Expected_SetterWithCustomPrefix.java")) + .executeTest(); + } + + @Test + void useConstructorAnnotatedWithBuildableConstructor() { + Cute.blackBoxTest() + .given() + .processors(BuildableProcessor.class) + .andSourceFiles("/tests/successful-compilation/UseConstructorAnnotatedWithBuildableConstructor/UseConstructorAnnotatedWithBuildableConstructor.java") + .whenCompiled() + .thenExpectThat() + .compilationSucceeds() + .andThat() + .generatedSourceFile("io.jonasg.bob.test.builder.UseConstructorAnnotatedWithBuildableConstructorBuilder") + .matches( + CuteApi.ExpectedFileObjectMatcherKind.BINARY, + JavaFileObjectUtils.readFromResource("/tests/successful-compilation/UseConstructorAnnotatedWithBuildableConstructor/Expected_UseConstructorAnnotatedWithBuildableConstructor.java")) + .executeTest(); + } + + @Test + void useConstructorWithTheGreatestNumberOfParameters() { + Cute.blackBoxTest() + .given() + .processors(BuildableProcessor.class) + .andSourceFiles("/tests/successful-compilation/UseConstructorWithTheGreatestNumberOfParameters/UseConstructorWithTheGreatestNumberOfParameters.java") + .whenCompiled() + .thenExpectThat() + .compilationSucceeds() + .andThat() + .generatedSourceFile("io.jonasg.bob.test.builder.UseConstructorWithTheGreatestNumberOfParametersBuilder") + .matches( + CuteApi.ExpectedFileObjectMatcherKind.BINARY, + JavaFileObjectUtils.readFromResource("/tests/successful-compilation/useConstructorWithTheGreatestNumberOfParameters/Expected_UseConstructorWithTheGreatestNumberOfParameters.java")) + .executeTest(); + } + +} diff --git a/src/test/resources/tests/failing-compilation/MultipleBuildableConstructorAnnotationsPresent/MultipleBuildableConstructorAnnotationsPresent.java b/src/test/resources/tests/failing-compilation/MultipleBuildableConstructorAnnotationsPresent/MultipleBuildableConstructorAnnotationsPresent.java new file mode 100644 index 0000000..a54e136 --- /dev/null +++ b/src/test/resources/tests/failing-compilation/MultipleBuildableConstructorAnnotationsPresent/MultipleBuildableConstructorAnnotationsPresent.java @@ -0,0 +1,41 @@ +package io.jonasg.bob.test; + +import io.jonasg.bob.Buildable; +import io.jonasg.bob.BuildableConstructor; + +@Buildable +public class MultipleBuildableConstructorAnnotationsPresent { + private String make; + + private int year; + + private double engineSize; + + private boolean isElectric; + + private float fuelEfficiency; + + public MultipleBuildableConstructorAnnotationsPresent() { + } + + public MultipleBuildableConstructorAnnotationsPresent(double engineSize, boolean isElectric, float fuelEfficiency) { + this.engineSize = engineSize; + this.isElectric = isElectric; + this.fuelEfficiency = fuelEfficiency; + } + + @BuildableConstructor + public MultipleBuildableConstructorAnnotationsPresent(String make, int year, double engineSize, boolean isElectric, float fuelEfficiency) { + this.make = make; + this.year = year; + this.engineSize = engineSize; + this.isElectric = isElectric; + this.fuelEfficiency = fuelEfficiency; + } + + @BuildableConstructor + public MultipleBuildableConstructorAnnotationsPresent(String make, int year) { + this.make = make; + this.year = year; + } +} diff --git a/compiler/src/test/resources/tests/AllConstructorParamsAreBuildable/AllConstructorParamsAreBuildable.java b/src/test/resources/tests/successful-compilation/AllConstructorParamsAreBuildable/AllConstructorParamsAreBuildable.java similarity index 100% rename from compiler/src/test/resources/tests/AllConstructorParamsAreBuildable/AllConstructorParamsAreBuildable.java rename to src/test/resources/tests/successful-compilation/AllConstructorParamsAreBuildable/AllConstructorParamsAreBuildable.java diff --git a/compiler/src/test/resources/tests/AllConstructorParamsAreBuildable/Expected_AllConstructorParamsAreBuildable.java b/src/test/resources/tests/successful-compilation/AllConstructorParamsAreBuildable/Expected_AllConstructorParamsAreBuildable.java similarity index 100% rename from compiler/src/test/resources/tests/AllConstructorParamsAreBuildable/Expected_AllConstructorParamsAreBuildable.java rename to src/test/resources/tests/successful-compilation/AllConstructorParamsAreBuildable/Expected_AllConstructorParamsAreBuildable.java diff --git a/compiler/src/test/resources/tests/AllConstructorParamsAreBuildableIfHavingMatchingField/AllConstructorParamsAreBuildableIfHavingMatchingField.java b/src/test/resources/tests/successful-compilation/AllConstructorParamsAreBuildableIfHavingMatchingField/AllConstructorParamsAreBuildableIfHavingMatchingField.java similarity index 100% rename from compiler/src/test/resources/tests/AllConstructorParamsAreBuildableIfHavingMatchingField/AllConstructorParamsAreBuildableIfHavingMatchingField.java rename to src/test/resources/tests/successful-compilation/AllConstructorParamsAreBuildableIfHavingMatchingField/AllConstructorParamsAreBuildableIfHavingMatchingField.java diff --git a/compiler/src/test/resources/tests/AllConstructorParamsAreBuildableIfHavingMatchingField/Expected_AllConstructorParamsAreBuildableIfHavingMatchingField.java b/src/test/resources/tests/successful-compilation/AllConstructorParamsAreBuildableIfHavingMatchingField/Expected_AllConstructorParamsAreBuildableIfHavingMatchingField.java similarity index 100% rename from compiler/src/test/resources/tests/AllConstructorParamsAreBuildableIfHavingMatchingField/Expected_AllConstructorParamsAreBuildableIfHavingMatchingField.java rename to src/test/resources/tests/successful-compilation/AllConstructorParamsAreBuildableIfHavingMatchingField/Expected_AllConstructorParamsAreBuildableIfHavingMatchingField.java diff --git a/compiler/src/test/resources/tests/DefaultValuesForParamsWithNoneMatchingField/DefaultValuesForParamsWithNoneMatchingField.java b/src/test/resources/tests/successful-compilation/DefaultValuesForParamsWithNoneMatchingField/DefaultValuesForParamsWithNoneMatchingField.java similarity index 100% rename from compiler/src/test/resources/tests/DefaultValuesForParamsWithNoneMatchingField/DefaultValuesForParamsWithNoneMatchingField.java rename to src/test/resources/tests/successful-compilation/DefaultValuesForParamsWithNoneMatchingField/DefaultValuesForParamsWithNoneMatchingField.java diff --git a/compiler/src/test/resources/tests/DefaultValuesForParamsWithNoneMatchingField/Expected_DefaultValuesForParamsWithNoneMatchingField.java b/src/test/resources/tests/successful-compilation/DefaultValuesForParamsWithNoneMatchingField/Expected_DefaultValuesForParamsWithNoneMatchingField.java similarity index 100% rename from compiler/src/test/resources/tests/DefaultValuesForParamsWithNoneMatchingField/Expected_DefaultValuesForParamsWithNoneMatchingField.java rename to src/test/resources/tests/successful-compilation/DefaultValuesForParamsWithNoneMatchingField/Expected_DefaultValuesForParamsWithNoneMatchingField.java diff --git a/src/test/resources/tests/successful-compilation/OverrideDefaultPackage/Expected_OverrideDefaultPackage.java b/src/test/resources/tests/successful-compilation/OverrideDefaultPackage/Expected_OverrideDefaultPackage.java new file mode 100644 index 0000000..e6c35fe --- /dev/null +++ b/src/test/resources/tests/successful-compilation/OverrideDefaultPackage/Expected_OverrideDefaultPackage.java @@ -0,0 +1,48 @@ +package io.jonasg.bob.test.other; + +import io.jonasg.bob.test.OverrideDefaultPackage; +import java.lang.String; + +public final class OverrideDefaultPackageBuilder { + private String make; + + private int year; + + private double engineSize; + + private boolean isElectric; + + private float fuelEfficiency; + + public OverrideDefaultPackageBuilder() { + } + + public OverrideDefaultPackageBuilder make(String make) { + this.make = make; + return this; + } + + public OverrideDefaultPackageBuilder year(int year) { + this.year = year; + return this; + } + + public OverrideDefaultPackageBuilder engineSize(double engineSize) { + this.engineSize = engineSize; + return this; + } + + public OverrideDefaultPackageBuilder isElectric(boolean isElectric) { + this.isElectric = isElectric; + return this; + } + + public OverrideDefaultPackageBuilder fuelEfficiency(float fuelEfficiency) { + this.fuelEfficiency = fuelEfficiency; + return this; + } + + public OverrideDefaultPackage build() { + return new OverrideDefaultPackage(make, year, engineSize, isElectric, fuelEfficiency); + } +} diff --git a/src/test/resources/tests/successful-compilation/OverrideDefaultPackage/OverrideDefaultPackage.java b/src/test/resources/tests/successful-compilation/OverrideDefaultPackage/OverrideDefaultPackage.java new file mode 100644 index 0000000..383cf7b --- /dev/null +++ b/src/test/resources/tests/successful-compilation/OverrideDefaultPackage/OverrideDefaultPackage.java @@ -0,0 +1,24 @@ +package io.jonasg.bob.test; + +import io.jonasg.bob.Buildable; + +@Buildable(packageName = "io.jonasg.bob.test.other") +public class OverrideDefaultPackage { + private String make; + + private int year; + + private double engineSize; + + private boolean isElectric; + + private float fuelEfficiency; + + public OverrideDefaultPackage(String make, int year, double engineSize, boolean isElectric, float fuelEfficiency) { + this.make = make; + this.year = year; + this.engineSize = engineSize; + this.isElectric = isElectric; + this.fuelEfficiency = fuelEfficiency; + } +} diff --git a/compiler/src/test/resources/tests/SetterWithCustomPrefix/Expected_SetterWithCustomPrefix.java b/src/test/resources/tests/successful-compilation/SetterWithCustomPrefix/Expected_SetterWithCustomPrefix.java similarity index 100% rename from compiler/src/test/resources/tests/SetterWithCustomPrefix/Expected_SetterWithCustomPrefix.java rename to src/test/resources/tests/successful-compilation/SetterWithCustomPrefix/Expected_SetterWithCustomPrefix.java diff --git a/compiler/src/test/resources/tests/SetterWithCustomPrefix/SetterWithCustomPrefix.java b/src/test/resources/tests/successful-compilation/SetterWithCustomPrefix/SetterWithCustomPrefix.java similarity index 100% rename from compiler/src/test/resources/tests/SetterWithCustomPrefix/SetterWithCustomPrefix.java rename to src/test/resources/tests/successful-compilation/SetterWithCustomPrefix/SetterWithCustomPrefix.java diff --git a/src/test/resources/tests/successful-compilation/UseConstructorAnnotatedWithBuildableConstructor/Expected_UseConstructorAnnotatedWithBuildableConstructor.java b/src/test/resources/tests/successful-compilation/UseConstructorAnnotatedWithBuildableConstructor/Expected_UseConstructorAnnotatedWithBuildableConstructor.java new file mode 100644 index 0000000..c395ac8 --- /dev/null +++ b/src/test/resources/tests/successful-compilation/UseConstructorAnnotatedWithBuildableConstructor/Expected_UseConstructorAnnotatedWithBuildableConstructor.java @@ -0,0 +1,27 @@ +package io.jonasg.bob.test.builder; + +import io.jonasg.bob.test.UseConstructorAnnotatedWithBuildableConstructor; +import java.lang.String; + +public final class UseConstructorAnnotatedWithBuildableConstructorBuilder { + private String make; + + private int year; + + public UseConstructorAnnotatedWithBuildableConstructorBuilder() { + } + + public UseConstructorAnnotatedWithBuildableConstructorBuilder make(String make) { + this.make = make; + return this; + } + + public UseConstructorAnnotatedWithBuildableConstructorBuilder year(int year) { + this.year = year; + return this; + } + + public UseConstructorAnnotatedWithBuildableConstructor build() { + return new UseConstructorAnnotatedWithBuildableConstructor(make, year); + } +} diff --git a/src/test/resources/tests/successful-compilation/UseConstructorAnnotatedWithBuildableConstructor/UseConstructorAnnotatedWithBuildableConstructor.java b/src/test/resources/tests/successful-compilation/UseConstructorAnnotatedWithBuildableConstructor/UseConstructorAnnotatedWithBuildableConstructor.java new file mode 100644 index 0000000..977298c --- /dev/null +++ b/src/test/resources/tests/successful-compilation/UseConstructorAnnotatedWithBuildableConstructor/UseConstructorAnnotatedWithBuildableConstructor.java @@ -0,0 +1,40 @@ +package io.jonasg.bob.test; + +import io.jonasg.bob.Buildable; +import io.jonasg.bob.BuildableConstructor; + +@Buildable +public class UseConstructorAnnotatedWithBuildableConstructor { + private String make; + + private int year; + + private double engineSize; + + private boolean isElectric; + + private float fuelEfficiency; + + public UseConstructorAnnotatedWithBuildableConstructor() { + } + + public UseConstructorAnnotatedWithBuildableConstructor(double engineSize, boolean isElectric, float fuelEfficiency) { + this.engineSize = engineSize; + this.isElectric = isElectric; + this.fuelEfficiency = fuelEfficiency; + } + + public UseConstructorAnnotatedWithBuildableConstructor(String make, int year, double engineSize, boolean isElectric, float fuelEfficiency) { + this.make = make; + this.year = year; + this.engineSize = engineSize; + this.isElectric = isElectric; + this.fuelEfficiency = fuelEfficiency; + } + + @BuildableConstructor + public UseConstructorAnnotatedWithBuildableConstructor(String make, int year) { + this.make = make; + this.year = year; + } +} diff --git a/compiler/src/test/resources/tests/UseConstructorWithTheGreatestNumberOfParameters/Expected_UseConstructorWithTheGreatestNumberOfParameters.java b/src/test/resources/tests/successful-compilation/UseConstructorWithTheGreatestNumberOfParameters/Expected_UseConstructorWithTheGreatestNumberOfParameters.java similarity index 100% rename from compiler/src/test/resources/tests/UseConstructorWithTheGreatestNumberOfParameters/Expected_UseConstructorWithTheGreatestNumberOfParameters.java rename to src/test/resources/tests/successful-compilation/UseConstructorWithTheGreatestNumberOfParameters/Expected_UseConstructorWithTheGreatestNumberOfParameters.java diff --git a/compiler/src/test/resources/tests/UseConstructorWithTheGreatestNumberOfParameters/UseConstructorWithTheGreatestNumberOfParameters.java b/src/test/resources/tests/successful-compilation/UseConstructorWithTheGreatestNumberOfParameters/UseConstructorWithTheGreatestNumberOfParameters.java similarity index 100% rename from compiler/src/test/resources/tests/UseConstructorWithTheGreatestNumberOfParameters/UseConstructorWithTheGreatestNumberOfParameters.java rename to src/test/resources/tests/successful-compilation/UseConstructorWithTheGreatestNumberOfParameters/UseConstructorWithTheGreatestNumberOfParameters.java