From 94a1e92b5057dccbae582d34592486d4fa74e537 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Thu, 28 Jul 2022 12:29:05 +0200 Subject: build: fix testFixtures classpath in eclipse --- .../main/groovy/refinery-java-conventions.gradle | 7 +++++ .../main/groovy/refinery-java-test-fixtures.gradle | 31 ++++++++++++++++++++++ buildSrc/src/main/groovy/refinery-jmh.gradle | 28 ++++++++++--------- 3 files changed, 53 insertions(+), 13 deletions(-) create mode 100644 buildSrc/src/main/groovy/refinery-java-test-fixtures.gradle (limited to 'buildSrc') diff --git a/buildSrc/src/main/groovy/refinery-java-conventions.gradle b/buildSrc/src/main/groovy/refinery-java-conventions.gradle index b2efd7e9..5bc73f61 100644 --- a/buildSrc/src/main/groovy/refinery-java-conventions.gradle +++ b/buildSrc/src/main/groovy/refinery-java-conventions.gradle @@ -69,6 +69,13 @@ eclipse { if (entry.path.endsWith('-gen')) { entry.entryAttributes['ignore_optional_problems'] = true } + // If a project has a main dependency on a project and an test dependency on the testFixtures of a project, + // it will be errorneously added as a test-only dependency to Eclipse. + // As a workaround, we add all project dependencies as main dependencies + // (we do not deliberately use test-only project dependencies). + if (entry in org.gradle.plugins.ide.eclipse.model.ProjectDependency) { + entry.entryAttributes.remove('test') + } } } diff --git a/buildSrc/src/main/groovy/refinery-java-test-fixtures.gradle b/buildSrc/src/main/groovy/refinery-java-test-fixtures.gradle new file mode 100644 index 00000000..326fa868 --- /dev/null +++ b/buildSrc/src/main/groovy/refinery-java-test-fixtures.gradle @@ -0,0 +1,31 @@ +plugins { + id 'java-test-fixtures' + id 'refinery-java-conventions' +} + +eclipse.classpath { + containsTestFixtures = true + + file.whenMerged { classpath -> + def hasTest = classpath.entries.any { entry -> + entry in org.gradle.plugins.ide.eclipse.model.AbstractClasspathEntry && + entry.entryAttributes['gradle_scope'] == 'test' + } + for (entry in classpath.entries) { + // Workaround https://github.com/gradle/gradle/issues/11845 based on + // https://discuss.gradle.org/t/gradle-used-by-scope-not-correctly-generated-when-the-java-test-fixtures-plugin-is-used/39935/2 + if (entry in org.gradle.plugins.ide.eclipse.model.AbstractClasspathEntry) { + def usedBy = new LinkedHashSet( + Arrays.asList((entry.entryAttributes['gradle_used_by_scope'] ?: '').split(',')) + ) + if (usedBy.contains('main')) { + usedBy += 'testFixtures' + } + if (hasTest && usedBy.contains('testFixtures')) { + usedBy += 'test' + } + entry.entryAttributes['gradle_used_by_scope'] = usedBy.join(',') + } + } + } +} diff --git a/buildSrc/src/main/groovy/refinery-jmh.gradle b/buildSrc/src/main/groovy/refinery-jmh.gradle index 48e0c133..17654463 100644 --- a/buildSrc/src/main/groovy/refinery-jmh.gradle +++ b/buildSrc/src/main/groovy/refinery-jmh.gradle @@ -29,23 +29,25 @@ tasks.register('jmh', JavaExec) { classpath = sourceSets.jmh.compileClasspath + sourceSets.jmh.runtimeClasspath } -eclipse.classpath { - plusConfigurations += [configurations.jmhCompileClasspath, configurations.jmhRuntimeClasspath] - - file.whenMerged { classpath -> - for (entry in classpath.entries) { +eclipse.classpath.file.whenMerged { classpath -> + for (entry in classpath.entries) { + if (entry in org.gradle.plugins.ide.eclipse.model.AbstractClasspathEntry) { // Workaround from https://github.com/gradle/gradle/issues/4802#issuecomment-407902081 - if (entry in org.gradle.plugins.ide.eclipse.model.AbstractClasspathEntry) { - def usedBy = (entry.entryAttributes['gradle_used_by_scope'] ?: '').split(',') - if (usedBy == ['jmh']) { - // Allow test helper classes to be used in benchmarks from Eclipse - // and do not expose JMH dependencies to the main source code. - entry.entryAttributes['test'] = true - } else if ((usedBy.contains('main') || usedBy.contains('test')) && !usedBy.contains('jmh')) { + if (entry.entryAttributes['gradle_scope'] == 'jmh') { + // Allow test helper classes to be used in benchmarks from Eclipse + // and do not expose JMH dependencies to the main source code. + entry.entryAttributes['test'] = true + } else { + // Workaround based on + // https://discuss.gradle.org/t/gradle-used-by-scope-not-correctly-generated-when-the-java-test-fixtures-plugin-is-used/39935/2 + def usedBy = new LinkedHashSet( + Arrays.asList((entry.entryAttributes['gradle_used_by_scope'] ?: '').split(',')) + ) + if (['main', 'test', 'testFixtures'].any { e -> usedBy.contains(e) }) { // main and test sources are also used by jmh sources. usedBy += 'jmh' - entry.entryAttributes['gradle_used_by_scope'] = usedBy.join(',') } + entry.entryAttributes['gradle_used_by_scope'] = usedBy.join(',') } } } -- cgit v1.2.3-54-g00ecf