Slackbot
01/15/2023, 2:12 AMPhilip W
01/15/2023, 2:14 AMFooPlugin
creating an extension:
interface FooExtension {
val foos: NamedDomainObjectContainer<Foo>
}
abstract class Foo(private val name: String): Named {
override fun getName() = name
}
class FooPlugin : Plugin<Project> {
override fun apply(project: Project) {
val fooExt = project.extensions.create("foo", FooExtension::class.java)
fooExt.foos.register("testFoo")
}
}
// build.gradle.kts
foo.foos.testFoo // Unresolved reference.
ephemient
01/15/2023, 2:18 AMinterface FooExtension : NamedDomainObjectContainer<Foo>
class FooPlugin : Plugin<Project> {
override fun apply(project: Project) {
project.extensions.create<FooExtension>("foo", ...)
Philip W
01/15/2023, 2:19 AMephemient
01/15/2023, 2:21 AMPhilip W
01/15/2023, 2:33 AMCould not create an instance of type FooExtension.
> Could not generate a decorated class for type FooExtension.
> Cannot have abstract method NamedDomainObjectCollection.getAsMap().
ephemient
01/15/2023, 2:38 AMinternal class DefaultFooExtension @Inject constructor(
private val objects: ObjectFactory,
) : AbstractNamedDomainObjectContainer(), FooExtension {
override fun doCreate(name: String): Foo = objects.newInstance(name)
}
val fooExtension = project.objects.newInstance<DefaultFooExtension>()
project.extensions.add<FooExtension>("foo", fooExtension)
ephemient
01/15/2023, 2:40 AMephemient
01/15/2023, 2:50 AMproject.extensions.add("foo", project.objects.domainObjectContainer<Foo>())
but you wouldn't be able to add your own functions to itPhilip W
01/15/2023, 11:03 AM