Create KotlinCoreEnvironment a bit later in tests

Before this change, diagnostic tests with Java source files failed
because KotlinCoreEnvironment was being created in the test's setUp,
even before the test data file has been split into .java/.kt and the
resulting .java files have been copied to a temporary directory. In
KotlinCoreEnvironment's constructor, we now inspect all roots for
module-info files, which involves calling VirtualFile.getChildren on all
roots in the configuration. CoreLocalVirtualFile.getChildren is
cached on the first access, and so because the temporary directory with
.java files was empty at this point, the VirtualFile for that directory
returned empty array in getChildren later in the test, resulting in
unresolved reference errors.

This is fixed by creating the environment _after_ the .java files have
been copied to a temporary directory. Note that slow assertions for
flexible types are now enabled in KtUsefulTestCase instead of
KotlinTestWithEnvironmentManagement, because BaseDiagnosticsTest no
longer inherits from the latter
This commit is contained in:
Alexander Udalov
2017-06-22 16:22:34 +03:00
parent 03d83db660
commit 9274d963aa
9 changed files with 70 additions and 57 deletions
@@ -24,22 +24,11 @@ import org.jetbrains.kotlin.codegen.CodegenTestUtil
import org.jetbrains.kotlin.codegen.extensions.ClassBuilderInterceptorExtension
import org.jetbrains.kotlin.diagnostics.DiagnosticSink
import org.jetbrains.kotlin.resolve.jvm.extensions.AnalysisHandlerExtension
import org.jetbrains.kotlin.test.ConfigurationKind
import org.jetbrains.kotlin.test.KotlinTestUtils
import org.jetbrains.kotlin.test.KotlinTestWithEnvironment
import org.jetbrains.kotlin.test.TestJdkKind
import org.jetbrains.kotlin.test.*
import java.io.File
import java.io.StringWriter
import kotlin.properties.Delegates
abstract class AbstractAnnotationProcessorBoxTest : KotlinTestWithEnvironment() {
private var javaSourceRoot: File by Delegates.notNull()
override fun setUp() {
javaSourceRoot = KotlinTestUtils.tmpDir("java-files")
super.setUp()
}
abstract class AbstractAnnotationProcessorBoxTest : KotlinTestWithEnvironmentManagement() {
fun doTest(path: String) {
val testDir = File(path)
@@ -53,9 +42,19 @@ abstract class AbstractAnnotationProcessorBoxTest : KotlinTestWithEnvironment()
val supportStubs = testName.contains("stubs", ignoreCase = true)
val javaFiles = filesByExtension("java")
if (javaFiles.isNotEmpty()) {
javaFiles.forEach { it.copyTo(File(javaSourceRoot, it.name)) }
}
val javaSourceRoot =
if (javaFiles.isNotEmpty()) {
KotlinTestUtils.tmpDir("java-files").also { javaSourceRoot ->
javaFiles.forEach { javaFile -> javaFile.copyTo(File(javaSourceRoot, javaFile.name)) }
}
}
else null
val configuration = KotlinTestUtils.newConfiguration(
ConfigurationKind.ALL, TestJdkKind.MOCK_JDK, listOf(KotlinTestUtils.getAnnotationsJar()), listOfNotNull(javaSourceRoot)
)
val environment = KotlinCoreEnvironment.createForTests(testRootDisposable, configuration, EnvironmentConfigFiles.JVM_CONFIG_FILES)
val project = environment.project
val collectorExtension = AnnotationCollectorExtensionForTests(supportInheritedAnnotations)
ClassBuilderInterceptorExtension.registerExtension(project, collectorExtension)
@@ -76,13 +75,6 @@ abstract class AbstractAnnotationProcessorBoxTest : KotlinTestWithEnvironment()
KotlinTestUtils.assertEqualsToFile(expectedAnnotationsFile, actualAnnotations)
}
override fun createEnvironment(): KotlinCoreEnvironment {
val configuration = KotlinTestUtils.newConfiguration(
ConfigurationKind.ALL, TestJdkKind.MOCK_JDK, listOf(KotlinTestUtils.getAnnotationsJar()), listOf(javaSourceRoot)
)
return KotlinCoreEnvironment.createForTests(testRootDisposable, configuration, EnvironmentConfigFiles.JVM_CONFIG_FILES)
}
private class AnnotationCollectorExtensionForTests(
supportInheritedAnnotations: Boolean
) : AnnotationCollectorExtensionBase(supportInheritedAnnotations) {