[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.final.flag.tooltip=Final
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.method.tooltip=Method
node.record.tooltip=Record

View File

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

View File

@@ -3,20 +3,30 @@ package com.intellij.java.ide.actions
import com.intellij.ide.IdeView
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.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.project.Project
import com.intellij.openapi.roots.ModuleRootManager
import com.intellij.openapi.util.NlsContexts
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.PsiManager
import com.intellij.testFramework.IdeaTestUtil
import com.intellij.testFramework.TestActionEvent
import com.intellij.testFramework.fixtures.JavaCodeInsightFixtureTestCase
import org.jetbrains.annotations.NonNls
import javax.swing.Icon
class CreateClassActionAvailabilityTest: JavaCodeInsightFixtureTestCase() {
class CreateClassActionAvailabilityTest : JavaCodeInsightFixtureTestCase() {
fun testCreateClassActionAvailability() {
val srcRoot = myFixture.tempDirFixture.findOrCreateDir("newContentRoot/src")
@@ -32,6 +42,55 @@ class CreateClassActionAvailabilityTest: JavaCodeInsightFixtureTestCase() {
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 {
val projectDir = PsiManager.getInstance(project).findDirectory(baseDir)!!
val action = CreateClassAction()

View File

@@ -16,6 +16,7 @@
package com.intellij.java.ide.actions
import com.intellij.ide.fileTemplates.FileTemplateManager
import com.intellij.ide.fileTemplates.JavaTemplateUtil
import com.intellij.psi.JavaDirectoryService
import com.intellij.psi.PsiManager
import com.intellij.testFramework.fixtures.LightJavaCodeInsightFixtureTestCase
@@ -31,4 +32,18 @@ class CreateClassActionTest: LightJavaCodeInsightFixtureTestCase() {
val clazz = JavaDirectoryService.getInstance().createClass(psiDirectory!!, "Bar", template.name)
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)
}
}