Configuration: Use 'plugins' block in generated/modified Gradle scripts

Follow-up for 172/173/AS3.1/AS3.2 bunches
This commit is contained in:
Alexey Sedunov
2018-05-24 00:27:43 +03:00
parent efc369dbe4
commit 44e7070118
6 changed files with 320 additions and 43 deletions
@@ -0,0 +1,70 @@
/*
* Copyright 2010-2017 JetBrains s.r.o.
*
* 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.jetbrains.kotlin.idea.configuration
import com.intellij.openapi.roots.DependencyScope
import com.intellij.openapi.roots.ExternalLibraryDescriptor
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFile
import org.gradle.util.GradleVersion
import org.jetbrains.plugins.gradle.frameworkSupport.BuildScriptDataBuilder
interface GradleBuildScriptManipulator<out Psi: PsiFile> {
val scriptFile: Psi
val preferNewSyntax: Boolean
fun isConfiguredWithOldSyntax(kotlinPluginName: String): Boolean
fun isConfigured(kotlinPluginExpression: String): Boolean
fun configureModuleBuildScript(
kotlinPluginName: String,
kotlinPluginExpression: String,
stdlibArtifactName: String,
version: String,
jvmTarget: String?
): Boolean
fun configureProjectBuildScript(kotlinPluginName: String, version: String): Boolean
fun changeCoroutineConfiguration(coroutineOption: String): PsiElement?
fun changeLanguageVersion(version: String, forTests: Boolean): PsiElement?
fun changeApiVersion(version: String, forTests: Boolean): PsiElement?
fun addKotlinLibraryToModuleBuildScript(
scope: DependencyScope,
libraryDescriptor: ExternalLibraryDescriptor,
isAndroidModule: Boolean
)
fun getKotlinStdlibVersion(): String?
// For settings.gradle/settings.gradle.kts
fun addMavenCentralPluginRepository()
fun addPluginRepository(repository: RepositoryDescription)
fun addResolutionStrategy(pluginId: String)
}
val MIN_GRADLE_VERSION_FOR_NEW_PLUGIN_SYNTAX = GradleVersion.version("4.4")
// Kept for compatibility reasons (pre-181.3 IDEAs)
fun GradleBuildScriptManipulator<*>.useNewSyntax(kotlinPluginName: String) = false
val BuildScriptDataBuilder.gradleVersion get() = GradleVersion.version("0.0")
fun BuildScriptDataBuilder.addPluginDefinitionInPluginsGroup(pluginId: String) {}
@@ -0,0 +1,69 @@
/*
* Copyright 2010-2017 JetBrains s.r.o.
*
* 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.jetbrains.kotlin.idea.configuration
import com.intellij.openapi.roots.DependencyScope
import com.intellij.openapi.roots.ExternalLibraryDescriptor
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFile
import org.gradle.util.GradleVersion
import org.jetbrains.plugins.gradle.frameworkSupport.BuildScriptDataBuilder
interface GradleBuildScriptManipulator<out Psi: PsiFile> {
val scriptFile: Psi
val preferNewSyntax: Boolean
fun isConfiguredWithOldSyntax(kotlinPluginName: String): Boolean
fun isConfigured(kotlinPluginExpression: String): Boolean
fun configureModuleBuildScript(
kotlinPluginName: String,
kotlinPluginExpression: String,
stdlibArtifactName: String,
version: String,
jvmTarget: String?
): Boolean
fun configureProjectBuildScript(kotlinPluginName: String, version: String): Boolean
fun changeCoroutineConfiguration(coroutineOption: String): PsiElement?
fun changeLanguageVersion(version: String, forTests: Boolean): PsiElement?
fun changeApiVersion(version: String, forTests: Boolean): PsiElement?
fun addKotlinLibraryToModuleBuildScript(
scope: DependencyScope,
libraryDescriptor: ExternalLibraryDescriptor,
isAndroidModule: Boolean
)
fun getKotlinStdlibVersion(): String?
// For settings.gradle/settings.gradle.kts
fun addMavenCentralPluginRepository()
fun addPluginRepository(repository: RepositoryDescription)
fun addResolutionStrategy(pluginId: String)
}
val MIN_GRADLE_VERSION_FOR_NEW_PLUGIN_SYNTAX = GradleVersion.version("4.4")
// Kept for compatibility reasons (pre-181.3 IDEAs)
fun GradleBuildScriptManipulator<*>.useNewSyntax(kotlinPluginName: String) = false
val BuildScriptDataBuilder.gradleVersion get() = GradleVersion.version("0.0")
@@ -65,7 +65,7 @@ class KotlinGradleMultiplatformModuleBuilder : GradleModuleBuilder() {
val module = modifiableRootModel.module
val buildScriptData = getBuildScriptData(module) ?: return
val sdk = modifiableRootModel.sdk
GradleKotlinMPPCommonFrameworkSupportProvider().addSupport(buildScriptData, sdk)
GradleKotlinMPPCommonFrameworkSupportProvider().addSupport(buildScriptData, module, sdk, true)
}
}
@@ -110,7 +110,7 @@ class KotlinGradleMultiplatformModuleBuilder : GradleModuleBuilder() {
rootModule: Module,
contentRoot: VirtualFile
) = setupChildModule(rootModule, contentRoot, commonModuleName) { builder, sdk ->
GradleKotlinMPPCommonFrameworkSupportProvider().addSupport(builder, sdk)
GradleKotlinMPPCommonFrameworkSupportProvider().addSupport(builder, rootModule, sdk, true)
}
private fun setupPlatformModule(
@@ -120,7 +120,7 @@ class KotlinGradleMultiplatformModuleBuilder : GradleModuleBuilder() {
supportProvider: GradleKotlinFrameworkSupportProvider,
sdk: Sdk? = null
) = setupChildModule(rootModule, contentRoot, platformModuleName, sdk) { builder, finalSdk ->
supportProvider.addSupport(builder, finalSdk)
supportProvider.addSupport(builder, rootModule, finalSdk, true)
val dependency = commonModuleName ?: ""
builder.addDependencyNotation("expectedBy project(\":$dependency\")")
}
@@ -24,6 +24,7 @@ import com.intellij.openapi.vfs.WritingAccessProvider
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFile
import com.intellij.psi.PsiManager
import com.intellij.util.PathUtil
import org.jetbrains.kotlin.config.ApiVersion
import org.jetbrains.kotlin.config.CoroutineSupport
import org.jetbrains.kotlin.config.LanguageFeature
@@ -82,7 +83,11 @@ abstract class KotlinWithGradleConfigurator : KotlinProjectConfigurator {
protected open fun getMinimumSupportedVersion() = "1.0.0"
private fun isFileConfigured(buildScript: PsiFile): Boolean = getManipulator(buildScript).isConfigured(kotlinPluginName)
protected fun PsiFile.isKtDsl() = this is KtFile
private fun isFileConfigured(buildScript: PsiFile): Boolean = with(getManipulator(buildScript)) {
isConfiguredWithOldSyntax(kotlinPluginName) || isConfigured(getKotlinPluginExpression(buildScript.isKtDsl()))
}
@JvmSuppressWildcards
override fun configure(project: Project, excludeModules: Collection<Module>) {
@@ -152,6 +157,7 @@ abstract class KotlinWithGradleConfigurator : KotlinProjectConfigurator {
val jvmTarget = getJvmTarget(sdk, version)
return getManipulator(file).configureModuleBuildScript(
kotlinPluginName,
getKotlinPluginExpression(file.isKtDsl()),
getStdlibArtifactName(sdk, version),
version,
jvmTarget
@@ -163,6 +169,7 @@ abstract class KotlinWithGradleConfigurator : KotlinProjectConfigurator {
protected open fun getJvmTarget(sdk: Sdk?, version: String): String? = null
protected abstract val kotlinPluginName: String
protected abstract fun getKotlinPluginExpression(forKotlinDsl: Boolean): String
protected open fun addElementsToFile(
file: PsiFile,
@@ -170,7 +177,7 @@ abstract class KotlinWithGradleConfigurator : KotlinProjectConfigurator {
version: String
): Boolean {
if (!isTopLevelProjectFile) {
var wasModified = configureProjectFile(file, version)
var wasModified = getManipulator(file).configureProjectBuildScript(kotlinPluginName, version)
wasModified = wasModified or configureModuleBuildScript(file, version)
return wasModified
}
@@ -256,21 +263,20 @@ abstract class KotlinWithGradleConfigurator : KotlinProjectConfigurator {
}
companion object {
fun getManipulator(file: PsiFile): GradleBuildScriptManipulator = when (file) {
is KtFile -> KotlinBuildScriptManipulator(file)
is GroovyFile -> GroovyBuildScriptManipulator(file)
fun getManipulator(file: PsiFile, preferNewSyntax: Boolean = true): GradleBuildScriptManipulator<*> = when (file) {
is KtFile -> KotlinBuildScriptManipulator(file, preferNewSyntax)
is GroovyFile -> GroovyBuildScriptManipulator(file, preferNewSyntax)
else -> error("Unknown build script file type!")
}
val GROUP_ID = "org.jetbrains.kotlin"
val GRADLE_PLUGIN_ID = "kotlin-gradle-plugin"
val CLASSPATH = "classpath \"$GROUP_ID:$GRADLE_PLUGIN_ID:\$kotlin_version\""
private val KOTLIN_BUILD_SCRIPT_NAME = "build.gradle.kts"
private val KOTLIN_SETTINGS_SCRIPT_NAME = "settings.gradle.kts"
fun getGroovyDependencySnippet(artifactName: String, scope: String) =
"$scope \"org.jetbrains.kotlin:$artifactName:\$kotlin_version\""
fun getGroovyDependencySnippet(artifactName: String, scope: String, withVersion: Boolean) =
"$scope \"org.jetbrains.kotlin:$artifactName${if (withVersion) ":\$kotlin_version" else ""}\""
fun getGroovyApplyPluginDirective(pluginName: String) = "apply plugin: '$pluginName'"
@@ -325,28 +331,37 @@ abstract class KotlinWithGradleConfigurator : KotlinProjectConfigurator {
}
}
fun configureProjectFile(file: PsiFile, version: String): Boolean = getManipulator(file).configureProjectBuildScript(version)
private fun canConfigureFile(file: PsiFile): Boolean = WritingAccessProvider.isPotentiallyWritable(file.virtualFile, null)
private fun Module.getBuildScriptPsiFile() = getBuildScriptFile()?.getPsiFile(project)
private fun Module.getBuildScriptPsiFile() =
getBuildScriptFile(GradleConstants.DEFAULT_SCRIPT_NAME, KOTLIN_BUILD_SCRIPT_NAME)?.getPsiFile(project)
private fun Project.getTopLevelBuildScriptPsiFile() = basePath?.let { findBuildGradleFile(it)?.getPsiFile(this) }
fun Module.getBuildScriptSettingsPsiFile() =
getBuildScriptSettingsFile(GradleConstants.SETTINGS_FILE_NAME, KOTLIN_SETTINGS_SCRIPT_NAME)?.getPsiFile(project)
private fun Module.getBuildScriptFile(): File? {
private fun Project.getTopLevelBuildScriptPsiFile() = basePath?.let {
findBuildGradleFile(it, GradleConstants.DEFAULT_SCRIPT_NAME, KOTLIN_BUILD_SCRIPT_NAME)?.getPsiFile(this)
}
fun Module.getTopLevelBuildScriptSettingsPsiFile() =
ExternalSystemApiUtil.getExternalRootProjectPath(this)?.let { externalProjectPath ->
findBuildGradleFile(externalProjectPath, GradleConstants.SETTINGS_FILE_NAME, KOTLIN_SETTINGS_SCRIPT_NAME)?.getPsiFile(project)
}
private fun Module.getBuildScriptFile(vararg fileNames: String): File? {
val moduleDir = File(moduleFilePath).parent
findBuildGradleFile(moduleDir)?.let {
findBuildGradleFile(moduleDir, *fileNames)?.let {
return it
}
ModuleRootManager.getInstance(this).contentRoots.forEach { root ->
findBuildGradleFile(root.path)?.let {
findBuildGradleFile(root.path, *fileNames)?.let {
return it
}
}
ExternalSystemApiUtil.getExternalProjectPath(this)?.let { externalProjectPath ->
findBuildGradleFile(externalProjectPath)?.let {
findBuildGradleFile(externalProjectPath, *fileNames)?.let {
return it
}
}
@@ -354,9 +369,20 @@ abstract class KotlinWithGradleConfigurator : KotlinProjectConfigurator {
return null
}
private fun findBuildGradleFile(path: String): File? =
File(path + "/" + GradleConstants.DEFAULT_SCRIPT_NAME).takeIf { it.exists() }
?: File(path + "/" + KOTLIN_BUILD_SCRIPT_NAME).takeIf { it.exists() }
private fun Module.getBuildScriptSettingsFile(vararg fileNames: String): File? {
ExternalSystemApiUtil.getExternalProjectPath(this)?.let { externalProjectPath ->
return generateSequence(externalProjectPath) {
PathUtil.getParentPath(it).let { if (it.isBlank()) null else it }
}.mapNotNull {
findBuildGradleFile(it, *fileNames)
}.firstOrNull()
}
return null
}
private fun findBuildGradleFile(path: String, vararg fileNames: String): File? =
fileNames.asSequence().map { File(path + "/" + it) }.firstOrNull { it.exists() }
private fun File.getPsiFile(project: Project) = VfsUtil.findFileByIoFile(this, true)?.let {
PsiManager.getInstance(project).findFile(it)
@@ -24,6 +24,7 @@ import com.intellij.openapi.vfs.WritingAccessProvider
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFile
import com.intellij.psi.PsiManager
import com.intellij.util.PathUtil
import org.jetbrains.kotlin.config.ApiVersion
import org.jetbrains.kotlin.config.CoroutineSupport
import org.jetbrains.kotlin.config.LanguageFeature
@@ -82,7 +83,11 @@ abstract class KotlinWithGradleConfigurator : KotlinProjectConfigurator {
protected open fun getMinimumSupportedVersion() = "1.0.0"
private fun isFileConfigured(buildScript: PsiFile): Boolean = getManipulator(buildScript).isConfigured(kotlinPluginName)
protected fun PsiFile.isKtDsl() = this is KtFile
private fun isFileConfigured(buildScript: PsiFile): Boolean = with(getManipulator(buildScript)) {
isConfiguredWithOldSyntax(kotlinPluginName) || isConfigured(getKotlinPluginExpression(buildScript.isKtDsl()))
}
@JvmSuppressWildcards
override fun configure(project: Project, excludeModules: Collection<Module>) {
@@ -152,6 +157,7 @@ abstract class KotlinWithGradleConfigurator : KotlinProjectConfigurator {
val jvmTarget = getJvmTarget(sdk, version)
return getManipulator(file).configureModuleBuildScript(
kotlinPluginName,
getKotlinPluginExpression(file.isKtDsl()),
getStdlibArtifactName(sdk, version),
version,
jvmTarget
@@ -163,6 +169,7 @@ abstract class KotlinWithGradleConfigurator : KotlinProjectConfigurator {
protected open fun getJvmTarget(sdk: Sdk?, version: String): String? = null
protected abstract val kotlinPluginName: String
protected abstract fun getKotlinPluginExpression(forKotlinDsl: Boolean): String
protected open fun addElementsToFile(
file: PsiFile,
@@ -170,7 +177,7 @@ abstract class KotlinWithGradleConfigurator : KotlinProjectConfigurator {
version: String
): Boolean {
if (!isTopLevelProjectFile) {
var wasModified = configureProjectFile(file, version)
var wasModified = getManipulator(file).configureProjectBuildScript(kotlinPluginName, version)
wasModified = wasModified or configureModuleBuildScript(file, version)
return wasModified
}
@@ -256,21 +263,20 @@ abstract class KotlinWithGradleConfigurator : KotlinProjectConfigurator {
}
companion object {
fun getManipulator(file: PsiFile): GradleBuildScriptManipulator = when (file) {
is KtFile -> KotlinBuildScriptManipulator(file)
is GroovyFile -> GroovyBuildScriptManipulator(file)
fun getManipulator(file: PsiFile, preferNewSyntax: Boolean = true): GradleBuildScriptManipulator<*> = when (file) {
is KtFile -> KotlinBuildScriptManipulator(file, preferNewSyntax)
is GroovyFile -> GroovyBuildScriptManipulator(file, preferNewSyntax)
else -> error("Unknown build script file type!")
}
val GROUP_ID = "org.jetbrains.kotlin"
val GRADLE_PLUGIN_ID = "kotlin-gradle-plugin"
val CLASSPATH = "classpath \"$GROUP_ID:$GRADLE_PLUGIN_ID:\$kotlin_version\""
private val KOTLIN_BUILD_SCRIPT_NAME = "build.gradle.kts"
private val KOTLIN_SETTINGS_SCRIPT_NAME = "settings.gradle.kts"
fun getGroovyDependencySnippet(artifactName: String, scope: String) =
"$scope \"org.jetbrains.kotlin:$artifactName:\$kotlin_version\""
fun getGroovyDependencySnippet(artifactName: String, scope: String, withVersion: Boolean) =
"$scope \"org.jetbrains.kotlin:$artifactName${if (withVersion) ":\$kotlin_version" else ""}\""
fun getGroovyApplyPluginDirective(pluginName: String) = "apply plugin: '$pluginName'"
@@ -325,28 +331,37 @@ abstract class KotlinWithGradleConfigurator : KotlinProjectConfigurator {
}
}
fun configureProjectFile(file: PsiFile, version: String): Boolean = getManipulator(file).configureProjectBuildScript(version)
private fun canConfigureFile(file: PsiFile): Boolean = WritingAccessProvider.isPotentiallyWritable(file.virtualFile, null)
private fun Module.getBuildScriptPsiFile() = getBuildScriptFile()?.getPsiFile(project)
private fun Module.getBuildScriptPsiFile() =
getBuildScriptFile(GradleConstants.DEFAULT_SCRIPT_NAME, KOTLIN_BUILD_SCRIPT_NAME)?.getPsiFile(project)
private fun Project.getTopLevelBuildScriptPsiFile() = basePath?.let { findBuildGradleFile(it)?.getPsiFile(this) }
fun Module.getBuildScriptSettingsPsiFile() =
getBuildScriptSettingsFile(GradleConstants.SETTINGS_FILE_NAME, KOTLIN_SETTINGS_SCRIPT_NAME)?.getPsiFile(project)
private fun Module.getBuildScriptFile(): File? {
private fun Project.getTopLevelBuildScriptPsiFile() = basePath?.let {
findBuildGradleFile(it, GradleConstants.DEFAULT_SCRIPT_NAME, KOTLIN_BUILD_SCRIPT_NAME)?.getPsiFile(this)
}
fun Module.getTopLevelBuildScriptSettingsPsiFile() =
ExternalSystemApiUtil.getExternalRootProjectPath(this)?.let { externalProjectPath ->
findBuildGradleFile(externalProjectPath, GradleConstants.SETTINGS_FILE_NAME, KOTLIN_SETTINGS_SCRIPT_NAME)?.getPsiFile(project)
}
private fun Module.getBuildScriptFile(vararg fileNames: String): File? {
val moduleDir = File(moduleFilePath).parent
findBuildGradleFile(moduleDir)?.let {
findBuildGradleFile(moduleDir, *fileNames)?.let {
return it
}
ModuleRootManager.getInstance(this).contentRoots.forEach { root ->
findBuildGradleFile(root.path)?.let {
findBuildGradleFile(root.path, *fileNames)?.let {
return it
}
}
ExternalSystemApiUtil.getExternalProjectPath(this)?.let { externalProjectPath ->
findBuildGradleFile(externalProjectPath)?.let {
findBuildGradleFile(externalProjectPath, *fileNames)?.let {
return it
}
}
@@ -354,9 +369,20 @@ abstract class KotlinWithGradleConfigurator : KotlinProjectConfigurator {
return null
}
private fun findBuildGradleFile(path: String): File? =
File(path + "/" + GradleConstants.DEFAULT_SCRIPT_NAME).takeIf { it.exists() }
?: File(path + "/" + KOTLIN_BUILD_SCRIPT_NAME).takeIf { it.exists() }
private fun Module.getBuildScriptSettingsFile(vararg fileNames: String): File? {
ExternalSystemApiUtil.getExternalProjectPath(this)?.let { externalProjectPath ->
return generateSequence(externalProjectPath) {
PathUtil.getParentPath(it).let { if (it.isBlank()) null else it }
}.mapNotNull {
findBuildGradleFile(it, *fileNames)
}.firstOrNull()
}
return null
}
private fun findBuildGradleFile(path: String, vararg fileNames: String): File? =
fileNames.asSequence().map { File(path + "/" + it) }.firstOrNull { it.exists() }
private fun File.getPsiFile(project: Project) = VfsUtil.findFileByIoFile(this, true)?.let {
PsiManager.getInstance(project).findFile(it)
@@ -0,0 +1,86 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.idea.configuration
import com.intellij.framework.addSupport.FrameworkSupportInModuleConfigurable
import com.intellij.ide.util.frameworkSupport.FrameworkSupportModel
import com.intellij.openapi.module.Module
import com.intellij.openapi.roots.ModifiableModelsProvider
import com.intellij.openapi.roots.ModifiableRootModel
import com.intellij.openapi.util.Key
import com.intellij.openapi.vfs.LocalFileSystem
import com.intellij.openapi.vfs.VfsUtil
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.PsiFile
import com.intellij.psi.codeStyle.CodeStyleManager
import org.jetbrains.kotlin.idea.core.copied
import org.jetbrains.kotlin.idea.refactoring.toPsiFile
import org.jetbrains.kotlin.psi.UserDataProperty
import org.jetbrains.plugins.gradle.frameworkSupport.GradleFrameworkSupportProvider
import org.jetbrains.plugins.gradle.service.project.wizard.GradleModuleBuilder
import org.jetbrains.plugins.gradle.util.GradleConstants
import java.io.File
internal var Module.gradleModuleBuilder: GradleModuleBuilder? by UserDataProperty(Key.create("GRADLE_MODULE_BUILDER"))
private var Module.editableSettingsPsiFileCopy: PsiFile? by UserDataProperty(Key.create("EDITABLE_SETTINGS_PSI_FILE_COPY"))
internal fun findSettingsGradleFile(module: Module): VirtualFile? {
val contentEntryPath = module.gradleModuleBuilder?.contentEntryPath ?: return null
if (contentEntryPath.isEmpty()) return null
val contentRootDir = File(contentEntryPath)
val modelContentRootDir = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(contentRootDir) ?: return null
return modelContentRootDir.findChild(GradleConstants.SETTINGS_FILE_NAME)
?: module.project.baseDir.findChild(GradleConstants.SETTINGS_FILE_NAME)
}
// Circumvent write actions and modify the file directly
// TODO: Get rid of this hack when IDEA API allows manipulation of settings script similarly to the main script itself
internal fun updateSettingsScript(module: Module, updater: (PsiFile) -> Unit) {
val storedCopy = module.editableSettingsPsiFileCopy
val settingsPsiCopy = storedCopy ?: findSettingsGradleFile(module)?.toPsiFile(module.project)?.copied() ?: return
if (storedCopy == null) {
module.editableSettingsPsiFileCopy = settingsPsiCopy
}
updater(settingsPsiCopy)
}
internal fun flushSettingsGradleCopy(module: Module) {
try {
val settingsFile = findSettingsGradleFile(module)
val settingsPsiCopy = module.editableSettingsPsiFileCopy
if (settingsPsiCopy != null && settingsFile != null) {
CodeStyleManager.getInstance(module.project).reformat(settingsPsiCopy)
VfsUtil.saveText(settingsFile, settingsPsiCopy.text)
}
} finally {
module.gradleModuleBuilder = null
module.editableSettingsPsiFileCopy = null
}
}
class KotlinGradleFrameworkSupportInModuleConfigurable(
private val model: FrameworkSupportModel,
private val supportProvider: GradleFrameworkSupportProvider
) : FrameworkSupportInModuleConfigurable() {
override fun createComponent() = null
override fun addSupport(
module: Module,
rootModel: ModifiableRootModel,
modifiableModelsProvider: ModifiableModelsProvider
) {
val buildScriptData = GradleModuleBuilder.getBuildScriptData(module)
if (buildScriptData != null) {
val builder = model.moduleBuilder
try {
module.gradleModuleBuilder = builder as? GradleModuleBuilder
supportProvider.addSupport(module, rootModel, modifiableModelsProvider, buildScriptData)
} finally {
flushSettingsGradleCopy(module)
}
}
}
}