From 5c18ab750b4c0d69b9faaad2567bc0005ea5bdfa Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Tue, 11 Jul 2017 16:43:47 +0300 Subject: [PATCH] GradleScriptTemplateProvider: avoid duplicating template loading code --- .../scriptTemplateProviderExtensionPoint.kt | 11 +-- .../script/GradleScriptTemplateProvider.kt | 83 +++++++------------ idea/src/META-INF/gradle.xml | 6 +- 3 files changed, 37 insertions(+), 63 deletions(-) diff --git a/compiler/frontend.script/src/org/jetbrains/kotlin/script/scriptTemplateProviderExtensionPoint.kt b/compiler/frontend.script/src/org/jetbrains/kotlin/script/scriptTemplateProviderExtensionPoint.kt index ddf72e44c49..09ad372ab8a 100644 --- a/compiler/frontend.script/src/org/jetbrains/kotlin/script/scriptTemplateProviderExtensionPoint.kt +++ b/compiler/frontend.script/src/org/jetbrains/kotlin/script/scriptTemplateProviderExtensionPoint.kt @@ -54,9 +54,6 @@ interface ScriptTemplatesProvider { val environment: Map? - // for caching already loaded definitions, when needed - val scriptDefinitions: List? get() = null - companion object { val EP_NAME: ExtensionPointName = ExtensionPointName.create("org.jetbrains.kotlin.scriptTemplatesProvider") @@ -75,11 +72,9 @@ fun makeScriptDefsFromTemplatesProviders(providers: Iterable, - val dependenciesClasspath: List, - val scriptDefinitions: List) : TemplateDataOrError() - class Error(val message: String) : TemplateDataOrError() - } + override val templateClassNames get() = listOf(templateClass) - private val templatesData: TemplateDataOrError by lazy { + override val dependenciesClasspath: List + get() { + val gradleHome = gradleExeSettings?.gradleHome ?: error("Unable to get Gradle home directory") - if (gradleExeSettings?.gradleHome == null) return@lazy TemplateDataOrError.Error("Unable to get Gradle home directory") - - val gradleLibDir = File(gradleExeSettings!!.gradleHome, "lib").let { - it.takeIf { it.exists() && it.isDirectory } - ?: return@lazy TemplateDataOrError.Error("Invalid Gradle libraries directory $it") - } - - for ((template, selector) in templates2DependenciesSelectors) { - val cp = gradleLibDir.listFiles { it /* an inference problem without explicit 'it', TODO: remove when fixed */ -> selector.matches(it.name) }.takeIf { it.isNotEmpty() } ?: continue - - val loader = URLClassLoader(cp.map { it.toURI().toURL() }.toTypedArray(), ScriptTemplatesProvider::class.java.classLoader) - try { - val cl = loader.loadClass(template) - val def = KotlinScriptDefinitionFromAnnotatedTemplate(cl.kotlin, resolver, filePattern, environment) - return@lazy TemplateDataOrError.Data(listOf(template), cp.asList(), listOf(def)) + val gradleLibDir = File(gradleHome, "lib").let { + it.takeIf { it.exists() && it.isDirectory } ?: error("Invalid Gradle libraries directory $it") } - catch (e: ClassNotFoundException) {} - catch (e: NoClassDefFoundError) {} + + return gradleLibDir.listFiles { it -> + /* an inference problem without explicit 'it', TODO: remove when fixed */ + dependencySelector.matches(it.name) + }.takeIf { it.isNotEmpty() }?.asList() ?: error("Missing jars in gradle directory") } - return@lazy TemplateDataOrError.Error("Unable to find a suitable template in the Gradle libraries directory $gradleLibDir") - } - - override val templateClassNames: Iterable get() = when(templatesData) { - is GradleScriptTemplatesProvider.TemplateDataOrError.Data -> (templatesData as TemplateDataOrError.Data).templateClassNames - is GradleScriptTemplatesProvider.TemplateDataOrError.Error -> throw IllegalStateException((templatesData as TemplateDataOrError.Error).message) - } - - override val dependenciesClasspath: List get() = when(templatesData) { - is GradleScriptTemplatesProvider.TemplateDataOrError.Data -> (templatesData as TemplateDataOrError.Data).dependenciesClasspath - is GradleScriptTemplatesProvider.TemplateDataOrError.Error -> throw IllegalStateException((templatesData as TemplateDataOrError.Error).message) - } - override val environment: Map? by lazy { mapOf( "gradleHome" to gradleExeSettings?.gradleHome?.let(::File), @@ -113,17 +85,22 @@ class GradleScriptTemplatesProvider(project: Project): ScriptTemplatesProvider { "getScriptSectionTokens" to ::topLevelSectionCodeTextTokens) } - override val scriptDefinitions: List? get() = when(templatesData) { - is GradleScriptTemplatesProvider.TemplateDataOrError.Data -> (templatesData as TemplateDataOrError.Data).scriptDefinitions - is GradleScriptTemplatesProvider.TemplateDataOrError.Error -> throw IllegalStateException((templatesData as TemplateDataOrError.Error).message) + } - companion object { - private val templates2DependenciesSelectors = listOf( - "org.gradle.kotlin.dsl.KotlinBuildScript" to Regex("^gradle-(?:kotlin-dsl|core).*\\.jar\$"), - "org.gradle.script.lang.kotlin.KotlinBuildScript" to Regex("^gradle-(?:script-kotlin|core).*\\.jar\$")) - } -} +class GradleKotlinDSLTemplateProvider(project: Project) : AbstractGradleScriptTemplatesProvider( + project, + "Gradle Kotlin DSL", + "org.gradle.kotlin.dsl.KotlinBuildScript", + Regex("^gradle-(?:kotlin-dsl|core).*\\.jar\$") +) + +class LegacyGradleScriptKotlinTemplateProvider(project: Project) : AbstractGradleScriptTemplatesProvider( + project, + "Gradle Script Kotlin", + "org.gradle.script.lang.kotlin.KotlinBuildScript", + Regex("^gradle-(?:script-kotlin|core).*\\.jar\$") +) class TopLevelSectionTokensEnumerator(script: CharSequence, identifier: String) : Enumeration { diff --git a/idea/src/META-INF/gradle.xml b/idea/src/META-INF/gradle.xml index d9daa47063c..2167d14243c 100644 --- a/idea/src/META-INF/gradle.xml +++ b/idea/src/META-INF/gradle.xml @@ -48,7 +48,9 @@ + implementation="org.jetbrains.kotlin.idea.core.script.GradleKotlinDSLTemplateProvider"/> + +