diff --git a/compiler/cli/src/org/jetbrains/jet/cli/jvm/repl/ReplClassLoader.java b/compiler/cli/src/org/jetbrains/jet/cli/jvm/repl/ReplClassLoader.java index 7f8a9a88971..ca5d957fdc2 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/jvm/repl/ReplClassLoader.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/jvm/repl/ReplClassLoader.java @@ -32,6 +32,13 @@ public class ReplClassLoader extends ClassLoader { private Map classes = Maps.newLinkedHashMap(); + public ReplClassLoader(@NotNull ClassLoader parent) { + super(parent); + } + + public ReplClassLoader() { + } + @Override protected Class findClass(String name) throws ClassNotFoundException { byte[] classBytes = classes.get(JvmClassName.byFqNameWithoutInnerClasses(name)); diff --git a/compiler/cli/src/org/jetbrains/jet/cli/jvm/repl/ReplInterpreter.java b/compiler/cli/src/org/jetbrains/jet/cli/jvm/repl/ReplInterpreter.java index 145fbd2588d..342b4a69457 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/jvm/repl/ReplInterpreter.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/jvm/repl/ReplInterpreter.java @@ -58,9 +58,12 @@ import org.jetbrains.jet.plugin.JetLanguage; import org.jetbrains.jet.utils.ExceptionUtils; import org.jetbrains.jet.utils.Progress; +import java.io.File; import java.io.PrintWriter; import java.lang.reflect.Constructor; import java.lang.reflect.Field; +import java.net.URL; +import java.net.URLClassLoader; import java.util.Collections; import java.util.List; @@ -73,7 +76,7 @@ public class ReplInterpreter { @Nullable private JetScope lastLineScope; private List earlierLines = Lists.newArrayList(); - private final ReplClassLoader classLoader = new ReplClassLoader(); + private final ReplClassLoader classLoader; @NotNull private final InjectorForTopDownAnalyzerForJvm injector; @@ -84,7 +87,8 @@ public class ReplInterpreter { @NotNull private final ModuleDescriptor module; - public ReplInterpreter(@NotNull Disposable disposable, @NotNull CompilerDependencies compilerDependencies) { + public ReplInterpreter(@NotNull Disposable disposable, @NotNull CompilerDependencies compilerDependencies, @NotNull List extraClasspath) { + // TODO: add extraClasspath to jetCoreEnvironment jetCoreEnvironment = new JetCoreEnvironment(disposable, compilerDependencies); Project project = jetCoreEnvironment.getProject(); trace = new BindingTraceContext(); @@ -95,6 +99,21 @@ public class ReplInterpreter { true, Collections.emptyList()); injector = new InjectorForTopDownAnalyzerForJvm(project, topDownAnalysisParameters, trace, module, compilerDependencies); + + if (extraClasspath.size() > 0) { + URL[] urls = new URL[extraClasspath.size()]; + for (int i = 0; i < extraClasspath.size(); ++i) { + try { + urls[i] = extraClasspath.get(i).toURI().toURL(); + } catch (Exception e) { + throw ExceptionUtils.rethrow(e); + } + } + classLoader = new ReplClassLoader(new URLClassLoader(urls)); + } + else { + classLoader = new ReplClassLoader(); + } } public Object eval(@NotNull String line) { diff --git a/compiler/tests/org/jetbrains/jet/repl/ReplInterpreterTest.java b/compiler/tests/org/jetbrains/jet/repl/ReplInterpreterTest.java index 4d37a25ed7b..e72db4a2b56 100644 --- a/compiler/tests/org/jetbrains/jet/repl/ReplInterpreterTest.java +++ b/compiler/tests/org/jetbrains/jet/repl/ReplInterpreterTest.java @@ -29,6 +29,7 @@ import org.junit.Assert; import org.junit.Test; import java.io.File; +import java.util.Collections; /** * @author Stepan Koltsov @@ -52,7 +53,7 @@ public class ReplInterpreterTest { private void testFile(@NotNull String relativePath) { CompilerDependencies compilerDependencies = CompileCompilerDependenciesTest.compilerDependenciesForTests(CompilerSpecialMode.JDK_HEADERS, false); - ReplInterpreter repl = new ReplInterpreter(disposable, compilerDependencies); + ReplInterpreter repl = new ReplInterpreter(disposable, compilerDependencies, Collections.singletonList(new File("out/production/runtime"))); ReplSessionTestFile file = ReplSessionTestFile.load(new File("compiler/testData/repl/" + relativePath)); for (Pair t : file.getLines()) { @@ -76,7 +77,6 @@ public class ReplInterpreterTest { testFile("simple.repl"); } - /* @Test public void function() { testFile("function.repl"); @@ -86,7 +86,6 @@ public class ReplInterpreterTest { public void functionReferencesPrev() { testFile("functionReferencesPrev.repl"); } - */ }