diff --git a/idea/formatter/src/org/jetbrains/kotlin/idea/formatter/KotlinStyleGuideCodeStyle.kt b/idea/formatter/src/org/jetbrains/kotlin/idea/formatter/KotlinStyleGuideCodeStyle.kt index 87f0543bcaa..de8ba640df9 100644 --- a/idea/formatter/src/org/jetbrains/kotlin/idea/formatter/KotlinStyleGuideCodeStyle.kt +++ b/idea/formatter/src/org/jetbrains/kotlin/idea/formatter/KotlinStyleGuideCodeStyle.kt @@ -17,41 +17,56 @@ package org.jetbrains.kotlin.idea.formatter import com.intellij.psi.codeStyle.CodeStyleSettings +import com.intellij.psi.codeStyle.CommonCodeStyleSettings import com.intellij.psi.codeStyle.PredefinedCodeStyle import org.jetbrains.kotlin.idea.KotlinLanguage +import org.jetbrains.kotlin.idea.core.formatter.KotlinCodeStyleSettings class KotlinStyleGuideCodeStyle : PredefinedCodeStyle("Kotlin style guide", KotlinLanguage.INSTANCE) { override fun apply(settings: CodeStyleSettings) { - settings.kotlinCustomSettings.apply { - CONTINUATION_INDENT_IN_PARAMETER_LISTS = false - CONTINUATION_INDENT_IN_ARGUMENT_LISTS = false - CONTINUATION_INDENT_FOR_EXPRESSION_BODIES = false - CONTINUATION_INDENT_FOR_CHAINED_CALLS = false - CONTINUATION_INDENT_IN_SUPERTYPE_LISTS = false - CONTINUATION_INDENT_IN_IF_CONDITIONS = false - WRAP_EXPRESSION_BODY_FUNCTIONS = CodeStyleSettings.WRAP_AS_NEEDED - IF_RPAREN_ON_NEW_LINE = true + Companion.apply(settings) + } + + companion object { + fun apply(settings: CodeStyleSettings) { + applyToKotlinCustomSettings(settings.kotlinCustomSettings) + applyToCommonSettings(settings.kotlinCommonSettings) } - settings.kotlinCommonSettings.apply { - WHILE_ON_NEW_LINE = false - ELSE_ON_NEW_LINE = false - CATCH_ON_NEW_LINE = false - FINALLY_ON_NEW_LINE = false + fun applyToKotlinCustomSettings(kotlinCustomSettings: KotlinCodeStyleSettings) { + kotlinCustomSettings.apply { + CONTINUATION_INDENT_IN_PARAMETER_LISTS = false + CONTINUATION_INDENT_IN_ARGUMENT_LISTS = false + CONTINUATION_INDENT_FOR_EXPRESSION_BODIES = false + CONTINUATION_INDENT_FOR_CHAINED_CALLS = false + CONTINUATION_INDENT_IN_SUPERTYPE_LISTS = false + CONTINUATION_INDENT_IN_IF_CONDITIONS = false + WRAP_EXPRESSION_BODY_FUNCTIONS = CodeStyleSettings.WRAP_AS_NEEDED + IF_RPAREN_ON_NEW_LINE = true + } + } - CALL_PARAMETERS_WRAP = CodeStyleSettings.WRAP_AS_NEEDED + CodeStyleSettings.WRAP_ON_EVERY_ITEM - CALL_PARAMETERS_LPAREN_ON_NEXT_LINE = true - CALL_PARAMETERS_RPAREN_ON_NEXT_LINE = true + fun applyToCommonSettings(commonSettings: CommonCodeStyleSettings) { + commonSettings.apply { + WHILE_ON_NEW_LINE = false + ELSE_ON_NEW_LINE = false + CATCH_ON_NEW_LINE = false + FINALLY_ON_NEW_LINE = false - METHOD_PARAMETERS_WRAP = CodeStyleSettings.WRAP_AS_NEEDED + CodeStyleSettings.WRAP_ON_EVERY_ITEM - METHOD_PARAMETERS_LPAREN_ON_NEXT_LINE = true - METHOD_PARAMETERS_RPAREN_ON_NEXT_LINE = true + CALL_PARAMETERS_WRAP = CodeStyleSettings.WRAP_AS_NEEDED + CodeStyleSettings.WRAP_ON_EVERY_ITEM + CALL_PARAMETERS_LPAREN_ON_NEXT_LINE = true + CALL_PARAMETERS_RPAREN_ON_NEXT_LINE = true - EXTENDS_LIST_WRAP = CodeStyleSettings.WRAP_AS_NEEDED - METHOD_CALL_CHAIN_WRAP = CodeStyleSettings.WRAP_AS_NEEDED - ASSIGNMENT_WRAP = CodeStyleSettings.WRAP_AS_NEEDED + METHOD_PARAMETERS_WRAP = CodeStyleSettings.WRAP_AS_NEEDED + CodeStyleSettings.WRAP_ON_EVERY_ITEM + METHOD_PARAMETERS_LPAREN_ON_NEXT_LINE = true + METHOD_PARAMETERS_RPAREN_ON_NEXT_LINE = true - ALIGN_MULTILINE_BINARY_OPERATION = false + EXTENDS_LIST_WRAP = CodeStyleSettings.WRAP_AS_NEEDED + METHOD_CALL_CHAIN_WRAP = CodeStyleSettings.WRAP_AS_NEEDED + ASSIGNMENT_WRAP = CodeStyleSettings.WRAP_AS_NEEDED + + ALIGN_MULTILINE_BINARY_OPERATION = false + } } } } diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index 9095dc36de1..24499046fdb 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -2689,6 +2689,8 @@ + + diff --git a/idea/src/org/jetbrains/kotlin/idea/formatter/KotlinFormatterUsageCollector.kt b/idea/src/org/jetbrains/kotlin/idea/formatter/KotlinFormatterUsageCollector.kt new file mode 100644 index 00000000000..b74801771a4 --- /dev/null +++ b/idea/src/org/jetbrains/kotlin/idea/formatter/KotlinFormatterUsageCollector.kt @@ -0,0 +1,76 @@ +/* + * Copyright 2000-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.formatter + +import com.intellij.internal.statistic.AbstractProjectsUsagesCollector +import com.intellij.internal.statistic.beans.GroupDescriptor +import com.intellij.internal.statistic.beans.UsageDescriptor +import com.intellij.internal.statistic.utils.getEnumUsage +import com.intellij.openapi.project.Project +import com.intellij.psi.codeStyle.CodeStyleSettingsManager +import org.jetbrains.kotlin.idea.core.formatter.KotlinCodeStyleSettings + +class KotlinFormatterUsageCollector : AbstractProjectsUsagesCollector() { + override fun getGroupId(): GroupDescriptor = GroupDescriptor.create(GROUP_ID) + + override fun getProjectUsages(project: Project): Set { + val usedFormatter = getKotlinFormatterKind(project) + + return setOf( + getEnumUsage("kotlin.formatter.kind", usedFormatter) + ) + } + + companion object { + private const val GROUP_ID = "kotlin.formatter" + + private val KOTLIN_DEFAULT_COMMON = KotlinLanguageCodeStyleSettingsProvider().defaultCommonSettings + .also { KotlinStyleGuideCodeStyle.applyToCommonSettings(it) } + + private val KOTLIN_DEFAULT_CUSTOM = KotlinCodeStyleSettings.DEFAULT.clone() + .also { KotlinStyleGuideCodeStyle.applyToKotlinCustomSettings(it as KotlinCodeStyleSettings) } + + fun getKotlinFormatterKind(project: Project): KotlinFormatterKind { + val isProject = CodeStyleSettingsManager.getInstance(project).USE_PER_PROJECT_SETTINGS + + val settings = CodeStyleSettingsManager.getSettings(project) + val kotlinCommonSettings = settings.kotlinCommonSettings + val kotlinCustomSettings = settings.kotlinCustomSettings + + val isDefaultKotlinCommonSettings = kotlinCommonSettings == KotlinLanguageCodeStyleSettingsProvider().defaultCommonSettings + val isDefaultKotlinCustomSettings = kotlinCustomSettings == KotlinCodeStyleSettings.DEFAULT + if (isDefaultKotlinCommonSettings && isDefaultKotlinCustomSettings) { + return if (isProject) KotlinFormatterKind.PROJECT_DEFAULT else KotlinFormatterKind.IDEA_DEFAULT + } + + val isOnlyKotlinStyle = kotlinCommonSettings == KOTLIN_DEFAULT_COMMON && kotlinCustomSettings == KOTLIN_DEFAULT_CUSTOM + if (isOnlyKotlinStyle) { + return if (isProject) KotlinFormatterKind.PROJECT_KOTLIN else KotlinFormatterKind.IDEA_KOTLIN + } + + val isKotlinLikeSettings = settings == settings.clone().also { + KotlinStyleGuideCodeStyle.apply(it) + } + if (isKotlinLikeSettings) { + return if (isProject) KotlinFormatterKind.PROJECT_KOTLIN_WITH_CUSTOM else KotlinFormatterKind.IDEA_KOTLIN_WITH_CUSTOM + } + + return if (isProject) KotlinFormatterKind.PROJECT_CUSTOM else KotlinFormatterKind.IDEA_CUSTOM + } + } + + enum class KotlinFormatterKind { + IDEA_DEFAULT, + IDEA_CUSTOM, + IDEA_KOTLIN_WITH_CUSTOM, + IDEA_KOTLIN, + + PROJECT_DEFAULT, + PROJECT_CUSTOM, + PROJECT_KOTLIN_WITH_CUSTOM, + PROJECT_KOTLIN; + } +} \ No newline at end of file