diff --git a/compiler/cli/src/org/jetbrains/jet/compiler/CompileEnvironment.java b/compiler/cli/src/org/jetbrains/jet/compiler/CompileEnvironment.java index 9748cec343f..95ba252fc8d 100644 --- a/compiler/cli/src/org/jetbrains/jet/compiler/CompileEnvironment.java +++ b/compiler/cli/src/org/jetbrains/jet/compiler/CompileEnvironment.java @@ -22,6 +22,8 @@ import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.io.FileUtil; import com.intellij.psi.JavaPsiFacade; import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.testFramework.LightVirtualFile; +import com.intellij.util.LocalTimeCounter; import com.intellij.util.Processor; import jet.modules.AllModules; import jet.modules.Module; @@ -32,6 +34,7 @@ import org.jetbrains.jet.codegen.GeneratedClassLoader; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetPsiUtil; import org.jetbrains.jet.lang.resolve.java.JvmAbi; +import org.jetbrains.jet.plugin.JetLanguage; import org.jetbrains.jet.plugin.JetMainDetector; import org.jetbrains.jet.plugin.compiler.PathUtil; @@ -332,6 +335,18 @@ public class CompileEnvironment { } } + public ClassLoader compileText(String code) { + CompileSession session = new CompileSession(myEnvironment, myFileNameTransformer); + session.addSources(new LightVirtualFile("script" + LocalTimeCounter.currentTime() + ".kt", JetLanguage.INSTANCE, code)); + + if (!session.analyze(myErrorStream) && !ignoreErrors) { + return null; + } + + ClassFileFactory factory = session.generate(); + return new GeneratedClassLoader(factory); + } + public boolean compileBunchOfSources(String sourceFileOrDir, String jar, String outputDir, boolean includeRuntime) { CompileSession session = new CompileSession(myEnvironment, myFileNameTransformer); session.addSources(sourceFileOrDir); diff --git a/compiler/cli/src/org/jetbrains/jet/compiler/JetCoreEnvironment.java b/compiler/cli/src/org/jetbrains/jet/compiler/JetCoreEnvironment.java index a101157b641..1c899a1c953 100644 --- a/compiler/cli/src/org/jetbrains/jet/compiler/JetCoreEnvironment.java +++ b/compiler/cli/src/org/jetbrains/jet/compiler/JetCoreEnvironment.java @@ -26,6 +26,9 @@ import org.jetbrains.jet.lang.types.JetStandardLibrary; import org.jetbrains.jet.plugin.JetFileType; import org.jetbrains.jet.plugin.compiler.PathUtil; +import java.io.File; +import java.net.URL; +import java.net.URLClassLoader; import java.util.ArrayList; import java.util.List; @@ -68,4 +71,18 @@ public class JetCoreEnvironment extends JavaCoreEnvironment { public void setCompilerPlugins(List compilerPlugins) { this.compilerPlugins = compilerPlugins; } + + public void addToClasspathFromClassLoader(ClassLoader loader) { + ClassLoader parent = loader.getParent(); + if(parent != null) + addToClasspathFromClassLoader(parent); + + if(loader instanceof URLClassLoader) { + for (URL url : ((URLClassLoader) loader).getURLs()) { + File file = new File(url.getPath()); + if(!file.isFile() || file.getPath().endsWith(".jar")) + addToClasspath(file); + } + } + } } diff --git a/compiler/tests/org/jetbrains/jet/codegen/CodegenTestCase.java b/compiler/tests/org/jetbrains/jet/codegen/CodegenTestCase.java index e0a828624fb..73b78acc40c 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/CodegenTestCase.java +++ b/compiler/tests/org/jetbrains/jet/codegen/CodegenTestCase.java @@ -223,18 +223,4 @@ public abstract class CodegenTestCase extends JetLiteFixture { return loadClass(name, codegens); } - private static class MyClassLoader extends ClassLoader { - public MyClassLoader(ClassLoader parent) { - super(parent); - } - - public Class doDefineClass(String name, byte[] data) { - return defineClass(name, data, 0, data.length); - } - - @Override - public Class loadClass(String name) throws ClassNotFoundException { - return super.loadClass(name); - } - } } diff --git a/compiler/tests/org/jetbrains/jet/codegen/CompileTextTest.java b/compiler/tests/org/jetbrains/jet/codegen/CompileTextTest.java new file mode 100644 index 00000000000..bc6961313e5 --- /dev/null +++ b/compiler/tests/org/jetbrains/jet/codegen/CompileTextTest.java @@ -0,0 +1,36 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.codegen; + +import junit.framework.TestCase; +import org.jetbrains.jet.compiler.CompileEnvironment; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +public class CompileTextTest extends CodegenTestCase { + public void testMe() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException { + String text = "import org.jetbrains.jet.codegen.CompileTextTest; fun x() = CompileTextTest()"; + CompileEnvironment compileEnvironment = new CompileEnvironment(); + compileEnvironment.getMyEnvironment().addToClasspathFromClassLoader(getClass().getClassLoader()); + ClassLoader classLoader = compileEnvironment.compileText(text); + Class namespace = classLoader.loadClass("namespace"); + Method x = namespace.getDeclaredMethod("x"); + Object invoke = x.invoke(null); + assertTrue(invoke instanceof CompileTextTest); + } +}