diff --git a/idea/tests/org/jetbrains/jet/plugin/JdkAndMockLibraryProjectDescriptor.java b/idea/tests/org/jetbrains/jet/plugin/JdkAndMockLibraryProjectDescriptor.java index 95bc50a31b1..49282ca6d2d 100644 --- a/idea/tests/org/jetbrains/jet/plugin/JdkAndMockLibraryProjectDescriptor.java +++ b/idea/tests/org/jetbrains/jet/plugin/JdkAndMockLibraryProjectDescriptor.java @@ -1,35 +1,13 @@ package org.jetbrains.jet.plugin; -import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.module.Module; import com.intellij.openapi.roots.ContentEntry; import com.intellij.openapi.roots.ModifiableRootModel; import com.intellij.openapi.roots.OrderRootType; import com.intellij.openapi.roots.libraries.Library; -import com.intellij.openapi.util.ThrowableComputable; -import com.intellij.openapi.util.io.FileUtil; -import com.intellij.openapi.vfs.LocalFileSystem; -import com.intellij.openapi.vfs.VfsUtilCore; -import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.openapi.vfs.VirtualFileVisitor; -import com.intellij.openapi.vfs.newvfs.NewVirtualFile; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.JetTestUtils; -import org.jetbrains.jet.cli.common.ExitCode; -import org.jetbrains.jet.cli.jvm.K2JVMCompiler; -import org.jetbrains.jet.utils.ExceptionUtils; -import org.jetbrains.jet.utils.PathUtil; +import com.intellij.openapi.util.io.FileUtilRt; -import java.io.ByteArrayOutputStream; import java.io.File; -import java.io.IOException; -import java.io.PrintStream; -import java.lang.reflect.Method; -import java.net.URL; -import java.net.URLClassLoader; - -import static junit.framework.Assert.assertEquals; -import static junit.framework.Assert.assertNotNull; public class JdkAndMockLibraryProjectDescriptor extends JetLightProjectDescriptor { private final String sourcesPath; @@ -42,76 +20,15 @@ public class JdkAndMockLibraryProjectDescriptor extends JetLightProjectDescripto @Override public void configureModule(Module module, ModifiableRootModel model, ContentEntry contentEntry) { - try { - File compiledDir = compileTestLibrary(sourcesPath); + File libraryJar = MockLibraryUtil.compileLibraryToJar(sourcesPath); + String jarUrl = "jar://" + FileUtilRt.toSystemIndependentName(libraryJar.getAbsolutePath()) + "!/"; - final VirtualFile baseDir = module.getProject().getBaseDir(); - assertNotNull(baseDir); - - VirtualFile libraryDir = ApplicationManager.getApplication().runWriteAction(new ThrowableComputable() { - @Override - public VirtualFile compute() throws IOException { - VirtualFile libraryDir = baseDir.createChildDirectory(this, "lib"); - baseDir.createChildDirectory(this, "src"); - return libraryDir; - } - }); - - VirtualFile testDataDir = LocalFileSystem.getInstance().findFileByPath(sourcesPath).getParent(); - assertNotNull(testDataDir); - VfsUtilCore.visitChildrenRecursively(testDataDir, new VirtualFileVisitor() { - @Override - public boolean visitFile(@NotNull VirtualFile file) { - file.getChildren(); - file.refresh(false, true); - return true; - } - }); - VirtualFile librarySourceDir = LocalFileSystem.getInstance().findFileByPath(sourcesPath); - assertNotNull(librarySourceDir); - - FileUtil.copyDir(compiledDir, new File(libraryDir.getPath())); - - ((NewVirtualFile)baseDir).markDirtyRecursively(); - baseDir.refresh(false, true); - - Library.ModifiableModel libraryModel = model.getModuleLibraryTable().getModifiableModel().createLibrary("myKotlinLib").getModifiableModel(); - libraryModel.addRoot(libraryDir, OrderRootType.CLASSES); - if (withSources) { - libraryModel.addRoot(librarySourceDir, OrderRootType.SOURCES); - } - libraryModel.commit(); - } - catch (IOException e) { - throw new AssertionError(e); - } - } - - private static File compileTestLibrary(String sourcesPath) { - try { - File compiledDir = JetTestUtils.tmpDir("dummylib"); - - ByteArrayOutputStream outStream = new ByteArrayOutputStream(); - - File kotlinCompilerJar = new File(PathUtil.getKotlinPathsForDistDirectory().getLibPath(), "kotlin-compiler.jar"); - URLClassLoader classLoader = new URLClassLoader(new URL[] {kotlinCompilerJar.toURI().toURL()}, Object.class.getClassLoader()); - - Class compilerClass = classLoader.loadClass(K2JVMCompiler.class.getName()); - Object compilerObject = compilerClass.newInstance(); - Method execMethod = compilerClass.getMethod("exec", PrintStream.class, String[].class); - - //noinspection IOResourceOpenedButNotSafelyClosed - Enum invocationResult = (Enum) execMethod - .invoke(compilerObject, new PrintStream(outStream), - new String[] {"-src", sourcesPath, "-output", compiledDir.getAbsolutePath()}); - - assertEquals(new String(outStream.toByteArray()), ExitCode.OK.name(), invocationResult.name()); - - return compiledDir; - } - catch (Throwable e) { - throw ExceptionUtils.rethrow(e); + Library.ModifiableModel libraryModel = model.getModuleLibraryTable().getModifiableModel().createLibrary("myKotlinLib").getModifiableModel(); + libraryModel.addRoot(jarUrl, OrderRootType.CLASSES); + if (withSources) { + libraryModel.addRoot(jarUrl + "src/", OrderRootType.SOURCES); } + libraryModel.commit(); } diff --git a/idea/tests/org/jetbrains/jet/plugin/MockLibraryUtil.java b/idea/tests/org/jetbrains/jet/plugin/MockLibraryUtil.java new file mode 100644 index 00000000000..e8de8dffb02 --- /dev/null +++ b/idea/tests/org/jetbrains/jet/plugin/MockLibraryUtil.java @@ -0,0 +1,65 @@ +package org.jetbrains.jet.plugin; + +import com.intellij.util.io.ZipUtil; +import org.jetbrains.jet.JetTestUtils; +import org.jetbrains.jet.cli.common.ExitCode; +import org.jetbrains.jet.cli.jvm.K2JVMCompiler; +import org.jetbrains.jet.utils.ExceptionUtils; +import org.jetbrains.jet.utils.PathUtil; + +import java.io.*; +import java.lang.reflect.Method; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.zip.ZipOutputStream; + +import static junit.framework.Assert.assertEquals; + +public class MockLibraryUtil { + public static File compileLibraryToJar(String sourcesPath) { + try { + File contentDir = JetTestUtils.tmpDir("lib-content"); + + File classesDir = new File(contentDir, "classes"); + compile(sourcesPath, classesDir); + + File jarFile = new File(contentDir, "library.jar"); + + ZipOutputStream zip = new ZipOutputStream(new FileOutputStream(jarFile)); + ZipUtil.addDirToZipRecursively(zip, jarFile, classesDir, "", null, null); + ZipUtil.addDirToZipRecursively(zip, jarFile, new File(sourcesPath), "src", null, null); + zip.close(); + + return jarFile; + } + catch (IOException e) { + throw ExceptionUtils.rethrow(e); + } + } + + private static void compile(String sourcesPath, File outDir) { + try { + ByteArrayOutputStream outStream = new ByteArrayOutputStream(); + + File kotlinCompilerJar = new File(PathUtil.getKotlinPathsForDistDirectory().getLibPath(), "kotlin-compiler.jar"); + URLClassLoader classLoader = new URLClassLoader(new URL[] {kotlinCompilerJar.toURI().toURL()}, Object.class.getClassLoader()); + + Class compilerClass = classLoader.loadClass(K2JVMCompiler.class.getName()); + Object compilerObject = compilerClass.newInstance(); + Method execMethod = compilerClass.getMethod("exec", PrintStream.class, String[].class); + + //noinspection IOResourceOpenedButNotSafelyClosed + Enum invocationResult = (Enum) execMethod + .invoke(compilerObject, new PrintStream(outStream), + new String[] {"-src", sourcesPath, "-output", outDir.getAbsolutePath()}); + + assertEquals(new String(outStream.toByteArray()), ExitCode.OK.name(), invocationResult.name()); + } + catch (Throwable e) { + throw ExceptionUtils.rethrow(e); + } + } + + private MockLibraryUtil() { + } +}