Compile logic moved from AbstractBlackBoxCodegenTest to CodegenTestCase

This commit is contained in:
Mikhael Bogdanov
2016-05-18 16:25:11 +03:00
parent dce260563c
commit 5d5734841b
2 changed files with 45 additions and 44 deletions
@@ -19,15 +19,9 @@ package org.jetbrains.kotlin.codegen;
import com.intellij.ide.highlighter.JavaFileType; import com.intellij.ide.highlighter.JavaFileType;
import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.io.FileUtil;
import com.intellij.util.Processor; import com.intellij.util.Processor;
import kotlin.collections.ArraysKt;
import kotlin.io.FilesKt; import kotlin.io.FilesKt;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.cli.common.output.outputUtils.OutputUtilsKt;
import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles;
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment;
import org.jetbrains.kotlin.cli.jvm.config.JvmContentRootsKt;
import org.jetbrains.kotlin.config.CompilerConfiguration;
import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil; import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil;
import org.jetbrains.kotlin.psi.KtDeclaration; import org.jetbrains.kotlin.psi.KtDeclaration;
import org.jetbrains.kotlin.psi.KtFile; import org.jetbrains.kotlin.psi.KtFile;
@@ -35,19 +29,14 @@ import org.jetbrains.kotlin.psi.KtNamedFunction;
import org.jetbrains.kotlin.psi.KtProperty; import org.jetbrains.kotlin.psi.KtProperty;
import org.jetbrains.kotlin.test.ConfigurationKind; import org.jetbrains.kotlin.test.ConfigurationKind;
import org.jetbrains.kotlin.test.InTextDirectivesUtils; import org.jetbrains.kotlin.test.InTextDirectivesUtils;
import org.jetbrains.kotlin.test.KotlinTestUtils;
import org.jetbrains.kotlin.test.TestJdkKind; import org.jetbrains.kotlin.test.TestJdkKind;
import org.jetbrains.kotlin.utils.ExceptionUtilsKt; import org.jetbrains.kotlin.utils.ExceptionUtilsKt;
import java.io.File; import java.io.File;
import java.io.IOException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;
import static org.jetbrains.kotlin.test.KotlinTestUtils.getAnnotationsJar;
public abstract class AbstractBlackBoxCodegenTest extends CodegenTestCase { public abstract class AbstractBlackBoxCodegenTest extends CodegenTestCase {
private boolean addRuntime = false; private boolean addRuntime = false;
private boolean addReflect = false; private boolean addReflect = false;
@@ -83,39 +72,7 @@ public abstract class AbstractBlackBoxCodegenTest extends CodegenTestCase {
@NotNull TestJdkKind jdkKind, @NotNull TestJdkKind jdkKind,
@NotNull List<String> javacOptions @NotNull List<String> javacOptions
) { ) {
CompilerConfiguration configuration = createConfiguration( compile(files, javaSourceDir, configurationKind, jdkKind, javacOptions);
configurationKind, jdkKind,
Collections.singletonList(getAnnotationsJar()),
ArraysKt.filterNotNull(new File[] {javaSourceDir}),
files
);
myEnvironment = KotlinCoreEnvironment.createForTests(
getTestRootDisposable(), configuration, EnvironmentConfigFiles.JVM_CONFIG_FILES
);
loadMultiFiles(files);
classFileFactory = GenerationUtils.compileFiles(myFiles.getPsiFiles(), myEnvironment).getFactory();
if (javaSourceDir != null) {
// If there are Java files, they should be compiled against the class files produced by Kotlin, so we dump them to the disk
File kotlinOut;
try {
kotlinOut = KotlinTestUtils.tmpDir(toString());
}
catch (IOException e) {
throw ExceptionUtilsKt.rethrow(e);
}
OutputUtilsKt.writeAllTo(classFileFactory, kotlinOut);
File output = CodegenTestUtil.compileJava(
findJavaSourcesInDirectory(javaSourceDir), Collections.singletonList(kotlinOut.getPath()), javacOptions
);
// Add javac output to classpath so that the created class loader can find generated Java classes
JvmContentRootsKt.addJvmClasspathRoot(configuration, output);
}
blackBox(); blackBox();
} }
@@ -30,6 +30,7 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.backend.common.output.OutputFile; import org.jetbrains.kotlin.backend.common.output.OutputFile;
import org.jetbrains.kotlin.checkers.CheckerTestUtil; import org.jetbrains.kotlin.checkers.CheckerTestUtil;
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys; import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys;
import org.jetbrains.kotlin.cli.common.output.outputUtils.OutputUtilsKt;
import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles; import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles;
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment; import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment;
import org.jetbrains.kotlin.cli.jvm.config.JvmContentRootsKt; import org.jetbrains.kotlin.cli.jvm.config.JvmContentRootsKt;
@@ -71,6 +72,7 @@ import java.util.Map;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import static org.jetbrains.kotlin.codegen.AbstractBlackBoxCodegenTest.findJavaSourcesInDirectory;
import static org.jetbrains.kotlin.codegen.CodegenTestUtil.*; import static org.jetbrains.kotlin.codegen.CodegenTestUtil.*;
import static org.jetbrains.kotlin.test.KotlinTestUtils.getAnnotationsJar; import static org.jetbrains.kotlin.test.KotlinTestUtils.getAnnotationsJar;
@@ -461,6 +463,48 @@ public abstract class CodegenTestCase extends KtUsefulTestCase {
} }
} }
protected void compile(
@NotNull List<TestFile> files,
@Nullable File javaSourceDir,
@NotNull ConfigurationKind configurationKind,
@NotNull TestJdkKind jdkKind,
@NotNull List<String> javacOptions
) {
CompilerConfiguration configuration = createConfiguration(
configurationKind, jdkKind,
Collections.singletonList(getAnnotationsJar()),
ArraysKt.filterNotNull(new File[] {javaSourceDir}),
files
);
myEnvironment = KotlinCoreEnvironment.createForTests(
getTestRootDisposable(), configuration, EnvironmentConfigFiles.JVM_CONFIG_FILES
);
loadMultiFiles(files);
classFileFactory = GenerationUtils.compileFiles(myFiles.getPsiFiles(), myEnvironment).getFactory();
if (javaSourceDir != null) {
// If there are Java files, they should be compiled against the class files produced by Kotlin, so we dump them to the disk
File kotlinOut;
try {
kotlinOut = KotlinTestUtils.tmpDir(toString());
}
catch (IOException e) {
throw ExceptionUtilsKt.rethrow(e);
}
OutputUtilsKt.writeAllTo(classFileFactory, kotlinOut);
File output = CodegenTestUtil.compileJava(
findJavaSourcesInDirectory(javaSourceDir), Collections.singletonList(kotlinOut.getPath()), javacOptions
);
// Add javac output to classpath so that the created class loader can find generated Java classes
JvmContentRootsKt.addJvmClasspathRoot(configuration, output);
}
}
public static class TestFile implements Comparable<TestFile> { public static class TestFile implements Comparable<TestFile> {
public final String name; public final String name;
public final String content; public final String content;