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