diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/NewProjectWizardModuleBuilder.kt b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/NewProjectWizardModuleBuilder.kt index 0d5fb889ac6..1901c5ab4cc 100644 --- a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/NewProjectWizardModuleBuilder.kt +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/NewProjectWizardModuleBuilder.kt @@ -49,6 +49,7 @@ class NewProjectWizardModuleBuilder : EmptyModuleBuilder() { companion object { const val MODULE_BUILDER_ID = "kotlin.newProjectWizard.builder" + private const val DEFAULT_GROUP_ID = "me.user" } override fun isAvailable(): Boolean = NewProjectWizardService.isEnabled @@ -118,7 +119,14 @@ class NewProjectWizardModuleBuilder : EmptyModuleBuilder() { settingsStep.safeAs()?.bindModuleSettings() wizard.artifactId = suggestedProjectName - wizard.groupId = SystemProperties.getUserName()?.let { "me.$it" } ?: suggestedProjectName + wizard.groupId = suggestGroupId() + } + + private fun suggestGroupId(): String { + val username = SystemProperties.getUserName() ?: return DEFAULT_GROUP_ID + if (!username.matches("[\\w\\s]+".toRegex())) return DEFAULT_GROUP_ID + val usernameAsGroupId = username.trim().toLowerCase().split("\\s+".toRegex()).joinToString(separator = ".") + return "me.$usernameAsGroupId" } override fun getCustomOptionsStep(context: WizardContext?, parentDisposable: Disposable?) =