KTIJ-19876 [kotlin] Hide java class action in pure kotlin source roots

Signed-off-by: Vladimir Dolzhenko <vladimir.dolzhenko@jetbrains.com>

GitOrigin-RevId: e1bdd7e3a885d263d051dd469473a6e5dfdc6572
This commit is contained in:
Vladimir Dolzhenko
2026-06-15 19:58:02 +00:00
committed by intellij-monorepo-bot
parent b49b8aac7d
commit 413115d66b
5 changed files with 66 additions and 0 deletions
@@ -383,4 +383,9 @@
<synonym key="action.DevKit.Bootstrap.synonym"/>
</action>
</actions>
<extensionPoints>
<extensionPoint qualifiedName="com.intellij.java.class.action.suppressor"
interface="com.intellij.ide.actions.JavaClassActionSuppressor" dynamic="true"/>
</extensionPoints>
</idea-plugin>
@@ -12,6 +12,7 @@ import com.intellij.ide.fileTemplates.JavaCreateFromTemplateHandler;
import com.intellij.ide.fileTemplates.JavaTemplateUtil;
import com.intellij.ide.highlighter.JavaFileType;
import com.intellij.java.JavaBundle;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.PackageIndex;
@@ -36,6 +37,7 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.jps.model.module.JpsModuleSourceRootType;
import javax.swing.Icon;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Supplier;
@@ -56,6 +58,19 @@ public class CreateClassAction extends JavaCreateTemplateInPackageAction<PsiClas
super(text, description, icon, rootTypes);
}
@Override
protected boolean isAvailable(@NotNull DataContext dataContext) {
if (!super.isAvailable(dataContext)) return false;
List<JavaClassActionSuppressor> list = JavaClassActionSuppressor.EP_NAME.getExtensionList();
for (JavaClassActionSuppressor suppressor : list) {
if (suppressor.isSuppressed(dataContext)) {
return false;
}
}
return true;
}
@Override
protected void buildDialog(@NotNull Project project, @NotNull PsiDirectory directory,
@NotNull CreateFileFromTemplateDialog.Builder builder) {
@@ -0,0 +1,14 @@
// Copyright 2000-2026 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.ide.actions;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.extensions.ExtensionPointName;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
@ApiStatus.Internal
public interface JavaClassActionSuppressor {
ExtensionPointName<JavaClassActionSuppressor> EP_NAME = ExtensionPointName.create("com.intellij.java.class.action.suppressor");
boolean isSuppressed(@NotNull DataContext dataContext);
}
@@ -0,0 +1,30 @@
// Copyright 2000-2026 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.kotlin.idea.core
import com.intellij.ide.actions.JavaClassActionSuppressor
import com.intellij.openapi.actionSystem.CommonDataKeys
import com.intellij.openapi.actionSystem.DataContext
import com.intellij.openapi.actionSystem.LangDataKeys
import com.intellij.openapi.roots.ProjectRootManager
import com.intellij.psi.PsiDirectory
import org.jetbrains.kotlin.idea.base.util.KOTLIN_SOURCE_ROOT_TYPES
import org.jetbrains.kotlin.idea.facet.KotlinFacet
internal class KotlinJavaClassActionSuppressor: JavaClassActionSuppressor {
override fun isSuppressed(dataContext: DataContext): Boolean {
val ideView = LangDataKeys.IDE_VIEW.getData(dataContext) ?: return false
val project = CommonDataKeys.PROJECT.getData(dataContext) ?: return false
val projectFileIndex = ProjectRootManager.getInstance(project).fileIndex
return ideView.directories.any { directory: PsiDirectory ->
val virtualFile = directory.virtualFile
val module = projectFileIndex.getModuleForFile(virtualFile) ?: return@any false
val kotlinFacet = KotlinFacet.get(module)
val kotlinSourceFolders = kotlinFacet?.configuration?.settings?.pureKotlinSourceFolders
val kotlinSourceRootOfType =
projectFileIndex.isUnderSourceRootOfType(virtualFile, KOTLIN_SOURCE_ROOT_TYPES) ||
(kotlinSourceFolders?.let { virtualFile.toNioPath().toString() in it } ?: false)
kotlinSourceRootOfType
}
}
}
@@ -357,6 +357,8 @@
language="kotlin"
implementationClass="org.jetbrains.kotlin.idea.highlighter.KotlinTestRunLineMarkerContributor"/>
<java.class.action.suppressor implementation="org.jetbrains.kotlin.idea.core.KotlinJavaClassActionSuppressor"/>
<lang.inspectionSuppressor language="kotlin" implementationClass="org.jetbrains.kotlin.idea.inspections.suppress.KotlinInspectionSuppressor"/>
<optionController implementation="org.jetbrains.kotlin.idea.configuration.KotlinCompilerPluginProvider"/>
<optionController implementation="org.jetbrains.kotlin.idea.configuration.KotlinDependencyProvider"/>