GO-18841 GO-18842 Ensure presence of the one and only extension at the API level

GitOrigin-RevId: ef7da01af201c1338b992425eb75e658dcdb7baa
This commit is contained in:
Nikita Mironov
2025-06-26 18:48:50 +00:00
committed by intellij-monorepo-bot
parent 1bb53c25f2
commit 8fe7b7ff7e
3 changed files with 19 additions and 5 deletions
@@ -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")) {
@@ -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<WelcomeScreenProjectProvider> = ExtensionPointName("com.intellij.welcomeScreenProjectProvider")
private val EP_NAME: ExtensionPointName<WelcomeScreenProjectProvider> = 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
}
@@ -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)
}