Skip to content

Commit 10457f0

Browse files
Nikita Vlaevnikitavlaev
Nikita Vlaev
authored andcommitted
Possible fix to avoid IndexNotReadyException.
1 parent d07f695 commit 10457f0

File tree

1 file changed

+18
-11
lines changed
  • utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/generator

1 file changed

+18
-11
lines changed

utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/generator/TestGenerator.kt

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import com.intellij.openapi.command.executeCommand
2828
import com.intellij.openapi.components.service
2929
import com.intellij.openapi.editor.Document
3030
import com.intellij.openapi.editor.Editor
31+
import com.intellij.openapi.project.DumbServiceImpl
3132
import com.intellij.openapi.project.Project
3233
import com.intellij.openapi.vfs.VfsUtil
3334
import 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

Comments
 (0)