Packing mock library to jar to avoid VFS magic.
This commit is contained in:
committed by
Pavel V. Talanov
parent
dd4939a5ec
commit
42a6543c25
@@ -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<VirtualFile, IOException>() {
|
||||
@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();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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() {
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user