Skip to content

Commit b1faef7

Browse files
feat: remove unused 'file' property.
1 parent 84796d7 commit b1faef7

6 files changed

Lines changed: 86 additions & 51 deletions

File tree

src/main/kotlin/com/autonomousapps/internal/utils/comparators.kt

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,3 +63,37 @@ internal class MapSetComparator<K : Comparable<K>, V : Comparable<V>> : Comparat
6363
return 0
6464
}
6565
}
66+
internal class MapComparator<K : Comparable<K>, V : Comparable<V>> : Comparator<Map<K, V>> {
67+
override fun compare(left: Map<K, V>?, right: Map<K, V>?): Int {
68+
if (left === right) return 0
69+
if (left == null || right == null) return if (left == null) -1 else 1
70+
71+
if (left.size > right.size) return 1
72+
if (right.size > left.size) return -1
73+
74+
val leftIterator = left.iterator()
75+
val rightIterator = right.iterator()
76+
77+
while (leftIterator.hasNext() && rightIterator.hasNext()) {
78+
val leftEntry = leftIterator.next()
79+
val rightEntry = rightIterator.next()
80+
81+
// Compare keys first
82+
val keyCompareResult = leftEntry.key.compareTo(rightEntry.key)
83+
if (keyCompareResult != 0) {
84+
return keyCompareResult
85+
}
86+
87+
// If keys match, compare values
88+
val valueCompareResult = leftEntry.value.compareTo(rightEntry.value)
89+
if (valueCompareResult != 0) {
90+
return valueCompareResult
91+
}
92+
}
93+
94+
if (leftIterator.hasNext()) return 1
95+
if (rightIterator.hasNext()) return -1
96+
97+
return 0
98+
}
99+
}

src/main/kotlin/com/autonomousapps/model/internal/Dependency.kt

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,22 @@
22
// SPDX-License-Identifier: Apache-2.0
33
package com.autonomousapps.model.internal
44

5-
import com.autonomousapps.model.Coordinates
6-
import com.autonomousapps.model.FlatCoordinates
7-
import com.autonomousapps.model.IncludedBuildCoordinates
8-
import com.autonomousapps.model.ModuleCoordinates
9-
import com.autonomousapps.model.ProjectCoordinates
5+
import com.autonomousapps.internal.utils.MapComparator
6+
import com.autonomousapps.model.*
107
import com.squareup.moshi.JsonClass
118
import dev.zacsweers.moshix.sealed.annotations.TypeLabel
12-
import java.io.File
139

1410
@JsonClass(generateAdapter = false, generator = "sealed:type")
1511
internal sealed class Dependency(
1612
open val coordinates: Coordinates,
1713
open val capabilities: Map<String, Capability>,
18-
// Can be empty because we don't get file for annotation processor dependencies.
19-
// This property is also unused and was only added speculatively, so maybe it doesn't matter
20-
open val files: Set<File>
2114
) : Comparable<Dependency> {
22-
override fun compareTo(other: Dependency): Int = coordinates.compareTo(other.coordinates)
15+
16+
override fun compareTo(other: Dependency): Int {
17+
return compareBy(Dependency::coordinates)
18+
.thenBy(MapComparator()) { it.capabilities }
19+
.compare(this, other)
20+
}
2321

2422
inline fun <reified T : Capability> findCapability(): T? {
2523
return capabilities[T::class.java.canonicalName] as? T?
@@ -32,29 +30,25 @@ internal data class ProjectDependency(
3230
override val coordinates: ProjectCoordinates,
3331
/** Map of [Capability] canonicalName to the capability. */
3432
override val capabilities: Map<String, Capability>,
35-
override val files: Set<File>
36-
) : Dependency(coordinates, capabilities, files)
33+
) : Dependency(coordinates, capabilities)
3734

3835
@TypeLabel("module")
3936
@JsonClass(generateAdapter = false)
4037
internal data class ModuleDependency(
4138
override val coordinates: ModuleCoordinates,
4239
override val capabilities: Map<String, Capability>,
43-
override val files: Set<File>
44-
) : Dependency(coordinates, capabilities, files)
40+
) : Dependency(coordinates, capabilities)
4541

4642
@TypeLabel("flat")
4743
@JsonClass(generateAdapter = false)
4844
internal data class FlatDependency(
4945
override val coordinates: FlatCoordinates,
5046
override val capabilities: Map<String, Capability>,
51-
override val files: Set<File>
52-
) : Dependency(coordinates, capabilities, files)
47+
) : Dependency(coordinates, capabilities)
5348

5449
@TypeLabel("included_build")
5550
@JsonClass(generateAdapter = false)
5651
internal data class IncludedBuildDependency(
5752
override val coordinates: IncludedBuildCoordinates,
5853
override val capabilities: Map<String, Capability>,
59-
override val files: Set<File>
60-
) : Dependency(coordinates, capabilities, files)
54+
) : Dependency(coordinates, capabilities)

src/main/kotlin/com/autonomousapps/model/internal/PhysicalArtifact.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@ import java.io.File
1212
@JsonClass(generateAdapter = false)
1313
internal data class PhysicalArtifact(
1414
val coordinates: Coordinates,
15-
/** Physical artifact on disk; a jar file or directory pointing to class files. */
15+
/**
16+
* Physical artifact on disk; a jar file or directory pointing to class files. This file has an absolute path.
17+
* nb: attempts to make this file relative have thus far been doomed to fail. Please stop trying.
18+
*/
1619
val file: File,
1720
) : Comparable<PhysicalArtifact> {
1821

src/main/kotlin/com/autonomousapps/model/internal/intermediates/producer/ExplodedJar.kt

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,13 @@
22
// SPDX-License-Identifier: Apache-2.0
33
package com.autonomousapps.model.internal.intermediates.producer
44

5+
import com.autonomousapps.internal.utils.LexicographicIterableComparator
6+
import com.autonomousapps.internal.utils.MapSetComparator
57
import com.autonomousapps.internal.utils.ifNotEmpty
68
import com.autonomousapps.model.Coordinates
79
import com.autonomousapps.model.internal.*
810
import com.autonomousapps.model.internal.intermediates.ExplodingJar
911
import com.squareup.moshi.JsonClass
10-
import java.io.File
1112

1213
/**
1314
* A library or project, along with the set of classes declared by, and other information contained within, this
@@ -16,7 +17,6 @@ import java.io.File
1617
@JsonClass(generateAdapter = false)
1718
internal data class ExplodedJar(
1819
override val coordinates: Coordinates,
19-
val jarFile: File,
2020

2121
/**
2222
* True if this dependency contains only annotations. False otherwise.
@@ -58,7 +58,6 @@ internal data class ExplodedJar(
5858
exploding: ExplodingJar,
5959
) : this(
6060
coordinates = artifact.coordinates,
61-
jarFile = artifact.file,
6261
isAnnotations = exploding.isCompileOnlyCandidate,
6362
securityProviders = exploding.securityProviders,
6463
androidLintRegistry = exploding.androidLintRegistry,
@@ -70,9 +69,16 @@ internal data class ExplodedJar(
7069
)
7170

7271
override fun compareTo(other: ExplodedJar): Int {
73-
return coordinates.compareTo(other.coordinates).let {
74-
if (it == 0) jarFile.compareTo(other.jarFile) else it
75-
}
72+
return compareBy(ExplodedJar::coordinates)
73+
.thenBy(ExplodedJar::isAnnotations)
74+
.thenComparing(compareBy<ExplodedJar, String?>(nullsFirst()) { it.androidLintRegistry })
75+
.thenBy(ExplodedJar::isLintJar)
76+
.thenBy(LexicographicIterableComparator()) { it.securityProviders }
77+
.thenBy(LexicographicIterableComparator()) { it.binaryClasses }
78+
.thenBy(LexicographicIterableComparator()) { it.ktFiles }
79+
.thenBy(MapSetComparator()) { it.constants }
80+
.thenBy(MapSetComparator()) { it.reflectiveAccesses }
81+
.compare(this, other)
7682
}
7783

7884
init {

src/main/kotlin/com/autonomousapps/tasks/ArtifactsReportTask.kt

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import org.gradle.api.artifacts.Configuration
1818
import org.gradle.api.file.FileCollection
1919
import org.gradle.api.file.RegularFileProperty
2020
import org.gradle.api.provider.Property
21+
import org.gradle.api.provider.Provider
2122
import org.gradle.api.provider.SetProperty
2223
import org.gradle.api.tasks.*
2324

@@ -46,19 +47,23 @@ public abstract class ArtifactsReportTask : DefaultTask() {
4647
* jars really does matter here. Using [Classpath] is an error, as it looks only at content and
4748
* not name or path, and we really do need to know the actual path to the artifact, even if its
4849
* contents haven't changed.
50+
*
51+
* Attempts to make this path non-absolute have thus far failed. Please stop trying.
4952
*/
5053
@PathSensitive(PathSensitivity.ABSOLUTE)
51-
@InputFiles // TODO(tsr): can I avoid using `get()`?
52-
public fun getClasspathArtifactFiles(): FileCollection = artifacts.get().artifactFiles
54+
@InputFiles
55+
public fun getClasspathArtifactFiles(): Provider<FileCollection> {
56+
return artifacts.map { it.artifactFiles }
57+
}
5358

5459
/** @see [getClasspathArtifactFiles] */
5560
@PathSensitive(PathSensitivity.ABSOLUTE)
56-
@InputFiles // TODO(tsr): can I avoid using `get()`?
57-
public fun getClasspathOpaqueArtifactFiles(): FileCollection = opaqueArtifacts.get().artifactFiles
61+
@InputFiles
62+
public fun getClasspathOpaqueArtifactFiles(): Provider<FileCollection> {
63+
return opaqueArtifacts.map { it.artifactFiles }
64+
}
5865

59-
/**
60-
* This artifact collection is the result of resolving the compile or runtime classpath.
61-
*/
66+
/** This artifact collection is the result of resolving the compile or runtime classpath for jar artifacts. */
6267
public fun setConfiguration(
6368
configuration: NamedDomainObjectProvider<Configuration>,
6469
action: (Configuration) -> ArtifactCollection,
@@ -67,6 +72,10 @@ public abstract class ArtifactsReportTask : DefaultTask() {
6772
artifacts.set(configuration.map { c -> action(c) })
6873
}
6974

75+
/**
76+
* This artifact collection is the result of resolving the compile or runtime classpath for
77+
* [OpaqueComponentArtifactIdentifiers][org.gradle.internal.component.local.model.OpaqueComponentArtifactIdentifier].
78+
*/
7079
public fun setOpaqueConfiguration(
7180
configuration: NamedDomainObjectProvider<Configuration>,
7281
action: (Configuration) -> ArtifactCollection,

src/main/kotlin/com/autonomousapps/tasks/SynthesizeDependenciesTask.kt

Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,7 @@ package com.autonomousapps.tasks
55
import com.autonomousapps.internal.utils.*
66
import com.autonomousapps.model.*
77
import com.autonomousapps.model.internal.*
8-
import com.autonomousapps.model.internal.intermediates.producer.AndroidAssetDependency
9-
import com.autonomousapps.model.internal.intermediates.producer.AndroidManifestDependency
10-
import com.autonomousapps.model.internal.intermediates.producer.AndroidResDependency
11-
import com.autonomousapps.model.internal.intermediates.producer.AnnotationProcessorDependency
12-
import com.autonomousapps.model.internal.intermediates.producer.DependencyView
13-
import com.autonomousapps.model.internal.intermediates.producer.ExplodedJar
14-
import com.autonomousapps.model.internal.intermediates.producer.InlineMemberDependency
15-
import com.autonomousapps.model.internal.intermediates.producer.NativeLibDependency
16-
import com.autonomousapps.model.internal.intermediates.producer.ReflectingDependency
17-
import com.autonomousapps.model.internal.intermediates.producer.ServiceLoaderDependency
18-
import com.autonomousapps.model.internal.intermediates.producer.TypealiasDependency
8+
import com.autonomousapps.model.internal.intermediates.producer.*
199
import com.autonomousapps.services.InMemoryCache
2010
import org.gradle.api.DefaultTask
2111
import org.gradle.api.file.DirectoryProperty
@@ -25,7 +15,6 @@ import org.gradle.api.tasks.*
2515
import org.gradle.workers.WorkAction
2616
import org.gradle.workers.WorkParameters
2717
import org.gradle.workers.WorkerExecutor
28-
import java.io.File
2918
import javax.inject.Inject
3019

3120
@CacheableTask
@@ -156,10 +145,12 @@ public abstract class SynthesizeDependenciesTask @Inject constructor(
156145
val androidRes = parameters.androidRes.fromNullableJsonSet<AndroidResDependency>()
157146
val androidAssets = parameters.androidAssets.fromNullableJsonSet<AndroidAssetDependency>()
158147

148+
// TODO(tsr): I wonder if we don't need this anymore. If not, we can remove this as a task input which would help
149+
// cacheability (since `PhysicalArtifact` has a reference to an absolute `File`).
159150
physicalArtifacts.forEach { artifact ->
160151
builders.merge(
161152
artifact.coordinates,
162-
DependencyBuilder(artifact.coordinates).apply { files.add(artifact.file) },
153+
DependencyBuilder(artifact.coordinates),
163154
DependencyBuilder::concat
164155
)
165156
}
@@ -254,10 +245,8 @@ public abstract class SynthesizeDependenciesTask @Inject constructor(
254245
private class DependencyBuilder(val coordinates: Coordinates) {
255246

256247
val capabilities: MutableList<Capability> = mutableListOf()
257-
val files: MutableSet<File> = sortedSetOf()
258248

259249
fun concat(other: DependencyBuilder): DependencyBuilder {
260-
files.addAll(other.files)
261250
other.capabilities.forEach { otherCapability ->
262251
val existing = capabilities.find { it.javaClass.canonicalName == otherCapability.javaClass.canonicalName }
263252
if (existing != null) {
@@ -274,10 +263,10 @@ public abstract class SynthesizeDependenciesTask @Inject constructor(
274263
fun build(): Dependency {
275264
val capabilities: Map<String, Capability> = capabilities.associateBy { it.javaClass.canonicalName }.toSortedMap()
276265
return when (coordinates) {
277-
is ProjectCoordinates -> ProjectDependency(coordinates, capabilities, files)
278-
is ModuleCoordinates -> ModuleDependency(coordinates, capabilities, files)
279-
is FlatCoordinates -> FlatDependency(coordinates, capabilities, files)
280-
is IncludedBuildCoordinates -> IncludedBuildDependency(coordinates, capabilities, files)
266+
is ProjectCoordinates -> ProjectDependency(coordinates, capabilities)
267+
is ModuleCoordinates -> ModuleDependency(coordinates, capabilities)
268+
is FlatCoordinates -> FlatDependency(coordinates, capabilities)
269+
is IncludedBuildCoordinates -> IncludedBuildDependency(coordinates, capabilities)
281270
}
282271
}
283272
}

0 commit comments

Comments
 (0)