[java] IJ-CR-162475 IDEA-360079 add simple source file

- rename to compact
- add tests
- restrict only by default packages

GitOrigin-RevId: eff47e6f615f36b845659da8e84e5220d7b90cfe
This commit is contained in:
Mikhail Pyltsin
2025-05-12 13:37:25 +02:00
committed by intellij-monorepo-bot
parent a5c75ad81d
commit d04a07827e
4 changed files with 87 additions and 5 deletions

View File

@@ -240,7 +240,7 @@ node.exception.tooltip=Exception
node.field.tooltip=Field node.field.tooltip=Field
node.final.flag.tooltip=Final node.final.flag.tooltip=Final
node.interface.tooltip=Interface node.interface.tooltip=Interface
node.simple.source.file.tooltip=Simple source file node.simple.source.file.tooltip=Compact source file
node.junit.test.tooltip=JUnit Test node.junit.test.tooltip=JUnit Test
node.method.tooltip=Method node.method.tooltip=Method
node.record.tooltip=Record node.record.tooltip=Record

View File

@@ -8,9 +8,14 @@ import com.intellij.ide.fileTemplates.*;
import com.intellij.ide.highlighter.JavaFileType; import com.intellij.ide.highlighter.JavaFileType;
import com.intellij.java.JavaBundle; import com.intellij.java.JavaBundle;
import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.project.DumbService;
import com.intellij.openapi.project.Project; import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.PackageIndex;
import com.intellij.openapi.roots.ProjectFileIndex;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.ui.InputValidatorEx; import com.intellij.openapi.ui.InputValidatorEx;
import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.pom.java.JavaFeature; import com.intellij.pom.java.JavaFeature;
import com.intellij.pom.java.LanguageLevel; import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.*; import com.intellij.psi.*;
@@ -55,9 +60,12 @@ public class CreateClassAction extends JavaCreateTemplateInPackageAction<PsiClas
JavaTemplateUtil.INTERNAL_EXCEPTION_TYPE_TEMPLATE_NAME); JavaTemplateUtil.INTERNAL_EXCEPTION_TYPE_TEMPLATE_NAME);
if (JavaFeature.IMPLICIT_CLASSES.isSufficient(level)) { if (JavaFeature.IMPLICIT_CLASSES.isSufficient(level)) {
builder.addKind(JavaPsiBundle.message("node.simple.source.file.tooltip"), String packageNameByDirectory = PackageIndex.getInstance(project).getPackageNameByDirectory(directory.getVirtualFile());
IconManager.getInstance().getPlatformIcon(com.intellij.ui.PlatformIcons.JavaFileType), if("".equals(packageNameByDirectory)) {
JavaTemplateUtil.INTERNAL_SIMPLE_SOURCE_FILE); builder.addKind(JavaPsiBundle.message("node.simple.source.file.tooltip"),
IconManager.getInstance().getPlatformIcon(com.intellij.ui.PlatformIcons.JavaFileType),
JavaTemplateUtil.INTERNAL_SIMPLE_SOURCE_FILE);
}
} }
PsiDirectory[] dirs = {directory}; PsiDirectory[] dirs = {directory};

View File

@@ -3,20 +3,30 @@ package com.intellij.java.ide.actions
import com.intellij.ide.IdeView import com.intellij.ide.IdeView
import com.intellij.ide.actions.CreateClassAction import com.intellij.ide.actions.CreateClassAction
import com.intellij.ide.actions.CreateFileFromTemplateDialog
import com.intellij.ide.actions.TestDialogBuilder
import com.intellij.ide.fileTemplates.JavaTemplateUtil
import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.actionSystem.DataContext import com.intellij.openapi.actionSystem.DataContext
import com.intellij.openapi.actionSystem.LangDataKeys import com.intellij.openapi.actionSystem.LangDataKeys
import com.intellij.openapi.actionSystem.ex.ActionUtil.updateAction import com.intellij.openapi.actionSystem.ex.ActionUtil.updateAction
import com.intellij.openapi.actionSystem.impl.SimpleDataContext import com.intellij.openapi.actionSystem.impl.SimpleDataContext
import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.project.Project
import com.intellij.openapi.roots.ModuleRootManager import com.intellij.openapi.roots.ModuleRootManager
import com.intellij.openapi.util.NlsContexts
import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.VirtualFile
import com.intellij.pom.java.JavaFeature
import com.intellij.pom.java.LanguageLevel
import com.intellij.psi.PsiDirectory import com.intellij.psi.PsiDirectory
import com.intellij.psi.PsiManager import com.intellij.psi.PsiManager
import com.intellij.testFramework.IdeaTestUtil
import com.intellij.testFramework.TestActionEvent import com.intellij.testFramework.TestActionEvent
import com.intellij.testFramework.fixtures.JavaCodeInsightFixtureTestCase import com.intellij.testFramework.fixtures.JavaCodeInsightFixtureTestCase
import org.jetbrains.annotations.NonNls
import javax.swing.Icon
class CreateClassActionAvailabilityTest: JavaCodeInsightFixtureTestCase() { class CreateClassActionAvailabilityTest : JavaCodeInsightFixtureTestCase() {
fun testCreateClassActionAvailability() { fun testCreateClassActionAvailability() {
val srcRoot = myFixture.tempDirFixture.findOrCreateDir("newContentRoot/src") val srcRoot = myFixture.tempDirFixture.findOrCreateDir("newContentRoot/src")
@@ -32,6 +42,55 @@ class CreateClassActionAvailabilityTest: JavaCodeInsightFixtureTestCase() {
assertTrue(isEnabledAndVisibleFor(srcRoot)) assertTrue(isEnabledAndVisibleFor(srcRoot))
} }
fun testCompactSourceClassAvailability() {
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()
}
}
val sourceLevel = myFixture.tempDirFixture.findOrCreateDir("")
val sourceDirectory = PsiManager.getInstance(project).findDirectory(sourceLevel)
val dir = myFixture.tempDirFixture.findOrCreateDir("foo")
val psiDirectory = PsiManager.getInstance(project).findDirectory(dir)
val builder = object : CreateFileFromTemplateDialog.Builder by TestDialogBuilder(TestDialogBuilder.TestAnswers(null, null)) {
val templateNames = hashSetOf<String>()
override fun addKind(kind: @NlsContexts.ListItem String, icon: Icon?, templateName: @NonNls String): CreateFileFromTemplateDialog.Builder? {
templateNames.add(templateName)
return super.addKind(kind, icon, templateName)
}
}
val action = object : CreateClassAction() {
public override fun buildDialog(project: Project, directory: PsiDirectory, builder: CreateFileFromTemplateDialog.Builder) {
super.buildDialog(project, directory, builder)
}
}
IdeaTestUtil.withLevel(module, JavaFeature.IMPLICIT_CLASSES.minimumLevel) {
builder.templateNames.clear()
action.buildDialog(project, sourceDirectory!!, builder)
assertTrue(builder.templateNames.contains(JavaTemplateUtil.INTERNAL_SIMPLE_SOURCE_FILE))
builder.templateNames.clear()
action.buildDialog(project, psiDirectory!!, builder)
assertTrue(!builder.templateNames.contains(JavaTemplateUtil.INTERNAL_SIMPLE_SOURCE_FILE))
}
IdeaTestUtil.withLevel(module, LanguageLevel.JDK_1_8) {
builder.templateNames.clear()
action.buildDialog(project, sourceDirectory!!, builder)
assertTrue(!builder.templateNames.contains(JavaTemplateUtil.INTERNAL_SIMPLE_SOURCE_FILE))
}
}
private fun isEnabledAndVisibleFor(baseDir: VirtualFile): Boolean { private fun isEnabledAndVisibleFor(baseDir: VirtualFile): Boolean {
val projectDir = PsiManager.getInstance(project).findDirectory(baseDir)!! val projectDir = PsiManager.getInstance(project).findDirectory(baseDir)!!
val action = CreateClassAction() val action = CreateClassAction()

View File

@@ -16,6 +16,7 @@
package com.intellij.java.ide.actions package com.intellij.java.ide.actions
import com.intellij.ide.fileTemplates.FileTemplateManager import com.intellij.ide.fileTemplates.FileTemplateManager
import com.intellij.ide.fileTemplates.JavaTemplateUtil
import com.intellij.psi.JavaDirectoryService import com.intellij.psi.JavaDirectoryService
import com.intellij.psi.PsiManager import com.intellij.psi.PsiManager
import com.intellij.testFramework.fixtures.LightJavaCodeInsightFixtureTestCase import com.intellij.testFramework.fixtures.LightJavaCodeInsightFixtureTestCase
@@ -31,4 +32,18 @@ class CreateClassActionTest: LightJavaCodeInsightFixtureTestCase() {
val clazz = JavaDirectoryService.getInstance().createClass(psiDirectory!!, "Bar", template.name) val clazz = JavaDirectoryService.getInstance().createClass(psiDirectory!!, "Bar", template.name)
assertEquals("public class Bar {\n Title\n}", clazz.text) assertEquals("public class Bar {\n Title\n}", clazz.text)
} }
fun testImplicitClassLiveTemplate() {
val dir = myFixture.tempDirFixture.findOrCreateDir("")
val psiDirectory = PsiManager.getInstance(project).findDirectory(dir)
val expectedFileName = "Bar"
val clazz = JavaDirectoryService.getInstance().createClass(psiDirectory!!, expectedFileName, JavaTemplateUtil.INTERNAL_SIMPLE_SOURCE_FILE)
assertEquals("""
void main() {
}
""".trimIndent(), clazz.text)
val fileName = clazz.containingFile.name
assertEquals("$expectedFileName.java", fileName)
}
} }