diff --git a/community-resources/resources/META-INF/IdeaPlugin.xml b/community-resources/resources/META-INF/IdeaPlugin.xml index 8047403b359a..b64863d23730 100644 --- a/community-resources/resources/META-INF/IdeaPlugin.xml +++ b/community-resources/resources/META-INF/IdeaPlugin.xml @@ -18,6 +18,7 @@ + diff --git a/platform/build-scripts/src/org/jetbrains/intellij/build/BaseIdeaProperties.kt b/platform/build-scripts/src/org/jetbrains/intellij/build/BaseIdeaProperties.kt index 92f877afde4b..aff2e8c96c6d 100644 --- a/platform/build-scripts/src/org/jetbrains/intellij/build/BaseIdeaProperties.kt +++ b/platform/build-scripts/src/org/jetbrains/intellij/build/BaseIdeaProperties.kt @@ -176,16 +176,6 @@ abstract class BaseIdeaProperties : JetBrainsProductProperties() { productLayout.compatiblePluginsToIgnore = persistentListOf( JavaPluginLayout.MAIN_MODULE_NAME, ) - additionalModulesToCompile = persistentListOf("intellij.tools.jps.build.standalone") modulesToCompileTests = persistentListOf("intellij.platform.jps.build.tests") } - - /** - * 🌲 - * see KTIJ-30761 - * @see org.jetbrains.intellij.build.sharedIndexes.PreSharedIndexesGenerator - */ - protected fun enableKotlinPluginK2ByDefault() { - additionalVmOptions += "-Didea.kotlin.plugin.use.k2=true" - } } diff --git a/platform/build-scripts/src/org/jetbrains/intellij/build/JetBrainsProductProperties.kt b/platform/build-scripts/src/org/jetbrains/intellij/build/JetBrainsProductProperties.kt index 578dfc3fa9a2..32285502d1bd 100644 --- a/platform/build-scripts/src/org/jetbrains/intellij/build/JetBrainsProductProperties.kt +++ b/platform/build-scripts/src/org/jetbrains/intellij/build/JetBrainsProductProperties.kt @@ -7,6 +7,7 @@ import com.jetbrains.plugin.structure.base.plugin.PluginCreationSuccess import com.jetbrains.plugin.structure.base.problems.InvalidDescriptorProblem import com.jetbrains.plugin.structure.base.problems.PluginProblem import com.jetbrains.plugin.structure.intellij.plugin.IdePlugin +import kotlinx.collections.immutable.plus import org.jetbrains.intellij.build.SoftwareBillOfMaterials.Companion.Suppliers import org.jetbrains.intellij.build.impl.PlatformJarNames.PLATFORM_CORE_NIO_FS import org.jetbrains.jps.model.module.JpsModule @@ -39,31 +40,38 @@ abstract class JetBrainsProductProperties : ProductProperties() { override suspend fun copyAdditionalFiles(context: BuildContext, targetDir: Path) { } - override fun validatePlugin(pluginId: String?, result: PluginCreationResult, context: BuildContext): List { - return buildList { - val problems = super.validatePlugin(pluginId, result, context).filterNot { - ( - // FIXME IDEA-356970 - pluginId == "com.intellij.plugins.projectFragments" || - // FIXME IJPL-159498 - pluginId == "org.jetbrains.plugins.docker.gateway" - ) && it.message.contains("Service preloading is deprecated") || - ( - // FIXME PY-74322 - pluginId == "com.intellij.python.frontend" || - // FIXME AE-121 - pluginId == "com.jetbrains.personalization" - ) && it.message.contains("Plugin has no dependencies") - } - addAll(problems) - if (result is PluginCreationSuccess && result.plugin.vendor?.contains("JetBrains") != true) { - add(object : InvalidDescriptorProblem( - descriptorPath = "", - detailedMessage = "${result.plugin.pluginId} is published not by JetBrains: ${result.plugin.vendor}" - ) { - override val level = Level.ERROR - }) + final override fun validatePlugin(pluginId: String?, result: PluginCreationResult, context: BuildContext): List { + val problems = super.validatePlugin(pluginId, result, context).filterNot { + ( + // FIXME IDEA-356970 + pluginId == "com.intellij.plugins.projectFragments" || + // FIXME IJPL-159498 + pluginId == "org.jetbrains.plugins.docker.gateway" || pluginId == "com.intellij.java" || pluginId == "com.intellij.java.ide" + ) && it.message.contains("Service preloading is deprecated") || + ( + // FIXME PY-74322 + pluginId == "com.intellij.python.frontend" || + // FIXME AE-121 + pluginId == "com.jetbrains.personalization" + ) && it.message.contains("Plugin has no dependencies") + } + if (result is PluginCreationSuccess && result.plugin.vendor?.contains("JetBrains") != true) { + return problems + object : InvalidDescriptorProblem( + descriptorPath = "", + detailedMessage = "${result.plugin.pluginId} is published not by JetBrains: ${result.plugin.vendor}" + ) { + override val level = Level.ERROR } } + return problems + } + + /** + * 🌲 + * see KTIJ-30761 + * @see org.jetbrains.intellij.build.sharedIndexes.PreSharedIndexesGenerator + */ + protected fun enableKotlinPluginK2ByDefault() { + additionalVmOptions += "-Didea.kotlin.plugin.use.k2=true" } } diff --git a/platform/build-scripts/src/org/jetbrains/intellij/build/ProductProperties.kt b/platform/build-scripts/src/org/jetbrains/intellij/build/ProductProperties.kt index 801ca0edd9b3..fb207f60ea0f 100644 --- a/platform/build-scripts/src/org/jetbrains/intellij/build/ProductProperties.kt +++ b/platform/build-scripts/src/org/jetbrains/intellij/build/ProductProperties.kt @@ -300,12 +300,6 @@ abstract class ProductProperties { */ val mavenArtifacts: MavenArtifactsProperties = MavenArtifactsProperties() - /** - * Specified additional modules (not included into the product layout) which need to be compiled when product is built. - * todo get rid of this - */ - var additionalModulesToCompile: PersistentList = persistentListOf() - /** * Specified modules which tests need to be compiled when product is built. * todo get rid of this diff --git a/platform/build-scripts/src/org/jetbrains/intellij/build/dev/IdeBuilder.kt b/platform/build-scripts/src/org/jetbrains/intellij/build/dev/IdeBuilder.kt index 9427fb752692..1c0e94ef4808 100644 --- a/platform/build-scripts/src/org/jetbrains/intellij/build/dev/IdeBuilder.kt +++ b/platform/build-scripts/src/org/jetbrains/intellij/build/dev/IdeBuilder.kt @@ -94,7 +94,7 @@ internal suspend fun buildProduct(request: BuildRequest, createProductProperties val classifier = computeAdditionalModulesFingerprint(request.additionalModules) val productDirNameWithoutClassifier = if (request.platformPrefix == "Idea") "idea-community" else request.platformPrefix - val productDirName = (productDirNameWithoutClassifier + classifier).takeLast(255) + val productDirName = (productDirNameWithoutClassifier + (if (System.getProperty("intellij.build.minimal").toBoolean()) "-ij-void" else "") + classifier).takeLast(255) val buildDir = withContext(Dispatchers.IO.limitedParallelism(4)) { val buildDir = rootDir.resolve(productDirName) @@ -302,7 +302,6 @@ private suspend fun collectModulesToCompileForDistribution(context: BuildContext if (context.isEmbeddedJetBrainsClientEnabled) { result.add(context.productProperties.embeddedJetBrainsClientMainModule!!) } - result.addAll(context.productProperties.additionalModulesToCompile) result.add("intellij.idea.community.build.tasks") result.add("intellij.platform.images.build") result.removeAll(productLayout.excludedModuleNames) @@ -548,7 +547,13 @@ internal suspend fun createProductProperties(productConfiguration: ProductConfig return spanBuilder("create product properties").use { val productPropertiesClass = try { - classLoader.loadClass(productConfiguration.className) + val className = if (System.getProperty("intellij.build.minimal").toBoolean()) { + "org.jetbrains.intellij.build.IjVoidProperties" + } + else { + productConfiguration.className + } + classLoader.loadClass(className) } catch (_: ClassNotFoundException) { val classPathString = classPathFiles.joinToString(separator = "\n") { file -> diff --git a/platform/build-scripts/src/org/jetbrains/intellij/build/impl/BuildTasksImpl.kt b/platform/build-scripts/src/org/jetbrains/intellij/build/impl/BuildTasksImpl.kt index 621d3be09e42..ef713d0a2aaf 100644 --- a/platform/build-scripts/src/org/jetbrains/intellij/build/impl/BuildTasksImpl.kt +++ b/platform/build-scripts/src/org/jetbrains/intellij/build/impl/BuildTasksImpl.kt @@ -531,7 +531,6 @@ private suspend fun checkProductProperties(context: BuildContext) { checkPaths2(properties.brandingResourcePaths, "productProperties.brandingResourcePaths") checkPaths2(properties.additionalIDEPropertiesFilePaths, "productProperties.additionalIDEPropertiesFilePaths") checkPaths2(properties.additionalDirectoriesWithLicenses, "productProperties.additionalDirectoriesWithLicenses") - checkModules(properties.additionalModulesToCompile, "productProperties.additionalModulesToCompile", context) checkModule(properties.applicationInfoModule, "productProperties.applicationInfoModule", context) properties.embeddedJetBrainsClientMainModule?.let { embeddedJetBrainsClientMainModule -> checkModule(embeddedJetBrainsClientMainModule, "productProperties.embeddedJetBrainsClientMainModule", context) diff --git a/platform/build-scripts/src/org/jetbrains/intellij/build/impl/DistributionJARsBuilder.kt b/platform/build-scripts/src/org/jetbrains/intellij/build/impl/DistributionJARsBuilder.kt index 96186dccddc6..f7b4b276f001 100644 --- a/platform/build-scripts/src/org/jetbrains/intellij/build/impl/DistributionJARsBuilder.kt +++ b/platform/build-scripts/src/org/jetbrains/intellij/build/impl/DistributionJARsBuilder.kt @@ -478,28 +478,28 @@ private suspend fun validatePlugins(context: BuildContext, pluginSpecs: Collecti continue } launch { - validatePlugin(path = path, context = context, span = span) + validatePlugin(file = path, context = context, span = span) } } } } -private fun validatePlugin(path: Path, context: BuildContext, span: Span) { +private fun validatePlugin(file: Path, context: BuildContext, span: Span) { val pluginManager = IdePluginManager.createManager() - val result = pluginManager.createPlugin(path, validateDescriptor = true) + val result = pluginManager.createPlugin(pluginFile = file, validateDescriptor = true) // todo fix AddStatisticsEventLogListenerTemporary val id = when (result) { is PluginCreationSuccess -> result.plugin.pluginId - is PluginCreationFail -> (pluginManager.createPlugin(path, validateDescriptor = false) as? PluginCreationSuccess)?.plugin?.pluginId + is PluginCreationFail -> (pluginManager.createPlugin(pluginFile = file, validateDescriptor = false) as? PluginCreationSuccess)?.plugin?.pluginId } val problems = context.productProperties.validatePlugin(id, result, context) if (problems.isNotEmpty()) { - span.addEvent("failed", Attributes.of(AttributeKey.stringKey("path"), "$path")) + span.addEvent("failed", Attributes.of(AttributeKey.stringKey("path"), "$file")) context.messages.reportBuildProblem( problems.joinToString( - prefix = "${id ?: path}: ", + prefix = "${id ?: file}: ", separator = ". ", - ), identity = "${id ?: path}" + ), identity = "${id ?: file}" ) } } diff --git a/platform/core-impl/src/com/intellij/openapi/application/impl/ApplicationInfoImpl.java b/platform/core-impl/src/com/intellij/openapi/application/impl/ApplicationInfoImpl.java index 136f552c8096..d7680073cf4c 100644 --- a/platform/core-impl/src/com/intellij/openapi/application/impl/ApplicationInfoImpl.java +++ b/platform/core-impl/src/com/intellij/openapi/application/impl/ApplicationInfoImpl.java @@ -1,4 +1,4 @@ -// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.openapi.application.impl; import com.intellij.ReviseWhenPortedToJDK; @@ -54,9 +54,9 @@ public final class ApplicationInfoImpl extends ApplicationInfoEx { private String myCopyrightStart = "2000"; private String myShortCompanyName; private String myCompanyUrl = "https://www.jetbrains.com/"; - private String mySplashImageUrl; - private String myEapSplashImageUrl; - private String mySvgIconUrl; + private @Nullable String splashImageUrl; + private @Nullable String eapSplashImageUrl; + private String svgIconUrl; private String mySvgEapIconUrl; private String mySmallSvgIconUrl; private String mySmallSvgEapIconUrl; @@ -79,7 +79,7 @@ public final class ApplicationInfoImpl extends ApplicationInfoEx { private boolean myShowWhatsNewOnUpdate; private String myWinKeymapUrl; private String myMacKeymapUrl; - private boolean myEAP; + private boolean isEap; private boolean myHasHelp = true; private boolean myHasContextHelp = true; private String myWebHelpUrl = "https://www.jetbrains.com/idea/webhelp/"; @@ -114,8 +114,8 @@ public final class ApplicationInfoImpl extends ApplicationInfoEx { myPatchVersion = child.getAttributeValue("patch"); myFullVersionFormat = child.getAttributeValue("full"); myCodeName = child.getAttributeValue("codename"); - myEAP = Boolean.parseBoolean(child.getAttributeValue("eap")); - myVersionSuffix = child.getAttributeValue("suffix", myEAP ? "EAP" : null); + isEap = Boolean.parseBoolean(child.getAttributeValue("eap")); + myVersionSuffix = child.getAttributeValue("suffix", isEap ? "EAP" : null); } break; @@ -133,17 +133,17 @@ public final class ApplicationInfoImpl extends ApplicationInfoEx { break; case "logo": { - mySplashImageUrl = getAttributeValue(child, "url"); + splashImageUrl = getAttributeValue(child, "url"); } break; case "logo-eap": { - myEapSplashImageUrl = getAttributeValue(child, "url"); + eapSplashImageUrl = getAttributeValue(child, "url"); } break; case "icon": { - mySvgIconUrl = child.getAttributeValue("svg"); + svgIconUrl = child.getAttributeValue("svg"); mySmallSvgIconUrl = child.getAttributeValue("svg-small"); } break; @@ -271,7 +271,7 @@ public final class ApplicationInfoImpl extends ApplicationInfoEx { readPluginInfo(null); } - Objects.requireNonNull(mySvgIconUrl, "Missing attribute: //icon@svg"); + Objects.requireNonNull(svgIconUrl, "Missing attribute: //icon@svg"); Objects.requireNonNull(mySmallSvgIconUrl, "Missing attribute: //icon@svg-small"); overrideFromProperties(); @@ -408,7 +408,7 @@ public final class ApplicationInfoImpl extends ApplicationInfoEx { @Override public String getVersionName() { String fullName = ApplicationNamesInfo.getInstance().getFullProductName(); - if (myEAP && myCodeName != null && !myCodeName.isEmpty()) { + if (isEap && myCodeName != null && !myCodeName.isEmpty()) { fullName += " (" + myCodeName + ")"; } return fullName; @@ -430,8 +430,8 @@ public final class ApplicationInfoImpl extends ApplicationInfoEx { } @Override - public String getSplashImageUrl() { - return isEAP() && myEapSplashImageUrl != null ? myEapSplashImageUrl : mySplashImageUrl; + public @Nullable String getSplashImageUrl() { + return isEap && eapSplashImageUrl != null ? eapSplashImageUrl : splashImageUrl; } @Override @@ -441,7 +441,7 @@ public final class ApplicationInfoImpl extends ApplicationInfoEx { @ApiStatus.Internal public @NotNull String getApplicationSvgIconUrl(boolean isEap) { - return isEap && mySvgEapIconUrl != null ? mySvgEapIconUrl : mySvgIconUrl; + return isEap && mySvgEapIconUrl != null ? mySvgEapIconUrl : svgIconUrl; } @Override @@ -461,17 +461,17 @@ public final class ApplicationInfoImpl extends ApplicationInfoEx { @Override public boolean isEAP() { - return myEAP; + return isEap; } @Override public boolean isMajorEAP() { - return myEAP && (myMinorVersion == null || myMinorVersion.indexOf('.') < 0); + return isEap && (myMinorVersion == null || myMinorVersion.indexOf('.') < 0); } @Override public boolean isPreview() { - return !myEAP && myVersionSuffix != null && ("Preview".equalsIgnoreCase(myVersionSuffix) || myVersionSuffix.startsWith("RC")); + return !isEap && myVersionSuffix != null && ("Preview".equalsIgnoreCase(myVersionSuffix) || myVersionSuffix.startsWith("RC")); } @Override diff --git a/platform/platform-impl/src/com/intellij/ide/util/TipAndTrickManager.kt b/platform/platform-impl/src/com/intellij/ide/util/TipAndTrickManager.kt index 38fc95fa4c04..520e647db7a1 100644 --- a/platform/platform-impl/src/com/intellij/ide/util/TipAndTrickManager.kt +++ b/platform/platform-impl/src/com/intellij/ide/util/TipAndTrickManager.kt @@ -1,4 +1,4 @@ -// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.ide.util import com.intellij.openapi.components.service @@ -27,8 +27,11 @@ interface TipAndTrickManager { fun canShowDialogAutomaticallyNow(project: Project): Boolean companion object { + @JvmField val DISABLE_TIPS_FOR_PROJECT: Key = Key.create("DISABLE_TIPS_FOR_PROJECT") - fun getInstance(): TipAndTrickManager = service() + fun getInstance(): TipAndTrickManager { + return service() + } } } \ No newline at end of file diff --git a/platform/platform-resources/src/META-INF/common-ide-modules.xml b/platform/platform-resources/src/META-INF/common-ide-modules.xml index 55493fe9df26..0fb4434ae941 100644 --- a/platform/platform-resources/src/META-INF/common-ide-modules.xml +++ b/platform/platform-resources/src/META-INF/common-ide-modules.xml @@ -14,4 +14,5 @@ + \ No newline at end of file diff --git a/platform/platform-resources/src/META-INF/essential-modules.xml b/platform/platform-resources/src/META-INF/essential-modules.xml index 923f7a19e30b..d7250bcec004 100644 --- a/platform/platform-resources/src/META-INF/essential-modules.xml +++ b/platform/platform-resources/src/META-INF/essential-modules.xml @@ -22,7 +22,5 @@ - - \ No newline at end of file diff --git a/platform/tips-of-the-day/src/com/intellij/platform/tips/CloseTipDialogOnPluginUnloadingListener.kt b/platform/tips-of-the-day/src/com/intellij/platform/tips/CloseTipDialogOnPluginUnloadingListener.kt index ef2ebe69b465..f1abea486ebd 100644 --- a/platform/tips-of-the-day/src/com/intellij/platform/tips/CloseTipDialogOnPluginUnloadingListener.kt +++ b/platform/tips-of-the-day/src/com/intellij/platform/tips/CloseTipDialogOnPluginUnloadingListener.kt @@ -4,9 +4,10 @@ package com.intellij.platform.tips import com.intellij.ide.plugins.DynamicPluginListener import com.intellij.ide.plugins.IdeaPluginDescriptor import com.intellij.ide.util.TipAndTrickManager +import com.intellij.openapi.components.serviceIfCreated -internal class CloseTipDialogOnPluginUnloadingListener : DynamicPluginListener { +private class CloseTipDialogOnPluginUnloadingListener : DynamicPluginListener { override fun beforePluginUnload(pluginDescriptor: IdeaPluginDescriptor, isUpdate: Boolean) { - TipAndTrickManager.getInstance().closeTipDialog() + serviceIfCreated()?.closeTipDialog() } } diff --git a/plugins/ide-features-trainer/testSrc/training/featuresSuggester/FeatureSuggesterTest.kt b/plugins/ide-features-trainer/testSrc/training/featuresSuggester/FeatureSuggesterTest.kt index 0ddb66adc558..435d989fd381 100644 --- a/plugins/ide-features-trainer/testSrc/training/featuresSuggester/FeatureSuggesterTest.kt +++ b/plugins/ide-features-trainer/testSrc/training/featuresSuggester/FeatureSuggesterTest.kt @@ -1,4 +1,4 @@ -// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package training.featuresSuggester import com.intellij.openapi.Disposable @@ -13,7 +13,7 @@ abstract class FeatureSuggesterTest : BasePlatformTestCase() { protected abstract val testingSuggesterId: String lateinit var expectedSuggestion: Suggestion - private lateinit var disposable: Disposable + private var disposable: Disposable? = null override fun setUp() { super.setUp() @@ -23,12 +23,12 @@ abstract class FeatureSuggesterTest : BasePlatformTestCase() { FeatureSuggester.suggesters.forEach { settings.setEnabled(it.id, true) } expectedSuggestion = NoSuggestion disposable = Disposer.newDisposable() - FeatureSuggesterTestUtils.subscribeToSuggestions(myFixture.project, disposable) { suggestion -> expectedSuggestion = suggestion } + FeatureSuggesterTestUtils.subscribeToSuggestions(myFixture.project, disposable!!) { suggestion -> expectedSuggestion = suggestion } } override fun tearDown() { try { - Disposer.dispose(disposable) + disposable?.let { Disposer.dispose(it) } } catch (e: Throwable) { addSuppressedException(e) diff --git a/python/ide-common/resources/META-INF/PyCharmCorePlugin.xml b/python/ide-common/resources/META-INF/PyCharmCorePlugin.xml index 4ea313ad5524..5568083d1ad2 100644 --- a/python/ide-common/resources/META-INF/PyCharmCorePlugin.xml +++ b/python/ide-common/resources/META-INF/PyCharmCorePlugin.xml @@ -7,6 +7,7 @@ +