Gradle project configurator: fix inserting of non-kotlin library version in gradle.kts files

This commit is contained in:
Natalia Selezneva
2018-08-28 11:10:49 +03:00
parent 4671fa0136
commit 2fe4f95d33
5 changed files with 28 additions and 37 deletions
@@ -50,8 +50,7 @@ interface GradleBuildScriptManipulator<out Psi: PsiFile> {
fun addKotlinLibraryToModuleBuildScript( fun addKotlinLibraryToModuleBuildScript(
scope: DependencyScope, scope: DependencyScope,
libraryDescriptor: ExternalLibraryDescriptor, libraryDescriptor: ExternalLibraryDescriptor
isAndroidModule: Boolean
) )
fun getKotlinStdlibVersion(): String? fun getKotlinStdlibVersion(): String?
@@ -48,8 +48,7 @@ interface GradleBuildScriptManipulator<out Psi: PsiFile> {
fun addKotlinLibraryToModuleBuildScript( fun addKotlinLibraryToModuleBuildScript(
scope: DependencyScope, scope: DependencyScope,
libraryDescriptor: ExternalLibraryDescriptor, libraryDescriptor: ExternalLibraryDescriptor
isAndroidModule: Boolean
) )
fun getKotlinStdlibVersion(): String? fun getKotlinStdlibVersion(): String?
@@ -21,6 +21,7 @@ import com.intellij.openapi.roots.ExternalLibraryDescriptor
import com.intellij.openapi.util.text.StringUtil import com.intellij.openapi.util.text.StringUtil
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.psi.codeStyle.CodeStyleManager import com.intellij.psi.codeStyle.CodeStyleManager
import org.jetbrains.kotlin.idea.configuration.KotlinWithGradleConfigurator.Companion.getBuildScriptSettingsPsiFile
import org.jetbrains.kotlin.idea.util.application.runReadAction import org.jetbrains.kotlin.idea.util.application.runReadAction
import org.jetbrains.kotlin.idea.util.module import org.jetbrains.kotlin.idea.util.module
import org.jetbrains.kotlin.psi.psiUtil.getChildrenOfType import org.jetbrains.kotlin.psi.psiUtil.getChildrenOfType
@@ -28,12 +29,11 @@ import org.jetbrains.plugins.groovy.lang.psi.GroovyFile
import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory
import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrStatement import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrStatement
import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrClosableBlock import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrClosableBlock
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrApplicationStatement
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrAssignmentExpression import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrAssignmentExpression
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrMethodCall import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrMethodCall
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.path.GrMethodCallExpression import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.path.GrMethodCallExpression
import org.jetbrains.plugins.groovy.lang.psi.api.util.GrStatementOwner import org.jetbrains.plugins.groovy.lang.psi.api.util.GrStatementOwner
import org.jetbrains.kotlin.idea.configuration.KotlinWithGradleConfigurator.Companion.getBuildScriptSettingsPsiFile
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrApplicationStatement
class GroovyBuildScriptManipulator( class GroovyBuildScriptManipulator(
override val scriptFile: GroovyFile, override val scriptFile: GroovyFile,
@@ -158,12 +158,11 @@ class GroovyBuildScriptManipulator(
override fun addKotlinLibraryToModuleBuildScript( override fun addKotlinLibraryToModuleBuildScript(
scope: DependencyScope, scope: DependencyScope,
libraryDescriptor: ExternalLibraryDescriptor, libraryDescriptor: ExternalLibraryDescriptor
isAndroidModule: Boolean
) { ) {
val dependencyString = String.format( val dependencyString = String.format(
"%s \"%s:%s:%s\"", "%s \"%s:%s:%s\"",
scope.toGradleCompileScope(isAndroidModule), scope.toGradleCompileScope(scriptFile.module?.getBuildSystemType() == AndroidGradle),
libraryDescriptor.libraryGroupId, libraryDescriptor.libraryGroupId,
libraryDescriptor.libraryArtifactId, libraryDescriptor.libraryArtifactId,
libraryDescriptor.maxVersion libraryDescriptor.maxVersion
@@ -116,24 +116,15 @@ class KotlinBuildScriptManipulator(
override fun addKotlinLibraryToModuleBuildScript( override fun addKotlinLibraryToModuleBuildScript(
scope: DependencyScope, scope: DependencyScope,
libraryDescriptor: ExternalLibraryDescriptor, libraryDescriptor: ExternalLibraryDescriptor
isAndroidModule: Boolean
) { ) {
val kotlinLibraryVersion = libraryDescriptor.maxVersion
.takeIf {
!useNewSyntax(if (isAndroidModule) "kotlin-android" else KotlinGradleModuleConfigurator.KOTLIN)
}
.let {
if (it == GSK_KOTLIN_VERSION_PROPERTY_NAME) "\$$it" else it
}
scriptFile.getDependenciesBlock()?.apply { scriptFile.getDependenciesBlock()?.apply {
addExpressionIfMissing( addExpressionIfMissing(
getCompileDependencySnippet( getCompileDependencySnippet(
libraryDescriptor.libraryGroupId, libraryDescriptor.libraryGroupId,
libraryDescriptor.libraryArtifactId, libraryDescriptor.libraryArtifactId,
scope.toGradleCompileScope(isAndroidModule), libraryDescriptor.maxVersion,
kotlinLibraryVersion scope.toGradleCompileScope(module?.getBuildSystemType() == AndroidGradle)
) )
) )
} }
@@ -358,9 +349,6 @@ class KotlinBuildScriptManipulator(
private fun KtBlockExpression.addPluginToClassPathIfMissing(): KtCallExpression? = private fun KtBlockExpression.addPluginToClassPathIfMissing(): KtCallExpression? =
addExpressionIfMissing(getKotlinGradlePluginClassPathSnippet()) as? KtCallExpression addExpressionIfMissing(getKotlinGradlePluginClassPathSnippet()) as? KtCallExpression
fun getKotlinGradlePluginClassPathSnippet(): String =
"classpath(${getKotlinModuleDependencySnippet("gradle-plugin", "\$$GSK_KOTLIN_VERSION_PROPERTY_NAME")})"
private fun KtBlockExpression.addBlock(name: String, first: Boolean = false): KtBlockExpression? { private fun KtBlockExpression.addBlock(name: String, first: Boolean = false): KtBlockExpression? {
return psiFactory.createExpression("$name {\n}") return psiFactory.createExpression("$name {\n}")
.let { if (first) addAfter(it, null) else add(it) } .let { if (first) addAfter(it, null) else add(it) }
@@ -444,6 +432,24 @@ class KotlinBuildScriptManipulator(
private val PsiElement.psiFactory: KtPsiFactory private val PsiElement.psiFactory: KtPsiFactory
get() = KtPsiFactory(this) get() = KtPsiFactory(this)
private fun getCompileDependencySnippet(
groupId: String,
artifactId: String,
version: String?,
compileScope: String = "compile"
): String {
if (groupId != KOTLIN_GROUP_ID) {
return "$compileScope(\"$groupId:$artifactId:$version\")"
}
if (useNewSyntax(if (scriptFile.module?.getBuildSystemType() == AndroidGradle) "kotlin-android" else KotlinGradleModuleConfigurator.KOTLIN)) {
return "$compileScope(${getKotlinModuleDependencySnippet(artifactId)})"
}
val libraryVersion = if (version == GSK_KOTLIN_VERSION_PROPERTY_NAME) "\$$version" else version
return "$compileScope(${getKotlinModuleDependencySnippet(artifactId, libraryVersion)})"
}
companion object { companion object {
private val STDLIB_ARTIFACT_PREFIX = "org.jetbrains.kotlin:kotlin-stdlib" private val STDLIB_ARTIFACT_PREFIX = "org.jetbrains.kotlin:kotlin-stdlib"
val GSK_KOTLIN_VERSION_PROPERTY_NAME = "kotlin_version" val GSK_KOTLIN_VERSION_PROPERTY_NAME = "kotlin_version"
@@ -459,16 +465,5 @@ class KotlinBuildScriptManipulator(
else -> "kotlinModule(\"$moduleName\", ${"\"$version\""})" else -> "kotlinModule(\"$moduleName\", ${"\"$version\""})"
} }
} }
fun getCompileDependencySnippet(
groupId: String,
artifactId: String,
compileScope: String = "compile",
version: String? = null
): String =
if (groupId == KOTLIN_GROUP_ID)
"$compileScope(${Companion.getKotlinModuleDependencySnippet(artifactId, version)})"
else
"$compileScope(\"$groupId:$artifactId:$version\")"
} }
} }
@@ -288,8 +288,7 @@ abstract class KotlinWithGradleConfigurator : KotlinProjectConfigurator {
return return
} }
getManipulator(buildScript) getManipulator(buildScript).addKotlinLibraryToModuleBuildScript(scope, libraryDescriptor)
.addKotlinLibraryToModuleBuildScript(scope, libraryDescriptor, module.getBuildSystemType() == AndroidGradle)
buildScript.virtualFile?.let { buildScript.virtualFile?.let {
createConfigureKotlinNotificationCollector(buildScript.project) createConfigureKotlinNotificationCollector(buildScript.project)