Wizard: format templates code

This commit is contained in:
Ilya Kirillov
2019-12-17 16:15:33 +03:00
parent b29e6d0c69
commit af174b4f74
6 changed files with 52 additions and 8 deletions
@@ -0,0 +1,25 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* 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.tools.projectWizard.wizard.service
import com.intellij.openapi.project.Project
import com.intellij.psi.codeStyle.CodeStyleManager
import org.jetbrains.kotlin.idea.util.application.runReadAction
import org.jetbrains.kotlin.psi.KtPsiFactory
import org.jetbrains.kotlin.tools.projectWizard.core.service.FileFormattingService
import java.io.File
class IdeaFileFormattingService(private val project: Project) : FileFormattingService, IdeaWizardService {
override fun formatFile(text: String, filename: String): String = runReadAction {
val psiFile = createPsiFile(text, filename) ?: return@runReadAction text
CodeStyleManager.getInstance(project).reformat(psiFile).text
}
private fun createPsiFile(text: String, filename: String) = when (File(filename.removeSuffix(".vm")).extension) {
"kt" -> KtPsiFactory(project).createFile(text)
else -> null
}
}
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.tools.projectWizard.wizard.service
import com.intellij.openapi.module.ModifiableModuleModel
import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.tools.projectWizard.core.service.FileFormattingService
import org.jetbrains.kotlin.tools.projectWizard.core.service.WizardService
interface IdeaWizardService : WizardService
@@ -20,7 +21,8 @@ object IdeaServices {
fun createScopeDependent(project: Project, model: ModifiableModuleModel) = listOf(
IdeaGradleWizardService(project),
IdeaMavenWizardService(project),
IdeaJpsWizardService(project, model)
IdeaJpsWizardService(project, model),
IdeaFileFormattingService(project)
)
}
@@ -0,0 +1,14 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* 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.tools.projectWizard.core.service
interface FileFormattingService : WizardService {
fun formatFile(text: String, filename: String): String
}
class DummyFileFormattingService : FileFormattingService, IdeaIndependentWizardService {
override fun formatFile(text: String, filename: String): String = text
}
@@ -9,7 +9,8 @@ object Services {
ProjectImportingWizardServiceImpl(),
OsFileSystemWizardService(),
AndroidWizardServiceImpl(),
BuildSystemAvailabilityWizardServiceImpl()
BuildSystemAvailabilityWizardServiceImpl(),
DummyFileFormattingService()
)
}
@@ -1,7 +1,6 @@
package org.jetbrains.kotlin.tools.projectWizard.plugins.templates
import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.service.FileSystemWizardService
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.*
import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemPlugin
@@ -130,10 +129,9 @@ class TemplatesPlugin(context: Context) : Plugin(context) {
val template = sourceset.template ?: return UNIT_SUCCESS
val settings = with(template) { settingsAsMap(sourceset.original) }
val allSettings = settings + interceptionPointSettings.mapKeys { it.key.name }
return with(template) { getFileTemplates(sourceset) }.map { fileTemplate ->
val fileText = templateEngine.renderTemplate(fileTemplate, allSettings)
val path = sourceset.path / fileTemplate.relativePath
service<FileSystemWizardService>()!!.createFile(path, fileText)
return with(template) { getFileTemplates(sourceset) }.map { fileTemplateDescriptor ->
val fileTemplate = FileTemplate(fileTemplateDescriptor, sourceset.path, allSettings)
with(templateEngine) { writeTemplate(fileTemplate) }
}.sequenceIgnore()
}
}
@@ -8,6 +8,7 @@ import org.apache.velocity.runtime.log.LogChute
import org.jetbrains.kotlin.tools.projectWizard.core.TaskResult
import org.jetbrains.kotlin.tools.projectWizard.core.TaskRunningContext
import org.jetbrains.kotlin.tools.projectWizard.core.div
import org.jetbrains.kotlin.tools.projectWizard.core.service.FileFormattingService
import org.jetbrains.kotlin.tools.projectWizard.core.service.FileSystemWizardService
import java.io.StringWriter
@@ -16,7 +17,10 @@ interface TemplateEngine {
fun renderTemplate(template: FileTemplateDescriptor, data: Map<String, Any?>): String
fun TaskRunningContext.writeTemplate(template: FileTemplate): TaskResult<Unit> {
val text = renderTemplate(template.descriptor, template.data)
val formatter = service<FileFormattingService>()!!
val text = renderTemplate(template.descriptor, template.data).let { text ->
formatter.formatFile(text, template.descriptor.relativePath.fileName.toString())
}
return service<FileSystemWizardService>()!!.createFile(template.rootPath / template.descriptor.relativePath, text)
}
}