Skip to content

Commit e7a3a93

Browse files
committed
feat(javascript): improve test file generation
- Import `LanguageApplicableUtil` in `JSWriteTestService.kt` to fix compilation error. - Replace deprecated `LocalFileSystem.getInstance().findFileByPath()` with `VfsUtil.createDirectoryIfMissing()` and `createChildData()` to create test file. - Use `WriteCommandAction.writeCommandAction()` to create test file in a write command action. - Refactor `suggestTestDirectory()` to use `ReadAction.compute()` and handle null cases properly. - Improve code readability and remove unnecessary code comments.
1 parent 078e015 commit e7a3a93

File tree

1 file changed

+24
-33
lines changed

1 file changed

+24
-33
lines changed

javascript/src/main/kotlin/cc/unitmesh/ide/javascript/provider/testing/JSWriteTestService.kt

Lines changed: 24 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,19 @@ import cc.unitmesh.devti.context.ClassContext
44
import cc.unitmesh.devti.provider.WriteTestService
55
import cc.unitmesh.devti.provider.context.TestFileContext
66
import cc.unitmesh.ide.javascript.context.JavaScriptClassContextBuilder
7-
import cc.unitmesh.ide.javascript.util.LanguageApplicableUtil
87
import cc.unitmesh.ide.javascript.util.JSPsiUtil
8+
import cc.unitmesh.ide.javascript.util.LanguageApplicableUtil
99
import com.intellij.execution.configurations.RunProfile
1010
import com.intellij.lang.javascript.buildTools.npm.rc.NpmRunConfiguration
1111
import com.intellij.lang.javascript.psi.*
1212
import com.intellij.lang.javascript.psi.ecmal4.JSClass
1313
import com.intellij.openapi.application.ReadAction
1414
import com.intellij.openapi.application.runReadAction
1515
import com.intellij.openapi.command.WriteCommandAction
16-
import com.intellij.openapi.fileEditor.FileDocumentManager
1716
import com.intellij.openapi.project.Project
1817
import com.intellij.openapi.project.guessProjectDir
1918
import com.intellij.openapi.vfs.LocalFileSystem
19+
import com.intellij.openapi.vfs.VfsUtil
2020
import com.intellij.openapi.vfs.VirtualFile
2121
import com.intellij.openapi.vfs.findDirectory
2222
import com.intellij.psi.*
@@ -25,7 +25,6 @@ import java.io.File
2525
import java.io.IOException
2626
import java.nio.file.Path
2727
import kotlin.io.path.Path
28-
import kotlin.io.path.nameWithoutExtension
2928

3029
class JSWriteTestService : WriteTestService() {
3130
override fun runConfigurationClass(project: Project): Class<out RunProfile> = NpmRunConfiguration::class.java
@@ -42,27 +41,23 @@ class JSWriteTestService : WriteTestService() {
4241
val elementToTest = Util.getElementToTest(element) ?: return null
4342
val elementName = JSPsiUtil.elementName(elementToTest) ?: return null
4443

45-
val testFile = LocalFileSystem.getInstance().findFileByPath(testFilePath)
44+
var testFile = LocalFileSystem.getInstance().findFileByPath(testFilePath)
4645
if (testFile != null) {
4746
return TestFileContext(false, testFile, emptyList(), null, language, null)
4847
}
4948

50-
val testFileName = Path(testFilePath).nameWithoutExtension
51-
val testFileText = ""
52-
val testFilePsi = ReadAction.compute<PsiFile, Throwable> {
53-
PsiFileFactory.getInstance(project).createFileFromText(testFileName, language, testFileText)
54-
}
49+
// create test file
5550

56-
// write test file
57-
WriteCommandAction.runWriteCommandAction(project) {
58-
val document = testFilePsi.viewProvider.document!!
59-
document.insertString(document.textLength, testFileText)
60-
FileDocumentManager.getInstance().saveDocument(document)
61-
}
51+
52+
WriteCommandAction.writeCommandAction(sourceFile.project).withName("Generate Unit Tests")
53+
.compute<Unit, Throwable> {
54+
val parentDir = VfsUtil.createDirectoryIfMissing(Path(testFilePath).parent.toString())
55+
testFile = parentDir?.createChildData(this, Path(testFilePath).fileName.toString())
56+
}
6257

6358
val currentClz = JavaScriptClassContextBuilder().getClassContext(elementToTest, false)
6459

65-
return TestFileContext(true, testFilePsi.virtualFile, emptyList(), elementName, language, currentClz)
60+
return TestFileContext(true, testFile!!, emptyList(), elementName, language, currentClz)
6661
}
6762

6863
override fun lookupRelevantClass(project: Project, element: PsiElement): List<ClassContext> {
@@ -153,26 +148,22 @@ class JSWriteTestService : WriteTestService() {
153148
/**
154149
* Todo: since in JavaScript has different test framework, we need to find the test directory by the framework.
155150
*/
156-
private fun suggestTestDirectory(element: PsiElement): PsiDirectory? {
157-
val project: Project = element.project
158-
val elementDirectory = runReadAction { element.containingFile }
151+
private fun suggestTestDirectory(element: PsiElement): PsiDirectory? =
152+
ReadAction.compute<PsiDirectory?, Throwable> {
153+
val project: Project = element.project
154+
val elementDirectory = element.containingFile
159155

160-
val parentDir = elementDirectory?.virtualFile?.parent ?: return null
161-
val psiManager = PsiManager.getInstance(project)
156+
val parentDir = elementDirectory?.virtualFile?.parent ?: return@compute null
157+
val psiManager = PsiManager.getInstance(project)
162158

163-
val testDir = runReadAction { parentDir.findDirectory("test") }
164-
testDir?.let {
165-
return runReadAction { psiManager.findDirectory(it) }
166-
}
167-
168-
val outputFile = WriteCommandAction.writeCommandAction(project, elementDirectory)
169-
.withName("Creating Directory For Tests")
170-
.compute<VirtualFile?, IOException> {
171-
return@compute parentDir.createChildDirectory(this, "test")
172-
} ?: return null
159+
val findDirectory = psiManager.findDirectory(parentDir)
160+
if (findDirectory != null) {
161+
return@compute findDirectory
162+
}
173163

174-
return runReadAction { psiManager.findDirectory(outputFile) }
175-
}
164+
val createChildDirectory = parentDir.createChildDirectory(this, "test")
165+
return@compute psiManager.findDirectory(createChildDirectory)
166+
}
176167

177168
private fun generateUniqueTestFile(
178169
elementName: String?,

0 commit comments

Comments
 (0)