ConfigLibraryUtil: J2K
This commit is contained in:
+130
-154
@@ -14,218 +14,194 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.jetbrains.kotlin.idea.test;
|
package org.jetbrains.kotlin.idea.test
|
||||||
|
|
||||||
import com.intellij.openapi.application.ApplicationManager;
|
import com.intellij.openapi.application.ApplicationManager
|
||||||
import com.intellij.openapi.module.Module;
|
import com.intellij.openapi.module.Module
|
||||||
import com.intellij.openapi.projectRoots.Sdk;
|
import com.intellij.openapi.projectRoots.Sdk
|
||||||
import com.intellij.openapi.roots.*;
|
import com.intellij.openapi.roots.LibraryOrderEntry
|
||||||
import com.intellij.openapi.roots.impl.libraries.LibraryEx;
|
import com.intellij.openapi.roots.ModifiableRootModel
|
||||||
import com.intellij.openapi.roots.libraries.Library;
|
import com.intellij.openapi.roots.ModuleRootManager
|
||||||
import com.intellij.openapi.roots.ui.configuration.libraryEditor.NewLibraryEditor;
|
import com.intellij.openapi.roots.OrderRootType
|
||||||
import com.intellij.openapi.util.Computable;
|
import com.intellij.openapi.roots.impl.libraries.LibraryEx
|
||||||
import com.intellij.openapi.vfs.VfsUtil;
|
import com.intellij.openapi.roots.libraries.Library
|
||||||
import kotlin.jvm.functions.Function0;
|
import com.intellij.openapi.roots.ui.configuration.libraryEditor.NewLibraryEditor
|
||||||
import org.jetbrains.annotations.NotNull;
|
import com.intellij.openapi.util.Computable
|
||||||
import org.jetbrains.kotlin.idea.util.application.ApplicationUtilsKt;
|
import com.intellij.openapi.vfs.VfsUtil
|
||||||
import org.jetbrains.kotlin.test.InTextDirectivesUtils;
|
import org.jetbrains.kotlin.idea.util.application.runWriteAction
|
||||||
import org.jetbrains.kotlin.utils.PathUtil;
|
import org.jetbrains.kotlin.test.InTextDirectivesUtils
|
||||||
|
import org.jetbrains.kotlin.utils.PathUtil
|
||||||
import java.io.File;
|
import java.io.File
|
||||||
import java.util.ArrayList;
|
import java.util.*
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper for configuring kotlin runtime in tested project.
|
* Helper for configuring kotlin runtime in tested project.
|
||||||
*/
|
*/
|
||||||
public class ConfigLibraryUtil {
|
object ConfigLibraryUtil {
|
||||||
private static final String DEFAULT_JAVA_RUNTIME_LIB_NAME = "JAVA_RUNTIME_LIB_NAME";
|
private val DEFAULT_JAVA_RUNTIME_LIB_NAME = "JAVA_RUNTIME_LIB_NAME"
|
||||||
private static final String DEFAULT_KOTLIN_TEST_LIB_NAME = "KOTLIN_TEST_LIB_NAME";
|
private val DEFAULT_KOTLIN_TEST_LIB_NAME = "KOTLIN_TEST_LIB_NAME"
|
||||||
private static final String DEFAULT_KOTLIN_JS_STDLIB_NAME = "KOTLIN_JS_STDLIB_NAME";
|
private val DEFAULT_KOTLIN_JS_STDLIB_NAME = "KOTLIN_JS_STDLIB_NAME"
|
||||||
|
|
||||||
private ConfigLibraryUtil() {
|
private fun getKotlinRuntimeLibEditor(libName: String, library: File): NewLibraryEditor {
|
||||||
|
val editor = NewLibraryEditor()
|
||||||
|
editor.name = libName
|
||||||
|
editor.addRoot(VfsUtil.getUrlForLibraryRoot(library), OrderRootType.CLASSES)
|
||||||
|
|
||||||
|
return editor
|
||||||
}
|
}
|
||||||
|
|
||||||
private static NewLibraryEditor getKotlinRuntimeLibEditor(String libName, File library) {
|
fun configureKotlinRuntimeAndSdk(module: Module, sdk: Sdk) {
|
||||||
NewLibraryEditor editor = new NewLibraryEditor();
|
configureSdk(module, sdk)
|
||||||
editor.setName(libName);
|
configureKotlinRuntime(module)
|
||||||
editor.addRoot(VfsUtil.getUrlForLibraryRoot(library), OrderRootType.CLASSES);
|
|
||||||
|
|
||||||
return editor;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void configureKotlinRuntimeAndSdk(Module module, Sdk sdk) {
|
fun configureKotlinJsRuntimeAndSdk(module: Module, sdk: Sdk) {
|
||||||
configureSdk(module, sdk);
|
configureSdk(module, sdk)
|
||||||
configureKotlinRuntime(module);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void configureKotlinJsRuntimeAndSdk(Module module, Sdk sdk) {
|
|
||||||
configureSdk(module, sdk);
|
|
||||||
addLibrary(getKotlinRuntimeLibEditor(DEFAULT_KOTLIN_JS_STDLIB_NAME,
|
addLibrary(getKotlinRuntimeLibEditor(DEFAULT_KOTLIN_JS_STDLIB_NAME,
|
||||||
PathUtil.getKotlinPathsForDistDirectory().getJsStdLibJarPath()), module);
|
PathUtil.getKotlinPathsForDistDirectory().jsStdLibJarPath), module)
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void configureKotlinRuntime(Module module) {
|
fun configureKotlinRuntime(module: Module) {
|
||||||
addLibrary(getKotlinRuntimeLibEditor(DEFAULT_JAVA_RUNTIME_LIB_NAME, PathUtil.getKotlinPathsForDistDirectory().getStdlibPath()),
|
addLibrary(getKotlinRuntimeLibEditor(DEFAULT_JAVA_RUNTIME_LIB_NAME, PathUtil.getKotlinPathsForDistDirectory().stdlibPath),
|
||||||
module);
|
module)
|
||||||
addLibrary(getKotlinRuntimeLibEditor(DEFAULT_KOTLIN_TEST_LIB_NAME, PathUtil.getKotlinPathsForDistDirectory().getKotlinTestPath()),
|
addLibrary(getKotlinRuntimeLibEditor(DEFAULT_KOTLIN_TEST_LIB_NAME, PathUtil.getKotlinPathsForDistDirectory().kotlinTestPath),
|
||||||
module);
|
module)
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void unConfigureKotlinRuntime(Module module) {
|
fun unConfigureKotlinRuntime(module: Module) {
|
||||||
removeLibrary(module, DEFAULT_JAVA_RUNTIME_LIB_NAME);
|
removeLibrary(module, DEFAULT_JAVA_RUNTIME_LIB_NAME)
|
||||||
removeLibrary(module, DEFAULT_KOTLIN_TEST_LIB_NAME);
|
removeLibrary(module, DEFAULT_KOTLIN_TEST_LIB_NAME)
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void unConfigureKotlinRuntimeAndSdk(Module module, Sdk sdk) {
|
fun unConfigureKotlinRuntimeAndSdk(module: Module, sdk: Sdk) {
|
||||||
configureSdk(module, sdk);
|
configureSdk(module, sdk)
|
||||||
unConfigureKotlinRuntime(module);
|
unConfigureKotlinRuntime(module)
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void unConfigureKotlinJsRuntimeAndSdk(Module module, Sdk sdk) {
|
fun unConfigureKotlinJsRuntimeAndSdk(module: Module, sdk: Sdk) {
|
||||||
configureSdk(module, sdk);
|
configureSdk(module, sdk)
|
||||||
removeLibrary(module, DEFAULT_KOTLIN_JS_STDLIB_NAME);
|
removeLibrary(module, DEFAULT_KOTLIN_JS_STDLIB_NAME)
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void configureSdk(@NotNull final Module module, @NotNull final Sdk sdk) {
|
fun configureSdk(module: Module, sdk: Sdk) {
|
||||||
ApplicationManager.getApplication().runWriteAction(new Runnable() {
|
ApplicationManager.getApplication().runWriteAction {
|
||||||
@Override
|
val rootManager = ModuleRootManager.getInstance(module)
|
||||||
public void run() {
|
val rootModel = rootManager.modifiableModel
|
||||||
ModuleRootManager rootManager = ModuleRootManager.getInstance(module);
|
|
||||||
ModifiableRootModel rootModel = rootManager.getModifiableModel();
|
|
||||||
|
|
||||||
rootModel.setSdk(sdk);
|
rootModel.sdk = sdk
|
||||||
rootModel.commit();
|
rootModel.commit()
|
||||||
}
|
}
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Library addLibrary(final NewLibraryEditor editor, final Module module) {
|
fun addLibrary(editor: NewLibraryEditor, module: Module): Library {
|
||||||
return ApplicationManager.getApplication().runWriteAction(new Computable<Library>() {
|
return ApplicationManager.getApplication().runWriteAction(Computable {
|
||||||
@Override
|
val rootManager = ModuleRootManager.getInstance(module)
|
||||||
public Library compute() {
|
val model = rootManager.modifiableModel
|
||||||
ModuleRootManager rootManager = ModuleRootManager.getInstance(module);
|
|
||||||
ModifiableRootModel model = rootManager.getModifiableModel();
|
|
||||||
|
|
||||||
Library library = addLibrary(editor, model);
|
val library = addLibrary(editor, model)
|
||||||
|
|
||||||
model.commit();
|
model.commit()
|
||||||
|
|
||||||
return library;
|
library
|
||||||
}
|
})
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Library addLibrary(NewLibraryEditor editor, ModifiableRootModel model) {
|
fun addLibrary(editor: NewLibraryEditor, model: ModifiableRootModel): Library {
|
||||||
Library library = model.getModuleLibraryTable().createLibrary(editor.getName());
|
val library = model.moduleLibraryTable.createLibrary(editor.name)
|
||||||
|
|
||||||
Library.ModifiableModel libModel = library.getModifiableModel();
|
val libModel = library.modifiableModel
|
||||||
editor.applyTo((LibraryEx.ModifiableModelEx) libModel);
|
editor.applyTo(libModel as LibraryEx.ModifiableModelEx)
|
||||||
|
|
||||||
libModel.commit();
|
libModel.commit()
|
||||||
|
|
||||||
return library;
|
return library
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static boolean removeLibrary(@NotNull final Module module, @NotNull final String libraryName) {
|
fun removeLibrary(module: Module, libraryName: String): Boolean {
|
||||||
return ApplicationUtilsKt.runWriteAction(
|
return runWriteAction {
|
||||||
new Function0<Boolean>() {
|
var removed = false
|
||||||
@Override
|
|
||||||
public Boolean invoke() {
|
|
||||||
boolean removed = false;
|
|
||||||
|
|
||||||
ModuleRootManager rootManager = ModuleRootManager.getInstance(module);
|
val rootManager = ModuleRootManager.getInstance(module)
|
||||||
ModifiableRootModel model = rootManager.getModifiableModel();
|
val model = rootManager.modifiableModel
|
||||||
|
|
||||||
for (OrderEntry orderEntry : model.getOrderEntries()) {
|
for (orderEntry in model.orderEntries) {
|
||||||
if (orderEntry instanceof LibraryOrderEntry) {
|
if (orderEntry is LibraryOrderEntry) {
|
||||||
LibraryOrderEntry libraryOrderEntry = (LibraryOrderEntry) orderEntry;
|
|
||||||
|
|
||||||
Library library = libraryOrderEntry.getLibrary();
|
val library = orderEntry.library
|
||||||
if (library != null) {
|
if (library != null) {
|
||||||
String name = library.getName();
|
val name = library.name
|
||||||
if (name != null && name.equals(libraryName)) {
|
if (name != null && name == libraryName) {
|
||||||
|
|
||||||
// Dispose attached roots
|
// Dispose attached roots
|
||||||
Library.ModifiableModel modifiableModel = library.getModifiableModel();
|
val modifiableModel = library.modifiableModel
|
||||||
for (String rootUrl : library.getRootProvider().getUrls(OrderRootType.CLASSES)) {
|
for (rootUrl in library.rootProvider.getUrls(OrderRootType.CLASSES)) {
|
||||||
modifiableModel.removeRoot(rootUrl, OrderRootType.CLASSES);
|
modifiableModel.removeRoot(rootUrl, OrderRootType.CLASSES)
|
||||||
}
|
|
||||||
for (String rootUrl : library.getRootProvider().getUrls(OrderRootType.SOURCES)) {
|
|
||||||
modifiableModel.removeRoot(rootUrl, OrderRootType.SOURCES);
|
|
||||||
}
|
|
||||||
modifiableModel.commit();
|
|
||||||
|
|
||||||
model.getModuleLibraryTable().removeLibrary(library);
|
|
||||||
|
|
||||||
removed = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
for (rootUrl in library.rootProvider.getUrls(OrderRootType.SOURCES)) {
|
||||||
|
modifiableModel.removeRoot(rootUrl, OrderRootType.SOURCES)
|
||||||
|
}
|
||||||
|
modifiableModel.commit()
|
||||||
|
|
||||||
|
model.moduleLibraryTable.removeLibrary(library)
|
||||||
|
|
||||||
|
removed = true
|
||||||
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
model.commit();
|
|
||||||
|
|
||||||
return removed;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
}
|
||||||
}
|
|
||||||
|
|
||||||
public static void addLibrary(@NotNull Module module, @NotNull String libraryName, @NotNull String rootPath, @NotNull String[] jarPaths) {
|
model.commit()
|
||||||
NewLibraryEditor editor = new NewLibraryEditor();
|
|
||||||
editor.setName(libraryName);
|
|
||||||
for (String jarPath : jarPaths) {
|
|
||||||
editor.addRoot(VfsUtil.getUrlForLibraryRoot(new File(rootPath, jarPath)), OrderRootType.CLASSES);
|
|
||||||
}
|
|
||||||
|
|
||||||
addLibrary(editor, module);
|
removed
|
||||||
}
|
|
||||||
|
|
||||||
public static void configureLibraries(@NotNull Module module, String rootPath, List<String> libraryInfos) {
|
|
||||||
for (String libraryInfo : libraryInfos) {
|
|
||||||
int i = libraryInfo.indexOf('@');
|
|
||||||
String libraryName = libraryInfo.substring(0, i);
|
|
||||||
String[] jarPaths = libraryInfo.substring(i + 1).split(";");
|
|
||||||
addLibrary(module, libraryName, rootPath, jarPaths);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void unconfigureLibrariesByName(@NotNull Module module, List<String> libraryNames) {
|
fun addLibrary(module: Module, libraryName: String, rootPath: String, jarPaths: Array<String>) {
|
||||||
for (Iterator<String> iterator = libraryNames.iterator(); iterator.hasNext(); ) {
|
val editor = NewLibraryEditor()
|
||||||
String libraryName = iterator.next();
|
editor.name = libraryName
|
||||||
|
for (jarPath in jarPaths) {
|
||||||
|
editor.addRoot(VfsUtil.getUrlForLibraryRoot(File(rootPath, jarPath)), OrderRootType.CLASSES)
|
||||||
|
}
|
||||||
|
|
||||||
|
addLibrary(editor, module)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun configureLibraries(module: Module, rootPath: String, libraryInfos: List<String>) {
|
||||||
|
for (libraryInfo in libraryInfos) {
|
||||||
|
val i = libraryInfo.indexOf('@')
|
||||||
|
val libraryName = libraryInfo.substring(0, i)
|
||||||
|
val jarPaths = libraryInfo.substring(i + 1).split(";".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
|
||||||
|
addLibrary(module, libraryName, rootPath, jarPaths)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun unconfigureLibrariesByName(module: Module, libraryNames: MutableList<String>) {
|
||||||
|
val iterator = libraryNames.iterator()
|
||||||
|
while (iterator.hasNext()) {
|
||||||
|
val libraryName = iterator.next()
|
||||||
if (removeLibrary(module, libraryName)) {
|
if (removeLibrary(module, libraryName)) {
|
||||||
iterator.remove();
|
iterator.remove()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!libraryNames.isEmpty()) throw new AssertionError("Couldn't find the following libraries: " + libraryNames);
|
if (!libraryNames.isEmpty()) throw AssertionError("Couldn't find the following libraries: " + libraryNames)
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void unconfigureLibrariesByInfo(@NotNull Module module, List<String> libraryInfos) {
|
fun configureLibrariesByDirective(module: Module, rootPath: String, fileText: String) {
|
||||||
List<String> libraryNames = new ArrayList<String>();
|
configureLibraries(module, rootPath, InTextDirectivesUtils.findListWithPrefixes(fileText, "// CONFIGURE_LIBRARY: "))
|
||||||
for (String libraryInfo : libraryInfos) {
|
|
||||||
libraryNames.add(libraryInfo.substring(0, libraryInfo.indexOf('@')));
|
|
||||||
}
|
|
||||||
unconfigureLibrariesByName(module, libraryNames);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void configureLibrariesByDirective(@NotNull Module module, String rootPath, String fileText) {
|
fun unconfigureLibrariesByDirective(module: Module, fileText: String) {
|
||||||
configureLibraries(module, rootPath, InTextDirectivesUtils.findListWithPrefixes(fileText, "// CONFIGURE_LIBRARY: "));
|
val libraryNames = ArrayList<String>()
|
||||||
}
|
for (libInfo in InTextDirectivesUtils.findListWithPrefixes(fileText, "// CONFIGURE_LIBRARY: ")) {
|
||||||
|
libraryNames.add(libInfo.substring(0, libInfo.indexOf('@')))
|
||||||
public static void unconfigureLibrariesByDirective(@NotNull Module module, String fileText) {
|
|
||||||
List<String> libraryNames = new ArrayList<String>();
|
|
||||||
for (String libInfo : InTextDirectivesUtils.findListWithPrefixes(fileText, "// CONFIGURE_LIBRARY: ")) {
|
|
||||||
libraryNames.add(libInfo.substring(0, libInfo.indexOf('@')));
|
|
||||||
}
|
}
|
||||||
for (String libraryName : InTextDirectivesUtils.findListWithPrefixes(fileText, "// UNCONFIGURE_LIBRARY: ")) {
|
for (libraryName in InTextDirectivesUtils.findListWithPrefixes(fileText, "// UNCONFIGURE_LIBRARY: ")) {
|
||||||
libraryNames.add(libraryName);
|
libraryNames.add(libraryName)
|
||||||
}
|
}
|
||||||
|
|
||||||
unconfigureLibrariesByName(module, libraryNames);
|
unconfigureLibrariesByName(module, libraryNames)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -100,7 +100,7 @@ public abstract class AbstractJavaAgainstKotlinCheckerTest extends KotlinDaemonA
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (InTextDirectivesUtils.isDirectiveDefined(configFileText, "// WITH_RUNTIME")) {
|
if (InTextDirectivesUtils.isDirectiveDefined(configFileText, "// WITH_RUNTIME")) {
|
||||||
ConfigLibraryUtil.configureKotlinRuntime(module);
|
ConfigLibraryUtil.INSTANCE.configureKotlinRuntime(module);
|
||||||
}
|
}
|
||||||
|
|
||||||
List<String> languageLevelLines = InTextDirectivesUtils.findLinesWithPrefixesRemoved(configFileText, "// LANGUAGE_LEVEL");
|
List<String> languageLevelLines = InTextDirectivesUtils.findLinesWithPrefixesRemoved(configFileText, "// LANGUAGE_LEVEL");
|
||||||
|
|||||||
@@ -26,12 +26,12 @@ public abstract class KotlinHierarchyViewTestBase extends HierarchyViewTestBase
|
|||||||
protected void setUp() throws Exception {
|
protected void setUp() throws Exception {
|
||||||
VfsRootAccess.allowRootAccess(KotlinTestUtils.getHomeDirectory());
|
VfsRootAccess.allowRootAccess(KotlinTestUtils.getHomeDirectory());
|
||||||
super.setUp();
|
super.setUp();
|
||||||
ConfigLibraryUtil.configureKotlinRuntime(myModule);
|
ConfigLibraryUtil.INSTANCE.configureKotlinRuntime(myModule);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void tearDown() throws Exception {
|
protected void tearDown() throws Exception {
|
||||||
ConfigLibraryUtil.unConfigureKotlinRuntime(myModule);
|
ConfigLibraryUtil.INSTANCE.unConfigureKotlinRuntime(myModule);
|
||||||
super.tearDown();
|
super.tearDown();
|
||||||
VfsRootAccess.disallowRootAccess(KotlinTestUtils.getHomeDirectory());
|
VfsRootAccess.disallowRootAccess(KotlinTestUtils.getHomeDirectory());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -205,7 +205,7 @@ public abstract class KotlinDebuggerTestCase extends DescriptorTestCase {
|
|||||||
customLibEditor.addRoot(VfsUtil.getUrlForLibraryRoot(classes), OrderRootType.CLASSES);
|
customLibEditor.addRoot(VfsUtil.getUrlForLibraryRoot(classes), OrderRootType.CLASSES);
|
||||||
customLibEditor.addRoot(VfsUtil.getUrlForLibraryRoot(sources), OrderRootType.SOURCES);
|
customLibEditor.addRoot(VfsUtil.getUrlForLibraryRoot(sources), OrderRootType.SOURCES);
|
||||||
|
|
||||||
ConfigLibraryUtil.addLibrary(customLibEditor, model);
|
ConfigLibraryUtil.INSTANCE.addLibrary(customLibEditor, model);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -215,8 +215,8 @@ public abstract class KotlinDebuggerTestCase extends DescriptorTestCase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
EdtTestUtil.runInEdtAndWait(() -> {
|
EdtTestUtil.runInEdtAndWait(() -> {
|
||||||
ConfigLibraryUtil.removeLibrary(getModule(), CUSTOM_LIBRARY_NAME);
|
ConfigLibraryUtil.INSTANCE.removeLibrary(getModule(), CUSTOM_LIBRARY_NAME);
|
||||||
ConfigLibraryUtil.removeLibrary(getModule(), KOTLIN_LIBRARY_NAME);
|
ConfigLibraryUtil.INSTANCE.removeLibrary(getModule(), KOTLIN_LIBRARY_NAME);
|
||||||
});
|
});
|
||||||
|
|
||||||
super.tearDown();
|
super.tearDown();
|
||||||
|
|||||||
Reference in New Issue
Block a user