Adjust tests for JSR305 annotations being extracted

See the previous commits
This commit is contained in:
Denis.Zharkov
2023-02-24 18:45:54 +01:00
committed by Space Team
parent c86c96f5e5
commit 13febaf978
4 changed files with 66 additions and 11 deletions
@@ -60,8 +60,18 @@ abstract class AbstractFirTypeEnhancementTest : KtUsefulTestCase() {
super.tearDown() super.tearDown()
} }
private fun createJarWithForeignAnnotations(): File = private fun createJarWithForeignAnnotations(): List<File> {
MockLibraryUtilExt.compileJavaFilesLibraryToJar(FOREIGN_ANNOTATIONS_SOURCES_PATH, "foreign-annotations") val jsr305Jar =
MockLibraryUtilExt.compileJavaFilesLibraryToJar(JSR_305_SOURCES_PATH, "jsr305")
return listOf(
MockLibraryUtilExt.compileJavaFilesLibraryToJar(
FOREIGN_ANNOTATIONS_SOURCES_PATH, "foreign-annotations",
extraClasspath = listOf(jsr305Jar.absolutePath),
),
jsr305Jar,
)
}
private fun createEnvironment(content: String): KotlinCoreEnvironment { private fun createEnvironment(content: String): KotlinCoreEnvironment {
val classpath = mutableListOf(getAnnotationsJar(), ForTestCompileRuntime.runtimeJarForTests()) val classpath = mutableListOf(getAnnotationsJar(), ForTestCompileRuntime.runtimeJarForTests())
@@ -69,7 +79,7 @@ abstract class AbstractFirTypeEnhancementTest : KtUsefulTestCase() {
classpath.add(ForTestCompileRuntime.jvmAnnotationsForTests()) classpath.add(ForTestCompileRuntime.jvmAnnotationsForTests())
} }
if (InTextDirectivesUtils.isDirectiveDefined(content, "FOREIGN_ANNOTATIONS")) { if (InTextDirectivesUtils.isDirectiveDefined(content, "FOREIGN_ANNOTATIONS")) {
classpath.add(createJarWithForeignAnnotations()) classpath.addAll(createJarWithForeignAnnotations())
} }
return KotlinCoreEnvironment.createForTests( return KotlinCoreEnvironment.createForTests(
testRootDisposable, testRootDisposable,
@@ -176,6 +186,7 @@ abstract class AbstractFirTypeEnhancementTest : KtUsefulTestCase() {
companion object { companion object {
private const val FOREIGN_ANNOTATIONS_SOURCES_PATH = "third-party/annotations" private const val FOREIGN_ANNOTATIONS_SOURCES_PATH = "third-party/annotations"
private const val JSR_305_SOURCES_PATH = "third-party/jsr305"
} }
} }
@@ -251,6 +251,12 @@ class JvmEnvironmentConfigurator(testServices: TestServices) : EnvironmentConfig
} }
configuration.addJavaSourceRoot(testServices.sourceFileProvider.javaSourceDirectory) configuration.addJavaSourceRoot(testServices.sourceFileProvider.javaSourceDirectory)
} }
// We add that as a part of the classpath only when Java files are being analyzed as sources, so the relevant annotations
// are being resolved classes are being resolved properly.
configuration.addJvmClasspathRoots(
testServices.additionalClassPathForJavaCompilationOrAnalysis?.classPath?.map(::File).orEmpty()
)
} }
if (javaBinaryFiles.isNotEmpty()) { if (javaBinaryFiles.isNotEmpty()) {
@@ -268,7 +274,9 @@ class JvmEnvironmentConfigurator(testServices: TestServices) : EnvironmentConfig
compileJavaFilesLibraryToJar( compileJavaFilesLibraryToJar(
testServices.sourceFileProvider.javaBinaryDirectory.path, testServices.sourceFileProvider.javaBinaryDirectory.path,
JAVA_BINARIES_JAR_NAME, JAVA_BINARIES_JAR_NAME,
extraClasspath = configuration.jvmClasspathRoots.map { it.absolutePath }, extraClasspath =
configuration.jvmClasspathRoots.map { it.absolutePath } +
testServices.additionalClassPathForJavaCompilationOrAnalysis?.classPath.orEmpty(),
assertions = JUnit5Assertions, assertions = JUnit5Assertions,
useJava11 = useJava11ToCompileIncludedJavaFiles useJava11 = useJava11ToCompileIncludedJavaFiles
) )
@@ -428,3 +436,12 @@ class JvmEnvironmentConfigurator(testServices: TestServices) : EnvironmentConfig
} }
// This should be used as a classpath entries when Java classes are being compiled/analyzed to become a binary/source dependencies of kt-files
// But in case the Java files are compiled it should not belong to the classpath of the module where test kt-files belong.
// Currently, it's used for jsr305.jar, for which it's necessary to make sure that once some library uses the annotation from that jar,
// we still don't need the jar itself when using the library to read the annotations.
// (as they have been written to the class-files as fully-qualified names)
class AdditionalClassPathForJavaCompilationOrAnalysis(val classPath: List<String>) : TestService
val TestServices.additionalClassPathForJavaCompilationOrAnalysis by TestServices.nullableTestServiceAccessor<AdditionalClassPathForJavaCompilationOrAnalysis>()
@@ -34,7 +34,8 @@ import kotlin.io.path.createTempDirectory
enum class JavaForeignAnnotationType(val path: String) { enum class JavaForeignAnnotationType(val path: String) {
Annotations("third-party/annotations"), Annotations("third-party/annotations"),
Java8Annotations("third-party/java8-annotations"), Java8Annotations("third-party/java8-annotations"),
Java9Annotations("third-party/java9-annotations"); Java9Annotations("third-party/java9-annotations"),
Jsr305("third-party/jsr305");
} }
open class JvmForeignAnnotationsConfigurator(testServices: TestServices) : EnvironmentConfigurator(testServices) { open class JvmForeignAnnotationsConfigurator(testServices: TestServices) : EnvironmentConfigurator(testServices) {
@@ -87,14 +88,18 @@ open class JvmForeignAnnotationsConfigurator(testServices: TestServices) : Envir
val javaFilesDir = createTempDirectory().toFile().also { val javaFilesDir = createTempDirectory().toFile().also {
File(annotationPath.path).copyRecursively(it) File(annotationPath.path).copyRecursively(it)
} }
val jsr305JarFile = createJsr305Jar(configuration)
val foreignAnnotationsJar = MockLibraryUtil.compileJavaFilesLibraryToJar( val foreignAnnotationsJar = MockLibraryUtil.compileJavaFilesLibraryToJar(
javaFilesDir.path, javaFilesDir.path,
"foreign-annotations", "foreign-annotations",
assertions = JUnit5Assertions, assertions = JUnit5Assertions,
extraClasspath = configuration.jvmClasspathRoots.map { it.absolutePath }, extraClasspath = configuration.jvmClasspathRoots.map { it.absolutePath } + jsr305JarFile.absolutePath,
useJava11 = useJava11ToCompileIncludedJavaFiles useJava11 = useJava11ToCompileIncludedJavaFiles
) )
configuration.addModularRootIfNotNull(useJava11ToCompileIncludedJavaFiles, "java9_annotations", foreignAnnotationsJar) configuration.addModularRootIfNotNull(useJava11ToCompileIncludedJavaFiles, "java9_annotations", foreignAnnotationsJar)
testServices.register(AdditionalClassPathForJavaCompilationOrAnalysis::class, AdditionalClassPathForJavaCompilationOrAnalysis(listOf(jsr305JarFile.absolutePath)))
configuration.addJvmClasspathRoot(testServices.standardLibrariesPathProvider.jvmAnnotationsForTests()) configuration.addJvmClasspathRoot(testServices.standardLibrariesPathProvider.jvmAnnotationsForTests())
if (JvmEnvironmentConfigurationDirectives.WITH_JSR305_TEST_ANNOTATIONS in registeredDirectives) { if (JvmEnvironmentConfigurationDirectives.WITH_JSR305_TEST_ANNOTATIONS in registeredDirectives) {
@@ -106,10 +111,23 @@ open class JvmForeignAnnotationsConfigurator(testServices: TestServices) : Envir
jsr305AnnotationsDir.path, jsr305AnnotationsDir.path,
"jsr-305-test-annotations", "jsr-305-test-annotations",
assertions = JUnit5Assertions, assertions = JUnit5Assertions,
extraClasspath = configuration.jvmClasspathRoots.map { it.absolutePath } extraClasspath = configuration.jvmClasspathRoots.map { it.absolutePath } + jsr305JarFile.absolutePath
) )
) )
configuration.addJvmClasspathRoot(KtTestUtil.getAnnotationsJar()) configuration.addJvmClasspathRoot(KtTestUtil.getAnnotationsJar())
} }
} }
private fun createJsr305Jar(configuration: CompilerConfiguration): File {
val jsr305FilesDir = createTempDirectory().toFile().also {
File(JavaForeignAnnotationType.Jsr305.path).copyRecursively(it)
}
return MockLibraryUtil.compileJavaFilesLibraryToJar(
jsr305FilesDir.path,
"jsr305",
assertions = JUnit5Assertions,
extraClasspath = configuration.jvmClasspathRoots.map { it.absolutePath },
)
}
} }
@@ -17,6 +17,7 @@
package org.jetbrains.kotlin.jvm.compiler package org.jetbrains.kotlin.jvm.compiler
import org.jetbrains.kotlin.checkers.FOREIGN_ANNOTATIONS_SOURCES_PATH import org.jetbrains.kotlin.checkers.FOREIGN_ANNOTATIONS_SOURCES_PATH
import org.jetbrains.kotlin.checkers.JSR_305_SOURCES_PATH
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.config.* import org.jetbrains.kotlin.config.*
@@ -27,16 +28,19 @@ import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
import org.jetbrains.kotlin.descriptors.resolveClassByFqName import org.jetbrains.kotlin.descriptors.resolveClassByFqName
import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.incremental.components.NoLookupLocation
import org.jetbrains.kotlin.load.java.AnnotationTypeQualifierResolver import org.jetbrains.kotlin.load.java.AnnotationTypeQualifierResolver
import org.jetbrains.kotlin.load.java.JavaTypeEnhancementState
import org.jetbrains.kotlin.load.java.lazy.JavaResolverComponents import org.jetbrains.kotlin.load.java.lazy.JavaResolverComponents
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.renderer.AnnotationArgumentsRenderingPolicy import org.jetbrains.kotlin.renderer.AnnotationArgumentsRenderingPolicy
import org.jetbrains.kotlin.renderer.DescriptorRenderer import org.jetbrains.kotlin.renderer.DescriptorRenderer
import org.jetbrains.kotlin.resolve.lazy.JvmResolveUtil import org.jetbrains.kotlin.resolve.lazy.JvmResolveUtil
import org.jetbrains.kotlin.test.* import org.jetbrains.kotlin.test.ConfigurationKind
import org.jetbrains.kotlin.test.KotlinTestUtils
import org.jetbrains.kotlin.test.MockLibraryUtilExt
import org.jetbrains.kotlin.test.TestJdkKind
import org.jetbrains.kotlin.test.testFramework.KtUsefulTestCase import org.jetbrains.kotlin.test.testFramework.KtUsefulTestCase
import org.jetbrains.kotlin.test.util.KtTestUtil import org.jetbrains.kotlin.test.util.KtTestUtil
import org.jetbrains.kotlin.load.java.JavaTypeEnhancementState
import java.io.File import java.io.File
class TypeQualifierAnnotationResolverTest : KtUsefulTestCase() { class TypeQualifierAnnotationResolverTest : KtUsefulTestCase() {
@@ -83,14 +87,19 @@ class TypeQualifierAnnotationResolverTest : KtUsefulTestCase() {
} }
private fun buildTypeQualifierResolverAndFindClass(className: String): Pair<AnnotationTypeQualifierResolver, ClassDescriptor> { private fun buildTypeQualifierResolverAndFindClass(className: String): Pair<AnnotationTypeQualifierResolver, ClassDescriptor> {
val jsr305Jar = MockLibraryUtilExt.compileJavaFilesLibraryToJar(JSR_305_SOURCES_PATH, "jsr305")
val configuration = KotlinTestUtils.newConfiguration( val configuration = KotlinTestUtils.newConfiguration(
ConfigurationKind.ALL, TestJdkKind.FULL_JDK, ConfigurationKind.ALL, TestJdkKind.FULL_JDK,
listOf( listOf(
KtTestUtil.getAnnotationsJar(), KtTestUtil.getAnnotationsJar(),
MockLibraryUtilExt.compileJavaFilesLibraryToJar( MockLibraryUtilExt.compileJavaFilesLibraryToJar(
FOREIGN_ANNOTATIONS_SOURCES_PATH, FOREIGN_ANNOTATIONS_SOURCES_PATH,
"foreign-annotations" "foreign-annotations",
) extraClasspath = listOf(
jsr305Jar.absolutePath
)
),
jsr305Jar,
), ),
listOf(File(TEST_DATA_PATH)) listOf(File(TEST_DATA_PATH))
).apply { ).apply {