diff --git a/platform/platform-impl/src/com/intellij/ide/actions/OpenFileAction.kt b/platform/platform-impl/src/com/intellij/ide/actions/OpenFileAction.kt index 20847219ac98..3145be054803 100644 --- a/platform/platform-impl/src/com/intellij/ide/actions/OpenFileAction.kt +++ b/platform/platform-impl/src/com/intellij/ide/actions/OpenFileAction.kt @@ -167,7 +167,7 @@ open class OpenFileAction : AnAction(), DumbAware, LightEditCompatible, ActionRe val file = virtualFile.toNioPath() if (Files.isDirectory(file)) { val fromWelcomeScreenProject = project != null && - WelcomeScreenProjectProvider.EP_NAME.lazySequence().singleOrNull { it.isWelcomeScreenProject(project) } != null + WelcomeScreenProjectProvider.isSingleWelcomeScreenProject(project) @Suppress("TestOnlyProblems") val openedProject = ProjectUtil.openExistingDir(file, project, forceReuseFrame = fromWelcomeScreenProject) if (openedProject != null && Registry.`is`("ide.create.project.root.entity")) { diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/ex/WelcomeScreenProjectProvider.kt b/platform/platform-impl/src/com/intellij/openapi/wm/ex/WelcomeScreenProjectProvider.kt index 052c1507f731..3ed4af69fcba 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/ex/WelcomeScreenProjectProvider.kt +++ b/platform/platform-impl/src/com/intellij/openapi/wm/ex/WelcomeScreenProjectProvider.kt @@ -1,6 +1,7 @@ // Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.openapi.wm.ex +import com.intellij.openapi.diagnostic.thisLogger import com.intellij.openapi.extensions.ExtensionPointName import com.intellij.openapi.project.Project import org.jetbrains.annotations.ApiStatus @@ -11,12 +12,25 @@ import org.jetbrains.annotations.ApiStatus * * E.g., if a project is created/opened/cloned from a welcome screen project, * we should close the welcome screen project to preserve the welcome screen experience. + * + * This customization is intended to be used per-IDE, not per language. */ @ApiStatus.Internal -interface WelcomeScreenProjectProvider { +abstract class WelcomeScreenProjectProvider { companion object { - val EP_NAME: ExtensionPointName = ExtensionPointName("com.intellij.welcomeScreenProjectProvider") + private val EP_NAME: ExtensionPointName = ExtensionPointName("com.intellij.welcomeScreenProjectProvider") + + @JvmStatic + fun isSingleWelcomeScreenProject(project: Project): Boolean { + val providers = EP_NAME.extensionList + if (providers.isEmpty()) return false + if (providers.size > 1) { + thisLogger().warn("Multiple WelcomeScreenProjectProvider extensions") + return false + } + return providers.first().isWelcomeScreenProject(project) + } } - fun isWelcomeScreenProject(project: Project): Boolean + protected abstract fun isWelcomeScreenProject(project: Project): Boolean } diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/checkout/ProjectDirCheckoutListener.kt b/platform/vcs-impl/src/com/intellij/openapi/vcs/checkout/ProjectDirCheckoutListener.kt index da7fc50da12f..711beace24b4 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/checkout/ProjectDirCheckoutListener.kt +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/checkout/ProjectDirCheckoutListener.kt @@ -50,5 +50,5 @@ private class PlatformProjectCheckoutListener : CheckoutListener { } private fun willOpenFromWelcomeScreenProject(project: Project): Boolean { - return WelcomeScreenProjectProvider.EP_NAME.lazySequence().singleOrNull { it.isWelcomeScreenProject(project) } != null + return WelcomeScreenProjectProvider.isSingleWelcomeScreenProject(project) }