Skip to content

Commit

Permalink
Add support for using project dependencies in the declarative DSL wit…
Browse files Browse the repository at this point in the history
…h DependencyCollector (#28465)
  • Loading branch information
bot-gradle committed Mar 26, 2024
2 parents 0f3cf9d + e6f436d commit 464c82f
Showing 1 changed file with 46 additions and 16 deletions.
Expand Up @@ -86,7 +86,7 @@ class DependencyFunctionsExtractor(val configurations: DependencyConfigurations)
DataMemberFunction(
kClass.toDataTypeRef(),
configurationName,
listOf(DataParameter("dependency", ProjectDependency::class.toDataTypeRef(), false, ParameterSemantics.Unknown)),
listOf(projectDependencyParam),
false,
FunctionSemantics.AddAndConfigure(ProjectDependency::class.toDataTypeRef(), NOT_ALLOWED)
)
Expand All @@ -104,13 +104,22 @@ class ImplicitDependencyCollectorFunctionExtractor(val configurations: Dependenc
.filter { function -> hasDependencyCollectorGetterSignature(function) }
.map { function -> function.name.removePrefix("get").replaceFirstChar { it.lowercase(Locale.getDefault()) } }
.filter { confName -> confName in configurations.configurationNames }
.map { confName ->
DataMemberFunction(
kClass.toDataTypeRef(),
confName,
listOf(DataParameter("dependency", String::class.toDataTypeRef(), false, ParameterSemantics.Unknown)),
false,
FunctionSemantics.AddAndConfigure(kClass.toDataTypeRef(), NOT_ALLOWED)
.flatMap { confName ->
listOf(
DataMemberFunction(
kClass.toDataTypeRef(),
confName,
listOf(gavDependencyParam),
false,
FunctionSemantics.AddAndConfigure(kClass.toDataTypeRef(), NOT_ALLOWED)
),
DataMemberFunction(
kClass.toDataTypeRef(),
confName,
listOf(projectDependencyParam),
false,
FunctionSemantics.AddAndConfigure(kClass.toDataTypeRef(), NOT_ALLOWED)
)
)
}

Expand Down Expand Up @@ -148,14 +157,27 @@ class ImplicitDependencyCollectorFunctionResolver(configurations: DependencyConf
if (name in configurationNames) {
val getterFunction = getDependencyCollectorGetter(receiverClass, name)
if (getterFunction != null) {
return RuntimeFunctionResolver.Resolution.Resolved(object : DeclarativeRuntimeFunction {
override fun callBy(receiver: Any, binding: Map<DataParameter, Any?>, hasLambda: Boolean): DeclarativeRuntimeFunction.InvocationResult {
val dependencyNotation = binding.values.single().toString()
val collector: DependencyCollector = getterFunction.call(receiver) as DependencyCollector
collector.add(dependencyNotation)
return DeclarativeRuntimeFunction.InvocationResult(Unit, null)
}
})
if (parameterValueBinding.bindingMap.containsKey(gavDependencyParam)) {
return RuntimeFunctionResolver.Resolution.Resolved(object : DeclarativeRuntimeFunction {
override fun callBy(receiver: Any, binding: Map<DataParameter, Any?>, hasLambda: Boolean): DeclarativeRuntimeFunction.InvocationResult {
val dependencyNotation = binding.values.single().toString()
val collector: DependencyCollector = getterFunction.call(receiver) as DependencyCollector
collector.add(dependencyNotation)
return DeclarativeRuntimeFunction.InvocationResult(Unit, null)
}
})
} else if (parameterValueBinding.bindingMap.containsKey(projectDependencyParam)) {
return RuntimeFunctionResolver.Resolution.Resolved(object : DeclarativeRuntimeFunction {
override fun callBy(receiver: Any, binding: Map<DataParameter, Any?>, hasLambda: Boolean): DeclarativeRuntimeFunction.InvocationResult {
val dependencyNotation = binding.values.single() as ProjectDependency
val collector: DependencyCollector = getterFunction.call(receiver) as DependencyCollector
collector.add(dependencyNotation)
return DeclarativeRuntimeFunction.InvocationResult(Unit, null)
}
})
} else {
throw IllegalStateException("Unexpected parameter binding contents: ${parameterValueBinding.bindingMap.keys} for function: $name in: $receiverClass")
}
}
}
return RuntimeFunctionResolver.Resolution.Unresolved
Expand All @@ -178,3 +200,11 @@ fun hasDependencyCollectorGetterSignature(function: KFunction<*>): Boolean {
}
return function.name.startsWith("get") && returnType == DependencyCollector::class.java && function.parameters.size == 1
}


private
val gavDependencyParam = DataParameter("dependency", String::class.toDataTypeRef(), false, ParameterSemantics.Unknown)


private
val projectDependencyParam = DataParameter("dependency", ProjectDependency::class.toDataTypeRef(), false, ParameterSemantics.Unknown)

0 comments on commit 464c82f

Please sign in to comment.