IDEA-355836 Create new Java class / new Kotlin class actions should not be available on the top project level

(cherry picked from commit 6a042e1dfc0b3920af39b70561f3d508757975e0)

IJ-CR-162668

GitOrigin-RevId: b68122ec616646c84ba65d0abf72631ac0d74c2a
This commit is contained in:
Dmitry Avdeev
2025-05-05 18:31:35 +02:00
committed by intellij-monorepo-bot
parent 65cab71d0c
commit da9f0d478e
2 changed files with 53 additions and 9 deletions

View File

@@ -0,0 +1,50 @@
// 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.java.ide.actions
import com.intellij.ide.IdeView
import com.intellij.ide.actions.CreateClassAction
import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.actionSystem.DataContext
import com.intellij.openapi.actionSystem.LangDataKeys
import com.intellij.openapi.actionSystem.ex.ActionUtil.updateAction
import com.intellij.openapi.actionSystem.impl.SimpleDataContext
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.roots.ModuleRootManager
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.PsiDirectory
import com.intellij.psi.PsiManager
import com.intellij.testFramework.TestActionEvent
import com.intellij.testFramework.fixtures.JavaCodeInsightFixtureTestCase
class CreateClassActionAvailabilityTest: JavaCodeInsightFixtureTestCase() {
fun testCreateClassActionAvailability() {
val srcRoot = myFixture.tempDirFixture.findOrCreateDir("newContentRoot/src")
val contentRoot = srcRoot.parent
ApplicationManager.getApplication().runWriteAction {
ModuleRootManager.getInstance(myFixture.module).modifiableModel.apply {
addContentEntry(contentRoot.url).addSourceFolder(srcRoot, false)
commit()
}
}
assertFalse(isEnabledAndVisibleFor(contentRoot))
assertTrue(isEnabledAndVisibleFor(srcRoot))
}
private fun isEnabledAndVisibleFor(baseDir: VirtualFile): Boolean {
val projectDir = PsiManager.getInstance(project).findDirectory(baseDir)!!
val action = CreateClassAction()
val e: AnActionEvent = TestActionEvent.createTestEvent(context(projectDir))
updateAction(action, e)
val enabledAndVisible = e.presentation.isEnabledAndVisible
return enabledAndVisible
}
private fun context(projectDir: PsiDirectory): DataContext {
return SimpleDataContext.builder().add(LangDataKeys.IDE_VIEW, object : IdeView {
override fun getDirectories(): Array<out PsiDirectory> = arrayOf(projectDir)
override fun getOrChooseDirectory(): PsiDirectory? = projectDir
}).add(LangDataKeys.PROJECT, this.project).build()
}
}

View File

@@ -10,7 +10,6 @@ import com.intellij.openapi.application.WriteAction;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.module.ModuleUtilCore;
import com.intellij.openapi.project.DumbService;
import com.intellij.openapi.project.Project;
@@ -146,17 +145,12 @@ public abstract class CreateTemplateInPackageAction<T extends PsiElement> extend
public static boolean isInContentRoot(VirtualFile file, ProjectFileIndex index) {
return file.equals(index.getContentRootForFile(file)) &&
projectHasNoSourceRoots(file, index);
noSourceRootConfigured(file, index);
}
private static boolean projectHasNoSourceRoots(VirtualFile file, ProjectFileIndex index) {
private static boolean noSourceRootConfigured(VirtualFile file, ProjectFileIndex index) {
Module module = index.getModuleForFile(file);
if (module != null) {
return ContainerUtil.or(ModuleManager.getInstance(module.getProject()).getModules(), m -> {
return ModuleRootManager.getInstance(module).getSourceRoots().length > 0;
});
}
return false;
return module != null && ModuleRootManager.getInstance(module).getSourceRoots().length == 0;
}
protected abstract boolean checkPackageExists(PsiDirectory directory);