@@ -28,6 +28,7 @@ import com.intellij.openapi.command.executeCommand
2828import com.intellij.openapi.components.service
2929import com.intellij.openapi.editor.Document
3030import com.intellij.openapi.editor.Editor
31+ import com.intellij.openapi.project.DumbServiceImpl
3132import com.intellij.openapi.project.Project
3233import com.intellij.openapi.vfs.VfsUtil
3334import com.intellij.psi.JavaDirectoryService
@@ -83,7 +84,7 @@ object TestGenerator {
8384 val classPackageName = if (model.testPackageName.isNullOrEmpty())
8485 srcClass.containingFile.containingDirectory.getPackage()?.qualifiedName else model.testPackageName
8586 val testDirectory = allTestPackages[classPackageName] ? : baseTestDirectory
86- val testClass = createTestClass(srcClass, testDirectory, model.codegenLanguage ) ? : continue
87+ val testClass = createTestClass(srcClass, testDirectory, model) ? : continue
8788 val file = testClass.containingFile
8889
8990 addTestMethodsAndSaveReports(testClass, file, testCases, model)
@@ -133,7 +134,7 @@ object TestGenerator {
133134 }
134135 }
135136
136- private fun createTestClass (srcClass : PsiClass , testDirectory : PsiDirectory , codegenLanguage : CodegenLanguage ): PsiClass ? {
137+ private fun createTestClass (srcClass : PsiClass , testDirectory : PsiDirectory , model : GenerateTestsModel ): PsiClass ? {
137138 val testClassName = createTestClassName(srcClass)
138139 val aPackage = JavaDirectoryService .getInstance().getPackage(testDirectory)
139140
@@ -144,19 +145,25 @@ object TestGenerator {
144145 // findClassByShortName() may return two identical objects.
145146 // Be careful, do not use singleOrNull() here, because it expects
146147 // the array to contain strictly one element and otherwise returns null.
147- aPackage.findClassByShortName(testClassName, scope)
148- .firstOrNull {
149- when (codegenLanguage) {
150- CodegenLanguage .JAVA -> it !is KtUltraLightClass
151- CodegenLanguage .KOTLIN -> it is KtUltraLightClass
148+ var testClass: PsiClass ? = null
149+
150+ // runWhenSmart to avoid IndexNotReadyException
151+ DumbServiceImpl (model.project).runWhenSmart {
152+ testClass = aPackage.findClassByShortName(testClassName, scope)
153+ .firstOrNull {
154+ when (model.codegenLanguage) {
155+ CodegenLanguage .JAVA -> it !is KtUltraLightClass
156+ CodegenLanguage .KOTLIN -> it is KtUltraLightClass
157+ }
152158 }
153- }?.let {
154- return if (FileModificationService .getInstance().preparePsiElementForWrite(it)) it else null
155- }
159+ }
160+ testClass?.let {
161+ return if (FileModificationService .getInstance().preparePsiElementForWrite(it)) it else null
162+ }
156163 }
157164
158165 val fileTemplate = FileTemplateManager .getInstance(testDirectory.project).getInternalTemplate(
159- when (codegenLanguage) {
166+ when (model. codegenLanguage) {
160167 CodegenLanguage .JAVA -> JavaTemplateUtil .INTERNAL_CLASS_TEMPLATE_NAME
161168 CodegenLanguage .KOTLIN -> " Kotlin Class"
162169 }
0 commit comments