From fa1c9cf3356648f8ec3ffbfa7275e9af1524f6c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goire=20Neuville?= Date: Fri, 27 Sep 2019 13:58:38 +0200 Subject: [PATCH 1/4] Modularize (java 9) the code base --- annotation/src/main/java/module-info.java | 3 + build.gradle | 34 ++++-- examples/src/main/java/module-info.java | 4 + gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 4 +- processor-api/src/main/java/module-info.java | 8 ++ processor/build.gradle | 15 ++- processor/src/main/java/module-info.java | 13 +++ .../processor/CompileExamplesTest.java | 102 +++++++++++++++--- 9 files changed, 157 insertions(+), 28 deletions(-) create mode 100644 annotation/src/main/java/module-info.java create mode 100644 examples/src/main/java/module-info.java create mode 100644 processor-api/src/main/java/module-info.java create mode 100644 processor/src/main/java/module-info.java diff --git a/annotation/src/main/java/module-info.java b/annotation/src/main/java/module-info.java new file mode 100644 index 0000000..6c5e2ec --- /dev/null +++ b/annotation/src/main/java/module-info.java @@ -0,0 +1,3 @@ +module derive4j.annotation { + exports org.derive4j; +} diff --git a/build.gradle b/build.gradle index fd5f5ae..cd52e4f 100644 --- a/build.gradle +++ b/build.gradle @@ -16,14 +16,15 @@ buildscript { } dependencies { - classpath "com.github.ben-manes:gradle-versions-plugin:0.21.0" + classpath "com.github.ben-manes:gradle-versions-plugin:0.25.0" classpath "gradle.plugin.com.hierynomus.gradle.plugins:license-gradle-plugin:0.15.0" - classpath "org.jfrog.buildinfo:build-info-extractor-gradle:4.9.7" - classpath "com.diffplug.spotless:spotless-plugin-gradle:3.23.1" + classpath "org.jfrog.buildinfo:build-info-extractor-gradle:4.9.9" + classpath "com.diffplug.spotless:spotless-plugin-gradle:3.24.2" + classpath "org.javamodularity:moduleplugin:1.6.0" } wrapper { - gradleVersion = "5.5" + gradleVersion = "5.6.2" distributionType = Wrapper.DistributionType.ALL } } @@ -34,7 +35,6 @@ allprojects { apply plugin: 'jacoco' apply plugin: 'idea' - defaultTasks "build" ext { @@ -56,9 +56,9 @@ allprojects { primaryEmail = "jb@giraudeau.info" dependencyJavaPoet = "com.squareup:javapoet:1.11.1" - dependencyPreviousDerive4J = "org.derive4j:derive4j:1.1.0" + dependencyPreviousDerive4J = "org.derive4j:derive4j:1.1.1" dependencyJunit = "junit:junit:4.12" - dependencyAutoService = "com.google.auto.service:auto-service:1.0-rc4" + dependencyAutoService = "com.google.auto.service:auto-service:1.0-rc6" gplLicenseName = "The GNU General Public License" lgplLicenseName = "The GNU Lesser General Public License" @@ -84,6 +84,7 @@ subprojects { apply from: "$rootDir/lib.gradle" apply plugin: "java" + apply plugin: 'org.javamodularity.moduleplugin' apply plugin: "com.github.ben-manes.versions" apply plugin: "com.github.hierynomus.license" apply plugin: "com.diffplug.gradle.spotless" @@ -97,7 +98,6 @@ subprojects { endWithNewline() } } - repositories { mavenLocal() @@ -126,9 +126,23 @@ configure(subprojects) { apply plugin: "maven" - sourceCompatibility = "1.8" + sourceCompatibility = "1.9" + + sourceSets { + generated { + java.srcDir "$buildDir/generated/sources/annotationProcessor/java/main" + } + } + + task customJavadoc(type: Javadoc) { + source = sourceSets.main.java + sourceSets.generated.java + classpath = sourceSets.main.compileClasspath + doFirst { + options.addStringOption('-module-path', classpath.asPath) + } + } - task javadocJar(type: Jar, dependsOn: "javadoc") { + task javadocJar(type: Jar, dependsOn: "customJavadoc") { archiveClassifier = 'javadoc' from "build/docs/javadoc" } diff --git a/examples/src/main/java/module-info.java b/examples/src/main/java/module-info.java new file mode 100644 index 0000000..b02b659 --- /dev/null +++ b/examples/src/main/java/module-info.java @@ -0,0 +1,4 @@ +module derive4j.examples { + requires derive4j.annotation; + requires functionaljava; +} diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e0c4de3..ca9d628 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.5-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 8e25e6c..83f2acf 100755 --- a/gradlew +++ b/gradlew @@ -125,8 +125,8 @@ if $darwin; then GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" fi -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` JAVACMD=`cygpath --unix "$JAVACMD"` diff --git a/processor-api/src/main/java/module-info.java b/processor-api/src/main/java/module-info.java new file mode 100644 index 0000000..0394a07 --- /dev/null +++ b/processor-api/src/main/java/module-info.java @@ -0,0 +1,8 @@ +module derive4j.processor.api { + requires transitive derive4j.annotation; + requires transitive java.compiler; + requires transitive com.squareup.javapoet; + + exports org.derive4j.processor.api; + exports org.derive4j.processor.api.model; +} diff --git a/processor/build.gradle b/processor/build.gradle index 7d28a31..b71aa7b 100644 --- a/processor/build.gradle +++ b/processor/build.gradle @@ -6,21 +6,30 @@ dependencies { compile project(":annotation") compile project(":processor-api") compile dependencyJavaPoet + compileOnly dependencyAutoService + annotationProcessor dependencyAutoService annotationProcessor dependencyPreviousDerive4J + testCompile dependencyJunit - testCompile 'com.google.testing.compile:compile-testing:0.15' - testCompile "org.functionaljava:functionaljava_1.8:4.8.1" + testCompile('com.google.testing.compile:compile-testing:0.18') { + exclude module: 'auto-value' + } + testCompile "org.functionaljava:functionaljava:4.8.1" testCompile 'io.atlassian.fugue:fugue:4.7.2' testCompile 'com.atlassian.fugue:fugue:2.7.0' testCompile 'com.google.guava:guava:26.0-jre' testCompile 'io.vavr:vavr:0.9.2' - testCompile "org.derive4j.hkt:hkt:0.9.2" + testCompile "org.derive4j.hkt:hkt:0.10.0-SNAPSHOT" testCompile "org.derive4j:derive4j-fj:0.2" testCompile group: 'com.oath.cyclops', name: 'cyclops', version: '10.0.2' + testCompileOnly dependencyAutoService + testCompile project(":annotation") + testRuntime project(":annotation") } + sourceSets { test { resources { diff --git a/processor/src/main/java/module-info.java b/processor/src/main/java/module-info.java new file mode 100644 index 0000000..fa04d81 --- /dev/null +++ b/processor/src/main/java/module-info.java @@ -0,0 +1,13 @@ +module derive4j.processor { + requires static auto.service.annotations; + requires com.squareup.javapoet; + requires java.compiler; + requires derive4j.processor.api; + requires derive4j.annotation; + + provides javax.annotation.processing.Processor + with org.derive4j.processor.DerivingProcessor; + + uses org.derive4j.processor.api.ExtensionFactory; + uses org.derive4j.processor.api.DerivatorFactory; +} diff --git a/processor/src/test/java/org/derive4j/processor/CompileExamplesTest.java b/processor/src/test/java/org/derive4j/processor/CompileExamplesTest.java index b1e4f49..f4e34f3 100644 --- a/processor/src/test/java/org/derive4j/processor/CompileExamplesTest.java +++ b/processor/src/test/java/org/derive4j/processor/CompileExamplesTest.java @@ -18,13 +18,24 @@ */ package org.derive4j.processor; -import com.google.common.truth.Truth; +import com.google.testing.compile.Compilation; +import com.google.testing.compile.Compiler; import com.google.testing.compile.JavaFileObjects; -import java.util.Arrays; -import java.util.stream.Collectors; import org.junit.Test; -import static com.google.testing.compile.JavaSourcesSubjectFactory.javaSources; +import javax.lang.model.SourceVersion; +import javax.tools.*; +import java.io.*; +import java.lang.module.ResolvedModule; +import java.net.MalformedURLException; +import java.nio.charset.Charset; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static com.google.testing.compile.CompilationSubject.assertThat; public class CompileExamplesTest { @@ -94,14 +105,81 @@ public void compile_extensible_algebras() { } private static void checkCompileOf(String... exampleFiles) { - Truth.assert_() - .about(javaSources()) - .that(Arrays.asList(exampleFiles) - .stream() - .map(file -> JavaFileObjects.forResource("org/derive4j/example/" + file)) - .collect(Collectors.toList())) - .processedWith(new DerivingProcessor()) - .compilesWithoutError(); + final Compilation compilation = Compiler + .compiler(new ModulePathCompiler()) + .withOptions("--release", "9") + .withProcessors(new DerivingProcessor()) + .compile(Stream + .concat(Stream.of(getJavaFileObject(Paths.get("../examples/src/main/java/module-info.java"))) + , Arrays + .stream(exampleFiles) + .map(file -> getJavaFileObject(Paths.get("../examples/src/main/java/org/derive4j/example/" + file)))) + .collect(Collectors.toList())); + + assertThat(compilation).succeeded(); + } + + private static JavaFileObject getJavaFileObject(Path path) { + try { + return JavaFileObjects.forResource(path.toUri().toURL()); + } catch (MalformedURLException e) { + throw new RuntimeException(e); + } + } + +} + +final class ModulePathCompiler implements JavaCompiler { + private final JavaCompiler compiler; + private final List modulesFiles; + + ModulePathCompiler() { + this.compiler = ToolProvider.getSystemJavaCompiler(); + + final Module module = CompileExamplesTest.class.getModule(); + final Set modules = module.getLayer().configuration().modules(); + this.modulesFiles = modules + .stream() + .map(rm -> rm.reference().location()) + .filter(Optional::isPresent) + .filter(ouri -> ouri.get().getScheme().startsWith("file")) + .map(ouri -> { + final String path = Paths.get(ouri.get()).toString(); + return new File(path); + }) + .collect(Collectors.toList()); + } + + @Override + public CompilationTask getTask(Writer writer, JavaFileManager javaFileManager, DiagnosticListener diagnosticListener, Iterable iterable, Iterable iterable1, Iterable iterable2) { + return compiler.getTask(writer, javaFileManager, diagnosticListener, iterable, iterable1, iterable2); + } + + @Override + public StandardJavaFileManager getStandardFileManager(DiagnosticListener diagnosticListener, Locale locale, Charset charset) { + final StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnosticListener, locale, charset); + + try { + fileManager.setLocation(StandardLocation.MODULE_PATH, modulesFiles); + } catch (IOException e) { + throw new RuntimeException(e); + } + + return fileManager; } + @Override + public int isSupportedOption(String s) { + return compiler.isSupportedOption(s); + } + + @Override + public int run(InputStream inputStream, OutputStream outputStream, OutputStream outputStream1, String... strings) { + return compiler.run(inputStream, outputStream, outputStream1, strings); + } + + @Override + public Set getSourceVersions() { + return compiler.getSourceVersions(); + } } From df21885b7ec8fbb0f9a2aef3f5fdf888353787df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goire=20Neuville?= Date: Fri, 27 Sep 2019 14:43:30 +0200 Subject: [PATCH 2/4] Fix for weird javac crash --- .../src/main/java/org/derive4j/processor/DeriveUtilsImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/processor/src/main/java/org/derive4j/processor/DeriveUtilsImpl.java b/processor/src/main/java/org/derive4j/processor/DeriveUtilsImpl.java index 00a5f30..a3f1dd4 100644 --- a/processor/src/main/java/org/derive4j/processor/DeriveUtilsImpl.java +++ b/processor/src/main/java/org/derive4j/processor/DeriveUtilsImpl.java @@ -538,7 +538,7 @@ public DeriveResult instanceInitializer(TypeElement typeElement .add(asTypeArguments(method.getTypeParameters() .stream() .map(tpe -> asTypeVariable.visit(tpe.asType()).get()) - .map(typeArgs::get))) + .map(key -> typeArgs.get(key)))) // crash du compilo si method ref (bug openjdk ?) .add("$L(", method.getSimpleName()) .add(cb) .add(")") From e45d1725a2cd1c84195df669e0b2077171db0512 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goire=20Neuville?= Date: Tue, 29 Oct 2019 17:31:10 +0100 Subject: [PATCH 3/4] Fix bug involving wildcards + fix tests for module path --- build.gradle | 3 +- examples/build.gradle | 16 ++++- examples/src/main/java/module-info.java | 1 + .../java/org/derive4j/example/Exists.java | 46 ++++++++++++ processor/build.gradle | 6 +- processor/src/main/java/module-info.java | 3 - .../derive4j/processor/ExportDerivator.java | 4 +- .../derive4j/processor/MapperDerivator.java | 8 ++- .../processor/CompileExamplesTest.java | 68 ++---------------- .../processor/DeriveUtilsImplTest.java | 35 +++++---- .../processor/ModulePathCompiler.java | 71 +++++++++++++++++++ 11 files changed, 171 insertions(+), 90 deletions(-) create mode 100644 examples/src/main/java/org/derive4j/example/Exists.java create mode 100644 processor/src/test/java/org/derive4j/processor/ModulePathCompiler.java diff --git a/build.gradle b/build.gradle index cd52e4f..ef590dd 100644 --- a/build.gradle +++ b/build.gradle @@ -92,6 +92,7 @@ subprojects { spotless { java { eclipse("4.7.2").configFile "$rootDir/etc/eclipse-format.xml" + targetExclude fileTree("$buildDir/generated") { include("**/*.java") } indentWithSpaces(2) trimTrailingWhitespace() removeUnusedImports() @@ -126,7 +127,7 @@ configure(subprojects) { apply plugin: "maven" - sourceCompatibility = "1.9" + sourceCompatibility = JavaVersion.VERSION_1_9 sourceSets { generated { diff --git a/examples/build.gradle b/examples/build.gradle index f1be917..be78c2f 100644 --- a/examples/build.gradle +++ b/examples/build.gradle @@ -6,19 +6,29 @@ dependencies { compileOnly project(":annotation") annotationProcessor project(":processor") annotationProcessor project(":processor-api") - annotationProcessor "org.derive4j:derive4j-fj:0.2" + annotationProcessor "org.derive4j:derive4j-fj:0.3-SNAPSHOT" compileOnly "com.google.auto.value:auto-value-annotations:1.6.2" annotationProcessor "com.google.auto.value:auto-value:1.6.2" - compile "org.functionaljava:functionaljava_1.8:4.8.1" + compile 'org.functionaljava:functionaljava_1.8:4.9-SNAPSHOT' compile 'io.atlassian.fugue:fugue:4.7.2' compile 'com.atlassian.fugue:fugue:2.7.0' compile 'com.google.guava:guava:26.0-jre' compile 'io.vavr:vavr:0.9.2' - compile "org.derive4j.hkt:hkt:0.9.2" + compile "org.derive4j.hkt:hkt:0.10.0-SNAPSHOT" compile group: 'com.oath.cyclops', name: 'cyclops', version: '10.0.2' + + testCompile project(":annotation") testCompile dependencyJunit } +task compileOne(type: JavaCompile) { + source = sourceSets.main.java.srcDirs + include 'org/derive4j/example/Exists.java' + classpath = compileJava.classpath + destinationDir = compileJava.destinationDir + options.annotationProcessorPath = compileJava.options.annotationProcessorPath +} + configureUpload(bsd3LicenseName) artifactoryPublish.skip = true diff --git a/examples/src/main/java/module-info.java b/examples/src/main/java/module-info.java index b02b659..61f1fc8 100644 --- a/examples/src/main/java/module-info.java +++ b/examples/src/main/java/module-info.java @@ -1,4 +1,5 @@ module derive4j.examples { requires derive4j.annotation; requires functionaljava; + requires org.derive4j.hkt; } diff --git a/examples/src/main/java/org/derive4j/example/Exists.java b/examples/src/main/java/org/derive4j/example/Exists.java new file mode 100644 index 0000000..a391026 --- /dev/null +++ b/examples/src/main/java/org/derive4j/example/Exists.java @@ -0,0 +1,46 @@ +package org.derive4j.example; + +import org.derive4j.*; +import org.derive4j.hkt.__; + +@Data(flavour = Flavour.FJ, value = @Derive(inClass = "_Exists", withVisibility = Visibility.Smart, make = { + Make.constructors, Make.casesMatching, Make.caseOfMatching })) +abstract class Exists implements __ { + public enum µ { + } + + interface Cases { + R Exists(ExistsImpl exists); + + R Exists2(ExistsImpl2 exists2); + } + + abstract R match(Cases cases); + + static final class ExistsImpl { + final A a; + final B b; + + ExistsImpl(A a, B b) { + this.a = a; + this.b = b; + } + } + + static final class ExistsImpl2 { + final A a; + final B b; + final C c; + + ExistsImpl2(A a, B b, C c) { + this.a = a; + this.b = b; + this.c = c; + } + } + + @ExportAsPublic + static Exists now(T t) { + return _Exists.Exists(new ExistsImpl<>(t, t)); + } +} diff --git a/processor/build.gradle b/processor/build.gradle index b71aa7b..157bea8 100644 --- a/processor/build.gradle +++ b/processor/build.gradle @@ -3,7 +3,6 @@ projectTitle = "Derive4J - Annotation Processor" archivesBaseName = project.projectName dependencies { - compile project(":annotation") compile project(":processor-api") compile dependencyJavaPoet @@ -11,18 +10,17 @@ dependencies { annotationProcessor dependencyAutoService annotationProcessor dependencyPreviousDerive4J - testCompile dependencyJunit testCompile('com.google.testing.compile:compile-testing:0.18') { exclude module: 'auto-value' } - testCompile "org.functionaljava:functionaljava:4.8.1" + testCompile "org.functionaljava:functionaljava_1.8:4.9-SNAPSHOT" testCompile 'io.atlassian.fugue:fugue:4.7.2' testCompile 'com.atlassian.fugue:fugue:2.7.0' testCompile 'com.google.guava:guava:26.0-jre' testCompile 'io.vavr:vavr:0.9.2' testCompile "org.derive4j.hkt:hkt:0.10.0-SNAPSHOT" - testCompile "org.derive4j:derive4j-fj:0.2" + testCompile "org.derive4j:derive4j-fj:0.3-SNAPSHOT" testCompile group: 'com.oath.cyclops', name: 'cyclops', version: '10.0.2' testCompileOnly dependencyAutoService diff --git a/processor/src/main/java/module-info.java b/processor/src/main/java/module-info.java index fa04d81..0b39b0b 100644 --- a/processor/src/main/java/module-info.java +++ b/processor/src/main/java/module-info.java @@ -1,9 +1,6 @@ module derive4j.processor { requires static auto.service.annotations; - requires com.squareup.javapoet; - requires java.compiler; requires derive4j.processor.api; - requires derive4j.annotation; provides javax.annotation.processing.Processor with org.derive4j.processor.DerivingProcessor; diff --git a/processor/src/main/java/org/derive4j/processor/ExportDerivator.java b/processor/src/main/java/org/derive4j/processor/ExportDerivator.java index bfcd4fc..8c24fcb 100644 --- a/processor/src/main/java/org/derive4j/processor/ExportDerivator.java +++ b/processor/src/main/java/org/derive4j/processor/ExportDerivator.java @@ -74,7 +74,7 @@ public DeriveResult derive(AlgebraicDataType adt) { private DerivedCodeSpec exportAsPublic(ExecutableElement executableElement) { MethodSpec.Builder methodBuilder = replicate(executableElement).addModifiers(Modifier.PUBLIC); - TypeName className = ClassName.get(executableElement.getEnclosingElement().asType()); + TypeName className = ClassName.get((TypeElement) executableElement.getEnclosingElement()); String methodName = executableElement.getSimpleName().toString(); String parameters = executableElement.getParameters().stream().map(ve -> ve.getSimpleName().toString()).collect( Collectors.joining(", ")); @@ -108,7 +108,7 @@ private DerivedCodeSpec exportAsPublic(ExecutableElement executableElement) { .addStatement("return _$L", methodName) .build()); } else { - result = methodSpec(replicate(executableElement).addModifiers(Modifier.PUBLIC) + result = methodSpec(methodBuilder .addStatement("return $L.$L($L)", className, methodName, parameters) .build()); } diff --git a/processor/src/main/java/org/derive4j/processor/MapperDerivator.java b/processor/src/main/java/org/derive4j/processor/MapperDerivator.java index e99d293..8a72bbf 100644 --- a/processor/src/main/java/org/derive4j/processor/MapperDerivator.java +++ b/processor/src/main/java/org/derive4j/processor/MapperDerivator.java @@ -26,6 +26,8 @@ import com.squareup.javapoet.TypeName; import com.squareup.javapoet.TypeSpec; import com.squareup.javapoet.TypeVariableName; + +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Optional; @@ -138,7 +140,11 @@ public TypeName mapperTypeName(AlgebraicDataType adt, DataConstructor dc, TypeMi Map visitorTypeVarSubstitutions = zip(dc.deconstructor().methodType().getParameterTypes(), dc.deconstructor().visitorMethodType().getParameterTypes()) .stream() - .flatMap(p -> deriveUtils.unify(p._2(), p._1()).get().entrySet().stream()) + .flatMap(p -> deriveUtils + .unify(p._2(), p._1()) + .orElseGet(Collections::emptyMap) + .entrySet() + .stream()) .collect(Collectors.toMap( Map.Entry::getKey, Map.Entry::getValue, diff --git a/processor/src/test/java/org/derive4j/processor/CompileExamplesTest.java b/processor/src/test/java/org/derive4j/processor/CompileExamplesTest.java index f4e34f3..c1899c2 100644 --- a/processor/src/test/java/org/derive4j/processor/CompileExamplesTest.java +++ b/processor/src/test/java/org/derive4j/processor/CompileExamplesTest.java @@ -23,12 +23,8 @@ import com.google.testing.compile.JavaFileObjects; import org.junit.Test; -import javax.lang.model.SourceVersion; import javax.tools.*; -import java.io.*; -import java.lang.module.ResolvedModule; import java.net.MalformedURLException; -import java.nio.charset.Charset; import java.nio.file.Path; import java.nio.file.Paths; import java.util.*; @@ -106,14 +102,13 @@ public void compile_extensible_algebras() { private static void checkCompileOf(String... exampleFiles) { final Compilation compilation = Compiler - .compiler(new ModulePathCompiler()) + .compiler(new ModulePathCompiler(CompileExamplesTest.class)) .withOptions("--release", "9") .withProcessors(new DerivingProcessor()) .compile(Stream - .concat(Stream.of(getJavaFileObject(Paths.get("../examples/src/main/java/module-info.java"))) - , Arrays - .stream(exampleFiles) - .map(file -> getJavaFileObject(Paths.get("../examples/src/main/java/org/derive4j/example/" + file)))) + .concat(Stream.of(getJavaFileObject(Paths.get("../examples/src/main/java/module-info.java"))), Arrays + .stream(exampleFiles) + .map(file -> getJavaFileObject(Paths.get("../examples/src/main/java/org/derive4j/example/" + file)))) .collect(Collectors.toList())); assertThat(compilation).succeeded(); @@ -128,58 +123,3 @@ private static JavaFileObject getJavaFileObject(Path path) { } } - -final class ModulePathCompiler implements JavaCompiler { - private final JavaCompiler compiler; - private final List modulesFiles; - - ModulePathCompiler() { - this.compiler = ToolProvider.getSystemJavaCompiler(); - - final Module module = CompileExamplesTest.class.getModule(); - final Set modules = module.getLayer().configuration().modules(); - this.modulesFiles = modules - .stream() - .map(rm -> rm.reference().location()) - .filter(Optional::isPresent) - .filter(ouri -> ouri.get().getScheme().startsWith("file")) - .map(ouri -> { - final String path = Paths.get(ouri.get()).toString(); - return new File(path); - }) - .collect(Collectors.toList()); - } - - @Override - public CompilationTask getTask(Writer writer, JavaFileManager javaFileManager, DiagnosticListener diagnosticListener, Iterable iterable, Iterable iterable1, Iterable iterable2) { - return compiler.getTask(writer, javaFileManager, diagnosticListener, iterable, iterable1, iterable2); - } - - @Override - public StandardJavaFileManager getStandardFileManager(DiagnosticListener diagnosticListener, Locale locale, Charset charset) { - final StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnosticListener, locale, charset); - - try { - fileManager.setLocation(StandardLocation.MODULE_PATH, modulesFiles); - } catch (IOException e) { - throw new RuntimeException(e); - } - - return fileManager; - } - - @Override - public int isSupportedOption(String s) { - return compiler.isSupportedOption(s); - } - - @Override - public int run(InputStream inputStream, OutputStream outputStream, OutputStream outputStream1, String... strings) { - return compiler.run(inputStream, outputStream, outputStream1, strings); - } - - @Override - public Set getSourceVersions() { - return compiler.getSourceVersions(); - } -} diff --git a/processor/src/test/java/org/derive4j/processor/DeriveUtilsImplTest.java b/processor/src/test/java/org/derive4j/processor/DeriveUtilsImplTest.java index 4eaef0c..b070fd8 100644 --- a/processor/src/test/java/org/derive4j/processor/DeriveUtilsImplTest.java +++ b/processor/src/test/java/org/derive4j/processor/DeriveUtilsImplTest.java @@ -20,29 +20,34 @@ import com.google.common.collect.Sets; import com.google.common.truth.Truth; +import com.google.testing.compile.Compilation; +import com.google.testing.compile.Compiler; import com.google.testing.compile.JavaFileObjects; -import java.util.List; -import java.util.Set; +import org.junit.Test; + import javax.annotation.processing.AbstractProcessor; import javax.annotation.processing.RoundEnvironment; import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.TypeElement; import javax.lang.model.type.DeclaredType; import javax.lang.model.util.ElementFilter; -import org.junit.Test; +import java.net.MalformedURLException; +import java.nio.file.Paths; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; -import static com.google.testing.compile.JavaSourceSubjectFactory.javaSource; +import static com.google.testing.compile.CompilationSubject.assertThat; public class DeriveUtilsImplTest { @Test - public void allAbstractMethods_should_return_abstract_override() { - - Truth.assert_() - .about(javaSource()) - .that(JavaFileObjects.forSourceString("org.derive4j.processor.TestF", - "public abstract class TestF implements com.google.common.base.Function, java.util.function.Function {}")) - .processedWith(new AbstractProcessor() { + public void allAbstractMethods_should_return_abstract_override() throws MalformedURLException { + final Compilation compilation = Compiler + .compiler(new ModulePathCompiler(DeriveUtilsImplTest.class)) + .withOptions("--release", "9") + .withProcessors(new AbstractProcessor() { @Override public Set getSupportedAnnotationTypes() { @@ -65,7 +70,13 @@ public boolean process(Set annotations, RoundEnvironment return false; } }) - .compilesWithoutError(); + .compile(Stream + .of(JavaFileObjects.forResource(Paths.get("../examples/src/main/java/module-info.java").toUri().toURL()), + JavaFileObjects.forSourceString("org.derive4j.processor.TestF", + "public abstract class TestF implements com.google.common.base.Function, java.util.function.Function {}")) + .collect(Collectors.toList())); + + assertThat(compilation).succeeded(); } } diff --git a/processor/src/test/java/org/derive4j/processor/ModulePathCompiler.java b/processor/src/test/java/org/derive4j/processor/ModulePathCompiler.java new file mode 100644 index 0000000..a5f3863 --- /dev/null +++ b/processor/src/test/java/org/derive4j/processor/ModulePathCompiler.java @@ -0,0 +1,71 @@ +package org.derive4j.processor; + +import javax.lang.model.SourceVersion; +import javax.tools.*; +import java.io.*; +import java.lang.module.ResolvedModule; +import java.nio.charset.Charset; +import java.nio.file.Paths; +import java.util.List; +import java.util.Locale; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; + +final class ModulePathCompiler implements JavaCompiler { + private final JavaCompiler compiler; + private final List modulesFiles; + + ModulePathCompiler(Class testClass) { + this.compiler = ToolProvider.getSystemJavaCompiler(); + + final Module module = testClass.getModule(); + final Set modules = module.getLayer().configuration().modules(); + this.modulesFiles = modules + .stream() + .map(rm -> rm.reference().location()) + .filter(Optional::isPresent) + .filter(ouri -> ouri.get().getScheme().startsWith("file")) + .map(ouri -> { + final String path = Paths.get(ouri.get()).toString(); + return new File(path); + }) + .collect(Collectors.toList()); + } + + @Override + public CompilationTask getTask(Writer writer, JavaFileManager javaFileManager, + DiagnosticListener diagnosticListener, Iterable iterable, + Iterable iterable1, Iterable iterable2) { + return compiler.getTask(writer, javaFileManager, diagnosticListener, iterable, iterable1, iterable2); + } + + @Override + public StandardJavaFileManager getStandardFileManager(DiagnosticListener diagnosticListener, + Locale locale, Charset charset) { + final StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnosticListener, locale, charset); + + try { + fileManager.setLocation(StandardLocation.MODULE_PATH, modulesFiles); + } catch (IOException e) { + throw new RuntimeException(e); + } + + return fileManager; + } + + @Override + public int isSupportedOption(String s) { + return compiler.isSupportedOption(s); + } + + @Override + public int run(InputStream inputStream, OutputStream outputStream, OutputStream outputStream1, String... strings) { + return compiler.run(inputStream, outputStream, outputStream1, strings); + } + + @Override + public Set getSourceVersions() { + return compiler.getSourceVersions(); + } +} From 16e148725dbbbeadd71d24df5af1476f518903c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goire=20Neuville?= Date: Thu, 6 Feb 2020 18:27:05 +0100 Subject: [PATCH 4/4] Fix dependencies versions for release --- build.gradle | 8 +------- examples/build.gradle | 6 +++--- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/build.gradle b/build.gradle index ef590dd..346db1d 100644 --- a/build.gradle +++ b/build.gradle @@ -129,14 +129,8 @@ configure(subprojects) { sourceCompatibility = JavaVersion.VERSION_1_9 - sourceSets { - generated { - java.srcDir "$buildDir/generated/sources/annotationProcessor/java/main" - } - } - task customJavadoc(type: Javadoc) { - source = sourceSets.main.java + sourceSets.generated.java + source = sourceSets.main.java + "$buildDir/generated/sources/annotationProcessor/java/main" classpath = sourceSets.main.compileClasspath doFirst { options.addStringOption('-module-path', classpath.asPath) diff --git a/examples/build.gradle b/examples/build.gradle index be78c2f..b02d8bc 100644 --- a/examples/build.gradle +++ b/examples/build.gradle @@ -6,15 +6,15 @@ dependencies { compileOnly project(":annotation") annotationProcessor project(":processor") annotationProcessor project(":processor-api") - annotationProcessor "org.derive4j:derive4j-fj:0.3-SNAPSHOT" + annotationProcessor "org.derive4j:derive4j-fj:0.2" compileOnly "com.google.auto.value:auto-value-annotations:1.6.2" annotationProcessor "com.google.auto.value:auto-value:1.6.2" - compile 'org.functionaljava:functionaljava_1.8:4.9-SNAPSHOT' + compile 'org.functionaljava:functionaljava_1.8:4.9' compile 'io.atlassian.fugue:fugue:4.7.2' compile 'com.atlassian.fugue:fugue:2.7.0' compile 'com.google.guava:guava:26.0-jre' compile 'io.vavr:vavr:0.9.2' - compile "org.derive4j.hkt:hkt:0.10.0-SNAPSHOT" + compile "org.derive4j.hkt:hkt:0.10.0" compile group: 'com.oath.cyclops', name: 'cyclops', version: '10.0.2' testCompile project(":annotation")