Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

Do not suggest that ABI dependencies are unused #500

Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.autonomousapps.jvm

import com.autonomousapps.jvm.projects.AbiUsedClassProject

import static com.autonomousapps.utils.Runner.build
import static com.google.common.truth.Truth.assertThat

final class AbiUsedClassSpec extends AbstractJvmSpec {

def "do not suggest that ABI dependencies are unused (#gradleVersion)"() {
given:
def project = new AbiUsedClassProject()
gradleProject = project.gradleProject

when:
build(gradleVersion, gradleProject.rootDir, 'buildHealth')

then:
assertThat(actualAdvice('lib')).containsExactlyElementsIn([])

where:
gradleVersion << gradleVersions()
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
package com.autonomousapps.jvm.projects

import com.autonomousapps.AbstractProject
import com.autonomousapps.kit.GradleProject
import com.autonomousapps.kit.Plugin
import com.autonomousapps.kit.Source
import com.autonomousapps.kit.SourceType

import static com.autonomousapps.kit.Dependency.project

class AbiUsedClassProject extends AbstractProject {

final GradleProject gradleProject

AbiUsedClassProject() {
this.gradleProject = build()
}

private GradleProject build() {
def builder = newGradleProjectBuilder()
// consumer
builder.withSubproject('proj') { s ->
s.sources = [SOURCE_CONSUMER]
s.withBuildScript { bs ->
bs.plugins = [Plugin.javaLibraryPlugin]
bs.dependencies = [
project('api', ':lib')
]
}
}
// producer
builder.withSubproject('core') { s ->
s.sources = [SOURCE_CORE_PRODUCER]
s.withBuildScript { bs ->
bs.plugins = [Plugin.javaLibraryPlugin]
bs.dependencies = []
}
}
builder.withSubproject('lib') { s ->
s.sources = [SOURCE_LIB_PRODUCER]
s.withBuildScript { bs ->
bs.plugins = [Plugin.javaLibraryPlugin]
bs.dependencies = [
project('api', ':core')
]
}
}


def project = builder.build()
project.writer().write()
return project
}

private static final Source SOURCE_CONSUMER = new Source(
SourceType.JAVA, "WebImpl", "",
"""\
public class WebImpl {

private final WebPermission user;

public WebImpl(WebPermission user) {
this.user = user;
}

public boolean canChangePassword() {
return user.isAdmin();
}
}
""".stripIndent()
)

private static final Source SOURCE_CORE_PRODUCER = new Source(
SourceType.JAVA, "IPermission", "",
"""\
public interface IPermission {
String name();
boolean isAdmin();
default Object getLoggingObject() {
return name();
}
}
""".stripIndent()
)

private static final Source SOURCE_LIB_PRODUCER = new Source(
SourceType.JAVA, "WebPermission", "",
"""\
public enum WebPermission implements IPermission {
ViewData(false),
EditData(true),
;

private final boolean superRole;

WebPermission(boolean superRole) {
this.superRole = superRole;
}

@Override
public boolean isAdmin() {
return superRole;
}
}
""".stripIndent()
)
}
9 changes: 9 additions & 0 deletions src/main/kotlin/com/autonomousapps/internal/advice/Advisor.kt
Original file line number Diff line number Diff line change
@@ -142,6 +142,7 @@ internal class Advisor(
.stripServiceLoaders()
.stripSecurityProviders()
.stripLintOnlyJars()
.stripAbiDeps()
}

/**
@@ -281,4 +282,12 @@ internal class Advisor(
}
}
}

private fun <T : HasDependency> Iterable<T>.stripAbiDeps(): Set<T> {
return filterToOrderedSet { container ->
abiDeps.none { abiDep ->
container.dependency == abiDep.dependency
}
}
}
}