@@ -30,6 +30,8 @@ import com.intellij.psi.PsiFile
3030import com.intellij.psi.PsiFileFactory
3131import com.intellij.psi.PsiManager
3232import com.intellij.psi.PsiMethod
33+ import com.intellij.psi.SmartPointerManager
34+ import com.intellij.psi.SmartPsiElementPointer
3335import com.intellij.psi.codeStyle.CodeStyleManager
3436import com.intellij.psi.codeStyle.JavaCodeStyleManager
3537import com.intellij.psi.search.GlobalSearchScopesCore
@@ -91,10 +93,12 @@ import java.util.concurrent.CountDownLatch
9193import java.util.concurrent.TimeUnit
9294import kotlin.reflect.KClass
9395import kotlin.reflect.full.functions
96+ import mu.KotlinLogging
9497import org.utbot.intellij.plugin.util.IntelliJApiHelper.Target.*
9598import org.utbot.intellij.plugin.util.IntelliJApiHelper.run
9699
97100object CodeGenerationController {
101+ private val logger = KotlinLogging .logger {}
98102
99103 private class UtilClassListener {
100104 var requiredUtilClassKind: UtilClassKind ? = null
@@ -115,35 +119,27 @@ object CodeGenerationController {
115119 val latch = CountDownLatch (testSetsByClass.size)
116120
117121 val reports = mutableListOf<TestsGenerationReport >()
118- val testFiles = mutableListOf<PsiFile >()
122+ val testFilesPointers = mutableListOf<SmartPsiElementPointer < PsiFile > >()
119123 val utilClassListener = UtilClassListener ()
120124 for (srcClass in testSetsByClass.keys) {
121125 val testSets = testSetsByClass[srcClass] ? : continue
122126 try {
123127 val classPackageName = model.getTestClassPackageNameFor(srcClass)
124128 val testDirectory = allTestPackages[classPackageName] ? : baseTestDirectory
125129 val testClass = createTestClass(srcClass, testDirectory, model) ? : continue
126- val testClassFile = testClass.containingFile
130+ val testFilePointer = SmartPointerManager .getInstance(model.project).createSmartPsiElementPointer( testClass.containingFile)
127131 val cut = psi2KClass[srcClass] ? : error(" Didn't find KClass instance for class ${srcClass.name} " )
128132 runWriteCommandAction(model.project, " Generate tests with UtBot" , null , {
129133 try {
130- generateCodeAndReport(
131- srcClass,
132- cut,
133- testClass,
134- testClassFile,
135- testSets,
136- model,
137- latch,
138- reports,
139- utilClassListener
140- )
141- testFiles.add(testClassFile)
134+ generateCodeAndReport(srcClass, cut, testClass, testFilePointer, testSets, model, latch, reports, utilClassListener)
135+ testFilesPointers.add(testFilePointer)
142136 } catch (e: IncorrectOperationException ) {
137+ logger.error { e }
143138 showCreatingClassError(model.project, createTestClassName(srcClass))
144139 }
145140 })
146141 } catch (e: IncorrectOperationException ) {
142+ logger.error { e }
147143 showCreatingClassError(model.project, createTestClassName(srcClass))
148144 }
149145 }
@@ -187,7 +183,7 @@ object CodeGenerationController {
187183
188184 mergeSarifReports(model, sarifReportsPath)
189185 if (model.runGeneratedTestsWithCoverage) {
190- RunConfigurationHelper .runTestsWithCoverage(model, testFiles )
186+ RunConfigurationHelper .runTestsWithCoverage(model, testFilesPointers )
191187 }
192188 }
193189 }
@@ -275,7 +271,7 @@ object CodeGenerationController {
275271 }
276272
277273 runWriteCommandAction(model.project, " UtBot util class reformatting" , null , {
278- reformat(model, utUtilsFile, utUtilsClass)
274+ reformat(model, SmartPointerManager .getInstance(model.project).createSmartPsiElementPointer( utUtilsFile) , utUtilsClass)
279275 })
280276
281277 val utUtilsDocument = PsiDocumentManager
@@ -301,7 +297,7 @@ object CodeGenerationController {
301297 run (WRITE_ACTION ) {
302298 unblockDocument(model.project, utilsClassDocument)
303299 executeCommand {
304- utilsClassDocument.setText(utUtilsText)
300+ utilsClassDocument.setText(utUtilsText.replace( " jdk.internal.misc " , " sun.misc " ) )
305301 }
306302 unblockDocument(model.project, utilsClassDocument)
307303 }
@@ -569,7 +565,7 @@ object CodeGenerationController {
569565 srcClass : PsiClass ,
570566 classUnderTest : KClass <* >,
571567 testClass : PsiClass ,
572- file : PsiFile ,
568+ filePointer : SmartPsiElementPointer < PsiFile > ,
573569 testSets : List <UtMethodTestSet >,
574570 model : GenerateTestsModel ,
575571 reportsCountDown : CountDownLatch ,
@@ -597,7 +593,7 @@ object CodeGenerationController {
597593 testClassPackageName = testClass.packageName
598594 )
599595
600- val editor = CodeInsightUtil .positionCursorAtLBrace(testClass.project, file , testClass)
596+ val editor = CodeInsightUtil .positionCursorAtLBrace(testClass.project, filePointer.containingFile , testClass)
601597 // TODO: Use PsiDocumentManager.getInstance(model.project).getDocument(file)
602598 // if we don't want to open _all_ new files with tests in editor one-by-one
603599 run (THREAD_POOL ) {
@@ -609,27 +605,28 @@ object CodeGenerationController {
609605 unblockDocument(testClass.project, editor.document)
610606 // TODO: JIRA:1246 - display warnings if we rewrite the file
611607 executeCommand(testClass.project, " Insert Generated Tests" ) {
612- editor.document.setText(generatedTestsCode)
608+ editor.document.setText(generatedTestsCode.replace( " jdk.internal.misc.Unsafe " , " sun.misc.Unsafe " ) )
613609 }
614610 unblockDocument(testClass.project, editor.document)
615611
616612 // after committing the document the `testClass` is invalid in PsiTree,
617613 // so we have to reload it from the corresponding `file`
618- val testClassUpdated = (file as PsiClassOwner ).classes.first() // only one class in the file
614+ val testClassUpdated = (filePointer.containingFile as PsiClassOwner ).classes.first() // only one class in the file
619615
620616 // reformatting before creating reports due to
621617 // SarifReport requires the final version of the generated tests code
622618 run (THREAD_POOL ) {
623- IntentionHelper (model.project, editor, file ).applyIntentions()
619+ IntentionHelper (model.project, editor, filePointer ).applyIntentions()
624620 run (EDT_LATER ) {
625621 runWriteCommandAction(testClassUpdated.project, " UtBot tests reformatting" , null , {
626- reformat(model, file , testClassUpdated)
622+ reformat(model, filePointer , testClassUpdated)
627623 })
628624 unblockDocument(testClassUpdated.project, editor.document)
629625
630626 // uploading formatted code
627+ val file = filePointer.containingFile
631628 val codeGenerationResultFormatted =
632- codeGenerationResult.copy(generatedCode = file.text)
629+ codeGenerationResult.copy(generatedCode = file? .text? : generatedTestsCode )
633630
634631 // creating and saving reports
635632 reports + = codeGenerationResultFormatted.testsGenerationReport
@@ -652,9 +649,10 @@ object CodeGenerationController {
652649 }
653650 }
654651
655- private fun reformat (model : GenerateTestsModel , file : PsiFile , testClass : PsiClass ) {
652+ private fun reformat (model : GenerateTestsModel , smartPointer : SmartPsiElementPointer < PsiFile > , testClass : PsiClass ) {
656653 val project = model.project
657654 val codeStyleManager = CodeStyleManager .getInstance(project)
655+ val file = smartPointer.containingFile? : return
658656 codeStyleManager.reformat(file)
659657 when (model.codegenLanguage) {
660658 CodegenLanguage .JAVA -> {
@@ -694,6 +692,7 @@ object CodeGenerationController {
694692 SarifReportIdea .createAndSave(model, testSets, generatedTestsCode, sourceFinding)
695693 }
696694 } catch (e: Exception ) {
695+ logger.error { e }
697696 showErrorDialogLater(
698697 project,
699698 message = " Cannot save Sarif report via generated tests: error occurred '${e.message} '" ,
0 commit comments