@@ -38,13 +38,18 @@ import com.intellij.openapi.application.runWriteAction
38
38
import com.intellij.openapi.command.WriteCommandAction
39
39
import com.intellij.openapi.components.service
40
40
import com.intellij.openapi.editor.colors.EditorColorsManager
41
+ import com.intellij.openapi.module.Module
41
42
import com.intellij.openapi.options.ShowSettingsUtil
42
43
import com.intellij.openapi.projectRoots.JavaSdkVersion
43
44
import com.intellij.openapi.roots.ContentEntry
44
45
import com.intellij.openapi.roots.DependencyScope
45
46
import com.intellij.openapi.roots.ExternalLibraryDescriptor
46
47
import com.intellij.openapi.roots.JavaProjectModelModificationService
48
+ import com.intellij.openapi.roots.LibraryOrderEntry
49
+ import com.intellij.openapi.roots.ModifiableRootModel
47
50
import com.intellij.openapi.roots.ModuleRootManager
51
+ import com.intellij.openapi.roots.ModuleRootModificationUtil
52
+ import com.intellij.openapi.roots.ModuleSourceOrderEntry
48
53
import com.intellij.openapi.roots.ui.configuration.ClasspathEditor
49
54
import com.intellij.openapi.roots.ui.configuration.ProjectStructureConfigurable
50
55
import com.intellij.openapi.ui.ComboBox
@@ -111,6 +116,8 @@ import javax.swing.JComponent
111
116
import javax.swing.JList
112
117
import javax.swing.JPanel
113
118
import kotlin.streams.toList
119
+ import org.jetbrains.concurrency.thenRun
120
+ import org.utbot.intellij.plugin.ui.utils.allLibraries
114
121
115
122
private const val RECENTS_KEY = " org.utbot.recents"
116
123
@@ -642,7 +649,7 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m
642
649
}
643
650
644
651
selectedTestFramework.isInstalled = true
645
- addDependency(libraryDescriptor)
652
+ addDependency(model.testModule, libraryDescriptor)
646
653
.onError { selectedTestFramework.isInstalled = false }
647
654
}
648
655
@@ -663,7 +670,7 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m
663
670
val versionInProject = libraryInProject?.libraryName?.parseVersion()
664
671
665
672
selectedMockFramework.isInstalled = true
666
- addDependency(mockitoCoreLibraryDescriptor(versionInProject))
673
+ addDependency(model.testModule, mockitoCoreLibraryDescriptor(versionInProject))
667
674
.onError { selectedMockFramework.isInstalled = false }
668
675
}
669
676
@@ -701,11 +708,34 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m
701
708
* Note that version restrictions will be applied only if they are present on target machine
702
709
* Otherwise latest release version will be installed.
703
710
*/
704
- private fun addDependency (libraryDescriptor : ExternalLibraryDescriptor ): Promise <Void > {
705
- return JavaProjectModelModificationService
711
+ private fun addDependency (module : Module , libraryDescriptor : ExternalLibraryDescriptor ): Promise <Void > {
712
+ val promise = JavaProjectModelModificationService
706
713
.getInstance(model.project)
707
714
// this method returns JetBrains internal Promise that is difficult to deal with, but it is our way
708
715
.addDependency(model.testModule, libraryDescriptor, DependencyScope .TEST )
716
+ promise.thenRun {
717
+ module.allLibraries()
718
+ .lastOrNull { library -> library.libraryName == libraryDescriptor.presentableName }?.let {
719
+ ModuleRootModificationUtil .updateModel(module) { model -> placeEntryToCorrectPlace(model, it) }
720
+ }
721
+ }
722
+ return promise
723
+ }
724
+
725
+ /* *
726
+ * Reorders library list to unsure that just added library with proper version is listed prior to old-versioned one
727
+ */
728
+ private fun placeEntryToCorrectPlace (model : ModifiableRootModel , addedEntry : LibraryOrderEntry ) {
729
+ val order = model.orderEntries
730
+ val lastEntry = order.last()
731
+ if (lastEntry is LibraryOrderEntry && lastEntry.library == addedEntry.library) {
732
+ val insertionPoint = order.indexOfFirst { it is ModuleSourceOrderEntry } + 1
733
+ if (insertionPoint > 0 ) {
734
+ System .arraycopy(order, insertionPoint, order, insertionPoint + 1 , order.size - 1 - insertionPoint)
735
+ order[insertionPoint] = lastEntry
736
+ model.rearrangeOrderEntries(order)
737
+ }
738
+ }
709
739
}
710
740
711
741
private fun createMockFrameworkNotificationDialog () = Messages .showYesNoDialog(
0 commit comments