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

Commit

Permalink
Merge pull request #752 from gradle/bamboo/lcbp/implicit-imports
Browse files Browse the repository at this point in the history
Expose implicit imports to precompiled scripts
  • Loading branch information
bamboo committed Mar 15, 2018
2 parents 2ac2c5b + 8d58054 commit 54b0e5a
Show file tree
Hide file tree
Showing 5 changed files with 140 additions and 45 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,9 @@ package org.gradle.kotlin.dsl.plugins.dsl
import org.gradle.api.Plugin
import org.gradle.api.Project

import org.gradle.kotlin.dsl.*
import org.gradle.kotlin.dsl.gradleKotlinDsl
import org.gradle.kotlin.dsl.plugins.embedded.EmbeddedKotlinPlugin

import org.gradle.kotlin.dsl.precompile.PrecompiledInitScript
import org.gradle.kotlin.dsl.precompile.PrecompiledProjectScript
import org.gradle.kotlin.dsl.precompile.PrecompiledSettingsScript

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

import org.jetbrains.kotlin.samWithReceiver.gradle.SamWithReceiverExtension
import org.jetbrains.kotlin.samWithReceiver.gradle.SamWithReceiverGradleSubplugin

Expand All @@ -48,7 +42,6 @@ open class KotlinDslPlugin : Plugin<Project> {
applyEmbeddedKotlinPlugin()
addGradleKotlinDslDependencyTo("compileOnly", "testRuntimeOnly")
configureCompilerPlugins()
configureCompilerTasks()
}
}

Expand All @@ -71,27 +64,4 @@ open class KotlinDslPlugin : Plugin<Project> {
samWithReceiver.annotation(org.gradle.api.HasImplicitReceiver::class.qualifiedName!!)
}
}

private
fun Project.configureCompilerTasks() {
tasks {
"compileKotlin"(KotlinCompile::class) {
kotlinOptions {
freeCompilerArgs += listOf("-script-templates", scriptTemplates)
}
}
}
}

private
val scriptTemplates by lazy {
listOf(
// treat *.settings.gradle.kts files as Settings scripts
PrecompiledSettingsScript::class.qualifiedName!!,
// treat *.init.gradle.kts files as Gradle scripts
PrecompiledInitScript::class.qualifiedName!!,
// treat *.gradle.kts files as Project scripts
PrecompiledProjectScript::class.qualifiedName!!
).joinToString(separator = ",")
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
/*
* Copyright 2018 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.gradle.kotlin.dsl.plugins.precompiled

import org.gradle.api.Plugin
import org.gradle.api.Project

import org.gradle.kotlin.dsl.invoke

import org.gradle.kotlin.dsl.precompile.PrecompiledInitScript
import org.gradle.kotlin.dsl.precompile.PrecompiledProjectScript
import org.gradle.kotlin.dsl.precompile.PrecompiledScriptDependenciesResolver
import org.gradle.kotlin.dsl.precompile.PrecompiledSettingsScript

import org.gradle.kotlin.dsl.support.ImplicitImports
import org.gradle.kotlin.dsl.support.serviceOf

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile


/*
* Enables the compilation of `*.gradle.kts` scripts in regular Kotlin source-sets.
*/
open class PrecompiledScriptPlugins : Plugin<Project> {

override fun apply(project: Project) = project.run {

afterEvaluate {

tasks {

"compileKotlin"(KotlinCompile::class) {
kotlinOptions {
freeCompilerArgs += listOf(
"-script-templates", scriptTemplates,
// Propagate implicit imports and other settings
"-Xscript-resolver-environment=${resolverEnvironment()}"
)
}
}
}
}
}

private
val scriptTemplates by lazy {
listOf(
// treat *.settings.gradle.kts files as Settings scripts
PrecompiledSettingsScript::class.qualifiedName!!,
// treat *.init.gradle.kts files as Gradle scripts
PrecompiledInitScript::class.qualifiedName!!,
// treat *.gradle.kts files as Project scripts
PrecompiledProjectScript::class.qualifiedName!!
).joinToString(separator = ",")
}

private
fun Project.resolverEnvironment() =
(PrecompiledScriptDependenciesResolver.EnvironmentProperties.kotlinDslImplicitImports
+ "=\"" + implicitImports().joinToString(separator = ":") + "\"")

private
fun Project.implicitImports(): List<String> =
serviceOf<ImplicitImports>().list
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package org.gradle.kotlin.dsl.plugins.dsl
package org.gradle.kotlin.dsl.plugins.precompiled

import com.nhaarman.mockito_kotlin.doReturn
import com.nhaarman.mockito_kotlin.mock
import com.nhaarman.mockito_kotlin.verify

import org.gradle.api.Project
import org.gradle.api.initialization.Settings
import org.gradle.api.invocation.Gradle
import org.gradle.api.tasks.TaskContainer

import org.gradle.kotlin.dsl.fixtures.AbstractPluginTest
import org.gradle.kotlin.dsl.fixtures.assertInstanceOf
Expand Down Expand Up @@ -82,9 +84,30 @@ class PrecompiledScriptPluginTest : AbstractPluginTest() {
verify(gradle).useLogger("my-logger")
}

@Test
fun `implicit imports are available to precompiled scripts`() {

givenPrecompiledKotlinScript("my-project-script.gradle.kts", """
task<Jar>("jar")
""")

val tasks = mock<TaskContainer>()
val project = mock<Project>() {
on { getTasks() } doReturn tasks
}

instantiatePrecompiledScriptOf(
project,
"My_project_script_gradle")

verify(tasks).create("jar", org.gradle.api.tasks.bundling.Jar::class.java)
}

private
fun givenPrecompiledKotlinScript(fileName: String, code: String) {
withKotlinDslPlugin()
withPrecompiledScriptPlugins()
withFile("src/main/kotlin/$fileName", code)
compileKotlin()
}
Expand All @@ -101,13 +124,15 @@ class PrecompiledScriptPluginTest : AbstractPluginTest() {
.loadClass(className)

private
fun withKotlinDslPlugin() =
fun withPrecompiledScriptPlugins() =
withBuildScript("""
plugins {
`kotlin-dsl`
}
apply<${PrecompiledScriptPlugins::class.qualifiedName}>()
""")

private
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,39 @@

package org.gradle.kotlin.dsl.precompile

import org.gradle.kotlin.dsl.resolver.KotlinBuildScriptDependencies

import java.util.concurrent.Future

import kotlin.script.dependencies.ScriptDependenciesResolver
import kotlin.script.dependencies.PseudoFuture
import kotlin.script.dependencies.ScriptContents
import kotlin.script.dependencies.KotlinScriptExternalDependencies
import kotlin.script.dependencies.Environment


class PrecompiledScriptDependenciesResolver : ScriptDependenciesResolver {

object EnvironmentProperties {
const val kotlinDslImplicitImports = "kotlinDslImplicitImports"
}

override fun resolve(
script: ScriptContents,
environment: Environment?,
report: (ScriptDependenciesResolver.ReportSeverity, String, ScriptContents.Position?) -> Unit,
previousDependencies: KotlinScriptExternalDependencies?
): Future<KotlinScriptExternalDependencies?> =

PseudoFuture(
KotlinBuildScriptDependencies(
imports = implicitImportsFrom(environment),
classpath = emptyList(),
sources = emptyList(),
buildscriptBlockHash = null))

class PrecompiledScriptDependenciesResolver : ScriptDependenciesResolver
private
fun implicitImportsFrom(environment: Environment?) =
(environment?.get(EnvironmentProperties.kotlinDslImplicitImports) as? String)?.split(':')
?: emptyList()
}
Original file line number Diff line number Diff line change
Expand Up @@ -175,16 +175,6 @@ object ResolverCoordinator {
return ResolverAction.ReturnPrevious
}

val implicitImports = (environment["kotlinDslImplicitImportsFile"] as? String)?.let(::File)?.readLines()
if (implicitImports != null) {
return ResolverAction.Return(
KotlinBuildScriptDependencies(
imports = implicitImports,
classpath = emptyList(),
sources = emptyList(),
buildscriptBlockHash = null))
}

val buildscriptBlockHash = buildscriptBlockHashFor(script, environment)
if (sameBuildscriptBlockHashAs(previousDependencies, buildscriptBlockHash)) {
return ResolverAction.ReturnPrevious
Expand Down

0 comments on commit 54b0e5a

Please sign in to comment.