Skip to content
This repository has been archived by the owner on Aug 19, 2020. It is now read-only.

Generate compilable accessors for container elements of default package type #1164

Merged
merged 5 commits into from
Oct 17, 2018
Merged
Show file tree
Hide file tree
Changes from 3 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
Expand Up @@ -38,24 +38,18 @@ class ProjectSchemaAccessorsIntegrationTest : AbstractPluginIntegrationTest() {

lateinit var extensionSourceFile: File

withFolders {

"buildSrc" {

withPrecompiledPlugins()

"src/main/kotlin" {

extensionSourceFile =
withFile("Extension.kt", """
internal
class Extension
""")
withBuildSrc {
"src/main/kotlin" {

withFile("plugin.gradle.kts", """
extensions.add("extension", Extension())
extensionSourceFile =
withFile("Extension.kt", """
internal
class Extension
""")
}

withFile("plugin.gradle.kts", """
extensions.add("extension", Extension())
""")
}
}

Expand Down Expand Up @@ -99,25 +93,19 @@ class ProjectSchemaAccessorsIntegrationTest : AbstractPluginIntegrationTest() {
@Test
fun `can access extension of default package type`() {

withFolders {

"buildSrc" {

withPrecompiledPlugins()
withBuildSrc {

"src/main/kotlin" {
"src/main/kotlin" {

withFile("Extension.kt", """
class Extension(private val name: String) : org.gradle.api.Named {
override fun getName() = name
}
""")
withFile("Extension.kt", """
class Extension(private val name: String) : org.gradle.api.Named {
override fun getName() = name
}
""")

withFile("plugin.gradle.kts", """
extensions.add("extension", Extension("foo"))
extensions.add("beans", container(Extension::class))
""")
}
withFile("plugin.gradle.kts", """
extensions.add("extension", Extension("foo"))
""")
}
}

Expand All @@ -129,41 +117,83 @@ class ProjectSchemaAccessorsIntegrationTest : AbstractPluginIntegrationTest() {

println("extension: " + typeOf(extension))
extension { println("extension{} " + typeOf(this)) }

println("beans: " + typeOf(beans))
beans { println("beans{} " + typeOf(beans)) }
""")

assertThat(
build("help", "-q").output,
containsMultiLineString("""
extension: Extension
extension{} Extension
beans: org.gradle.api.NamedDomainObjectContainer<Extension>
beans{} org.gradle.api.NamedDomainObjectContainer<Extension>
""")
)
}

@Test
fun `can access task of default package type`() {
fun `can access container element of default package type`() {

withFolders {
withBuildSrc {

"buildSrc" {
"src/main/kotlin" {

withPrecompiledPlugins()
withFile("Bean.kt", """
open class Bean(private val name: String) : org.gradle.api.Named {
override fun getName() = name
}
""")

"src/main/kotlin" {
withFile("plugin.gradle.kts", """

withFile("CustomTask.kt", """
open class CustomTask : org.gradle.api.DefaultTask()
""")
import org.gradle.api.internal.*
import org.gradle.internal.reflect.*

withFile("plugin.gradle.kts", """
tasks.register<CustomTask>("customTask")
""")
}
val beans = DefaultPolymorphicDomainObjectContainer(
Any::class.java,
DirectInstantiator.INSTANCE
) { (it as Bean).name }

// TODO: schema doesn't expose the registered element as Bean
eskatos marked this conversation as resolved.
Show resolved Hide resolved
eskatos marked this conversation as resolved.
Show resolved Hide resolved
beans.register("bean", Bean::class)
extensions.add("beans", beans)

""")
}
}

withBuildScript("""

plugins { id("plugin") }

inline fun <reified T> typeOf(value: T) = typeOf<T>()

println("beans: " + typeOf(beans))
println("bean: " + typeOf(beans.bean))
beans { println("beans{} " + typeOf(beans)) }
""")

// TODO: `bean` should be exposed as `Bean` in the collection schema
assertThat(
build("help", "-q").output,
containsMultiLineString("""
beans: org.gradle.api.NamedDomainObjectContainer<java.lang.Object>
bean: org.gradle.api.NamedDomainObjectProvider<java.lang.Object>
beans{} org.gradle.api.NamedDomainObjectContainer<java.lang.Object>
""")
)
}

@Test
fun `can access task of default package type`() {

withBuildSrc {
"src/main/kotlin" {

withFile("CustomTask.kt", """
open class CustomTask : org.gradle.api.DefaultTask()
""")

withFile("plugin.gradle.kts", """
tasks.register<CustomTask>("customTask")
""")
}
}

Expand All @@ -189,35 +219,28 @@ class ProjectSchemaAccessorsIntegrationTest : AbstractPluginIntegrationTest() {
@Test
fun `can access extension of nested type`() {

withFolders {

"buildSrc" {

withPrecompiledPlugins()

"src/main/kotlin/my" {
withBuildSrc {
"src/main/kotlin/my" {

withFile("Extension.kt", """
package my
withFile("Extension.kt", """
package my

class Nested {
class Extension(private val name: String) : org.gradle.api.Named {
override fun getName() = name
}
class Nested {
class Extension(private val name: String) : org.gradle.api.Named {
override fun getName() = name
}
""")
}
""")

withFile("plugin.gradle.kts", """
package my
withFile("plugin.gradle.kts", """
package my

extensions.add("nested", Nested.Extension("foo"))
extensions.add("beans", container(Nested.Extension::class))
""")
}
extensions.add("nested", Nested.Extension("foo"))
extensions.add("beans", container(Nested.Extension::class))
""")
}
}


withBuildScript("""

plugins { id("my.plugin") }
Expand Down Expand Up @@ -251,40 +274,35 @@ class ProjectSchemaAccessorsIntegrationTest : AbstractPluginIntegrationTest() {
@Test
fun `multiple generic extension targets`() {

withFolders {

"buildSrc" {
withBuildSrc {

withPrecompiledPlugins()
"src/main/kotlin" {
withFile("types.kt", """

"src/main/kotlin" {
withFile("types.kt", """
package my

package my
data class NamedString(val name: String, var value: String? = null)

data class NamedString(val name: String, var value: String? = null)

data class NamedLong(val name: String, var value: Long? = null)
""")
data class NamedLong(val name: String, var value: Long? = null)
""")

withFile("plugin.gradle.kts", """
withFile("plugin.gradle.kts", """

package my
package my

val strings = container(NamedString::class) { NamedString(it) }
extensions.add("strings", strings)
val strings = container(NamedString::class) { NamedString(it) }
extensions.add("strings", strings)

val longs = container(NamedLong::class) { NamedLong(it) }
extensions.add("longs", longs)
val longs = container(NamedLong::class) { NamedLong(it) }
extensions.add("longs", longs)

tasks.register("printStringsAndLongs") {
doLast {
strings.forEach { println("string: " + it) }
longs.forEach { println("long: " + it) }
}
tasks.register("printStringsAndLongs") {
doLast {
strings.forEach { println("string: " + it) }
longs.forEach { println("long: " + it) }
}
""")
}
}
""")
}
}

Expand Down Expand Up @@ -439,25 +457,25 @@ class ProjectSchemaAccessorsIntegrationTest : AbstractPluginIntegrationTest() {
@Test
fun `can access NamedDomainObjectContainer extension via generated accessor`() {

withKotlinBuildSrc()
withBuildSrc {
withFile("src/main/kotlin/my/DocumentationPlugin.kt", """
package my

withFile("buildSrc/src/main/kotlin/my/DocumentationPlugin.kt", """
package my
import org.gradle.api.*
import org.gradle.kotlin.dsl.*

import org.gradle.api.*
import org.gradle.kotlin.dsl.*
class DocumentationPlugin : Plugin<Project> {

class DocumentationPlugin : Plugin<Project> {

override fun apply(project: Project) {
val books = project.container(Book::class, ::Book)
project.extensions.add("the books", books)
override fun apply(project: Project) {
val books = project.container(Book::class, ::Book)
project.extensions.add("the books", books)
}
}
}

data class Book(val name: String)
data class Book(val name: String)

""")
""")
}

val buildFile = withBuildScript("""

Expand All @@ -467,7 +485,8 @@ class ProjectSchemaAccessorsIntegrationTest : AbstractPluginIntegrationTest() {


println(
build("kotlinDslAccessorsSnapshot").output)
build("kotlinDslAccessorsSnapshot").output
)


buildFile.appendText("""
Expand All @@ -488,7 +507,8 @@ class ProjectSchemaAccessorsIntegrationTest : AbstractPluginIntegrationTest() {
""")
assertThat(
build("books").output,
containsString("quickStart, userGuide"))
containsString("quickStart, userGuide")
)
}

@Test
Expand All @@ -506,7 +526,8 @@ class ProjectSchemaAccessorsIntegrationTest : AbstractPluginIntegrationTest() {

assertThat(
build("mainClassName").output,
containsString("*App*"))
containsString("*App*")
)
}

@Test
Expand Down Expand Up @@ -563,7 +584,9 @@ class ProjectSchemaAccessorsIntegrationTest : AbstractPluginIntegrationTest() {
containsString("a/build/classes/java/main"),
containsString("b/build/classes/java/main"),
not(containsString("logback-core")),
not(containsString("commons-io"))))
not(containsString("commons-io"))
)
)
}

@Test
Expand All @@ -577,7 +600,13 @@ class ProjectSchemaAccessorsIntegrationTest : AbstractPluginIntegrationTest() {
assertThat(aTasks, not(containsString("kotlinDslAccessorsSnapshot")))

val rootTasks = build(":tasks").output
assertThat(rootTasks, allOf(containsString("kotlinDslAccessorsReport"), containsString("kotlinDslAccessorsSnapshot")))
assertThat(
rootTasks,
allOf(
containsString("kotlinDslAccessorsReport"),
containsString("kotlinDslAccessorsSnapshot")
)
)
}

@Test
Expand Down Expand Up @@ -948,6 +977,16 @@ class ProjectSchemaAccessorsIntegrationTest : AbstractPluginIntegrationTest() {
build("help")
}

private
fun withBuildSrc(contents: FoldersDslExpression) {
withFolders {
"buildSrc" {
withPrecompiledPlugins()
contents()
}
}
}

private
fun withFolders(folders: FoldersDslExpression) =
projectRoot.withFolders(folders)
Expand Down
Loading