generate bytecode for script

It is just prototype

* does not make top level symbols visible as class members yet
* does not take parameters
* Script class name is hardcoded now
This commit is contained in:
Stepan Koltsov
2012-05-23 02:52:29 +04:00
parent d6bf8876a3
commit f4051f45ab
16 changed files with 227 additions and 15 deletions
@@ -16,6 +16,7 @@
package org.jetbrains.jet.codegen;
import com.google.common.base.Objects;
import com.google.common.collect.Lists;
import com.intellij.testFramework.UsefulTestCase;
import org.jetbrains.annotations.NotNull;
@@ -33,6 +34,7 @@ import org.jetbrains.jet.parsing.JetParsingTest;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
@@ -40,6 +42,8 @@ import java.net.URL;
import java.net.URLClassLoader;
import java.util.Collections;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author yole
@@ -123,8 +127,10 @@ public abstract class CodegenTestCase extends UsefulTestCase {
}
protected void blackBoxFile(String filename) {
loadFile(filename);
String actual;
String content = loadFile(filename);
Matcher matcher = Pattern.compile("// expected: (.*)").matcher(content);
String expectedValue = matcher.find() ? matcher.group(1) : "OK";
Object actual;
try {
actual = blackBox();
} catch (NoClassDefFoundError e) {
@@ -134,21 +140,32 @@ public abstract class CodegenTestCase extends UsefulTestCase {
System.out.println(generateToText());
throw new RuntimeException(e);
}
if (!"OK".equals(actual)) {
if (!Objects.equal(expectedValue, actual)) {
System.out.println(generateToText());
}
assertEquals("OK", actual);
assertEquals(expectedValue, actual);
}
@NotNull
protected String blackBox() throws Exception {
ClassFileFactory codegens = generateClassesInFile();
GeneratedClassLoader loader = createClassLoader(codegens);
try {
String fqName = NamespaceCodegen.getJVMClassNameForKotlinNs(JetPsiUtil.getFQName(myFile)).getFqName().getFqName();
Class<?> namespaceClass = loader.loadClass(fqName);
Method method = namespaceClass.getMethod("box");
return (String) method.invoke(null);
if (myFile.isScript()) {
Class<?> scriptClass = loader.loadClass("Script");
Object scriptInstance = scriptClass.newInstance();
Field field = scriptClass.getDeclaredField("rv");
field.setAccessible(true);
Object result = field.get(scriptInstance);
return result != null ? result.toString() : "null";
}
else {
String fqName = NamespaceCodegen.getJVMClassNameForKotlinNs(JetPsiUtil.getFQName(myFile)).getFqName().getFqName();
Class<?> namespaceClass = loader.loadClass(fqName);
Method method = namespaceClass.getMethod("box");
return (String) method.invoke(null);
}
} finally {
loader.dispose();
}